From ebb467fdc8d6147ec3e84f7ec9d4336f125687e5 Mon Sep 17 00:00:00 2001 From: "pbos@webrtc.org" Date: Mon, 19 May 2014 15:28:02 +0000 Subject: [PATCH] Avoid NACK-list flush error on keyframe packets. Receiver code used to indicate a flush error even if the incoming packet is a keyframe, forcing a request of a keyframe. Now it takes this keyframe into account and doesn't error as the stream is decodable from this point. BUG= R=stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/15549005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6188 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../video_coding/main/source/jitter_buffer.cc | 3 ++- .../main/source/jitter_buffer_unittest.cc | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc index 6f0a333054..d8792f21af 100644 --- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc +++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc @@ -682,7 +682,8 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, if (IsPacketRetransmitted(packet)) { frame->IncrementNackCount(); } - if (!UpdateNackList(packet.seqNum)) { + if (!UpdateNackList(packet.seqNum) && + packet.frameType != kVideoFrameKey) { buffer_return = kFlushIndicator; } latest_received_sequence_number_ = LatestSequenceNumber( diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc index cbe091a9f6..0490658b42 100644 --- a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc +++ b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc @@ -2033,4 +2033,31 @@ TEST_F(TestJitterBufferNack, NormalOperationWrap2) { EXPECT_EQ(65535, list[0]); } +TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) { + stream_generator_->Init(0, 0, clock_->TimeInMilliseconds()); + InsertFrame(kVideoFrameKey); + EXPECT_TRUE(DecodeCompleteFrame()); + uint16_t nack_list_size = 0; + bool extended = false; + jitter_buffer_->GetNackList(&nack_list_size, &extended); + EXPECT_EQ(0, nack_list_size); + + // Far-into-the-future video frame, could be caused by resetting the encoder + // or otherwise restarting. This should not fail when error when the packet is + // a keyframe, even if all of the nack list needs to be flushed. + stream_generator_->Init(10000, 0, clock_->TimeInMilliseconds()); + clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); + InsertFrame(kVideoFrameKey); + EXPECT_TRUE(DecodeCompleteFrame()); + jitter_buffer_->GetNackList(&nack_list_size, &extended); + EXPECT_EQ(0, nack_list_size); + + // Stream should be decodable from this point. + clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); + InsertFrame(kVideoFrameDelta); + EXPECT_TRUE(DecodeCompleteFrame()); + jitter_buffer_->GetNackList(&nack_list_size, &extended); + EXPECT_EQ(0, nack_list_size); +} + } // namespace webrtc