1 /* 2 * Copyright (c) 2023-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_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 }; 137 138 DECLARE_INFO_CLASS; 139 140 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::SRC_INPUT_TYPE, Plugins::SrcInputType, AnyValueType::INT32_T); 141 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_CODEC_CONFIG or 142 tagCharSeq == Tag::MEDIA_COVER or 143 tagCharSeq == Tag::AUDIO_VIVID_METADATA or 144 tagCharSeq == Tag::AUDIO_VORBIS_IDENTIFICATION_HEADER or 145 tagCharSeq == Tag::AUDIO_VORBIS_SETUP_HEADER or 146 tagCharSeq == Tag::OH_MD_KEY_AUDIO_VIVID_METADATA or 147 tagCharSeq == Tag::DRM_CENC_INFO, 148 std::vector<uint8_t>, AnyValueType::VECTOR_UINT8); 149 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_CHANNEL_LAYOUT or 150 tagCharSeq == Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, 151 Plugins::AudioChannelLayout, AnyValueType::INT64_T); 152 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_SAMPLE_FORMAT, Plugins::AudioSampleFormat, 153 AnyValueType::INT32_T); 154 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_PROFILE, Plugins::AudioAacProfile, AnyValueType::UINT8_T); 155 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_STREAM_FORMAT, Plugins::AudioAacStreamFormat, 156 AnyValueType::UINT8_T); 157 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_PIXEL_FORMAT, Plugins::VideoPixelFormat, 158 AnyValueType::INT32_T); 159 // DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_SEEKABLE), Plugins::Seekable); 160 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_TYPE, Plugins::MediaType, AnyValueType::INT32_T); 161 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BIT_STREAM_FORMAT, std::vector<Plugins::VideoBitStreamFormat>, 162 AnyValueType::VECTOR_UINT32); 163 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H264_PROFILE, Plugins::VideoH264Profile, 164 AnyValueType::INT32_T); 165 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ROTATION, Plugins::VideoRotation, AnyValueType::INT32_T); 166 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ORIENTATION_TYPE, Plugins::VideoOrientationType, 167 AnyValueType::INT32_T); 168 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_PRIMARIES, Plugins::ColorPrimary, 169 AnyValueType::INT32_T); 170 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_TRC, Plugins::TransferCharacteristic, 171 AnyValueType::INT32_T); 172 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_MATRIX_COEFF, Plugins::MatrixCoefficient, 173 AnyValueType::INT32_T); 174 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODE_BITRATE_MODE, 175 Plugins::VideoEncodeBitrateMode, AnyValueType::INT32_T); 176 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_RANGE or 177 tagCharSeq == Tag::VIDEO_REQUEST_I_FRAME or 178 tagCharSeq == Tag::VIDEO_IS_HDR_VIVID or 179 tagCharSeq == Tag::MEDIA_HAS_VIDEO or 180 tagCharSeq == Tag::MEDIA_HAS_AUDIO or 181 tagCharSeq == Tag::MEDIA_HAS_SUBTITLE or 182 tagCharSeq == Tag::MEDIA_HAS_TIMEDMETA or 183 tagCharSeq == Tag::MEDIA_END_OF_STREAM or 184 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR or 185 tagCharSeq == Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE or 186 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY or 187 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK or 188 tagCharSeq == Tag::VIDEO_PER_FRAME_IS_LTR or 189 tagCharSeq == Tag::VIDEO_PER_FRAME_IS_SKIP or 190 tagCharSeq == Tag::VIDEO_ENABLE_LOW_LATENCY or 191 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK or 192 tagCharSeq == Tag::SCREEN_CAPTURE_USER_AGREE or 193 tagCharSeq == Tag::SCREEN_CAPTURE_REQURE_MIC or 194 tagCharSeq == Tag::SCREEN_CAPTURE_ENABLE_MIC or 195 tagCharSeq == Tag::AV_PLAYER_IS_DRM_PROTECTED or 196 tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TIME_OUT or 197 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_DISCARD or 198 tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_WATERMARK, bool, AnyValueType::BOOL); 199 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BUFFER_CAN_DROP, bool, AnyValueType::BOOL); 200 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_RENDER_SET_FLAG, bool, AnyValueType::BOOL); 201 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_PROFILE, Plugins::HEVCProfile, AnyValueType::INT32_T); 202 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_LEVEL, Plugins::HEVCLevel, AnyValueType::INT32_T); 203 204 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_CHROMA_LOCATION, 205 Plugins::ChromaLocation, AnyValueType::INT32_T); 206 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, 207 Plugins::TemporalGopReferenceMode, AnyValueType::INT32_T); 208 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::APP_UID or 209 tagCharSeq == Tag::APP_PID or 210 tagCharSeq == Tag::APP_TOKEN_ID or 211 tagCharSeq == Tag::REQUIRED_IN_BUFFER_CNT or 212 tagCharSeq == Tag::REQUIRED_IN_BUFFER_SIZE or 213 tagCharSeq == Tag::REQUIRED_OUT_BUFFER_CNT or 214 tagCharSeq == Tag::REQUIRED_OUT_BUFFER_SIZE or 215 tagCharSeq == Tag::BUFFERING_SIZE or 216 tagCharSeq == Tag::WATERLINE_HIGH or 217 tagCharSeq == Tag::WATERLINE_LOW or 218 tagCharSeq == Tag::AUDIO_CHANNEL_COUNT or 219 tagCharSeq == Tag::AUDIO_SAMPLE_RATE or 220 tagCharSeq == Tag::AUDIO_SAMPLE_PER_FRAME or 221 tagCharSeq == Tag::AUDIO_OUTPUT_CHANNELS or 222 tagCharSeq == Tag::AUDIO_MPEG_VERSION or 223 tagCharSeq == Tag::AUDIO_MPEG_LAYER or 224 tagCharSeq == Tag::AUDIO_AAC_LEVEL or 225 tagCharSeq == Tag::AUDIO_MAX_INPUT_SIZE or 226 tagCharSeq == Tag::AUDIO_MAX_OUTPUT_SIZE or 227 tagCharSeq == Tag::AUDIO_SOUNDBED_CHANNELS_NUMBER or 228 tagCharSeq == Tag::AUDIO_HOA_ORDER or 229 tagCharSeq == Tag::VIDEO_WIDTH or 230 tagCharSeq == Tag::VIDEO_HEIGHT or 231 tagCharSeq == Tag::VIDEO_DELAY or 232 tagCharSeq == Tag::VIDEO_MAX_SURFACE_NUM or 233 tagCharSeq == Tag::VIDEO_H264_LEVEL or 234 tagCharSeq == Tag::MEDIA_TRACK_COUNT or 235 tagCharSeq == Tag::AUDIO_AAC_IS_ADTS or 236 tagCharSeq == Tag::AUDIO_COMPRESSION_LEVEL or 237 tagCharSeq == Tag::AUDIO_BITS_PER_CODED_SAMPLE or 238 tagCharSeq == Tag::AUDIO_BITS_PER_RAW_SAMPLE or 239 tagCharSeq == Tag::REGULAR_TRACK_ID or 240 tagCharSeq == Tag::VIDEO_SCALE_TYPE or 241 tagCharSeq == Tag::VIDEO_I_FRAME_INTERVAL or 242 tagCharSeq == Tag::MEDIA_PROFILE or 243 tagCharSeq == Tag::VIDEO_ENCODE_QUALITY or 244 tagCharSeq == Tag::AUDIO_AAC_SBR or 245 tagCharSeq == Tag::AUDIO_FLAC_COMPLIANCE_LEVEL or 246 tagCharSeq == Tag::AUDIO_OBJECT_NUMBER or 247 tagCharSeq == Tag::MEDIA_LEVEL or 248 tagCharSeq == Tag::VIDEO_STRIDE or 249 tagCharSeq == Tag::VIDEO_DISPLAY_WIDTH or 250 tagCharSeq == Tag::VIDEO_DISPLAY_HEIGHT or 251 tagCharSeq == Tag::VIDEO_PIC_WIDTH or 252 tagCharSeq == Tag::VIDEO_PIC_HEIGHT or 253 tagCharSeq == Tag::OH_MD_KEY_AUDIO_OBJECT_NUMBER or 254 tagCharSeq == Tag::DRM_ERROR_CODE, int32_t, AnyValueType::INT32_T); 255 256 DEFINE_INSERT_GET_FUNC( 257 tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_SIZE or 258 tagCharSeq == Tag::VIDEO_ENCODER_LTR_FRAME_COUNT or 259 tagCharSeq == Tag::VIDEO_PER_FRAME_POC or 260 tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_USE_LTR or 261 tagCharSeq == Tag::VIDEO_CROP_TOP or 262 tagCharSeq == Tag::VIDEO_CROP_BOTTOM or 263 tagCharSeq == Tag::VIDEO_CROP_LEFT or 264 tagCharSeq == Tag::VIDEO_CROP_RIGHT or 265 tagCharSeq == Tag::VIDEO_SLICE_HEIGHT or 266 tagCharSeq == Tag::VIDEO_ENCODER_QP_MAX or 267 tagCharSeq == Tag::VIDEO_ENCODER_QP_MIN or 268 tagCharSeq == Tag::VIDEO_ENCODER_QP_START or 269 tagCharSeq == Tag::FEATURE_PROPERTY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT or 270 tagCharSeq == Tag::SCREEN_CAPTURE_ERR_CODE or 271 tagCharSeq == Tag::SCREEN_CAPTURE_DURATION or 272 tagCharSeq == Tag::SCREEN_CAPTURE_START_LATENCY or 273 tagCharSeq == Tag::RECORDER_ERR_CODE or 274 tagCharSeq == Tag::RECORDER_DURATION or 275 tagCharSeq == Tag::RECORDER_VIDEO_BITRATE or 276 tagCharSeq == Tag::RECORDER_AUDIO_SAMPLE_RATE or 277 tagCharSeq == Tag::RECORDER_AUDIO_CHANNEL_COUNT or 278 tagCharSeq == Tag::RECORDER_AUDIO_BITRATE or 279 tagCharSeq == Tag::RECORDER_START_LATENCY, int32_t, AnyValueType::INT32_T); 280 281 DEFINE_INSERT_GET_FUNC( 282 tagCharSeq == Tag::VIDEO_DECODER_RATE_UPPER_LIMIT or 283 tagCharSeq == Tag::VIDEO_ENCODER_QP_AVERAGE or 284 tagCharSeq == Tag::VIDEO_ENCODER_FRAME_TEMPORAL_ID or 285 tagCharSeq == Tag::AV_PLAYER_ERR_CODE or 286 tagCharSeq == Tag::AV_PLAYER_PLAY_DURATION or 287 tagCharSeq == Tag::AV_PLAYER_SOURCE_TYPE or 288 tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_RATE or 289 tagCharSeq == Tag::AV_PLAYER_VIDEO_BITRATE or 290 tagCharSeq == Tag::AV_PLAYER_AUDIO_BITRATE or 291 tagCharSeq == Tag::AV_PLAYER_START_LATENCY or 292 tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED or 293 tagCharSeq == Tag::AV_PLAYER_MAX_SEEK_LATENCY or 294 tagCharSeq == Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY or 295 tagCharSeq == Tag::AV_PLAYER_LAG_TIMES or 296 tagCharSeq == Tag::AV_PLAYER_MAX_LAG_DURATION or 297 tagCharSeq == Tag::AV_PLAYER_AVG_LAG_DURATION or 298 tagCharSeq == Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, int32_t, AnyValueType::INT32_T); 299 DEFINE_INSERT_GET_FUNC( 300 tagCharSeq == Tag::VIDEO_COORDINATE_X or 301 tagCharSeq == Tag::VIDEO_COORDINATE_Y or 302 tagCharSeq == Tag::VIDEO_COORDINATE_W or 303 tagCharSeq == Tag::VIDEO_COORDINATE_H or 304 tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER or 305 tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, int32_t, AnyValueType::INT32_T); 306 DEFINE_INSERT_GET_FUNC( 307 tagCharSeq == Tag::AV_TRANSCODER_ERR_CODE or 308 tagCharSeq == Tag::AV_TRANSCODER_SOURCE_DURATION or 309 tagCharSeq == Tag::AV_TRANSCODER_TRANSCODER_DURATION or 310 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_BITRATE or 311 tagCharSeq == Tag::AV_TRANSCODER_SRC_HDR_TYPE or 312 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_SAMPLE_RATE or 313 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_CHANNEL_COUNT or 314 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_BITRATE or 315 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_BITRATE or 316 tagCharSeq == Tag::AV_TRANSCODER_DST_HDR_TYPE or 317 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_SAMPLE_RATE or 318 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_CHANNEL_COUNT or 319 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_BITRATE or 320 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_DECODER_DURATION or 321 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_ENCODER_DURATION or 322 tagCharSeq == Tag::AV_TRANSCODER_VIDEO_VPE_DURATION, int32_t, AnyValueType::INT32_T); 323 324 DEFINE_INSERT_GET_FUNC( 325 tagCharSeq == Tag::APP_FULL_TOKEN_ID or 326 tagCharSeq == Tag::BUFFER_DECODING_TIMESTAMP or 327 tagCharSeq == Tag::BUFFER_DURATION or 328 tagCharSeq == Tag::MEDIA_DURATION or 329 tagCharSeq == Tag::MEDIA_BITRATE or 330 tagCharSeq == Tag::MEDIA_START_TIME or 331 tagCharSeq == Tag::MEDIA_CONTAINER_START_TIME or 332 tagCharSeq == Tag::USER_FRAME_PTS or 333 tagCharSeq == Tag::USER_PUSH_DATA_TIME or 334 tagCharSeq == Tag::MEDIA_FILE_SIZE or 335 tagCharSeq == Tag::MEDIA_POSITION or 336 tagCharSeq == Tag::MEDIA_TIME_STAMP or 337 tagCharSeq == Tag::VIDEO_DECODER_DESIRED_PRESENT_TIMESTAMP, int64_t, AnyValueType::INT64_T); 338 339 DEFINE_INSERT_GET_FUNC( 340 tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, uint64_t, AnyValueType::UINT64_T); 341 342 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_LATITUDE or 343 tagCharSeq == Tag::MEDIA_LONGITUDE or 344 tagCharSeq == Tag::AV_PLAYER_VIDEO_FRAMERATE, float, AnyValueType::FLOAT); 345 346 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_FRAME_RATE or 347 tagCharSeq == Tag::VIDEO_CAPTURE_RATE or 348 tagCharSeq == Tag::VIDEO_SAR or 349 tagCharSeq == Tag::VIDEO_ENCODER_MSE, double, AnyValueType::DOUBLE); 350 DEFINE_INSERT_GET_FUNC( 351 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_FRAME_RATE or 352 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_FRAME_RATE, double, AnyValueType::DOUBLE); 353 DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_FILE_TYPE, Plugins::FileType, AnyValueType::INT32_T); 354 DEFINE_INSERT_GET_FUNC( 355 tagCharSeq == Tag::DRM_DECRYPT_AVG_SIZE or 356 tagCharSeq == Tag::DRM_DECRYPT_AVG_DURATION or 357 tagCharSeq == Tag::DRM_DECRYPT_MAX_SIZE or 358 tagCharSeq == Tag::DRM_DECRYPT_MAX_DURATION or 359 tagCharSeq == Tag::DRM_DECRYPT_TIMES, uint32_t, AnyValueType::UINT32_T); 360 DEFINE_INSERT_GET_FUNC( 361 tagCharSeq == Tag::MIME_TYPE or 362 tagCharSeq == Tag::MEDIA_FILE_URI or 363 tagCharSeq == Tag::MEDIA_TITLE or 364 tagCharSeq == Tag::MEDIA_ARTIST or 365 tagCharSeq == Tag::MEDIA_LYRICIST or 366 tagCharSeq == Tag::MEDIA_ALBUM or 367 tagCharSeq == Tag::MEDIA_ALBUM_ARTIST or 368 tagCharSeq == Tag::MEDIA_DATE or 369 tagCharSeq == Tag::MEDIA_COMMENT or 370 tagCharSeq == Tag::MEDIA_GENRE or 371 tagCharSeq == Tag::MEDIA_COPYRIGHT or 372 tagCharSeq == Tag::MEDIA_LANGUAGE or 373 tagCharSeq == Tag::MEDIA_DESCRIPTION or 374 tagCharSeq == Tag::USER_TIME_SYNC_RESULT or 375 tagCharSeq == Tag::USER_AV_SYNC_GROUP_INFO or 376 tagCharSeq == Tag::USER_SHARED_MEMORY_FD or 377 tagCharSeq == Tag::MEDIA_AUTHOR or 378 tagCharSeq == Tag::MEDIA_COMPOSER or 379 tagCharSeq == Tag::MEDIA_LYRICS or 380 tagCharSeq == Tag::MEDIA_CREATION_TIME or 381 tagCharSeq == Tag::MEDIA_CODEC_NAME or 382 tagCharSeq == Tag::PROCESS_NAME or 383 tagCharSeq == Tag::SCREEN_CAPTURE_ERR_MSG or 384 tagCharSeq == Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION or 385 tagCharSeq == Tag::DRM_APP_NAME or 386 tagCharSeq == Tag::DRM_INSTANCE_ID or 387 tagCharSeq == Tag::DRM_ERROR_MESG or 388 tagCharSeq == Tag::RECORDER_ERR_MSG or 389 tagCharSeq == Tag::RECORDER_CONTAINER_MIME or 390 tagCharSeq == Tag::RECORDER_VIDEO_MIME or 391 tagCharSeq == Tag::RECORDER_VIDEO_RESOLUTION or 392 tagCharSeq == Tag::RECORDER_AUDIO_MIME or 393 tagCharSeq == Tag::AV_PLAYER_ERR_MSG or 394 tagCharSeq == Tag::AV_PLAYER_CONTAINER_MIME or 395 tagCharSeq == Tag::AV_PLAYER_VIDEO_MIME or 396 tagCharSeq == Tag::AV_PLAYER_VIDEO_RESOLUTION or 397 tagCharSeq == Tag::AV_PLAYER_AUDIO_MIME, std::string, AnyValueType::STRING); 398 DEFINE_INSERT_GET_FUNC( 399 tagCharSeq == Tag::AV_TRANSCODER_ERR_MSG or 400 tagCharSeq == Tag::AV_TRANSCODER_SRC_FORMAT or 401 tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_MIME or 402 tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_MIME or 403 tagCharSeq == Tag::AV_TRANSCODER_DST_FORMAT or 404 tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_MIME or 405 tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_MIME, std::string, AnyValueType::STRING); 406 DEFINE_INSERT_GET_FUNC( 407 tagCharSeq == Tag::RECORDER_HDR_TYPE, int8_t, AnyValueType::INT8_T); 408 409 DEFINE_INSERT_GET_FUNC( 410 tagCharSeq == Tag::SCREEN_CAPTURE_AV_TYPE or 411 tagCharSeq == Tag::SCREEN_CAPTURE_DATA_TYPE or 412 tagCharSeq == Tag::SCREEN_CAPTURE_STOP_REASON, uint8_t, AnyValueType::UINT8_T); 413 DEFINE_INSERT_GET_FUNC( 414 tagCharSeq == Tag::MEDIA_AVAILABLE_BITRATES, std::vector<uint8_t>, AnyValueType::VECTOR_UINT8); 415 DEFINE_INSERT_GET_FUNC( 416 tagCharSeq == Tag::AV_PLAYER_VIDEO_BITDEPTH or 417 tagCharSeq == Tag::AV_PLAYER_HDR_TYPE, int8_t, AnyValueType::INT8_T); 418 DEFINE_INSERT_GET_FUNC( 419 tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK_MIME or 420 tagCharSeq == Tag::TIMED_METADATA_KEY or 421 tagCharSeq == Tag::TIMED_METADATA_LOCALE or 422 tagCharSeq == Tag::TIMED_METADATA_SETUP, std::string, AnyValueType::STRING); 423 DEFINE_INSERT_GET_FUNC( 424 tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK, int32_t, AnyValueType::INT32_T); 425 DEFINE_INSERT_GET_FUNC( 426 tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_COLOR_SPACE, int32_t, AnyValueType::INT32_T); 427 DEFINE_INSERT_GET_FUNC( 428 tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_ENABLE_VRR, int32_t, AnyValueType::INT32_T); 429 430 Meta &operator=(const Meta &other) 431 { 432 map_ = other.map_; 433 return *this; 434 } 435 436 Meta &operator=(Meta &&other) 437 { 438 swap(map_, other.map_); 439 return *this; 440 } 441 Meta()442 Meta() { 443 }; 444 Meta(const Meta & other)445 Meta(const Meta &other) 446 { 447 map_ = other.map_; 448 } 449 Meta(Meta && other)450 Meta(Meta &&other) 451 { 452 swap(map_, other.map_); 453 } 454 455 Any& operator[](const TagType& tag) 456 { 457 return map_[tag]; 458 } 459 460 Any& operator[](TagTypeCharSeq tag) 461 { 462 return map_[tag]; 463 } 464 begin()465 MapIt begin() const // to support for (auto e : Meta), must use begin/end name 466 { 467 return map_.cbegin(); 468 } 469 end()470 MapIt end() const 471 { 472 return map_.cend(); 473 } 474 Clear()475 void Clear() 476 { 477 map_.clear(); 478 } 479 Find(TagType tag)480 MapIt Find(TagType tag) const 481 { 482 return map_.find(tag); 483 } 484 Find(TagTypeCharSeq tag)485 MapIt Find(TagTypeCharSeq tag) const 486 { 487 return map_.find(tag); 488 } 489 Empty()490 bool Empty() const 491 { 492 return map_.empty(); 493 } 494 495 template <typename T> SetData(const TagType & tag,const T & value)496 void SetData(const TagType& tag, const T& value) 497 { 498 map_[tag] = value; 499 } 500 501 template <typename T> SetData(TagTypeCharSeq tag,const T & value)502 void SetData(TagTypeCharSeq tag, const T& value) 503 { 504 if (tag == nullptr) { 505 return; 506 } 507 map_[tag] = value; 508 } 509 510 template <int N> SetData(const TagType & tag,char const (& value)[N])511 void SetData(const TagType &tag, char const (&value)[N]) 512 { 513 std::string strValue = value; 514 map_[tag] = std::move(strValue); 515 } 516 517 template <int N> SetData(TagTypeCharSeq tag,char const (& value)[N])518 void SetData(TagTypeCharSeq tag, char const (&value)[N]) 519 { 520 if (tag == nullptr) { 521 return; 522 } 523 std::string strValue = value; 524 map_[tag] = std::move(strValue); 525 } 526 527 template <typename T> GetData(const TagType & tag,T & value)528 bool GetData(const TagType& tag, T &value) const 529 { 530 auto iter = map_.find(tag); 531 if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) { 532 return false; 533 } 534 value = AnyCast<T>(iter->second); 535 return true; 536 } 537 538 template <typename T> GetData(TagTypeCharSeq tag,T & value)539 bool GetData(TagTypeCharSeq tag, T &value) const 540 { 541 auto iter = map_.find(tag); 542 if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) { 543 return false; 544 } 545 value = AnyCast<T>(iter->second); 546 return true; 547 } 548 Remove(const TagType & tag)549 void Remove(const TagType& tag) 550 { 551 auto iter = map_.find(tag); 552 if (iter != map_.end()) { 553 map_.erase(iter); 554 } 555 } 556 Remove(TagTypeCharSeq tag)557 void Remove(TagTypeCharSeq tag) 558 { 559 auto iter = map_.find(tag); 560 if (iter != map_.end()) { 561 map_.erase(iter); 562 } 563 } 564 GetKeys(std::vector<TagType> & keys)565 void GetKeys(std::vector<TagType>& keys) const 566 { 567 int cnt = 0; 568 keys.resize(map_.size()); 569 for (const auto& tmp : map_) { 570 keys[cnt++] = tmp.first; 571 } 572 } 573 574 AnyValueType GetValueType(const TagType& key) const; 575 bool ToParcel(MessageParcel &parcel) const; 576 bool FromParcel(MessageParcel &parcel); 577 578 private: 579 std::map<TagType, Any> map_; 580 }; 581 582 /** 583 * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/bool/int32_t value into Meta Object. 584 * @implNote In order to set value(int32_t type) to Meta Object, should convert int32_t value to correct EnumType then 585 * save to Any object. We use metadataGetterSetterMap to get the right setter function. 586 * @return Returns operator status, <b>True</b> if Set Success. 587 * returns <b>False</b> otherwise. 588 * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value); 589 */ 590 bool SetMetaData(Meta& meta, const TagType& tag, int32_t value); 591 592 /** 593 * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/bool/int32_t value from Meta Object. 594 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 595 * object. We use metadataGetterSetterMap to get the right getter function. 596 * @return Returns operator status, <b>True</b> if Get Success. 597 * returns <b>False</b> otherwise. 598 * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value); 599 */ 600 bool GetMetaData(const Meta& meta, const TagType& tag, int32_t& value); 601 /** 602 * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/int64_t value into Meta Object. 603 * @implNote In order to set value(int64_t type) to Meta Object, should convert int64_t value to correct EnumType then 604 * save to Any object. We use metadataGetterSetterMap to get the right setter function. 605 * @return Returns operator status, <b>True</b> if Set Success. 606 * returns <b>False</b> otherwise. 607 * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value); 608 */ 609 bool SetMetaData(Meta& meta, const TagType& tag, int64_t value); 610 611 /** 612 * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/int64_t value from Meta Object. 613 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 614 * object. We use metadataGetterSetterMap to get the right getter function. 615 * @return Returns operator status, <b>True</b> if Get Success. 616 * returns <b>False</b> otherwise. 617 * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value); 618 */ 619 bool GetMetaData(const Meta& meta, const TagType& tag, int64_t& value); 620 621 /** 622 * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int32_t or not. 623 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 624 * object. We use metadataGetterSetterMap to get the value type. 625 * @return Returns operator status, <b>True</b> if the key's value type is int32_t. 626 * returns <b>False</b> otherwise. 627 * @example OHOS::Media::IsIntEnum("audio.aac.profile"); 628 */ 629 bool IsIntEnum(const TagType& tag); 630 631 /** 632 * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int64_t or not. 633 * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any 634 * object. We use metadataGetterSetterMap to get the value type. 635 * @return Returns operator status, <b>True</b> if the key's value type is int64_t. 636 * returns <b>False</b> otherwise. 637 * @example OHOS::Media::IsIntEnum("audio.aac.profile"); 638 */ 639 bool IsLongEnum(const TagType& tag); 640 } // namespace Media 641 } // namespace OHOS 642 #endif // MEDIA_FOUNDATION_META_H