From 445d403ecaba3cbf269ef4a54d1fc862c89c4581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85sa=20Persson?= Date: Tue, 2 Jul 2024 12:05:58 +0000 Subject: [PATCH] Use RtpEncodingParameters min bitrate on lowest spatial layer if set. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: b/299588022 Change-Id: I32dcf6763dbea184faf40cf743a9370073761762 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355864 Reviewed-by: Erik Språng Commit-Queue: Åsa Persson Cr-Commit-Position: refs/heads/main@{#42572} --- .../video_coding/video_codec_initializer.cc | 8 ++++ .../video_codec_initializer_unittest.cc | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/modules/video_coding/video_codec_initializer.cc b/modules/video_coding/video_codec_initializer.cc index 2ec419a76d..709c57c8fa 100644 --- a/modules/video_coding/video_codec_initializer.cc +++ b/modules/video_coding/video_codec_initializer.cc @@ -301,6 +301,14 @@ VideoCodec VideoCodecInitializer::SetupCodec( streams.back().num_temporal_layers.value_or(1), /*num_spatial_layers=*/ std::max(config.spatial_layers.size(), 1))) { + // If min bitrate is set via RtpEncodingParameters, use this value on + // lowest spatial layer. + if (!config.simulcast_layers.empty() && + config.simulcast_layers[0].min_bitrate_bps > 0) { + video_codec.spatialLayers[0].minBitrate = std::min( + config.simulcast_layers[0].min_bitrate_bps / 1000, + static_cast(video_codec.spatialLayers[0].targetBitrate)); + } for (size_t i = 0; i < config.spatial_layers.size(); ++i) { video_codec.spatialLayers[i].active = config.spatial_layers[i].active; } diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc index 109b095b83..de88a64e85 100644 --- a/modules/video_coding/video_codec_initializer_unittest.cc +++ b/modules/video_coding/video_codec_initializer_unittest.cc @@ -535,6 +535,51 @@ TEST_F(VideoCodecInitializerTest, Av1TwoSpatialLayersBitratesAreConsistent) { codec.spatialLayers[1].maxBitrate); } +TEST_F(VideoCodecInitializerTest, Av1ConfiguredMinBitrateApplied) { + VideoEncoderConfig config; + config.simulcast_layers.resize(1); + config.simulcast_layers[0].min_bitrate_bps = 28000; + config.codec_type = VideoCodecType::kVideoCodecAV1; + std::vector streams = {DefaultStream()}; + streams[0].scalability_mode = ScalabilityMode::kL3T2; + + VideoCodec codec = + VideoCodecInitializer::SetupCodec(env_.field_trials(), config, streams); + + EXPECT_EQ(codec.spatialLayers[0].minBitrate, 28u); + EXPECT_GE(codec.spatialLayers[0].targetBitrate, + codec.spatialLayers[0].minBitrate); +} + +TEST_F(VideoCodecInitializerTest, + Av1ConfiguredMinBitrateLimitedByDefaultTargetBitrate) { + VideoEncoderConfig config; + config.simulcast_layers.resize(1); + config.simulcast_layers[0].min_bitrate_bps = 2228000; + config.codec_type = VideoCodecType::kVideoCodecAV1; + std::vector streams = {DefaultStream()}; + streams[0].scalability_mode = ScalabilityMode::kL3T2; + + VideoCodec codec = + VideoCodecInitializer::SetupCodec(env_.field_trials(), config, streams); + + EXPECT_GE(codec.spatialLayers[0].targetBitrate, + codec.spatialLayers[0].minBitrate); +} + +TEST_F(VideoCodecInitializerTest, Av1ConfiguredMinBitrateNotAppliedIfUnset) { + VideoEncoderConfig config; + config.simulcast_layers.resize(1); + config.codec_type = VideoCodecType::kVideoCodecAV1; + std::vector streams = {DefaultStream()}; + streams[0].scalability_mode = ScalabilityMode::kL3T2; + + VideoCodec codec = + VideoCodecInitializer::SetupCodec(env_.field_trials(), config, streams); + + EXPECT_GT(codec.spatialLayers[0].minBitrate, 0u); +} + TEST_F(VideoCodecInitializerTest, Av1TwoSpatialLayersActiveByDefault) { VideoEncoderConfig config; config.codec_type = VideoCodecType::kVideoCodecAV1;