Set InterLayerPredMode based on scalability mode for VP9.

Bug: webrtc:15673
Change-Id: I7d3cdcda537c85f3be578cb00452e0611759704f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/336280
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41621}
diff --git a/modules/video_coding/codecs/vp9/svc_config.cc b/modules/video_coding/codecs/vp9/svc_config.cc
index 7af8cab..555af83 100644
--- a/modules/video_coding/codecs/vp9/svc_config.cc
+++ b/modules/video_coding/codecs/vp9/svc_config.cc
@@ -190,6 +190,9 @@
     codec.SetScalabilityMode(limited_scalability_mode);
   }
 
+  codec.VP9()->interLayerPred =
+      ScalabilityModeToInterLayerPredMode(*scalability_mode);
+
   absl::optional<ScalableVideoController::StreamLayersConfig> info =
       ScalabilityStructureConfig(*scalability_mode);
   if (!info.has_value()) {
diff --git a/modules/video_coding/codecs/vp9/svc_config_unittest.cc b/modules/video_coding/codecs/vp9/svc_config_unittest.cc
index 1b1abe0..2515b1c 100644
--- a/modules/video_coding/codecs/vp9/svc_config_unittest.cc
+++ b/modules/video_coding/codecs/vp9/svc_config_unittest.cc
@@ -13,6 +13,7 @@
 #include <cstddef>
 #include <vector>
 
+#include "api/video_codecs/video_encoder.h"
 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -65,6 +66,25 @@
   EXPECT_EQ(codec.GetScalabilityMode(), ScalabilityMode::kL3T3_KEY);
 }
 
+TEST(SvcConfig, UpdatesInterLayerPredModeBasedOnScalabilityMode) {
+  VideoCodec codec;
+  codec.codecType = kVideoCodecVP9;
+  codec.width = 1280;
+  codec.height = 720;
+  codec.SetScalabilityMode(ScalabilityMode::kL3T3_KEY);
+
+  std::vector<SpatialLayer> spatial_layers = GetVp9SvcConfig(codec);
+  EXPECT_EQ(codec.VP9()->interLayerPred, InterLayerPredMode::kOnKeyPic);
+
+  codec.SetScalabilityMode(ScalabilityMode::kL3T3);
+  spatial_layers = GetVp9SvcConfig(codec);
+  EXPECT_EQ(codec.VP9()->interLayerPred, InterLayerPredMode::kOn);
+
+  codec.SetScalabilityMode(ScalabilityMode::kS3T3);
+  spatial_layers = GetVp9SvcConfig(codec);
+  EXPECT_EQ(codec.VP9()->interLayerPred, InterLayerPredMode::kOff);
+}
+
 TEST(SvcConfig, NumSpatialLayersLimitedWithScalabilityMode) {
   VideoCodec codec;
   codec.codecType = kVideoCodecVP9;
diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc
index b0edab6..60ef7ae 100644
--- a/modules/video_coding/video_codec_initializer_unittest.cc
+++ b/modules/video_coding/video_codec_initializer_unittest.cc
@@ -631,4 +631,25 @@
             codec.spatialLayers[0].maxBitrate);
 }
 
+TEST_F(VideoCodecInitializerTest, UpdatesVp9SpecificFieldsWithScalabilityMode) {
+  VideoEncoderConfig config;
+  config.codec_type = VideoCodecType::kVideoCodecVP9;
+  std::vector<VideoStream> streams = {DefaultStream()};
+  streams[0].scalability_mode = ScalabilityMode::kL2T3_KEY;
+
+  VideoCodec codec;
+  EXPECT_TRUE(VideoCodecInitializer::SetupCodec(config, streams, &codec));
+
+  EXPECT_EQ(codec.VP9()->numberOfSpatialLayers, 2u);
+  EXPECT_EQ(codec.VP9()->numberOfTemporalLayers, 3u);
+  EXPECT_EQ(codec.VP9()->interLayerPred, InterLayerPredMode::kOnKeyPic);
+
+  streams[0].scalability_mode = ScalabilityMode::kS3T1;
+  EXPECT_TRUE(VideoCodecInitializer::SetupCodec(config, streams, &codec));
+
+  EXPECT_EQ(codec.VP9()->numberOfSpatialLayers, 3u);
+  EXPECT_EQ(codec.VP9()->numberOfTemporalLayers, 1u);
+  EXPECT_EQ(codec.VP9()->interLayerPred, InterLayerPredMode::kOff);
+}
+
 }  // namespace webrtc