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 #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
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_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, TemporalGopReferenceMode),
120 };
121
122 using MetaSetterInt64Function = std::function<bool(Meta&, const TagType&, int64_t&)>;
123 using MetaGetterInt64Function = std::function<bool(const Meta&, const TagType&, int64_t&)>;
124 static std::map<TagType, std::pair<MetaSetterInt64Function, MetaGetterInt64Function>> g_metadataGetterSetterInt64Map = {
125 DEFINE_METADATA_SETTER_GETTER(Tag::AUDIO_CHANNEL_LAYOUT, AudioChannelLayout),
126 DEFINE_METADATA_SETTER_GETTER(Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, AudioChannelLayout)
127 };
128
129 static std::vector<TagType> g_metadataBoolVector = {
130 Tag::VIDEO_COLOR_RANGE,
131 Tag::VIDEO_REQUEST_I_FRAME,
132 Tag::VIDEO_IS_HDR_VIVID,
133 Tag::MEDIA_HAS_VIDEO,
134 Tag::MEDIA_HAS_AUDIO,
135 Tag::MEDIA_HAS_SUBTITLE,
136 Tag::MEDIA_HAS_TIMEDMETA,
137 Tag::MEDIA_END_OF_STREAM,
138 Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE,
139 Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY,
140 Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR,
141 Tag::VIDEO_PER_FRAME_IS_LTR,
142 Tag::VIDEO_PER_FRAME_IS_SKIP,
143 Tag::VIDEO_ENABLE_LOW_LATENCY,
144 Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK,
145 Tag::VIDEO_BUFFER_CAN_DROP,
146 Tag::AUDIO_RENDER_SET_FLAG,
147 Tag::SCREEN_CAPTURE_USER_AGREE,
148 Tag::SCREEN_CAPTURE_REQURE_MIC,
149 Tag::SCREEN_CAPTURE_ENABLE_MIC,
150 Tag::AV_PLAYER_IS_DRM_PROTECTED,
151 Tag::AV_PLAYER_DOWNLOAD_TIME_OUT,
152 Tag::VIDEO_ENCODER_PER_FRAME_DISCARD,
153 Tag::VIDEO_ENCODER_ENABLE_WATERMARK,
154 Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK
155 };
156
SetMetaData(Meta & meta,const TagType & tag,int32_t value)157 bool SetMetaData(Meta& meta, const TagType& tag, int32_t value)
158 {
159 auto iter = g_metadataGetterSetterMap.find(tag);
160 if (iter == g_metadataGetterSetterMap.end()) {
161 if (std::find(g_metadataBoolVector.begin(), g_metadataBoolVector.end(), tag) != g_metadataBoolVector.end()) {
162 meta.SetData(tag, value != 0 ? true : false);
163 return true;
164 }
165 meta.SetData(tag, value);
166 return true;
167 }
168 return iter->second.first(meta, tag, value);
169 }
170
GetMetaData(const Meta & meta,const TagType & tag,int32_t & value)171 bool GetMetaData(const Meta& meta, const TagType& tag, int32_t& value)
172 {
173 auto iter = g_metadataGetterSetterMap.find(tag);
174 if (iter == g_metadataGetterSetterMap.end()) {
175 if (std::find(g_metadataBoolVector.begin(), g_metadataBoolVector.end(), tag) != g_metadataBoolVector.end()) {
176 bool valueBool = false;
177 FALSE_RETURN_V(meta.GetData(tag, valueBool), false);
178 value = valueBool ? 1 : 0;
179 return true;
180 }
181 return meta.GetData(tag, value);
182 }
183 return iter->second.second(meta, tag, value);
184 }
185
SetMetaData(Meta & meta,const TagType & tag,int64_t value)186 bool SetMetaData(Meta& meta, const TagType& tag, int64_t value)
187 {
188 auto iter = g_metadataGetterSetterInt64Map.find(tag);
189 if (iter == g_metadataGetterSetterInt64Map.end()) {
190 meta.SetData(tag, value);
191 return true;
192 }
193 return iter->second.first(meta, tag, value);
194 }
195
GetMetaData(const Meta & meta,const TagType & tag,int64_t & value)196 bool GetMetaData(const Meta& meta, const TagType& tag, int64_t& value)
197 {
198 auto iter = g_metadataGetterSetterInt64Map.find(tag);
199 if (iter == g_metadataGetterSetterInt64Map.end()) {
200 return meta.GetData(tag, value);
201 }
202 return iter->second.second(meta, tag, value);
203 }
204
IsIntEnum(const TagType & tag)205 bool IsIntEnum(const TagType &tag)
206 {
207 return (g_metadataGetterSetterMap.find(tag) != g_metadataGetterSetterMap.end());
208 }
209
IsLongEnum(const TagType & tag)210 bool IsLongEnum(const TagType &tag)
211 {
212 return g_metadataGetterSetterInt64Map.find(tag) != g_metadataGetterSetterInt64Map.end();
213 }
214
215 static Any defaultString = std::string();
216 static Any defaultInt8 = (int8_t)0;
217 static Any defaultUInt8 = (uint8_t)0;
218 static Any defaultInt32 = (int32_t)0;
219 static Any defaultUInt32 = (uint32_t)0;
220 static Any defaultInt64 = (int64_t)0;
221 static Any defaultUInt64 = (uint64_t)0;
222 static Any defaultFloat = 0.0f;
223 static Any defaultDouble = (double)0.0;
224 static Any defaultBool = (bool) false;
225 static Any defaultSrcInputType = SrcInputType::UNKNOWN;
226 static Any defaultAudioSampleFormat = AudioSampleFormat::INVALID_WIDTH;
227 static Any defaultVideoPixelFormat = VideoPixelFormat::UNKNOWN;
228 static Any defaultMediaType = MediaType::UNKNOWN;
229 static Any defaultVideoH264Profile = VideoH264Profile::UNKNOWN;
230 static Any defaultVideoRotation = VideoRotation::VIDEO_ROTATION_0;
231 static Any defaultVideoOrientationType = VideoOrientationType::ROTATE_NONE;
232 static Any defaultColorPrimary = ColorPrimary::BT2020;
233 static Any defaultTransferCharacteristic = TransferCharacteristic::BT1361;
234 static Any defaultMatrixCoefficient = MatrixCoefficient::BT2020_CL;
235 static Any defaultHEVCProfile = HEVCProfile::HEVC_PROFILE_UNKNOW;
236 static Any defaultHEVCLevel = HEVCLevel::HEVC_LEVEL_UNKNOW;
237 static Any defaultChromaLocation = ChromaLocation::BOTTOM;
238 static Any defaultFileType = FileType::UNKNOW;
239 static Any defaultVideoEncodeBitrateMode = VideoEncodeBitrateMode::CBR;
240 static Any defaultTemporalGopReferenceMode = TemporalGopReferenceMode::ADJACENT_REFERENCE;
241
242 static Any defaultAudioChannelLayout = AudioChannelLayout::UNKNOWN;
243 static Any defaultAudioAacProfile = AudioAacProfile::ELD;
244 static Any defaultAudioAacStreamFormat = AudioAacStreamFormat::ADIF;
245 static Any defaultVectorUInt8 = std::vector<uint8_t>();
246 static Any defaultVectorUInt32 = std::vector<uint32_t>();
247 static Any defaultVectorVideoBitStreamFormat = std::vector<VideoBitStreamFormat>();
248 static std::map<TagType, const Any &> g_metadataDefaultValueMap = {
249 {Tag::SRC_INPUT_TYPE, defaultSrcInputType},
250 {Tag::AUDIO_SAMPLE_FORMAT, defaultAudioSampleFormat},
251 {Tag::AUDIO_RAW_SAMPLE_FORMAT, defaultAudioSampleFormat},
252 {Tag::VIDEO_PIXEL_FORMAT, defaultVideoPixelFormat},
253 {Tag::MEDIA_TYPE, defaultMediaType},
254 {Tag::VIDEO_H264_PROFILE, defaultVideoH264Profile},
255 {Tag::VIDEO_ROTATION, defaultVideoRotation},
256 {Tag::VIDEO_ORIENTATION_TYPE, defaultVideoOrientationType},
257 {Tag::VIDEO_COLOR_PRIMARIES, defaultColorPrimary},
258 {Tag::VIDEO_COLOR_TRC, defaultTransferCharacteristic},
259 {Tag::VIDEO_COLOR_MATRIX_COEFF, defaultMatrixCoefficient},
260 {Tag::VIDEO_H265_PROFILE, defaultHEVCProfile},
261 {Tag::VIDEO_H265_LEVEL, defaultHEVCLevel},
262 {Tag::VIDEO_CHROMA_LOCATION, defaultChromaLocation},
263 {Tag::MEDIA_FILE_TYPE, defaultFileType},
264 {Tag::VIDEO_ENCODE_BITRATE_MODE, defaultVideoEncodeBitrateMode},
265 {Tag::VIDEO_ENCODER_TEMPORAL_GOP_REFERENCE_MODE, defaultTemporalGopReferenceMode},
266 // Int8
267 {Tag::RECORDER_HDR_TYPE, defaultInt8},
268 // Uint_8
269 {Tag::SCREEN_CAPTURE_AV_TYPE, defaultUInt8},
270 {Tag::SCREEN_CAPTURE_DATA_TYPE, defaultUInt8},
271 {Tag::SCREEN_CAPTURE_STOP_REASON, defaultUInt8},
272 // Int32
273 {Tag::APP_UID, defaultInt32},
274 {Tag::APP_PID, defaultInt32},
275 {Tag::APP_TOKEN_ID, defaultInt32},
276 {Tag::REQUIRED_IN_BUFFER_CNT, defaultInt32},
277 {Tag::REQUIRED_IN_BUFFER_SIZE, defaultInt32},
278 {Tag::REQUIRED_OUT_BUFFER_CNT, defaultInt32},
279 {Tag::REQUIRED_OUT_BUFFER_SIZE, defaultInt32},
280 {Tag::BUFFERING_SIZE, defaultInt32},
281 {Tag::WATERLINE_HIGH, defaultInt32},
282 {Tag::WATERLINE_LOW, defaultInt32},
283 {Tag::AUDIO_CHANNEL_COUNT, defaultInt32},
284 {Tag::AUDIO_SAMPLE_RATE, defaultInt32},
285 {Tag::AUDIO_SAMPLE_PER_FRAME, defaultInt32},
286 {Tag::AUDIO_OUTPUT_CHANNELS, defaultInt32},
287 {Tag::AUDIO_MPEG_VERSION, defaultInt32},
288 {Tag::AUDIO_MPEG_LAYER, defaultInt32},
289 {Tag::AUDIO_AAC_LEVEL, defaultInt32},
290 {Tag::AUDIO_OBJECT_NUMBER, defaultInt32},
291 {Tag::AUDIO_SOUNDBED_CHANNELS_NUMBER, defaultInt32},
292 {Tag::AUDIO_HOA_ORDER, defaultInt32},
293 {Tag::AUDIO_MAX_INPUT_SIZE, defaultInt32},
294 {Tag::AUDIO_MAX_OUTPUT_SIZE, defaultInt32},
295 {Tag::VIDEO_WIDTH, defaultInt32},
296 {Tag::VIDEO_HEIGHT, defaultInt32},
297 {Tag::VIDEO_DELAY, defaultInt32},
298 {Tag::VIDEO_MAX_SURFACE_NUM, defaultInt32},
299 {Tag::VIDEO_H264_LEVEL, defaultInt32},
300 {Tag::MEDIA_TRACK_COUNT, defaultInt32},
301 {Tag::AUDIO_AAC_IS_ADTS, defaultInt32},
302 {Tag::AUDIO_COMPRESSION_LEVEL, defaultInt32},
303 {Tag::AUDIO_BITS_PER_CODED_SAMPLE, defaultInt32},
304 {Tag::AUDIO_BITS_PER_RAW_SAMPLE, defaultInt32},
305 {Tag::REGULAR_TRACK_ID, defaultInt32},
306 {Tag::VIDEO_SCALE_TYPE, defaultInt32},
307 {Tag::VIDEO_I_FRAME_INTERVAL, defaultInt32},
308 {Tag::MEDIA_PROFILE, defaultInt32},
309 {Tag::VIDEO_ENCODE_QUALITY, defaultInt32},
310 {Tag::AUDIO_AAC_SBR, defaultInt32},
311 {Tag::AUDIO_FLAC_COMPLIANCE_LEVEL, defaultInt32},
312 {Tag::MEDIA_LEVEL, defaultInt32},
313 {Tag::VIDEO_STRIDE, defaultInt32},
314 {Tag::VIDEO_DISPLAY_WIDTH, defaultInt32},
315 {Tag::VIDEO_DISPLAY_HEIGHT, defaultInt32},
316 {Tag::VIDEO_PIC_WIDTH, defaultInt32},
317 {Tag::VIDEO_PIC_HEIGHT, defaultInt32},
318 {Tag::VIDEO_ENCODER_TEMPORAL_GOP_SIZE, defaultInt32},
319 {Tag::VIDEO_ENCODER_LTR_FRAME_COUNT, defaultInt32},
320 {Tag::VIDEO_PER_FRAME_POC, defaultInt32},
321 {Tag::VIDEO_ENCODER_PER_FRAME_USE_LTR, defaultInt32},
322 {Tag::VIDEO_CROP_TOP, defaultInt32},
323 {Tag::VIDEO_CROP_BOTTOM, defaultInt32},
324 {Tag::VIDEO_CROP_LEFT, defaultInt32},
325 {Tag::VIDEO_CROP_RIGHT, defaultInt32},
326 {Tag::VIDEO_SLICE_HEIGHT, defaultInt32},
327 {Tag::VIDEO_ENCODER_QP_MAX, defaultInt32},
328 {Tag::VIDEO_ENCODER_QP_MIN, defaultInt32},
329 {Tag::VIDEO_ENCODER_QP_START, defaultInt32},
330 {Tag::FEATURE_PROPERTY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT, defaultInt32},
331 {Tag::OH_MD_KEY_AUDIO_OBJECT_NUMBER, defaultInt32},
332 {Tag::AV_CODEC_CALLER_PID, defaultInt32},
333 {Tag::AV_CODEC_CALLER_UID, defaultInt32},
334 {Tag::AV_CODEC_FORWARD_CALLER_PID, defaultInt32},
335 {Tag::AV_CODEC_FORWARD_CALLER_UID, defaultInt32},
336 {Tag::VIDEO_DECODER_RATE_UPPER_LIMIT, defaultInt32},
337 {Tag::SCREEN_CAPTURE_ERR_CODE, defaultInt32},
338 {Tag::SCREEN_CAPTURE_DURATION, defaultInt32},
339 {Tag::SCREEN_CAPTURE_START_LATENCY, defaultInt32},
340 {Tag::DRM_ERROR_CODE, defaultInt32},
341 {Tag::RECORDER_ERR_CODE, defaultInt32},
342 {Tag::RECORDER_DURATION, defaultInt32},
343 {Tag::RECORDER_VIDEO_BITRATE, defaultInt32},
344 {Tag::RECORDER_AUDIO_SAMPLE_RATE, defaultInt32},
345 {Tag::RECORDER_AUDIO_CHANNEL_COUNT, defaultInt32},
346 {Tag::RECORDER_AUDIO_BITRATE, defaultInt32},
347 {Tag::RECORDER_START_LATENCY, defaultInt32},
348 {Tag::TIMED_METADATA_SRC_TRACK, defaultInt32},
349 {Tag::VIDEO_ENCODER_FRAME_I_RATIO, defaultInt32},
350 {Tag::VIDEO_ENCODER_FRAME_MADI, defaultInt32},
351 {Tag::VIDEO_ENCODER_FRAME_MADP, defaultInt32},
352 {Tag::VIDEO_ENCODER_SUM_MADI, defaultInt32},
353 {Tag::VIDEO_ENCODER_REAL_BITRATE, defaultInt32},
354 {Tag::VIDEO_ENCODER_FRAME_QP, defaultInt32},
355 {Tag::VIDEO_ENCODER_QP_AVERAGE, defaultInt32},
356 {Tag::VIDEO_ENCODER_FRAME_TEMPORAL_ID, defaultInt32},
357 {Tag::AV_PLAYER_ERR_CODE, defaultInt32},
358 {Tag::AV_PLAYER_PLAY_DURATION, defaultInt32},
359 {Tag::AV_PLAYER_SOURCE_TYPE, defaultInt32},
360 {Tag::AV_PLAYER_AVG_DOWNLOAD_RATE, defaultInt32},
361 {Tag::AV_PLAYER_VIDEO_BITRATE, defaultInt32},
362 {Tag::AV_PLAYER_AUDIO_BITRATE, defaultInt32},
363 {Tag::AV_PLAYER_START_LATENCY, defaultInt32},
364 {Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED, defaultInt32},
365 {Tag::AV_PLAYER_MAX_SEEK_LATENCY, defaultInt32},
366 {Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY, defaultInt32},
367 {Tag::AV_PLAYER_LAG_TIMES, defaultInt32},
368 {Tag::AV_PLAYER_MAX_LAG_DURATION, defaultInt32},
369 {Tag::AV_PLAYER_AVG_LAG_DURATION, defaultInt32},
370 {Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, defaultInt32},
371 {Tag::VIDEO_COORDINATE_X, defaultInt32},
372 {Tag::VIDEO_COORDINATE_Y, defaultInt32},
373 {Tag::VIDEO_COORDINATE_W, defaultInt32},
374 {Tag::VIDEO_COORDINATE_H, defaultInt32},
375 {Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER, defaultInt32},
376 {Tag::VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, defaultInt32},
377 {Tag::VIDEO_DECODER_OUTPUT_COLOR_SPACE, defaultInt32},
378 {Tag::VIDEO_DECODER_OUTPUT_ENABLE_VRR, defaultInt32},
379 {Tag::AV_TRANSCODER_ERR_CODE, defaultInt32},
380 {Tag::AV_TRANSCODER_SOURCE_DURATION, defaultInt32},
381 {Tag::AV_TRANSCODER_TRANSCODER_DURATION, defaultInt32},
382 {Tag::AV_TRANSCODER_SRC_VIDEO_BITRATE, defaultInt32},
383 {Tag::AV_TRANSCODER_SRC_HDR_TYPE, defaultInt32},
384 {Tag::AV_TRANSCODER_SRC_AUDIO_SAMPLE_RATE, defaultInt32},
385 {Tag::AV_TRANSCODER_SRC_AUDIO_CHANNEL_COUNT, defaultInt32},
386 {Tag::AV_TRANSCODER_SRC_AUDIO_BITRATE, defaultInt32},
387 {Tag::AV_TRANSCODER_DST_VIDEO_BITRATE, defaultInt32},
388 {Tag::AV_TRANSCODER_DST_HDR_TYPE, defaultInt32},
389 {Tag::AV_TRANSCODER_DST_AUDIO_SAMPLE_RATE, defaultInt32},
390 {Tag::AV_TRANSCODER_DST_AUDIO_CHANNEL_COUNT, defaultInt32},
391 {Tag::AV_TRANSCODER_DST_AUDIO_BITRATE, defaultInt32},
392 {Tag::AV_TRANSCODER_VIDEO_DECODER_DURATION, defaultInt32},
393 {Tag::AV_TRANSCODER_VIDEO_ENCODER_DURATION, defaultInt32},
394 {Tag::AV_TRANSCODER_VIDEO_VPE_DURATION, defaultInt32},
395 // String
396 {Tag::MIME_TYPE, defaultString},
397 {Tag::MEDIA_FILE_URI, defaultString},
398 {Tag::MEDIA_TITLE, defaultString},
399 {Tag::MEDIA_ARTIST, defaultString},
400 {Tag::MEDIA_LYRICIST, defaultString},
401 {Tag::MEDIA_ALBUM, defaultString},
402 {Tag::MEDIA_ALBUM_ARTIST, defaultString},
403 {Tag::MEDIA_DATE, defaultString},
404 {Tag::MEDIA_COMMENT, defaultString},
405 {Tag::MEDIA_GENRE, defaultString},
406 {Tag::MEDIA_COPYRIGHT, defaultString},
407 {Tag::MEDIA_LANGUAGE, defaultString},
408 {Tag::MEDIA_DESCRIPTION, defaultString},
409 {Tag::USER_TIME_SYNC_RESULT, defaultString},
410 {Tag::USER_AV_SYNC_GROUP_INFO, defaultString},
411 {Tag::USER_SHARED_MEMORY_FD, defaultString},
412 {Tag::MEDIA_AUTHOR, defaultString},
413 {Tag::MEDIA_COMPOSER, defaultString},
414 {Tag::MEDIA_LYRICS, defaultString},
415 {Tag::MEDIA_CODEC_NAME, defaultString},
416 {Tag::PROCESS_NAME, defaultString},
417 {Tag::MEDIA_CREATION_TIME, defaultString},
418 {Tag::AV_CODEC_CALLER_PROCESS_NAME, defaultString},
419 {Tag::AV_CODEC_FORWARD_CALLER_PROCESS_NAME, defaultString},
420 {Tag::SCREEN_CAPTURE_ERR_MSG, defaultString},
421 {Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION, defaultString},
422 {Tag::DRM_APP_NAME, defaultString},
423 {Tag::DRM_INSTANCE_ID, defaultString},
424 {Tag::DRM_ERROR_MESG, defaultString},
425 {Tag::TIMED_METADATA_SRC_TRACK_MIME, defaultString},
426 {Tag::TIMED_METADATA_KEY, defaultString},
427 {Tag::TIMED_METADATA_LOCALE, defaultString},
428 {Tag::TIMED_METADATA_SETUP, defaultString},
429 {Tag::RECORDER_ERR_MSG, defaultString},
430 {Tag::RECORDER_CONTAINER_MIME, defaultString},
431 {Tag::RECORDER_VIDEO_MIME, defaultString},
432 {Tag::RECORDER_VIDEO_RESOLUTION, defaultString},
433 {Tag::RECORDER_AUDIO_MIME, defaultString},
434 {Tag::AV_PLAYER_ERR_MSG, defaultString},
435 {Tag::AV_PLAYER_CONTAINER_MIME, defaultString},
436 {Tag::AV_PLAYER_VIDEO_MIME, defaultString},
437 {Tag::AV_PLAYER_VIDEO_RESOLUTION, defaultString},
438 {Tag::AV_PLAYER_AUDIO_MIME, defaultString},
439 {Tag::AV_TRANSCODER_ERR_MSG, defaultString},
440 {Tag::AV_TRANSCODER_SRC_FORMAT, defaultString},
441 {Tag::AV_TRANSCODER_SRC_AUDIO_MIME, defaultString},
442 {Tag::AV_TRANSCODER_SRC_VIDEO_MIME, defaultString},
443 {Tag::AV_TRANSCODER_DST_FORMAT, defaultString},
444 {Tag::AV_TRANSCODER_DST_AUDIO_MIME, defaultString},
445 {Tag::AV_TRANSCODER_DST_VIDEO_MIME, defaultString},
446 // Float
447 {Tag::MEDIA_LATITUDE, defaultFloat},
448 {Tag::MEDIA_LONGITUDE, defaultFloat},
449 {Tag::AV_PLAYER_VIDEO_FRAMERATE, defaultFloat},
450 // Double
451 {Tag::VIDEO_CAPTURE_RATE, defaultDouble},
452 {Tag::VIDEO_FRAME_RATE, defaultDouble},
453 {Tag::VIDEO_SAR, defaultDouble},
454 {Tag::VIDEO_ENCODER_MSE, defaultDouble},
455 {Tag::AV_TRANSCODER_SRC_VIDEO_FRAME_RATE, defaultDouble},
456 {Tag::AV_TRANSCODER_DST_VIDEO_FRAME_RATE, defaultDouble},
457 // Bool
458 {Tag::VIDEO_COLOR_RANGE, defaultBool},
459 {Tag::VIDEO_REQUEST_I_FRAME, defaultBool},
460 {Tag::VIDEO_IS_HDR_VIVID, defaultBool},
461 {Tag::MEDIA_HAS_VIDEO, defaultBool},
462 {Tag::MEDIA_HAS_AUDIO, defaultBool},
463 {Tag::MEDIA_HAS_SUBTITLE, defaultBool},
464 {Tag::MEDIA_HAS_TIMEDMETA, defaultBool},
465 {Tag::MEDIA_END_OF_STREAM, defaultBool},
466 {Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE, defaultBool},
467 {Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY, defaultBool},
468 {Tag::VIDEO_ENCODER_PER_FRAME_MARK_LTR, defaultBool},
469 {Tag::VIDEO_PER_FRAME_IS_LTR, defaultBool},
470 {Tag::VIDEO_PER_FRAME_IS_SKIP, defaultBool},
471 {Tag::VIDEO_ENABLE_LOW_LATENCY, defaultBool},
472 {Tag::VIDEO_ENCODER_ENABLE_SURFACE_INPUT_CALLBACK, defaultBool},
473 {Tag::VIDEO_ENCODER_ENABLE_PARAMS_FEEDBACK, defaultBool},
474 {Tag::VIDEO_BUFFER_CAN_DROP, defaultBool},
475 {Tag::AUDIO_RENDER_SET_FLAG, defaultBool},
476 {Tag::SCREEN_CAPTURE_USER_AGREE, defaultBool},
477 {Tag::SCREEN_CAPTURE_REQURE_MIC, defaultBool},
478 {Tag::SCREEN_CAPTURE_ENABLE_MIC, defaultBool},
479 {Tag::AV_PLAYER_IS_DRM_PROTECTED, defaultBool},
480 {Tag::AV_PLAYER_DOWNLOAD_TIME_OUT, defaultBool},
481 {Tag::VIDEO_ENCODER_PER_FRAME_DISCARD, defaultBool},
482 {Tag::VIDEO_ENCODER_ENABLE_WATERMARK, defaultBool},
483 // Int64
484 {Tag::MEDIA_FILE_SIZE, defaultUInt64},
485 {Tag::MEDIA_POSITION, defaultUInt64},
486 {Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, defaultUInt64},
487 {Tag::APP_FULL_TOKEN_ID, defaultInt64},
488 {Tag::MEDIA_DURATION, defaultInt64},
489 {Tag::MEDIA_BITRATE, defaultInt64},
490 {Tag::MEDIA_START_TIME, defaultInt64},
491 {Tag::USER_FRAME_PTS, defaultInt64},
492 {Tag::USER_PUSH_DATA_TIME, defaultInt64},
493 {Tag::MEDIA_TIME_STAMP, defaultInt64},
494 {Tag::MEDIA_CONTAINER_START_TIME, defaultInt64},
495 {Tag::BUFFER_DECODING_TIMESTAMP, defaultInt64},
496 {Tag::BUFFER_DURATION, defaultInt64},
497 {Tag::VIDEO_DECODER_DESIRED_PRESENT_TIMESTAMP, defaultInt64},
498 // AudioChannelLayout UINT64_T
499 {Tag::AUDIO_CHANNEL_LAYOUT, defaultAudioChannelLayout},
500 {Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, defaultAudioChannelLayout},
501 // AudioAacProfile UInt8
502 {Tag::AUDIO_AAC_PROFILE, defaultAudioAacProfile},
503 // AudioAacStreamFormat UInt8
504 {Tag::AUDIO_AAC_STREAM_FORMAT, defaultAudioAacStreamFormat},
505 // vector<uint8_t>
506 {Tag::MEDIA_CODEC_CONFIG, defaultVectorUInt8},
507 {Tag::AUDIO_VIVID_METADATA, defaultVectorUInt8},
508 {Tag::MEDIA_COVER, defaultVectorUInt8},
509 {Tag::AUDIO_VORBIS_IDENTIFICATION_HEADER, defaultVectorUInt8},
510 {Tag::AUDIO_VORBIS_SETUP_HEADER, defaultVectorUInt8},
511 {Tag::OH_MD_KEY_AUDIO_VIVID_METADATA, defaultVectorUInt8},
512 // vector<Plugins::VideoBitStreamFormat>
513 {Tag::VIDEO_BIT_STREAM_FORMAT, defaultVectorVideoBitStreamFormat},
514 // vector<uint8_t>
515 {Tag::DRM_CENC_INFO, defaultVectorUInt8},
516 {Tag::MEDIA_AVAILABLE_BITRATES, defaultVectorUInt8},
517 // Uint32
518 {Tag::DRM_DECRYPT_AVG_SIZE, defaultUInt32},
519 {Tag::DRM_DECRYPT_AVG_DURATION, defaultUInt32},
520 {Tag::DRM_DECRYPT_MAX_SIZE, defaultUInt32},
521 {Tag::DRM_DECRYPT_MAX_DURATION, defaultUInt32},
522 {Tag::DRM_DECRYPT_TIMES, defaultUInt32},
523 //int8
524 {Tag::AV_PLAYER_VIDEO_BITDEPTH, defaultInt8},
525 {Tag::AV_PLAYER_HDR_TYPE, defaultInt8},
526 };
527
528 static std::map<AnyValueType, const Any &> g_ValueTypeDefaultValueMap = {
529 {AnyValueType::INVALID_TYPE, defaultString},
530 {AnyValueType::BOOL, defaultBool},
531 {AnyValueType::UINT8_T, defaultUInt8},
532 {AnyValueType::INT32_T, defaultInt32},
533 {AnyValueType::UINT32_T, defaultUInt32},
534 {AnyValueType::INT64_T, defaultInt64},
535 {AnyValueType::UINT64_T, defaultUInt64},
536 {AnyValueType::FLOAT, defaultFloat},
537 {AnyValueType::DOUBLE, defaultDouble},
538 {AnyValueType::VECTOR_UINT8, defaultVectorUInt8},
539 {AnyValueType::VECTOR_UINT32, defaultVectorUInt32},
540 {AnyValueType::STRING, defaultString},
541 };
542
GetDefaultAnyValue(const TagType & tag)543 Any GetDefaultAnyValue(const TagType& tag)
544 {
545 auto iter = g_metadataDefaultValueMap.find(tag);
546 FALSE_RETURN_V(iter != g_metadataDefaultValueMap.end(), defaultString);
547 return iter->second;
548 }
549
GetDefaultAnyValueOpt(const TagType & tag)550 std::optional<Any> GetDefaultAnyValueOpt(const TagType &tag)
551 {
552 auto iter = g_metadataDefaultValueMap.find(tag);
553 if (iter == g_metadataDefaultValueMap.end()) {
554 return std::nullopt;
555 }
556 return iter->second;
557 }
558
GetDefaultAnyValue(const TagType & tag,AnyValueType type)559 Any GetDefaultAnyValue(const TagType &tag, AnyValueType type)
560 {
561 auto iter = g_metadataDefaultValueMap.find(tag);
562 if (iter == g_metadataDefaultValueMap.end()) {
563 auto typeIter = g_ValueTypeDefaultValueMap.find(type);
564 if (typeIter != g_ValueTypeDefaultValueMap.end()) {
565 return typeIter->second;
566 } else {
567 return defaultString; //Default String type
568 }
569 }
570 return iter->second;
571 }
572
IsDefinedKey(const TagType & tag) const573 bool Meta::IsDefinedKey(const TagType &tag) const
574 {
575 auto iter = g_metadataDefaultValueMap.find(tag);
576 if (iter == g_metadataDefaultValueMap.end()) {
577 return false;
578 }
579 return true;
580 }
581
GetValueType(const TagType & key) const582 AnyValueType Meta::GetValueType(const TagType& key) const
583 {
584 auto iter = map_.find(key);
585 if (iter != map_.end()) {
586 if (Any::IsSameTypeWith<int32_t>(iter->second)) {
587 return AnyValueType::INT32_T;
588 } else if (Any::IsSameTypeWith<bool>(iter->second)) {
589 return AnyValueType::BOOL;
590 } else if (Any::IsSameTypeWith<int64_t>(iter->second)) {
591 return AnyValueType::INT64_T;
592 } else if (Any::IsSameTypeWith<float>(iter->second)) {
593 return AnyValueType::FLOAT;
594 } else if (Any::IsSameTypeWith<double>(iter->second)) {
595 return AnyValueType::DOUBLE;
596 } else if (Any::IsSameTypeWith<std::vector<uint8_t>>(iter->second)) {
597 return AnyValueType::VECTOR_UINT8;
598 } else if (Any::IsSameTypeWith<std::string>(iter->second)) {
599 return AnyValueType::STRING;
600 } else {
601 auto iter = g_metadataGetterSetterInt64Map.find(key);
602 if (iter == g_metadataGetterSetterInt64Map.end()) {
603 return AnyValueType::INT32_T;
604 } else {
605 return AnyValueType::INT64_T;
606 }
607 }
608 }
609 return AnyValueType::INVALID_TYPE;
610 }
611
ToParcel(MessageParcel & parcel) const612 bool Meta::ToParcel(MessageParcel &parcel) const
613 {
614 MessageParcel metaParcel;
615 int32_t metaSize = 0;
616 bool ret = true;
617 for (auto iter = begin(); iter != end(); ++iter) {
618 ++metaSize;
619 ret &= metaParcel.WriteString(iter->first);
620 ret &= metaParcel.WriteInt32(static_cast<int32_t>(GetValueType(iter->first)));
621 ret &= iter->second.ToParcel(metaParcel);
622 if (!ret) {
623 MEDIA_LOG_E("fail to Marshalling Key: " PUBLIC_LOG_S, iter->first.c_str());
624 return false;
625 }
626 }
627 if (ret) {
628 ret = ret && parcel.WriteInt32(metaSize);
629 if (metaSize != 0) {
630 ret = ret && parcel.Append(metaParcel);
631 }
632 }
633 return ret;
634 }
635
FromParcel(MessageParcel & parcel)636 bool Meta::FromParcel(MessageParcel &parcel)
637 {
638 map_.clear();
639 int32_t size = parcel.ReadInt32();
640 if (size < 0 || static_cast<size_t>(size) > parcel.GetRawDataCapacity()) {
641 MEDIA_LOG_E("fail to Unmarshalling size: %{public}d", size);
642 return false;
643 }
644
645 for (int32_t index = 0; index < size; index++) {
646 std::string key = parcel.ReadString();
647 AnyValueType type = static_cast<AnyValueType>(parcel.ReadInt32());
648 Any value = GetDefaultAnyValue(key, type); //Init Default Value
649 if (value.FromParcel(parcel)) {
650 map_[key] = value;
651 } else {
652 MEDIA_LOG_E("fail to Unmarshalling Key: %{public}s", key.c_str());
653 return false;
654 }
655 }
656 return true;
657 }
658 }
659 } // namespace OHOS