1 /*
2 * Copyright (c) 2021-2021 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 #define HST_LOG_TAG "Pip_Plugin_Utils"
17
18 #include "plugin_utils.h"
19 #include <cstdarg>
20 #include <sstream>
21 #include "foundation/log.h"
22 #include "foundation/pre_defines.h"
23 #include "plugin/common/plugin_attr_desc.h"
24
25 namespace {
26 constexpr int32_t MAX_BUF_LEN = 512; // 512 buffer size
27 #define RETURN_IF_FAILED(exec, errVal, retVal) \
28 do { \
29 auto res = exec; \
30 if (res == (errVal)) { \
31 return errVal; \
32 } else { \
33 (retVal) = res; \
34 } \
35 } while (0)
36
37 #define RETURN_IF_SNPRI_FAILED(exec, snPrintRet, retVal) \
38 do { \
39 snPrintRet = exec; \
40 if ((snPrintRet) == -1) { \
41 MEDIA_LOG_W("stringiness failed due to " PUBLIC_LOG_S " or truncated.", strerror(errno)); \
42 return retVal; \
43 } \
44 } while (0)
45
46 using namespace OHOS::Media;
47
48 template <typename T>
Stringiness(char * buf,size_t maxLen,const char * name,const T & val)49 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const T& val)
50 {
51 MEDIA_LOG_I("no cap trans function for " PUBLIC_LOG_S " may be update?", name);
52 return 0;
53 }
54
55 template <typename T>
FixedCapKeyStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)56 int32_t FixedCapKeyStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
57 const Plugin::ValueType& val)
58 {
59 int pos = 0;
60 auto ret = snprintf_truncated_s(buf, maxLen, "%s:(%s)", name, typeName);
61 if (ret == -1) {
62 return ret;
63 }
64 pos += ret;
65 auto item = Plugin::AnyCast<T>(&val);
66 RETURN_IF_FAILED(Stringiness(buf + pos, maxLen - pos, name, *item), -1, ret);
67 return pos + ret;
68 }
69
70 template<typename T>
IntervalCapKeyStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)71 int32_t IntervalCapKeyStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
72 const Plugin::ValueType& val)
73 {
74 int pos = 0;
75 auto ret = snprintf_truncated_s(buf, maxLen, "%s:(%s)[", name, typeName);
76 if (ret == -1) {
77 return ret;
78 }
79 pos += ret;
80 auto item = Plugin::AnyCast<Plugin::IntervalCapability<T>>(&val);
81 RETURN_IF_FAILED(Stringiness(buf + pos, maxLen - pos, name, item->first), -1, ret);
82 pos += ret;
83 RETURN_IF_FAILED(snprintf_truncated_s(buf + pos, maxLen - pos, ", "), -1, ret);
84 pos += ret;
85 RETURN_IF_FAILED(Stringiness(buf + pos, maxLen - pos, name, item->second), -1, ret);
86 pos += ret;
87 RETURN_IF_FAILED(snprintf_truncated_s(buf + pos, maxLen - pos, "]"), -1, ret);
88 return pos + ret;
89 }
90
91 template<typename T>
DiscreteCapKeyStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)92 int32_t DiscreteCapKeyStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
93 const Plugin::ValueType& val)
94 {
95 int pos = 0;
96 auto ret = snprintf_truncated_s(buf, maxLen, "%s:(%s){", name, typeName);
97 if (ret == -1) {
98 return ret;
99 }
100 pos += ret;
101 auto item = Plugin::AnyCast<Plugin::DiscreteCapability<T>>(&val);
102 int32_t i = 0;
103 int32_t length = item->size();
104 for (; i < length - 1; i++) {
105 RETURN_IF_FAILED(Stringiness<T>(buf + pos, maxLen - pos, name, item->at(i)), -1, ret);
106 pos += ret;
107 RETURN_IF_FAILED(snprintf_truncated_s(buf + pos, maxLen - pos, ", "), -1, ret);
108 pos += ret;
109 }
110 if (i == length - 1) {
111 RETURN_IF_FAILED(Stringiness<T>(buf + pos, maxLen - pos, name, item->at(i)), -1, ret);
112 pos += ret;
113 }
114 RETURN_IF_FAILED(snprintf_truncated_s(buf + pos, maxLen - pos, "}"), -1, ret);
115 return pos + ret;
116 }
117
118 template<typename T>
CapKeyStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)119 int32_t CapKeyStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
120 const Plugin::ValueType& val)
121 {
122 if (val.SameTypeWith(typeid(Plugin::FixedCapability<T>))) {
123 return FixedCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
124 } else if (val.SameTypeWith(typeid(Plugin::IntervalCapability<T>))) {
125 return IntervalCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
126 } else if (val.SameTypeWith(typeid(Plugin::DiscreteCapability<T>))) {
127 return DiscreteCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
128 } else {
129 MEDIA_LOG_W("cap " PUBLIC_LOG_S "type mismatches when cast to string, which should be " PUBLIC_LOG_S,
130 name, typeName);
131 }
132 return -1;
133 }
134 template <>
Stringiness(char * buf,size_t maxLen,const char * name,const int32_t & val)135 MEDIA_UNUSED int32_t Stringiness(char* buf, size_t maxLen, const char* name, const int32_t& val)
136 {
137 return snprintf_truncated_s(buf, maxLen, "%" PRIi32, val);
138 }
139
140 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const uint32_t & val)141 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const uint32_t& val)
142 {
143 return snprintf_truncated_s(buf, maxLen, "%" PRIu32, val);
144 }
145
146 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const std::string & val)147 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const std::string& val)
148 {
149 return snprintf_truncated_s(buf, maxLen, "%s", val.c_str());
150 }
151
152 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const int64_t & val)153 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const int64_t& val)
154 {
155 return snprintf_truncated_s(buf, maxLen, "%" PRId64, val);
156 }
157
158 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const uint64_t & val)159 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const uint64_t& val)
160 {
161 return snprintf_truncated_s(buf, maxLen, "%" PRIu64, val);
162 }
163
164 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioSampleFormat & val)165 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioSampleFormat& val)
166 {
167 if (Plugin::g_auSampleFmtStrMap.count(val) == 0) {
168 MEDIA_LOG_W("audio sample format " PUBLIC_LOG_D32 " is unknown", static_cast<int32_t>(val));
169 return 0;
170 }
171 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_auSampleFmtStrMap.at(val));
172 }
173
174 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioChannelLayout & val)175 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioChannelLayout& val)
176 {
177 if (Plugin::g_auChannelLayoutStrMap.count(val) == 0) {
178 MEDIA_LOG_W("audio channel layout " PUBLIC_LOG_U64 " is unknown", static_cast<uint64_t>(val));
179 return 0;
180 }
181 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_auChannelLayoutStrMap.at(val));
182 }
183
184 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::VideoPixelFormat & val)185 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::VideoPixelFormat& val)
186 {
187 if (Plugin::g_videoPixelFormatStrMap.count(val) == 0) {
188 MEDIA_LOG_W("video pixel format " PUBLIC_LOG_U32 " is unknown", static_cast<uint32_t>(val));
189 return 0;
190 }
191 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_videoPixelFormatStrMap.at(val));
192 }
193
194 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::VideoBitStreamFormat & val)195 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::VideoBitStreamFormat& val)
196 {
197 if (Plugin::g_vdBitStreamFormatStrMap.count(val) == 0) {
198 MEDIA_LOG_W("video bit stream format " PUBLIC_LOG_U32 " is unknown", static_cast<uint32_t>(val));
199 return 0;
200 }
201 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_vdBitStreamFormatStrMap.at(val));
202 }
203
204 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioAacProfile & val)205 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioAacProfile& val)
206 {
207 if (Plugin::g_auAacProfileNameStrMap.count(val) == 0) {
208 MEDIA_LOG_W("audio aac profile name " PUBLIC_LOG_U8 " is unknown", static_cast<uint8_t>(val));
209 return 0;
210 }
211 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_auAacProfileNameStrMap.at(val));
212 }
213
214 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioAacStreamFormat & val)215 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioAacStreamFormat& val)
216 {
217 if (Plugin::g_auAacStreamFormatNameStrMap.count(val) == 0) {
218 MEDIA_LOG_W("audio aac stream format name " PUBLIC_LOG_U8 " is unknown", static_cast<uint8_t>(val));
219 return 0;
220 }
221 return snprintf_truncated_s(buf, maxLen, "%s", Plugin::g_auAacStreamFormatNameStrMap.at(val));
222 }
223
224 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::CodecConfig & val)225 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::CodecConfig& val)
226 {
227 return snprintf_truncated_s(buf, maxLen, "...");
228 }
229
230 template<typename T>
MetaIDStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)231 int32_t MetaIDStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
232 const Plugin::ValueType& val)
233 {
234 if (val.SameTypeWith(typeid(T))) {
235 return FixedCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
236 } else if (val.SameTypeWith(typeid(Plugin::DiscreteCapability<T>))) {
237 return DiscreteCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
238 } else {
239 MEDIA_LOG_W("meta " PUBLIC_LOG_S " type mismatches when cast to string", name);
240 }
241 return -1;
242 }
243 using CapStrnessFunc = std::function<int32_t(char*, size_t, const char*, const char*, const Plugin::ValueType&)>;
244
245 std::map<Plugin::Tag, CapStrnessFunc> g_metaStrnessMap = {
246 {Plugin::Tag::MIME, CapKeyStringiness<std::string>},
247 {Plugin::Tag::TRACK_ID, MetaIDStringiness<uint32_t>},
248 {Plugin::Tag::MEDIA_CODEC_CONFIG, MetaIDStringiness<std::vector<uint8_t>>},
249 {Plugin::Tag::AUDIO_CHANNELS, MetaIDStringiness<uint32_t>},
250 {Plugin::Tag::AUDIO_SAMPLE_RATE, MetaIDStringiness<uint32_t>},
251 {Plugin::Tag::AUDIO_SAMPLE_FORMAT, MetaIDStringiness<Plugin::AudioSampleFormat>},
252 {Plugin::Tag::AUDIO_SAMPLE_PER_FRAME, MetaIDStringiness<uint32_t>},
253 {Plugin::Tag::AUDIO_CHANNEL_LAYOUT, MetaIDStringiness<Plugin::AudioChannelLayout>},
254 {Plugin::Tag::AUDIO_OUTPUT_CHANNELS, MetaIDStringiness<uint32_t>},
255 {Plugin::Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, MetaIDStringiness<Plugin::AudioChannelLayout>},
256 {Plugin::Tag::MEDIA_TITLE, MetaIDStringiness<std::string>},
257 {Plugin::Tag::MEDIA_ARTIST, MetaIDStringiness<std::string>},
258 {Plugin::Tag::MEDIA_LYRICIST, MetaIDStringiness<std::string>},
259 {Plugin::Tag::MEDIA_ALBUM, MetaIDStringiness<std::string>},
260 {Plugin::Tag::MEDIA_ALBUM_ARTIST, MetaIDStringiness<std::string>},
261 {Plugin::Tag::MEDIA_DATE, MetaIDStringiness<std::string>},
262 {Plugin::Tag::MEDIA_COMMENT, MetaIDStringiness<std::string>},
263 {Plugin::Tag::MEDIA_GENRE, MetaIDStringiness<std::string>},
264 {Plugin::Tag::MEDIA_DESCRIPTION, MetaIDStringiness<std::string>},
265 {Plugin::Tag::MEDIA_COPYRIGHT, MetaIDStringiness<std::string>},
266 {Plugin::Tag::MEDIA_LANGUAGE, MetaIDStringiness<std::string>},
267 {Plugin::Tag::MEDIA_LYRICS, MetaIDStringiness<std::string>},
268 {Plugin::Tag::MEDIA_DURATION, MetaIDStringiness<int64_t>},
269 {Plugin::Tag::MEDIA_BITRATE, MetaIDStringiness<int64_t>},
270 {Plugin::Tag::MEDIA_FILE_URI, MetaIDStringiness<std::string>},
271 {Plugin::Tag::MEDIA_FILE_SIZE, MetaIDStringiness<uint64_t>},
272 {Plugin::Tag::MEDIA_SEEKABLE, MetaIDStringiness<Plugin::Seekable>},
273 {Plugin::Tag::AUDIO_MPEG_VERSION, MetaIDStringiness<uint32_t>},
274 {Plugin::Tag::AUDIO_MPEG_LAYER, MetaIDStringiness<uint32_t>},
275 {Plugin::Tag::AUDIO_AAC_PROFILE, MetaIDStringiness<Plugin::AudioAacProfile>},
276 {Plugin::Tag::AUDIO_AAC_LEVEL, MetaIDStringiness<uint32_t>},
277 {Plugin::Tag::AUDIO_AAC_STREAM_FORMAT, MetaIDStringiness<Plugin::AudioAacStreamFormat>},
278 {Plugin::Tag::VIDEO_WIDTH, MetaIDStringiness<uint32_t>},
279 {Plugin::Tag::VIDEO_HEIGHT, MetaIDStringiness<uint32_t>},
280 {Plugin::Tag::VIDEO_FRAME_RATE, MetaIDStringiness<uint32_t>},
281 {Plugin::Tag::VIDEO_PIXEL_FORMAT, MetaIDStringiness<Plugin::VideoPixelFormat>},
282 {Plugin::Tag::VIDEO_BIT_STREAM_FORMAT, MetaIDStringiness<Plugin::VideoBitStreamFormat>},
283 {Plugin::Tag::BITS_PER_CODED_SAMPLE, MetaIDStringiness<uint32_t>},
284 };
285 }
286
287 namespace OHOS {
288 namespace Media {
289 namespace Pipeline {
290 template<typename T>
AssignParameterIfMatch(Tag tag,T & ret,const Plugin::ValueType & val)291 bool AssignParameterIfMatch(Tag tag, T& ret, const Plugin::ValueType& val)
292 {
293 if (Plugin::HasTagInfo(tag)) {
294 if (val.SameTypeWith(*Plugin::GetTagDefValue(tag)) && val.SameTypeWith(typeid(T))) {
295 ret = Plugin::AnyCast<T>(val);
296 return true;
297 } else {
298 MEDIA_LOG_I("type of " PUBLIC_LOG_S " mismatch, should be " PUBLIC_LOG_S,
299 Plugin::GetTagStrName(tag), Plugin::GetTagTypeStrName(tag));
300 }
301 } else {
302 MEDIA_LOG_I("tag " PUBLIC_LOG_D32 " is not in map, may be update it?", tag);
303 }
304 return false;
305 }
306
307 template bool AssignParameterIfMatch(Tag tag, Plugin::SrcInputType& ret, const Plugin::ValueType& val);
308 template bool AssignParameterIfMatch(Tag tag, uint32_t& ret, const Plugin::ValueType& val);
309 template bool AssignParameterIfMatch(Tag tag, uint64_t& ret, const Plugin::ValueType& val);
310 template bool AssignParameterIfMatch(Tag tag, int32_t& ret, const Plugin::ValueType& val);
311 template bool AssignParameterIfMatch(Tag tag, int64_t& ret, const Plugin::ValueType& val);
312 template bool AssignParameterIfMatch(Tag tag, double& ret, const Plugin::ValueType& val);
313 template bool AssignParameterIfMatch(Tag tag, Plugin::AudioSampleFormat& ret, const Plugin::ValueType& val);
314 template bool AssignParameterIfMatch(Tag tag, Plugin::AudioChannelLayout& ret, const Plugin::ValueType& val);
315
316 /**
317 * translate plugin error into pipeline error code
318 * @param pluginError
319 * @return
320 */
TranslatePluginStatus(Plugin::Status pluginError)321 OHOS::Media::ErrorCode TranslatePluginStatus(Plugin::Status pluginError)
322 {
323 const static std::map<Plugin::Status, ErrorCode> g_transTable = {
324 {Plugin::Status::END_OF_STREAM, ErrorCode::END_OF_STREAM},
325 {Plugin::Status::OK, ErrorCode::SUCCESS},
326 {Plugin::Status::NO_ERROR, ErrorCode::SUCCESS},
327 {Plugin::Status::ERROR_UNKNOWN, ErrorCode::ERROR_UNKNOWN},
328 {Plugin::Status::ERROR_PLUGIN_ALREADY_EXISTS, ErrorCode::ERROR_UNKNOWN},
329 {Plugin::Status::ERROR_INCOMPATIBLE_VERSION, ErrorCode::ERROR_UNKNOWN},
330 {Plugin::Status::ERROR_NO_MEMORY, ErrorCode::ERROR_NO_MEMORY},
331 {Plugin::Status::ERROR_WRONG_STATE, ErrorCode::ERROR_INVALID_OPERATION},
332 {Plugin::Status::ERROR_UNIMPLEMENTED, ErrorCode::ERROR_UNIMPLEMENTED},
333 {Plugin::Status::ERROR_INVALID_PARAMETER, ErrorCode::ERROR_INVALID_PARAMETER_VALUE},
334 {Plugin::Status::ERROR_INVALID_DATA, ErrorCode::ERROR_UNKNOWN},
335 {Plugin::Status::ERROR_MISMATCHED_TYPE, ErrorCode::ERROR_INVALID_PARAMETER_TYPE},
336 {Plugin::Status::ERROR_TIMED_OUT, ErrorCode::ERROR_TIMED_OUT},
337 {Plugin::Status::ERROR_UNSUPPORTED_FORMAT, ErrorCode::ERROR_UNSUPPORTED_FORMAT},
338 {Plugin::Status::ERROR_NOT_ENOUGH_DATA, ErrorCode::ERROR_UNKNOWN},
339 {Plugin::Status::ERROR_NOT_EXISTED, ErrorCode::ERROR_NOT_EXISTED},
340 {Plugin::Status::ERROR_AGAIN, ErrorCode::ERROR_AGAIN},
341 {Plugin::Status::ERROR_PERMISSION_DENIED, ErrorCode::ERROR_PERMISSION_DENIED},
342 {Plugin::Status::ERROR_DELAY_READY, ErrorCode::SUCCESS},
343 };
344 auto ite = g_transTable.find(pluginError);
345 if (ite == g_transTable.end()) {
346 return ErrorCode::ERROR_UNKNOWN;
347 }
348 return ite->second;
349 }
350
TranslateIntoParameter(const int & key,OHOS::Media::Plugin::Tag & tag)351 bool TranslateIntoParameter(const int& key, OHOS::Media::Plugin::Tag& tag)
352 {
353 if (key < static_cast<int32_t>(OHOS::Media::Plugin::Tag::INVALID)) {
354 return false;
355 }
356 tag = static_cast<OHOS::Media::Plugin::Tag>(key);
357 return true;
358 }
359
FindAvailablePlugins(const Plugin::Capability & upStreamCaps,Plugin::PluginType pluginType,Plugin::CodecMode preferredCodecMode)360 std::vector<std::pair<std::shared_ptr<Plugin::PluginInfo>, Plugin::Capability>> FindAvailablePlugins(
361 const Plugin::Capability& upStreamCaps, Plugin::PluginType pluginType, Plugin::CodecMode preferredCodecMode)
362 {
363 auto pluginNames = Plugin::PluginManager::Instance().ListPlugins(pluginType, preferredCodecMode);
364 std::vector<std::pair<std::shared_ptr<Plugin::PluginInfo>, Plugin::Capability>> infos;
365 for (const auto& name : pluginNames) {
366 auto tmpInfo = Plugin::PluginManager::Instance().GetPluginInfo(pluginType, name);
367 Capability cap;
368 if (ApplyCapabilitySet(upStreamCaps, tmpInfo->inCaps, cap)) {
369 infos.emplace_back(tmpInfo, cap);
370 }
371 }
372 return infos;
373 }
374
FindAvailablePluginsByOutputMime(const std::string & outputMime,Plugin::PluginType pluginType)375 std::vector<std::shared_ptr<Plugin::PluginInfo>> FindAvailablePluginsByOutputMime(const std::string& outputMime,
376 Plugin::PluginType pluginType)
377 {
378 auto pluginNames = Plugin::PluginManager::Instance().ListPlugins(pluginType);
379 std::vector<std::shared_ptr<Plugin::PluginInfo>> rets;
380 for (const auto& name : pluginNames) {
381 auto tmpInfo = Plugin::PluginManager::Instance().GetPluginInfo(pluginType, name);
382 for (const auto& cap : tmpInfo->outCaps) {
383 if (cap.mime == outputMime) {
384 rets.emplace_back(tmpInfo);
385 break;
386 }
387 }
388 }
389 return rets;
390 }
GetBytesPerSample(Plugin::AudioSampleFormat fmt)391 uint8_t GetBytesPerSample(Plugin::AudioSampleFormat fmt)
392 {
393 uint8_t bytesPerSample = 0;
394 switch (fmt) {
395 case Plugin::AudioSampleFormat::S64:
396 case Plugin::AudioSampleFormat::S64P:
397 case Plugin::AudioSampleFormat::U64:
398 case Plugin::AudioSampleFormat::U64P:
399 case Plugin::AudioSampleFormat::F64:
400 case Plugin::AudioSampleFormat::F64P:
401 bytesPerSample = 8; // 8 bytes
402 break;
403 case Plugin::AudioSampleFormat::F32:
404 case Plugin::AudioSampleFormat::F32P:
405 case Plugin::AudioSampleFormat::S32:
406 case Plugin::AudioSampleFormat::S32P:
407 case Plugin::AudioSampleFormat::U32:
408 case Plugin::AudioSampleFormat::U32P:
409 bytesPerSample = 4; // 4 bytes
410 break;
411 case Plugin::AudioSampleFormat::S24:
412 case Plugin::AudioSampleFormat::S24P:
413 case Plugin::AudioSampleFormat::U24:
414 case Plugin::AudioSampleFormat::U24P:
415 bytesPerSample = 3; // 3 bytes
416 break;
417 case Plugin::AudioSampleFormat::S16:
418 case Plugin::AudioSampleFormat::S16P:
419 case Plugin::AudioSampleFormat::U16:
420 case Plugin::AudioSampleFormat::U16P:
421 bytesPerSample = 2; // 2 bytes
422 break;
423 case Plugin::AudioSampleFormat::S8:
424 case Plugin::AudioSampleFormat::S8P:
425 case Plugin::AudioSampleFormat::U8:
426 case Plugin::AudioSampleFormat::U8P:
427 bytesPerSample = 1; // 1 bytes
428 break;
429 default:
430 bytesPerSample = 0;
431 break;
432 }
433 return bytesPerSample;
434 }
435
Capability2String(const Capability & capability)436 std::string Capability2String(const Capability& capability)
437 {
438 const static std::map<Capability::Key, CapStrnessFunc> capStrnessMap = {
439 {Capability::Key::MEDIA_BITRATE, CapKeyStringiness<int64_t>},
440 {Capability::Key::AUDIO_SAMPLE_RATE, CapKeyStringiness<uint32_t>},
441 {Capability::Key::AUDIO_CHANNELS, CapKeyStringiness<uint32_t>},
442 {Capability::Key::AUDIO_CHANNEL_LAYOUT, CapKeyStringiness<Plugin::AudioChannelLayout>},
443 {Capability::Key::AUDIO_SAMPLE_FORMAT, CapKeyStringiness<Plugin::AudioSampleFormat>},
444 {Capability::Key::AUDIO_MPEG_VERSION, CapKeyStringiness<uint32_t>},
445 {Capability::Key::AUDIO_MPEG_LAYER, CapKeyStringiness<uint32_t>},
446 {Capability::Key::AUDIO_AAC_PROFILE, CapKeyStringiness<Plugin::AudioAacProfile>},
447 {Capability::Key::AUDIO_AAC_LEVEL, CapKeyStringiness<uint32_t>},
448 {Capability::Key::AUDIO_AAC_STREAM_FORMAT, CapKeyStringiness<Plugin::AudioAacStreamFormat>},
449 {Capability::Key::VIDEO_PIXEL_FORMAT, CapKeyStringiness<Plugin::VideoPixelFormat>},
450 {Capability::Key::VIDEO_BIT_STREAM_FORMAT, CapKeyStringiness<Plugin::VideoBitStreamFormat>},
451 };
452 char buffer[MAX_BUF_LEN] = {0};
453 int pos = 0;
454 int32_t ret = 0;
455 RETURN_IF_SNPRI_FAILED(
456 snprintf_truncated_s(buffer, sizeof(buffer), "Capability{mime:%s, ", capability.mime.c_str()), ret, {});
457 pos += ret;
458 bool needEtc = false;
459 for (const auto& cap : capability.keys) {
460 if (pos >= MAX_BUF_LEN - 1) { // reserve for "}"
461 needEtc = true;
462 break;
463 }
464 if (capStrnessMap.count(cap.first) == 0 || !Plugin::HasTagInfo(static_cast<Tag>(cap.first))) {
465 MEDIA_LOG_W(PUBLIC_LOG_D32 " is not in map, may be new key which is not contained?", cap.first);
466 continue;
467 }
468 const auto& info = Plugin::g_tagInfoMap.at(static_cast<Tag>(cap.first));
469 RETURN_IF_SNPRI_FAILED(capStrnessMap.at(cap.first)(buffer + pos, MAX_BUF_LEN - pos, std::get<0>(info),
470 std::get<2>(info), cap.second), ret, buffer); // secondary parameter
471 pos += ret;
472 RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, ", "), ret, buffer);
473 pos += ret;
474 }
475 if (needEtc) {
476 pos = MAX_BUF_LEN - 5; // 5 is length of " ...}"
477 snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, " ...}");
478 } else {
479 pos -= 2; // 2 is length of ", "
480 snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, "}");
481 }
482 return buffer;
483 }
484
Meta2String(const Plugin::Meta & meta)485 std::string Meta2String(const Plugin::Meta& meta)
486 {
487 char buffer[MAX_BUF_LEN + 1] = {0}; // one more is for \0
488 int pos = 0;
489 int32_t ret = 0;
490 std::string mime;
491 RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, "Meta{"), ret, {});
492 pos += ret;
493 bool needEtc = false;
494 std::vector<Tag> keys;
495 meta.GetKeys(keys);
496 for (const auto& item: keys) {
497 if (pos >= MAX_BUF_LEN - 2) { // reserve for "}\0"
498 needEtc = true;
499 break;
500 }
501 if (!Plugin::HasTagInfo(static_cast<Tag>(item)) || g_metaStrnessMap.count(item) == 0) {
502 MEDIA_LOG_W("meta id " PUBLIC_LOG_D32 "is not is map, may be update the info map?", item);
503 continue;
504 }
505 Plugin::ValueType value;
506 auto isValueExist = meta.GetData(item, value);
507 const auto& tuple = Plugin::g_tagInfoMap.at(static_cast<Tag>(item));
508 if (isValueExist) {
509 RETURN_IF_SNPRI_FAILED(g_metaStrnessMap.at(item)(buffer + pos, MAX_BUF_LEN - pos,
510 std::get<0>(tuple), std::get<2>(tuple), value), ret, buffer); // secondary parameter
511 pos += ret;
512 RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, ", "), ret, buffer);
513 pos += ret;
514 }
515 }
516 if (needEtc) {
517 pos = MAX_BUF_LEN - 5; // 5 is length of " ...}\0"
518 snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, " ...}");
519 } else {
520 pos -= 2; // 2 is length of ", "
521 snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, "}");
522 }
523 return buffer;
524 }
525 #undef RETURN_IF_SNPRI_FAILED
526 } // namespace Pipeline
527 } // namespace Media
528 } // namespace OHOS
529