• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef MEDIA_FOUNDATION_META_H
17 #define MEDIA_FOUNDATION_META_H
18 
19 #ifndef MEDIA_NO_OHOS
20 #ifndef MEDIA_OHOS
21 #define MEDIA_OHOS
22 #endif
23 #else
24 #ifdef MEDIA_OHOS
25 #undef MEDIA_OHOS
26 #endif
27 #endif
28 
29 #include <map>
30 #include <optional>
31 #include "meta/meta_key.h"
32 #include "meta/audio_types.h"
33 #include "meta/media_types.h"
34 #include "meta/video_types.h"
35 #include "meta/source_types.h"
36 #include "meta/mime_type.h"
37 #include "meta/any.h" // NOLINT
38 
39 namespace OHOS {
40 namespace Media {
41 #define DECLARE_INFO_CLASS                                   \
42     template<TagTypeCharSeq tagCharSeq, class Enable = void> \
43     class ValueInfo {                                        \
44         public:                                              \
45             typedef int32_t type;                            \
46     }
47 
48 #define DEFINE_INSERT_GET_FUNC(condition, Any, eValueType)   \
49     template<TagTypeCharSeq tagCharSeq>                      \
50     inline typename std::enable_if<(condition), bool>::type  \
51     Set(Any value)                                           \
52     {                                                        \
53         TagType tag = tagCharSeq;                            \
54         auto iter = map_.find(tag);                          \
55         if (iter != map_.end()) {                            \
56             map_.erase(iter++);                              \
57         }                                                    \
58         map_.insert(std::make_pair(tag, value));             \
59         return true;                                         \
60     }                                                        \
61                                                              \
62     template<TagTypeCharSeq tagCharSeq>                      \
63     inline typename std::enable_if<(condition), bool>::type  \
64     Set(std::nullptr_t)                                      \
65     {                                                        \
66         return false;                                        \
67     }                                                        \
68                                                              \
69     template<TagTypeCharSeq tagCharSeq>                      \
70     inline typename std::enable_if<(condition), bool>::type  \
71     Get(Any& value) const                                    \
72     {                                                        \
73         TagType tag = tagCharSeq;                            \
74         if (map_.count(tag) == 0) {                          \
75             return false;                                    \
76         }                                                    \
77         return AnyCast<Any>(&map_.at(tag), value);           \
78     }                                                        \
79                                                              \
80     template<TagTypeCharSeq tagCharSeq>                      \
81     class ValueInfo<tagCharSeq, typename std::enable_if<condition>::type> \
82     {                                                        \
83         public:                                              \
84             typedef Any type;                                \
85     };                                                       \
86     template<TagTypeCharSeq tagCharSeq>                      \
87     inline typename std::enable_if<condition, AnyValueType>::type \
88     GetValueType()                                           \
89     {                                                        \
90         return eValueType;                                   \
91     }
92 
93 using MapIt = std::map<TagType, Any>::const_iterator;
94 
95 /**
96  * @brief GetDefaultAnyValue used for Application to get Any type default value from Meta Object.
97  * @implNote In order to get Predefined default Any value from Meta Object.
98  * We use metadataDefaultValueMap to get the right getDefaultVal function.
99  * @return Returns Any type default value, returns <b>Any(string())</b> if no match.
100  * @example GetDefaultAnyValue("media.file.type");
101  */
102 extern Any GetDefaultAnyValue(const TagType& tag);
103 /**
104  * @brief GetDefaultAnyValueOpt used for Application to get Any type default value from Meta Object.
105  * @implNote In order to get Predefined default Any value from Meta Object.
106  * We use metadataDefaultValueMap to get the right getDefaultVal function.
107  * @return Returns Any type default value of optional, returns <b>std::nullopt</b> if no match.
108  * @example GetDefaultAnyValueOpt("media.file.type");
109  */
110 extern std::optional<Any> GetDefaultAnyValueOpt(const TagType& tag);
111 /**
112  * @brief GetDefaultAnyValue used for Application to get Any type default value.
113  * @implNote Return Predefined default Any value by tag, if notexist then find default Any value by type,
114  * if type not defined return Any(string).
115  * We use metadataDefaultValueMap and g_ValueTypeDefaultValueMapto get the right getDefaultVal function.
116  * @return Returns Any type default value, returns <b>Any(AnyValueType())</b> if no match.
117  * @example GetDefaultAnyValue("media.file.type", AnyValueType::INT32_T);
118  */
119 extern Any GetDefaultAnyValue(const TagType& tag, AnyValueType type);
120 class Meta {
121 public:
122     enum struct ValueType : int32_t {
123         INVALID_TYPE = 1,
124         BOOL,
125         INT8_T,
126         UINT8_T,
127         INT32_T,
128         UINT32_T,
129         INT64_T,
130         UINT64_T,
131         FLOAT,
132         DOUBLE,
133         VECTOR_UINT8,
134         VECTOR_UINT32,
135         STRING,
136     };
137 
138     DECLARE_INFO_CLASS;
139 
140     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::SRC_INPUT_TYPE, Plugins::SrcInputType, AnyValueType::INT32_T);
141     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_CODEC_CONFIG or
142                            tagCharSeq == Tag::MEDIA_COVER or
143                            tagCharSeq == Tag::AUDIO_VIVID_METADATA or
144                            tagCharSeq == Tag::AUDIO_VORBIS_IDENTIFICATION_HEADER or
145                            tagCharSeq == Tag::AUDIO_VORBIS_SETUP_HEADER or
146                            tagCharSeq == Tag::OH_MD_KEY_AUDIO_VIVID_METADATA or
147                            tagCharSeq == Tag::DRM_CENC_INFO,
148                            std::vector<uint8_t>, AnyValueType::VECTOR_UINT8);
149     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_CHANNEL_LAYOUT or
150                            tagCharSeq == Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT,
151                            Plugins::AudioChannelLayout, AnyValueType::INT64_T);
152     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_SAMPLE_FORMAT, Plugins::AudioSampleFormat,
153                            AnyValueType::INT32_T);
154     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_RAW_SAMPLE_FORMAT, Plugins::AudioSampleFormat,
155                            AnyValueType::INT32_T);
156     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_PROFILE, Plugins::AudioAacProfile, AnyValueType::UINT8_T);
157     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_AAC_STREAM_FORMAT, Plugins::AudioAacStreamFormat,
158                            AnyValueType::UINT8_T);
159     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_ENCODE_PTS_MODE, Plugins::AudioEncodePtsMode,
160                            AnyValueType::INT32_T);
161     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_PIXEL_FORMAT, Plugins::VideoPixelFormat,
162                            AnyValueType::INT32_T);
163 //    DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_SEEKABLE), Plugins::Seekable);
164     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_TYPE, Plugins::MediaType, AnyValueType::INT32_T);
165     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BIT_STREAM_FORMAT, std::vector<Plugins::VideoBitStreamFormat>,
166                            AnyValueType::VECTOR_UINT32);
167     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H264_PROFILE, Plugins::VideoH264Profile,
168                            AnyValueType::INT32_T);
169     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ROTATION, Plugins::VideoRotation, AnyValueType::INT32_T);
170     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ORIENTATION_TYPE, Plugins::VideoOrientationType,
171                            AnyValueType::INT32_T);
172     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_PRIMARIES, Plugins::ColorPrimary,
173                            AnyValueType::INT32_T);
174     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_TRC, Plugins::TransferCharacteristic,
175                            AnyValueType::INT32_T);
176     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_MATRIX_COEFF, Plugins::MatrixCoefficient,
177                            AnyValueType::INT32_T);
178     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODE_BITRATE_MODE,
179         Plugins::VideoEncodeBitrateMode, AnyValueType::INT32_T);
180     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_COLOR_RANGE or
181         tagCharSeq == Tag::VIDEO_REQUEST_I_FRAME or
182         tagCharSeq == Tag::VIDEO_IS_HDR_VIVID or
183         tagCharSeq == Tag::MEDIA_HAS_VIDEO or
184         tagCharSeq == Tag::MEDIA_HAS_AUDIO or
185         tagCharSeq == Tag::MEDIA_HAS_SUBTITLE or
186         tagCharSeq == Tag::MEDIA_HAS_TIMEDMETA or
187         tagCharSeq == Tag::MEDIA_END_OF_STREAM or
188         tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR or
189         tagCharSeq == Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE or
190         tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY or
191         tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK or
192         tagCharSeq == Tag::VIDEO_PER_FRAME_IS_LTR or
193         tagCharSeq == Tag::VIDEO_PER_FRAME_IS_SKIP or
194         tagCharSeq == Tag::VIDEO_ENABLE_LOW_LATENCY or
195         tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK or
196         tagCharSeq == Tag::SCREEN_CAPTURE_USER_AGREE or
197         tagCharSeq == Tag::SCREEN_CAPTURE_REQURE_MIC or
198         tagCharSeq == Tag::SCREEN_CAPTURE_ENABLE_MIC or
199         tagCharSeq == Tag::AV_PLAYER_IS_DRM_PROTECTED or
200         tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TIME_OUT or
201         tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_DISCARD or
202         tagCharSeq == Tag::VIDEO_ENCODER_ENABLE_WATERMARK, bool, AnyValueType::BOOL);
203     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_BUFFER_CAN_DROP, bool, AnyValueType::BOOL);
204     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::AUDIO_RENDER_SET_FLAG, bool, AnyValueType::BOOL);
205     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_PROFILE, Plugins::HEVCProfile, AnyValueType::INT32_T);
206     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_H265_LEVEL, Plugins::HEVCLevel, AnyValueType::INT32_T);
207 
208     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_CHROMA_LOCATION,
209         Plugins::ChromaLocation, AnyValueType::INT32_T);
210     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE,
211                            Plugins::TemporalGopReferenceMode, AnyValueType::INT32_T);
212     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::APP_UID or
213         tagCharSeq == Tag::APP_PID or
214         tagCharSeq == Tag::APP_TOKEN_ID or
215         tagCharSeq == Tag::REQUIRED_IN_BUFFER_CNT or
216         tagCharSeq == Tag::REQUIRED_IN_BUFFER_SIZE or
217         tagCharSeq == Tag::REQUIRED_OUT_BUFFER_CNT or
218         tagCharSeq == Tag::REQUIRED_OUT_BUFFER_SIZE or
219         tagCharSeq == Tag::BUFFERING_SIZE or
220         tagCharSeq == Tag::WATERLINE_HIGH or
221         tagCharSeq == Tag::WATERLINE_LOW or
222         tagCharSeq == Tag::AUDIO_CHANNEL_COUNT or
223         tagCharSeq == Tag::AUDIO_SAMPLE_RATE or
224         tagCharSeq == Tag::AUDIO_SAMPLE_PER_FRAME or
225         tagCharSeq == Tag::AUDIO_OUTPUT_CHANNELS or
226         tagCharSeq == Tag::AUDIO_MPEG_VERSION or
227         tagCharSeq == Tag::AUDIO_MPEG_LAYER or
228         tagCharSeq == Tag::AUDIO_AAC_LEVEL or
229         tagCharSeq == Tag::AUDIO_MAX_INPUT_SIZE or
230         tagCharSeq == Tag::AUDIO_MAX_OUTPUT_SIZE or
231         tagCharSeq == Tag::AUDIO_SOUNDBED_CHANNELS_NUMBER or
232         tagCharSeq == Tag::AUDIO_HOA_ORDER or
233         tagCharSeq == Tag::VIDEO_WIDTH or
234         tagCharSeq == Tag::VIDEO_HEIGHT or
235         tagCharSeq == Tag::VIDEO_DELAY or
236         tagCharSeq == Tag::VIDEO_MAX_SURFACE_NUM or
237         tagCharSeq == Tag::VIDEO_H264_LEVEL or
238         tagCharSeq == Tag::MEDIA_TRACK_COUNT or
239         tagCharSeq == Tag::AUDIO_AAC_IS_ADTS or
240         tagCharSeq == Tag::AUDIO_COMPRESSION_LEVEL or
241         tagCharSeq == Tag::AUDIO_BITS_PER_CODED_SAMPLE or
242         tagCharSeq == Tag::AUDIO_BITS_PER_RAW_SAMPLE or
243         tagCharSeq == Tag::REGULAR_TRACK_ID or
244         tagCharSeq == Tag::BUFFER_INDEX or
245         tagCharSeq == Tag::VIDEO_SCALE_TYPE or
246         tagCharSeq == Tag::VIDEO_I_FRAME_INTERVAL or
247         tagCharSeq == Tag::MEDIA_PROFILE or
248         tagCharSeq == Tag::VIDEO_ENCODE_QUALITY or
249         tagCharSeq == Tag::AUDIO_AAC_SBR or
250         tagCharSeq == Tag::AUDIO_FLAC_COMPLIANCE_LEVEL or
251         tagCharSeq == Tag::AUDIO_OBJECT_NUMBER or
252         tagCharSeq == Tag::MEDIA_LEVEL or
253         tagCharSeq == Tag::VIDEO_STRIDE or
254         tagCharSeq == Tag::VIDEO_DISPLAY_WIDTH or
255         tagCharSeq == Tag::VIDEO_DISPLAY_HEIGHT or
256         tagCharSeq == Tag::VIDEO_PIC_WIDTH or
257         tagCharSeq == Tag::VIDEO_PIC_HEIGHT or
258         tagCharSeq == Tag::OH_MD_KEY_AUDIO_OBJECT_NUMBER or
259         tagCharSeq == Tag::DRM_ERROR_CODE, int32_t, AnyValueType::INT32_T);
260 
261     DEFINE_INSERT_GET_FUNC(
262         tagCharSeq == Tag::VIDEO_ENCODER_TEMPORAL_GOP_SIZE or
263         tagCharSeq == Tag::VIDEO_ENCODER_LTR_FRAME_COUNT or
264         tagCharSeq == Tag::VIDEO_PER_FRAME_POC or
265         tagCharSeq == Tag::VIDEO_ENCODER_PER_FRAME_USE_LTR or
266         tagCharSeq == Tag::VIDEO_CROP_TOP or
267         tagCharSeq == Tag::VIDEO_CROP_BOTTOM or
268         tagCharSeq == Tag::VIDEO_CROP_LEFT or
269         tagCharSeq == Tag::VIDEO_CROP_RIGHT or
270         tagCharSeq == Tag::VIDEO_SLICE_HEIGHT or
271         tagCharSeq == Tag::VIDEO_ENCODER_QP_MAX or
272         tagCharSeq == Tag::VIDEO_ENCODER_QP_MIN or
273         tagCharSeq == Tag::VIDEO_ENCODER_QP_START or
274         tagCharSeq == Tag::FEATURE_PROPERTY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT or
275         tagCharSeq == Tag::SCREEN_CAPTURE_ERR_CODE or
276         tagCharSeq == Tag::SCREEN_CAPTURE_DURATION or
277         tagCharSeq == Tag::SCREEN_CAPTURE_START_LATENCY or
278         tagCharSeq == Tag::RECORDER_ERR_CODE or
279         tagCharSeq == Tag::RECORDER_DURATION or
280         tagCharSeq == Tag::RECORDER_VIDEO_BITRATE or
281         tagCharSeq == Tag::RECORDER_AUDIO_SAMPLE_RATE or
282         tagCharSeq == Tag::RECORDER_AUDIO_CHANNEL_COUNT or
283         tagCharSeq == Tag::RECORDER_AUDIO_BITRATE or
284         tagCharSeq == Tag::RECORDER_START_LATENCY, int32_t, AnyValueType::INT32_T);
285     DEFINE_INSERT_GET_FUNC(
286         tagCharSeq == Tag::VIDEO_DECODER_RATE_UPPER_LIMIT or
287         tagCharSeq == Tag::VIDEO_ENCODER_FRAME_I_RATIO or
288         tagCharSeq == Tag::VIDEO_ENCODER_FRAME_MADI or
289         tagCharSeq == Tag::VIDEO_ENCODER_FRAME_MADP or
290         tagCharSeq == Tag::VIDEO_ENCODER_SUM_MADI or
291         tagCharSeq == Tag::VIDEO_ENCODER_REAL_BITRATE or
292         tagCharSeq == Tag::VIDEO_ENCODER_FRAME_QP or
293         tagCharSeq == Tag::VIDEO_ENCODER_QP_AVERAGE or
294         tagCharSeq == Tag::VIDEO_ENCODER_FRAME_TEMPORAL_ID or
295         tagCharSeq == Tag::AV_PLAYER_ERR_CODE or
296         tagCharSeq == Tag::AV_PLAYER_PLAY_DURATION or
297         tagCharSeq == Tag::AV_PLAYER_SOURCE_TYPE or
298         tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_RATE or
299         tagCharSeq == Tag::AV_PLAYER_VIDEO_BITRATE or
300         tagCharSeq == Tag::AV_PLAYER_AUDIO_BITRATE or
301         tagCharSeq == Tag::AV_PLAYER_START_LATENCY or
302         tagCharSeq == Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED or
303         tagCharSeq == Tag::AV_PLAYER_MAX_SEEK_LATENCY or
304         tagCharSeq == Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY or
305         tagCharSeq == Tag::AV_PLAYER_LAG_TIMES or
306         tagCharSeq == Tag::AV_PLAYER_MAX_LAG_DURATION or
307         tagCharSeq == Tag::AV_PLAYER_AVG_LAG_DURATION or
308         tagCharSeq == Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, int32_t, AnyValueType::INT32_T);
309     DEFINE_INSERT_GET_FUNC(
310         tagCharSeq == Tag::VIDEO_COORDINATE_X or
311         tagCharSeq == Tag::VIDEO_COORDINATE_Y or
312         tagCharSeq == Tag::VIDEO_COORDINATE_W or
313         tagCharSeq == Tag::VIDEO_COORDINATE_H or
314         tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER or
315         tagCharSeq == Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, int32_t, AnyValueType::INT32_T);
316     DEFINE_INSERT_GET_FUNC(
317         tagCharSeq == Tag::AV_TRANSCODER_ERR_CODE or
318         tagCharSeq == Tag::AV_TRANSCODER_SOURCE_DURATION or
319         tagCharSeq == Tag::AV_TRANSCODER_TRANSCODER_DURATION or
320         tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_BITRATE or
321         tagCharSeq == Tag::AV_TRANSCODER_SRC_HDR_TYPE or
322         tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_SAMPLE_RATE or
323         tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_CHANNEL_COUNT or
324         tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_BITRATE or
325         tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_BITRATE or
326         tagCharSeq == Tag::AV_TRANSCODER_DST_HDR_TYPE or
327         tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_SAMPLE_RATE or
328         tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_CHANNEL_COUNT or
329         tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_BITRATE or
330         tagCharSeq == Tag::AV_TRANSCODER_VIDEO_DECODER_DURATION or
331         tagCharSeq == Tag::AV_TRANSCODER_VIDEO_ENCODER_DURATION or
332         tagCharSeq == Tag::AV_TRANSCODER_VIDEO_VPE_DURATION, int32_t, AnyValueType::INT32_T);
333 
334     DEFINE_INSERT_GET_FUNC(
335         tagCharSeq == Tag::APP_FULL_TOKEN_ID or
336         tagCharSeq == Tag::BUFFER_DECODING_TIMESTAMP or
337         tagCharSeq == Tag::BUFFER_DURATION or
338         tagCharSeq == Tag::MEDIA_DURATION or
339         tagCharSeq == Tag::MEDIA_BITRATE or
340         tagCharSeq == Tag::MEDIA_START_TIME or
341         tagCharSeq == Tag::MEDIA_CONTAINER_START_TIME or
342         tagCharSeq == Tag::USER_FRAME_PTS or
343         tagCharSeq == Tag::USER_PUSH_DATA_TIME or
344         tagCharSeq == Tag::MEDIA_FILE_SIZE or
345         tagCharSeq == Tag::MEDIA_POSITION or
346         tagCharSeq == Tag::MEDIA_TIME_STAMP or
347         tagCharSeq == Tag::VIDEO_DECODER_DESIRED_PRESENT_TIMESTAMP, int64_t, AnyValueType::INT64_T);
348 
349     DEFINE_INSERT_GET_FUNC(
350         tagCharSeq == Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, uint64_t, AnyValueType::UINT64_T);
351 
352     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_LATITUDE or
353         tagCharSeq == Tag::MEDIA_LONGITUDE or
354         tagCharSeq == Tag::AV_PLAYER_VIDEO_FRAMERATE, float, AnyValueType::FLOAT);
355 
356     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::VIDEO_FRAME_RATE or
357         tagCharSeq == Tag::VIDEO_CAPTURE_RATE or
358         tagCharSeq == Tag::VIDEO_SAR or
359         tagCharSeq == Tag::VIDEO_ENCODER_MSE, double, AnyValueType::DOUBLE);
360     DEFINE_INSERT_GET_FUNC(
361         tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_FRAME_RATE or
362         tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_FRAME_RATE, double, AnyValueType::DOUBLE);
363     DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::MEDIA_FILE_TYPE, Plugins::FileType, AnyValueType::INT32_T);
364     DEFINE_INSERT_GET_FUNC(
365         tagCharSeq == Tag::DRM_DECRYPT_AVG_SIZE or
366         tagCharSeq == Tag::DRM_DECRYPT_AVG_DURATION or
367         tagCharSeq == Tag::DRM_DECRYPT_MAX_SIZE or
368         tagCharSeq == Tag::DRM_DECRYPT_MAX_DURATION or
369         tagCharSeq == Tag::DRM_DECRYPT_TIMES, uint32_t, AnyValueType::UINT32_T);
370     DEFINE_INSERT_GET_FUNC(
371         tagCharSeq == Tag::MIME_TYPE or
372         tagCharSeq == Tag::MEDIA_FILE_URI or
373         tagCharSeq == Tag::MEDIA_TITLE or
374         tagCharSeq == Tag::MEDIA_ARTIST or
375         tagCharSeq == Tag::MEDIA_LYRICIST or
376         tagCharSeq == Tag::MEDIA_ALBUM or
377         tagCharSeq == Tag::MEDIA_ALBUM_ARTIST or
378         tagCharSeq == Tag::MEDIA_DATE or
379         tagCharSeq == Tag::MEDIA_COMMENT or
380         tagCharSeq == Tag::MEDIA_GENRE or
381         tagCharSeq == Tag::MEDIA_COPYRIGHT or
382         tagCharSeq == Tag::MEDIA_LANGUAGE or
383         tagCharSeq == Tag::MEDIA_DESCRIPTION or
384         tagCharSeq == Tag::USER_TIME_SYNC_RESULT or
385         tagCharSeq == Tag::USER_AV_SYNC_GROUP_INFO or
386         tagCharSeq == Tag::USER_SHARED_MEMORY_FD or
387         tagCharSeq == Tag::MEDIA_AUTHOR or
388         tagCharSeq == Tag::MEDIA_COMPOSER or
389         tagCharSeq == Tag::MEDIA_LYRICS or
390         tagCharSeq == Tag::MEDIA_CREATION_TIME or
391         tagCharSeq == Tag::MEDIA_CODEC_NAME or
392         tagCharSeq == Tag::PROCESS_NAME or
393         tagCharSeq == Tag::SCREEN_CAPTURE_ERR_MSG or
394         tagCharSeq == Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION or
395         tagCharSeq == Tag::DRM_APP_NAME or
396         tagCharSeq == Tag::DRM_INSTANCE_ID or
397         tagCharSeq == Tag::DRM_ERROR_MESG or
398         tagCharSeq == Tag::RECORDER_ERR_MSG or
399         tagCharSeq == Tag::RECORDER_CONTAINER_MIME or
400         tagCharSeq == Tag::RECORDER_VIDEO_MIME or
401         tagCharSeq == Tag::RECORDER_VIDEO_RESOLUTION or
402         tagCharSeq == Tag::RECORDER_AUDIO_MIME or
403         tagCharSeq == Tag::AV_PLAYER_ERR_MSG or
404         tagCharSeq == Tag::AV_PLAYER_CONTAINER_MIME or
405         tagCharSeq == Tag::AV_PLAYER_VIDEO_MIME or
406         tagCharSeq == Tag::AV_PLAYER_VIDEO_RESOLUTION or
407         tagCharSeq == Tag::AV_PLAYER_AUDIO_MIME, std::string, AnyValueType::STRING);
408     DEFINE_INSERT_GET_FUNC(
409         tagCharSeq == Tag::AV_TRANSCODER_ERR_MSG or
410         tagCharSeq == Tag::AV_TRANSCODER_SRC_FORMAT or
411         tagCharSeq == Tag::AV_TRANSCODER_SRC_AUDIO_MIME or
412         tagCharSeq == Tag::AV_TRANSCODER_SRC_VIDEO_MIME or
413         tagCharSeq == Tag::AV_TRANSCODER_DST_FORMAT or
414         tagCharSeq == Tag::AV_TRANSCODER_DST_AUDIO_MIME or
415         tagCharSeq == Tag::AV_TRANSCODER_DST_VIDEO_MIME, std::string, AnyValueType::STRING);
416     DEFINE_INSERT_GET_FUNC(
417         tagCharSeq == Tag::RECORDER_HDR_TYPE, int8_t, AnyValueType::INT8_T);
418 
419     DEFINE_INSERT_GET_FUNC(
420         tagCharSeq == Tag::SCREEN_CAPTURE_AV_TYPE or
421         tagCharSeq == Tag::SCREEN_CAPTURE_DATA_TYPE or
422         tagCharSeq == Tag::SCREEN_CAPTURE_STOP_REASON, uint8_t, AnyValueType::UINT8_T);
423     DEFINE_INSERT_GET_FUNC(
424         tagCharSeq == Tag::AV_PLAYER_VIDEO_BITDEPTH or
425         tagCharSeq == Tag::AV_PLAYER_HDR_TYPE, int8_t, AnyValueType::INT8_T);
426     DEFINE_INSERT_GET_FUNC(
427         tagCharSeq == Tag::MEDIA_AVAILABLE_BITRATES, std::vector<uint8_t>, AnyValueType::VECTOR_UINT8);
428     DEFINE_INSERT_GET_FUNC(
429         tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK_MIME or
430         tagCharSeq == Tag::TIMED_METADATA_KEY or
431         tagCharSeq == Tag::TIMED_METADATA_LOCALE or
432         tagCharSeq == Tag::TIMED_METADATA_SETUP, std::string, AnyValueType::STRING);
433     DEFINE_INSERT_GET_FUNC(
434         tagCharSeq == Tag::TIMED_METADATA_SRC_TRACK, int32_t, AnyValueType::INT32_T);
435     DEFINE_INSERT_GET_FUNC(
436         tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_COLOR_SPACE, int32_t, AnyValueType::INT32_T);
437     DEFINE_INSERT_GET_FUNC(
438         tagCharSeq == Tag::VIDEO_DECODER_OUTPUT_ENABLE_VRR, int32_t, AnyValueType::INT32_T);
439 
440     Meta &operator=(const Meta &other)
441     {
442         map_ = other.map_;
443         return *this;
444     }
445 
446     Meta &operator=(Meta &&other)
447     {
448         swap(map_, other.map_);
449         return *this;
450     }
451 
Meta()452     Meta() {
453     };
454 
Meta(const Meta & other)455     Meta(const Meta &other)
456     {
457         map_ = other.map_;
458     }
459 
Meta(Meta && other)460     Meta(Meta &&other)
461     {
462         swap(map_, other.map_);
463     }
464 
465     Any& operator[](const TagType& tag)
466     {
467         return map_[tag];
468     }
469 
470     Any& operator[](TagTypeCharSeq tag)
471     {
472         return map_[tag];
473     }
474 
begin()475     MapIt begin() const // to support for (auto e : Meta), must use begin/end name
476     {
477         return map_.cbegin();
478     }
479 
end()480     MapIt end() const
481     {
482         return map_.cend();
483     }
484 
Clear()485     void Clear()
486     {
487         map_.clear();
488     }
489 
Find(TagType tag)490     MapIt Find(TagType tag) const
491     {
492         return map_.find(tag);
493     }
494 
Find(TagTypeCharSeq tag)495     MapIt Find(TagTypeCharSeq tag) const
496     {
497         return map_.find(tag);
498     }
499 
Empty()500     bool Empty() const
501     {
502         return map_.empty();
503     }
504 
505     template <typename T>
SetData(const TagType & tag,const T & value)506     void SetData(const TagType& tag, const T& value)
507     {
508         map_[tag] = value;
509     }
510 
511     template <typename T>
SetData(TagTypeCharSeq tag,const T & value)512     void SetData(TagTypeCharSeq tag, const T& value)
513     {
514         if (tag == nullptr) {
515             return;
516         }
517         map_[tag] = value;
518     }
519 
520     template <int N>
SetData(const TagType & tag,char const (& value)[N])521     void SetData(const TagType &tag, char const (&value)[N])
522     {
523         std::string strValue = value;
524         map_[tag] = std::move(strValue);
525     }
526 
527     template <int N>
SetData(TagTypeCharSeq tag,char const (& value)[N])528     void SetData(TagTypeCharSeq tag, char const (&value)[N])
529     {
530         if (tag == nullptr) {
531             return;
532         }
533         std::string strValue = value;
534         map_[tag] = std::move(strValue);
535     }
536 
537     template <typename T>
GetData(const TagType & tag,T & value)538     bool GetData(const TagType& tag, T &value) const
539     {
540         auto iter = map_.find(tag);
541         if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) {
542             return false;
543         }
544         value = AnyCast<T>(iter->second);
545         return true;
546     }
547 
548     template <typename T>
GetData(TagTypeCharSeq tag,T & value)549     bool GetData(TagTypeCharSeq tag, T &value) const
550     {
551         auto iter = map_.find(tag);
552         if (iter == map_.end() || !Any::IsSameTypeWith<T>(iter->second)) {
553             return false;
554         }
555         value = AnyCast<T>(iter->second);
556         return true;
557     }
558 
Remove(const TagType & tag)559     void Remove(const TagType& tag)
560     {
561         auto iter = map_.find(tag);
562         if (iter != map_.end()) {
563             map_.erase(iter);
564         }
565     }
566 
Remove(TagTypeCharSeq tag)567     void Remove(TagTypeCharSeq tag)
568     {
569         auto iter = map_.find(tag);
570         if (iter != map_.end()) {
571             map_.erase(iter);
572         }
573     }
574 
GetKeys(std::vector<TagType> & keys)575     void GetKeys(std::vector<TagType>& keys) const
576     {
577         int cnt = 0;
578         keys.resize(map_.size());
579         for (const auto& tmp : map_) {
580             keys[cnt++] = tmp.first;
581         }
582     }
583 
584     bool IsDefinedKey(const TagType &tag) const;
585     AnyValueType GetValueType(const TagType& key) const;
586     bool ToParcel(MessageParcel &parcel) const;
587     bool FromParcel(MessageParcel &parcel);
588 
589 private:
590     std::map<TagType, Any> map_;
591 };
592 
593 /**
594  * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/bool/int32_t value into Meta Object.
595  * @implNote In order to set value(int32_t type) to Meta Object, should convert int32_t value to correct EnumType then
596  * save to Any object. We use metadataGetterSetterMap to get the right setter function.
597  * @return Returns operator status, <b>True</b> if Set Success.
598  * returns <b>False</b> otherwise.
599  * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value);
600  */
601 bool SetMetaData(Meta& meta, const TagType& tag, int32_t value);
602 
603 /**
604  * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/bool/int32_t value from Meta Object.
605  * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any
606  * object. We use metadataGetterSetterMap to get the right getter function.
607  * @return Returns operator status, <b>True</b> if Get Success.
608  * returns <b>False</b> otherwise.
609  * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value);
610  */
611 bool GetMetaData(const Meta& meta, const TagType& tag, int32_t& value);
612 /**
613  * @brief SetMetaData only used for Application interface OH_AVFormat to set enum/int64_t value into Meta Object.
614  * @implNote In order to set value(int64_t type) to Meta Object, should convert int64_t value to correct EnumType then
615  * save to Any object. We use metadataGetterSetterMap to get the right setter function.
616  * @return Returns operator status, <b>True</b> if Set Success.
617  * returns <b>False</b> otherwise.
618  * @example OHOS::Media::SetMetaData(meta, "audio.aac.profile", value);
619  */
620 bool SetMetaData(Meta& meta, const TagType& tag, int64_t value);
621 
622 /**
623  * @brief GetMetaData only used for Application interface OH_AVFormat to get enum/int64_t value from Meta Object.
624  * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any
625  * object. We use metadataGetterSetterMap to get the right getter function.
626  * @return Returns operator status, <b>True</b> if Get Success.
627  * returns <b>False</b> otherwise.
628  * @example OHOS::Media::GetMetaData(meta, "audio.aac.profile", value);
629  */
630 bool GetMetaData(const Meta& meta, const TagType& tag, int64_t& value);
631 
632 /**
633  * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int32_t or not.
634  * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any
635  * object. We use metadataGetterSetterMap to get the value type.
636  * @return Returns operator status, <b>True</b> if the key's value type is int32_t.
637  * returns <b>False</b> otherwise.
638  * @example OHOS::Media::IsIntEnum("audio.aac.profile");
639  */
640 bool IsIntEnum(const TagType& tag);
641 
642 /**
643  * @brief IsIntEnum only used for Application interface OH_AVFormat to judge key's value type is int64_t or not.
644  * @implNote In order to get value(Enum type) from Meta Object, should use correct Enum type to get value from Any
645  * object. We use metadataGetterSetterMap to get the value type.
646  * @return Returns operator status, <b>True</b> if the key's value type is int64_t.
647  * returns <b>False</b> otherwise.
648  * @example OHOS::Media::IsIntEnum("audio.aac.profile");
649  */
650 bool IsLongEnum(const TagType& tag);
651 } // namespace Media
652 } // namespace OHOS
653 #endif // MEDIA_FOUNDATION_META_H