From d34a1886495b63c79c2ce08cf00be40eef554ebf Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Mon, 20 Aug 2018 16:46:05 +0200 Subject: [PATCH] Fix Vp9 flexible mode in RTP ref frame finder. Bug: webrtc:9643 Change-Id: Ie545dfb982297902f7df1da90008af04c5e67d6e Reviewed-on: https://webrtc-review.googlesource.com/94901 Reviewed-by: Philip Eliasson Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#24348} --- .../rtp_frame_reference_finder.cc | 9 ++- .../rtp_frame_reference_finder_unittest.cc | 63 +++++++++---------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc index 217ec047d9..28e8ef86b2 100644 --- a/modules/video_coding/rtp_frame_reference_finder.cc +++ b/modules/video_coding/rtp_frame_reference_finder.cc @@ -392,8 +392,7 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9( absl::get(*rtp_codec_header); if (codec_header.picture_id == kNoPictureId || - codec_header.temporal_idx == kNoTemporalIdx || - codec_header.tl0_pic_idx == kNoTl0PicIdx) { + codec_header.temporal_idx == kNoTemporalIdx) { return ManageFrameGeneric(std::move(frame), codec_header.picture_id); } @@ -418,6 +417,12 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9( return kHandOff; } + if (codec_header.tl0_pic_idx == kNoTl0PicIdx) { + RTC_LOG(LS_WARNING) << "TL0PICIDX is expected to be present in " + "non-flexible mode."; + return kDrop; + } + GofInfo* info; int64_t unwrapped_tl0 = tl0_unwrapper_.Unwrap(codec_header.tl0_pic_idx); if (codec_header.ss_data_available) { diff --git a/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/modules/video_coding/rtp_frame_reference_finder_unittest.cc index 9d26a2c8cf..5705892806 100644 --- a/modules/video_coding/rtp_frame_reference_finder_unittest.cc +++ b/modules/video_coding/rtp_frame_reference_finder_unittest.cc @@ -172,7 +172,6 @@ class TestRtpFrameReferenceFinder : public ::testing::Test, int32_t pid = kNoPictureId, uint8_t sid = kNoSpatialIdx, uint8_t tid = kNoTemporalIdx, - int32_t tl0 = kNoTl0PicIdx, bool inter = false, std::vector refs = std::vector()) { VCMPacket packet; @@ -188,7 +187,7 @@ class TestRtpFrameReferenceFinder : public ::testing::Test, vp9_header.picture_id = pid % (1 << 15); vp9_header.temporal_idx = tid; vp9_header.spatial_idx = sid; - vp9_header.tl0_pic_idx = tl0; + vp9_header.tl0_pic_idx = kNoTl0PicIdx; vp9_header.num_ref_pics = refs.size(); for (size_t i = 0; i < refs.size(); ++i) vp9_header.pid_diff[i] = refs[i]; @@ -1240,7 +1239,7 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeOneFrame) { uint16_t pid = Rand(); uint16_t sn = Rand(); - InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false); + InsertVp9Flex(sn, sn, true, pid, 0, 0, false); ASSERT_EQ(1UL, frames_from_callback_.size()); CheckReferencesVp9(0, 0); @@ -1250,20 +1249,20 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayers) { uint16_t pid = Rand(); uint16_t sn = Rand(); - InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false); - InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true); - InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1}); - InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2}); - InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1}); - InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1}); - InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2}); - InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1}); - InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1}); - InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2}); - InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1}); - InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1}); - InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2}); - InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1}); + InsertVp9Flex(sn, sn, true, pid, 0, 0, false); + InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, true); + InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, false, {1}); + InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, false, {2}); + InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, false, {1}); + InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, false, {1}); + InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, false, {2}); + InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, false, {1}); + InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, false, {1}); + InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, false, {2}); + InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, false, {1}); + InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, false, {1}); + InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, false, {2}); + InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, false, {1}); ASSERT_EQ(14UL, frames_from_callback_.size()); CheckReferencesVp9(0, 0); @@ -1286,20 +1285,20 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) { uint16_t pid = Rand(); uint16_t sn = Rand(); - InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true); - InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1}); - InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false); - InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1}); - InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1}); - InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2}); - InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1}); - InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2}); - InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1}); - InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2}); - InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1}); - InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1}); - InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1}); - InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2}); + InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, true); + InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, false, {1}); + InsertVp9Flex(sn, sn, true, pid, 0, 0, false); + InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, false, {1}); + InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, false, {1}); + InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, false, {2}); + InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, false, {1}); + InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, false, {2}); + InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, false, {1}); + InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, false, {2}); + InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, false, {1}); + InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, false, {1}); + InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, false, {1}); + InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, false, {2}); ASSERT_EQ(14UL, frames_from_callback_.size()); CheckReferencesVp9(0, 0); @@ -1319,7 +1318,7 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) { } TEST_F(TestRtpFrameReferenceFinder, WrappingFlexReference) { - InsertVp9Flex(0, 0, false, 0, 0, 0, 0, false, {1}); + InsertVp9Flex(0, 0, false, 0, 0, 0, false, {1}); ASSERT_EQ(1UL, frames_from_callback_.size()); CheckReferencesVp9(1, 0, 0);