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