• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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