xref: /aosp_15_r20/external/webrtc/api/video/video_timing.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_timing.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
14*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h"
15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/safe_conversions.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
20*d9f75844SAndroid Build Coastguard Worker 
GetDeltaCappedMs(int64_t base_ms,int64_t time_ms)21*d9f75844SAndroid Build Coastguard Worker uint16_t VideoSendTiming::GetDeltaCappedMs(int64_t base_ms, int64_t time_ms) {
22*d9f75844SAndroid Build Coastguard Worker   if (time_ms < base_ms) {
23*d9f75844SAndroid Build Coastguard Worker     RTC_DLOG(LS_ERROR) << "Delta " << (time_ms - base_ms)
24*d9f75844SAndroid Build Coastguard Worker                        << "ms expected to be positive";
25*d9f75844SAndroid Build Coastguard Worker   }
26*d9f75844SAndroid Build Coastguard Worker   return rtc::saturated_cast<uint16_t>(time_ms - base_ms);
27*d9f75844SAndroid Build Coastguard Worker }
28*d9f75844SAndroid Build Coastguard Worker 
GetDeltaCappedMs(TimeDelta delta)29*d9f75844SAndroid Build Coastguard Worker uint16_t VideoSendTiming::GetDeltaCappedMs(TimeDelta delta) {
30*d9f75844SAndroid Build Coastguard Worker   if (delta < TimeDelta::Zero()) {
31*d9f75844SAndroid Build Coastguard Worker     RTC_DLOG(LS_ERROR) << "Delta " << delta.ms()
32*d9f75844SAndroid Build Coastguard Worker                        << "ms expected to be positive";
33*d9f75844SAndroid Build Coastguard Worker   }
34*d9f75844SAndroid Build Coastguard Worker   return rtc::saturated_cast<uint16_t>(delta.ms());
35*d9f75844SAndroid Build Coastguard Worker }
36*d9f75844SAndroid Build Coastguard Worker 
TimingFrameInfo()37*d9f75844SAndroid Build Coastguard Worker TimingFrameInfo::TimingFrameInfo()
38*d9f75844SAndroid Build Coastguard Worker     : rtp_timestamp(0),
39*d9f75844SAndroid Build Coastguard Worker       capture_time_ms(-1),
40*d9f75844SAndroid Build Coastguard Worker       encode_start_ms(-1),
41*d9f75844SAndroid Build Coastguard Worker       encode_finish_ms(-1),
42*d9f75844SAndroid Build Coastguard Worker       packetization_finish_ms(-1),
43*d9f75844SAndroid Build Coastguard Worker       pacer_exit_ms(-1),
44*d9f75844SAndroid Build Coastguard Worker       network_timestamp_ms(-1),
45*d9f75844SAndroid Build Coastguard Worker       network2_timestamp_ms(-1),
46*d9f75844SAndroid Build Coastguard Worker       receive_start_ms(-1),
47*d9f75844SAndroid Build Coastguard Worker       receive_finish_ms(-1),
48*d9f75844SAndroid Build Coastguard Worker       decode_start_ms(-1),
49*d9f75844SAndroid Build Coastguard Worker       decode_finish_ms(-1),
50*d9f75844SAndroid Build Coastguard Worker       render_time_ms(-1),
51*d9f75844SAndroid Build Coastguard Worker       flags(VideoSendTiming::kNotTriggered) {}
52*d9f75844SAndroid Build Coastguard Worker 
EndToEndDelay() const53*d9f75844SAndroid Build Coastguard Worker int64_t TimingFrameInfo::EndToEndDelay() const {
54*d9f75844SAndroid Build Coastguard Worker   return capture_time_ms >= 0 ? decode_finish_ms - capture_time_ms : -1;
55*d9f75844SAndroid Build Coastguard Worker }
56*d9f75844SAndroid Build Coastguard Worker 
IsLongerThan(const TimingFrameInfo & other) const57*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::IsLongerThan(const TimingFrameInfo& other) const {
58*d9f75844SAndroid Build Coastguard Worker   int64_t other_delay = other.EndToEndDelay();
59*d9f75844SAndroid Build Coastguard Worker   return other_delay == -1 || EndToEndDelay() > other_delay;
60*d9f75844SAndroid Build Coastguard Worker }
61*d9f75844SAndroid Build Coastguard Worker 
operator <(const TimingFrameInfo & other) const62*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::operator<(const TimingFrameInfo& other) const {
63*d9f75844SAndroid Build Coastguard Worker   return other.IsLongerThan(*this);
64*d9f75844SAndroid Build Coastguard Worker }
65*d9f75844SAndroid Build Coastguard Worker 
operator <=(const TimingFrameInfo & other) const66*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::operator<=(const TimingFrameInfo& other) const {
67*d9f75844SAndroid Build Coastguard Worker   return !IsLongerThan(other);
68*d9f75844SAndroid Build Coastguard Worker }
69*d9f75844SAndroid Build Coastguard Worker 
IsOutlier() const70*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::IsOutlier() const {
71*d9f75844SAndroid Build Coastguard Worker   return !IsInvalid() && (flags & VideoSendTiming::kTriggeredBySize);
72*d9f75844SAndroid Build Coastguard Worker }
73*d9f75844SAndroid Build Coastguard Worker 
IsTimerTriggered() const74*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::IsTimerTriggered() const {
75*d9f75844SAndroid Build Coastguard Worker   return !IsInvalid() && (flags & VideoSendTiming::kTriggeredByTimer);
76*d9f75844SAndroid Build Coastguard Worker }
77*d9f75844SAndroid Build Coastguard Worker 
IsInvalid() const78*d9f75844SAndroid Build Coastguard Worker bool TimingFrameInfo::IsInvalid() const {
79*d9f75844SAndroid Build Coastguard Worker   return flags == VideoSendTiming::kInvalid;
80*d9f75844SAndroid Build Coastguard Worker }
81*d9f75844SAndroid Build Coastguard Worker 
ToString() const82*d9f75844SAndroid Build Coastguard Worker std::string TimingFrameInfo::ToString() const {
83*d9f75844SAndroid Build Coastguard Worker   if (IsInvalid()) {
84*d9f75844SAndroid Build Coastguard Worker     return "";
85*d9f75844SAndroid Build Coastguard Worker   }
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   char buf[1024];
88*d9f75844SAndroid Build Coastguard Worker   rtc::SimpleStringBuilder sb(buf);
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   sb << rtp_timestamp << ',' << capture_time_ms << ',' << encode_start_ms << ','
91*d9f75844SAndroid Build Coastguard Worker      << encode_finish_ms << ',' << packetization_finish_ms << ','
92*d9f75844SAndroid Build Coastguard Worker      << pacer_exit_ms << ',' << network_timestamp_ms << ','
93*d9f75844SAndroid Build Coastguard Worker      << network2_timestamp_ms << ',' << receive_start_ms << ','
94*d9f75844SAndroid Build Coastguard Worker      << receive_finish_ms << ',' << decode_start_ms << ',' << decode_finish_ms
95*d9f75844SAndroid Build Coastguard Worker      << ',' << render_time_ms << ',' << IsOutlier() << ','
96*d9f75844SAndroid Build Coastguard Worker      << IsTimerTriggered();
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker   return sb.str();
99*d9f75844SAndroid Build Coastguard Worker }
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
102