From 19ff1ad237e3b77f15cc5aa427941b9f0a324f94 Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 11 Sep 2023 16:44:53 +0200 Subject: [PATCH] Reland "Always use AV1 specific bitrate limits when spatial layers are used." This reverts commit 030c6ff43fe407f87ae329512ebb87604b253074. Reason for revert: reland with fix Original change's description: > Revert "Always use AV1 specific bitrate limits when spatial layers are used." > > This reverts commit d2d165d47cc7a2aaa53596ad8055ddc30b76101b. > > Reason for revert: All the regressions! > > Original change's description: > > Always use AV1 specific bitrate limits when spatial layers are used. > > > > Bug: b/295129711 > > Change-Id: I93569027bea34c43e2a3c4de0875e8bbddd5b64e > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/319283 > > Reviewed-by: Michael Horowitz > > Commit-Queue: Philip Eliasson > > Reviewed-by: Sergey Silkin > > Cr-Commit-Position: refs/heads/main@{#40719} > > Bug: b/295129711 > Change-Id: I5776edbaba33e86eb10414062ef2b29510f40b8d > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/319880 > Commit-Queue: Philip Eliasson > Bot-Commit: rubber-stamper@appspot.gserviceaccount.com > Cr-Commit-Position: refs/heads/main@{#40730} Bug: b/295129711 Change-Id: I5fe84184d3f3780fdc4e9c1d43c4989d333d44a7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/319881 Reviewed-by: Michael Horowitz Commit-Queue: Philip Eliasson Reviewed-by: Sergey Silkin Cr-Commit-Position: refs/heads/main@{#40739} --- .../video_coding/codecs/av1/av1_svc_config.cc | 9 ++++--- .../codecs/av1/av1_svc_config_unittest.cc | 27 +++++++------------ 2 files changed, 14 insertions(+), 22 deletions(-) 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) {