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 #ifndef API_VIDEO_VIDEO_TIMING_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_VIDEO_VIDEO_TIMING_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <limits> 17*d9f75844SAndroid Build Coastguard Worker #include <string> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h" 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker // Video timing timestamps in ms counted from capture_time_ms of a frame. 24*d9f75844SAndroid Build Coastguard Worker // This structure represents data sent in video-timing RTP header extension. 25*d9f75844SAndroid Build Coastguard Worker struct VideoSendTiming { 26*d9f75844SAndroid Build Coastguard Worker enum TimingFrameFlags : uint8_t { 27*d9f75844SAndroid Build Coastguard Worker kNotTriggered = 0, // Timing info valid, but not to be transmitted. 28*d9f75844SAndroid Build Coastguard Worker // Used on send-side only. 29*d9f75844SAndroid Build Coastguard Worker kTriggeredByTimer = 1 << 0, // Frame marked for tracing by periodic timer. 30*d9f75844SAndroid Build Coastguard Worker kTriggeredBySize = 1 << 1, // Frame marked for tracing due to size. 31*d9f75844SAndroid Build Coastguard Worker kInvalid = std::numeric_limits<uint8_t>::max() // Invalid, ignore! 32*d9f75844SAndroid Build Coastguard Worker }; 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard Worker // Returns |time_ms - base_ms| capped at max 16-bit value. 35*d9f75844SAndroid Build Coastguard Worker // Used to fill this data structure as per 36*d9f75844SAndroid Build Coastguard Worker // https://webrtc.org/experiments/rtp-hdrext/video-timing/ extension stores 37*d9f75844SAndroid Build Coastguard Worker // 16-bit deltas of timestamps from packet capture time. 38*d9f75844SAndroid Build Coastguard Worker static uint16_t GetDeltaCappedMs(int64_t base_ms, int64_t time_ms); 39*d9f75844SAndroid Build Coastguard Worker static uint16_t GetDeltaCappedMs(TimeDelta delta); 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker uint16_t encode_start_delta_ms; 42*d9f75844SAndroid Build Coastguard Worker uint16_t encode_finish_delta_ms; 43*d9f75844SAndroid Build Coastguard Worker uint16_t packetization_finish_delta_ms; 44*d9f75844SAndroid Build Coastguard Worker uint16_t pacer_exit_delta_ms; 45*d9f75844SAndroid Build Coastguard Worker uint16_t network_timestamp_delta_ms; 46*d9f75844SAndroid Build Coastguard Worker uint16_t network2_timestamp_delta_ms; 47*d9f75844SAndroid Build Coastguard Worker uint8_t flags = TimingFrameFlags::kInvalid; 48*d9f75844SAndroid Build Coastguard Worker }; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker // Used to report precise timings of a 'timing frames'. Contains all important 51*d9f75844SAndroid Build Coastguard Worker // timestamps for a lifetime of that specific frame. Reported as a string via 52*d9f75844SAndroid Build Coastguard Worker // GetStats(). Only frame which took the longest between two GetStats calls is 53*d9f75844SAndroid Build Coastguard Worker // reported. 54*d9f75844SAndroid Build Coastguard Worker struct TimingFrameInfo { 55*d9f75844SAndroid Build Coastguard Worker TimingFrameInfo(); 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker // Returns end-to-end delay of a frame, if sender and receiver timestamps are 58*d9f75844SAndroid Build Coastguard Worker // synchronized, -1 otherwise. 59*d9f75844SAndroid Build Coastguard Worker int64_t EndToEndDelay() const; 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker // Returns true if current frame took longer to process than `other` frame. 62*d9f75844SAndroid Build Coastguard Worker // If other frame's clocks are not synchronized, current frame is always 63*d9f75844SAndroid Build Coastguard Worker // preferred. 64*d9f75844SAndroid Build Coastguard Worker bool IsLongerThan(const TimingFrameInfo& other) const; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker // Returns true if flags are set to indicate this frame was marked for tracing 67*d9f75844SAndroid Build Coastguard Worker // due to the size being outside some limit. 68*d9f75844SAndroid Build Coastguard Worker bool IsOutlier() const; 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker // Returns true if flags are set to indicate this frame was marked fro tracing 71*d9f75844SAndroid Build Coastguard Worker // due to cyclic timer. 72*d9f75844SAndroid Build Coastguard Worker bool IsTimerTriggered() const; 73*d9f75844SAndroid Build Coastguard Worker 74*d9f75844SAndroid Build Coastguard Worker // Returns true if the timing data is marked as invalid, in which case it 75*d9f75844SAndroid Build Coastguard Worker // should be ignored. 76*d9f75844SAndroid Build Coastguard Worker bool IsInvalid() const; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker bool operator<(const TimingFrameInfo& other) const; 81*d9f75844SAndroid Build Coastguard Worker 82*d9f75844SAndroid Build Coastguard Worker bool operator<=(const TimingFrameInfo& other) const; 83*d9f75844SAndroid Build Coastguard Worker 84*d9f75844SAndroid Build Coastguard Worker uint32_t rtp_timestamp; // Identifier of a frame. 85*d9f75844SAndroid Build Coastguard Worker // All timestamps below are in local monotonous clock of a receiver. 86*d9f75844SAndroid Build Coastguard Worker // If sender clock is not yet estimated, sender timestamps 87*d9f75844SAndroid Build Coastguard Worker // (capture_time_ms ... pacer_exit_ms) are negative values, still 88*d9f75844SAndroid Build Coastguard Worker // relatively correct. 89*d9f75844SAndroid Build Coastguard Worker int64_t capture_time_ms; // Captrue time of a frame. 90*d9f75844SAndroid Build Coastguard Worker int64_t encode_start_ms; // Encode start time. 91*d9f75844SAndroid Build Coastguard Worker int64_t encode_finish_ms; // Encode completion time. 92*d9f75844SAndroid Build Coastguard Worker int64_t packetization_finish_ms; // Time when frame was passed to pacer. 93*d9f75844SAndroid Build Coastguard Worker int64_t pacer_exit_ms; // Time when last packet was pushed out of pacer. 94*d9f75844SAndroid Build Coastguard Worker // Two in-network RTP processor timestamps: meaning is application specific. 95*d9f75844SAndroid Build Coastguard Worker int64_t network_timestamp_ms; 96*d9f75844SAndroid Build Coastguard Worker int64_t network2_timestamp_ms; 97*d9f75844SAndroid Build Coastguard Worker int64_t receive_start_ms; // First received packet time. 98*d9f75844SAndroid Build Coastguard Worker int64_t receive_finish_ms; // Last received packet time. 99*d9f75844SAndroid Build Coastguard Worker int64_t decode_start_ms; // Decode start time. 100*d9f75844SAndroid Build Coastguard Worker int64_t decode_finish_ms; // Decode completion time. 101*d9f75844SAndroid Build Coastguard Worker int64_t render_time_ms; // Proposed render time to insure smooth playback. 102*d9f75844SAndroid Build Coastguard Worker 103*d9f75844SAndroid Build Coastguard Worker uint8_t flags; // Flags indicating validity and/or why tracing was triggered. 104*d9f75844SAndroid Build Coastguard Worker }; 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker // Minimum and maximum playout delay values from capture to render. 107*d9f75844SAndroid Build Coastguard Worker // These are best effort values. 108*d9f75844SAndroid Build Coastguard Worker // 109*d9f75844SAndroid Build Coastguard Worker // A value < 0 indicates no change from previous valid value. 110*d9f75844SAndroid Build Coastguard Worker // 111*d9f75844SAndroid Build Coastguard Worker // min = max = 0 indicates that the receiver should try and render 112*d9f75844SAndroid Build Coastguard Worker // frame as soon as possible. 113*d9f75844SAndroid Build Coastguard Worker // 114*d9f75844SAndroid Build Coastguard Worker // min = x, max = y indicates that the receiver is free to adapt 115*d9f75844SAndroid Build Coastguard Worker // in the range (x, y) based on network jitter. 116*d9f75844SAndroid Build Coastguard Worker struct VideoPlayoutDelay { 117*d9f75844SAndroid Build Coastguard Worker VideoPlayoutDelay() = default; VideoPlayoutDelayVideoPlayoutDelay118*d9f75844SAndroid Build Coastguard Worker VideoPlayoutDelay(int min_ms, int max_ms) : min_ms(min_ms), max_ms(max_ms) {} 119*d9f75844SAndroid Build Coastguard Worker int min_ms = -1; 120*d9f75844SAndroid Build Coastguard Worker int max_ms = -1; 121*d9f75844SAndroid Build Coastguard Worker 122*d9f75844SAndroid Build Coastguard Worker bool operator==(const VideoPlayoutDelay& rhs) const { 123*d9f75844SAndroid Build Coastguard Worker return min_ms == rhs.min_ms && max_ms == rhs.max_ms; 124*d9f75844SAndroid Build Coastguard Worker } 125*d9f75844SAndroid Build Coastguard Worker }; 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/7660): Old name, delete after downstream use is updated. 128*d9f75844SAndroid Build Coastguard Worker using PlayoutDelay = VideoPlayoutDelay; 129*d9f75844SAndroid Build Coastguard Worker 130*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker #endif // API_VIDEO_VIDEO_TIMING_H_ 133