Validate the length of `num_ref_pics` with `kMaxVp9RefPics` instead of `EncodedFrame::kMaxFrameReferences`. Bug: chromium:454367825 Change-Id: Id99046a0e573875aa6d33e6b869fba536a1ac5da Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/475820 Commit-Queue: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#47808}
diff --git a/modules/video_coding/rtp_vp9_ref_finder.cc b/modules/video_coding/rtp_vp9_ref_finder.cc index 5ee19a9..4f5969a 100644 --- a/modules/video_coding/rtp_vp9_ref_finder.cc +++ b/modules/video_coding/rtp_vp9_ref_finder.cc
@@ -85,7 +85,7 @@ RtpVp9RefFinder::FrameDecision RtpVp9RefFinder::ManageFrameFlexible( RtpFrameObject* frame, const RTPVideoHeaderVP9& codec_header) { - if (codec_header.num_ref_pics > EncodedFrame::kMaxFrameReferences) { + if (codec_header.num_ref_pics > kMaxVp9RefPics) { return kDrop; } @@ -200,7 +200,7 @@ frame->Id()); size_t gof_idx = diff % info->gof->num_frames_in_gof; - if (info->gof->num_ref_pics[gof_idx] > EncodedFrame::kMaxFrameReferences) { + if (info->gof->num_ref_pics[gof_idx] > kMaxVp9RefPics) { return kDrop; }
diff --git a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc index 7ca4e03..0ca1a3b 100644 --- a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc +++ b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
@@ -115,7 +115,7 @@ } else { vp9_header.flexible_mode = true; vp9_header.num_ref_pics = flex_refs.size(); - for (size_t i = 0; i < flex_refs.size(); ++i) { + for (size_t i = 0; i < std::min(flex_refs.size(), kMaxVp9RefPics); ++i) { vp9_header.pid_diff[i] = flex_refs.at(i); } } @@ -693,4 +693,27 @@ EXPECT_THAT(frames_, SizeIs(0)); } +TEST_F(RtpVp9RefFinderTest, FlexibleModeTooManyReferencesDropsFrame) { + Insert(Frame().Pid(0).SidAndTid(0, 0).AsKeyFrame()); + EXPECT_THAT(frames_, SizeIs(1)); + Insert(Frame().Pid(1).SidAndTid(0, 0).FlexRefs({1, 2, 3, 4})); + EXPECT_THAT(frames_, SizeIs(1)); +} + +TEST_F(RtpVp9RefFinderTest, GofTooManyReferencesDropsFrame) { + GofInfoVP9 ss; + ss.num_frames_in_gof = 2; + ss.temporal_idx[0] = 0; + ss.num_ref_pics[0] = 1; + ss.pid_diff[0][0] = 1; + + // GOF index 1 requires 4 reference pictures (more than kMaxVp9RefPics = 3). + ss.temporal_idx[1] = 1; + ss.num_ref_pics[1] = 4; + ss.pid_diff[1][0] = 1; + + Insert(Frame().Pid(0).SidAndTid(0, 0).Tl0(0).AsKeyFrame().Gof(&ss)); + EXPECT_THAT(frames_, SizeIs(0)); +} + } // namespace webrtc