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