Make sure rid has a matching ssrc when requesting keyframe. Bug: b/510386551 Change-Id: Ic1a6606d987dc2ff3dced041235317bc7436972b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/484940 Reviewed-by: Per Kjellander <perkj@webrtc.org> Commit-Queue: Erik Språng <sprang@webrtc.org> Auto-Submit: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#48072}
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index d952029..f813f18 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc
@@ -2734,6 +2734,9 @@ // SVC is used instead of simulcast. Remove unnecessary SSRCs. if (config.rtp.ssrcs.size() > 1) { config.rtp.ssrcs.resize(1); + if (config.rtp.rids.size() > 1) { + config.rtp.rids.resize(1); + } if (config.rtp.rtx.ssrcs.size() > 1) { config.rtp.rtx.ssrcs.resize(1); }
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc index fda5f0b..827da4d 100644 --- a/video/video_send_stream_impl.cc +++ b/video/video_send_stream_impl.cc
@@ -665,6 +665,10 @@ void VideoSendStreamImpl::GenerateKeyFrame( const std::vector<std::string>& rids) { RTC_DCHECK_RUN_ON(&thread_checker_); + if (!video_stream_encoder_) { + return; + } + // Map rids to layers. If rids is empty, generate a keyframe for all layers. std::vector<VideoFrameType> next_frames(config_.rtp.ssrcs.size(), VideoFrameType::kVideoFrameKey); @@ -674,15 +678,16 @@ for (const auto& rid : rids) { for (size_t i = 0; i < config_.rtp.rids.size(); i++) { if (config_.rtp.rids[i] == rid) { - next_frames[i] = VideoFrameType::kVideoFrameKey; + if (i < next_frames.size()) { + next_frames[i] = VideoFrameType::kVideoFrameKey; + } break; } } } } - if (video_stream_encoder_) { - video_stream_encoder_->SendKeyFrame(next_frames); - } + + video_stream_encoder_->SendKeyFrame(next_frames); } void VideoSendStreamImpl::DeliverRtcp(std::span<const uint8_t> packet) {
diff --git a/video/video_send_stream_impl_unittest.cc b/video/video_send_stream_impl_unittest.cc index 6cbf89f..a3046f6 100644 --- a/video/video_send_stream_impl_unittest.cc +++ b/video/video_send_stream_impl_unittest.cc
@@ -1507,5 +1507,17 @@ vss_impl->Stop(); } +TEST_F(VideoSendStreamImplTest, GenerateKeyFrameWithMismatchedRids) { + // Multiple RIDs available for simulcast. + config_.rtp.rids = {"a", "b", "c"}; + // Single encoder config (no simulcast, or potentially SVC). + auto vss_impl = CreateVideoSendStreamImpl( + TestVideoEncoderConfig(VideoEncoderConfig::ContentType::kRealtimeVideo)); + vss_impl->Start(); + // Generating a keyframe on a RID that is not available should be a noop. + vss_impl->GenerateKeyFrame({"c"}); + vss_impl->Stop(); +} + } // namespace internal } // namespace webrtc