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