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 <philipel@webrtc.org>
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24622}diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc
index 7714b29..d8fdebd 100644
--- a/modules/video_coding/rtp_frame_reference_finder.cc
+++ b/modules/video_coding/rtp_frame_reference_finder.cc
@@ -440,13 +440,19 @@
RTC_LOG(LS_WARNING) << "Received scalability structure on a non base "
"layer frame. Scalability structure ignored.";
} else {
- current_ss_idx_ = Add<kMaxGofSaved>(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<kMaxGofSaved>(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 5705892..1b9fe17 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 @@
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