1  /*
2   * Copyright (C) 2023 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #ifndef MEDIA_CORE_H
17  #define MEDIA_CORE_H
18  
19  #include <map>
20  #include <string_view>
21  #include "errors.h"
22  
23  namespace OHOS {
24  namespace Media {
25  using MSErrCode = ErrCode;
26  
27  // bit 28~21 is subsys, bit 20~16 is Module. bit 15~0 is code
28  constexpr MSErrCode MS_MODULE = 0X01000;
29  constexpr MSErrCode MS_ERR_OFFSET = ErrCodeOffset(SUBSYS_MULTIMEDIA, MS_MODULE);
30  enum MediaServiceErrCode : ErrCode {
31      MSERR_OK                = ERR_OK,
32      MSERR_NO_MEMORY         = MS_ERR_OFFSET + ENOMEM, // no memory
33      MSERR_INVALID_OPERATION = MS_ERR_OFFSET + ENOSYS, // opertation not be permitted
34      MSERR_INVALID_VAL       = MS_ERR_OFFSET + EINVAL, // invalid argument
35      MSERR_UNKNOWN           = MS_ERR_OFFSET + 0x200,  // unkown error.
36      MSERR_SERVICE_DIED,                               // media service died
37      MSERR_CREATE_REC_ENGINE_FAILED,                   // create recorder engine failed.
38      MSERR_CREATE_PLAYER_ENGINE_FAILED,                // create player engine failed.
39      MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED,      // create avmetadatahelper engine failed.
40      MSERR_CREATE_AVCODEC_ENGINE_FAILED,               // create avcodec engine failed.
41      MSERR_INVALID_STATE,                              // the state is not support this operation.
42      MSERR_UNSUPPORT,                                  // unsupport interface.
43      MSERR_UNSUPPORT_AUD_SRC_TYPE,                     // unsupport audio source type.
44      MSERR_UNSUPPORT_AUD_SAMPLE_RATE,                  // unsupport audio sample rate.
45      MSERR_UNSUPPORT_AUD_CHANNEL_NUM,                  // unsupport audio channel.
46      MSERR_UNSUPPORT_AUD_ENC_TYPE,                     // unsupport audio encoder type.
47      MSERR_UNSUPPORT_AUD_PARAMS,                       // unsupport audio params(other params).
48      MSERR_UNSUPPORT_VID_SRC_TYPE,                     // unsupport video source type.
49      MSERR_UNSUPPORT_VID_ENC_TYPE,                     // unsupport video encoder type.
50      MSERR_UNSUPPORT_VID_PARAMS,                       // unsupport video params(other params).
51      MSERR_UNSUPPORT_CONTAINER_TYPE,                   // unsupport container format type.
52      MSERR_UNSUPPORT_PROTOCOL_TYPE,                    // unsupport protocol type.
53      MSERR_UNSUPPORT_VID_DEC_TYPE,                     // unsupport video decoder type.
54      MSERR_UNSUPPORT_AUD_DEC_TYPE,                     // unsupport audio decoder type.
55      MSERR_UNSUPPORT_STREAM,                           // internal data stream error.
56      MSERR_UNSUPPORT_FILE,                             // this appears to be a text file.
57      MSERR_UNSUPPORT_SOURCE,                           // unsupport source type.
58      MSERR_AUD_RENDER_FAILED,                          // audio render failed.
59      MSERR_AUD_ENC_FAILED,                             // audio encode failed.
60      MSERR_VID_ENC_FAILED,                             // video encode failed.
61      MSERR_AUD_DEC_FAILED,                             // audio decode failed.
62      MSERR_VID_DEC_FAILED,                             // video decode failed.
63      MSERR_MUXER_FAILED,                               // stream avmuxer failed.
64      MSERR_DEMUXER_FAILED,                             // stream demuxer or parser failed.
65      MSERR_OPEN_FILE_FAILED,                           // open file failed.
66      MSERR_FILE_ACCESS_FAILED,                         // read or write file failed.
67      MSERR_START_FAILED,                               // audio/video start failed.
68      MSERR_PAUSE_FAILED,                               // audio/video pause failed.
69      MSERR_STOP_FAILED,                                // audio/video stop failed.
70      MSERR_SEEK_FAILED,                                // audio/video seek failed.
71      MSERR_NETWORK_TIMEOUT,                            // network timeout.
72      MSERR_NOT_FIND_CONTAINER,                         // not find a demuxer.
73      MSERR_DATA_SOURCE_IO_ERROR,                       // media data source IO failed.
74      MSERR_DATA_SOURCE_OBTAIN_MEM_ERROR,               // media data source get mem failed.
75      MSERR_DATA_SOURCE_ERROR_UNKNOWN,                  // media data source error unknow.
76      MSERR_AUD_INTERRUPT,                              // audio interrupted.
77      MSERR_MANDATORY_PARAMETER_UNSPECIFIED,            // mandatory parameters are left unspecified
78      MSERR_INCORRECT_PARAMETER_TYPE,                   // Incorrect parameter types
79      MSERR_PARAMETER_VERIFICATION_FAILED,              // Parameter verification failed
80      MSERR_USER_NO_PERMISSION,                         // user permission denied (AccessToken).
81      MSERR_DRM_VERIFICATION_FAILED,                    // DRM verification failed
82      MSERR_UNSUPPORT_WATER_MARK,                       // unsupported watermark
83      MSERR_DEMUXER_BUFFER_NO_MEMORY,                   // demuxer cache data reached its limit
84      MSERR_IO_CANNOT_FIND_HOST = MS_ERR_OFFSET + 0x400,  // IO can not find host
85      MSERR_IO_CONNECTION_TIMEOUT,                        // IO connection timeout
86      MSERR_IO_NETWORK_ABNORMAL,                          // IO network abnormal.
87      MSERR_IO_NETWORK_UNAVAILABLE,                       // IO network unavailable.
88      MSERR_IO_NO_PERMISSION,                             // IO no permission.
89      MSERR_IO_NETWORK_ACCESS_DENIED,                     // IO request denied.
90      MSERR_IO_RESOURE_NOT_FOUND,                         // IO resource not found.
91      MSERR_IO_SSL_CLIENT_CERT_NEEDED,                    // IO SSL client cert needed.
92      MSERR_IO_SSL_CONNECT_FAIL,                          // IO SSL connect fail.
93      MSERR_IO_SSL_SERVER_CERT_UNTRUSTED,                 // IO SSL server cert untrusted.
94      MSERR_IO_UNSUPPORTTED_REQUEST,                      // IO unsupported request.
95      MSERR_EXTEND_START      = MS_ERR_OFFSET + 0xF000, // extend err start.
96  };
97  
98  // media api error code
99  enum MediaServiceExtErrCode : int32_t {
100      MSERR_EXT_OK = 0,
101      MSERR_EXT_NO_MEMORY = 1,           // no memory.
102      MSERR_EXT_OPERATE_NOT_PERMIT = 2,  // opertation not be permitted.
103      MSERR_EXT_INVALID_VAL = 3,         // invalid argument.
104      MSERR_EXT_IO = 4,                  // IO error.
105      MSERR_EXT_TIMEOUT = 5,             // network timeout.
106      MSERR_EXT_UNKNOWN = 6,             // unknown error.
107      MSERR_EXT_SERVICE_DIED = 7,        // media service died.
108      MSERR_EXT_INVALID_STATE = 8,       // the state is not support this operation.
109      MSERR_EXT_UNSUPPORT = 9,           // unsupport interface.
110      MSERR_EXT_EXTEND_START = 100,      // extend err start.
111  };
112  
113  // media api9 error code
114  enum MediaServiceExtErrCodeAPI9 : int32_t {
115      MSERR_EXT_API9_OK = 0,                          // use for determine error
116      MSERR_EXT_API9_NO_PERMISSION = 201,             // permission denied (AccessToken).
117      MSERR_EXT_API9_PERMISSION_DENIED = 202,         // permission denied (system API).
118      MSERR_EXT_API9_INVALID_PARAMETER = 401,         // invalid parameter.
119      MSERR_EXT_API9_UNSUPPORT_CAPABILITY = 801,      // unsupport api.
120      MSERR_EXT_API9_NO_MEMORY = 5400101,             // no memory.
121      MSERR_EXT_API9_OPERATE_NOT_PERMIT = 5400102,    // opertation not be permitted.
122      MSERR_EXT_API9_IO = 5400103,                    // IO error.
123      MSERR_EXT_API9_TIMEOUT = 5400104,               // opertate timeout.
124      MSERR_EXT_API9_SERVICE_DIED = 5400105,          // media service died.
125      MSERR_EXT_API9_UNSUPPORT_FORMAT = 5400106,      // unsupport format.
126      MSERR_EXT_API9_AUDIO_INTERRUPTED = 5400107,     // audio interrupted.
127      MSERR_EXT_API14_IO_CANNOT_FIND_HOST = 5411001,              // IO can not find host
128      MSERR_EXT_API14_IO_CONNECTION_TIMEOUT = 5411002,            // IO connection timeout
129      MSERR_EXT_API14_IO_NETWORK_ABNORMAL = 5411003,              // IO network abnormal.
130      MSERR_EXT_API14_IO_NETWORK_UNAVAILABLE = 5411004,           // IO network unavailable.
131      MSERR_EXT_API14_IO_NO_PERMISSION = 5411005,                 // IO no permission.
132      MSERR_EXT_API14_IO_NETWORK_ACCESS_DENIED = 5411006,         // IO request denied.
133      MSERR_EXT_API14_IO_RESOURE_NOT_FOUND = 5411007,             // IO resource not found.
134      MSERR_EXT_API14_IO_SSL_CLIENT_CERT_NEEDED = 5411008,        // IO SSL client cert needed.
135      MSERR_EXT_API14_IO_SSL_CONNECT_FAIL = 5411009,              // IO SSL connect fail.
136      MSERR_EXT_API14_IO_SSL_SERVER_CERT_UNTRUSTED = 5411010,     // IO SSL server cert untrusted.
137      MSERR_EXT_API14_IO_UNSUPPORTTED_REQUEST = 5411011,          // IO unsupported request.
138  };
139  
140  /**
141   *  Media type
142   */
143  enum MediaType : int32_t {
144      /**
145       * track is audio.
146       */
147      MEDIA_TYPE_AUD = 0,
148      /**
149       * track is video.
150       */
151      MEDIA_TYPE_VID = 1,
152      /**
153       * track is subtitle.
154       */
155      MEDIA_TYPE_SUBTITLE = 2,
156      /**
157       * track is unknown
158       */
159      MEDIA_TYPE_MAX_COUNT = 3,
160  };
161  
162  /**
163   * Enumerates the state change reason.
164   *
165   */
166  enum StateChangeReason {
167      /**
168       * audio/video state change by user
169       */
170      USER = 1,
171      /**
172       * audio/video state change by system
173       */
174      BACKGROUND = 2,
175  };
176  
177  enum BufferingInfoType : int32_t {
178      /* begin to b buffering */
179      BUFFERING_START = 1,
180      /* end to buffering */
181      BUFFERING_END = 2,
182      /* buffering percent */
183      BUFFERING_PERCENT = 3,
184      /* cached duration in milliseconds */
185      CACHED_DURATION = 4,
186  };
187  
188  enum PlayerSeekMode : int32_t {
189      /* sync to keyframes after the time point. */
190      SEEK_NEXT_SYNC = 0,
191      /* sync to keyframes before the time point. */
192      SEEK_PREVIOUS_SYNC,
193      /* sync to closest keyframes. */
194      SEEK_CLOSEST_SYNC,
195      /* seek to frames closest the time point. */
196      SEEK_CLOSEST,
197      /* seek continously. */
198      SEEK_CONTINOUS,
199  };
200  
201  enum PlayerSwitchMode : int32_t {
202      /* no seek. */
203      SWITCH_SMOOTH = 0,
204      /* switch to keyframes before the time point. */
205      SWITCH_SEGMENT,
206      /* switch to frames closest the time point. */
207      SWITCH_CLOSEST,
208  };
209  
210  /**
211   * @brief Enumerates the container format types.
212   */
213  class ContainerFormatType {
214  public:
215      static constexpr std::string_view CFT_MPEG_4A = "m4a";
216      static constexpr std::string_view CFT_MPEG_4 = "mp4";
217  };
218  
219  /**
220   * @brief the struct of geolocation
221   *
222   * @param latitude float: latitude in degrees. Its value must be in the range [-90, 90].
223   * @param longitude float: longitude in degrees. Its value must be in the range [-180, 180].
224   */
225  struct Location {
226      int32_t latitude = 0;
227      int32_t longitude = 0;
228  };
229  
230  struct AVFileDescriptor {
231      int32_t fd = 0;
232      int64_t offset = 0;
233      int64_t length = -1;
234  };
235  
236  struct FrameLayerInfo {
237      bool isDiscardable = false;
238      uint32_t gopId = 0;
239      int32_t layer = -1;
240  };
241  
242  struct GopLayerInfo {
243      uint32_t gopSize = 0;
244      uint32_t layerCount = 0;
245      std::map<uint8_t, uint32_t> layerFrameNum;
246  };
247  
248  } // namespace Media
249  } // namespace OHOS
250  #endif // MEDIA_CORE_H
251