• 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 #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