xref: /aosp_15_r20/external/webrtc/modules/video_coding/jitter_buffer.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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