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