• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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