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