• 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 
22 #include "foundation/log.h"
23 #include "pipeline/core/plugin_attr_desc.h"
24 
25 namespace {
26 constexpr int32_t MAX_BUF_LEN = 512;
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 std::vector<int8_t> & val)165 MEDIA_UNUSED int32_t Stringiness(char* buf, size_t maxLen, const char* name, const std::vector<int8_t>& val)
166 {
167     return snprintf_truncated_s(buf, maxLen, "%p", val.data());
168 }
169 
170 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioSampleFormat & val)171 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioSampleFormat& val)
172 {
173     if (Pipeline::g_auSampleFmtStrMap.count(val) == 0) {
174         MEDIA_LOG_W("audio sample format %" PUBLIC_LOG_D32 " is unknown", static_cast<int32_t>(val));
175         return 0;
176     }
177     return snprintf_truncated_s(buf, maxLen, "%s", Pipeline::g_auSampleFmtStrMap.at(val));
178 }
179 
180 template<>
Stringiness(char * buf,size_t maxLen,const char * name,const Plugin::AudioChannelLayout & val)181 int32_t Stringiness(char* buf, size_t maxLen, const char* name, const Plugin::AudioChannelLayout& val)
182 {
183     if (Pipeline::g_auChannelLayoutStrMap.count(val) == 0) {
184         MEDIA_LOG_W("audio channel layout %" PUBLIC_LOG_U64 " is unknown", static_cast<uint64_t>(val));
185         return 0;
186     }
187     return snprintf_truncated_s(buf, maxLen, "%s", Pipeline::g_auChannelLayoutStrMap.at(val));
188 }
189 
190 template<typename T>
MetaIDStringiness(char * buf,size_t maxLen,const char * name,const char * typeName,const Plugin::ValueType & val)191 int32_t MetaIDStringiness(char* buf, size_t maxLen, const char* name, const char* typeName,
192                           const Plugin::ValueType& val)
193 {
194     if (val.SameTypeWith(typeid(T))) {
195         return FixedCapKeyStringiness<T>(buf, maxLen, name, typeName, val);
196     } else {
197         MEDIA_LOG_W("meta %" PUBLIC_LOG_S " type mismatches when cast to string", name);
198     }
199     return -1;
200 }
201 
202 using CapStrnessFunc = std::function<int32_t(char*, size_t, const char*, const char*, const Plugin::ValueType&)>;
203 
204 std::map<Plugin::MetaID, CapStrnessFunc> g_metaStrnessMap = {
205     {Plugin::MetaID::MIME, MetaIDStringiness<std::string>},
206     {Plugin::MetaID::TRACK_ID, MetaIDStringiness<uint32_t>},
207     {Plugin::MetaID::MEDIA_CODEC_CONFIG,MetaIDStringiness<std::vector<uint8_t>>},
208     {Plugin::MetaID::AUDIO_CHANNELS, MetaIDStringiness<uint32_t>},
209     {Plugin::MetaID::AUDIO_SAMPLE_RATE, MetaIDStringiness<uint32_t>},
210     {Plugin::MetaID::AUDIO_SAMPLE_FORMAT, MetaIDStringiness<Plugin::AudioSampleFormat>},
211     {Plugin::MetaID::AUDIO_SAMPLE_PER_FRAME, MetaIDStringiness<uint32_t>},
212     {Plugin::MetaID::AUDIO_CHANNEL_LAYOUT, MetaIDStringiness<Plugin::AudioChannelLayout>},
213     {Plugin::MetaID::MEDIA_TITLE, MetaIDStringiness<std::string>},
214     {Plugin::MetaID::MEDIA_ARTIST, MetaIDStringiness<std::string>},
215     {Plugin::MetaID::MEDIA_LYRICIST, MetaIDStringiness<std::string>},
216     {Plugin::MetaID::MEDIA_ALBUM, MetaIDStringiness<std::string>},
217     {Plugin::MetaID::MEDIA_ALBUM_ARTIST, MetaIDStringiness<std::string>},
218     {Plugin::MetaID::MEDIA_DATE, MetaIDStringiness<std::string>},
219     {Plugin::MetaID::MEDIA_COMMENT, MetaIDStringiness<std::string>},
220     {Plugin::MetaID::MEDIA_GENRE, MetaIDStringiness<std::string>},
221     {Plugin::MetaID::MEDIA_DESCRIPTION, MetaIDStringiness<std::string>},
222     {Plugin::MetaID::MEDIA_COPYRIGHT, MetaIDStringiness<std::string>},
223     {Plugin::MetaID::MEDIA_LANGUAGE, MetaIDStringiness<std::string>},
224     {Plugin::MetaID::MEDIA_LYRICS, MetaIDStringiness<std::string>},
225     {Plugin::MetaID::MEDIA_DURATION, MetaIDStringiness<uint64_t>},
226     {Plugin::MetaID::MEDIA_BITRATE, MetaIDStringiness<int64_t>},
227     {Plugin::MetaID::MEDIA_FILE_EXTENSION, MetaIDStringiness<std::string>},
228     {Plugin::MetaID::MEDIA_FILE_SIZE , MetaIDStringiness<uint64_t>},
229     {Plugin::MetaID::AUDIO_MPEG_VERSION, MetaIDStringiness<uint32_t>},
230     {Plugin::MetaID::AUDIO_MPEG_LAYER ,MetaIDStringiness<uint32_t>},
231     {Plugin::MetaID::AUDIO_AAC_PROFILE, MetaIDStringiness<Plugin::AudioAacProfile>},
232     {Plugin::MetaID::AUDIO_AAC_LEVEL, MetaIDStringiness<uint32_t>},
233     {Plugin::MetaID::AUDIO_AAC_STREAM_FORMAT, MetaIDStringiness<Plugin::AudioAacStreamFormat>},
234     {Plugin::MetaID::VIDEO_WIDTH, MetaIDStringiness<uint32_t>},
235     {Plugin::MetaID::VIDEO_HEIGHT, MetaIDStringiness<uint32_t>},
236     {Plugin::MetaID::VIDEO_PIXEL_FORMAT, MetaIDStringiness<Plugin::VideoPixelFormat>},
237 };
238 }
239 
240 namespace OHOS {
241 namespace Media {
242 namespace Pipeline {
243 /**
244  * translate plugin error into pipeline error code
245  * @param pluginError
246  * @return
247  */
TranslatePluginStatus(Plugin::Status pluginError)248 OHOS::Media::ErrorCode TranslatePluginStatus(Plugin::Status pluginError)
249 {
250     const static std::map<Plugin::Status, ErrorCode> g_transTable = {
251         {Plugin::Status::END_OF_STREAM, ErrorCode::END_OF_STREAM},
252         {Plugin::Status::OK, ErrorCode::SUCCESS},
253         {Plugin::Status::NO_ERROR, ErrorCode::SUCCESS},
254         {Plugin::Status::ERROR_UNKNOWN, ErrorCode::ERROR_UNKNOWN},
255         {Plugin::Status::ERROR_PLUGIN_ALREADY_EXISTS,ErrorCode::ERROR_UNKNOWN},
256         {Plugin::Status::ERROR_INCOMPATIBLE_VERSION, ErrorCode::ERROR_UNKNOWN},
257         {Plugin::Status::ERROR_NO_MEMORY, ErrorCode::ERROR_NO_MEMORY},
258         {Plugin::Status::ERROR_WRONG_STATE,ErrorCode::ERROR_INVALID_OPERATION},
259         {Plugin::Status::ERROR_UNIMPLEMENTED, ErrorCode::ERROR_UNIMPLEMENTED},
260         {Plugin::Status::ERROR_INVALID_PARAMETER, ErrorCode::ERROR_INVALID_PARAMETER_VALUE},
261         {Plugin::Status::ERROR_INVALID_DATA, ErrorCode::ERROR_UNKNOWN},
262         {Plugin::Status::ERROR_MISMATCHED_TYPE, ErrorCode::ERROR_INVALID_PARAMETER_TYPE},
263         {Plugin::Status::ERROR_TIMED_OUT, ErrorCode::ERROR_TIMED_OUT},
264         {Plugin::Status::ERROR_UNSUPPORTED_FORMAT, ErrorCode::ERROR_UNSUPPORTED_FORMAT},
265         {Plugin::Status::ERROR_NOT_ENOUGH_DATA,ErrorCode::ERROR_UNKNOWN},
266         {Plugin::Status::ERROR_NOT_EXISTED, ErrorCode::ERROR_NOT_EXISTED},
267         {Plugin::Status::ERROR_AGAIN, ErrorCode::ERROR_AGAIN},
268         {Plugin::Status::ERROR_PERMISSION_DENIED, ErrorCode::ERROR_PERMISSION_DENIED},
269     };
270     auto ite = g_transTable.find(pluginError);
271     if (ite == g_transTable.end()) {
272         return ErrorCode::ERROR_UNKNOWN;
273     }
274     return ite->second;
275 }
276 
TranslateIntoParameter(const int & key,OHOS::Media::Plugin::Tag & tag)277 bool TranslateIntoParameter(const int& key, OHOS::Media::Plugin::Tag& tag)
278 {
279     if (key < static_cast<int32_t>(OHOS::Media::Plugin::Tag::INVALID)) {
280         return false;
281     }
282     tag = static_cast<OHOS::Media::Plugin::Tag>(key);
283     return true;
284 }
285 
286 std::vector<std::pair<std::shared_ptr<Plugin::PluginInfo>, Plugin::Capability>>
FindAvailablePlugins(const Plugin::Capability & upStreamCaps,Plugin::PluginType pluginType)287     FindAvailablePlugins(const Plugin::Capability& upStreamCaps, Plugin::PluginType pluginType)
288 {
289     auto pluginNames = Plugin::PluginManager::Instance().ListPlugins(pluginType);
290     std::vector<std::pair<std::shared_ptr<Plugin::PluginInfo>, Plugin::Capability>> infos;
291     for (const auto& name : pluginNames) {
292         auto tmpInfo = Plugin::PluginManager::Instance().GetPluginInfo(pluginType, name);
293         Capability cap;
294         if (ApplyCapabilitySet(upStreamCaps, tmpInfo->inCaps, cap)) {
295             infos.emplace_back(tmpInfo, cap);
296         }
297     }
298     return infos;
299 }
FindAvailablePluginsByOutputMime(const std::string & outputMime,Plugin::PluginType pluginType)300 std::vector<std::shared_ptr<Plugin::PluginInfo>> FindAvailablePluginsByOutputMime(const std::string& outputMime,
301                                                                                   Plugin::PluginType pluginType)
302 {
303     auto pluginNames = Plugin::PluginManager::Instance().ListPlugins(pluginType);
304     std::vector<std::shared_ptr<Plugin::PluginInfo>> rets;
305     for (const auto& name : pluginNames) {
306         auto tmpInfo = Plugin::PluginManager::Instance().GetPluginInfo(pluginType, name);
307         for (const auto& cap : tmpInfo->outCaps) {
308             if (cap.mime == outputMime) {
309                 rets.emplace_back(tmpInfo);
310                 break;
311             }
312         }
313     }
314     return rets;
315 }
GetBytesPerSample(Plugin::AudioSampleFormat fmt)316 uint8_t GetBytesPerSample(Plugin::AudioSampleFormat fmt)
317 {
318     uint8_t bytesPerSample = 0;
319     switch (fmt) {
320         case Plugin::AudioSampleFormat::S64:
321         case Plugin::AudioSampleFormat::S64P:
322         case Plugin::AudioSampleFormat::U64:
323         case Plugin::AudioSampleFormat::U64P:
324         case Plugin::AudioSampleFormat::F64:
325         case Plugin::AudioSampleFormat::F64P:
326             bytesPerSample = 8; // 8 bytes
327             break;
328         case Plugin::AudioSampleFormat::F32:
329         case Plugin::AudioSampleFormat::F32P:
330         case Plugin::AudioSampleFormat::S32:
331         case Plugin::AudioSampleFormat::S32P:
332         case Plugin::AudioSampleFormat::U32:
333         case Plugin::AudioSampleFormat::U32P:
334             bytesPerSample = 4; // 4 bytes
335             break;
336         case Plugin::AudioSampleFormat::S24:
337         case Plugin::AudioSampleFormat::S24P:
338         case Plugin::AudioSampleFormat::U24:
339         case Plugin::AudioSampleFormat::U24P:
340             bytesPerSample = 3; // 3 bytes
341             break;
342         case Plugin::AudioSampleFormat::S16:
343         case Plugin::AudioSampleFormat::S16P:
344         case Plugin::AudioSampleFormat::U16:
345         case Plugin::AudioSampleFormat::U16P:
346             bytesPerSample = 2; // 2 bytes
347             break;
348         case Plugin::AudioSampleFormat::S8:
349         case Plugin::AudioSampleFormat::U8:
350             bytesPerSample = 1; // 1 bytes
351             break;
352         default:
353             bytesPerSample = 0;
354             break;
355     }
356     return bytesPerSample;
357 }
358 
Capability2String(const Capability & capability)359 std::string Capability2String(const Capability& capability)
360 {
361     const static std::map<Capability::Key,CapStrnessFunc> capStrnessMap = {
362         {Capability::Key::MEDIA_BITRATE, CapKeyStringiness<int64_t>},
363         {Capability::Key::AUDIO_SAMPLE_RATE, CapKeyStringiness<uint32_t>},
364         {Capability::Key::AUDIO_CHANNELS, CapKeyStringiness<uint32_t>},
365         {Capability::Key::AUDIO_CHANNEL_LAYOUT, CapKeyStringiness<Plugin::AudioChannelLayout>},
366         {Capability::Key::AUDIO_SAMPLE_FORMAT, CapKeyStringiness<Plugin::AudioSampleFormat>},
367         {Capability::Key::AUDIO_MPEG_VERSION, CapKeyStringiness<uint32_t>},
368         {Capability::Key::AUDIO_MPEG_LAYER, CapKeyStringiness<uint32_t>},
369         {Capability::Key::AUDIO_AAC_PROFILE, CapKeyStringiness<Plugin::AudioAacProfile>},
370         {Capability::Key::AUDIO_AAC_LEVEL, CapKeyStringiness<uint32_t>},
371         {Capability::Key::AUDIO_AAC_STREAM_FORMAT, CapKeyStringiness<Plugin::AudioAacStreamFormat>},
372         {Capability::Key::VIDEO_PIXEL_FORMAT, CapKeyStringiness<Plugin::VideoPixelFormat>},
373     };
374     char buffer[MAX_BUF_LEN + 1] = {0}; // one more is for \0
375     int pos = 0;
376     int32_t ret = 0;
377     RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer, MAX_BUF_LEN, "Capability{mime:%s, ", capability.mime.c_str()),
378                            ret, {});
379     pos += ret;
380     bool needEtc = false;
381     for (const auto& cap : capability.keys) {
382         if (pos >= MAX_BUF_LEN - 1) { // reserve for "}"
383             needEtc = true;
384             break;
385         }
386         if (capStrnessMap.count(cap.first) == 0 || g_tagInfoMap.count(static_cast<Tag>(cap.first)) == 0) {
387             MEDIA_LOG_W("%" PUBLIC_LOG_D32 " is not in map, may be new key which is not contained?", cap.first);
388             continue;
389         }
390         const auto& info = g_tagInfoMap.at(static_cast<Tag>(cap.first));
391         RETURN_IF_SNPRI_FAILED(capStrnessMap.at(cap.first)(buffer + pos, MAX_BUF_LEN - pos, std::get<0>(info),
392                                                            std::get<2>(info), cap.second), ret, buffer);
393         pos += ret;
394         RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, ", "), ret, buffer);
395         pos += ret;
396     }
397     if (needEtc) {
398         pos = MAX_BUF_LEN - 5; // 5 is length of " ...}"
399         snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, " ...}");
400     } else {
401         pos -= 2; // 2 is length of ", "
402         snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, "}");
403     }
404     return buffer;
405 }
406 
Meta2String(const Plugin::Meta & meta)407 std::string Meta2String(const Plugin::Meta& meta)
408 {
409     char buffer[MAX_BUF_LEN + 1] = {0}; // one more is for \0
410     int pos = 0;
411     int32_t ret = 0;
412     std::string mime;
413     RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, "Meta{"), ret, {});
414     pos += ret;
415     bool needEtc = false;
416     for (const auto & item : meta.GetMetaIDs()) {
417         if (pos >= MAX_BUF_LEN - 2) { // reserve for "}\0"
418             needEtc = true;
419             break;
420         }
421         if (g_tagInfoMap.count(static_cast<Tag>(item)) == 0 || g_metaStrnessMap.count(item) == 0) {
422             MEDIA_LOG_W("meta id %" PUBLIC_LOG_D32 "is not is map, may be update the info map?", item);
423             continue;
424         }
425         const Plugin::ValueType* tmp = meta.GetData(item);
426         const auto& tuple = g_tagInfoMap.at(static_cast<Tag>(item));
427         if (tmp) {
428             RETURN_IF_SNPRI_FAILED(g_metaStrnessMap.at(item)(buffer + pos, MAX_BUF_LEN - pos,
429                     std::get<0>(tuple), std::get<2>(tuple), *tmp), ret, buffer);
430             pos += ret;
431             RETURN_IF_SNPRI_FAILED(snprintf_truncated_s(buffer + pos, MAX_BUF_LEN - pos, ", "), ret, buffer);
432             pos += ret;
433         }
434     }
435     if (needEtc) {
436         pos = MAX_BUF_LEN - 5; // 5 is length of " ...}\0"
437         snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, " ...}");
438     } else {
439         pos -= 2; // 2 is length of ", "
440         snprintf_truncated_s(buffer + pos, MAX_BUF_LEN + 1 - pos, "}");
441     }
442     return buffer;
443 }
444 #undef RETURN_IF_SNPRI_FAILED
445 } // namespace Pipeline
446 } // namespace Media
447 } // namespace OHOS
448