From 9ef5e056f9d9318f7bdfda78d6acff13fa522ed4 Mon Sep 17 00:00:00 2001 From: Ilya Nikolaevskiy Date: Tue, 5 Mar 2019 10:08:35 +0100 Subject: [PATCH] Fix target bitrate handling for a single layer VP9 screenshare MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For a single layer vp9, the target bitrate was not set correctly. This may cause a problem for screenshare case, since target bitrate is respected in that case. If it were less than a min bitrate, the only spatial layer was permanently disabled. Bug: webrtc:10257 Change-Id: I0980349adfc2970f810acc51a3e2a31ecbb2bbd2 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125681 Reviewed-by: Erik Språng Commit-Queue: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/master@{#26970} --- .../video_coding/codecs/vp9/svc_rate_allocator.cc | 1 + modules/video_coding/video_codec_initializer.cc | 1 + .../video_coding/video_codec_initializer_unittest.cc | 12 ++++++++++++ 3 files changed, 14 insertions(+) diff --git a/modules/video_coding/codecs/vp9/svc_rate_allocator.cc b/modules/video_coding/codecs/vp9/svc_rate_allocator.cc index daa59b1101..551e65522d 100644 --- a/modules/video_coding/codecs/vp9/svc_rate_allocator.cc +++ b/modules/video_coding/codecs/vp9/svc_rate_allocator.cc @@ -203,6 +203,7 @@ VideoBitrateAllocation SvcRateAllocator::GetAllocationScreenSharing( codec_.spatialLayers[sl_idx].minBitrate * 1000; const size_t target_bitrate_bps = codec_.spatialLayers[sl_idx].targetBitrate * 1000; + RTC_DCHECK_LE(min_bitrate_bps, target_bitrate_bps); const size_t bitrate_bps = std::min(left_bitrate_bps, target_bitrate_bps); if (bitrate_bps >= min_bitrate_bps) { diff --git a/modules/video_coding/video_codec_initializer.cc b/modules/video_coding/video_codec_initializer.cc index a2bc27aab4..3316ce1581 100644 --- a/modules/video_coding/video_codec_initializer.cc +++ b/modules/video_coding/video_codec_initializer.cc @@ -190,6 +190,7 @@ VideoCodec VideoCodecInitializer::VideoEncoderConfigToVideoCodec( if (no_spatial_layering) { // Use codec's bitrate limits. spatial_layers.back().minBitrate = video_codec.minBitrate; + spatial_layers.back().targetBitrate = video_codec.maxBitrate; spatial_layers.back().maxBitrate = video_codec.maxBitrate; } diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc index 6734b7e852..0f2d9f19b9 100644 --- a/modules/video_coding/video_codec_initializer_unittest.cc +++ b/modules/video_coding/video_codec_initializer_unittest.cc @@ -296,6 +296,18 @@ TEST_F(VideoCodecInitializerTest, kDefaultMaxBitrateBps / 1000); } +TEST_F(VideoCodecInitializerTest, + Vp9SingleSpatialLayerTargetBitrateIsEqualToCodecMaxBitrate) { + SetUpFor(VideoCodecType::kVideoCodecVP9, 1, 1, true); + VideoStream stream = DefaultStream(); + stream.num_temporal_layers = 1; + streams_.push_back(stream); + + EXPECT_TRUE(InitializeCodec()); + EXPECT_EQ(codec_out_.spatialLayers[0].targetBitrate, + kDefaultMaxBitrateBps / 1000); +} + TEST_F(VideoCodecInitializerTest, Vp9KeepBitrateLimitsIfNumberOfSpatialLayersIsReducedToOne) { // Request 3 spatial layers for 320x180 input. Actual number of layers will be