diff --git a/modules/video_coding/codecs/av1/av1_svc_config.cc b/modules/video_coding/codecs/av1/av1_svc_config.cc index c480737096..30c0f307a5 100644 --- a/modules/video_coding/codecs/av1/av1_svc_config.cc +++ b/modules/video_coding/codecs/av1/av1_svc_config.cc @@ -85,6 +85,9 @@ bool SetAv1SvcConfig(VideoCodec& video_codec, } } + bool configured_for_single_spatial_layer = + ScalabilityModeToNumSpatialLayers(*scalability_mode) == 1; + if (ScalabilityMode reduced = LimitNumSpatialLayers( *scalability_mode, GetLimitedNumSpatialLayers(video_codec.width, video_codec.height)); @@ -118,7 +121,7 @@ bool SetAv1SvcConfig(VideoCodec& video_codec, spatial_layer.active = true; } - if (info.num_spatial_layers == 1) { + if (configured_for_single_spatial_layer) { SpatialLayer& spatial_layer = video_codec.spatialLayers[0]; spatial_layer.minBitrate = video_codec.minBitrate; spatial_layer.maxBitrate = video_codec.maxBitrate; @@ -129,10 +132,8 @@ bool SetAv1SvcConfig(VideoCodec& video_codec, for (int sl_idx = 0; sl_idx < info.num_spatial_layers; ++sl_idx) { SpatialLayer& spatial_layer = video_codec.spatialLayers[sl_idx]; - // minBitrate and maxBitrate formulas are copied from vp9 settings and - // are not yet tuned for av1. const int num_pixels = spatial_layer.width * spatial_layer.height; - int min_bitrate_kbps = (600.0 * std::sqrt(num_pixels) - 95'000.0) / 1000.0; + int min_bitrate_kbps = (480.0 * std::sqrt(num_pixels) - 95'000.0) / 1000.0; spatial_layer.minBitrate = std::max(min_bitrate_kbps, 20); spatial_layer.maxBitrate = 50 + static_cast(1.6 * num_pixels / 1000.0); spatial_layer.targetBitrate = diff --git a/modules/video_coding/codecs/av1/av1_svc_config_unittest.cc b/modules/video_coding/codecs/av1/av1_svc_config_unittest.cc index 7ba7986f0d..cc2eba6dfb 100644 --- a/modules/video_coding/codecs/av1/av1_svc_config_unittest.cc +++ b/modules/video_coding/codecs/av1/av1_svc_config_unittest.cc @@ -142,29 +142,20 @@ TEST(Av1SvcConfigTest, CopiesMinMaxBitrateForSingleSpatialLayer) { } TEST(Av1SvcConfigTest, SetsBitratesForMultipleSpatialLayers) { - VideoCodec video_codec = GetDefaultVideoCodec(); - video_codec.SetScalabilityMode(ScalabilityMode::kL3T3); + VideoCodec video_codec; + video_codec.codecType = kVideoCodecAV1; + video_codec.width = 640; + video_codec.height = 360; + video_codec.SetScalabilityMode(ScalabilityMode::kL2T2); EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare, /*num_spatial_layers=*/kDontCare)); - EXPECT_GT(video_codec.spatialLayers[0].minBitrate, 0u); - EXPECT_LE(video_codec.spatialLayers[0].minBitrate, - video_codec.spatialLayers[0].targetBitrate); - EXPECT_LE(video_codec.spatialLayers[0].targetBitrate, - video_codec.spatialLayers[0].maxBitrate); + EXPECT_EQ(video_codec.spatialLayers[0].minBitrate, 20u); + EXPECT_EQ(video_codec.spatialLayers[0].maxBitrate, 142u); - EXPECT_GT(video_codec.spatialLayers[1].minBitrate, 0u); - EXPECT_LE(video_codec.spatialLayers[1].minBitrate, - video_codec.spatialLayers[1].targetBitrate); - EXPECT_LE(video_codec.spatialLayers[1].targetBitrate, - video_codec.spatialLayers[1].maxBitrate); - - EXPECT_GT(video_codec.spatialLayers[2].minBitrate, 0u); - EXPECT_LE(video_codec.spatialLayers[2].minBitrate, - video_codec.spatialLayers[2].targetBitrate); - EXPECT_LE(video_codec.spatialLayers[2].targetBitrate, - video_codec.spatialLayers[2].maxBitrate); + EXPECT_EQ(video_codec.spatialLayers[1].minBitrate, 135u); + EXPECT_EQ(video_codec.spatialLayers[1].maxBitrate, 418u); } TEST(Av1SvcConfigTest, ReduceSpatialLayersOnInsufficentInputResolution) {