blob: 8ba338f0c7bbc522ab9b0b48c6c844826d047596 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org29794612012-02-08 08:58:55 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#ifndef WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_H_
12#define WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000014#include <list>
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000015#include <map>
kwiberg3f55dea2016-02-29 05:51:59 -080016#include <memory>
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000017#include <set>
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +000018#include <vector>
stefan@webrtc.org29794612012-02-08 08:58:55 +000019
henrike@webrtc.org88fbb2d2014-05-21 21:18:46 +000020#include "webrtc/base/constructormagic.h"
asapersson@webrtc.org83b52002014-11-28 10:17:13 +000021#include "webrtc/base/thread_annotations.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010022#include "webrtc/modules/include/module_common_types.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010023#include "webrtc/modules/video_coding/include/video_coding.h"
24#include "webrtc/modules/video_coding/include/video_coding_defines.h"
25#include "webrtc/modules/video_coding/decoding_state.h"
26#include "webrtc/modules/video_coding/inter_frame_delay.h"
27#include "webrtc/modules/video_coding/jitter_buffer_common.h"
28#include "webrtc/modules/video_coding/jitter_estimator.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010029#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
mikhal@webrtc.org119c67d2013-01-31 17:18:02 +000030#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000031
stefan@webrtc.org912981f2012-10-12 07:04:52 +000032namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000033
philipel9d3ab612015-12-21 04:12:39 -080034enum VCMNackMode { kNack, kNoNack };
niklase@google.com470e71d2011-07-07 08:21:25 +000035
36// forward declarations
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000037class Clock;
stefan@webrtc.org2baf5f52013-03-13 08:46:25 +000038class EventFactory;
39class EventWrapper;
niklase@google.com470e71d2011-07-07 08:21:25 +000040class VCMFrameBuffer;
41class VCMPacket;
42class VCMEncodedFrame;
43
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000044typedef std::list<VCMFrameBuffer*> UnorderedFrameList;
45
stefan@webrtc.org912981f2012-10-12 07:04:52 +000046struct VCMJitterSample {
47 VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {}
48 uint32_t timestamp;
49 uint32_t frame_size;
50 int64_t latest_packet_time;
niklase@google.com470e71d2011-07-07 08:21:25 +000051};
52
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000053class TimestampLessThan {
54 public:
philipel9d3ab612015-12-21 04:12:39 -080055 bool operator()(uint32_t timestamp1, uint32_t timestamp2) const {
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000056 return IsNewerTimestamp(timestamp2, timestamp1);
57 }
58};
59
agalusza@google.comd818dcb2013-07-29 21:48:11 +000060class FrameList
61 : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000062 public:
63 void InsertFrame(VCMFrameBuffer* frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000064 VCMFrameBuffer* PopFrame(uint32_t timestamp);
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000065 VCMFrameBuffer* Front() const;
66 VCMFrameBuffer* Back() const;
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000067 int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
philipel9d3ab612015-12-21 04:12:39 -080068 UnorderedFrameList* free_frames);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +000069 void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
70 UnorderedFrameList* free_frames);
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000071 void Reset(UnorderedFrameList* free_frames);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000072};
73
asapersson9a4cd872015-10-23 00:27:14 -070074class Vp9SsMap {
75 public:
76 typedef std::map<uint32_t, GofInfoVP9, TimestampLessThan> SsMap;
77 bool Insert(const VCMPacket& packet);
78 void Reset();
79
80 // Removes SS data that are older than |timestamp|.
81 // The |timestamp| should be an old timestamp, i.e. packets with older
82 // timestamps should no longer be inserted.
83 void RemoveOld(uint32_t timestamp);
84
85 bool UpdatePacket(VCMPacket* packet);
86 void UpdateFrames(FrameList* frames);
87
88 // Public for testing.
89 // Returns an iterator to the corresponding SS data for the input |timestamp|.
90 bool Find(uint32_t timestamp, SsMap::iterator* it);
91
92 private:
93 // These two functions are called by RemoveOld.
94 // Checks if it is time to do a clean up (done each kSsCleanupIntervalSec).
95 bool TimeForCleanup(uint32_t timestamp) const;
96
97 // Advances the oldest SS data to handle timestamp wrap in cases where SS data
98 // are received very seldom (e.g. only once in beginning, second when
99 // IsNewerTimestamp is not true).
100 void AdvanceFront(uint32_t timestamp);
101
102 SsMap ss_map_;
103};
104
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000105class VCMJitterBuffer {
106 public:
kwiberg3f55dea2016-02-29 05:51:59 -0800107 VCMJitterBuffer(Clock* clock, std::unique_ptr<EventWrapper> event);
Qiang Chend4cec152015-06-19 09:17:00 -0700108
Wan-Teh Chang6a1ba8c2015-05-26 14:11:41 -0700109 ~VCMJitterBuffer();
niklase@google.com470e71d2011-07-07 08:21:25 +0000110
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000111 // Initializes and starts jitter buffer.
112 void Start();
niklase@google.com470e71d2011-07-07 08:21:25 +0000113
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000114 // Signals all internal events and stops the jitter buffer.
115 void Stop();
niklase@google.com470e71d2011-07-07 08:21:25 +0000116
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000117 // Returns true if the jitter buffer is running.
118 bool Running() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000119
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000120 // Empty the jitter buffer of all its data.
121 void Flush();
stefan@webrtc.org791eec72011-10-11 07:53:43 +0000122
sprang@webrtc.org71f055f2013-12-04 15:09:27 +0000123 // Get the number of received frames, by type, since the jitter buffer
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000124 // was started.
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000125 FrameCounts FrameStatistics() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000126
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000127 // The number of packets discarded by the jitter buffer because the decoder
128 // won't be able to decode them.
129 int num_not_decodable_packets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000131 // Gets number of packets received.
132 int num_packets() const;
133
134 // Gets number of duplicated packets received.
135 int num_duplicated_packets() const;
136
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000137 // Gets number of packets discarded by the jitter buffer.
138 int num_discarded_packets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000139
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000140 // Statistics, Calculate frame and bit rates.
philipel9d3ab612015-12-21 04:12:39 -0800141 void IncomingRateStatistics(unsigned int* framerate, unsigned int* bitrate);
niklase@google.com470e71d2011-07-07 08:21:25 +0000142
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000143 // Checks if the packet sequence will be complete if the next frame would be
144 // grabbed for decoding. That is, if a frame has been lost between the
145 // last decoded frame and the next, or if the next frame is missing one
146 // or more packets.
147 bool CompleteSequenceWithNextFrame();
niklase@google.com470e71d2011-07-07 08:21:25 +0000148
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000149 // Wait |max_wait_time_ms| for a complete frame to arrive.
150 // The function returns true once such a frame is found, its corresponding
151 // timestamp is returned. Otherwise, returns false.
152 bool NextCompleteTimestamp(uint32_t max_wait_time_ms, uint32_t* timestamp);
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000154 // Locates a frame for decoding (even an incomplete) without delay.
155 // The function returns true once such a frame is found, its corresponding
156 // timestamp is returned. Otherwise, returns false.
157 bool NextMaybeIncompleteTimestamp(uint32_t* timestamp);
158
159 // Extract frame corresponding to input timestamp.
160 // Frame will be set to a decoding state.
161 VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp);
niklase@google.com470e71d2011-07-07 08:21:25 +0000162
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000163 // Releases a frame returned from the jitter buffer, should be called when
164 // done with decoding.
165 void ReleaseFrame(VCMEncodedFrame* frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000166
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000167 // Returns the time in ms when the latest packet was inserted into the frame.
168 // Retransmitted is set to true if any of the packets belonging to the frame
169 // has been retransmitted.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000170 int64_t LastPacketTime(const VCMEncodedFrame* frame,
171 bool* retransmitted) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000172
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000173 // Inserts a packet into a frame returned from GetFrame().
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000174 // If the return value is <= 0, |frame| is invalidated and the pointer must
175 // be dropped after this function returns.
philipel9d3ab612015-12-21 04:12:39 -0800176 VCMFrameBufferEnum InsertPacket(const VCMPacket& packet, bool* retransmitted);
niklase@google.com470e71d2011-07-07 08:21:25 +0000177
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000178 // Returns the estimated jitter in milliseconds.
179 uint32_t EstimatedJitterMs();
niklase@google.com470e71d2011-07-07 08:21:25 +0000180
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000181 // Updates the round-trip time estimate.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000182 void UpdateRtt(int64_t rtt_ms);
niklase@google.com470e71d2011-07-07 08:21:25 +0000183
Wan-Teh Chang603175a2015-05-28 14:10:14 -0700184 // Set the NACK mode. |high_rtt_nack_threshold_ms| is an RTT threshold in ms
Wan-Teh Changf2912872015-06-05 13:16:45 -0700185 // above which NACK will be disabled if the NACK mode is |kNack|, -1 meaning
186 // that NACK is always enabled in the |kNack| mode.
Wan-Teh Chang603175a2015-05-28 14:10:14 -0700187 // |low_rtt_nack_threshold_ms| is an RTT threshold in ms below which we expect
188 // to rely on NACK only, and therefore are using larger buffers to have time
189 // to wait for retransmissions.
philipel9d3ab612015-12-21 04:12:39 -0800190 void SetNackMode(VCMNackMode mode,
191 int64_t low_rtt_nack_threshold_ms,
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000192 int64_t high_rtt_nack_threshold_ms);
niklase@google.com470e71d2011-07-07 08:21:25 +0000193
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000194 void SetNackSettings(size_t max_nack_list_size,
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000195 int max_packet_age_to_nack,
196 int max_incomplete_time_ms);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000197
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000198 // Returns the current NACK mode.
199 VCMNackMode nack_mode() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000200
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000201 // Returns a list of the sequence numbers currently missing.
Wan-Teh Changb1825a42015-06-03 15:03:35 -0700202 std::vector<uint16_t> GetNackList(bool* request_key_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000203
mikhal@webrtc.org3c5a9242013-09-03 20:45:36 +0000204 // Set decode error mode - Should not be changed in the middle of the
205 // session. Changes will not influence frames already in the buffer.
mikhal@webrtc.orgdbf6a812013-08-21 20:40:47 +0000206 void SetDecodeErrorMode(VCMDecodeErrorMode error_mode);
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000207 int64_t LastDecodedTimestamp() const;
philipel9d3ab612015-12-21 04:12:39 -0800208 VCMDecodeErrorMode decode_error_mode() const { return decode_error_mode_; }
stefan@webrtc.org4c059d82011-10-13 07:35:37 +0000209
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000210 // Used to compute time of complete continuous frames. Returns the timestamps
211 // corresponding to the start and end of the continuous complete buffer.
212 void RenderBufferSize(uint32_t* timestamp_start, uint32_t* timestamp_end);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000213
pbos@webrtc.org55707692014-12-19 15:45:03 +0000214 void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000215
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000216 private:
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000217 class SequenceNumberLessThan {
218 public:
philipel9d3ab612015-12-21 04:12:39 -0800219 bool operator()(const uint16_t& sequence_number1,
220 const uint16_t& sequence_number2) const {
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +0000221 return IsNewerSequenceNumber(sequence_number2, sequence_number1);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000222 }
223 };
224 typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
225
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000226 // Gets the frame assigned to the timestamp of the packet. May recycle
227 // existing frames if no free frames are available. Returns an error code if
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000228 // failing, or kNoError on success. |frame_list| contains which list the
229 // packet was in, or NULL if it was not in a FrameList (a new frame).
230 VCMFrameBufferEnum GetFrame(const VCMPacket& packet,
231 VCMFrameBuffer** frame,
232 FrameList** frame_list)
233 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000234
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000235 // Returns true if |frame| is continuous in |decoding_state|, not taking
236 // decodable frames into account.
237 bool IsContinuousInState(const VCMFrameBuffer& frame,
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000238 const VCMDecodingState& decoding_state) const
239 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000240 // Returns true if |frame| is continuous in the |last_decoded_state_|, taking
241 // all decodable frames into account.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000242 bool IsContinuous(const VCMFrameBuffer& frame) const
243 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
Noah Richardse4cb4e92015-05-22 14:03:00 -0700244 // Looks for frames in |incomplete_frames_| which are continuous in the
245 // provided |decoded_state|. Starts the search from the timestamp of
246 // |decoded_state|.
247 void FindAndInsertContinuousFramesWithState(
248 const VCMDecodingState& decoded_state)
249 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000250 // Looks for frames in |incomplete_frames_| which are continuous in
251 // |last_decoded_state_| taking all decodable frames into account. Starts
252 // the search from |new_frame|.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000253 void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame)
254 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
255 VCMFrameBuffer* NextFrame() const EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000256 // Returns true if the NACK list was updated to cover sequence numbers up to
257 // |sequence_number|. If false a key frame is needed to get into a state where
258 // we can continue decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000259 bool UpdateNackList(uint16_t sequence_number)
260 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000261 bool TooLargeNackList() const;
262 // Returns true if the NACK list was reduced without problem. If false a key
263 // frame is needed to get into a state where we can continue decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000264 bool HandleTooLargeNackList() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
265 bool MissingTooOldPacket(uint16_t latest_sequence_number) const
266 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000267 // Returns true if the too old packets was successfully removed from the NACK
268 // list. If false, a key frame is needed to get into a state where we can
269 // continue decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000270 bool HandleTooOldPackets(uint16_t latest_sequence_number)
271 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000272 // Drops all packets in the NACK list up until |last_decoded_sequence_number|.
273 void DropPacketsFromNackList(uint16_t last_decoded_sequence_number);
274
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000275 void ReleaseFrameIfNotDecoding(VCMFrameBuffer* frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000276
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000277 // Gets an empty frame, creating a new frame if necessary (i.e. increases
278 // jitter buffer size).
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000279 VCMFrameBuffer* GetEmptyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000280
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +0000281 // Attempts to increase the size of the jitter buffer. Returns true on
282 // success, false otherwise.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000283 bool TryToIncreaseJitterBufferSize() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +0000284
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000285 // Recycles oldest frames until a key frame is found. Used if jitter buffer is
286 // completely full. Returns true if a key frame was found.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000287 bool RecycleFramesUntilKeyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000288
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +0000289 // Updates the frame statistics.
agalusza@google.comd177c102013-08-08 01:12:33 +0000290 // Counts only complete frames, so decodable incomplete frames will not be
291 // counted.
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000292 void CountFrame(const VCMFrameBuffer& frame)
293 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.org791eec72011-10-11 07:53:43 +0000294
agalusza@google.comd818dcb2013-07-29 21:48:11 +0000295 // Update rolling average of packets per frame.
296 void UpdateAveragePacketsPerFrame(int current_number_packets_);
297
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000298 // Cleans the frame list in the JB from old/empty frames.
299 // Should only be called prior to actual use.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000300 void CleanUpOldOrEmptyFrames() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000301
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000302 // Returns true if |packet| is likely to have been retransmitted.
303 bool IsPacketRetransmitted(const VCMPacket& packet) const;
henrik.lundin@webrtc.orgbaf6db52011-11-02 18:58:39 +0000304
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000305 // The following three functions update the jitter estimate with the
306 // payload size, receive time and RTP timestamp of a frame.
307 void UpdateJitterEstimate(const VCMJitterSample& sample,
308 bool incomplete_frame);
309 void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame);
310 void UpdateJitterEstimate(int64_t latest_packet_time_ms,
311 uint32_t timestamp,
312 unsigned int frame_size,
313 bool incomplete_frame);
314
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000315 // Returns true if we should wait for retransmissions, false otherwise.
316 bool WaitForRetransmissions();
317
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000318 int NonContinuousOrIncompleteDuration() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000319
320 uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
321
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000322 void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000323
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000324 Clock* clock_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000325 // If we are running (have started) or not.
326 bool running_;
327 CriticalSectionWrapper* crit_sect_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000328 // Event to signal when we have a frame ready for decoder.
kwiberg3f55dea2016-02-29 05:51:59 -0800329 std::unique_ptr<EventWrapper> frame_event_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000330 // Number of allocated frames.
331 int max_number_of_frames_;
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000332 UnorderedFrameList free_frames_ GUARDED_BY(crit_sect_);
333 FrameList decodable_frames_ GUARDED_BY(crit_sect_);
334 FrameList incomplete_frames_ GUARDED_BY(crit_sect_);
335 VCMDecodingState last_decoded_state_ GUARDED_BY(crit_sect_);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000336 bool first_packet_since_reset_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000337
338 // Statistics.
pbos@webrtc.org55707692014-12-19 15:45:03 +0000339 VCMReceiveStatisticsCallback* stats_callback_ GUARDED_BY(crit_sect_);
sprang@webrtc.org71f055f2013-12-04 15:09:27 +0000340 // Frame counts for each type (key, delta, ...)
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000341 FrameCounts receive_statistics_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000342 // Latest calculated frame rates of incoming stream.
343 unsigned int incoming_frame_rate_;
344 unsigned int incoming_frame_count_;
345 int64_t time_last_incoming_frame_count_;
346 unsigned int incoming_bit_count_;
347 unsigned int incoming_bit_rate_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000348 // Number of frames in a row that have been too old.
349 int num_consecutive_old_frames_;
350 // Number of packets in a row that have been too old.
351 int num_consecutive_old_packets_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000352 // Number of packets received.
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000353 int num_packets_ GUARDED_BY(crit_sect_);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000354 // Number of duplicated packets received.
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000355 int num_duplicated_packets_ GUARDED_BY(crit_sect_);
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000356 // Number of packets discarded by the jitter buffer.
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000357 int num_discarded_packets_ GUARDED_BY(crit_sect_);
358 // Time when first packet is received.
359 int64_t time_first_packet_ms_ GUARDED_BY(crit_sect_);
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000360
361 // Jitter estimation.
362 // Filter for estimating jitter.
363 VCMJitterEstimator jitter_estimate_;
364 // Calculates network delays used for jitter calculations.
365 VCMInterFrameDelay inter_frame_delay_;
366 VCMJitterSample waiting_for_completion_;
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000367 int64_t rtt_ms_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000368
369 // NACK and retransmissions.
370 VCMNackMode nack_mode_;
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000371 int64_t low_rtt_nack_threshold_ms_;
372 int64_t high_rtt_nack_threshold_ms_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000373 // Holds the internal NACK list (the missing sequence numbers).
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000374 SequenceNumberSet missing_sequence_numbers_;
375 uint16_t latest_received_sequence_number_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000376 size_t max_nack_list_size_;
377 int max_packet_age_to_nack_; // Measured in sequence numbers.
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000378 int max_incomplete_time_ms_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000379
agalusza@google.coma7e360e2013-08-01 03:15:08 +0000380 VCMDecodeErrorMode decode_error_mode_;
agalusza@google.comd818dcb2013-07-29 21:48:11 +0000381 // Estimated rolling average of packets per frame
382 float average_packets_per_frame_;
383 // average_packets_per_frame converges fast if we have fewer than this many
384 // frames.
385 int frame_counter_;
henrikg3c089d72015-09-16 05:37:44 -0700386 RTC_DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000387};
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000388} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000389
Henrik Kjellander2557b862015-11-18 22:00:21 +0100390#endif // WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_H_