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