Simplifying VideoReceiver and JitterBuffer.
Removing frame_buffers_ array and dual-receiver mechanism. Also adding some thread annotations to VCMJitterBuffer. R=stefan@webrtc.org BUG=4014 Review URL: https://webrtc-codereview.appspot.com/27239004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7735 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -63,14 +63,13 @@ class FrameList
|
||||
: public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
|
||||
public:
|
||||
void InsertFrame(VCMFrameBuffer* frame);
|
||||
VCMFrameBuffer* FindFrame(uint32_t timestamp) const;
|
||||
VCMFrameBuffer* PopFrame(uint32_t timestamp);
|
||||
VCMFrameBuffer* Front() const;
|
||||
VCMFrameBuffer* Back() const;
|
||||
int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
|
||||
UnorderedFrameList* free_frames);
|
||||
int CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
|
||||
UnorderedFrameList* free_frames);
|
||||
void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
|
||||
UnorderedFrameList* free_frames);
|
||||
void Reset(UnorderedFrameList* free_frames);
|
||||
};
|
||||
|
||||
@ -80,9 +79,6 @@ class VCMJitterBuffer {
|
||||
EventFactory* event_factory);
|
||||
virtual ~VCMJitterBuffer();
|
||||
|
||||
// Makes |this| a deep copy of |rhs|.
|
||||
void CopyFrom(const VCMJitterBuffer& rhs);
|
||||
|
||||
// Initializes and starts jitter buffer.
|
||||
void Start();
|
||||
|
||||
@ -199,35 +195,43 @@ class VCMJitterBuffer {
|
||||
|
||||
// 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.
|
||||
VCMFrameBufferEnum GetFrame(const VCMPacket& packet, VCMFrameBuffer** frame);
|
||||
void CopyFrames(FrameList* to_list, const FrameList& from_list);
|
||||
void CopyFrames(FrameList* to_list, const FrameList& from_list, int* index);
|
||||
// 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;
|
||||
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;
|
||||
bool IsContinuous(const VCMFrameBuffer& frame) const
|
||||
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);
|
||||
VCMFrameBuffer* NextFrame() const;
|
||||
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);
|
||||
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();
|
||||
bool MissingTooOldPacket(uint16_t latest_sequence_number) const;
|
||||
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);
|
||||
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);
|
||||
|
||||
@ -235,15 +239,15 @@ class VCMJitterBuffer {
|
||||
|
||||
// Gets an empty frame, creating a new frame if necessary (i.e. increases
|
||||
// jitter buffer size).
|
||||
VCMFrameBuffer* GetEmptyFrame();
|
||||
VCMFrameBuffer* GetEmptyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
|
||||
|
||||
// Attempts to increase the size of the jitter buffer. Returns true on
|
||||
// success, false otherwise.
|
||||
bool TryToIncreaseJitterBufferSize();
|
||||
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();
|
||||
bool RecycleFramesUntilKeyFrame() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
|
||||
|
||||
// Updates the frame statistics.
|
||||
// Counts only complete frames, so decodable incomplete frames will not be
|
||||
@ -255,7 +259,7 @@ class VCMJitterBuffer {
|
||||
|
||||
// Cleans the frame list in the JB from old/empty frames.
|
||||
// Should only be called prior to actual use.
|
||||
void CleanUpOldOrEmptyFrames();
|
||||
void CleanUpOldOrEmptyFrames() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
|
||||
|
||||
// Returns true if |packet| is likely to have been retransmitted.
|
||||
bool IsPacketRetransmitted(const VCMPacket& packet) const;
|
||||
@ -273,7 +277,7 @@ class VCMJitterBuffer {
|
||||
// Returns true if we should wait for retransmissions, false otherwise.
|
||||
bool WaitForRetransmissions();
|
||||
|
||||
int NonContinuousOrIncompleteDuration();
|
||||
int NonContinuousOrIncompleteDuration() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
|
||||
|
||||
uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
|
||||
|
||||
@ -285,16 +289,12 @@ class VCMJitterBuffer {
|
||||
CriticalSectionWrapper* crit_sect_;
|
||||
// Event to signal when we have a frame ready for decoder.
|
||||
scoped_ptr<EventWrapper> frame_event_;
|
||||
// Event to signal when we have received a packet.
|
||||
scoped_ptr<EventWrapper> packet_event_;
|
||||
// Number of allocated frames.
|
||||
int max_number_of_frames_;
|
||||
// Array of pointers to the frames in jitter buffer.
|
||||
VCMFrameBuffer* frame_buffers_[kMaxNumberOfFrames];
|
||||
UnorderedFrameList free_frames_;
|
||||
FrameList decodable_frames_;
|
||||
FrameList incomplete_frames_;
|
||||
VCMDecodingState last_decoded_state_;
|
||||
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.
|
||||
@ -306,7 +306,6 @@ class VCMJitterBuffer {
|
||||
int64_t time_last_incoming_frame_count_;
|
||||
unsigned int incoming_bit_count_;
|
||||
unsigned int incoming_bit_rate_;
|
||||
unsigned int drop_count_; // Frame drop counter.
|
||||
// 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.
|
||||
|
||||
Reference in New Issue
Block a user