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