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