From 77c425b97606d77ce73d09db6d199cc0f6c094c7 Mon Sep 17 00:00:00 2001 From: "mikhal@webrtc.org" Date: Tue, 3 Jan 2012 20:35:25 +0000 Subject: [PATCH] video_coding: Checking/updating seq num for an old packet regardless of size. Review URL: http://webrtc-codereview.appspot.com/330028 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1318 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../main/source/decoding_state.cc | 7 ++++--- .../video_coding/main/source/decoding_state.h | 5 +++-- .../main/source/decoding_state_unittest.cc | 21 ++++++++++++++++--- .../video_coding/main/source/jitter_buffer.cc | 12 +++++------ 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/modules/video_coding/main/source/decoding_state.cc b/src/modules/video_coding/main/source/decoding_state.cc index cc3615476c..eea0a2c612 100644 --- a/src/modules/video_coding/main/source/decoding_state.cc +++ b/src/modules/video_coding/main/source/decoding_state.cc @@ -94,10 +94,11 @@ void VCMDecodingState::SetStateOneBack(const VCMFrameBuffer* frame) { init_ = false; } -void VCMDecodingState::UpdateZeroSizePacket(const VCMPacket* packet) { +void VCMDecodingState::UpdateOldPacket(const VCMPacket* packet) { assert(packet != NULL); - if (packet->sizeBytes == 0 && packet->timestamp == time_stamp_) { - // Zero size packet - make sure we update the last decoded sequence number. + if (packet->timestamp == time_stamp_) { + // Late packet belonging to the last decoded frame - make sure we update the + // last decoded sequence number. sequence_num_ = LatestSequenceNumber(packet->seqNum, sequence_num_, NULL); } } diff --git a/src/modules/video_coding/main/source/decoding_state.h b/src/modules/video_coding/main/source/decoding_state.h index f4d291474f..afec3ba44c 100644 --- a/src/modules/video_coding/main/source/decoding_state.h +++ b/src/modules/video_coding/main/source/decoding_state.h @@ -34,8 +34,9 @@ class VCMDecodingState { // Set the decoding state one frame back. void SetStateOneBack(const VCMFrameBuffer* frame); // Update the sequence number if the timestamp matches current state and the - // packet is of zero size. - void UpdateZeroSizePacket(const VCMPacket* packet); + // sequence number is higher than the current one. This accounts for packets + // arriving late. + void UpdateOldPacket(const VCMPacket* packet); void SetSeqNum(uint16_t new_seq_num); void Reset(); uint32_t time_stamp() const; diff --git a/src/modules/video_coding/main/source/decoding_state_unittest.cc b/src/modules/video_coding/main/source/decoding_state_unittest.cc index ba90506d04..853f42ada2 100644 --- a/src/modules/video_coding/main/source/decoding_state_unittest.cc +++ b/src/modules/video_coding/main/source/decoding_state_unittest.cc @@ -194,7 +194,7 @@ TEST(TestDecodingState, SetStateOneBack) { delete packet; } -TEST(TestDecodingState, UpdateZeroSizePacket) { +TEST(TestDecodingState, UpdateOldPacket) { VCMDecodingState dec_state; // Update only if zero size and newer than previous. // Should only update if the timeStamp match. @@ -210,15 +210,30 @@ TEST(TestDecodingState, UpdateZeroSizePacket) { // Insert an empty packet that does not belong to the same frame. // => Sequence num should be the same. packet->timestamp = 2; - dec_state.UpdateZeroSizePacket(packet); + dec_state.UpdateOldPacket(packet); EXPECT_EQ(dec_state.sequence_num(), 1); // Now insert empty packet belonging to the same frame. packet->timestamp = 1; packet->seqNum = 2; packet->frameType = kFrameEmpty; packet->sizeBytes = 0; - dec_state.UpdateZeroSizePacket(packet); + dec_state.UpdateOldPacket(packet); EXPECT_EQ(dec_state.sequence_num(), 2); + // Now insert delta packet belonging to the same frame. + packet->timestamp = 1; + packet->seqNum = 3; + packet->frameType = kVideoFrameDelta; + packet->sizeBytes = 1400; + dec_state.UpdateOldPacket(packet); + EXPECT_EQ(dec_state.sequence_num(), 3); + // Insert a packet belonging to an older timestamp - should not update the + // sequence number. + packet->timestamp = 0; + packet->seqNum = 4; + packet->frameType = kFrameEmpty; + packet->sizeBytes = 0; + dec_state.UpdateOldPacket(packet); + EXPECT_EQ(dec_state.sequence_num(), 3); delete packet; } diff --git a/src/modules/video_coding/main/source/jitter_buffer.cc b/src/modules/video_coding/main/source/jitter_buffer.cc index 39ffbde2a5..5932e61110 100644 --- a/src/modules/video_coding/main/source/jitter_buffer.cc +++ b/src/modules/video_coding/main/source/jitter_buffer.cc @@ -445,12 +445,10 @@ VCMJitterBuffer::GetFrame(const VCMPacket& packet, VCMEncodedFrame*& frame) _discardedPackets++; _numConsecutiveOldPackets++; } - else - { - // Update last decoded sequence number if packet belongs to a zero - // size frame with a timestamp equal to the last decoded timestamp. - _lastDecodedState.UpdateZeroSizePacket(&packet); - } + // Update last decoded sequence number if the packet arrived late and + // belongs to a frame with a timestamp equal to the last decoded + // timestamp. + _lastDecodedState.UpdateOldPacket(&packet); if (_numConsecutiveOldPackets > kMaxConsecutiveOldPackets) { @@ -1570,7 +1568,7 @@ VCMJitterBuffer::InsertPacket(VCMEncodedFrame* buffer, const VCMPacket& packet) if (frame != NULL) { VCMFrameBufferStateEnum state = frame->GetState(); - _lastDecodedState.UpdateZeroSizePacket(&packet); + _lastDecodedState.UpdateOldPacket(&packet); // Insert packet // Check for first packet // High sequence number will be -1 if neither an empty packet nor