From 42aab25b7f42bda70bb7d06d9ac7183fcabbac95 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Tue, 20 Oct 2020 13:06:59 +0200 Subject: [PATCH] In Vp9 wrapper allow to use ScalableVideoController with simulcast structures Bug: webrtc:11999 Change-Id: Ifed99e8676a75f869a7df6b3ac64a6ad1c29c62f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/189550 Reviewed-by: Philip Eliasson Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#32452} --- .../codecs/vp9/test/vp9_impl_unittest.cc | 1 + modules/video_coding/codecs/vp9/vp9_impl.cc | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc b/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc index d3b7b94187..ad88e905bd 100644 --- a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc +++ b/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc @@ -669,6 +669,7 @@ TEST(Vp9ImplTest, DisableEnableBaseLayerWithSvcControllerTriggersKeyFrame) { ConfigureSvc(codec_settings, num_spatial_layers, num_temporal_layers); codec_settings.VP9()->frameDroppingOn = false; codec_settings.VP9()->flexibleMode = false; + codec_settings.VP9()->interLayerPred = InterLayerPredMode::kOnKeyPic; codec_settings.mode = VideoCodecMode::kRealtimeVideo; EXPECT_EQ(encoder->InitEncode(&codec_settings, kSettings), diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc index 599a4d5ac1..c11f67c8e4 100644 --- a/modules/video_coding/codecs/vp9/vp9_impl.cc +++ b/modules/video_coding/codecs/vp9/vp9_impl.cc @@ -227,16 +227,21 @@ std::unique_ptr CreateVp9ScalabilityStructure( return std::make_unique(); } - if (codec.VP9().interLayerPred != InterLayerPredMode::kOn || - codec.mode == VideoCodecMode::kScreensharing) { - // TODO(bugs.webrtc.org/11999): Return names of the structure when they are - // implemented and support frame skipping. - return nullptr; - } - char name[20]; rtc::SimpleStringBuilder ss(name); - ss << "L" << num_spatial_layers << "T" << num_temporal_layers; + if (codec.mode == VideoCodecMode::kScreensharing) { + // TODO(bugs.webrtc.org/11999): Compose names of the structures when they + // are implemented. + return nullptr; + } else if (codec.VP9().interLayerPred == InterLayerPredMode::kOn || + num_spatial_layers == 1) { + ss << "L" << num_spatial_layers << "T" << num_temporal_layers; + } else if (codec.VP9().interLayerPred == InterLayerPredMode::kOnKeyPic) { + ss << "L" << num_spatial_layers << "T" << num_temporal_layers << "_KEY"; + } else { + RTC_DCHECK_EQ(codec.VP9().interLayerPred, InterLayerPredMode::kOff); + ss << "S" << num_spatial_layers << "T" << num_temporal_layers; + } // Check spatial ratio. if (num_spatial_layers > 1 && codec.spatialLayers[0].targetBitrate > 0) {