Use RtpEncodingParameters min bitrate on lowest spatial layer if set.

Bug: b/299588022
Change-Id: I32dcf6763dbea184faf40cf743a9370073761762
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355864
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42572}
This commit is contained in:
Åsa Persson 2024-07-02 12:05:58 +00:00 committed by WebRTC LUCI CQ
parent a58047d4e9
commit 445d403eca
2 changed files with 53 additions and 0 deletions

View File

@ -301,6 +301,14 @@ VideoCodec VideoCodecInitializer::SetupCodec(
streams.back().num_temporal_layers.value_or(1),
/*num_spatial_layers=*/
std::max<int>(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<int>(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;
}

View File

@ -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<VideoStream> 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<VideoStream> 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<VideoStream> 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;