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 <philipel@webrtc.org>
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24348}
This commit is contained in:
Sergey Silkin 2018-08-20 16:46:05 +02:00 committed by Commit Bot
parent cf42781981
commit d34a188649
2 changed files with 38 additions and 34 deletions

View file

@ -392,8 +392,7 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
absl::get<RTPVideoHeaderVP9>(*rtp_codec_header); absl::get<RTPVideoHeaderVP9>(*rtp_codec_header);
if (codec_header.picture_id == kNoPictureId || if (codec_header.picture_id == kNoPictureId ||
codec_header.temporal_idx == kNoTemporalIdx || codec_header.temporal_idx == kNoTemporalIdx) {
codec_header.tl0_pic_idx == kNoTl0PicIdx) {
return ManageFrameGeneric(std::move(frame), codec_header.picture_id); return ManageFrameGeneric(std::move(frame), codec_header.picture_id);
} }
@ -418,6 +417,12 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
return kHandOff; 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; GofInfo* info;
int64_t unwrapped_tl0 = tl0_unwrapper_.Unwrap(codec_header.tl0_pic_idx); int64_t unwrapped_tl0 = tl0_unwrapper_.Unwrap(codec_header.tl0_pic_idx);
if (codec_header.ss_data_available) { if (codec_header.ss_data_available) {

View file

@ -172,7 +172,6 @@ class TestRtpFrameReferenceFinder : public ::testing::Test,
int32_t pid = kNoPictureId, int32_t pid = kNoPictureId,
uint8_t sid = kNoSpatialIdx, uint8_t sid = kNoSpatialIdx,
uint8_t tid = kNoTemporalIdx, uint8_t tid = kNoTemporalIdx,
int32_t tl0 = kNoTl0PicIdx,
bool inter = false, bool inter = false,
std::vector<uint8_t> refs = std::vector<uint8_t>()) { std::vector<uint8_t> refs = std::vector<uint8_t>()) {
VCMPacket packet; VCMPacket packet;
@ -188,7 +187,7 @@ class TestRtpFrameReferenceFinder : public ::testing::Test,
vp9_header.picture_id = pid % (1 << 15); vp9_header.picture_id = pid % (1 << 15);
vp9_header.temporal_idx = tid; vp9_header.temporal_idx = tid;
vp9_header.spatial_idx = sid; vp9_header.spatial_idx = sid;
vp9_header.tl0_pic_idx = tl0; vp9_header.tl0_pic_idx = kNoTl0PicIdx;
vp9_header.num_ref_pics = refs.size(); vp9_header.num_ref_pics = refs.size();
for (size_t i = 0; i < refs.size(); ++i) for (size_t i = 0; i < refs.size(); ++i)
vp9_header.pid_diff[i] = refs[i]; vp9_header.pid_diff[i] = refs[i];
@ -1240,7 +1239,7 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeOneFrame) {
uint16_t pid = Rand(); uint16_t pid = Rand();
uint16_t sn = 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()); ASSERT_EQ(1UL, frames_from_callback_.size());
CheckReferencesVp9(0, 0); CheckReferencesVp9(0, 0);
@ -1250,20 +1249,20 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayers) {
uint16_t pid = Rand(); uint16_t pid = Rand();
uint16_t sn = Rand(); uint16_t sn = Rand();
InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false); InsertVp9Flex(sn, sn, true, pid, 0, 0, false);
InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true); InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, true);
InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1}); InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, false, {1});
InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2}); InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, false, {2});
InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1}); InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, false, {1});
InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1}); InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, false, {1});
InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2}); InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, false, {2});
InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1}); InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, false, {1});
InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1}); InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, false, {1});
InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2}); InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, false, {2});
InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1}); InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, false, {1});
InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1}); InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, false, {1});
InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2}); InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, false, {2});
InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1}); InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, false, {1});
ASSERT_EQ(14UL, frames_from_callback_.size()); ASSERT_EQ(14UL, frames_from_callback_.size());
CheckReferencesVp9(0, 0); CheckReferencesVp9(0, 0);
@ -1286,20 +1285,20 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) {
uint16_t pid = Rand(); uint16_t pid = Rand();
uint16_t sn = Rand(); uint16_t sn = Rand();
InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true); InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, true);
InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1}); InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, false, {1});
InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false); InsertVp9Flex(sn, sn, true, pid, 0, 0, false);
InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1}); InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, false, {1});
InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1}); InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, false, {1});
InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2}); InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, false, {2});
InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1}); InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, false, {1});
InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2}); InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, false, {2});
InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1}); InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, false, {1});
InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2}); InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, false, {2});
InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1}); InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, false, {1});
InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1}); InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, false, {1});
InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1}); InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, false, {1});
InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2}); InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, false, {2});
ASSERT_EQ(14UL, frames_from_callback_.size()); ASSERT_EQ(14UL, frames_from_callback_.size());
CheckReferencesVp9(0, 0); CheckReferencesVp9(0, 0);
@ -1319,7 +1318,7 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) {
} }
TEST_F(TestRtpFrameReferenceFinder, WrappingFlexReference) { 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()); ASSERT_EQ(1UL, frames_from_callback_.size());
CheckReferencesVp9(1, 0, 0); CheckReferencesVp9(1, 0, 0);