• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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