1 /*
2 * Copyright (c) 2022-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef HISTREAMER_PIPELINE_PLUGINS_CAP_DESC_H
17 #define HISTREAMER_PIPELINE_PLUGINS_CAP_DESC_H
18 #include <tuple>
19 #include "common/plugin_audio_tags.h"
20 #include "common/plugin_source_tags.h"
21 #include "common/plugin_video_tags.h"
22
23 namespace OHOS {
24 namespace Media {
25 namespace Plugins {
26 const ValueType g_emptyString = std::string();
27 const ValueType g_u8Def = (uint8_t)0;
28 const ValueType g_u32Def = (uint32_t)0;
29 const ValueType g_d32Def = (int32_t)0;
30 const ValueType g_d64Def = (int64_t)0;
31 const ValueType g_u64Def = (uint64_t)0;
32 const ValueType g_doubleDef = (double)0.0;
33 const ValueType g_seekableDef = Seekable::INVALID;
34 const ValueType g_srcInputTypedef = SrcInputType::UNKNOWN;
35 const ValueType g_unknown = nullptr;
36 const ValueType g_vecBufDef = std::vector<uint8_t>();
37 const ValueType g_mediaTypeDef = MediaType::AUDIO;
38 const ValueType g_channelLayoutDef = AudioChannelLayout::MONO;
39 const ValueType g_auSampleFmtDef = AudioSampleFormat::U8;
40 const ValueType g_aacProfileDef = AudioAacProfile::LC;
41 const ValueType g_aacStFmtDef = AudioAacStreamFormat::RAW;
42 const ValueType g_vdPixelFmtDef = VideoPixelFormat::UNKNOWN;
43 const ValueType g_vdBitStreamFmtDef = VideoBitStreamFormat::UNKNOWN;
44 const ValueType g_vdH264ProfileDef = VideoH264Profile::BASELINE;
45 const ValueType g_audioRenderInfoDef = AudioRenderInfo {};
46 const ValueType g_audioInterruptModeDef = AudioInterruptMode::SHARE_MODE;
47
48 // tuple is <tagName, default_val, typeName> default_val is used for type compare
49 const std::map<Tag, std::tuple<const char*, const ValueType&, const char*>> g_tagInfoMap = {
50 {Tag::MIME, {"mime", g_emptyString, "string"}},
51 {Tag::TRACK_ID, {"track_id", g_u32Def, "uint32_t"}},
52 {Tag::REQUIRED_OUT_BUFFER_CNT, {"req_out_buf_cnt", g_u32Def, "uint32_t"}},
53 {Tag::BUFFER_ALLOCATOR, {"buf_allocator", g_unknown, "shared_ptr<Allocator>"}},
54 {Tag::BUFFERING_SIZE, {"bufing_size", g_u32Def, "uint32_t"}},
55 {Tag::WATERLINE_HIGH, {"waterline_h", g_u32Def, "uint32_t"}},
56 {Tag::WATERLINE_LOW, {"waterline_l", g_u32Def, "uint32_t"}},
57 {Tag::SRC_INPUT_TYPE, {"src_input_typ", g_srcInputTypedef, "SrcInputType"}},
58 {Tag::MEDIA_TYPE, {"media_type", g_mediaTypeDef, "MediaType"}},
59 {Tag::MEDIA_TITLE, {"title", g_emptyString, "string"}},
60 {Tag::MEDIA_ARTIST, {"artist", g_emptyString, "string"}},
61 {Tag::MEDIA_LYRICIST, {"lyricist", g_emptyString, "string"}},
62 {Tag::MEDIA_ALBUM, {"album", g_emptyString, "string"}},
63 {Tag::MEDIA_ALBUM_ARTIST, {"album_artist", g_emptyString, "string"}},
64 {Tag::MEDIA_DATE, {"date", g_emptyString, "string"}},
65 {Tag::MEDIA_COMMENT, {"comment", g_emptyString, "string"}},
66 {Tag::MEDIA_GENRE, {"genre", g_emptyString, "string"}},
67 {Tag::MEDIA_COPYRIGHT, {"copyright", g_emptyString, "string"}},
68 {Tag::MEDIA_LANGUAGE, {"lang", g_emptyString, "string"}},
69 {Tag::MEDIA_DESCRIPTION, {"media_desc", g_emptyString, "string"}},
70 {Tag::MEDIA_LYRICS, {"lyrics", g_emptyString, "string"}},
71 {Tag::MEDIA_DURATION, {"duration", g_d64Def, "int64_t"}},
72 {Tag::MEDIA_FILE_SIZE, {"file_size", g_u64Def, "uint64_t"}},
73 {Tag::MEDIA_SEEKABLE, {"media_seekable", g_seekableDef, "Seekable"}},
74 {Tag::MEDIA_BITRATE, {"bit_rate", g_d64Def, "int64_t"}},
75 {Tag::MEDIA_FILE_URI, {"file_uri", g_emptyString, "string"}},
76 {Tag::MEDIA_CODEC_CONFIG, {"codec_config", g_vecBufDef, "std::vector<uint8_t>"}},
77 {Tag::MEDIA_POSITION, {"position", g_u64Def, "uint64_t"}},
78 {Tag::AUDIO_CHANNELS, {"channels", g_u32Def, "uint32_t"}},
79 {Tag::AUDIO_CHANNEL_LAYOUT, {"channel_layout", g_channelLayoutDef, "AudioChannelLayout"}},
80 {Tag::AUDIO_SAMPLE_RATE, {"sample_rate", g_u32Def, "uint32_t"}},
81 {Tag::AUDIO_SAMPLE_FORMAT, {"sample_fmt", g_auSampleFmtDef, "AudioSampleFormat"}},
82 {Tag::AUDIO_SAMPLE_PER_FRAME, {"sample_per_frame", g_u32Def, "uint32_t"}},
83 {Tag::AUDIO_OUTPUT_CHANNELS, {"output_channels", g_u32Def, "uint32_t"}},
84 {Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, {"output_channel_layout", g_channelLayoutDef, "AudioChannelLayout"}},
85 {Tag::AUDIO_MPEG_VERSION, {"ad_mpeg_ver", g_u32Def, "uint32_t"}},
86 {Tag::AUDIO_MPEG_LAYER, {"ad_mpeg_layer", g_u32Def, "uint32_t"}},
87
88 {Tag::AUDIO_AAC_PROFILE, {"aac_profile", g_aacProfileDef, "AudioAacProfile"}},
89 {Tag::AUDIO_AAC_LEVEL, {"aac_level", g_u32Def, "uint32_t"}},
90 {Tag::AUDIO_AAC_STREAM_FORMAT, {"aac_stm_fmt", g_aacStFmtDef, "AudioAacStreamFormat"}},
91 {Tag::VIDEO_WIDTH, {"vd_w", g_u32Def, "uint32_t"}},
92 {Tag::VIDEO_HEIGHT, {"vd_h", g_u32Def, "uint32_t"}},
93 {Tag::VIDEO_PIXEL_FORMAT, {"pixel_fmt", g_vdPixelFmtDef, "VideoPixelFormat"}},
94 {Tag::VIDEO_FRAME_RATE, {"frm_rate", g_u32Def, "uint32_t"}},
95 {Tag::VIDEO_SURFACE, {"surface", g_unknown, "Surface"}},
96 {Tag::VIDEO_MAX_SURFACE_NUM, {"surface_num", g_u32Def, "uint32_t"}},
97 {Tag::VIDEO_CAPTURE_RATE, {"capture_rate", g_doubleDef, "double"}},
98 {Tag::VIDEO_BIT_STREAM_FORMAT, {"vd_bit_stream_fmt", g_vdBitStreamFmtDef, "VideoBitStreamFormat"}},
99 {Tag::BITS_PER_CODED_SAMPLE, {"bits_per_coded_sample", g_u32Def, "uint32_t"}},
100 {Tag::MEDIA_START_TIME, {"med_start_time", g_d64Def, "int64_t"}},
101 {Tag::VIDEO_H264_PROFILE, {"h264_profile", g_vdH264ProfileDef, "VideoH264Profile"}},
102 {Tag::VIDEO_H264_LEVEL, {"vd_level", g_u32Def, "uint32_t"}},
103 {Tag::APP_TOKEN_ID, {"apptoken_id", g_u32Def, "uint32_t"}},
104 {Tag::APP_UID, {"app_uid", g_d32Def, "int32_t"}},
105 {Tag::APP_PID, {"app_pid", g_d32Def, "int32_t"}},
106 {Tag::AUDIO_RENDER_INFO, {"audio_render_info", g_audioRenderInfoDef, "AudioRenderInfo"}},
107 {Tag::AUDIO_INTERRUPT_MODE, {"audio_interrupt_mode", g_audioInterruptModeDef, "AudioInterruptMode"}},
108 {Tag::USER_FRAME_NUMBER, {"frame_number", g_u32Def, "uint32_t"}},
109 {Tag::USER_TIME_SYNC_RESULT, {"time_sync_result", g_emptyString, "string"}},
110 {Tag::USER_AV_SYNC_GROUP_INFO, {"av_sync_group_info", g_emptyString, "string"}},
111 {Tag::USER_SHARED_MEMORY_FD, {"shared_memory_fd", g_emptyString, "string"}},
112 };
113
114 const std::map<AudioSampleFormat, const char*> g_auSampleFmtStrMap = {
115 {AudioSampleFormat::S8, "S8"},
116 {AudioSampleFormat::U8, "U8"},
117 {AudioSampleFormat::S8P, "S8P"},
118 {AudioSampleFormat::U8P, "U8P"},
119 {AudioSampleFormat::S16, "S16"},
120 {AudioSampleFormat::U16, "U16"},
121 {AudioSampleFormat::S16P, "S16P"},
122 {AudioSampleFormat::U16P, "U16P"},
123 {AudioSampleFormat::S24, "S24"},
124 {AudioSampleFormat::U24, "U24"},
125 {AudioSampleFormat::S24P, "S24P"},
126 {AudioSampleFormat::U24P, "U24P"},
127 {AudioSampleFormat::S32, "S32"},
128 {AudioSampleFormat::U32, "U32"},
129 {AudioSampleFormat::S32P, "S32P"},
130 {AudioSampleFormat::U32P, "U32P"},
131 {AudioSampleFormat::S64, "S64"},
132 {AudioSampleFormat::U64, "U64"},
133 {AudioSampleFormat::S64P, "S64P"},
134 {AudioSampleFormat::U64P, "U64P"},
135 {AudioSampleFormat::F32, "F32"},
136 {AudioSampleFormat::F32P, "F32P"},
137 {AudioSampleFormat::F64, "F64"},
138 {AudioSampleFormat::F64P, "F64P"},
139 };
140
141 const std::map<AudioChannelLayout, const char*> g_auChannelLayoutStrMap = {
142 {AudioChannelLayout::UNKNOWN, "UNKNOWN"},
143 {AudioChannelLayout::MONO, "MONO"},
144 {AudioChannelLayout::STEREO, "STEREO"},
145 {AudioChannelLayout::CH_2POINT1, "CH_2POINT1"},
146 {AudioChannelLayout::CH_2_1, "CH_2_1"},
147 {AudioChannelLayout::SURROUND, "SURROUND"},
148 {AudioChannelLayout::CH_3POINT1, "CH_3POINT1"},
149 {AudioChannelLayout::CH_4POINT0, "CH_4POINT0"},
150 {AudioChannelLayout::CH_4POINT1, "CH_4POINT1"},
151 {AudioChannelLayout::CH_2_2, "CH_2_2"},
152 {AudioChannelLayout::QUAD, "QUAD"},
153 {AudioChannelLayout::CH_5POINT0, "CH_5POINT0"},
154 {AudioChannelLayout::CH_5POINT1, "CH_5POINT1"},
155 {AudioChannelLayout::CH_5POINT0_BACK, "CH_5POINT0_BACK"},
156 {AudioChannelLayout::CH_5POINT1_BACK, "CH_5POINT1_BACK"},
157 {AudioChannelLayout::CH_6POINT0, "CH_6POINT0"},
158 {AudioChannelLayout::CH_6POINT0_FRONT, "CH_6POINT0_FRONT"},
159 {AudioChannelLayout::HEXAGONAL, "HEXAGONAL"},
160 {AudioChannelLayout::CH_6POINT1, "CH_6POINT1"},
161 {AudioChannelLayout::CH_6POINT1_BACK, "CH_6POINT1_BACK"},
162 {AudioChannelLayout::CH_6POINT1_FRONT, "CH_6POINT1_FRONT"},
163 {AudioChannelLayout::CH_7POINT0, "CH_7POINT0"},
164 {AudioChannelLayout::CH_7POINT0_FRONT, "CH_7POINT0_FRONT"},
165 {AudioChannelLayout::CH_7POINT1, "CH_7POINT1"},
166 {AudioChannelLayout::CH_7POINT1_WIDE, "CH_7POINT1_WIDE"},
167 {AudioChannelLayout::CH_7POINT1_WIDE_BACK, "CH_7POINT1_WIDE_BACK"},
168 #ifdef AVS3DA_SUPPORT
169 {AudioChannelLayout::CH_5POINT1POINT2, "CH_5POINT1POINT2"},
170 {AudioChannelLayout::CH_5POINT1POINT4, "CH_5POINT1POINT4"},
171 {AudioChannelLayout::CH_7POINT1POINT2, "CH_7POINT1POINT2"},
172 {AudioChannelLayout::CH_7POINT1POINT4, "CH_7POINT1POINT4"},
173 {AudioChannelLayout::CH_9POINT1POINT4, "CH_9POINT1POINT4"},
174 {AudioChannelLayout::CH_9POINT1POINT6, "CH_9POINT1POINT6"},
175 {AudioChannelLayout::CH_10POINT2, "CH_10POINT2"},
176 {AudioChannelLayout::CH_22POINT2, "CH_22POINT2"},
177 #endif
178 {AudioChannelLayout::OCTAGONAL, "OCTAGONAL"},
179 {AudioChannelLayout::HEXADECAGONAL, "HEXADECAGONAL"},
180 {AudioChannelLayout::STEREO_DOWNMIX, "STEREO_DOWNMIX"},
181 };
182
183 const std::map<VideoPixelFormat, const char*> g_videoPixelFormatStrMap = {
184 {VideoPixelFormat::UNKNOWN, "UNKNOWN"},
185 {VideoPixelFormat::YUV410P, "YUV410P"},
186 {VideoPixelFormat::YUV411P, "YUV411P"},
187 {VideoPixelFormat::YUV420P, "YUV420P"},
188 {VideoPixelFormat::NV12, "NV12"},
189 {VideoPixelFormat::NV21, "NV21"},
190 {VideoPixelFormat::YUYV422, "YUYV422"},
191 {VideoPixelFormat::YUV422P, "YUV422P"},
192 {VideoPixelFormat::YUV444P, "YUV444P"},
193 {VideoPixelFormat::RGBA, "RGBA"},
194 {VideoPixelFormat::ARGB, "ARGB"},
195 {VideoPixelFormat::ABGR, "ABGR"},
196 {VideoPixelFormat::BGRA, "BGRA"},
197 {VideoPixelFormat::RGB24, "RGB24"},
198 {VideoPixelFormat::BGR24, "BGR24"},
199 {VideoPixelFormat::PAL8, "PAL8"},
200 {VideoPixelFormat::GRAY8, "GRAY8"},
201 {VideoPixelFormat::MONOWHITE, "MONOWHITE"},
202 {VideoPixelFormat::MONOBLACK, "MONOBLACK"},
203 {VideoPixelFormat::YUVJ420P, "YUVJ420P"},
204 {VideoPixelFormat::YUVJ422P, "YUVJ422P"},
205 {VideoPixelFormat::YUVJ444P, "YUVJ444P"},
206 };
207
208 const std::map<VideoBitStreamFormat, const char*> g_vdBitStreamFormatStrMap = {
209 {VideoBitStreamFormat::UNKNOWN, "UNKNOWN"},
210 {VideoBitStreamFormat::AVC1, "AVC1"},
211 {VideoBitStreamFormat::HEVC, "HEVC"},
212 {VideoBitStreamFormat::ANNEXB, "ANNEXB"},
213 };
214
215 const std::map<AudioAacProfile, const char*> g_auAacProfileNameStrMap = {
216 {AudioAacProfile::NONE, "NONE"},
217 {AudioAacProfile::MAIN, "MAIN"},
218 {AudioAacProfile::LC, "LC"},
219 {AudioAacProfile::SSR, "SSR"},
220 {AudioAacProfile::LTP, "LTP"},
221 {AudioAacProfile::HE, "HE"},
222 {AudioAacProfile::SCALABLE, "SCALABLE"},
223 {AudioAacProfile::ERLC, "ERLC"},
224 {AudioAacProfile::ER_SCALABLE, "ER_SCALABLE"},
225 {AudioAacProfile::LD, "LD"},
226 {AudioAacProfile::HE_PS, "HE_PS"},
227 {AudioAacProfile::ELD, "ELD"},
228 {AudioAacProfile::XHE, "XHE"},
229 };
230
231 const std::map<AudioAacStreamFormat, const char*> g_auAacStreamFormatNameStrMap = {
232 {AudioAacStreamFormat::MP2ADTS, "MP2ADTS"},
233 {AudioAacStreamFormat::MP4ADTS, "MP4ADTS"},
234 {AudioAacStreamFormat::MP4LOAS, "MP4LOAS"},
235 {AudioAacStreamFormat::MP4LATM, "MP4LATM"},
236 {AudioAacStreamFormat::ADIF, "ADIF"},
237 {AudioAacStreamFormat::MP4FF, "MP4FF"},
238 {AudioAacStreamFormat::RAW, "RAW"},
239 };
240
HasTagInfo(Tag tag)241 inline bool HasTagInfo(Tag tag)
242 {
243 return g_tagInfoMap.count(tag) != 0;
244 }
245
GetTagStrName(Tag tag)246 inline const char* GetTagStrName(Tag tag)
247 {
248 if (!HasTagInfo(tag)) {
249 return "null";
250 }
251 return std::get<0>(g_tagInfoMap.at(tag));
252 }
253
GetTagTypeStrName(Tag tag)254 inline const char* GetTagTypeStrName(Tag tag)
255 {
256 if (!HasTagInfo(tag)) {
257 return "null";
258 }
259 return std::get<2>(g_tagInfoMap.at(tag)); // secondary parameter 2
260 }
261
GetTagDefValue(Tag tag)262 inline const Plugins::ValueType* GetTagDefValue(Tag tag)
263 {
264 if (!HasTagInfo(tag)) {
265 return nullptr;
266 }
267 return &std::get<1>(g_tagInfoMap.at(tag));
268 }
269
HasAudSampleFmtInfo(AudioSampleFormat fmt)270 inline bool HasAudSampleFmtInfo(AudioSampleFormat fmt)
271 {
272 return g_auSampleFmtStrMap.count(fmt) != 0;
273 }
274
GetAudSampleFmtNameStr(AudioSampleFormat fmt)275 inline const char* GetAudSampleFmtNameStr(AudioSampleFormat fmt)
276 {
277 if (!HasAudSampleFmtInfo(fmt)) {
278 return "null";
279 }
280 return g_auSampleFmtStrMap.at(fmt);
281 }
282
HasAudChanLyInfo(AudioChannelLayout layout)283 inline bool HasAudChanLyInfo(AudioChannelLayout layout)
284 {
285 return g_auChannelLayoutStrMap.count(layout) != 0;
286 }
287
GetAudChanLyNameStr(AudioChannelLayout layout)288 inline const char* GetAudChanLyNameStr(AudioChannelLayout layout)
289 {
290 if (!HasAudChanLyInfo(layout)) {
291 return "null";
292 }
293 return g_auChannelLayoutStrMap.at(layout);
294 }
295
HasVideoPixelFormatNameStr(VideoPixelFormat pixelFormat)296 inline bool HasVideoPixelFormatNameStr(VideoPixelFormat pixelFormat)
297 {
298 return g_videoPixelFormatStrMap.count(pixelFormat) != 0;
299 }
300
GetVideoPixelFormatNameStr(VideoPixelFormat pixelFormat)301 inline const char* GetVideoPixelFormatNameStr(VideoPixelFormat pixelFormat)
302 {
303 if (!HasVideoPixelFormatNameStr(pixelFormat)) {
304 return "null";
305 }
306 return g_videoPixelFormatStrMap.at(pixelFormat);
307 }
308
HasAuAacProfileNameStr(AudioAacProfile aacProfile)309 inline bool HasAuAacProfileNameStr(AudioAacProfile aacProfile)
310 {
311 return g_auAacProfileNameStrMap.count(aacProfile) != 0;
312 }
313
GetAuAacProfileNameStr(AudioAacProfile aacProfile)314 inline const char* GetAuAacProfileNameStr(AudioAacProfile aacProfile)
315 {
316 if (!HasAuAacProfileNameStr(aacProfile)) {
317 return "null";
318 }
319 return g_auAacProfileNameStrMap.at(aacProfile);
320 }
321
HasAacStreamFormatNameStr(AudioAacStreamFormat aacStreamFormat)322 inline bool HasAacStreamFormatNameStr(AudioAacStreamFormat aacStreamFormat)
323 {
324 return g_auAacStreamFormatNameStrMap.count(aacStreamFormat) != 0;
325 }
326
GetAuAacStreamFormatNameStr(AudioAacStreamFormat aacStreamFormat)327 inline const char* GetAuAacStreamFormatNameStr(AudioAacStreamFormat aacStreamFormat)
328 {
329 if (!HasAacStreamFormatNameStr(aacStreamFormat)) {
330 return "null";
331 }
332 return g_auAacStreamFormatNameStrMap.at(aacStreamFormat);
333 }
334
Tag2String(const Tag tag)335 inline const char* Tag2String(const Tag tag)
336 {
337 auto mapIte = g_tagInfoMap.find(tag);
338 if (mapIte == g_tagInfoMap.end()) {
339 return "NULL";
340 }
341 return std::get<0>(mapIte->second);
342 }
343 } // namespace Plugins
344 } // namespace Media
345 } // namespace OHOS
346 #endif // HISTREAMER_PIPELINE_PLUGINS_CAP_DESC_H
347