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