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