blob: df7581a87ef52f2d3464728e42d9f5ac85195df1 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_JITTER_BUFFER_H_
12#define 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/include/module_common_types.h"
Danil Chapovalov7c067772019-10-07 12:56:24 +020021#include "modules/include/module_common_types_public.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "modules/video_coding/decoding_state.h"
Niels Möllerd3da6b02020-03-05 15:31:10 +010023#include "modules/video_coding/event_wrapper.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "modules/video_coding/include/video_coding.h"
25#include "modules/video_coding/include/video_coding_defines.h"
26#include "modules/video_coding/inter_frame_delay.h"
27#include "modules/video_coding/jitter_buffer_common.h"
28#include "modules/video_coding/jitter_estimator.h"
Markus Handell6deec382020-07-07 12:17:12 +020029#include "rtc_base/synchronization/mutex.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "rtc_base/thread_annotations.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
niklase@google.com470e71d2011-07-07 08:21:25 +000034// forward declarations
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000035class Clock;
niklase@google.com470e71d2011-07-07 08:21:25 +000036class VCMFrameBuffer;
37class VCMPacket;
38class VCMEncodedFrame;
39
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000040typedef std::list<VCMFrameBuffer*> UnorderedFrameList;
41
stefan@webrtc.org912981f2012-10-12 07:04:52 +000042struct VCMJitterSample {
43 VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {}
44 uint32_t timestamp;
45 uint32_t frame_size;
46 int64_t latest_packet_time;
niklase@google.com470e71d2011-07-07 08:21:25 +000047};
48
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000049class TimestampLessThan {
50 public:
philipel9d3ab612015-12-21 04:12:39 -080051 bool operator()(uint32_t timestamp1, uint32_t timestamp2) const {
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000052 return IsNewerTimestamp(timestamp2, timestamp1);
53 }
54};
55
agalusza@google.comd818dcb2013-07-29 21:48:11 +000056class FrameList
57 : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000058 public:
59 void InsertFrame(VCMFrameBuffer* frame);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000060 VCMFrameBuffer* PopFrame(uint32_t timestamp);
stefan@webrtc.org50fb4af2013-06-17 07:33:58 +000061 VCMFrameBuffer* Front() const;
62 VCMFrameBuffer* Back() const;
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000063 int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
philipel9d3ab612015-12-21 04:12:39 -080064 UnorderedFrameList* free_frames);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +000065 void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
66 UnorderedFrameList* free_frames);
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000067 void Reset(UnorderedFrameList* free_frames);
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +000068};
69
stefan@webrtc.org912981f2012-10-12 07:04:52 +000070class VCMJitterBuffer {
71 public:
Niels Möllerdb64d992019-03-29 14:30:53 +010072 VCMJitterBuffer(Clock* clock, std::unique_ptr<EventWrapper> event);
Qiang Chend4cec152015-06-19 09:17:00 -070073
Wan-Teh Chang6a1ba8c2015-05-26 14:11:41 -070074 ~VCMJitterBuffer();
niklase@google.com470e71d2011-07-07 08:21:25 +000075
Byoungchan Lee604fd2f2022-01-21 09:49:39 +090076 VCMJitterBuffer(const VCMJitterBuffer&) = delete;
77 VCMJitterBuffer& operator=(const VCMJitterBuffer&) = delete;
78
stefan@webrtc.org912981f2012-10-12 07:04:52 +000079 // Initializes and starts jitter buffer.
80 void Start();
niklase@google.com470e71d2011-07-07 08:21:25 +000081
stefan@webrtc.org912981f2012-10-12 07:04:52 +000082 // Signals all internal events and stops the jitter buffer.
83 void Stop();
niklase@google.com470e71d2011-07-07 08:21:25 +000084
stefan@webrtc.org912981f2012-10-12 07:04:52 +000085 // Returns true if the jitter buffer is running.
86 bool Running() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000087
stefan@webrtc.org912981f2012-10-12 07:04:52 +000088 // Empty the jitter buffer of all its data.
89 void Flush();
stefan@webrtc.org791eec72011-10-11 07:53:43 +000090
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000091 // Gets number of packets received.
92 int num_packets() const;
93
94 // Gets number of duplicated packets received.
95 int num_duplicated_packets() const;
96
Artem Titovdcd7fc72021-08-09 13:02:57 +020097 // Wait `max_wait_time_ms` for a complete frame to arrive.
isheriff6b4b5f32016-06-08 00:24:21 -070098 // If found, a pointer to the frame is returned. Returns nullptr otherwise.
99 VCMEncodedFrame* NextCompleteFrame(uint32_t max_wait_time_ms);
niklase@google.com470e71d2011-07-07 08:21:25 +0000100
mikhal@webrtc.org759b0412013-05-07 16:36:00 +0000101 // Extract frame corresponding to input timestamp.
102 // Frame will be set to a decoding state.
103 VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp);
niklase@google.com470e71d2011-07-07 08:21:25 +0000104
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000105 // Releases a frame returned from the jitter buffer, should be called when
106 // done with decoding.
107 void ReleaseFrame(VCMEncodedFrame* frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000108
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000109 // Returns the time in ms when the latest packet was inserted into the frame.
110 // Retransmitted is set to true if any of the packets belonging to the frame
111 // has been retransmitted.
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000112 int64_t LastPacketTime(const VCMEncodedFrame* frame,
113 bool* retransmitted) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000114
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000115 // Inserts a packet into a frame returned from GetFrame().
Artem Titovdcd7fc72021-08-09 13:02:57 +0200116 // If the return value is <= 0, `frame` is invalidated and the pointer must
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000117 // be dropped after this function returns.
philipel9d3ab612015-12-21 04:12:39 -0800118 VCMFrameBufferEnum InsertPacket(const VCMPacket& packet, bool* retransmitted);
niklase@google.com470e71d2011-07-07 08:21:25 +0000119
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000120 // Returns the estimated jitter in milliseconds.
121 uint32_t EstimatedJitterMs();
niklase@google.com470e71d2011-07-07 08:21:25 +0000122
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000123 void SetNackSettings(size_t max_nack_list_size,
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000124 int max_packet_age_to_nack,
125 int max_incomplete_time_ms);
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000126
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000127 // Returns a list of the sequence numbers currently missing.
Wan-Teh Changb1825a42015-06-03 15:03:35 -0700128 std::vector<uint16_t> GetNackList(bool* request_key_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000129
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000130 private:
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000131 class SequenceNumberLessThan {
132 public:
philipel9d3ab612015-12-21 04:12:39 -0800133 bool operator()(const uint16_t& sequence_number1,
134 const uint16_t& sequence_number2) const {
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +0000135 return IsNewerSequenceNumber(sequence_number2, sequence_number1);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000136 }
137 };
138 typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
139
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000140 // Gets the frame assigned to the timestamp of the packet. May recycle
141 // existing frames if no free frames are available. Returns an error code if
Artem Titovdcd7fc72021-08-09 13:02:57 +0200142 // failing, or kNoError on success. `frame_list` contains which list the
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000143 // packet was in, or NULL if it was not in a FrameList (a new frame).
144 VCMFrameBufferEnum GetFrame(const VCMPacket& packet,
145 VCMFrameBuffer** frame,
146 FrameList** frame_list)
Markus Handell6deec382020-07-07 12:17:12 +0200147 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000148
Artem Titovdcd7fc72021-08-09 13:02:57 +0200149 // Returns true if `frame` is continuous in `decoding_state`, not taking
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000150 // decodable frames into account.
151 bool IsContinuousInState(const VCMFrameBuffer& frame,
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000152 const VCMDecodingState& decoding_state) const
Markus Handell6deec382020-07-07 12:17:12 +0200153 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
Artem Titovdcd7fc72021-08-09 13:02:57 +0200154 // Returns true if `frame` is continuous in the `last_decoded_state_`, taking
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000155 // all decodable frames into account.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000156 bool IsContinuous(const VCMFrameBuffer& frame) const
Markus Handell6deec382020-07-07 12:17:12 +0200157 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
Artem Titovdcd7fc72021-08-09 13:02:57 +0200158 // Looks for frames in `incomplete_frames_` which are continuous in the
159 // provided `decoded_state`. Starts the search from the timestamp of
160 // `decoded_state`.
Noah Richardse4cb4e92015-05-22 14:03:00 -0700161 void FindAndInsertContinuousFramesWithState(
162 const VCMDecodingState& decoded_state)
Markus Handell6deec382020-07-07 12:17:12 +0200163 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
Artem Titovdcd7fc72021-08-09 13:02:57 +0200164 // Looks for frames in `incomplete_frames_` which are continuous in
165 // `last_decoded_state_` taking all decodable frames into account. Starts
166 // the search from `new_frame`.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000167 void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame)
Markus Handell6deec382020-07-07 12:17:12 +0200168 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
169 VCMFrameBuffer* NextFrame() const RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000170 // Returns true if the NACK list was updated to cover sequence numbers up to
Artem Titovdcd7fc72021-08-09 13:02:57 +0200171 // `sequence_number`. If false a key frame is needed to get into a state where
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000172 // we can continue decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000173 bool UpdateNackList(uint16_t sequence_number)
Markus Handell6deec382020-07-07 12:17:12 +0200174 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000175 bool TooLargeNackList() const;
176 // Returns true if the NACK list was reduced without problem. If false a key
177 // frame is needed to get into a state where we can continue decoding.
Markus Handell6deec382020-07-07 12:17:12 +0200178 bool HandleTooLargeNackList() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000179 bool MissingTooOldPacket(uint16_t latest_sequence_number) const
Markus Handell6deec382020-07-07 12:17:12 +0200180 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000181 // Returns true if the too old packets was successfully removed from the NACK
182 // list. If false, a key frame is needed to get into a state where we can
183 // continue decoding.
pbos@webrtc.org4f16c872014-11-24 09:06:48 +0000184 bool HandleTooOldPackets(uint16_t latest_sequence_number)
Markus Handell6deec382020-07-07 12:17:12 +0200185 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
Artem Titovdcd7fc72021-08-09 13:02:57 +0200186 // Drops all packets in the NACK list up until `last_decoded_sequence_number`.
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000187 void DropPacketsFromNackList(uint16_t last_decoded_sequence_number);
188
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000189 // Gets an empty frame, creating a new frame if necessary (i.e. increases
190 // jitter buffer size).
Markus Handell6deec382020-07-07 12:17:12 +0200191 VCMFrameBuffer* GetEmptyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000192
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +0000193 // Attempts to increase the size of the jitter buffer. Returns true on
194 // success, false otherwise.
Markus Handell6deec382020-07-07 12:17:12 +0200195 bool TryToIncreaseJitterBufferSize() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +0000196
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000197 // Recycles oldest frames until a key frame is found. Used if jitter buffer is
198 // completely full. Returns true if a key frame was found.
Markus Handell6deec382020-07-07 12:17:12 +0200199 bool RecycleFramesUntilKeyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000200
agalusza@google.comd818dcb2013-07-29 21:48:11 +0000201 // Update rolling average of packets per frame.
202 void UpdateAveragePacketsPerFrame(int current_number_packets_);
203
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000204 // Cleans the frame list in the JB from old/empty frames.
205 // Should only be called prior to actual use.
Markus Handell6deec382020-07-07 12:17:12 +0200206 void CleanUpOldOrEmptyFrames() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000207
Artem Titovdcd7fc72021-08-09 13:02:57 +0200208 // Returns true if `packet` is likely to have been retransmitted.
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000209 bool IsPacketRetransmitted(const VCMPacket& packet) const;
henrik.lundin@webrtc.orgbaf6db52011-11-02 18:58:39 +0000210
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000211 // The following three functions update the jitter estimate with the
212 // payload size, receive time and RTP timestamp of a frame.
213 void UpdateJitterEstimate(const VCMJitterSample& sample,
214 bool incomplete_frame);
215 void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame);
216 void UpdateJitterEstimate(int64_t latest_packet_time_ms,
217 uint32_t timestamp,
218 unsigned int frame_size,
219 bool incomplete_frame);
220
Markus Handell6deec382020-07-07 12:17:12 +0200221 int NonContinuousOrIncompleteDuration() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000222
223 uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
224
sprang22691e02016-07-13 10:57:07 -0700225 // Reset frame buffer and return it to free_frames_.
226 void RecycleFrameBuffer(VCMFrameBuffer* frame)
Markus Handell6deec382020-07-07 12:17:12 +0200227 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
sprang22691e02016-07-13 10:57:07 -0700228
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000229 Clock* clock_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000230 // If we are running (have started) or not.
231 bool running_;
Markus Handell6deec382020-07-07 12:17:12 +0200232 mutable Mutex mutex_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000233 // Event to signal when we have a frame ready for decoder.
kwiberg3f55dea2016-02-29 05:51:59 -0800234 std::unique_ptr<EventWrapper> frame_event_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000235 // Number of allocated frames.
236 int max_number_of_frames_;
Markus Handell6deec382020-07-07 12:17:12 +0200237 UnorderedFrameList free_frames_ RTC_GUARDED_BY(mutex_);
238 FrameList decodable_frames_ RTC_GUARDED_BY(mutex_);
239 FrameList incomplete_frames_ RTC_GUARDED_BY(mutex_);
240 VCMDecodingState last_decoded_state_ RTC_GUARDED_BY(mutex_);
stefan@webrtc.org3417eb42013-05-21 15:25:53 +0000241 bool first_packet_since_reset_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000242
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000243 // Number of packets in a row that have been too old.
244 int num_consecutive_old_packets_;
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000245 // Number of packets received.
Markus Handell6deec382020-07-07 12:17:12 +0200246 int num_packets_ RTC_GUARDED_BY(mutex_);
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +0000247 // Number of duplicated packets received.
Markus Handell6deec382020-07-07 12:17:12 +0200248 int num_duplicated_packets_ RTC_GUARDED_BY(mutex_);
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000249
250 // Jitter estimation.
251 // Filter for estimating jitter.
252 VCMJitterEstimator jitter_estimate_;
253 // Calculates network delays used for jitter calculations.
254 VCMInterFrameDelay inter_frame_delay_;
255 VCMJitterSample waiting_for_completion_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000256
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000257 // Holds the internal NACK list (the missing sequence numbers).
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000258 SequenceNumberSet missing_sequence_numbers_;
259 uint16_t latest_received_sequence_number_;
stefan@webrtc.orgbecf9c82013-02-01 15:09:57 +0000260 size_t max_nack_list_size_;
261 int max_packet_age_to_nack_; // Measured in sequence numbers.
stefan@webrtc.orgef144882013-05-07 19:16:33 +0000262 int max_incomplete_time_ms_;
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000263
agalusza@google.comd818dcb2013-07-29 21:48:11 +0000264 // Estimated rolling average of packets per frame
265 float average_packets_per_frame_;
266 // average_packets_per_frame converges fast if we have fewer than this many
267 // frames.
268 int frame_counter_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000269};
stefan@webrtc.org912981f2012-10-12 07:04:52 +0000270} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000271
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200272#endif // MODULES_VIDEO_CODING_JITTER_BUFFER_H_