1 /* 2 * Copyright (c) 2023-2025 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_FOUNDATION_META_H 17 #define MEDIA_FOUNDATION_META_H 18 19 #ifndef MEDIA_NO_OHOS 20 #ifndef MEDIA_OHOS 21 #define MEDIA_OHOS 22 #endif 23 #else 24 #ifdef MEDIA_OHOS 25 #undef MEDIA_OHOS 26 #endif 27 #endif 28 29 #include <map> 30 #include <optional> 31 #include "meta/meta_key.h" 32 #include "meta/audio_types.h" 33 #include "meta/media_types.h" 34 #include "meta/video_types.h" 35 #include "meta/source_types.h" 36 #include "meta/mime_type.h" 37 #include "meta/any.h" // NOLINT 38 39 namespace OHOS { 40 namespace Media { 41 #define DECLARE_INFO_CLASS \ 42 template<TagTypeCharSeq tagCharSeq, class Enable = void> \ 43 class ValueInfo { \ 44 public: \ 45 typedef int32_t type; \ 46 } 47 48 #define DEFINE_INSERT_GET_FUNC(condition, Any, eValueType) \ 49 template<TagTypeCharSeq tagCharSeq> \ 50 inline typename std::enable_if<(condition), bool>::type \ 51 Set(Any value) \ 52 { \ 53 TagType tag = tagCharSeq; \ 54 auto iter = map_.find(tag); \ 55 if (iter != map_.end()) { \ 56 map_.erase(iter++); \ 57 } \ 58 map_.insert(std::make_pair(tag, value)); \ 59 return true; \ 60 } \ 61 \ 62 template<TagTypeCharSeq tagCharSeq> \ 63 inline typename std::enable_if<(condition), bool>::type \ 64 Set(std::nullptr_t) \ 65 { \ 66 return false; \ 67 } \ 68 \ 69 template<TagTypeCharSeq tagCharSeq> \ 70 inline typename std::enable_if<(condition), bool>::type \ 71 Get(Any& value) const \ 72 { \ 73 TagType tag = tagCharSeq; \ 74 if (map_.count(tag) == 0) { \ 75 return false; \ 76 } \ 77 return AnyCast<Any>(&map_.at(tag), value); \ 78 } \ 79 \ 80 template<TagTypeCharSeq tagCharSeq> \ 81 class ValueInfo<tagCharSeq, typename std::enable_if<condition>::type> \ 82 { \ 83 public: \ 84 typedef Any type; \ 85 }; \ 86 template<TagTypeCharSeq tagCharSeq> \ 87 inline typename std::enable_if<condition, AnyValueType>::type \ 88 GetValueType() \ 89 { \ 90 return eValueType; \ 91 } 92 93 using MapIt = std::map<TagType, Any>::const_iterator; 94 95 /** 96 * @brief GetDefaultAnyValue used for Application to get Any type default value from Meta Object. 97 * @implNote In order to get Predefined default Any value from Meta Object. 98 * We use metadataDefaultValueMap to get the right getDefaultVal function. 99 * @return Returns Any type default value, returns <b>Any(string())</b> if no match. 100 * @example GetDefaultAnyValue("media.file.type"); 101 */ 102 extern Any GetDefaultAnyValue(const TagType& tag); 103 /** 104 * @brief GetDefaultAnyValueOpt used for Application to get Any type default value from Meta Object. 105 * @implNote In order to get Predefined default Any value from Meta Object. 106 * We use metadataDefaultValueMap to get the right getDefaultVal function. 107 * @return Returns Any type default value of optional, returns <b>std::nullopt</b> if no match. 108 * @example GetDefaultAnyValueOpt("media.file.type"); 109 */ 110 extern std::optional<Any> GetDefaultAnyValueOpt(const TagType& tag); 111 /** 112 * @brief GetDefaultAnyValue used for Application to get Any type default value. 113 * @implNote Return Predefined default Any value by tag, if notexist then find default Any value by type, 114 * if type not defined return Any(string). 115 * We use metadataDefaultValueMap and g_ValueTypeDefaultValueMapto get the right getDefaultVal function. 116 * @return Returns Any type default value, returns <b>Any(AnyValueType())</b> if no match. 117 * @example GetDefaultAnyValue("media.file.type", AnyValueType::INT32_T); 118 */ 119 extern Any GetDefaultAnyValue(const TagType& tag, AnyValueType type); 120 class Meta { 121 public: 122 enum struct ValueType : int32_t { 123 INVALID_TYPE = 1, 124 BOOL, 125 INT8_T, 126 UINT8_T, 127 INT32_T, 128 UINT32_T, 129 INT64_T, 130 UINT64_T, 131 FLOAT, 132 DOUBLE, 133 VECTOR_UINT8, 134 VECTOR_UINT32, 135 STRING, 136 VECTOR_INT32, 137 }; 138 139 DECLARE_INFO_CLASS; 140 141 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::SRC_INPUT_TYPE, Plugins::SrcInputType, AnyValueType::INT32_T); 142 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_CODEC_CONFIG or 143 tagCharSeq == Tag::MEDIA_COVER or 144 tagCharSeq == Tag::AUDIO_VIVID_METADATA or 145 tagCharSeq == Tag::AUDIO_VORBIS_IDENTIFICATION_HEADER or 146 tagCharSeq == Tag::AUDIO_VORBIS_SETUP_HEADER or 147 tagCharSeq == Tag::OH_MD_KEY_AUDIO_VIVID_METADATA or 148 tagCharSeq == Tag::DRM_CENC_INFO, 149 std::vector<uint8_t>, AnyValueType::VECTOR_UINT8); 150 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_CHANNEL_LAYOUT or 151 tagCharSeq == Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT or 152 tagCharSeq == Tag::VIDEO_ENCODE_SET_FRAME_PTS, 153 Plugins::AudioChannelLayout, AnyValueType::INT64_T); 154 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_SAMPLE_FORMAT, Plugins::AudioSampleFormat, 155 AnyValueType::INT32_T); 156 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_RAW_SAMPLE_FORMAT, Plugins::AudioSampleFormat, 157 AnyValueType::INT32_T); 158 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_BITRATE_MODE, Plugins::AudioEncodeBitrateMode, 159 AnyValueType::INT32_T); 160 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_PROFILE, Plugins::AudioAacProfile, AnyValueType::UINT8_T); 161 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_STREAM_FORMAT, Plugins::AudioAacStreamFormat, 162 AnyValueType::UINT8_T); 163 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_ENCODE_PTS_MODE, Plugins::AudioEncodePtsMode, 164 AnyValueType::INT32_T); 165 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_PIXEL_FORMAT, Plugins::VideoPixelFormat, 166 AnyValueType::INT32_T); 167 // DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_SEEKABLE), Plugins::Seekable); 168 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_TYPE, Plugins::MediaType, AnyValueType::INT32_T); 169 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BIT_STREAM_FORMAT, std::vector<Plugins::VideoBitStreamFormat>, 170 AnyValueType::VECTOR_UINT32); 171 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H264_PROFILE, Plugins::VideoH264Profile, 172 AnyValueType::INT32_T); 173 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ROTATION, Plugins::VideoRotation, AnyValueType::INT32_T); 174 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ORIENTATION_TYPE, Plugins::VideoOrientationType, 175 AnyValueType::INT32_T); 176 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_PRIMARIES, Plugins::ColorPrimary, 177 AnyValueType::INT32_T); 178 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_TRC, Plugins::TransferCharacteristic, 179 AnyValueType::INT32_T); 180 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_MATRIX_COEFF, Plugins::MatrixCoefficient, 181 AnyValueType::INT32_T); 182 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODE_BITRATE_MODE, 183 Plugins::VideoEncodeBitrateMode, AnyValueType::INT32_T); 184 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODE_B_FRAME_GOP_MODE, 185 Plugins::VideoEncodeBFrameGopMode, AnyValueType::INT32_T); 186 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_RANGE or 187 tagCharSeq == Tag::VIDEO_REQUEST_I_FRAME or 188 tagCharSeq == Tag::VIDEO_IS_HDR_VIVID or 189 tagCharSeq == Tag::MEDIA_HAS_VIDEO or 190 tagCharSeq == Tag::MEDIA_HAS_AUDIO or 191 tagCharSeq == Tag::MEDIA_HAS_SUBTITLE or 192 tagCharSeq == Tag::MEDIA_HAS_TIMEDMETA or 193 tagCharSeq == Tag::MEDIA_HAS_AUXILIARY or 194 tagCharSeq == Tag::MEDIA_END_OF_STREAM or 195 tagCharSeq == Tag::AV_CODEC_ENABLE_SYNC_MODE or 196 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR or 197 tagCharSeq == Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE or 198 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY or 199 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK or 200 tagCharSeq == Tag::VIDEO_PER_FRAME_IS_LTR or 201 tagCharSeq == Tag::VIDEO_PER_FRAME_IS_SKIP or 202 tagCharSeq == Tag::VIDEO_ENABLE_LOW_LATENCY or 203 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK or 204 tagCharSeq == Tag::SCREEN_CAPTURE_USER_AGREE or 205 tagCharSeq == Tag::SCREEN_CAPTURE_REQURE_MIC or 206 tagCharSeq == Tag::SCREEN_CAPTURE_ENABLE_MIC or 207 tagCharSeq == Tag::AV_PLAYER_IS_DRM_PROTECTED or 208 tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TIME_OUT or 209 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_DISCARD or 210 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_QP_MAP or 211 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_WATERMARK or 212 tagCharSeq == Tag::VIDEO_DECODER_BLANK_FRAME_ON_SHUTDOWN, bool, AnyValueType::BOOL); 213 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BUFFER_CAN_DROP, bool, AnyValueType::BOOL); 214 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_RENDER_SET_FLAG, bool, AnyValueType::BOOL); 215 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_PROFILE, Plugins::HEVCProfile, AnyValueType::INT32_T); 216 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_LEVEL, Plugins::HEVCLevel, AnyValueType::INT32_T); 217 218 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_CHROMA_LOCATION, 219 Plugins::ChromaLocation, AnyValueType::INT32_T); 220 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, 221 Plugins::TemporalGopReferenceMode, AnyValueType::INT32_T); 222 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::APP_UID or 223 tagCharSeq == Tag::APP_PID or 224 tagCharSeq == Tag::APP_TOKEN_ID or 225 tagCharSeq == Tag::REQUIRED_IN_BUFFER_CNT or 226 tagCharSeq == Tag::REQUIRED_IN_BUFFER_SIZE or 227 tagCharSeq == Tag::REQUIRED_OUT_BUFFER_CNT or 228 tagCharSeq == Tag::REQUIRED_OUT_BUFFER_SIZE or 229 tagCharSeq == Tag::BUFFERING_SIZE or 230 tagCharSeq == Tag::WATERLINE_HIGH or 231 tagCharSeq == Tag::WATERLINE_LOW or 232 tagCharSeq == Tag::AUDIO_CHANNEL_COUNT or 233 tagCharSeq == Tag::AUDIO_SAMPLE_RATE or 234 tagCharSeq == Tag::AUDIO_SAMPLE_PER_FRAME or 235 tagCharSeq == Tag::AUDIO_OUTPUT_CHANNELS or 236 tagCharSeq == Tag::AUDIO_MPEG_VERSION or 237 tagCharSeq == Tag::AUDIO_MPEG_LAYER or 238 tagCharSeq == Tag::AUDIO_AAC_LEVEL or 239 tagCharSeq == Tag::AUDIO_MAX_INPUT_SIZE or 240 tagCharSeq == Tag::AUDIO_MAX_OUTPUT_SIZE or 241 tagCharSeq == Tag::AUDIO_SOUNDBED_CHANNELS_NUMBER or 242 tagCharSeq == Tag::AUDIO_HOA_ORDER or 243 tagCharSeq == Tag::VIDEO_WIDTH or 244 tagCharSeq == Tag::VIDEO_HEIGHT or 245 tagCharSeq == Tag::VIDEO_DELAY or 246 tagCharSeq == Tag::VIDEO_MAX_SURFACE_NUM or 247 tagCharSeq == Tag::VIDEO_H264_LEVEL or 248 tagCharSeq == Tag::MEDIA_TRACK_COUNT or 249 tagCharSeq == Tag::AUDIO_AAC_IS_ADTS or 250 tagCharSeq == Tag::AUDIO_COMPRESSION_LEVEL or 251 tagCharSeq == Tag::AUDIO_BITS_PER_CODED_SAMPLE or 252 tagCharSeq == Tag::AUDIO_BITS_PER_RAW_SAMPLE or 253 tagCharSeq == Tag::REGULAR_TRACK_ID or 254 tagCharSeq == Tag::BUFFER_INDEX or 255 tagCharSeq == Tag::VIDEO_SCALE_TYPE or 256 tagCharSeq == Tag::VIDEO_I_FRAME_INTERVAL or 257 tagCharSeq == Tag::MEDIA_PROFILE or 258 tagCharSeq == Tag::VIDEO_ENCODE_QUALITY or 259 tagCharSeq == Tag::AUDIO_AAC_SBR or 260 tagCharSeq == Tag::AUDIO_FLAC_COMPLIANCE_LEVEL or 261 tagCharSeq == Tag::AUDIO_OBJECT_NUMBER or 262 tagCharSeq == Tag::MEDIA_LEVEL or 263 tagCharSeq == Tag::VIDEO_STRIDE or 264 tagCharSeq == Tag::VIDEO_DISPLAY_WIDTH or 265 tagCharSeq == Tag::VIDEO_DISPLAY_HEIGHT or 266 tagCharSeq == Tag::VIDEO_PIC_WIDTH or 267 tagCharSeq == Tag::VIDEO_PIC_HEIGHT or 268 tagCharSeq == Tag::OH_MD_KEY_AUDIO_OBJECT_NUMBER or 269 tagCharSeq == Tag::AUDIO_L2HC_VERSION or 270 tagCharSeq == Tag::DRM_ERROR_CODE, int32_t, AnyValueType::INT32_T); 271 272 DEFINE_INSERT_GET_FUNC( 273 tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_SIZE or 274 tagCharSeq == Tag::VIDEO_ENCODER_LTR_FRAME_COUNT or 275 tagCharSeq == Tag::VIDEO_PER_FRAME_POC or 276 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_USE_LTR or 277 tagCharSeq == Tag::VIDEO_CROP_TOP or 278 tagCharSeq == Tag::VIDEO_CROP_BOTTOM or 279 tagCharSeq == Tag::VIDEO_CROP_LEFT or 280 tagCharSeq == Tag::VIDEO_CROP_RIGHT or 281 tagCharSeq == Tag::VIDEO_SLICE_HEIGHT or 282 tagCharSeq == Tag::VIDEO_ENCODER_QP_MAX or 283 tagCharSeq == Tag::VIDEO_ENCODER_QP_MIN or 284 tagCharSeq == Tag::VIDEO_ENCODER_QP_START or 285 tagCharSeq == Tag::VIDEO_ENCODER_TARGET_QP or 286 tagCharSeq == Tag::VIDEO_ENCODER_OPERATING_RATE or 287 tagCharSeq == Tag::FEATURE_PROPERTY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT or 288 tagCharSeq == Tag::SCREEN_CAPTURE_ERR_CODE or 289 tagCharSeq == Tag::SCREEN_CAPTURE_DURATION or 290 tagCharSeq == Tag::SCREEN_CAPTURE_START_LATENCY or 291 tagCharSeq == Tag::RECORDER_ERR_CODE or 292 tagCharSeq == Tag::RECORDER_DURATION or 293 tagCharSeq == Tag::RECORDER_VIDEO_BITRATE or 294 tagCharSeq == Tag::RECORDER_AUDIO_SAMPLE_RATE or 295 tagCharSeq == Tag::RECORDER_AUDIO_CHANNEL_COUNT or 296 tagCharSeq == Tag::RECORDER_AUDIO_BITRATE or 297 tagCharSeq == Tag::RECORDER_START_LATENCY, int32_t, AnyValueType::INT32_T); 298 DEFINE_INSERT_GET_FUNC( 299 tagCharSeq == Tag::VIDEO_DECODER_RATE_UPPER_LIMIT or 300 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_I_RATIO or 301 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_MADI or 302 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_MADP or 303 tagCharSeq == Tag::VIDEO_ENCODER_SUM_MADI or 304 tagCharSeq == Tag::VIDEO_ENCODER_REAL_BITRATE or 305 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_QP or 306 tagCharSeq == Tag::VIDEO_ENCODER_QP_AVERAGE or 307 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_TEMPORAL_ID or 308 tagCharSeq == Tag::AV_PLAYER_ERR_CODE or 309 tagCharSeq == Tag::AV_PLAYER_PLAY_DURATION or 310 tagCharSeq == Tag::AV_PLAYER_SOURCE_TYPE or 311 tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_RATE or 312 tagCharSeq == Tag::AV_PLAYER_VIDEO_BITRATE or 313 tagCharSeq == Tag::AV_PLAYER_AUDIO_BITRATE or 314 tagCharSeq == Tag::AV_PLAYER_START_LATENCY or 315 tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED or 316 tagCharSeq == Tag::AV_PLAYER_MAX_SEEK_LATENCY or 317 tagCharSeq == Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY or 318 tagCharSeq == Tag::AV_PLAYER_LAG_TIMES or 319 tagCharSeq == Tag::AV_PLAYER_MAX_LAG_DURATION or 320 tagCharSeq == Tag::AV_PLAYER_AVG_LAG_DURATION or 321 tagCharSeq == Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, int32_t, AnyValueType::INT32_T); 322 DEFINE_INSERT_GET_FUNC( 323 tagCharSeq == Tag::VIDEO_COORDINATE_X or 324 tagCharSeq == Tag::VIDEO_COORDINATE_Y or 325 tagCharSeq == Tag::VIDEO_COORDINATE_W or 326 tagCharSeq == Tag::VIDEO_COORDINATE_H or 327 tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER or 328 tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, int32_t, AnyValueType::INT32_T); 329 DEFINE_INSERT_GET_FUNC( 330 tagCharSeq == Tag::AV_TRANSCODER_ERR_CODE or 331 tagCharSeq == Tag::AV_TRANSCODER_SOURCE_DURATION or 332 tagCharSeq == Tag::AV_TRANSCODER_TRANSCODER_DURATION or 333 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_BITRATE or 334 tagCharSeq == Tag::AV_TRANSCODER_SRC_HDR_TYPE or 335 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_SAMPLE_RATE or 336 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_CHANNEL_COUNT or 337 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_BITRATE or 338 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_BITRATE or 339 tagCharSeq == Tag::AV_TRANSCODER_DST_HDR_TYPE or 340 tagCharSeq == Tag::AV_TRANSCODER_DST_COLOR_SPACE or 341 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_SAMPLE_RATE or 342 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_CHANNEL_COUNT or 343 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_BITRATE or 344 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_DECODER_DURATION or 345 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_ENCODER_DURATION or 346 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_VPE_DURATION, int32_t, AnyValueType::INT32_T); 347 DEFINE_INSERT_GET_FUNC( 348 tagCharSeq == Tag::AV_TRANSCODER_ENABLE_B_FRAME, bool, AnyValueType::BOOL); 349 DEFINE_INSERT_GET_FUNC( 350 tagCharSeq == Tag::APP_FULL_TOKEN_ID or 351 tagCharSeq == Tag::BUFFER_DECODING_TIMESTAMP or 352 tagCharSeq == Tag::BUFFER_DURATION or 353 tagCharSeq == Tag::MEDIA_DURATION or 354 tagCharSeq == Tag::MEDIA_BITRATE or 355 tagCharSeq == Tag::MEDIA_START_TIME or 356 tagCharSeq == Tag::MEDIA_CONTAINER_START_TIME or 357 tagCharSeq == Tag::USER_FRAME_PTS or 358 tagCharSeq == Tag::USER_PUSH_DATA_TIME or 359 tagCharSeq == Tag::MEDIA_FILE_SIZE or 360 tagCharSeq == Tag::MEDIA_POSITION or 361 tagCharSeq == Tag::MEDIA_TIME_STAMP or 362 tagCharSeq == Tag::VIDEO_DECODER_DESIRED_PRESENT_TIMESTAMP, int64_t, AnyValueType::INT64_T); 363 364 DEFINE_INSERT_GET_FUNC( 365 tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, uint64_t, AnyValueType::UINT64_T); 366 367 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_LATITUDE or 368 tagCharSeq == Tag::MEDIA_LONGITUDE or 369 tagCharSeq == Tag::AV_PLAYER_VIDEO_FRAMERATE, float, AnyValueType::FLOAT); 370 371 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_FRAME_RATE or 372 tagCharSeq == Tag::VIDEO_CAPTURE_RATE or 373 tagCharSeq == Tag::VIDEO_SAR or 374 tagCharSeq == Tag::VIDEO_ENCODER_MSE, double, AnyValueType::DOUBLE); 375 DEFINE_INSERT_GET_FUNC( 376 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_FRAME_RATE or 377 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_FRAME_RATE, double, AnyValueType::DOUBLE); 378 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_FILE_TYPE, Plugins::FileType, AnyValueType::INT32_T); 379 DEFINE_INSERT_GET_FUNC( 380 tagCharSeq == Tag::DRM_DECRYPT_AVG_SIZE or 381 tagCharSeq == Tag::DRM_DECRYPT_AVG_DURATION or 382 tagCharSeq == Tag::DRM_DECRYPT_MAX_SIZE or 383 tagCharSeq == Tag::DRM_DECRYPT_MAX_DURATION or 384 tagCharSeq == Tag::DRM_DECRYPT_TIMES, uint32_t, AnyValueType::UINT32_T); 385 DEFINE_INSERT_GET_FUNC( 386 tagCharSeq == Tag::MEDIA_AIGC or 387 tagCharSeq == Tag::MIME_TYPE or 388 tagCharSeq == Tag::MEDIA_FILE_URI or 389 tagCharSeq == Tag::MEDIA_TITLE or 390 tagCharSeq == Tag::MEDIA_ARTIST or 391 tagCharSeq == Tag::MEDIA_LYRICIST or 392 tagCharSeq == Tag::MEDIA_ALBUM or 393 tagCharSeq == Tag::MEDIA_ALBUM_ARTIST or 394 tagCharSeq == Tag::MEDIA_DATE or 395 tagCharSeq == Tag::MEDIA_COMMENT or 396 tagCharSeq == Tag::MEDIA_GENRE or 397 tagCharSeq == Tag::MEDIA_COPYRIGHT or 398 tagCharSeq == Tag::MEDIA_LANGUAGE or 399 tagCharSeq == Tag::MEDIA_DESCRIPTION or 400 tagCharSeq == Tag::USER_TIME_SYNC_RESULT or 401 tagCharSeq == Tag::USER_AV_SYNC_GROUP_INFO or 402 tagCharSeq == Tag::USER_SHARED_MEMORY_FD or 403 tagCharSeq == Tag::MEDIA_AUTHOR or 404 tagCharSeq == Tag::MEDIA_COMPOSER or 405 tagCharSeq == Tag::MEDIA_LYRICS or 406 tagCharSeq == Tag::MEDIA_CREATION_TIME or 407 tagCharSeq == Tag::MEDIA_CODEC_NAME or 408 tagCharSeq == Tag::PROCESS_NAME or 409 tagCharSeq == Tag::SCREEN_CAPTURE_ERR_MSG or 410 tagCharSeq == Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION or 411 tagCharSeq == Tag::DRM_APP_NAME or 412 tagCharSeq == Tag::DRM_INSTANCE_ID or 413 tagCharSeq == Tag::DRM_ERROR_MESG or 414 tagCharSeq == Tag::RECORDER_ERR_MSG or 415 tagCharSeq == Tag::RECORDER_CONTAINER_MIME or 416 tagCharSeq == Tag::RECORDER_VIDEO_MIME or 417 tagCharSeq == Tag::RECORDER_VIDEO_RESOLUTION or 418 tagCharSeq == Tag::RECORDER_AUDIO_MIME or 419 tagCharSeq == Tag::AV_PLAYER_ERR_MSG or 420 tagCharSeq == Tag::AV_PLAYER_CONTAINER_MIME or 421 tagCharSeq == Tag::AV_PLAYER_VIDEO_MIME or 422 tagCharSeq == Tag::AV_PLAYER_VIDEO_RESOLUTION or 423 tagCharSeq == Tag::AV_PLAYER_AUDIO_MIME, std::string, AnyValueType::STRING); 424 DEFINE_INSERT_GET_FUNC( 425 tagCharSeq == Tag::AV_TRANSCODER_ERR_MSG or 426 tagCharSeq == Tag::AV_TRANSCODER_SRC_FORMAT or 427 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_MIME or 428 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_MIME or 429 tagCharSeq == Tag::AV_TRANSCODER_DST_FORMAT or 430 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_MIME or 431 tagCharSeq == Tag::VIDEO_ENCODER_ROI_PARAMS or 432 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_MIME, std::string, AnyValueType::STRING); 433 DEFINE_INSERT_GET_FUNC( 434 tagCharSeq == Tag::RECORDER_HDR_TYPE, int8_t, AnyValueType::INT8_T); 435 436 DEFINE_INSERT_GET_FUNC( 437 tagCharSeq == Tag::SCREEN_CAPTURE_AV_TYPE or 438 tagCharSeq == Tag::SCREEN_CAPTURE_DATA_TYPE or 439 tagCharSeq == Tag::SCREEN_CAPTURE_STOP_REASON, uint8_t, AnyValueType::UINT8_T); 440 DEFINE_INSERT_GET_FUNC( 441 tagCharSeq == Tag::AV_PLAYER_VIDEO_BITDEPTH or 442 tagCharSeq == Tag::AV_PLAYER_HDR_TYPE, int8_t, AnyValueType::INT8_T); 443 DEFINE_INSERT_GET_FUNC( 444 tagCharSeq == Tag::MEDIA_AVAILABLE_BITRATES, std::vector<uint8_t>, AnyValueType::VECTOR_UINT8); 445 DEFINE_INSERT_GET_FUNC( 446 tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK_MIME or 447 tagCharSeq == Tag::TIMED_METADATA_KEY or 448 tagCharSeq == Tag::TIMED_METADATA_LOCALE or 449 tagCharSeq == Tag::TIMED_METADATA_SETUP, std::string, AnyValueType::STRING); 450 DEFINE_INSERT_GET_FUNC( 451 tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK, int32_t, AnyValueType::INT32_T); 452 DEFINE_INSERT_GET_FUNC( 453 tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_COLOR_SPACE, int32_t, AnyValueType::INT32_T); 454 DEFINE_INSERT_GET_FUNC( 455 tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_ENABLE_VRR, int32_t, AnyValueType::INT32_T); 456 DEFINE_INSERT_GET_FUNC( 457 tagCharSeq == Tag::MEDIA_EDITLIST, int32_t, AnyValueType::INT32_T); 458 DEFINE_INSERT_GET_FUNC( 459 tagCharSeq == Tag::MEDIA_ENABLE_MOOV_FRONT, int32_t, AnyValueType::INT32_T); 460 DEFINE_INSERT_GET_FUNC( 461 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_ABS_QP_MAP, bool, AnyValueType::BOOL); 462 DEFINE_INSERT_GET_FUNC( 463 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_QP_MAP, std::vector<uint8_t>, AnyValueType::VECTOR_UINT8); 464 DEFINE_INSERT_GET_FUNC( 465 tagCharSeq == Tag::REFERENCE_TRACK_IDS, std::vector<int32_t>, AnyValueType::VECTOR_INT32); 466 DEFINE_INSERT_GET_FUNC( 467 tagCharSeq == Tag::TRACK_REFERENCE_TYPE or 468 tagCharSeq == Tag::TRACK_DESCRIPTION, std::string, AnyValueType::STRING); 469 DEFINE_INSERT_GET_FUNC( 470 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_PTS_BASED_RATECONTROL, int32_t, AnyValueType::INT32_T); 471 DEFINE_INSERT_GET_FUNC( 472 tagCharSeq == Tag::VIDEO_DECODER_INPUT_STREAM_ERROR, int32_t, AnyValueType::INT32_T); 473 474 Meta &operator=(const Meta &other) 475 { 476 map_ = other.map_; 477 return *this; 478 } 479 480 Meta &operator=(Meta &&other) 481 { 482 swap(map_, other.map_); 483 return *this; 484 } 485 Meta()486 Meta() { 487 }; 488 Meta(const Meta & other)489 Meta(const Meta &other) 490 { 491 map_ = other.map_; 492 } 493 Meta(Meta && other)494 Meta(Meta &&other) 495 { 496 swap(map_, other.map_); 497 } 498 499 Any& operator[](const TagType& tag) 500 { 501 return map_[tag]; 502 } 503 504 Any& operator[](TagTypeCharSeq tag) 505 { 506 return map_[tag]; 507 } 508 begin()509 MapIt begin() const // to support for (auto e : Meta), must use begin/end name 510 { 511 return map_.cbegin(); 512 } 513 end()514 MapIt end() const 515 { 516 return map_.cend(); 517 } 518 Clear()519 void Clear() 520 { 521 map_.clear(); 522 } 523 Find(TagType tag)524 MapIt Find(TagType tag) const 525 { 526 return map_.find(tag); 527 } 528 Find(TagTypeCharSeq tag)529 MapIt Find(TagTypeCharSeq tag) const 530 { 531 return map_.find(tag); 532 } 533 Empty()534 bool Empty() const 535 { 536 return map_.empty(); 537 } 538 539 template <typename T> SetData(const TagType & tag,const T & value)540 void SetData(const TagType& tag, const T& value) 541 { 542 map_[tag] = value; 543 } 544 545 template <typename T> SetData(TagTypeCharSeq tag,const T & value)546 void SetData(TagTypeCharSeq tag, const T& value) 547 { 548 if (tag == nullptr) { 549 return; 550 } 551 map_[tag] = value; 552 } 553 554 template <int N> SetData(const TagType & tag,char const (& value)[N])555 void SetData(const TagType &tag, char const (&value)[N]) 556 { 557 std::string strValue = value; 558 map_[tag] = std::move(strValue); 559 } 560 561 template <int N> SetData(TagTypeCharSeq tag,char const (& value)[N])562 void SetData(TagTypeCharSeq tag, char const (&value)[N]) 563 { 564 if (tag == nullptr) { 565 return; 566 } 567 std::string strValue = value; 568 map_[tag] = std::move(strValue); 569 } 570 571 template <typename T> GetData(const TagType & tag,T & value)572 bool GetData(const TagType& tag, T &value) const 573 { 574 auto iter = map_.find(tag); 575 if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) { 576 return false; 577 } 578 value = AnyCast<T>(iter->second); 579 return true; 580 } 581 582 template <typename T> GetData(TagTypeCharSeq tag,T & value)583 bool GetData(TagTypeCharSeq tag, T &value) const 584 { 585 auto iter = map_.find(tag); 586 if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) { 587 return false; 588 } 589 value = AnyCast<T>(iter->second); 590 return true; 591 } 592 Remove(const TagType & tag)593 void Remove(const TagType& tag) 594 { 595 auto iter = map_.find(tag); 596 if (iter != map_.end()) { 597 map_.erase(iter); 598 } 599 } 600 Remove(TagTypeCharSeq tag)601 void Remove(TagTypeCharSeq tag) 602 { 603 auto iter = map_.find(tag); 604 if (iter != map_.end()) { 605 map_.erase(iter); 606 } 607 } 608 GetKeys(std::vector<TagType> & keys)609 void GetKeys(std::vector<TagType>& keys) const 610 { 611 int cnt = 0; 612 keys.resize(map_.size()); 613 for (const auto& tmp : map_) { 614 keys[cnt++] = tmp.first; 615 } 616 } 617 618 bool IsDefinedKey(const TagType &tag) const; 619 AnyValueType GetValueType(const TagType& key) const; 620 bool ToParcel(MessageParcel &parcel) const; 621 bool FromParcel(MessageParcel &parcel); 622 623 private: 624 std::map<TagType, Any> map_; 625 }; 626 627 /** 628 * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/bool/int32_t value into Meta Object. 629 * @implNote In order to set value(int32_t type) to Meta Object, should convert int32_t value to correct EnumType then 630 * save to Any object. We use metadataGetterSetterMap to get the right setter function. 631 * @return Returns operator status, <b>True</b> if Set Success. 632 * returns <b>False</b> otherwise. 633 * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value); 634 */ 635 bool SetMetaData(Meta& meta, const TagType& tag, int32_t value); 636 637 /** 638 * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/bool/int32_t value from Meta Object. 639 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 640 * object. We use metadataGetterSetterMap to get the right getter function. 641 * @return Returns operator status, <b>True</b> if Get Success. 642 * returns <b>False</b> otherwise. 643 * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value); 644 */ 645 bool GetMetaData(const Meta& meta, const TagType& tag, int32_t& value); 646 /** 647 * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/int64_t value into Meta Object. 648 * @implNote In order to set value(int64_t type) to Meta Object, should convert int64_t value to correct EnumType then 649 * save to Any object. We use metadataGetterSetterMap to get the right setter function. 650 * @return Returns operator status, <b>True</b> if Set Success. 651 * returns <b>False</b> otherwise. 652 * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value); 653 */ 654 bool SetMetaData(Meta& meta, const TagType& tag, int64_t value); 655 656 /** 657 * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/int64_t value from Meta Object. 658 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 659 * object. We use metadataGetterSetterMap to get the right getter function. 660 * @return Returns operator status, <b>True</b> if Get Success. 661 * returns <b>False</b> otherwise. 662 * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value); 663 */ 664 bool GetMetaData(const Meta& meta, const TagType& tag, int64_t& value); 665 666 /** 667 * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int32_t or not. 668 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 669 * object. We use metadataGetterSetterMap to get the value type. 670 * @return Returns operator status, <b>True</b> if the key's value type is int32_t. 671 * returns <b>False</b> otherwise. 672 * @example OHOS::Media::IsIntEnum("audio.aac.profile"); 673 */ 674 bool IsIntEnum(const TagType& tag); 675 676 /** 677 * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int64_t or not. 678 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 679 * object. We use metadataGetterSetterMap to get the value type. 680 * @return Returns operator status, <b>True</b> if the key's value type is int64_t. 681 * returns <b>False</b> otherwise. 682 * @example OHOS::Media::IsIntEnum("audio.aac.profile"); 683 */ 684 bool IsLongEnum(const TagType& tag); 685 } // namespace Media 686 } // namespace OHOS 687 #endif // MEDIA_FOUNDATION_META_H