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 #ifndef MEDIA_AVCODEC_COMMOM_H 16 #define MEDIA_AVCODEC_COMMOM_H 17 18 #include <string> 19 #include <vector> 20 #include <map> 21 #include "av_common.h" 22 #include "buffer/avbuffer.h" 23 #include "meta/format.h" 24 25 namespace OHOS { 26 namespace MediaAVCodec { 27 using AVBuffer = OHOS::Media::AVBuffer; 28 using AVSharedMemory = OHOS::Media::AVSharedMemory; 29 using Format = OHOS::Media::Format; 30 /** 31 * @brief Error type of AVCodec 32 * 33 * @since 3.1 34 * @version 3.1 35 */ 36 enum AVCodecErrorType : int32_t { 37 /* internal errors, error code passed by the errorCode, and definition see "AVCodecServiceErrCode" */ 38 AVCODEC_ERROR_INTERNAL, 39 /* extend error start. The extension error code agreed upon by the plug-in and 40 the application will be transparently transmitted by the service. */ 41 AVCODEC_ERROR_DECRYTION_FAILED, 42 AVCODEC_ERROR_EXTEND_START = 0X10000, 43 }; 44 45 enum class API_VERSION : int32_t { 46 API_VERSION_10 = 10, 47 API_VERSION_11 = 11 48 }; 49 50 /** 51 * @brief Flag of AVCodecBuffer. 52 * 53 * @since 3.1 54 */ 55 enum AVCodecBufferFlag : uint32_t { 56 AVCODEC_BUFFER_FLAG_NONE = 0, 57 /** This signals the end of stream. */ 58 AVCODEC_BUFFER_FLAG_EOS = 1 << 0, 59 /** This indicates that the buffer contains the data for a sync frame. */ 60 AVCODEC_BUFFER_FLAG_SYNC_FRAME = 1 << 1, 61 /** This indicates that the buffer only contains part of a frame. */ 62 AVCODEC_BUFFER_FLAG_PARTIAL_FRAME = 1 << 2, 63 /** This indicated that the buffer contains codec specific data. */ 64 AVCODEC_BUFFER_FLAG_CODEC_DATA = 1 << 3, 65 /** Flag is used to discard packets which are required to maintain valid decoder state but are not required 66 * for output and should be dropped after decoding. 67 * @since 12 68 */ 69 AVCODEC_BUFFER_FLAG_DISCARD = 1 << 4, 70 /** Flag is used to indicate packets that contain frames that can be discarded by the decoder, 71 * I.e. Non-reference frames. 72 * @since 12 73 */ 74 AVCODEC_BUFFER_FLAG_DISPOSABLE = 1 << 5, 75 /** Indicates that the frame is an extended discardable frame. It is not on the main reference path and 76 * is referenced only by discardable frames or extended discardable frames. When subsequent frames on the branch 77 * reference path are discarded by decoder, the frame can be further discarded. 78 * @since 12 79 */ 80 AVCODEC_BUFFER_FLAG_DISPOSABLE_EXT = 1 << 6, 81 }; 82 83 struct AVCodecBufferInfo { 84 /* The presentation timestamp in microseconds for the buffer */ 85 int64_t presentationTimeUs = 0; 86 /* The amount of data (in bytes) in the buffer */ 87 int32_t size = 0; 88 /* The start-offset of the data in the buffer */ 89 int32_t offset = 0; 90 }; 91 92 class AVCodecCallback { 93 public: 94 virtual ~AVCodecCallback() = default; 95 /** 96 * Called when an error occurred. 97 * 98 * @param errorType Error type. For details, see {@link AVCodecErrorType}. 99 * @param errorCode Error code. 100 * @since 3.1 101 * @version 3.1 102 */ 103 virtual void OnError(AVCodecErrorType errorType, int32_t errorCode) = 0; 104 105 /** 106 * Called when the output format has changed. 107 * 108 * @param format The new output format. 109 * @since 3.1 110 * @version 3.1 111 */ 112 virtual void OnOutputFormatChanged(const Format &format) = 0; 113 114 /** 115 * Called when an input buffer becomes available. 116 * 117 * @param index The index of the available input buffer. 118 * @param buffer A {@link AVSharedMemory} object for a input buffer index that contains the data. 119 * @since 3.1 120 * @version 4.0 121 */ 122 virtual void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVSharedMemory> buffer) = 0; 123 124 /** 125 * Called when an output buffer becomes available. 126 * 127 * @param index The index of the available output buffer. 128 * @param info The info of the available output buffer. For details, see {@link AVCodecBufferInfo} 129 * @param flag The flag of the available output buffer. For details, see {@link AVCodecBufferFlag} 130 * @param buffer A {@link AVSharedMemory} object for a output buffer index that contains the data. 131 * @since 3.1 132 * @version 4.0 133 */ 134 virtual void OnOutputBufferAvailable(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag, 135 std::shared_ptr<AVSharedMemory> buffer) = 0; 136 }; 137 138 class AVDemuxerCallback { 139 public: 140 virtual ~AVDemuxerCallback() = default; 141 142 /** 143 * Called when an drm info updated. 144 * 145 * @param drmInfo Drm Info. 146 * @since 4.1 147 * @version 4.1 148 */ 149 virtual void OnDrmInfoChanged(const std::multimap<std::string, std::vector<uint8_t>> &drmInfo) = 0; 150 }; 151 152 class MediaCodecCallback { 153 public: 154 virtual ~MediaCodecCallback() = default; 155 /** 156 * Called when an error occurred. 157 * 158 * @param errorType Error type. For details, see {@link AVCodecErrorType}. 159 * @param errorCode Error code. 160 * @since 4.1 161 */ 162 virtual void OnError(AVCodecErrorType errorType, int32_t errorCode) = 0; 163 164 /** 165 * Called when the output format has changed. 166 * 167 * @param format The new output format. 168 * @since 4.1 169 */ 170 virtual void OnOutputFormatChanged(const Format &format) = 0; 171 172 /** 173 * Called when an input buffer becomes available. 174 * 175 * @param index The index of the available input buffer. 176 * @param buffer A {@link AVBuffer} object for a input buffer index that contains the data. 177 * @since 4.1 178 */ 179 virtual void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) = 0; 180 181 /** 182 * Called when an output buffer becomes available. 183 * 184 * @param index The index of the available output buffer. 185 * @param buffer A {@link AVBuffer} object for a output buffer index that contains the data. 186 * @since 4.1 187 */ 188 virtual void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) = 0; 189 }; 190 191 class MediaCodecParameterCallback { 192 public: 193 virtual ~MediaCodecParameterCallback() = default; 194 /** 195 * Called when an input parameter becomes available. 196 * 197 * @param index The index of the available input parameter. 198 * @param parameter A {@link Format} object containing the corresponding index input parameter. 199 * @since 5.0 200 */ 201 virtual void OnInputParameterAvailable(uint32_t index, std::shared_ptr<Format> parameter) = 0; 202 }; 203 204 class MediaCodecParameterWithAttrCallback { 205 public: 206 virtual ~MediaCodecParameterWithAttrCallback() = default; 207 /** 208 * Called when an input parameter with attribute becomes available. 209 * 210 * @param index The index of the available input parameter. 211 * @param parameter A {@link Format} object containing the corresponding index input parameter. 212 * @param attribute A read only {@link Format} object containing the corresponding index input attribute. 213 * @since 5.0 214 */ 215 virtual void OnInputParameterWithAttrAvailable(uint32_t index, std::shared_ptr<Format> attribute, 216 std::shared_ptr<Format> parameter) = 0; 217 }; 218 219 class SurfaceBufferExtratDataKey { 220 public: 221 /** 222 * Key for timeStamp in surface's extraData, value type is int64 223 */ 224 static constexpr std::string_view ED_KEY_TIME_STAMP = "timeStamp"; 225 226 /** 227 * Key for endOfStream in surface's extraData, value type is bool 228 */ 229 static constexpr std::string_view ED_KEY_END_OF_STREAM = "endOfStream"; 230 231 private: 232 SurfaceBufferExtratDataKey() = delete; 233 ~SurfaceBufferExtratDataKey() = delete; 234 }; 235 236 class AVSourceFormat { 237 public: 238 static constexpr std::string_view SOURCE_TITLE = "title"; // string, title 239 static constexpr std::string_view SOURCE_ARTIST = "artist"; // string, artist 240 static constexpr std::string_view SOURCE_ALBUM = "album"; // string, album 241 static constexpr std::string_view SOURCE_ALBUM_ARTIST = "album_artist"; // string, album artist 242 static constexpr std::string_view SOURCE_DATE = "date"; // string, media date, 243 // format: YYYY-MM-DD 244 static constexpr std::string_view SOURCE_COMMENT = "comment"; // string, comment 245 static constexpr std::string_view SOURCE_GENRE = "genre"; // string, genre 246 static constexpr std::string_view SOURCE_COPYRIGHT = "copyright"; // string, copyright 247 static constexpr std::string_view SOURCE_LANGUAGE = "language"; // string, language 248 static constexpr std::string_view SOURCE_DESCRIPTION = "description"; // string, description 249 static constexpr std::string_view SOURCE_LYRICS = "lyrics"; // string, cyrics 250 251 static constexpr std::string_view SOURCE_FILE_TYPE = "file_type"; // string, type 252 static constexpr std::string_view SOURCE_HAS_VIDEO = "has_video"; // bool, contain video tracks 253 static constexpr std::string_view SOURCE_HAS_AUDIO = "has_audio"; // bool, contain audio tracks 254 static constexpr std::string_view SOURCE_HAS_TIMEDMETA = "has_timed_meta"; // bool, contain timed metadata tracks 255 static constexpr std::string_view SOURCE_HAS_SUBTITLE = "has_subtitle"; // bool, contain subtitle tracks 256 static constexpr std::string_view SOURCE_AUTHOR = "author"; // string, autbor 257 static constexpr std::string_view SOURCE_COMPOSER = "composer"; // string, composer 258 private: 259 AVSourceFormat() = delete; 260 ~AVSourceFormat() = delete; 261 }; 262 263 enum VideoBitStreamFormat { 264 UNKNOWN = 0, 265 AVCC, 266 HVCC, 267 ANNEXB 268 }; 269 270 struct CUVVConfigBox { 271 uint16_t cuva_version_map; 272 uint16_t terminal_provide_code; 273 uint16_t terminal_provide_oriented_code; 274 }; 275 } // namespace MediaAVCodec 276 } // namespace OHOS 277 #endif // MEDIA_AVCODEC_COMMOM_H 278