From aff5be35e060a3d6ec6af506916fb0e2e03b8b00 Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 20 Mar 2017 10:42:13 -0700 Subject: [PATCH] Don't recalculate Tl0PicIdx when the VP9 frame has no Tl0PicIdx. BUG=webrtc:7362 Review-Url: https://codereview.webrtc.org/2760893002 Cr-Commit-Position: refs/heads/master@{#17311} --- .../rtp_frame_reference_finder.cc | 13 +- .../rtp_frame_reference_finder_unittest.cc | 162 +++++++++--------- 2 files changed, 86 insertions(+), 89 deletions(-) diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc index 5926c524be..b0999cc0e9 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc @@ -676,11 +676,14 @@ bool RtpFrameReferenceFinder::Vp9PidTl0Fix(const RtpFrameObject& frame, vp9_fix_jump_timestamp_ = frame.timestamp; gof_info_.clear(); - vp9_fix_tl0_pic_idx_offset_ = - ForwardDiff(*tl0_pic_idx, vp9_fix_last_tl0_pic_idx_); - vp9_fix_tl0_pic_idx_offset_ += kMaxGofSaved; - fixed_tl0 = Add(*tl0_pic_idx, vp9_fix_tl0_pic_idx_offset_); - vp9_fix_last_tl0_pic_idx_ = fixed_tl0; + if (fixed_tl0 != kNoTl0PicIdx) { + vp9_fix_tl0_pic_idx_offset_ = + ForwardDiff(*tl0_pic_idx, vp9_fix_last_tl0_pic_idx_); + vp9_fix_tl0_pic_idx_offset_ += kMaxGofSaved; + fixed_tl0 = + Add(*tl0_pic_idx, vp9_fix_tl0_pic_idx_offset_); + vp9_fix_last_tl0_pic_idx_ = fixed_tl0; + } } // Update |vp9_fix_last_picture_id_| with the most recent picture id. 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 cc361ec258..6ea8e020e2 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder_unittest.cc @@ -1283,6 +1283,42 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) { CheckReferencesVp9(pid + 8, 1, pid + 7); } +// TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be +// around M59). +TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsForwardNoTl0PicIdx) { + GofInfoVP9 ss; + ss.SetGofInfoVP9(kTemporalStructureMode1); + + VCMPacket packet; + packet.timestamp = 0; + packet.codec = kVideoCodecVP9; + packet.frameType = kVideoFrameKey; + packet.markerBit = true; + packet.video_header.codecHeader.VP9.flexible_mode = false; + packet.video_header.codecHeader.VP9.picture_id = 0; + packet.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx; + packet.video_header.codecHeader.VP9.spatial_idx = kNoSpatialIdx; + packet.video_header.codecHeader.VP9.tl0_pic_idx = kNoTl0PicIdx; + packet.video_header.codecHeader.VP9.temporal_up_switch = true; + packet.video_header.codecHeader.VP9.ss_data_available = true; + packet.video_header.codecHeader.VP9.gof = ss; + + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); + + packet.timestamp = 1; + packet.video_header.codecHeader.VP9.picture_id = 5000; + + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); + + ASSERT_EQ(2UL, frames_from_callback_.size()); + CheckReferencesVp9(0, 0); + CheckReferencesVp9(128, 0); +} + // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be // around M59). TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsBackwardThenForward) { @@ -1303,33 +1339,24 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsBackwardThenForward) { packet.video_header.codecHeader.VP9.ss_data_available = true; packet.video_header.codecHeader.VP9.gof = ss; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); // Timestamp goes forward but pid goes backwards. packet.timestamp = 1; packet.video_header.codecHeader.VP9.picture_id = 0; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 2; packet.video_header.codecHeader.VP9.picture_id = 5000; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); ASSERT_EQ(3UL, frames_from_callback_.size()); CheckReferencesVp9(1, 0); @@ -1356,45 +1383,33 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_Tl0JumpsBackwardThenForward) { packet.video_header.codecHeader.VP9.temporal_up_switch = true; packet.video_header.codecHeader.VP9.ss_data_available = true; packet.video_header.codecHeader.VP9.gof = ss; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 1; packet.video_header.codecHeader.VP9.picture_id = 1; packet.video_header.codecHeader.VP9.tl0_pic_idx = 0; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 2; packet.frameType = kVideoFrameDelta; packet.video_header.codecHeader.VP9.picture_id = 2; packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 3; packet.frameType = kVideoFrameKey; packet.video_header.codecHeader.VP9.ss_data_available = true; packet.video_header.codecHeader.VP9.picture_id = 3; packet.video_header.codecHeader.VP9.tl0_pic_idx = 129; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); ASSERT_EQ(4UL, frames_from_callback_.size()); CheckReferencesVp9(0, 0); @@ -1422,42 +1437,30 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidSmallJumpForward) { packet.video_header.codecHeader.VP9.temporal_up_switch = true; packet.video_header.codecHeader.VP9.ss_data_available = true; packet.video_header.codecHeader.VP9.gof = ss; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 1; packet.video_header.codecHeader.VP9.picture_id = 2; packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 2; packet.video_header.codecHeader.VP9.picture_id = 3; packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 2; packet.video_header.codecHeader.VP9.picture_id = 4; packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); ASSERT_EQ(4UL, frames_from_callback_.size()); CheckReferencesVp9(1, 0); @@ -1485,32 +1488,23 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_DropOldFrame) { packet.video_header.codecHeader.VP9.temporal_up_switch = true; packet.video_header.codecHeader.VP9.ss_data_available = true; packet.video_header.codecHeader.VP9.gof = ss; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 1; packet.video_header.codecHeader.VP9.picture_id = 0; packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); packet.timestamp = 0; packet.video_header.codecHeader.VP9.picture_id = 3; packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; - { - ref_packet_buffer_->InsertPacket(&packet); - std::unique_ptr frame( - new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); - reference_finder_->ManageFrame(std::move(frame)); - } + ref_packet_buffer_->InsertPacket(&packet); + reference_finder_->ManageFrame(std::unique_ptr( + new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0))); ASSERT_EQ(2UL, frames_from_callback_.size()); CheckReferencesVp9(1, 0);