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