From 9bd1d66995ed9ea4712451bc149a8139775cba3c Mon Sep 17 00:00:00 2001 From: philipel Date: Fri, 14 Jul 2017 04:52:01 -0700 Subject: [PATCH] RtpFrameReferenceFinder VP8 reference calculation fix. BUG=webrtc:7768 Review-Url: https://codereview.webrtc.org/2980943003 Cr-Commit-Position: refs/heads/master@{#19018} --- .../rtp_frame_reference_finder.cc | 7 +++--- .../rtp_frame_reference_finder_unittest.cc | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc index ebf2f45dd9..66e57b06ed 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc @@ -264,11 +264,10 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8( // Find if there has been a gap in fully received frames and save the picture // id of those frames in |not_yet_received_frames_|. if (AheadOf(frame->picture_id, last_picture_id_)) { - last_picture_id_ = Add(last_picture_id_, 1); - while (last_picture_id_ != frame->picture_id) { - not_yet_received_frames_.insert(last_picture_id_); + do { last_picture_id_ = Add(last_picture_id_, 1); - } + not_yet_received_frames_.insert(last_picture_id_); + } while (last_picture_id_ != frame->picture_id); } // Clean up info for base layers that are too old. 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 b4c30a96e3..c75c45eb0f 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc @@ -671,6 +671,31 @@ TEST_F(TestRtpFrameReferenceFinder, Vp8Tl1SyncFrameAfterTl1Frame) { CheckReferencesVp8(5, 3); } +TEST_F(TestRtpFrameReferenceFinder, Vp8DetectMissingFrame_0212) { + InsertVp8(1, 1, true, 1, 0, 1, false); + InsertVp8(2, 2, false, 2, 2, 1, true); + InsertVp8(3, 3, false, 3, 1, 1, true); + InsertVp8(4, 4, false, 4, 2, 1, false); + + InsertVp8(6, 6, false, 6, 2, 2, false); + InsertVp8(7, 7, false, 7, 1, 2, false); + InsertVp8(8, 8, false, 8, 2, 2, false); + ASSERT_EQ(4UL, frames_from_callback_.size()); + + InsertVp8(5, 5, false, 5, 0, 2, false); + ASSERT_EQ(8UL, frames_from_callback_.size()); + + CheckReferencesVp8(1); + CheckReferencesVp8(2, 1); + CheckReferencesVp8(3, 1); + CheckReferencesVp8(4, 3, 2, 1); + + CheckReferencesVp8(5, 1); + CheckReferencesVp8(6, 5, 4, 3); + CheckReferencesVp8(7, 5, 3); + CheckReferencesVp8(8, 7, 6, 5); +} + TEST_F(TestRtpFrameReferenceFinder, Vp9GofInsertOneFrame) { uint16_t pid = Rand(); uint16_t sn = Rand();