1fa7767c5Sopenharmony_ci/*
2fa7767c5Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License.
5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at
6fa7767c5Sopenharmony_ci *
7fa7767c5Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fa7767c5Sopenharmony_ci *
9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and
13fa7767c5Sopenharmony_ci * limitations under the License.
14fa7767c5Sopenharmony_ci */
15fa7767c5Sopenharmony_ci
16fa7767c5Sopenharmony_ci#include "meta/meta.h"
17fa7767c5Sopenharmony_ci#include <functional>
18fa7767c5Sopenharmony_ci#include "common/log.h"
19fa7767c5Sopenharmony_ci#include "meta.h"
20fa7767c5Sopenharmony_ci
21fa7767c5Sopenharmony_ci/**
22fa7767c5Sopenharmony_ci * Steps of Adding New Tag
23fa7767c5Sopenharmony_ci *
24fa7767c5Sopenharmony_ci * 1. In meta_key.h, Add a Tag.
25fa7767c5Sopenharmony_ci * 2. In meta.h, Register Tag key Value mapping.
26fa7767c5Sopenharmony_ci *    Example: DEFINE_INSERT_GET_FUNC(tagCharSeq == Tag::TAGNAME, TAGTYPE, AnyValueType::VALUETYPE)
27fa7767c5Sopenharmony_ci * 3. In meta.cpp, Register default value to g_metadataDefaultValueMap ({Tag::TAGNAME, defaultTAGTYPE}).
28fa7767c5Sopenharmony_ci * 4. In order to support Enum/Bool Value Getter Setter from AVFormat,
29fa7767c5Sopenharmony_ci *    In meta.cpp, Register Tag key getter setter function mapping.
30fa7767c5Sopenharmony_ci *    Example: DEFINE_METADATA_SETTER_GETTER_FUNC(SrcTAGNAME, int32_t/int64_t)
31fa7767c5Sopenharmony_ci *    For Int32/Int64 Type, update g_metadataGetterSetterMap/g_metadataGetterSetterInt64Map.
32fa7767c5Sopenharmony_ci *    For Bool Type, update g_metadataBoolVector.
33fa7767c5Sopenharmony_ci * 5. Update meta_func_unit_test.cpp to add the testcase of new added Tag Type.
34fa7767c5Sopenharmony_ci *
35fa7767c5Sopenharmony_ci * Theory:
36fa7767c5Sopenharmony_ci * App --> AVFormat(ndk) --> Meta --> Parcel(ipc) --> Meta
37fa7767c5Sopenharmony_ci * AVFormat only support: int, int64(Long), float, double, string, buffer
38fa7767c5Sopenharmony_ci * Parcel only support: bool, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double, pointer, buffer
39fa7767c5Sopenharmony_ci * Meta (based on any) support : all types in theory.
40fa7767c5Sopenharmony_ci *
41fa7767c5Sopenharmony_ci * Attention: Use AVFormat with Meta, with or without ipc, be care of the difference of supported types.
42fa7767c5Sopenharmony_ci * Currently, The ToParcel/FromParcel function(In Any.h) supports single value convert to/from parcel.
43fa7767c5Sopenharmony_ci * you can use meta's helper functions to handle the key and the correct value type:
44fa7767c5Sopenharmony_ci *    GetDefaultAnyValue: get the specified key's default value, It can get the value type.
45fa7767c5Sopenharmony_ci *    SetMetaData/GetMetaData: AVFormat use them to set/get enum/bool/int values,
46fa7767c5Sopenharmony_ci *    It can convert the integer to/from enum/bool automatically.
47fa7767c5Sopenharmony_ci **/
48fa7767c5Sopenharmony_ci
49fa7767c5Sopenharmony_cinamespace {
50fa7767c5Sopenharmony_ciconstexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "Meta" };
51fa7767c5Sopenharmony_ci}
52fa7767c5Sopenharmony_ci
53fa7767c5Sopenharmony_cinamespace OHOS {
54fa7767c5Sopenharmony_cinamespace Media {
55fa7767c5Sopenharmony_ciusing namespace Plugins;
56fa7767c5Sopenharmony_ci
57fa7767c5Sopenharmony_ci#define DEFINE_METADATA_SETTER_GETTER_FUNC(EnumTypeName, ExtTypeName)                       \
58fa7767c5Sopenharmony_cistatic bool Set##EnumTypeName(Meta& meta, const TagType& tag, ExtTypeName& value)           \
59fa7767c5Sopenharmony_ci{                                                                                           \
60fa7767c5Sopenharmony_ci    if (__is_enum(EnumTypeName)) {                                                          \
61fa7767c5Sopenharmony_ci        meta.SetData(tag, EnumTypeName(value));                                             \
62fa7767c5Sopenharmony_ci    } else {                                                                                \
63fa7767c5Sopenharmony_ci        meta.SetData(tag, value);                                                           \
64fa7767c5Sopenharmony_ci    }                                                                                       \
65fa7767c5Sopenharmony_ci    return true;                                                                            \
66fa7767c5Sopenharmony_ci}                                                                                           \
67fa7767c5Sopenharmony_ci                                                                                            \
68fa7767c5Sopenharmony_cistatic bool Get##EnumTypeName(const Meta& meta, const TagType& tag, ExtTypeName& value)     \
69fa7767c5Sopenharmony_ci{                                                                                           \
70fa7767c5Sopenharmony_ci    EnumTypeName tmpValue;                                                                  \
71fa7767c5Sopenharmony_ci    if (meta.GetData(tag, tmpValue)) {                                                      \
72fa7767c5Sopenharmony_ci        value = static_cast<ExtTypeName>(tmpValue);                                         \
73fa7767c5Sopenharmony_ci        return true;                                                                        \
74fa7767c5Sopenharmony_ci    }                                                                                       \
75fa7767c5Sopenharmony_ci    return false;                                                                           \
76fa7767c5Sopenharmony_ci}
77fa7767c5Sopenharmony_ci
78fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(SrcInputType, int32_t)
79fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(AudioSampleFormat, int32_t)
80fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(VideoPixelFormat, int32_t)
81fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(MediaType, int32_t)
82fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(VideoH264Profile, int32_t)
83fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(VideoRotation, int32_t)
84fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(VideoOrientationType, int32_t)
85fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(ColorPrimary, int32_t)
86fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(TransferCharacteristic, int32_t)
87fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(MatrixCoefficient, int32_t)
88fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(HEVCProfile, int32_t)
89fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(HEVCLevel, int32_t)
90fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(ChromaLocation, int32_t)
91fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(FileType, int32_t)
92fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(VideoEncodeBitrateMode, int32_t)
93fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(TemporalGopReferenceMode, int32_t)
94fa7767c5Sopenharmony_ci
95fa7767c5Sopenharmony_ciDEFINE_METADATA_SETTER_GETTER_FUNC(AudioChannelLayout, int64_t)
96fa7767c5Sopenharmony_ci
97fa7767c5Sopenharmony_ci#define  DEFINE_METADATA_SETTER_GETTER(tag, EnumType) {tag, std::make_pair(Set##EnumType, Get##EnumType)}
98fa7767c5Sopenharmony_ci
99fa7767c5Sopenharmony_ciusing  MetaSetterFunction = std::function<bool(Meta&, const TagType&, int32_t&)>;
100fa7767c5Sopenharmony_ciusing  MetaGetterFunction = std::function<bool(const Meta&, const TagType&, int32_t&)>;
101fa7767c5Sopenharmony_ci
102fa7767c5Sopenharmony_cistatic std::map<TagType, std::pair<MetaSetterFunction, MetaGetterFunction>> g_metadataGetterSetterMap = {
103fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::SRC_INPUT_TYPE, SrcInputType),
104fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::AUDIO_SAMPLE_FORMAT, AudioSampleFormat),
105fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_PIXEL_FORMAT, VideoPixelFormat),
106fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::MEDIA_TYPE, MediaType),
107fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_H264_PROFILE, VideoH264Profile),
108fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_ROTATION, VideoRotation),
109fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_ORIENTATION_TYPE, VideoOrientationType),
110fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_COLOR_PRIMARIES, ColorPrimary),
111fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_COLOR_TRC, TransferCharacteristic),
112fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_COLOR_MATRIX_COEFF, MatrixCoefficient),
113fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_H265_PROFILE, HEVCProfile),
114fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_H265_LEVEL, HEVCLevel),
115fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_CHROMA_LOCATION, ChromaLocation),
116fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::MEDIA_FILE_TYPE, FileType),
117fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_ENCODE_BITRATE_MODE, VideoEncodeBitrateMode),
118fa7767c5Sopenharmony_ci    DEFINE_METADATA_SETTER_GETTER(Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, TemporalGopReferenceMode),
119fa7767c5Sopenharmony_ci};
120fa7767c5Sopenharmony_ci
121fa7767c5Sopenharmony_ciusing  MetaSetterInt64Function = std::function<bool(Meta&, const TagType&, int64_t&)>;
122fa7767c5Sopenharmony_ciusing  MetaGetterInt64Function = std::function<bool(const Meta&, const TagType&, int64_t&)>;
123fa7767c5Sopenharmony_cistatic std::map<TagType, std::pair<MetaSetterInt64Function, MetaGetterInt64Function>> g_metadataGetterSetterInt64Map = {
124fa7767c5Sopenharmony_ci        DEFINE_METADATA_SETTER_GETTER(Tag::AUDIO_CHANNEL_LAYOUT, AudioChannelLayout),
125fa7767c5Sopenharmony_ci        DEFINE_METADATA_SETTER_GETTER(Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, AudioChannelLayout)
126fa7767c5Sopenharmony_ci};
127fa7767c5Sopenharmony_ci
128fa7767c5Sopenharmony_cistatic std::vector<TagType> g_metadataBoolVector = {
129fa7767c5Sopenharmony_ci    Tag::VIDEO_COLOR_RANGE,
130fa7767c5Sopenharmony_ci    Tag::VIDEO_REQUEST_I_FRAME,
131fa7767c5Sopenharmony_ci    Tag::VIDEO_IS_HDR_VIVID,
132fa7767c5Sopenharmony_ci    Tag::MEDIA_HAS_VIDEO,
133fa7767c5Sopenharmony_ci    Tag::MEDIA_HAS_AUDIO,
134fa7767c5Sopenharmony_ci    Tag::MEDIA_HAS_SUBTITLE,
135fa7767c5Sopenharmony_ci    Tag::MEDIA_HAS_TIMEDMETA,
136fa7767c5Sopenharmony_ci    Tag::MEDIA_END_OF_STREAM,
137fa7767c5Sopenharmony_ci    Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE,
138fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY,
139fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR,
140fa7767c5Sopenharmony_ci    Tag::VIDEO_PER_FRAME_IS_LTR,
141fa7767c5Sopenharmony_ci    Tag::VIDEO_PER_FRAME_IS_SKIP,
142fa7767c5Sopenharmony_ci    Tag::VIDEO_ENABLE_LOW_LATENCY,
143fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK,
144fa7767c5Sopenharmony_ci    Tag::VIDEO_BUFFER_CAN_DROP,
145fa7767c5Sopenharmony_ci    Tag::AUDIO_RENDER_SET_FLAG,
146fa7767c5Sopenharmony_ci    Tag::SCREEN_CAPTURE_USER_AGREE,
147fa7767c5Sopenharmony_ci    Tag::SCREEN_CAPTURE_REQURE_MIC,
148fa7767c5Sopenharmony_ci    Tag::SCREEN_CAPTURE_ENABLE_MIC,
149fa7767c5Sopenharmony_ci    Tag::AV_PLAYER_IS_DRM_PROTECTED,
150fa7767c5Sopenharmony_ci    Tag::AV_PLAYER_DOWNLOAD_TIME_OUT,
151fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_PER_FRAME_DISCARD,
152fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_ENABLE_WATERMARK,
153fa7767c5Sopenharmony_ci    Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK
154fa7767c5Sopenharmony_ci};
155fa7767c5Sopenharmony_ci
156fa7767c5Sopenharmony_cibool SetMetaData(Meta& meta, const TagType& tag, int32_t value)
157fa7767c5Sopenharmony_ci{
158fa7767c5Sopenharmony_ci    auto iter = g_metadataGetterSetterMap.find(tag);
159fa7767c5Sopenharmony_ci    if (iter == g_metadataGetterSetterMap.end()) {
160fa7767c5Sopenharmony_ci        if (std::find(g_metadataBoolVector.begin(), g_metadataBoolVector.end(), tag) != g_metadataBoolVector.end()) {
161fa7767c5Sopenharmony_ci            meta.SetData(tag, value != 0 ? true : false);
162fa7767c5Sopenharmony_ci            return true;
163fa7767c5Sopenharmony_ci        }
164fa7767c5Sopenharmony_ci        meta.SetData(tag, value);
165fa7767c5Sopenharmony_ci        return true;
166fa7767c5Sopenharmony_ci    }
167fa7767c5Sopenharmony_ci    return iter->second.first(meta, tag, value);
168fa7767c5Sopenharmony_ci}
169fa7767c5Sopenharmony_ci
170fa7767c5Sopenharmony_cibool GetMetaData(const Meta& meta, const TagType& tag, int32_t& value)
171fa7767c5Sopenharmony_ci{
172fa7767c5Sopenharmony_ci    auto iter = g_metadataGetterSetterMap.find(tag);
173fa7767c5Sopenharmony_ci    if (iter == g_metadataGetterSetterMap.end()) {
174fa7767c5Sopenharmony_ci        if (std::find(g_metadataBoolVector.begin(), g_metadataBoolVector.end(), tag) != g_metadataBoolVector.end()) {
175fa7767c5Sopenharmony_ci            bool valueBool = false;
176fa7767c5Sopenharmony_ci            FALSE_RETURN_V(meta.GetData(tag, valueBool), false);
177fa7767c5Sopenharmony_ci            value = valueBool ? 1 : 0;
178fa7767c5Sopenharmony_ci            return true;
179fa7767c5Sopenharmony_ci        }
180fa7767c5Sopenharmony_ci        return meta.GetData(tag, value);
181fa7767c5Sopenharmony_ci    }
182fa7767c5Sopenharmony_ci    return iter->second.second(meta, tag, value);
183fa7767c5Sopenharmony_ci}
184fa7767c5Sopenharmony_ci
185fa7767c5Sopenharmony_cibool SetMetaData(Meta& meta, const TagType& tag, int64_t value)
186fa7767c5Sopenharmony_ci{
187fa7767c5Sopenharmony_ci    auto iter = g_metadataGetterSetterInt64Map.find(tag);
188fa7767c5Sopenharmony_ci    if (iter == g_metadataGetterSetterInt64Map.end()) {
189fa7767c5Sopenharmony_ci        meta.SetData(tag, value);
190fa7767c5Sopenharmony_ci        return true;
191fa7767c5Sopenharmony_ci    }
192fa7767c5Sopenharmony_ci    return iter->second.first(meta, tag, value);
193fa7767c5Sopenharmony_ci}
194fa7767c5Sopenharmony_ci
195fa7767c5Sopenharmony_cibool GetMetaData(const Meta& meta, const TagType& tag, int64_t& value)
196fa7767c5Sopenharmony_ci{
197fa7767c5Sopenharmony_ci    auto iter = g_metadataGetterSetterInt64Map.find(tag);
198fa7767c5Sopenharmony_ci    if (iter == g_metadataGetterSetterInt64Map.end()) {
199fa7767c5Sopenharmony_ci        return meta.GetData(tag, value);
200fa7767c5Sopenharmony_ci    }
201fa7767c5Sopenharmony_ci    return iter->second.second(meta, tag, value);
202fa7767c5Sopenharmony_ci}
203fa7767c5Sopenharmony_ci
204fa7767c5Sopenharmony_cibool IsIntEnum(const TagType &tag)
205fa7767c5Sopenharmony_ci{
206fa7767c5Sopenharmony_ci    return (g_metadataGetterSetterMap.find(tag) != g_metadataGetterSetterMap.end());
207fa7767c5Sopenharmony_ci}
208fa7767c5Sopenharmony_ci
209fa7767c5Sopenharmony_cibool IsLongEnum(const TagType &tag)
210fa7767c5Sopenharmony_ci{
211fa7767c5Sopenharmony_ci    return g_metadataGetterSetterInt64Map.find(tag) != g_metadataGetterSetterInt64Map.end();
212fa7767c5Sopenharmony_ci}
213fa7767c5Sopenharmony_ci
214fa7767c5Sopenharmony_cistatic Any defaultString = std::string();
215fa7767c5Sopenharmony_cistatic Any defaultInt8 = (int8_t)0;
216fa7767c5Sopenharmony_cistatic Any defaultUInt8 = (uint8_t)0;
217fa7767c5Sopenharmony_cistatic Any defaultInt32 = (int32_t)0;
218fa7767c5Sopenharmony_cistatic Any defaultUInt32 = (uint32_t)0;
219fa7767c5Sopenharmony_cistatic Any defaultInt64 = (int64_t)0;
220fa7767c5Sopenharmony_cistatic Any defaultUInt64 = (uint64_t)0;
221fa7767c5Sopenharmony_cistatic Any defaultFloat = 0.0f;
222fa7767c5Sopenharmony_cistatic Any defaultDouble = (double)0.0;
223fa7767c5Sopenharmony_cistatic Any defaultBool = (bool) false;
224fa7767c5Sopenharmony_cistatic Any defaultSrcInputType = SrcInputType::UNKNOWN;
225fa7767c5Sopenharmony_cistatic Any defaultAudioSampleFormat = AudioSampleFormat::INVALID_WIDTH;
226fa7767c5Sopenharmony_cistatic Any defaultVideoPixelFormat = VideoPixelFormat::UNKNOWN;
227fa7767c5Sopenharmony_cistatic Any defaultMediaType = MediaType::UNKNOWN;
228fa7767c5Sopenharmony_cistatic Any defaultVideoH264Profile = VideoH264Profile::UNKNOWN;
229fa7767c5Sopenharmony_cistatic Any defaultVideoRotation = VideoRotation::VIDEO_ROTATION_0;
230fa7767c5Sopenharmony_cistatic Any defaultVideoOrientationType = VideoOrientationType::ROTATE_NONE;
231fa7767c5Sopenharmony_cistatic Any defaultColorPrimary = ColorPrimary::BT2020;
232fa7767c5Sopenharmony_cistatic Any defaultTransferCharacteristic = TransferCharacteristic::BT1361;
233fa7767c5Sopenharmony_cistatic Any defaultMatrixCoefficient = MatrixCoefficient::BT2020_CL;
234fa7767c5Sopenharmony_cistatic Any defaultHEVCProfile = HEVCProfile::HEVC_PROFILE_UNKNOW;
235fa7767c5Sopenharmony_cistatic Any defaultHEVCLevel = HEVCLevel::HEVC_LEVEL_UNKNOW;
236fa7767c5Sopenharmony_cistatic Any defaultChromaLocation = ChromaLocation::BOTTOM;
237fa7767c5Sopenharmony_cistatic Any defaultFileType = FileType::UNKNOW;
238fa7767c5Sopenharmony_cistatic Any defaultVideoEncodeBitrateMode = VideoEncodeBitrateMode::CBR;
239fa7767c5Sopenharmony_cistatic Any defaultTemporalGopReferenceMode = TemporalGopReferenceMode::ADJACENT_REFERENCE;
240fa7767c5Sopenharmony_ci
241fa7767c5Sopenharmony_cistatic Any defaultAudioChannelLayout = AudioChannelLayout::UNKNOWN;
242fa7767c5Sopenharmony_cistatic Any defaultAudioAacProfile = AudioAacProfile::ELD;
243fa7767c5Sopenharmony_cistatic Any defaultAudioAacStreamFormat = AudioAacStreamFormat::ADIF;
244fa7767c5Sopenharmony_cistatic Any defaultVectorUInt8 = std::vector<uint8_t>();
245fa7767c5Sopenharmony_cistatic Any defaultVectorUInt32 = std::vector<uint32_t>();
246fa7767c5Sopenharmony_cistatic Any defaultVectorVideoBitStreamFormat = std::vector<VideoBitStreamFormat>();
247fa7767c5Sopenharmony_cistatic std::map<TagType, const Any &> g_metadataDefaultValueMap = {
248fa7767c5Sopenharmony_ci    {Tag::SRC_INPUT_TYPE, defaultSrcInputType},
249fa7767c5Sopenharmony_ci    {Tag::AUDIO_SAMPLE_FORMAT, defaultAudioSampleFormat},
250fa7767c5Sopenharmony_ci    {Tag::VIDEO_PIXEL_FORMAT, defaultVideoPixelFormat},
251fa7767c5Sopenharmony_ci    {Tag::MEDIA_TYPE, defaultMediaType},
252fa7767c5Sopenharmony_ci    {Tag::VIDEO_H264_PROFILE, defaultVideoH264Profile},
253fa7767c5Sopenharmony_ci    {Tag::VIDEO_ROTATION, defaultVideoRotation},
254fa7767c5Sopenharmony_ci    {Tag::VIDEO_ORIENTATION_TYPE, defaultVideoOrientationType},
255fa7767c5Sopenharmony_ci    {Tag::VIDEO_COLOR_PRIMARIES, defaultColorPrimary},
256fa7767c5Sopenharmony_ci    {Tag::VIDEO_COLOR_TRC, defaultTransferCharacteristic},
257fa7767c5Sopenharmony_ci    {Tag::VIDEO_COLOR_MATRIX_COEFF, defaultMatrixCoefficient},
258fa7767c5Sopenharmony_ci    {Tag::VIDEO_H265_PROFILE, defaultHEVCProfile},
259fa7767c5Sopenharmony_ci    {Tag::VIDEO_H265_LEVEL, defaultHEVCLevel},
260fa7767c5Sopenharmony_ci    {Tag::VIDEO_CHROMA_LOCATION, defaultChromaLocation},
261fa7767c5Sopenharmony_ci    {Tag::MEDIA_FILE_TYPE, defaultFileType},
262fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODE_BITRATE_MODE, defaultVideoEncodeBitrateMode},
263fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, defaultTemporalGopReferenceMode},
264fa7767c5Sopenharmony_ci    // Int8
265fa7767c5Sopenharmony_ci    {Tag::RECORDER_HDR_TYPE, defaultInt8},
266fa7767c5Sopenharmony_ci    // Uint_8
267fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_AV_TYPE, defaultUInt8},
268fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_DATA_TYPE, defaultUInt8},
269fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_STOP_REASON, defaultUInt8},
270fa7767c5Sopenharmony_ci    // Int32
271fa7767c5Sopenharmony_ci    {Tag::APP_UID, defaultInt32},
272fa7767c5Sopenharmony_ci    {Tag::APP_PID, defaultInt32},
273fa7767c5Sopenharmony_ci    {Tag::APP_TOKEN_ID, defaultInt32},
274fa7767c5Sopenharmony_ci    {Tag::REQUIRED_IN_BUFFER_CNT, defaultInt32},
275fa7767c5Sopenharmony_ci    {Tag::REQUIRED_IN_BUFFER_SIZE, defaultInt32},
276fa7767c5Sopenharmony_ci    {Tag::REQUIRED_OUT_BUFFER_CNT, defaultInt32},
277fa7767c5Sopenharmony_ci    {Tag::REQUIRED_OUT_BUFFER_SIZE, defaultInt32},
278fa7767c5Sopenharmony_ci    {Tag::BUFFERING_SIZE, defaultInt32},
279fa7767c5Sopenharmony_ci    {Tag::WATERLINE_HIGH, defaultInt32},
280fa7767c5Sopenharmony_ci    {Tag::WATERLINE_LOW, defaultInt32},
281fa7767c5Sopenharmony_ci    {Tag::AUDIO_CHANNEL_COUNT, defaultInt32},
282fa7767c5Sopenharmony_ci    {Tag::AUDIO_SAMPLE_RATE, defaultInt32},
283fa7767c5Sopenharmony_ci    {Tag::AUDIO_SAMPLE_PER_FRAME, defaultInt32},
284fa7767c5Sopenharmony_ci    {Tag::AUDIO_OUTPUT_CHANNELS, defaultInt32},
285fa7767c5Sopenharmony_ci    {Tag::AUDIO_MPEG_VERSION, defaultInt32},
286fa7767c5Sopenharmony_ci    {Tag::AUDIO_MPEG_LAYER, defaultInt32},
287fa7767c5Sopenharmony_ci    {Tag::AUDIO_AAC_LEVEL, defaultInt32},
288fa7767c5Sopenharmony_ci    {Tag::AUDIO_OBJECT_NUMBER, defaultInt32},
289fa7767c5Sopenharmony_ci    {Tag::AUDIO_MAX_INPUT_SIZE, defaultInt32},
290fa7767c5Sopenharmony_ci    {Tag::AUDIO_MAX_OUTPUT_SIZE, defaultInt32},
291fa7767c5Sopenharmony_ci    {Tag::VIDEO_WIDTH, defaultInt32},
292fa7767c5Sopenharmony_ci    {Tag::VIDEO_HEIGHT, defaultInt32},
293fa7767c5Sopenharmony_ci    {Tag::VIDEO_DELAY, defaultInt32},
294fa7767c5Sopenharmony_ci    {Tag::VIDEO_MAX_SURFACE_NUM, defaultInt32},
295fa7767c5Sopenharmony_ci    {Tag::VIDEO_H264_LEVEL, defaultInt32},
296fa7767c5Sopenharmony_ci    {Tag::MEDIA_TRACK_COUNT, defaultInt32},
297fa7767c5Sopenharmony_ci    {Tag::AUDIO_AAC_IS_ADTS, defaultInt32},
298fa7767c5Sopenharmony_ci    {Tag::AUDIO_COMPRESSION_LEVEL, defaultInt32},
299fa7767c5Sopenharmony_ci    {Tag::AUDIO_BITS_PER_CODED_SAMPLE, defaultInt32},
300fa7767c5Sopenharmony_ci    {Tag::AUDIO_BITS_PER_RAW_SAMPLE, defaultInt32},
301fa7767c5Sopenharmony_ci    {Tag::REGULAR_TRACK_ID, defaultInt32},
302fa7767c5Sopenharmony_ci    {Tag::VIDEO_SCALE_TYPE, defaultInt32},
303fa7767c5Sopenharmony_ci    {Tag::VIDEO_I_FRAME_INTERVAL, defaultInt32},
304fa7767c5Sopenharmony_ci    {Tag::MEDIA_PROFILE, defaultInt32},
305fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODE_QUALITY, defaultInt32},
306fa7767c5Sopenharmony_ci    {Tag::AUDIO_AAC_SBR, defaultInt32},
307fa7767c5Sopenharmony_ci    {Tag::AUDIO_FLAC_COMPLIANCE_LEVEL, defaultInt32},
308fa7767c5Sopenharmony_ci    {Tag::MEDIA_LEVEL, defaultInt32},
309fa7767c5Sopenharmony_ci    {Tag::VIDEO_STRIDE, defaultInt32},
310fa7767c5Sopenharmony_ci    {Tag::VIDEO_DISPLAY_WIDTH, defaultInt32},
311fa7767c5Sopenharmony_ci    {Tag::VIDEO_DISPLAY_HEIGHT, defaultInt32},
312fa7767c5Sopenharmony_ci    {Tag::VIDEO_PIC_WIDTH, defaultInt32},
313fa7767c5Sopenharmony_ci    {Tag::VIDEO_PIC_HEIGHT, defaultInt32},
314fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_TEMPORAL_GOP_SIZE, defaultInt32},
315fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_LTR_FRAME_COUNT, defaultInt32},
316fa7767c5Sopenharmony_ci    {Tag::VIDEO_PER_FRAME_POC, defaultInt32},
317fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_PER_FRAME_USE_LTR, defaultInt32},
318fa7767c5Sopenharmony_ci    {Tag::VIDEO_CROP_TOP, defaultInt32},
319fa7767c5Sopenharmony_ci    {Tag::VIDEO_CROP_BOTTOM, defaultInt32},
320fa7767c5Sopenharmony_ci    {Tag::VIDEO_CROP_LEFT, defaultInt32},
321fa7767c5Sopenharmony_ci    {Tag::VIDEO_CROP_RIGHT, defaultInt32},
322fa7767c5Sopenharmony_ci    {Tag::VIDEO_SLICE_HEIGHT, defaultInt32},
323fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_QP_MAX, defaultInt32},
324fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_QP_MIN, defaultInt32},
325fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_QP_START, defaultInt32},
326fa7767c5Sopenharmony_ci    {Tag::FEATURE_PROPERTY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT, defaultInt32},
327fa7767c5Sopenharmony_ci    {Tag::OH_MD_KEY_AUDIO_OBJECT_NUMBER, defaultInt32},
328fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_CALLER_PID, defaultInt32},
329fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_CALLER_UID, defaultInt32},
330fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_FORWARD_CALLER_PID, defaultInt32},
331fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_FORWARD_CALLER_UID, defaultInt32},
332fa7767c5Sopenharmony_ci    {Tag::VIDEO_DECODER_RATE_UPPER_LIMIT, defaultInt32},
333fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_ERR_CODE, defaultInt32},
334fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_DURATION, defaultInt32},
335fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_START_LATENCY, defaultInt32},
336fa7767c5Sopenharmony_ci    {Tag::DRM_ERROR_CODE, defaultInt32},
337fa7767c5Sopenharmony_ci    {Tag::RECORDER_ERR_CODE, defaultInt32},
338fa7767c5Sopenharmony_ci    {Tag::RECORDER_DURATION, defaultInt32},
339fa7767c5Sopenharmony_ci    {Tag::RECORDER_VIDEO_BITRATE, defaultInt32},
340fa7767c5Sopenharmony_ci    {Tag::RECORDER_AUDIO_SAMPLE_RATE, defaultInt32},
341fa7767c5Sopenharmony_ci    {Tag::RECORDER_AUDIO_CHANNEL_COUNT, defaultInt32},
342fa7767c5Sopenharmony_ci    {Tag::RECORDER_AUDIO_BITRATE, defaultInt32},
343fa7767c5Sopenharmony_ci    {Tag::RECORDER_START_LATENCY, defaultInt32},
344fa7767c5Sopenharmony_ci    {Tag::TIMED_METADATA_SRC_TRACK, defaultInt32},
345fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_FRAME_I_RATIO, defaultInt32},
346fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_FRAME_MADI, defaultInt32},
347fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_FRAME_MADP, defaultInt32},
348fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_SUM_MADI, defaultInt32},
349fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_REAL_BITRATE, defaultInt32},
350fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_FRAME_QP, defaultInt32},
351fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_QP_AVERAGE, defaultInt32},
352fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_FRAME_TEMPORAL_ID, defaultInt32},
353fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_ERR_CODE, defaultInt32},
354fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_PLAY_DURATION, defaultInt32},
355fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_SOURCE_TYPE, defaultInt32},
356fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_AVG_DOWNLOAD_RATE, defaultInt32},
357fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_VIDEO_BITRATE, defaultInt32},
358fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_AUDIO_BITRATE, defaultInt32},
359fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_START_LATENCY, defaultInt32},
360fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED, defaultInt32},
361fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_MAX_SEEK_LATENCY, defaultInt32},
362fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY, defaultInt32},
363fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_LAG_TIMES, defaultInt32},
364fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_MAX_LAG_DURATION, defaultInt32},
365fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_AVG_LAG_DURATION, defaultInt32},
366fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, defaultInt32},
367fa7767c5Sopenharmony_ci    {Tag::VIDEO_COORDINATE_X, defaultInt32},
368fa7767c5Sopenharmony_ci    {Tag::VIDEO_COORDINATE_Y, defaultInt32},
369fa7767c5Sopenharmony_ci    {Tag::VIDEO_COORDINATE_W, defaultInt32},
370fa7767c5Sopenharmony_ci    {Tag::VIDEO_COORDINATE_H, defaultInt32},
371fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER, defaultInt32},
372fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, defaultInt32},
373fa7767c5Sopenharmony_ci    {Tag::VIDEO_DECODER_OUTPUT_COLOR_SPACE, defaultInt32},
374fa7767c5Sopenharmony_ci    {Tag::VIDEO_DECODER_ENABLE_VRR, defaultInt32},
375fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_ERR_CODE, defaultInt32},
376fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SOURCE_DURATION, defaultInt32},
377fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_TRANSCODER_DURATION, defaultInt32},
378fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_VIDEO_BITRATE, defaultInt32},
379fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_HDR_TYPE, defaultInt32},
380fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_AUDIO_SAMPLE_RATE, defaultInt32},
381fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_AUDIO_CHANNEL_COUNT, defaultInt32},
382fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_AUDIO_BITRATE, defaultInt32},
383fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_VIDEO_BITRATE, defaultInt32},
384fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_HDR_TYPE, defaultInt32},
385fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_AUDIO_SAMPLE_RATE, defaultInt32},
386fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_AUDIO_CHANNEL_COUNT, defaultInt32},
387fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_AUDIO_BITRATE, defaultInt32},
388fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_VIDEO_DECODER_DURATION, defaultInt32},
389fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_VIDEO_ENCODER_DURATION, defaultInt32},
390fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_VIDEO_VPE_DURATION, defaultInt32},
391fa7767c5Sopenharmony_ci    // String
392fa7767c5Sopenharmony_ci    {Tag::MIME_TYPE, defaultString},
393fa7767c5Sopenharmony_ci    {Tag::MEDIA_FILE_URI, defaultString},
394fa7767c5Sopenharmony_ci    {Tag::MEDIA_TITLE, defaultString},
395fa7767c5Sopenharmony_ci    {Tag::MEDIA_ARTIST, defaultString},
396fa7767c5Sopenharmony_ci    {Tag::MEDIA_LYRICIST, defaultString},
397fa7767c5Sopenharmony_ci    {Tag::MEDIA_ALBUM, defaultString},
398fa7767c5Sopenharmony_ci    {Tag::MEDIA_ALBUM_ARTIST, defaultString},
399fa7767c5Sopenharmony_ci    {Tag::MEDIA_DATE, defaultString},
400fa7767c5Sopenharmony_ci    {Tag::MEDIA_COMMENT, defaultString},
401fa7767c5Sopenharmony_ci    {Tag::MEDIA_GENRE, defaultString},
402fa7767c5Sopenharmony_ci    {Tag::MEDIA_COPYRIGHT, defaultString},
403fa7767c5Sopenharmony_ci    {Tag::MEDIA_LANGUAGE, defaultString},
404fa7767c5Sopenharmony_ci    {Tag::MEDIA_DESCRIPTION, defaultString},
405fa7767c5Sopenharmony_ci    {Tag::USER_TIME_SYNC_RESULT, defaultString},
406fa7767c5Sopenharmony_ci    {Tag::USER_AV_SYNC_GROUP_INFO, defaultString},
407fa7767c5Sopenharmony_ci    {Tag::USER_SHARED_MEMORY_FD, defaultString},
408fa7767c5Sopenharmony_ci    {Tag::MEDIA_AUTHOR, defaultString},
409fa7767c5Sopenharmony_ci    {Tag::MEDIA_COMPOSER, defaultString},
410fa7767c5Sopenharmony_ci    {Tag::MEDIA_LYRICS, defaultString},
411fa7767c5Sopenharmony_ci    {Tag::MEDIA_CODEC_NAME, defaultString},
412fa7767c5Sopenharmony_ci    {Tag::PROCESS_NAME, defaultString},
413fa7767c5Sopenharmony_ci    {Tag::MEDIA_CREATION_TIME, defaultString},
414fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_CALLER_PROCESS_NAME, defaultString},
415fa7767c5Sopenharmony_ci    {Tag::AV_CODEC_FORWARD_CALLER_PROCESS_NAME, defaultString},
416fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_ERR_MSG, defaultString},
417fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION, defaultString},
418fa7767c5Sopenharmony_ci    {Tag::DRM_APP_NAME, defaultString},
419fa7767c5Sopenharmony_ci    {Tag::DRM_INSTANCE_ID, defaultString},
420fa7767c5Sopenharmony_ci    {Tag::DRM_ERROR_MESG, defaultString},
421fa7767c5Sopenharmony_ci    {Tag::TIMED_METADATA_SRC_TRACK_MIME, defaultString},
422fa7767c5Sopenharmony_ci    {Tag::TIMED_METADATA_KEY, defaultString},
423fa7767c5Sopenharmony_ci    {Tag::TIMED_METADATA_LOCALE, defaultString},
424fa7767c5Sopenharmony_ci    {Tag::TIMED_METADATA_SETUP, defaultString},
425fa7767c5Sopenharmony_ci    {Tag::RECORDER_ERR_MSG, defaultString},
426fa7767c5Sopenharmony_ci    {Tag::RECORDER_CONTAINER_MIME, defaultString},
427fa7767c5Sopenharmony_ci    {Tag::RECORDER_VIDEO_MIME, defaultString},
428fa7767c5Sopenharmony_ci    {Tag::RECORDER_VIDEO_RESOLUTION, defaultString},
429fa7767c5Sopenharmony_ci    {Tag::RECORDER_AUDIO_MIME, defaultString},
430fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_ERR_MSG, defaultString},
431fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_CONTAINER_MIME, defaultString},
432fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_VIDEO_MIME, defaultString},
433fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_VIDEO_RESOLUTION, defaultString},
434fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_AUDIO_MIME, defaultString},
435fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_ERR_MSG, defaultString},
436fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_FORMAT, defaultString},
437fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_AUDIO_MIME, defaultString},
438fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_VIDEO_MIME, defaultString},
439fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_FORMAT, defaultString},
440fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_AUDIO_MIME, defaultString},
441fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_VIDEO_MIME, defaultString},
442fa7767c5Sopenharmony_ci    // Float
443fa7767c5Sopenharmony_ci    {Tag::MEDIA_LATITUDE, defaultFloat},
444fa7767c5Sopenharmony_ci    {Tag::MEDIA_LONGITUDE, defaultFloat},
445fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_VIDEO_FRAMERATE, defaultFloat},
446fa7767c5Sopenharmony_ci    // Double
447fa7767c5Sopenharmony_ci    {Tag::VIDEO_CAPTURE_RATE, defaultDouble},
448fa7767c5Sopenharmony_ci    {Tag::VIDEO_FRAME_RATE, defaultDouble},
449fa7767c5Sopenharmony_ci    {Tag::VIDEO_SAR, defaultDouble},
450fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_MSE, defaultDouble},
451fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_SRC_VIDEO_FRAME_RATE, defaultDouble},
452fa7767c5Sopenharmony_ci    {Tag::AV_TRANSCODER_DST_VIDEO_FRAME_RATE, defaultDouble},
453fa7767c5Sopenharmony_ci    // Bool
454fa7767c5Sopenharmony_ci    {Tag::VIDEO_COLOR_RANGE, defaultBool},
455fa7767c5Sopenharmony_ci    {Tag::VIDEO_REQUEST_I_FRAME, defaultBool},
456fa7767c5Sopenharmony_ci    {Tag::VIDEO_IS_HDR_VIVID, defaultBool},
457fa7767c5Sopenharmony_ci    {Tag::MEDIA_HAS_VIDEO, defaultBool},
458fa7767c5Sopenharmony_ci    {Tag::MEDIA_HAS_AUDIO, defaultBool},
459fa7767c5Sopenharmony_ci    {Tag::MEDIA_HAS_SUBTITLE, defaultBool},
460fa7767c5Sopenharmony_ci    {Tag::MEDIA_HAS_TIMEDMETA, defaultBool},
461fa7767c5Sopenharmony_ci    {Tag::MEDIA_END_OF_STREAM, defaultBool},
462fa7767c5Sopenharmony_ci    {Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE, defaultBool},
463fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY, defaultBool},
464fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR, defaultBool},
465fa7767c5Sopenharmony_ci    {Tag::VIDEO_PER_FRAME_IS_LTR, defaultBool},
466fa7767c5Sopenharmony_ci    {Tag::VIDEO_PER_FRAME_IS_SKIP, defaultBool},
467fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENABLE_LOW_LATENCY, defaultBool},
468fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK, defaultBool},
469fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK, defaultBool},
470fa7767c5Sopenharmony_ci    {Tag::VIDEO_BUFFER_CAN_DROP, defaultBool},
471fa7767c5Sopenharmony_ci    {Tag::AUDIO_RENDER_SET_FLAG, defaultBool},
472fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_USER_AGREE, defaultBool},
473fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_REQURE_MIC, defaultBool},
474fa7767c5Sopenharmony_ci    {Tag::SCREEN_CAPTURE_ENABLE_MIC, defaultBool},
475fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_IS_DRM_PROTECTED, defaultBool},
476fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_DOWNLOAD_TIME_OUT, defaultBool},
477fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_PER_FRAME_DISCARD, defaultBool},
478fa7767c5Sopenharmony_ci    {Tag::VIDEO_ENCODER_ENABLE_WATERMARK, defaultBool},
479fa7767c5Sopenharmony_ci    // Int64
480fa7767c5Sopenharmony_ci    {Tag::MEDIA_FILE_SIZE, defaultUInt64},
481fa7767c5Sopenharmony_ci    {Tag::MEDIA_POSITION, defaultUInt64},
482fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, defaultUInt64},
483fa7767c5Sopenharmony_ci    {Tag::APP_FULL_TOKEN_ID, defaultInt64},
484fa7767c5Sopenharmony_ci    {Tag::MEDIA_DURATION, defaultInt64},
485fa7767c5Sopenharmony_ci    {Tag::MEDIA_BITRATE, defaultInt64},
486fa7767c5Sopenharmony_ci    {Tag::MEDIA_START_TIME, defaultInt64},
487fa7767c5Sopenharmony_ci    {Tag::USER_FRAME_PTS, defaultInt64},
488fa7767c5Sopenharmony_ci    {Tag::USER_PUSH_DATA_TIME, defaultInt64},
489fa7767c5Sopenharmony_ci    {Tag::MEDIA_TIME_STAMP, defaultInt64},
490fa7767c5Sopenharmony_ci    {Tag::MEDIA_CONTAINER_START_TIME, defaultInt64},
491fa7767c5Sopenharmony_ci    {Tag::BUFFER_DECODING_TIMESTAMP, defaultInt64},
492fa7767c5Sopenharmony_ci    {Tag::BUFFER_DURATION, defaultInt64},
493fa7767c5Sopenharmony_ci    {Tag::VIDEO_DECODER_DESIRED_PRESENT_TIMESTAMP, defaultInt64},
494fa7767c5Sopenharmony_ci    // AudioChannelLayout UINT64_T
495fa7767c5Sopenharmony_ci    {Tag::AUDIO_CHANNEL_LAYOUT, defaultAudioChannelLayout},
496fa7767c5Sopenharmony_ci    {Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, defaultAudioChannelLayout},
497fa7767c5Sopenharmony_ci    // AudioAacProfile UInt8
498fa7767c5Sopenharmony_ci    {Tag::AUDIO_AAC_PROFILE, defaultAudioAacProfile},
499fa7767c5Sopenharmony_ci    // AudioAacStreamFormat UInt8
500fa7767c5Sopenharmony_ci    {Tag::AUDIO_AAC_STREAM_FORMAT, defaultAudioAacStreamFormat},
501fa7767c5Sopenharmony_ci    // vector<uint8_t>
502fa7767c5Sopenharmony_ci    {Tag::MEDIA_CODEC_CONFIG, defaultVectorUInt8},
503fa7767c5Sopenharmony_ci    {Tag::AUDIO_VIVID_METADATA, defaultVectorUInt8},
504fa7767c5Sopenharmony_ci    {Tag::MEDIA_COVER, defaultVectorUInt8},
505fa7767c5Sopenharmony_ci    {Tag::AUDIO_VORBIS_IDENTIFICATION_HEADER, defaultVectorUInt8},
506fa7767c5Sopenharmony_ci    {Tag::AUDIO_VORBIS_SETUP_HEADER, defaultVectorUInt8},
507fa7767c5Sopenharmony_ci    {Tag::OH_MD_KEY_AUDIO_VIVID_METADATA, defaultVectorUInt8},
508fa7767c5Sopenharmony_ci    // vector<Plugins::VideoBitStreamFormat>
509fa7767c5Sopenharmony_ci    {Tag::VIDEO_BIT_STREAM_FORMAT, defaultVectorVideoBitStreamFormat},
510fa7767c5Sopenharmony_ci    // vector<uint8_t>
511fa7767c5Sopenharmony_ci    {Tag::DRM_CENC_INFO, defaultVectorUInt8},
512fa7767c5Sopenharmony_ci    {Tag::MEDIA_AVAILABLE_BITRATES, defaultVectorUInt8},
513fa7767c5Sopenharmony_ci    // Uint32
514fa7767c5Sopenharmony_ci    {Tag::DRM_DECRYPT_AVG_SIZE, defaultUInt32},
515fa7767c5Sopenharmony_ci    {Tag::DRM_DECRYPT_AVG_DURATION, defaultUInt32},
516fa7767c5Sopenharmony_ci    {Tag::DRM_DECRYPT_MAX_SIZE, defaultUInt32},
517fa7767c5Sopenharmony_ci    {Tag::DRM_DECRYPT_MAX_DURATION, defaultUInt32},
518fa7767c5Sopenharmony_ci    {Tag::DRM_DECRYPT_TIMES, defaultUInt32},
519fa7767c5Sopenharmony_ci    //int8
520fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_VIDEO_BITDEPTH, defaultInt8},
521fa7767c5Sopenharmony_ci    {Tag::AV_PLAYER_HDR_TYPE, defaultInt8},
522fa7767c5Sopenharmony_ci};
523fa7767c5Sopenharmony_ci
524fa7767c5Sopenharmony_cistatic std::map<AnyValueType, const Any &> g_ValueTypeDefaultValueMap = {
525fa7767c5Sopenharmony_ci    {AnyValueType::INVALID_TYPE, defaultString},
526fa7767c5Sopenharmony_ci    {AnyValueType::BOOL, defaultBool},
527fa7767c5Sopenharmony_ci    {AnyValueType::UINT8_T, defaultUInt8},
528fa7767c5Sopenharmony_ci    {AnyValueType::INT32_T, defaultInt32},
529fa7767c5Sopenharmony_ci    {AnyValueType::UINT32_T, defaultUInt32},
530fa7767c5Sopenharmony_ci    {AnyValueType::INT64_T, defaultInt64},
531fa7767c5Sopenharmony_ci    {AnyValueType::UINT64_T, defaultUInt64},
532fa7767c5Sopenharmony_ci    {AnyValueType::FLOAT, defaultFloat},
533fa7767c5Sopenharmony_ci    {AnyValueType::DOUBLE, defaultDouble},
534fa7767c5Sopenharmony_ci    {AnyValueType::VECTOR_UINT8, defaultVectorUInt8},
535fa7767c5Sopenharmony_ci    {AnyValueType::VECTOR_UINT32, defaultVectorUInt32},
536fa7767c5Sopenharmony_ci    {AnyValueType::STRING, defaultString},
537fa7767c5Sopenharmony_ci};
538fa7767c5Sopenharmony_ci
539fa7767c5Sopenharmony_ciAny GetDefaultAnyValue(const TagType& tag)
540fa7767c5Sopenharmony_ci{
541fa7767c5Sopenharmony_ci    auto iter = g_metadataDefaultValueMap.find(tag);
542fa7767c5Sopenharmony_ci    FALSE_RETURN_V(iter != g_metadataDefaultValueMap.end(), defaultString);
543fa7767c5Sopenharmony_ci    return iter->second;
544fa7767c5Sopenharmony_ci}
545fa7767c5Sopenharmony_ci
546fa7767c5Sopenharmony_cistd::optional<Any> GetDefaultAnyValueOpt(const TagType &tag)
547fa7767c5Sopenharmony_ci{
548fa7767c5Sopenharmony_ci    auto iter = g_metadataDefaultValueMap.find(tag);
549fa7767c5Sopenharmony_ci    if (iter == g_metadataDefaultValueMap.end()) {
550fa7767c5Sopenharmony_ci        return std::nullopt;
551fa7767c5Sopenharmony_ci    }
552fa7767c5Sopenharmony_ci    return iter->second;
553fa7767c5Sopenharmony_ci}
554fa7767c5Sopenharmony_ci
555fa7767c5Sopenharmony_ciAny GetDefaultAnyValue(const TagType &tag, AnyValueType type)
556fa7767c5Sopenharmony_ci{
557fa7767c5Sopenharmony_ci    auto iter = g_metadataDefaultValueMap.find(tag);
558fa7767c5Sopenharmony_ci    if (iter == g_metadataDefaultValueMap.end()) {
559fa7767c5Sopenharmony_ci        auto typeIter = g_ValueTypeDefaultValueMap.find(type);
560fa7767c5Sopenharmony_ci        if (typeIter != g_ValueTypeDefaultValueMap.end()) {
561fa7767c5Sopenharmony_ci            return typeIter->second;
562fa7767c5Sopenharmony_ci        } else {
563fa7767c5Sopenharmony_ci            return defaultString; //Default String type
564fa7767c5Sopenharmony_ci        }
565fa7767c5Sopenharmony_ci    }
566fa7767c5Sopenharmony_ci    return iter->second;
567fa7767c5Sopenharmony_ci}
568fa7767c5Sopenharmony_ci
569fa7767c5Sopenharmony_ciAnyValueType Meta::GetValueType(const TagType& key) const
570fa7767c5Sopenharmony_ci{
571fa7767c5Sopenharmony_ci    auto iter = map_.find(key);
572fa7767c5Sopenharmony_ci    if (iter != map_.end()) {
573fa7767c5Sopenharmony_ci        if (Any::IsSameTypeWith<int32_t>(iter->second)) {
574fa7767c5Sopenharmony_ci            return AnyValueType::INT32_T;
575fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<bool>(iter->second)) {
576fa7767c5Sopenharmony_ci            return AnyValueType::BOOL;
577fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<int64_t>(iter->second)) {
578fa7767c5Sopenharmony_ci            return AnyValueType::INT64_T;
579fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<float>(iter->second)) {
580fa7767c5Sopenharmony_ci            return AnyValueType::FLOAT;
581fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<double>(iter->second)) {
582fa7767c5Sopenharmony_ci            return AnyValueType::DOUBLE;
583fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<std::vector<uint8_t>>(iter->second)) {
584fa7767c5Sopenharmony_ci            return AnyValueType::VECTOR_UINT8;
585fa7767c5Sopenharmony_ci        } else if (Any::IsSameTypeWith<std::string>(iter->second)) {
586fa7767c5Sopenharmony_ci            return AnyValueType::STRING;
587fa7767c5Sopenharmony_ci        } else {
588fa7767c5Sopenharmony_ci            auto iter = g_metadataGetterSetterInt64Map.find(key);
589fa7767c5Sopenharmony_ci            if (iter == g_metadataGetterSetterInt64Map.end()) {
590fa7767c5Sopenharmony_ci                return AnyValueType::INT32_T;
591fa7767c5Sopenharmony_ci            } else {
592fa7767c5Sopenharmony_ci                return AnyValueType::INT64_T;
593fa7767c5Sopenharmony_ci            }
594fa7767c5Sopenharmony_ci        }
595fa7767c5Sopenharmony_ci    }
596fa7767c5Sopenharmony_ci    return AnyValueType::INVALID_TYPE;
597fa7767c5Sopenharmony_ci}
598fa7767c5Sopenharmony_ci
599fa7767c5Sopenharmony_cibool Meta::ToParcel(MessageParcel &parcel) const
600fa7767c5Sopenharmony_ci{
601fa7767c5Sopenharmony_ci    MessageParcel metaParcel;
602fa7767c5Sopenharmony_ci    int32_t metaSize = 0;
603fa7767c5Sopenharmony_ci    bool ret = true;
604fa7767c5Sopenharmony_ci    for (auto iter = begin(); iter != end(); ++iter) {
605fa7767c5Sopenharmony_ci        ++metaSize;
606fa7767c5Sopenharmony_ci        ret &= metaParcel.WriteString(iter->first);
607fa7767c5Sopenharmony_ci        ret &= metaParcel.WriteInt32(static_cast<int32_t>(GetValueType(iter->first)));
608fa7767c5Sopenharmony_ci        ret &= iter->second.ToParcel(metaParcel);
609fa7767c5Sopenharmony_ci        if (!ret) {
610fa7767c5Sopenharmony_ci            MEDIA_LOG_E("fail to Marshalling Key: " PUBLIC_LOG_S, iter->first.c_str());
611fa7767c5Sopenharmony_ci            return false;
612fa7767c5Sopenharmony_ci        }
613fa7767c5Sopenharmony_ci    }
614fa7767c5Sopenharmony_ci    if (ret) {
615fa7767c5Sopenharmony_ci        ret = ret && parcel.WriteInt32(metaSize);
616fa7767c5Sopenharmony_ci        if (metaSize != 0) {
617fa7767c5Sopenharmony_ci            ret = ret && parcel.Append(metaParcel);
618fa7767c5Sopenharmony_ci        }
619fa7767c5Sopenharmony_ci    }
620fa7767c5Sopenharmony_ci    return ret;
621fa7767c5Sopenharmony_ci}
622fa7767c5Sopenharmony_ci
623fa7767c5Sopenharmony_cibool Meta::FromParcel(MessageParcel &parcel)
624fa7767c5Sopenharmony_ci{
625fa7767c5Sopenharmony_ci    map_.clear();
626fa7767c5Sopenharmony_ci    int32_t size = parcel.ReadInt32();
627fa7767c5Sopenharmony_ci    if (size < 0 || static_cast<size_t>(size) > parcel.GetRawDataCapacity()) {
628fa7767c5Sopenharmony_ci        MEDIA_LOG_E("fail to Unmarshalling size: %{public}d", size);
629fa7767c5Sopenharmony_ci        return false;
630fa7767c5Sopenharmony_ci    }
631fa7767c5Sopenharmony_ci
632fa7767c5Sopenharmony_ci    for (int32_t index = 0; index < size; index++) {
633fa7767c5Sopenharmony_ci        std::string key = parcel.ReadString();
634fa7767c5Sopenharmony_ci        AnyValueType type = static_cast<AnyValueType>(parcel.ReadInt32());
635fa7767c5Sopenharmony_ci        Any value = GetDefaultAnyValue(key, type); //Init Default Value
636fa7767c5Sopenharmony_ci        if (value.FromParcel(parcel)) {
637fa7767c5Sopenharmony_ci            map_[key] = value;
638fa7767c5Sopenharmony_ci        } else {
639fa7767c5Sopenharmony_ci            MEDIA_LOG_E("fail to Unmarshalling Key: %{public}s", key.c_str());
640fa7767c5Sopenharmony_ci            return false;
641fa7767c5Sopenharmony_ci        }
642fa7767c5Sopenharmony_ci    }
643fa7767c5Sopenharmony_ci    return true;
644fa7767c5Sopenharmony_ci}
645fa7767c5Sopenharmony_ci}
646fa7767c5Sopenharmony_ci} // namespace OHOS