diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc index e49a81d758..5926c524be 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc @@ -334,8 +334,15 @@ void RtpFrameReferenceFinder::ManageFrameVp8( return; } - RTC_DCHECK((AheadOf(frame->picture_id, - layer_info_it->second[layer]))); + if (!(AheadOf(frame->picture_id, + layer_info_it->second[layer]))) { + LOG(LS_WARNING) << "Frame with picture id " << frame->picture_id + << " and packet range [" << frame->first_seq_num() << ", " + << frame->last_seq_num() << "] already received, " + << " dropping frame."; + return; + } + ++frame->num_references; frame->references[layer] = layer_info_it->second[layer]; } diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc index 5fa88802a6..cc361ec258 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc @@ -428,6 +428,27 @@ TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayers_0) { CheckReferencesVp8(pid + 3, pid + 2); } +TEST_F(TestRtpFrameReferenceFinder, Vp8DuplicateTl1Frames) { + uint16_t pid = Rand(); + uint16_t sn = Rand(); + + InsertVp8(sn, sn, true, pid, 0, 0); + InsertVp8(sn + 1, sn + 1, false, pid + 1, 1, 0, true); + InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 1); + InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 1); + InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 1); + InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 2); + InsertVp8(sn + 5, sn + 5, false, pid + 5, 1, 2); + + ASSERT_EQ(6UL, frames_from_callback_.size()); + CheckReferencesVp8(pid); + CheckReferencesVp8(pid + 1, pid); + CheckReferencesVp8(pid + 2, pid); + CheckReferencesVp8(pid + 3, pid + 1, pid + 2); + CheckReferencesVp8(pid + 4, pid + 2); + CheckReferencesVp8(pid + 5, pid + 3, pid + 4); +} + // Test with 1 temporal layer. TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayersReordering_0) { uint16_t pid = Rand();