1 /*
2 * Copyright (c) 2024 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 "DemuxerLogCompressor"
17
18 #include <unordered_map>
19 #include <sstream>
20 #include "meta/meta_key.h"
21 #include "meta/meta.h"
22 #include "common/log.h"
23 #include "meta/format.h"
24 #include "demuxer_log_compressor.h"
25 #include "ffmpeg_format_helper.h"
26
27 namespace {
28 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_DEMUXER, "DemuxerLogCompressor" };
29 }
30
31 namespace OHOS {
32 namespace Media {
33 namespace Plugins {
34 namespace Ffmpeg {
35 static std::unordered_map<TagType, std::string> g_formatToIndex = {
36 {Tag::AUDIO_AAC_IS_ADTS, "adts"},
37 {Tag::AUDIO_BITS_PER_CODED_SAMPLE, "bitsPerCodedSmp"},
38 {Tag::AUDIO_BITS_PER_RAW_SAMPLE, "bitsPerRawSmp"},
39 {Tag::AUDIO_CHANNEL_COUNT, "channelCnt"},
40 {Tag::AUDIO_CHANNEL_LAYOUT, "channelLayout"},
41 {Tag::AUDIO_OUTPUT_CHANNELS, "outChannelCnt"},
42 {Tag::AUDIO_OUTPUT_CHANNEL_LAYOUT, "outChannelLayout"},
43 {Tag::AUDIO_SAMPLE_FORMAT, "smpFmt"},
44 {Tag::AUDIO_SAMPLE_PER_FRAME, "smpFrm"},
45 {Tag::AUDIO_SAMPLE_RATE, "smpRate"},
46 {Tag::AUDIO_OBJECT_NUMBER, "objCnt"},
47 {Tag::AUDIO_HOA_ORDER, "haoOrder"},
48 {Tag::AUDIO_SOUNDBED_CHANNELS_NUMBER, "soundbedChannelsCnt"},
49 {Tag::MEDIA_ALBUM, "album"},
50 {Tag::MEDIA_ALBUM_ARTIST, "albumArt"},
51 {Tag::MEDIA_ARTIST, "art"},
52 {Tag::MEDIA_AUTHOR, "auth"},
53 {Tag::MEDIA_BITRATE, "bitRate"},
54 {Tag::MEDIA_CODEC_CONFIG, "csd"},
55 {Tag::MEDIA_COMMENT, "comment"},
56 {Tag::MEDIA_COMPOSER, "composer"},
57 {Tag::MEDIA_CONTAINER_START_TIME, "containStartTime"},
58 {Tag::MEDIA_COPYRIGHT, "copyright"},
59 {Tag::MEDIA_COVER, "cover"},
60 {Tag::MEDIA_CREATION_TIME, "createTime"},
61 {Tag::MEDIA_DATE, "date"},
62 {Tag::MEDIA_DESCRIPTION, "desc"},
63 {Tag::MEDIA_DURATION, "duration"},
64 {Tag::MEDIA_FILE_TYPE, "fileType"},
65 {Tag::MEDIA_GENRE, "gnre"},
66 {Tag::MEDIA_HAS_AUDIO, "hasAud"},
67 {Tag::MEDIA_HAS_SUBTITLE, "hasSub"},
68 {Tag::MEDIA_HAS_TIMEDMETA, "hasTimed"},
69 {Tag::MEDIA_HAS_VIDEO, "hasVid"},
70 {Tag::MEDIA_LANGUAGE, "lang"},
71 {Tag::MEDIA_LATITUDE, "latitude"},
72 {Tag::MEDIA_LEVEL, "level"},
73 {Tag::MEDIA_LONGITUDE, "longitude"},
74 {Tag::MEDIA_LYRICS, "lyrics"},
75 {Tag::MEDIA_PROFILE, "profile"},
76 {Tag::MEDIA_START_TIME, "trackStartTime"},
77 {Tag::MEDIA_TITLE, "title"},
78 {Tag::MEDIA_TRACK_COUNT, "trackCnt"},
79 {Tag::MEDIA_TYPE, "trackType"},
80 {Tag::MIME_TYPE, "mime"},
81 {Tag::TIMED_METADATA_KEY, "metaKey"},
82 {Tag::TIMED_METADATA_SRC_TRACK, "metaSrcTrack"},
83 {Tag::VIDEO_CHROMA_LOCATION, "chromaLoc"},
84 {Tag::VIDEO_COLOR_MATRIX_COEFF, "colorMatrix"},
85 {Tag::VIDEO_COLOR_PRIMARIES, "colorPri"},
86 {Tag::VIDEO_COLOR_RANGE, "colorRange"},
87 {Tag::VIDEO_COLOR_TRC, "colorTrc"},
88 {Tag::VIDEO_DELAY, "delay"},
89 {Tag::VIDEO_FRAME_RATE, "frmRate"},
90 {Tag::VIDEO_H265_LEVEL, "265level"},
91 {Tag::VIDEO_H265_PROFILE, "265profile"},
92 {Tag::VIDEO_HEIGHT, "h"},
93 {Tag::VIDEO_IS_HDR_VIVID, "hdrVivid"},
94 {Tag::VIDEO_ORIENTATION_TYPE, "orient"},
95 {Tag::VIDEO_ROTATION, "rotate"},
96 {Tag::VIDEO_SAR, "sar"},
97 {Tag::VIDEO_WIDTH, "w"},
98 };
99
FormatTagSerialize(Format & format)100 std::string DemuxerLogCompressor::FormatTagSerialize(Format& format)
101 {
102 std::stringstream dumpStr;
103 auto meta = format.GetMeta();
104 for (auto iter = meta->begin(); iter != meta->end(); ++iter) {
105 if (g_formatToIndex.find(iter->first) == g_formatToIndex.end()) {
106 dumpStr << iter->first << "=" << AnyCast<std::string>(iter->second) << "|";
107 continue;
108 }
109 switch (format.GetValueType(iter->first)) {
110 case FORMAT_TYPE_INT32:
111 dumpStr << g_formatToIndex[iter->first] << "=" << std::to_string(AnyCast<int32_t>(iter->second)) << "|";
112 break;
113 case FORMAT_TYPE_INT64:
114 dumpStr << g_formatToIndex[iter->first] << "=" << std::to_string(AnyCast<int64_t>(iter->second)) << "|";
115 break;
116 case FORMAT_TYPE_FLOAT:
117 dumpStr << g_formatToIndex[iter->first] << "=" << std::to_string(AnyCast<float>(iter->second)) << "|";
118 break;
119 case FORMAT_TYPE_DOUBLE:
120 dumpStr << g_formatToIndex[iter->first] << "=" << std::to_string(AnyCast<double>(iter->second)) << "|";
121 break;
122 case FORMAT_TYPE_STRING:
123 dumpStr << g_formatToIndex[iter->first] << "=" << AnyCast<std::string>(iter->second) << "|";
124 break;
125 case FORMAT_TYPE_ADDR: {
126 Any *value = const_cast<Any *>(&(iter->second));
127 if (AnyCast<std::vector<uint8_t>>(value) != nullptr) {
128 dumpStr << g_formatToIndex[iter->first] << ", size="
129 << (AnyCast<std::vector<uint8_t>>(value))->size() << "|";
130 }
131 break;
132 }
133 default:
134 MEDIA_LOG_E("Stringify failed, Key " PUBLIC_LOG_S, iter->first.c_str());
135 }
136 }
137 return dumpStr.str();
138 }
139
StringifyMeta(Meta meta,int32_t trackIndex)140 void DemuxerLogCompressor::StringifyMeta(Meta meta, int32_t trackIndex)
141 {
142 OHOS::Media::Format format;
143 for (TagType key: g_supportSourceFormat) {
144 if (meta.Find(std::string(key)) != meta.end()) {
145 meta.SetData(std::string(key), "*");
146 }
147 }
148 if (meta.Find(std::string(Tag::MEDIA_CONTAINER_START_TIME)) != meta.end()) {
149 meta.SetData(std::string(Tag::MEDIA_CONTAINER_START_TIME), "*");
150 }
151 if (meta.Find(std::string(Tag::MEDIA_START_TIME)) != meta.end()) {
152 meta.SetData(std::string(Tag::MEDIA_START_TIME), "*");
153 }
154 if (meta.Find(std::string(Tag::MEDIA_LATITUDE)) != meta.end()) {
155 meta.SetData(std::string(Tag::MEDIA_LATITUDE), "*");
156 }
157 if (meta.Find(std::string(Tag::MEDIA_LONGITUDE)) != meta.end()) {
158 meta.SetData(std::string(Tag::MEDIA_LONGITUDE), "*");
159 }
160 if (meta.Find(std::string(Tag::TIMED_METADATA_KEY)) != meta.end()) {
161 meta.SetData(std::string(Tag::TIMED_METADATA_KEY), "*");
162 }
163 if (meta.Find(std::string(Tag::TIMED_METADATA_SRC_TRACK)) != meta.end()) {
164 meta.SetData(std::string(Tag::TIMED_METADATA_SRC_TRACK), "*");
165 }
166 format.SetMeta(std::make_shared<Meta>(meta));
167 if (trackIndex < 0) {
168 MEDIA_LOG_I("[source]: " PUBLIC_LOG_S, FormatTagSerialize(format).c_str());
169 } else {
170 MEDIA_LOG_I("[track " PUBLIC_LOG_D32 "]: " PUBLIC_LOG_S, trackIndex, FormatTagSerialize(format).c_str());
171 }
172 }
173 } // namespace Ffmpeg
174 } // namespace Plugins
175 } // namespace Media
176 } // namespace OHOS