1 /*
2  * Copyright (C) 2023 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 #include <avcodec_sysevent.h>
17 #include <unistd.h>
18 #include <unordered_map>
19 #include "securec.h"
20 #include "avcodec_log.h"
21 #include "avcodec_errors.h"
22 #include "dump_usage.h"
23 
24 namespace {
25 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FRAMEWORK, "AVCodecDFX"};
26 constexpr char HISYSEVENT_DOMAIN_AVCODEC[] = "AV_CODEC";
27 
28 const std::unordered_map<OHOS::MediaAVCodec::FaultType, std::string> FAULT_TYPE_TO_STRING = {
29     {OHOS::MediaAVCodec::FaultType::FAULT_TYPE_FREEZE,          "Freeze"},
30     {OHOS::MediaAVCodec::FaultType::FAULT_TYPE_CRASH,           "Crash"},
31     {OHOS::MediaAVCodec::FaultType::FAULT_TYPE_INNER_ERROR,     "Inner error"},
32 };
33 } // namespace
34 
35 namespace OHOS {
36 namespace MediaAVCodec {
FaultEventWrite(FaultType faultType,const std::string & msg,const std::string & module)37 void FaultEventWrite(FaultType faultType, const std::string& msg, const std::string& module)
38 {
39     CHECK_AND_RETURN_LOG(faultType >= FaultType::FAULT_TYPE_FREEZE && faultType < FaultType::FAULT_TYPE_END,
40         "Invalid fault type: %{public}d", faultType);
41     HiSysEventWrite(HISYSEVENT_DOMAIN_AVCODEC, "FAULT",
42                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
43                     "MODULE", module,
44                     "FAULTTYPE", FAULT_TYPE_TO_STRING.at(faultType),
45                     "MSG", msg);
46 }
47 
ServiceStartEventWrite(uint32_t useTime,const std::string & module)48 void ServiceStartEventWrite(uint32_t useTime, const std::string& module)
49 {
50     OHOS::HiviewDFX::DumpUsage dumpUse;
51     uint64_t useMemory = dumpUse.GetPss(getprocpid());
52     HiSysEventWrite(HISYSEVENT_DOMAIN_AVCODEC, "SERVICE_START_INFO",
53                     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, "MODULE", module.c_str(), "TIME", useTime,
54                     "MEMORY", useMemory);
55 }
56 
CodecStartEventWrite(CodecDfxInfo & codecDfxInfo)57 void CodecStartEventWrite(CodecDfxInfo& codecDfxInfo)
58 {
59     HiSysEventWrite(HISYSEVENT_DOMAIN_AVCODEC, "CODEC_START_INFO",
60                     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
61                     "CLIENT_PID",           codecDfxInfo.clientPid,
62                     "CLIENT_UID",           codecDfxInfo.clientUid,
63                     "CODEC_INSTANCE_ID",    codecDfxInfo.codecInstanceId,
64                     "CODEC_NAME",           codecDfxInfo.codecName,
65                     "CODEC_IS_VENDOR",      codecDfxInfo.codecIsVendor,
66                     "CODEC_MODE",           codecDfxInfo.codecMode,
67                     "ENCODER_BITRATE",      codecDfxInfo.encoderBitRate,
68                     "VIDEO_WIDTH",          codecDfxInfo.videoWidth,
69                     "VIDEO_HEIGHT",         codecDfxInfo.videoHeight,
70                     "VIDEO_FRAMERATE",      codecDfxInfo.videoFrameRate,
71                     "VIDEO_PIXEL_FORMAT",   codecDfxInfo.videoPixelFormat,
72                     "AUDIO_CHANNEL_COUNT",  codecDfxInfo.audioChannelCount,
73                     "AUDIO_SAMPLE_RATE",    codecDfxInfo.audioSampleRate);
74 }
75 
CodecStopEventWrite(pid_t clientPid,uid_t clientUid,int32_t codecInstanceId)76 void CodecStopEventWrite(pid_t clientPid, uid_t clientUid, int32_t codecInstanceId)
77 {
78     HiSysEventWrite(HISYSEVENT_DOMAIN_AVCODEC, "CODEC_STOP_INFO",
79                     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
80                     "CLIENT_PID", clientPid, "CLIENT_UID", clientUid, "CODEC_INSTANCE_ID", codecInstanceId);
81 }
82 
DemuxerInitEventWrite(uint32_t downloadSize,std::string sourceType)83 void DemuxerInitEventWrite(uint32_t downloadSize, std::string sourceType)
84 {
85     HiSysEventWrite(HISYSEVENT_DOMAIN_AVCODEC, "DEMUXER_INIT_INFO",
86                     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
87                     "DOWNLOAD_SIZE", downloadSize, "SOURCE_TYPE", sourceType);
88 }
89 
FaultDemuxerEventWrite(DemuxerFaultInfo & demuxerFaultInfo)90 void FaultDemuxerEventWrite(DemuxerFaultInfo& demuxerFaultInfo)
91 {
92     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, "DEMUXER_FAILURE",
93                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
94                     "APP_NAME",         demuxerFaultInfo.appName,
95                     "INSTANCE_ID",      demuxerFaultInfo.instanceId,
96                     "CALLER_TYPE",      demuxerFaultInfo.callerType,
97                     "SOURCE_TYPE",      demuxerFaultInfo.sourceType,
98                     "CONTAINER_FORMAT", demuxerFaultInfo.containerFormat,
99                     "STREAM_TYPE",      demuxerFaultInfo.streamType,
100                     "ERROR_MESG",       demuxerFaultInfo.errMsg);
101 }
102 
FaultAudioCodecEventWrite(AudioCodecFaultInfo & audioCodecFaultInfo)103 void FaultAudioCodecEventWrite(AudioCodecFaultInfo& audioCodecFaultInfo)
104 {
105     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, "AUDIO_CODEC_FAILURE",
106                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
107                     "APP_NAME",    audioCodecFaultInfo.appName,
108                     "INSTANCE_ID", audioCodecFaultInfo.instanceId,
109                     "CALLER_TYPE", audioCodecFaultInfo.callerType,
110                     "AUDIO_CODEC", audioCodecFaultInfo.audioCodec,
111                     "ERROR_MESG",  audioCodecFaultInfo.errMsg);
112 }
113 
FaultVideoCodecEventWrite(VideoCodecFaultInfo & videoCodecFaultInfo)114 void FaultVideoCodecEventWrite(VideoCodecFaultInfo& videoCodecFaultInfo)
115 {
116     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, "VIDEO_CODEC_FAILURE",
117                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
118                     "APP_NAME",    videoCodecFaultInfo.appName,
119                     "INSTANCE_ID", videoCodecFaultInfo.instanceId,
120                     "CALLER_TYPE", videoCodecFaultInfo.callerType,
121                     "VIDEO_CODEC", videoCodecFaultInfo.videoCodec,
122                     "ERROR_MESG",  videoCodecFaultInfo.errMsg);
123 }
124 
FaultMuxerEventWrite(MuxerFaultInfo & muxerFaultInfo)125 void FaultMuxerEventWrite(MuxerFaultInfo& muxerFaultInfo)
126 {
127     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, "MUXER_FAILURE",
128                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
129                     "APP_NAME",         muxerFaultInfo.appName,
130                     "INSTANCE_ID",      muxerFaultInfo.instanceId,
131                     "CALLER_TYPE",      muxerFaultInfo.callerType,
132                     "VIDEO_CODEC",      muxerFaultInfo.videoCodec,
133                     "AUDIO_CODEC",      muxerFaultInfo.audioCodec,
134                     "CONTAINER_FORMAT", muxerFaultInfo.containerFormat,
135                     "ERROR_MESG",       muxerFaultInfo.errMsg);
136 }
137 
FaultRecordAudioEventWrite(AudioSourceFaultInfo & audioSourceFaultInfo)138 void FaultRecordAudioEventWrite(AudioSourceFaultInfo& audioSourceFaultInfo)
139 {
140     HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, "RECORD_AUDIO_FAILURE",
141                     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
142                     "APP_NAME",          audioSourceFaultInfo.appName,
143                     "INSTANCE_ID",       audioSourceFaultInfo.instanceId,
144                     "AUDIO_SOURCE_TYPE", audioSourceFaultInfo.audioSourceType,
145                     "ERROR_MESG",        audioSourceFaultInfo.errMsg);
146 }
147 } // namespace MediaAVCodec
148 } // namespace OHOS
149