From 27064adc34c7287c014d91ce54307c22cb8a210a Mon Sep 17 00:00:00 2001 From: Ilya Nikolaevskiy Date: Fri, 10 Jan 2020 11:56:31 +0100 Subject: [PATCH] SimulcastEncoderAdapter: In passthrough mode set correct lenght for frame_types parameter If in simulcast case some streams are disabled (especially the first one), the key-frame requests might be ignorred by e.g. libvpx vp8 encoder wrapper. Before this CL SimulcastEncoderAdapter always passes single frame type in Encode() call. However, if underlying encoder used simulcast, it would've expected as many frame types as there are streams. Bug: none Change-Id: I7f56a6540b67273b7d3cf9fa86dc76015b92d271 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165681 Reviewed-by: Evan Shrubsole Commit-Queue: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/master@{#30210} --- media/engine/simulcast_encoder_adapter.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index 6f547aff89..08a463098c 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -384,16 +384,22 @@ int SimulcastEncoderAdapter::Encode( const uint32_t frame_timestamp_ms = 1000 * input_image.timestamp() / 90000; // kVideoPayloadTypeFrequency; - std::vector stream_frame_types; + // If adapter is passed through and only one sw encoder does simulcast, + // frame types for all streams should be passed to the encoder unchanged. + // Otherwise a single per-encoder frame type is passed. + std::vector stream_frame_types( + streaminfos_.size() == 1 ? NumberOfStreams(codec_) : 1); if (send_key_frame) { - stream_frame_types.push_back(VideoFrameType::kVideoFrameKey); + std::fill(stream_frame_types.begin(), stream_frame_types.end(), + VideoFrameType::kVideoFrameKey); streaminfos_[stream_idx].key_frame_request = false; } else { if (streaminfos_[stream_idx].framerate_controller->DropFrame( frame_timestamp_ms)) { continue; } - stream_frame_types.push_back(VideoFrameType::kVideoFrameDelta); + std::fill(stream_frame_types.begin(), stream_frame_types.end(), + VideoFrameType::kVideoFrameDelta); } streaminfos_[stream_idx].framerate_controller->AddFrame(frame_timestamp_ms);