1 /*
2  * Copyright (c) 2023-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 #include "dps_video_report.h"
16 
17 #include "dp_log.h"
18 #include "hisysevent.h"
19 #include "steady_clock.h"
20 
21 namespace OHOS {
22 namespace CameraStandard {
23 namespace DeferredProcessing {
24 static constexpr char CAMERA_FWK_UE[] = "CAMERA_FWK_UE";
25 
DfxVideoReport()26 DfxVideoReport::DfxVideoReport()
27 {
28     DP_DEBUG_LOG("entered.");
29 }
30 
~DfxVideoReport()31 DfxVideoReport::~DfxVideoReport()
32 {
33     DP_DEBUG_LOG("entered.");
34 }
35 
ReportAddVideoEvent(const std::string & videoId,DpsCallerInfo callerInfo)36 void DfxVideoReport::ReportAddVideoEvent(const std::string &videoId, DpsCallerInfo callerInfo)
37 {
38     DP_DEBUG_LOG("ReportAddVideoEvent enter.");
39     VideoRecord videoRecord{
40         .videoId = videoId,
41         .calleBundle = callerInfo.bundleName,
42         .calleVersion = callerInfo.version,
43         .addTime = SteadyClock::GetTimestampMilli(),
44     };
45 
46     VideoRecord videoRecordFound;
47     if (!processVideoInfo_.Find(videoId, videoRecordFound)) {
48         processVideoInfo_.Insert(videoId, videoRecord);
49     } else {
50         DP_ERR_LOG("ReportAddVideoEvent video has been added.");
51     }
52 
53     HiSysEventWrite(CAMERA_FWK_UE,
54         "DPS_ADD_VIDEO",
55         HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
56         EVENT_KEY_PNAMEID, callerInfo.bundleName,
57         EVENT_KEY_PVERSIONID, callerInfo.pid,
58         EVENT_KEY_VIDEOID, videoId);
59 }
60 
ReportRemoveVideoEvent(const std::string & videoId,DpsCallerInfo callerInfo)61 void DfxVideoReport::ReportRemoveVideoEvent(const std::string &videoId, DpsCallerInfo callerInfo)
62 {
63     DP_DEBUG_LOG("ReportRemoveVideoEvent enter.");
64     VideoRecord videoRecordFound;
65     if (processVideoInfo_.Find(videoId, videoRecordFound)) {
66         processVideoInfo_.Erase(videoId);
67     }
68 
69     HiSysEventWrite(CAMERA_FWK_UE,
70         "DPS_REMOVE_VIDEO",
71         HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
72         EVENT_KEY_PNAMEID, callerInfo.bundleName,
73         EVENT_KEY_PVERSIONID, callerInfo.pid,
74         EVENT_KEY_VIDEOID, videoId);
75 }
76 
ReportPauseVideoEvent(const std::string & videoId,int32_t pauseReason)77 void DfxVideoReport::ReportPauseVideoEvent(const std::string& videoId, int32_t pauseReason)
78 {
79     DP_DEBUG_LOG("ReportPauseVideoEvent enter.");
80     uint64_t processToPauseCost = 0;
81     std::string bundleName;
82     std::string version;
83     VideoRecord vr;
84     if (processVideoInfo_.Find(videoId, vr)) {
85         DP_DEBUG_LOG("ReportPauseVideoEvent videoId found.");
86         vr.pauseStartTime = SteadyClock::GetTimestampMilli();
87         processToPauseCost = vr.pauseStartTime - vr.processTime;
88         bundleName = vr.calleBundle;
89         version = vr.calleVersion;
90     } else {
91         DP_DEBUG_LOG("ReportPauseVideoEvent videoId not found.");
92     }
93 
94     HiSysEventWrite(CAMERA_FWK_UE,
95         "DPS_PAUSE_VIDEO",
96         HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
97         EVENT_KEY_PNAMEID, bundleName,
98         EVENT_KEY_PVERSIONID, version,
99         EVENT_KEY_VIDEOID, videoId,
100         EVENT_KEY_ABORTTYPE, pauseReason,
101         EVENT_KEY_ABORTTIME, processToPauseCost);
102 }
103 
ReportResumeVideoEvent(const std::string & videoId)104 void DfxVideoReport::ReportResumeVideoEvent(const std::string &videoId)
105 {
106     DP_DEBUG_LOG("ReportResumeVideoEvent enter.");
107     uint64_t pauseToResumeCost = 0;
108     std::string bundleName;
109     std::string version;
110     VideoRecord vr;
111     if (processVideoInfo_.Find(videoId, vr)) {
112         DP_DEBUG_LOG("ReportResumeVideoEvent videoId found.");
113         if (vr.processTime == 0) {
114             // 首次开始分段式任务
115             DP_DEBUG_LOG("ReportResumeVideoEvent first process videoId:%{public}s", videoId.c_str());
116             vr.processTime = SteadyClock::GetTimestampMilli();
117         } else {
118             // 中断后再次开始分段式任务
119             vr.pauseEndTime = SteadyClock::GetTimestampMilli();
120             pauseToResumeCost = vr.pauseEndTime - vr.pauseStartTime;
121             vr.totlePauseTime += pauseToResumeCost;
122             bundleName = vr.calleBundle;
123             version = vr.calleVersion;
124             HiSysEventWrite(
125                 CAMERA_FWK_UE,
126                 "DPS_RESUME_VIDEO",
127                 HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
128                 EVENT_KEY_PNAMEID, bundleName,
129                 EVENT_KEY_PVERSIONID, version,
130                 EVENT_KEY_VIDEOID, videoId,
131                 EVENT_KEY_RECOVERTIME, pauseToResumeCost);
132         }
133     } else {
134         DP_DEBUG_LOG("ReportPauseVideoEvent videoId not found.");
135     }
136 }
137 
ReportCompleteVideoEvent(const std::string & videoId)138 void DfxVideoReport::ReportCompleteVideoEvent(const std::string &videoId)
139 {
140     DP_DEBUG_LOG("ReportCompleteVideoEvent enter.");
141     uint64_t completeTime = 0;
142     uint64_t realCompleteTime = 0;
143     std::string bundleName;
144     std::string version;
145     VideoRecord vr;
146     if (processVideoInfo_.Find(videoId, vr)) {
147         DP_DEBUG_LOG("ReportCompleteVideoEvent videoId found.");
148         completeTime = SteadyClock::GetTimestampMilli() - vr.processTime;
149         realCompleteTime = completeTime - vr.totlePauseTime;
150         bundleName = vr.calleBundle;
151         version = vr.calleVersion;
152     } else {
153         DP_DEBUG_LOG("ReportCompleteVideoEvent videoId not found.");
154     }
155 
156     HiSysEventWrite(CAMERA_FWK_UE,
157         "DPS_COMPLETE_VIDEO",
158         HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
159         EVENT_KEY_PNAMEID, bundleName,
160         EVENT_KEY_PVERSIONID, version,
161         EVENT_KEY_VIDEOID, videoId,
162         EVENT_KEY_COMPLETETIME, completeTime,
163         EVENT_KEY_REALCOMPLETETIME, realCompleteTime);
164 }
165 }  // namespace DeferredProcessing
166 }  // namespace CameraStandard
167 }  // namespace OHOS