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