mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00
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:
parent
cf42781981
commit
d34a188649
2 changed files with 38 additions and 34 deletions
|
@ -392,8 +392,7 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
|
|||
absl::get<RTPVideoHeaderVP9>(*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) {
|
||||
|
|
|
@ -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<uint8_t> refs = std::vector<uint8_t>()) {
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue