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
16 #include "dps_video_report.h"
17
18 #include "dp_log.h"
19 #include "hisysevent.h"
20 #include "steady_clock.h"
21
22 namespace OHOS {
23 namespace CameraStandard {
24 namespace DeferredProcessing {
25 static constexpr char CAMERA_FWK_UE[] = "CAMERA_FWK_UE";
26
DfxVideoReport()27 DfxVideoReport::DfxVideoReport()
28 {
29 DP_DEBUG_LOG("entered.");
30 }
31
~DfxVideoReport()32 DfxVideoReport::~DfxVideoReport()
33 {
34 DP_DEBUG_LOG("entered.");
35 }
36
ReportAddVideoEvent(const std::string & videoId,DpsCallerInfo callerInfo)37 void DfxVideoReport::ReportAddVideoEvent(const std::string &videoId, DpsCallerInfo callerInfo)
38 {
39 DP_DEBUG_LOG("ReportAddVideoEvent enter.");
40 VideoRecord videoRecord{
41 .videoId = videoId,
42 .calleBundle = callerInfo.bundleName,
43 .calleVersion = callerInfo.version,
44 .addTime = SteadyClock::GetTimestampMilli(),
45 };
46 auto iter = processVideoInfo_.find(videoId);
47 if (iter == processVideoInfo_.end()) {
48 processVideoInfo_.emplace(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 auto iter = processVideoInfo_.find(videoId);
65 if (iter != processVideoInfo_.end()) {
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 auto iter = processVideoInfo_.find(videoId);
84 if (iter != processVideoInfo_.end()) {
85 DP_DEBUG_LOG("ReportPauseVideoEvent videoId found.");
86 VideoRecord vr = iter->second;
87 vr.pauseStartTime = SteadyClock::GetTimestampMilli();
88 processToPauseCost = vr.pauseStartTime - vr.processTime;
89 bundleName = vr.calleBundle;
90 version = vr.calleVersion;
91 } else {
92 DP_DEBUG_LOG("ReportPauseVideoEvent videoId not found.");
93 }
94
95 HiSysEventWrite(CAMERA_FWK_UE,
96 "DPS_PAUSE_VIDEO",
97 HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
98 EVENT_KEY_PNAMEID, bundleName,
99 EVENT_KEY_PVERSIONID, version,
100 EVENT_KEY_VIDEOID, videoId,
101 EVENT_KEY_ABORTTYPE, pauseReason,
102 EVENT_KEY_ABORTTIME, processToPauseCost);
103 }
104
ReportResumeVideoEvent(const std::string & videoId)105 void DfxVideoReport::ReportResumeVideoEvent(const std::string &videoId)
106 {
107 DP_DEBUG_LOG("ReportResumeVideoEvent enter.");
108 uint64_t pauseToResumeCost = 0;
109 std::string bundleName;
110 std::string version;
111 auto iter = processVideoInfo_.find(videoId);
112 if (iter != processVideoInfo_.end()) {
113 DP_DEBUG_LOG("ReportResumeVideoEvent videoId found.");
114 VideoRecord vr = iter->second;
115 if (vr.processTime == 0) {
116 // 首次开始分段式任务
117 DP_DEBUG_LOG("ReportResumeVideoEvent first process videoId:%{public}s", videoId.c_str());
118 vr.processTime = SteadyClock::GetTimestampMilli();
119 } else {
120 // 中断后再次开始分段式任务
121 vr.pauseEndTime = SteadyClock::GetTimestampMilli();
122 pauseToResumeCost = vr.pauseEndTime - vr.pauseStartTime;
123 vr.totlePauseTime += pauseToResumeCost;
124 bundleName = vr.calleBundle;
125 version = vr.calleVersion;
126 HiSysEventWrite(
127 CAMERA_FWK_UE,
128 "DPS_RESUME_VIDEO",
129 HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
130 EVENT_KEY_PNAMEID, bundleName,
131 EVENT_KEY_PVERSIONID, version,
132 EVENT_KEY_VIDEOID, videoId,
133 EVENT_KEY_RECOVERTIME, pauseToResumeCost);
134 }
135 } else {
136 DP_DEBUG_LOG("ReportPauseVideoEvent videoId not found.");
137 }
138 }
139
ReportCompleteVideoEvent(const std::string & videoId)140 void DfxVideoReport::ReportCompleteVideoEvent(const std::string &videoId)
141 {
142 DP_DEBUG_LOG("ReportCompleteVideoEvent enter.");
143 uint64_t completeTime = 0;
144 uint64_t realCompleteTime = 0;
145 std::string bundleName;
146 std::string version;
147 auto iter = processVideoInfo_.find(videoId);
148 if (iter != processVideoInfo_.end()) {
149 DP_DEBUG_LOG("ReportCompleteVideoEvent videoId found.");
150 VideoRecord vr = iter->second;
151 completeTime = SteadyClock::GetTimestampMilli() - vr.processTime;
152 realCompleteTime = completeTime - vr.totlePauseTime;
153 bundleName = vr.calleBundle;
154 version = vr.calleVersion;
155 } else {
156 DP_DEBUG_LOG("ReportCompleteVideoEvent videoId not found.");
157 }
158
159 HiSysEventWrite(CAMERA_FWK_UE,
160 "DPS_COMPLETE_VIDEO",
161 HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
162 EVENT_KEY_PNAMEID, bundleName,
163 EVENT_KEY_PVERSIONID, version,
164 EVENT_KEY_VIDEOID, videoId,
165 EVENT_KEY_COMPLETETIME, completeTime,
166 EVENT_KEY_REALCOMPLETETIME, realCompleteTime);
167 }
168 } // namespace DeferredProcessing
169 } // namespace CameraStandard
170 } // namespace OHOS