From 2f864fb4ab1b989a98be556b16b25ae9ea4aef43 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 7 Sep 2018 11:49:38 +0200 Subject: [PATCH] Handle empty GOF. Assume that stream has single temporal layer if number of frames in GOF is set to zero (valid case). Bug: chromium:879584 Change-Id: I7ced082190e40c1bf4cc1468babfd98b0a61f0dd Reviewed-on: https://webrtc-review.googlesource.com/98800 Reviewed-by: Philip Eliasson Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#24622} --- modules/video_coding/rtp_frame_reference_finder.cc | 14 ++++++++++---- .../rtp_frame_reference_finder_unittest.cc | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc index 7714b29d92..d8fdebd16a 100644 --- a/modules/video_coding/rtp_frame_reference_finder.cc +++ b/modules/video_coding/rtp_frame_reference_finder.cc @@ -440,13 +440,19 @@ RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9( RTC_LOG(LS_WARNING) << "Received scalability structure on a non base " "layer frame. Scalability structure ignored."; } else { - current_ss_idx_ = Add(current_ss_idx_, 1); - if (codec_header.gof.num_frames_in_gof == 0 || - codec_header.gof.num_frames_in_gof > kMaxVp9FramesInGof) { + if (codec_header.gof.num_frames_in_gof > kMaxVp9FramesInGof) { return kDrop; } - scalability_structures_[current_ss_idx_] = codec_header.gof; + GofInfoVP9 gof = codec_header.gof; + if (gof.num_frames_in_gof == 0) { + RTC_LOG(LS_WARNING) << "Number of frames in GOF is zero. Assume " + "that stream has only one temporal layer."; + gof.SetGofInfoVP9(kTemporalStructureMode1); + } + + current_ss_idx_ = Add(current_ss_idx_, 1); + scalability_structures_[current_ss_idx_] = gof; scalability_structures_[current_ss_idx_].pid_start = frame->id.picture_id; gof_info_.emplace(unwrapped_tl0, GofInfo(&scalability_structures_[current_ss_idx_], diff --git a/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/modules/video_coding/rtp_frame_reference_finder_unittest.cc index 5705892806..1b9fe1766c 100644 --- a/modules/video_coding/rtp_frame_reference_finder_unittest.cc +++ b/modules/video_coding/rtp_frame_reference_finder_unittest.cc @@ -1360,5 +1360,19 @@ TEST_F(TestRtpFrameReferenceFinder, Vp9GofTidTooHigh) { CheckReferencesVp9(0, 0); } +TEST_F(TestRtpFrameReferenceFinder, Vp9GofZeroFrames) { + uint16_t pid = Rand(); + uint16_t sn = Rand(); + GofInfoVP9 ss; + ss.num_frames_in_gof = 0; + + InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss); + InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 0, 1); + + ASSERT_EQ(2UL, frames_from_callback_.size()); + CheckReferencesVp9(0, 0); + CheckReferencesVp9(1, 0, 0); +} + } // namespace video_coding } // namespace webrtc