diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc index ea26032b7..ebfd0946a 100644 --- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc +++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc @@ -1000,15 +1000,10 @@ FrameList::iterator VCMJitterBuffer::FindLastContinuousAndComplete( // Search for a complete and continuous sequence (starting from the last // decoded state or current frame if in initial state). VCMDecodingState previous_state; - if (last_decoded_state_.in_initial_state()) { - previous_state.SetState(*start_it); - } else { - previous_state.CopyFrom(last_decoded_state_); - } - bool continuous_complete = true; + previous_state.SetState(*start_it); FrameList::iterator previous_it = start_it; ++start_it; - while (start_it != frame_list_.end() && continuous_complete) { + while (start_it != frame_list_.end()) { start_it = FindOldestCompleteContinuousFrame(start_it, &previous_state); if (start_it == frame_list_.end()) break; diff --git a/webrtc/modules/video_coding/main/source/receiver_unittest.cc b/webrtc/modules/video_coding/main/source/receiver_unittest.cc index 40d0de1f4..62b7a99ca 100644 --- a/webrtc/modules/video_coding/main/source/receiver_unittest.cc +++ b/webrtc/modules/video_coding/main/source/receiver_unittest.cc @@ -263,6 +263,41 @@ TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) { EXPECT_EQ(kNackOk, ret); } +TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) { + // Enable NACK and with no RTT thresholds for disabling retransmission delay. + receiver_.SetNackMode(kNack, -1, -1); + const size_t kMaxNackListSize = 1000; + const int kMaxPacketAgeToNack = 1000; + const int kMaxNonDecodableDuration = 500; + const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate * + kMaxNonDecodableDuration + 500) / 1000; + const int kMinDelayMs = 500; + receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, + kMaxNonDecodableDuration); + receiver_.SetMinReceiverDelay(kMinDelayMs); + int64_t key_frame_inserted = clock_->TimeInMilliseconds(); + EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); + // Insert enough frames to have too long non-decodable sequence, except that + // we don't have any losses. + for (int i = 0; i < kMaxNonDecodableDurationFrames; + ++i) { + EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); + } + // Insert an incomplete frame. + EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); + // Advance time until it's time to decode the key frame. + clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() - + key_frame_inserted); + EXPECT_TRUE(DecodeNextFrame()); + // Make sure we don't get a key frame request since the non-decodable duration + // is only one frame. + uint16_t nack_list[kMaxNackListSize]; + uint16_t nack_list_length = 0; + VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize, + &nack_list_length); + EXPECT_EQ(kNackOk, ret); +} + TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) { // Enable NACK and with no RTT thresholds for disabling retransmission delay. receiver_.SetNackMode(kNack, -1, -1);