Index: webrtc/modules/video_coding/main/source/jitter_buffer.h |
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.h b/webrtc/modules/video_coding/main/source/jitter_buffer.h |
deleted file mode 100644 |
index 228e786cd559b5ff81f61c5f7e07cd843e173802..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.h |
+++ /dev/null |
@@ -1,394 +0,0 @@ |
-/* |
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#ifndef WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_ |
-#define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_ |
- |
-#include <list> |
-#include <map> |
-#include <set> |
-#include <vector> |
- |
-#include "webrtc/base/constructormagic.h" |
-#include "webrtc/base/thread_annotations.h" |
-#include "webrtc/modules/include/module_common_types.h" |
-#include "webrtc/modules/video_coding/main/interface/video_coding.h" |
-#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" |
-#include "webrtc/modules/video_coding/main/source/decoding_state.h" |
-#include "webrtc/modules/video_coding/main/source/inter_frame_delay.h" |
-#include "webrtc/modules/video_coding/main/source/jitter_buffer_common.h" |
-#include "webrtc/modules/video_coding/main/source/jitter_estimator.h" |
-#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
-#include "webrtc/typedefs.h" |
- |
-namespace webrtc { |
- |
-enum VCMNackMode { |
- kNack, |
- kNoNack |
-}; |
- |
-// forward declarations |
-class Clock; |
-class EventFactory; |
-class EventWrapper; |
-class VCMFrameBuffer; |
-class VCMPacket; |
-class VCMEncodedFrame; |
- |
-typedef std::list<VCMFrameBuffer*> UnorderedFrameList; |
- |
-struct VCMJitterSample { |
- VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {} |
- uint32_t timestamp; |
- uint32_t frame_size; |
- int64_t latest_packet_time; |
-}; |
- |
-class TimestampLessThan { |
- public: |
- bool operator() (uint32_t timestamp1, |
- uint32_t timestamp2) const { |
- return IsNewerTimestamp(timestamp2, timestamp1); |
- } |
-}; |
- |
-class FrameList |
- : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> { |
- public: |
- void InsertFrame(VCMFrameBuffer* frame); |
- VCMFrameBuffer* PopFrame(uint32_t timestamp); |
- VCMFrameBuffer* Front() const; |
- VCMFrameBuffer* Back() const; |
- int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it, |
- UnorderedFrameList* free_frames); |
- void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state, |
- UnorderedFrameList* free_frames); |
- void Reset(UnorderedFrameList* free_frames); |
-}; |
- |
-class Vp9SsMap { |
- public: |
- typedef std::map<uint32_t, GofInfoVP9, TimestampLessThan> SsMap; |
- bool Insert(const VCMPacket& packet); |
- void Reset(); |
- |
- // Removes SS data that are older than |timestamp|. |
- // The |timestamp| should be an old timestamp, i.e. packets with older |
- // timestamps should no longer be inserted. |
- void RemoveOld(uint32_t timestamp); |
- |
- bool UpdatePacket(VCMPacket* packet); |
- void UpdateFrames(FrameList* frames); |
- |
- // Public for testing. |
- // Returns an iterator to the corresponding SS data for the input |timestamp|. |
- bool Find(uint32_t timestamp, SsMap::iterator* it); |
- |
- private: |
- // These two functions are called by RemoveOld. |
- // Checks if it is time to do a clean up (done each kSsCleanupIntervalSec). |
- bool TimeForCleanup(uint32_t timestamp) const; |
- |
- // Advances the oldest SS data to handle timestamp wrap in cases where SS data |
- // are received very seldom (e.g. only once in beginning, second when |
- // IsNewerTimestamp is not true). |
- void AdvanceFront(uint32_t timestamp); |
- |
- SsMap ss_map_; |
-}; |
- |
-class VCMJitterBuffer { |
- public: |
- VCMJitterBuffer(Clock* clock, rtc::scoped_ptr<EventWrapper> event); |
- |
- ~VCMJitterBuffer(); |
- |
- // Initializes and starts jitter buffer. |
- void Start(); |
- |
- // Signals all internal events and stops the jitter buffer. |
- void Stop(); |
- |
- // Returns true if the jitter buffer is running. |
- bool Running() const; |
- |
- // Empty the jitter buffer of all its data. |
- void Flush(); |
- |
- // Get the number of received frames, by type, since the jitter buffer |
- // was started. |
- FrameCounts FrameStatistics() const; |
- |
- // The number of packets discarded by the jitter buffer because the decoder |
- // won't be able to decode them. |
- int num_not_decodable_packets() const; |
- |
- // Gets number of packets received. |
- int num_packets() const; |
- |
- // Gets number of duplicated packets received. |
- int num_duplicated_packets() const; |
- |
- // Gets number of packets discarded by the jitter buffer. |
- int num_discarded_packets() const; |
- |
- // Statistics, Calculate frame and bit rates. |
- void IncomingRateStatistics(unsigned int* framerate, |
- unsigned int* bitrate); |
- |
- // Checks if the packet sequence will be complete if the next frame would be |
- // grabbed for decoding. That is, if a frame has been lost between the |
- // last decoded frame and the next, or if the next frame is missing one |
- // or more packets. |
- bool CompleteSequenceWithNextFrame(); |
- |
- // Wait |max_wait_time_ms| for a complete frame to arrive. |
- // The function returns true once such a frame is found, its corresponding |
- // timestamp is returned. Otherwise, returns false. |
- bool NextCompleteTimestamp(uint32_t max_wait_time_ms, uint32_t* timestamp); |
- |
- // Locates a frame for decoding (even an incomplete) without delay. |
- // The function returns true once such a frame is found, its corresponding |
- // timestamp is returned. Otherwise, returns false. |
- bool NextMaybeIncompleteTimestamp(uint32_t* timestamp); |
- |
- // Extract frame corresponding to input timestamp. |
- // Frame will be set to a decoding state. |
- VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp); |
- |
- // Releases a frame returned from the jitter buffer, should be called when |
- // done with decoding. |
- void ReleaseFrame(VCMEncodedFrame* frame); |
- |
- // Returns the time in ms when the latest packet was inserted into the frame. |
- // Retransmitted is set to true if any of the packets belonging to the frame |
- // has been retransmitted. |
- int64_t LastPacketTime(const VCMEncodedFrame* frame, |
- bool* retransmitted) const; |
- |
- // Inserts a packet into a frame returned from GetFrame(). |
- // If the return value is <= 0, |frame| is invalidated and the pointer must |
- // be dropped after this function returns. |
- VCMFrameBufferEnum InsertPacket(const VCMPacket& packet, |
- bool* retransmitted); |
- |
- // Returns the estimated jitter in milliseconds. |
- uint32_t EstimatedJitterMs(); |
- |
- // Updates the round-trip time estimate. |
- void UpdateRtt(int64_t rtt_ms); |
- |
- // Set the NACK mode. |high_rtt_nack_threshold_ms| is an RTT threshold in ms |
- // above which NACK will be disabled if the NACK mode is |kNack|, -1 meaning |
- // that NACK is always enabled in the |kNack| mode. |
- // |low_rtt_nack_threshold_ms| is an RTT threshold in ms below which we expect |
- // to rely on NACK only, and therefore are using larger buffers to have time |
- // to wait for retransmissions. |
- void SetNackMode(VCMNackMode mode, int64_t low_rtt_nack_threshold_ms, |
- int64_t high_rtt_nack_threshold_ms); |
- |
- void SetNackSettings(size_t max_nack_list_size, |
- int max_packet_age_to_nack, |
- int max_incomplete_time_ms); |
- |
- // Returns the current NACK mode. |
- VCMNackMode nack_mode() const; |
- |
- // Returns a list of the sequence numbers currently missing. |
- std::vector<uint16_t> GetNackList(bool* request_key_frame); |
- |
- // Set decode error mode - Should not be changed in the middle of the |
- // session. Changes will not influence frames already in the buffer. |
- void SetDecodeErrorMode(VCMDecodeErrorMode error_mode); |
- int64_t LastDecodedTimestamp() const; |
- VCMDecodeErrorMode decode_error_mode() const {return decode_error_mode_;} |
- |
- // Used to compute time of complete continuous frames. Returns the timestamps |
- // corresponding to the start and end of the continuous complete buffer. |
- void RenderBufferSize(uint32_t* timestamp_start, uint32_t* timestamp_end); |
- |
- void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback); |
- |
- private: |
- class SequenceNumberLessThan { |
- public: |
- bool operator() (const uint16_t& sequence_number1, |
- const uint16_t& sequence_number2) const { |
- return IsNewerSequenceNumber(sequence_number2, sequence_number1); |
- } |
- }; |
- typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet; |
- |
- // Gets the frame assigned to the timestamp of the packet. May recycle |
- // existing frames if no free frames are available. Returns an error code if |
- // failing, or kNoError on success. |frame_list| contains which list the |
- // packet was in, or NULL if it was not in a FrameList (a new frame). |
- VCMFrameBufferEnum GetFrame(const VCMPacket& packet, |
- VCMFrameBuffer** frame, |
- FrameList** frame_list) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Returns true if |frame| is continuous in |decoding_state|, not taking |
- // decodable frames into account. |
- bool IsContinuousInState(const VCMFrameBuffer& frame, |
- const VCMDecodingState& decoding_state) const |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Returns true if |frame| is continuous in the |last_decoded_state_|, taking |
- // all decodable frames into account. |
- bool IsContinuous(const VCMFrameBuffer& frame) const |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Looks for frames in |incomplete_frames_| which are continuous in the |
- // provided |decoded_state|. Starts the search from the timestamp of |
- // |decoded_state|. |
- void FindAndInsertContinuousFramesWithState( |
- const VCMDecodingState& decoded_state) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Looks for frames in |incomplete_frames_| which are continuous in |
- // |last_decoded_state_| taking all decodable frames into account. Starts |
- // the search from |new_frame|. |
- void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- VCMFrameBuffer* NextFrame() const EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Returns true if the NACK list was updated to cover sequence numbers up to |
- // |sequence_number|. If false a key frame is needed to get into a state where |
- // we can continue decoding. |
- bool UpdateNackList(uint16_t sequence_number) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- bool TooLargeNackList() const; |
- // Returns true if the NACK list was reduced without problem. If false a key |
- // frame is needed to get into a state where we can continue decoding. |
- bool HandleTooLargeNackList() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- bool MissingTooOldPacket(uint16_t latest_sequence_number) const |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Returns true if the too old packets was successfully removed from the NACK |
- // list. If false, a key frame is needed to get into a state where we can |
- // continue decoding. |
- bool HandleTooOldPackets(uint16_t latest_sequence_number) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- // Drops all packets in the NACK list up until |last_decoded_sequence_number|. |
- void DropPacketsFromNackList(uint16_t last_decoded_sequence_number); |
- |
- void ReleaseFrameIfNotDecoding(VCMFrameBuffer* frame); |
- |
- // Gets an empty frame, creating a new frame if necessary (i.e. increases |
- // jitter buffer size). |
- VCMFrameBuffer* GetEmptyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Attempts to increase the size of the jitter buffer. Returns true on |
- // success, false otherwise. |
- bool TryToIncreaseJitterBufferSize() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Recycles oldest frames until a key frame is found. Used if jitter buffer is |
- // completely full. Returns true if a key frame was found. |
- bool RecycleFramesUntilKeyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Updates the frame statistics. |
- // Counts only complete frames, so decodable incomplete frames will not be |
- // counted. |
- void CountFrame(const VCMFrameBuffer& frame) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Update rolling average of packets per frame. |
- void UpdateAveragePacketsPerFrame(int current_number_packets_); |
- |
- // Cleans the frame list in the JB from old/empty frames. |
- // Should only be called prior to actual use. |
- void CleanUpOldOrEmptyFrames() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- // Returns true if |packet| is likely to have been retransmitted. |
- bool IsPacketRetransmitted(const VCMPacket& packet) const; |
- |
- // The following three functions update the jitter estimate with the |
- // payload size, receive time and RTP timestamp of a frame. |
- void UpdateJitterEstimate(const VCMJitterSample& sample, |
- bool incomplete_frame); |
- void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame); |
- void UpdateJitterEstimate(int64_t latest_packet_time_ms, |
- uint32_t timestamp, |
- unsigned int frame_size, |
- bool incomplete_frame); |
- |
- // Returns true if we should wait for retransmissions, false otherwise. |
- bool WaitForRetransmissions(); |
- |
- int NonContinuousOrIncompleteDuration() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const; |
- |
- void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); |
- |
- Clock* clock_; |
- // If we are running (have started) or not. |
- bool running_; |
- CriticalSectionWrapper* crit_sect_; |
- // Event to signal when we have a frame ready for decoder. |
- rtc::scoped_ptr<EventWrapper> frame_event_; |
- // Number of allocated frames. |
- int max_number_of_frames_; |
- UnorderedFrameList free_frames_ GUARDED_BY(crit_sect_); |
- FrameList decodable_frames_ GUARDED_BY(crit_sect_); |
- FrameList incomplete_frames_ GUARDED_BY(crit_sect_); |
- VCMDecodingState last_decoded_state_ GUARDED_BY(crit_sect_); |
- bool first_packet_since_reset_; |
- |
- // Statistics. |
- VCMReceiveStatisticsCallback* stats_callback_ GUARDED_BY(crit_sect_); |
- // Frame counts for each type (key, delta, ...) |
- FrameCounts receive_statistics_; |
- // Latest calculated frame rates of incoming stream. |
- unsigned int incoming_frame_rate_; |
- unsigned int incoming_frame_count_; |
- int64_t time_last_incoming_frame_count_; |
- unsigned int incoming_bit_count_; |
- unsigned int incoming_bit_rate_; |
- // Number of frames in a row that have been too old. |
- int num_consecutive_old_frames_; |
- // Number of packets in a row that have been too old. |
- int num_consecutive_old_packets_; |
- // Number of packets received. |
- int num_packets_ GUARDED_BY(crit_sect_); |
- // Number of duplicated packets received. |
- int num_duplicated_packets_ GUARDED_BY(crit_sect_); |
- // Number of packets discarded by the jitter buffer. |
- int num_discarded_packets_ GUARDED_BY(crit_sect_); |
- // Time when first packet is received. |
- int64_t time_first_packet_ms_ GUARDED_BY(crit_sect_); |
- |
- // Jitter estimation. |
- // Filter for estimating jitter. |
- VCMJitterEstimator jitter_estimate_; |
- // Calculates network delays used for jitter calculations. |
- VCMInterFrameDelay inter_frame_delay_; |
- VCMJitterSample waiting_for_completion_; |
- int64_t rtt_ms_; |
- |
- // NACK and retransmissions. |
- VCMNackMode nack_mode_; |
- int64_t low_rtt_nack_threshold_ms_; |
- int64_t high_rtt_nack_threshold_ms_; |
- // Holds the internal NACK list (the missing sequence numbers). |
- SequenceNumberSet missing_sequence_numbers_; |
- uint16_t latest_received_sequence_number_; |
- size_t max_nack_list_size_; |
- int max_packet_age_to_nack_; // Measured in sequence numbers. |
- int max_incomplete_time_ms_; |
- |
- VCMDecodeErrorMode decode_error_mode_; |
- // Estimated rolling average of packets per frame |
- float average_packets_per_frame_; |
- // average_packets_per_frame converges fast if we have fewer than this many |
- // frames. |
- int frame_counter_; |
- RTC_DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer); |
-}; |
-} // namespace webrtc |
- |
-#endif // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_ |