Drop VP8 frames in case of duplicates in RtpFrameReferenceFinder.
BUG=webrtc:5514
Review-Url: https://codereview.webrtc.org/2734453002
Cr-Commit-Position: refs/heads/master@{#17090}
diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
index e49a81d..5926c52 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 @@
return;
}
- RTC_DCHECK((AheadOf<uint16_t, kPicIdLength>(frame->picture_id,
- layer_info_it->second[layer])));
+ if (!(AheadOf<uint16_t, kPicIdLength>(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 5fa8880..cc361ec 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 @@
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();