diff --git a/pc/test/svc_e2e_tests.cc b/pc/test/svc_e2e_tests.cc index 4aced7f160..ae35c7f676 100644 --- a/pc/test/svc_e2e_tests.cc +++ b/pc/test/svc_e2e_tests.cc @@ -344,7 +344,7 @@ TEST_P(SvcTest, ScalabilityModeSupported) { alice->SetVideoCodecs({video_codec_config}); }, [](PeerConfigurer* bob) {}, std::move(analyzer)); - fixture->Run(RunParams(TimeDelta::Seconds(5))); + fixture->Run(RunParams(TimeDelta::Seconds(10))); EXPECT_THAT(analyzer_ptr->encoder_layers_seen(), HasSpatialAndTemporalLayers( SvcTestParameters().expected_spatial_layers, diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index 1e2409372a..1fd82bb012 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -2365,25 +2365,15 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate, } } -bool VideoStreamEncoder::DropDueToSize(uint32_t pixel_count) const { +bool VideoStreamEncoder::DropDueToSize(uint32_t source_pixel_count) const { if (!encoder_ || !stream_resource_manager_.DropInitialFrames() || - !encoder_target_bitrate_bps_.has_value()) { + !encoder_target_bitrate_bps_ || + !stream_resource_manager_.SingleActiveStreamPixels()) { return false; } - bool simulcast_or_svc = - (send_codec_.codecType == VideoCodecType::kVideoCodecVP9 && - send_codec_.VP9().numberOfSpatialLayers > 1) || - (send_codec_.numberOfSimulcastStreams > 1 || - encoder_config_.simulcast_layers.size() > 1); - - if (simulcast_or_svc) { - if (stream_resource_manager_.SingleActiveStreamPixels()) { - pixel_count = stream_resource_manager_.SingleActiveStreamPixels().value(); - } else { - return false; - } - } + int pixel_count = std::min( + source_pixel_count, *stream_resource_manager_.SingleActiveStreamPixels()); uint32_t bitrate_bps = stream_resource_manager_.UseBandwidthAllocationBps().value_or( diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc index b9d376d92b..44fc53f90d 100644 --- a/video/video_stream_encoder_unittest.cc +++ b/video/video_stream_encoder_unittest.cc @@ -5636,6 +5636,44 @@ TEST_F(VideoStreamEncoderTest, video_stream_encoder_->Stop(); } +TEST_F(VideoStreamEncoderTest, InitialFrameDropAccountsForResolutionScaling) { + VideoEncoderConfig video_encoder_config; + webrtc::VideoEncoder::EncoderInfo encoder_info; + test::FillEncoderConfiguration(PayloadStringToCodecType("VP8"), 1, + &video_encoder_config); + video_encoder_config.video_stream_factory = + rtc::make_ref_counted( + "VP8", /*max qp*/ 56, /*screencast*/ false, + /*screenshare enabled*/ false, encoder_info); + for (auto& layer : video_encoder_config.simulcast_layers) { + layer.num_temporal_layers = 1; + layer.max_framerate = kDefaultFramerate; + } + video_encoder_config.max_bitrate_bps = kSimulcastTargetBitrate.bps(); + video_encoder_config.content_type = + VideoEncoderConfig::ContentType::kRealtimeVideo; + + video_encoder_config.simulcast_layers[0].active = true; + video_encoder_config.simulcast_layers[0].scale_resolution_down_by = 4; + + video_stream_encoder_->ConfigureEncoder(video_encoder_config.Copy(), + kMaxPayloadLength); + video_stream_encoder_->WaitUntilTaskQueueIsIdle(); + + // Bitrate is not enough for 720p. + video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources( + DataRate::KilobitsPerSec(30), DataRate::KilobitsPerSec(30), + DataRate::KilobitsPerSec(30), 0, 0, 0); + + // Pass 720p frame. Resolution scaling factor is set to 4 which means that + // the target encode resolution is 180p. The default initial frame dropping + // should not be active for 180p no matter of available bitrate. + video_source_.IncomingCapturedFrame(CreateFrame(1, 1280, 720)); + WaitForEncodedFrame(1); + + video_stream_encoder_->Stop(); +} + TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenLayersChange) { const DataRate kLowTargetBitrate = DataRate::KilobitsPerSec(400); // Set simulcast.