1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
148148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org#include <list>
1567ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org#include <map>
16bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org#include <set>
177fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org#include <vector>
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h"
20d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/interface/module_common_types.h"
217b2147f8975308f753380cf0248b84a733970a10agalusza@google.com#include "webrtc/modules/video_coding/main/interface/video_coding.h"
22d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
23d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/video_coding/main/source/decoding_state.h"
24d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/video_coding/main/source/inter_frame_delay.h"
25d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/video_coding/main/source/jitter_buffer_common.h"
26d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/modules/video_coding/main/source/jitter_estimator.h"
27d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
28d206d5ad989a4f1ea641beec1555e868ffb0b4e8mikhal@webrtc.org#include "webrtc/typedefs.h"
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum VCMNackMode {
33bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  kNack,
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNoNack
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// forward declarations
381bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.orgclass Clock;
392637d61b86b68c7082ae21b4cc9bc88cc36d1c13stefan@webrtc.orgclass EventFactory;
402637d61b86b68c7082ae21b4cc9bc88cc36d1c13stefan@webrtc.orgclass EventWrapper;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMFrameBuffer;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMPacket;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMEncodedFrame;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
458148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.orgtypedef std::list<VCMFrameBuffer*> UnorderedFrameList;
468148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VCMJitterSample {
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {}
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t frame_size;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t latest_packet_time;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
5467ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.orgclass TimestampLessThan {
5567ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org public:
5667ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org  bool operator() (const uint32_t& timestamp1,
5767ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org                   const uint32_t& timestamp2) const {
5867ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org    return IsNewerTimestamp(timestamp2, timestamp1);
5967ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org  }
6067ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org};
6167ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org
6299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comclass FrameList
6399199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com    : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
64376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org public:
65376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  void InsertFrame(VCMFrameBuffer* frame);
66376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  VCMFrameBuffer* FindFrame(uint32_t timestamp) const;
67376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  VCMFrameBuffer* PopFrame(uint32_t timestamp);
6867ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org  VCMFrameBuffer* Front() const;
6967ca2b42373e2f72e96daa4578dbe10333c61ecfstefan@webrtc.org  VCMFrameBuffer* Back() const;
708148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
718148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org      UnorderedFrameList* free_frames);
728148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  int CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
738148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org      UnorderedFrameList* free_frames);
748148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  void Reset(UnorderedFrameList* free_frames);
75376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org};
76376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMJitterBuffer {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
797fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org  VCMJitterBuffer(Clock* clock,
808edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org                  EventFactory* event_factory);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~VCMJitterBuffer();
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Makes |this| a deep copy of |rhs|.
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void CopyFrom(const VCMJitterBuffer& rhs);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Initializes and starts jitter buffer.
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Start();
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Signals all internal events and stops the jitter buffer.
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Stop();
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns true if the jitter buffer is running.
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool Running() const;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Empty the jitter buffer of all its data.
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Flush();
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
985fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org  // Get the number of received frames, by type, since the jitter buffer
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // was started.
1005fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org  std::map<FrameType, uint32_t> FrameStatistics() const;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The number of packets discarded by the jitter buffer because the decoder
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // won't be able to decode them.
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_not_decodable_packets() const;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets number of packets discarded by the jitter buffer.
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_discarded_packets() const;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Statistics, Calculate frame and bit rates.
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void IncomingRateStatistics(unsigned int* framerate,
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              unsigned int* bitrate);
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Checks if the packet sequence will be complete if the next frame would be
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // grabbed for decoding. That is, if a frame has been lost between the
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // last decoded frame and the next, or if the next frame is missing one
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // or more packets.
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool CompleteSequenceWithNextFrame();
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // Wait |max_wait_time_ms| for a complete frame to arrive.
120933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // The function returns true once such a frame is found, its corresponding
121933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // timestamp is returned. Otherwise, returns false.
122933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  bool NextCompleteTimestamp(uint32_t max_wait_time_ms, uint32_t* timestamp);
123933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org
124933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // Locates a frame for decoding (even an incomplete) without delay.
125933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // The function returns true once such a frame is found, its corresponding
126933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // timestamp is returned. Otherwise, returns false.
127933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  bool NextMaybeIncompleteTimestamp(uint32_t* timestamp);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
129933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // Extract frame corresponding to input timestamp.
130933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // Frame will be set to a decoding state.
131933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp);
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Releases a frame returned from the jitter buffer, should be called when
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // done with decoding.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ReleaseFrame(VCMEncodedFrame* frame);
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns the time in ms when the latest packet was inserted into the frame.
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Retransmitted is set to true if any of the packets belonging to the frame
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // has been retransmitted.
1403740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  int64_t LastPacketTime(const VCMEncodedFrame* frame,
1413740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org                         bool* retransmitted) const;
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Inserts a packet into a frame returned from GetFrame().
144376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // If the return value is <= 0, |frame| is invalidated and the pointer must
145376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // be dropped after this function returns.
1463740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  VCMFrameBufferEnum InsertPacket(const VCMPacket& packet,
1473740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org                                  bool* retransmitted);
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns the estimated jitter in milliseconds.
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t EstimatedJitterMs();
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Updates the round-trip time estimate.
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateRtt(uint32_t rtt_ms);
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set the NACK mode. |highRttNackThreshold| is an RTT threshold in ms above
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // which NACK will be disabled if the NACK mode is |kNackHybrid|, -1 meaning
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // that NACK is always enabled in the hybrid mode.
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |lowRttNackThreshold| is an RTT threshold in ms below which we expect to
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // rely on NACK only, and therefore are using larger buffers to have time to
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // wait for retransmissions.
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SetNackMode(VCMNackMode mode, int low_rtt_nack_threshold_ms,
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   int high_rtt_nack_threshold_ms);
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1647fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org  void SetNackSettings(size_t max_nack_list_size,
16506ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org                       int max_packet_age_to_nack,
16606ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org                       int max_incomplete_time_ms);
1677fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns the current NACK mode.
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMNackMode nack_mode() const;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // Returns a list of the sequence numbers currently missing.
172bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  uint16_t* GetNackList(uint16_t* nack_list_size, bool* request_key_frame);
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174098704346096e90c689fbebb2224ea5dd184fb46mikhal@webrtc.org  // Set decode error mode - Should not be changed in the middle of the
175098704346096e90c689fbebb2224ea5dd184fb46mikhal@webrtc.org  // session. Changes will not influence frames already in the buffer.
1769e8a66c236b96d53c6a70f93f7dc78f88ea52540mikhal@webrtc.org  void SetDecodeErrorMode(VCMDecodeErrorMode error_mode);
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t LastDecodedTimestamp() const;
1787b2147f8975308f753380cf0248b84a733970a10agalusza@google.com  VCMDecodeErrorMode decode_error_mode() const {return decode_error_mode_;}
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
180933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // Used to compute time of complete continuous frames. Returns the timestamps
181933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  // corresponding to the start and end of the continuous complete buffer.
182933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org  void RenderBufferSize(uint32_t* timestamp_start, uint32_t* timestamp_end);
18340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
185bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  class SequenceNumberLessThan {
186bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org   public:
187bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org    bool operator() (const uint16_t& sequence_number1,
188bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org                     const uint16_t& sequence_number2) const {
18942c7409229636a59e28814451bd49ada2c6803a1stefan@webrtc.org      return IsNewerSequenceNumber(sequence_number2, sequence_number1);
190bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org    }
191bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  };
192bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
193bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org
1943740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  // Gets the frame assigned to the timestamp of the packet. May recycle
1953740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  // existing frames if no free frames are available. Returns an error code if
1963740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  // failing, or kNoError on success.
1973740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  VCMFrameBufferEnum GetFrame(const VCMPacket& packet, VCMFrameBuffer** frame);
1988148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  void CopyFrames(FrameList* to_list, const FrameList& from_list);
1998148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  void CopyFrames(FrameList* to_list, const FrameList& from_list, int* index);
200376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // Returns true if |frame| is continuous in |decoding_state|, not taking
201376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // decodable frames into account.
202376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  bool IsContinuousInState(const VCMFrameBuffer& frame,
203376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org      const VCMDecodingState& decoding_state) const;
204376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // Returns true if |frame| is continuous in the |last_decoded_state_|, taking
205376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // all decodable frames into account.
206376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  bool IsContinuous(const VCMFrameBuffer& frame) const;
207376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // Looks for frames in |incomplete_frames_| which are continuous in
208376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // |last_decoded_state_| taking all decodable frames into account. Starts
209376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  // the search from |new_frame|.
210376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame);
211376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  VCMFrameBuffer* NextFrame() const;
212bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // Returns true if the NACK list was updated to cover sequence numbers up to
213bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // |sequence_number|. If false a key frame is needed to get into a state where
214bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // we can continue decoding.
215bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  bool UpdateNackList(uint16_t sequence_number);
216bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  bool TooLargeNackList() const;
217bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // Returns true if the NACK list was reduced without problem. If false a key
218bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // frame is needed to get into a state where we can continue decoding.
219bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  bool HandleTooLargeNackList();
220bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  bool MissingTooOldPacket(uint16_t latest_sequence_number) const;
221bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // Returns true if the too old packets was successfully removed from the NACK
222bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // list. If false, a key frame is needed to get into a state where we can
223bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // continue decoding.
224bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  bool HandleTooOldPackets(uint16_t latest_sequence_number);
225bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  // Drops all packets in the NACK list up until |last_decoded_sequence_number|.
226bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  void DropPacketsFromNackList(uint16_t last_decoded_sequence_number);
227bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ReleaseFrameIfNotDecoding(VCMFrameBuffer* frame);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Gets an empty frame, creating a new frame if necessary (i.e. increases
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // jitter buffer size).
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMFrameBuffer* GetEmptyFrame();
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2348148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  // Attempts to increase the size of the jitter buffer. Returns true on
2358148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  // success, false otherwise.
2368148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  bool TryToIncreaseJitterBufferSize();
2378148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Recycles oldest frames until a key frame is found. Used if jitter buffer is
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // completely full. Returns true if a key frame was found.
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool RecycleFramesUntilKeyFrame();
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2428148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  // Updates the frame statistics.
2437b0ab2addc0fb6e22515fc949b727cba5636fa64agalusza@google.com  // Counts only complete frames, so decodable incomplete frames will not be
2447b0ab2addc0fb6e22515fc949b727cba5636fa64agalusza@google.com  // counted.
2458148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  void CountFrame(const VCMFrameBuffer& frame);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24799199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  // Update rolling average of packets per frame.
24899199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  void UpdateAveragePacketsPerFrame(int current_number_packets_);
24999199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com
25040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org  // Cleans the frame list in the JB from old/empty frames.
25140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org  // Should only be called prior to actual use.
252bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  void CleanUpOldOrEmptyFrames();
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns true if |packet| is likely to have been retransmitted.
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool IsPacketRetransmitted(const VCMPacket& packet) const;
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The following three functions update the jitter estimate with the
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // payload size, receive time and RTP timestamp of a frame.
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateJitterEstimate(const VCMJitterSample& sample,
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            bool incomplete_frame);
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateJitterEstimate(int64_t latest_packet_time_ms,
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            uint32_t timestamp,
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            unsigned int frame_size,
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            bool incomplete_frame);
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns true if we should wait for retransmissions, false otherwise.
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool WaitForRetransmissions();
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27006ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org  int NonContinuousOrIncompleteDuration();
27106ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org
27206ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org  uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
27306ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org
2741bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org  Clock* clock_;
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // If we are running (have started) or not.
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool running_;
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CriticalSectionWrapper* crit_sect_;
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Event to signal when we have a frame ready for decoder.
2792637d61b86b68c7082ae21b4cc9bc88cc36d1c13stefan@webrtc.org  scoped_ptr<EventWrapper> frame_event_;
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Event to signal when we have received a packet.
2812637d61b86b68c7082ae21b4cc9bc88cc36d1c13stefan@webrtc.org  scoped_ptr<EventWrapper> packet_event_;
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Number of allocated frames.
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int max_number_of_frames_;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Array of pointers to the frames in jitter buffer.
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMFrameBuffer* frame_buffers_[kMaxNumberOfFrames];
2868148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org  UnorderedFrameList free_frames_;
287376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  FrameList decodable_frames_;
288376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org  FrameList incomplete_frames_;
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMDecodingState last_decoded_state_;
2903740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org  bool first_packet_since_reset_;
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Statistics.
2935fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org  // Frame counts for each type (key, delta, ...)
2945fdd10a56c3d7dcf2ea3cb2cd1118f616b783d24sprang@webrtc.org  std::map<FrameType, uint32_t> receive_statistics_;
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Latest calculated frame rates of incoming stream.
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int incoming_frame_rate_;
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int incoming_frame_count_;
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t time_last_incoming_frame_count_;
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int incoming_bit_count_;
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int incoming_bit_rate_;
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int drop_count_;  // Frame drop counter.
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Number of frames in a row that have been too old.
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_consecutive_old_frames_;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Number of packets in a row that have been too old.
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_consecutive_old_packets_;
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Number of packets discarded by the jitter buffer.
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_discarded_packets_;
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Jitter estimation.
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Filter for estimating jitter.
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMJitterEstimator jitter_estimate_;
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Calculates network delays used for jitter calculations.
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMInterFrameDelay inter_frame_delay_;
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMJitterSample waiting_for_completion_;
315dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org  uint32_t rtt_ms_;
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NACK and retransmissions.
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMNackMode nack_mode_;
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int low_rtt_nack_threshold_ms_;
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int high_rtt_nack_threshold_ms_;
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Holds the internal NACK list (the missing sequence numbers).
322bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  SequenceNumberSet missing_sequence_numbers_;
323bb78b2c7ce8cc4445811d0e881890a29b14a4f2bstefan@webrtc.org  uint16_t latest_received_sequence_number_;
3247fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org  std::vector<uint16_t> nack_seq_nums_;
3257fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org  size_t max_nack_list_size_;
3267fff32c808707eb6810d1057747069d7afce9939stefan@webrtc.org  int max_packet_age_to_nack_;  // Measured in sequence numbers.
32706ad384100b8b493e4a3f37877caac520189fec3stefan@webrtc.org  int max_incomplete_time_ms_;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
3297b2147f8975308f753380cf0248b84a733970a10agalusza@google.com  VCMDecodeErrorMode decode_error_mode_;
33099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  // Estimated rolling average of packets per frame
33199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  float average_packets_per_frame_;
33299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  // average_packets_per_frame converges fast if we have fewer than this many
33399199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  // frames.
33499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com  int frame_counter_;
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer);
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_
340