1 /*
2 * Copyright (c) 2023-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 #include "dcamera_time_statistician.h"
16 #include "distributed_hardware_log.h"
17 #include "distributed_camera_constants.h"
18 #include <memory>
19
20 namespace OHOS {
21 namespace DistributedHardware {
CalProcessTime(const std::shared_ptr<IFeedableData> & data)22 void DCameraTimeStatistician::CalProcessTime(const std::shared_ptr<IFeedableData>& data)
23 {
24 CHECK_AND_RETURN_LOG(data == nullptr, "data is nullptr");
25 TimeStatistician::CalProcessTime(data);
26 std::shared_ptr<DataBuffer> dataBuffer = std::reinterpret_pointer_cast<DataBuffer>(data);
27 DCameraFrameInfo frameInfo = dataBuffer->frameInfo_;
28 int64_t encode = frameInfo.timePonit.finishEncode - frameInfo.timePonit.startEncode;
29 int64_t trans = frameInfo.timePonit.recv - frameInfo.timePonit.send + frameInfo.offset;
30 int64_t decode = frameInfo.timePonit.finishDecode - frameInfo.timePonit.startDecode;
31 int64_t decode2Scale = frameInfo.timePonit.startScale - frameInfo.timePonit.finishDecode;
32 int64_t scale = frameInfo.timePonit.finishScale - frameInfo.timePonit.startScale;
33 int64_t recv2Feed = frameInfo.timePonit.startSmooth - frameInfo.timePonit.recv;
34 SetFrameIndex(frameInfo.index);
35 averEncodeTime_ = CalAverValue(encode, encodeTimeSum_);
36 averTransTime_ = CalAverValue(trans, transTimeSum_);
37 averDecodeTime_ = CalAverValue(decode, decodeTimeSum_);
38 averDecode2ScaleTime_ = CalAverValue(decode2Scale, decode2ScaleTimeSum_);
39 averScaleTime_ = CalAverValue(scale, scaleTimeSum_);
40 averRecv2FeedTime_ = CalAverValue(recv2Feed, recv2FeedTimeSum_);
41 SetRecvTime(frameInfo.timePonit.recv);
42 DHLOGD("Encode %{public}" PRId64", trans %{public}" PRId64", decode %{public}" PRId64", decode2Scale %{public}"
43 PRId64", scale %{public}" PRId64", recv2Feed %{public}" PRId64", averEncode %{public}" PRId64
44 " averTrans %{public}" PRId64", averDecode %{public}" PRId64", averDecode2Scale %{public}" PRId64
45 ", averScale %{public}" PRId64", averRecv2Feed %{public}" PRId64, encode, trans,
46 decode, decode2Scale, scale, recv2Feed, averEncodeTime_, averTransTime_, averDecodeTime_,
47 averDecode2ScaleTime_, averScaleTime_, averRecv2FeedTime_);
48 }
49
CalWholeProcessTime(const std::shared_ptr<DataBuffer> & data)50 void DCameraTimeStatistician::CalWholeProcessTime(const std::shared_ptr<DataBuffer>& data)
51 {
52 CHECK_AND_RETURN_LOG(data == nullptr, "data is nullptr");
53 DCameraFrameInfo frameInfo = data->frameInfo_;
54 int64_t smooth = frameInfo.timePonit.finishSmooth - frameInfo.timePonit.startSmooth;
55 int64_t sink = frameInfo.timePonit.send - frameInfo.timePonit.startEncode;
56 int64_t source = frameInfo.timePonit.finishSmooth - frameInfo.timePonit.recv;
57 int64_t whole = frameInfo.timePonit.finishSmooth - frameInfo.timePonit.startEncode + frameInfo.offset;
58 int64_t self = frameInfo.timePonit.finishSmooth - frameInfo.timePonit.finishDecode;
59 averSmoothTime_ = CalAverValue(smooth, smoothTimeSum_);
60 averSourceTime_ = CalAverValue(source, sourceTimeSum_);
61 averWholeTime_ = CalAverValue(whole, wholeTimeSum_);
62 DHLOGD("Smooth %{public}" PRId64", sink %{public}" PRId64", source %{public}" PRId64", whole %{public}" PRId64
63 ", self %{public}" PRId64", averSmooth %{public}" PRId64", averSource %{public}" PRId64", averWhole %{public}"
64 PRId64, smooth, sink, source, whole, self, averSmoothTime_, averSourceTime_, averWholeTime_);
65 }
66
SetFrameIndex(const int32_t index)67 void DCameraTimeStatistician::SetFrameIndex(const int32_t index)
68 {
69 frameIndex_ = index;
70 }
71
CalAverValue(int64_t & value,int64_t & valueSum)72 int64_t DCameraTimeStatistician::CalAverValue(int64_t& value, int64_t& valueSum)
73 {
74 if (frameIndex_ == FRAME_HEAD) {
75 return 0;
76 }
77 if (INT64_MAX - valueSum < value) {
78 DHLOGD("CalAverValue addition overflow.");
79 return 0;
80 }
81 valueSum += value;
82 return valueSum / frameIndex_;
83 }
84
GetAverEncodeTime()85 int64_t DCameraTimeStatistician::GetAverEncodeTime()
86 {
87 return averEncodeTime_;
88 }
89
GetAverTransTime()90 int64_t DCameraTimeStatistician::GetAverTransTime()
91 {
92 return averTransTime_;
93 }
94
GetAverDecodeTime()95 int64_t DCameraTimeStatistician::GetAverDecodeTime()
96 {
97 return averDecodeTime_;
98 }
99
GetAverDecode2ScaleTime()100 int64_t DCameraTimeStatistician::GetAverDecode2ScaleTime()
101 {
102 return averDecode2ScaleTime_;
103 }
104
GetAverScaleTime()105 int64_t DCameraTimeStatistician::GetAverScaleTime()
106 {
107 return averScaleTime_;
108 }
109
GetAverRecv2FeedTime()110 int64_t DCameraTimeStatistician::GetAverRecv2FeedTime()
111 {
112 return averRecv2FeedTime_;
113 }
114
GetAverSmoothTime()115 int64_t DCameraTimeStatistician::GetAverSmoothTime()
116 {
117 return averSmoothTime_;
118 }
119
GetRecv2FeedTime()120 int64_t DCameraTimeStatistician::GetRecv2FeedTime()
121 {
122 return averRecv2FeedTime_;
123 }
124
GetAverSourceTime()125 int64_t DCameraTimeStatistician::GetAverSourceTime()
126 {
127 return averSourceTime_;
128 }
129
GetAverWholeTime()130 int64_t DCameraTimeStatistician::GetAverWholeTime()
131 {
132 return averWholeTime_;
133 }
134
GetRecvTime()135 int64_t DCameraTimeStatistician::GetRecvTime()
136 {
137 return recvTime_;
138 }
139
SetRecvTime(const int64_t recvTime)140 void DCameraTimeStatistician::SetRecvTime(const int64_t recvTime)
141 {
142 recvTime_ = recvTime;
143 }
144 } // namespace DistributedHardware
145 } // namespace OHOS