1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2012 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 MODULES_VIDEO_CODING_JITTER_BUFFER_H_ 12*d9f75844SAndroid Build Coastguard Worker #define MODULES_VIDEO_CODING_JITTER_BUFFER_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <list> 15*d9f75844SAndroid Build Coastguard Worker #include <map> 16*d9f75844SAndroid Build Coastguard Worker #include <memory> 17*d9f75844SAndroid Build Coastguard Worker #include <set> 18*d9f75844SAndroid Build Coastguard Worker #include <vector> 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h" 21*d9f75844SAndroid Build Coastguard Worker #include "modules/include/module_common_types.h" 22*d9f75844SAndroid Build Coastguard Worker #include "modules/include/module_common_types_public.h" 23*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/decoding_state.h" 24*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/event_wrapper.h" 25*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/include/video_coding.h" 26*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/include/video_coding_defines.h" 27*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/jitter_buffer_common.h" 28*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/timing/inter_frame_delay.h" 29*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/timing/jitter_estimator.h" 30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h" 31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h" 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker // forward declarations 36*d9f75844SAndroid Build Coastguard Worker class Clock; 37*d9f75844SAndroid Build Coastguard Worker class VCMFrameBuffer; 38*d9f75844SAndroid Build Coastguard Worker class VCMPacket; 39*d9f75844SAndroid Build Coastguard Worker class VCMEncodedFrame; 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker typedef std::list<VCMFrameBuffer*> UnorderedFrameList; 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Worker struct VCMJitterSample { VCMJitterSampleVCMJitterSample44*d9f75844SAndroid Build Coastguard Worker VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {} 45*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp; 46*d9f75844SAndroid Build Coastguard Worker uint32_t frame_size; 47*d9f75844SAndroid Build Coastguard Worker int64_t latest_packet_time; 48*d9f75844SAndroid Build Coastguard Worker }; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker class TimestampLessThan { 51*d9f75844SAndroid Build Coastguard Worker public: operator()52*d9f75844SAndroid Build Coastguard Worker bool operator()(uint32_t timestamp1, uint32_t timestamp2) const { 53*d9f75844SAndroid Build Coastguard Worker return IsNewerTimestamp(timestamp2, timestamp1); 54*d9f75844SAndroid Build Coastguard Worker } 55*d9f75844SAndroid Build Coastguard Worker }; 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker class FrameList 58*d9f75844SAndroid Build Coastguard Worker : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> { 59*d9f75844SAndroid Build Coastguard Worker public: 60*d9f75844SAndroid Build Coastguard Worker void InsertFrame(VCMFrameBuffer* frame); 61*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer* PopFrame(uint32_t timestamp); 62*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer* Front() const; 63*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer* Back() const; 64*d9f75844SAndroid Build Coastguard Worker int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it, 65*d9f75844SAndroid Build Coastguard Worker UnorderedFrameList* free_frames); 66*d9f75844SAndroid Build Coastguard Worker void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state, 67*d9f75844SAndroid Build Coastguard Worker UnorderedFrameList* free_frames); 68*d9f75844SAndroid Build Coastguard Worker void Reset(UnorderedFrameList* free_frames); 69*d9f75844SAndroid Build Coastguard Worker }; 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker class VCMJitterBuffer { 72*d9f75844SAndroid Build Coastguard Worker public: 73*d9f75844SAndroid Build Coastguard Worker VCMJitterBuffer(Clock* clock, 74*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<EventWrapper> event, 75*d9f75844SAndroid Build Coastguard Worker const FieldTrialsView& field_trials); 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker ~VCMJitterBuffer(); 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker VCMJitterBuffer(const VCMJitterBuffer&) = delete; 80*d9f75844SAndroid Build Coastguard Worker VCMJitterBuffer& operator=(const VCMJitterBuffer&) = delete; 81*d9f75844SAndroid Build Coastguard Worker 82*d9f75844SAndroid Build Coastguard Worker // Initializes and starts jitter buffer. 83*d9f75844SAndroid Build Coastguard Worker void Start(); 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker // Signals all internal events and stops the jitter buffer. 86*d9f75844SAndroid Build Coastguard Worker void Stop(); 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker // Returns true if the jitter buffer is running. 89*d9f75844SAndroid Build Coastguard Worker bool Running() const; 90*d9f75844SAndroid Build Coastguard Worker 91*d9f75844SAndroid Build Coastguard Worker // Empty the jitter buffer of all its data. 92*d9f75844SAndroid Build Coastguard Worker void Flush(); 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker // Gets number of packets received. 95*d9f75844SAndroid Build Coastguard Worker int num_packets() const; 96*d9f75844SAndroid Build Coastguard Worker 97*d9f75844SAndroid Build Coastguard Worker // Gets number of duplicated packets received. 98*d9f75844SAndroid Build Coastguard Worker int num_duplicated_packets() const; 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker // Wait `max_wait_time_ms` for a complete frame to arrive. 101*d9f75844SAndroid Build Coastguard Worker // If found, a pointer to the frame is returned. Returns nullptr otherwise. 102*d9f75844SAndroid Build Coastguard Worker VCMEncodedFrame* NextCompleteFrame(uint32_t max_wait_time_ms); 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker // Extract frame corresponding to input timestamp. 105*d9f75844SAndroid Build Coastguard Worker // Frame will be set to a decoding state. 106*d9f75844SAndroid Build Coastguard Worker VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp); 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker // Releases a frame returned from the jitter buffer, should be called when 109*d9f75844SAndroid Build Coastguard Worker // done with decoding. 110*d9f75844SAndroid Build Coastguard Worker void ReleaseFrame(VCMEncodedFrame* frame); 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker // Returns the time in ms when the latest packet was inserted into the frame. 113*d9f75844SAndroid Build Coastguard Worker // Retransmitted is set to true if any of the packets belonging to the frame 114*d9f75844SAndroid Build Coastguard Worker // has been retransmitted. 115*d9f75844SAndroid Build Coastguard Worker int64_t LastPacketTime(const VCMEncodedFrame* frame, 116*d9f75844SAndroid Build Coastguard Worker bool* retransmitted) const; 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker // Inserts a packet into a frame returned from GetFrame(). 119*d9f75844SAndroid Build Coastguard Worker // If the return value is <= 0, `frame` is invalidated and the pointer must 120*d9f75844SAndroid Build Coastguard Worker // be dropped after this function returns. 121*d9f75844SAndroid Build Coastguard Worker VCMFrameBufferEnum InsertPacket(const VCMPacket& packet, bool* retransmitted); 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker // Returns the estimated jitter in milliseconds. 124*d9f75844SAndroid Build Coastguard Worker uint32_t EstimatedJitterMs(); 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker void SetNackSettings(size_t max_nack_list_size, 127*d9f75844SAndroid Build Coastguard Worker int max_packet_age_to_nack, 128*d9f75844SAndroid Build Coastguard Worker int max_incomplete_time_ms); 129*d9f75844SAndroid Build Coastguard Worker 130*d9f75844SAndroid Build Coastguard Worker // Returns a list of the sequence numbers currently missing. 131*d9f75844SAndroid Build Coastguard Worker std::vector<uint16_t> GetNackList(bool* request_key_frame); 132*d9f75844SAndroid Build Coastguard Worker 133*d9f75844SAndroid Build Coastguard Worker private: 134*d9f75844SAndroid Build Coastguard Worker class SequenceNumberLessThan { 135*d9f75844SAndroid Build Coastguard Worker public: operator()136*d9f75844SAndroid Build Coastguard Worker bool operator()(const uint16_t& sequence_number1, 137*d9f75844SAndroid Build Coastguard Worker const uint16_t& sequence_number2) const { 138*d9f75844SAndroid Build Coastguard Worker return IsNewerSequenceNumber(sequence_number2, sequence_number1); 139*d9f75844SAndroid Build Coastguard Worker } 140*d9f75844SAndroid Build Coastguard Worker }; 141*d9f75844SAndroid Build Coastguard Worker typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet; 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker // Gets the frame assigned to the timestamp of the packet. May recycle 144*d9f75844SAndroid Build Coastguard Worker // existing frames if no free frames are available. Returns an error code if 145*d9f75844SAndroid Build Coastguard Worker // failing, or kNoError on success. `frame_list` contains which list the 146*d9f75844SAndroid Build Coastguard Worker // packet was in, or NULL if it was not in a FrameList (a new frame). 147*d9f75844SAndroid Build Coastguard Worker VCMFrameBufferEnum GetFrame(const VCMPacket& packet, 148*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer** frame, 149*d9f75844SAndroid Build Coastguard Worker FrameList** frame_list) 150*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 151*d9f75844SAndroid Build Coastguard Worker 152*d9f75844SAndroid Build Coastguard Worker // Returns true if `frame` is continuous in `decoding_state`, not taking 153*d9f75844SAndroid Build Coastguard Worker // decodable frames into account. 154*d9f75844SAndroid Build Coastguard Worker bool IsContinuousInState(const VCMFrameBuffer& frame, 155*d9f75844SAndroid Build Coastguard Worker const VCMDecodingState& decoding_state) const 156*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 157*d9f75844SAndroid Build Coastguard Worker // Returns true if `frame` is continuous in the `last_decoded_state_`, taking 158*d9f75844SAndroid Build Coastguard Worker // all decodable frames into account. 159*d9f75844SAndroid Build Coastguard Worker bool IsContinuous(const VCMFrameBuffer& frame) const 160*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 161*d9f75844SAndroid Build Coastguard Worker // Looks for frames in `incomplete_frames_` which are continuous in the 162*d9f75844SAndroid Build Coastguard Worker // provided `decoded_state`. Starts the search from the timestamp of 163*d9f75844SAndroid Build Coastguard Worker // `decoded_state`. 164*d9f75844SAndroid Build Coastguard Worker void FindAndInsertContinuousFramesWithState( 165*d9f75844SAndroid Build Coastguard Worker const VCMDecodingState& decoded_state) 166*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 167*d9f75844SAndroid Build Coastguard Worker // Looks for frames in `incomplete_frames_` which are continuous in 168*d9f75844SAndroid Build Coastguard Worker // `last_decoded_state_` taking all decodable frames into account. Starts 169*d9f75844SAndroid Build Coastguard Worker // the search from `new_frame`. 170*d9f75844SAndroid Build Coastguard Worker void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame) 171*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 172*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer* NextFrame() const RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 173*d9f75844SAndroid Build Coastguard Worker // Returns true if the NACK list was updated to cover sequence numbers up to 174*d9f75844SAndroid Build Coastguard Worker // `sequence_number`. If false a key frame is needed to get into a state where 175*d9f75844SAndroid Build Coastguard Worker // we can continue decoding. 176*d9f75844SAndroid Build Coastguard Worker bool UpdateNackList(uint16_t sequence_number) 177*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 178*d9f75844SAndroid Build Coastguard Worker bool TooLargeNackList() const; 179*d9f75844SAndroid Build Coastguard Worker // Returns true if the NACK list was reduced without problem. If false a key 180*d9f75844SAndroid Build Coastguard Worker // frame is needed to get into a state where we can continue decoding. 181*d9f75844SAndroid Build Coastguard Worker bool HandleTooLargeNackList() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 182*d9f75844SAndroid Build Coastguard Worker bool MissingTooOldPacket(uint16_t latest_sequence_number) const 183*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 184*d9f75844SAndroid Build Coastguard Worker // Returns true if the too old packets was successfully removed from the NACK 185*d9f75844SAndroid Build Coastguard Worker // list. If false, a key frame is needed to get into a state where we can 186*d9f75844SAndroid Build Coastguard Worker // continue decoding. 187*d9f75844SAndroid Build Coastguard Worker bool HandleTooOldPackets(uint16_t latest_sequence_number) 188*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 189*d9f75844SAndroid Build Coastguard Worker // Drops all packets in the NACK list up until `last_decoded_sequence_number`. 190*d9f75844SAndroid Build Coastguard Worker void DropPacketsFromNackList(uint16_t last_decoded_sequence_number); 191*d9f75844SAndroid Build Coastguard Worker 192*d9f75844SAndroid Build Coastguard Worker // Gets an empty frame, creating a new frame if necessary (i.e. increases 193*d9f75844SAndroid Build Coastguard Worker // jitter buffer size). 194*d9f75844SAndroid Build Coastguard Worker VCMFrameBuffer* GetEmptyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 195*d9f75844SAndroid Build Coastguard Worker 196*d9f75844SAndroid Build Coastguard Worker // Attempts to increase the size of the jitter buffer. Returns true on 197*d9f75844SAndroid Build Coastguard Worker // success, false otherwise. 198*d9f75844SAndroid Build Coastguard Worker bool TryToIncreaseJitterBufferSize() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 199*d9f75844SAndroid Build Coastguard Worker 200*d9f75844SAndroid Build Coastguard Worker // Recycles oldest frames until a key frame is found. Used if jitter buffer is 201*d9f75844SAndroid Build Coastguard Worker // completely full. Returns true if a key frame was found. 202*d9f75844SAndroid Build Coastguard Worker bool RecycleFramesUntilKeyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 203*d9f75844SAndroid Build Coastguard Worker 204*d9f75844SAndroid Build Coastguard Worker // Update rolling average of packets per frame. 205*d9f75844SAndroid Build Coastguard Worker void UpdateAveragePacketsPerFrame(int current_number_packets_); 206*d9f75844SAndroid Build Coastguard Worker 207*d9f75844SAndroid Build Coastguard Worker // Cleans the frame list in the JB from old/empty frames. 208*d9f75844SAndroid Build Coastguard Worker // Should only be called prior to actual use. 209*d9f75844SAndroid Build Coastguard Worker void CleanUpOldOrEmptyFrames() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker // Returns true if `packet` is likely to have been retransmitted. 212*d9f75844SAndroid Build Coastguard Worker bool IsPacketRetransmitted(const VCMPacket& packet) const; 213*d9f75844SAndroid Build Coastguard Worker 214*d9f75844SAndroid Build Coastguard Worker // The following three functions update the jitter estimate with the 215*d9f75844SAndroid Build Coastguard Worker // payload size, receive time and RTP timestamp of a frame. 216*d9f75844SAndroid Build Coastguard Worker void UpdateJitterEstimate(const VCMJitterSample& sample, 217*d9f75844SAndroid Build Coastguard Worker bool incomplete_frame); 218*d9f75844SAndroid Build Coastguard Worker void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame); 219*d9f75844SAndroid Build Coastguard Worker void UpdateJitterEstimate(int64_t latest_packet_time_ms, 220*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp, 221*d9f75844SAndroid Build Coastguard Worker unsigned int frame_size, 222*d9f75844SAndroid Build Coastguard Worker bool incomplete_frame); 223*d9f75844SAndroid Build Coastguard Worker 224*d9f75844SAndroid Build Coastguard Worker int NonContinuousOrIncompleteDuration() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 225*d9f75844SAndroid Build Coastguard Worker 226*d9f75844SAndroid Build Coastguard Worker uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const; 227*d9f75844SAndroid Build Coastguard Worker 228*d9f75844SAndroid Build Coastguard Worker // Reset frame buffer and return it to free_frames_. 229*d9f75844SAndroid Build Coastguard Worker void RecycleFrameBuffer(VCMFrameBuffer* frame) 230*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 231*d9f75844SAndroid Build Coastguard Worker 232*d9f75844SAndroid Build Coastguard Worker Clock* clock_; 233*d9f75844SAndroid Build Coastguard Worker // If we are running (have started) or not. 234*d9f75844SAndroid Build Coastguard Worker bool running_; 235*d9f75844SAndroid Build Coastguard Worker mutable Mutex mutex_; 236*d9f75844SAndroid Build Coastguard Worker // Event to signal when we have a frame ready for decoder. 237*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<EventWrapper> frame_event_; 238*d9f75844SAndroid Build Coastguard Worker // Number of allocated frames. 239*d9f75844SAndroid Build Coastguard Worker int max_number_of_frames_; 240*d9f75844SAndroid Build Coastguard Worker UnorderedFrameList free_frames_ RTC_GUARDED_BY(mutex_); 241*d9f75844SAndroid Build Coastguard Worker FrameList decodable_frames_ RTC_GUARDED_BY(mutex_); 242*d9f75844SAndroid Build Coastguard Worker FrameList incomplete_frames_ RTC_GUARDED_BY(mutex_); 243*d9f75844SAndroid Build Coastguard Worker VCMDecodingState last_decoded_state_ RTC_GUARDED_BY(mutex_); 244*d9f75844SAndroid Build Coastguard Worker bool first_packet_since_reset_; 245*d9f75844SAndroid Build Coastguard Worker 246*d9f75844SAndroid Build Coastguard Worker // Number of packets in a row that have been too old. 247*d9f75844SAndroid Build Coastguard Worker int num_consecutive_old_packets_; 248*d9f75844SAndroid Build Coastguard Worker // Number of packets received. 249*d9f75844SAndroid Build Coastguard Worker int num_packets_ RTC_GUARDED_BY(mutex_); 250*d9f75844SAndroid Build Coastguard Worker // Number of duplicated packets received. 251*d9f75844SAndroid Build Coastguard Worker int num_duplicated_packets_ RTC_GUARDED_BY(mutex_); 252*d9f75844SAndroid Build Coastguard Worker 253*d9f75844SAndroid Build Coastguard Worker // Jitter estimation. 254*d9f75844SAndroid Build Coastguard Worker // Filter for estimating jitter. 255*d9f75844SAndroid Build Coastguard Worker JitterEstimator jitter_estimate_; 256*d9f75844SAndroid Build Coastguard Worker // Calculates network delays used for jitter calculations. 257*d9f75844SAndroid Build Coastguard Worker InterFrameDelay inter_frame_delay_; 258*d9f75844SAndroid Build Coastguard Worker VCMJitterSample waiting_for_completion_; 259*d9f75844SAndroid Build Coastguard Worker 260*d9f75844SAndroid Build Coastguard Worker // Holds the internal NACK list (the missing sequence numbers). 261*d9f75844SAndroid Build Coastguard Worker SequenceNumberSet missing_sequence_numbers_; 262*d9f75844SAndroid Build Coastguard Worker uint16_t latest_received_sequence_number_; 263*d9f75844SAndroid Build Coastguard Worker size_t max_nack_list_size_; 264*d9f75844SAndroid Build Coastguard Worker int max_packet_age_to_nack_; // Measured in sequence numbers. 265*d9f75844SAndroid Build Coastguard Worker int max_incomplete_time_ms_; 266*d9f75844SAndroid Build Coastguard Worker 267*d9f75844SAndroid Build Coastguard Worker // Estimated rolling average of packets per frame 268*d9f75844SAndroid Build Coastguard Worker float average_packets_per_frame_; 269*d9f75844SAndroid Build Coastguard Worker // average_packets_per_frame converges fast if we have fewer than this many 270*d9f75844SAndroid Build Coastguard Worker // frames. 271*d9f75844SAndroid Build Coastguard Worker int frame_counter_; 272*d9f75844SAndroid Build Coastguard Worker }; 273*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 274*d9f75844SAndroid Build Coastguard Worker 275*d9f75844SAndroid Build Coastguard Worker #endif // MODULES_VIDEO_CODING_JITTER_BUFFER_H_ 276