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