Fuzz explicitly configured spatial layers with VP9 encoder

With the new SVC controller this will hopefully help uncover more subtle
bugs.

Bug: webrtc:11999
Change-Id: Iab76d38b3fb8dfbbeb269f4ba1e74f6f425501f7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231694
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Emil Lundmark <lndmrk@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34981}
diff --git a/test/fuzzers/vp9_encoder_references_fuzzer.cc b/test/fuzzers/vp9_encoder_references_fuzzer.cc
index 9c793ae..3d8ceb7 100644
--- a/test/fuzzers/vp9_encoder_references_fuzzer.cc
+++ b/test/fuzzers/vp9_encoder_references_fuzzer.cc
@@ -34,6 +34,8 @@
 using test::FuzzDataHelper;
 using ::testing::NiceMock;
 
+constexpr int kBitrateEnabledBps = 100'000;
+
 class FrameValidator : public EncodedImageCallback {
  public:
   ~FrameValidator() override = default;
@@ -75,8 +77,8 @@
   }
 
  private:
-  // With 4 spatial layers and patterns up to 8 pictures, it should be enought
-  // to keep 32 last frames to validate dependencies.
+  // With 4 spatial layers and patterns up to 8 pictures, it should be enough to
+  // keep the last 32 frames to validate dependencies.
   static constexpr size_t kMaxFrameHistorySize = 32;
   struct LayerFrame {
     int64_t frame_id;
@@ -220,6 +222,9 @@
       SpatialLayer& spatial_layer = codec_settings.spatialLayers[sid];
       codec_settings.width = 320 << sid;
       codec_settings.height = 180 << sid;
+      spatial_layer.width = codec_settings.width;
+      spatial_layer.height = codec_settings.height;
+      spatial_layer.targetBitrate = kBitrateEnabledBps * num_temporal_layers;
       spatial_layer.maxFramerate = codec_settings.maxFramerate;
       spatial_layer.numberOfTemporalLayers = num_temporal_layers;
     }
@@ -424,7 +429,7 @@
     parameters.framerate_fps = 30.0;
     for (int sid = 0; sid < codec.VP9()->numberOfSpatialLayers; ++sid) {
       for (int tid = 0; tid < codec.VP9()->numberOfTemporalLayers; ++tid) {
-        parameters.bitrate.SetBitrate(sid, tid, 100'000);
+        parameters.bitrate.SetBitrate(sid, tid, kBitrateEnabledBps);
       }
     }
     encoder.SetRates(parameters);
@@ -449,6 +454,10 @@
         encoder.Encode(fake_image, &frame_types);
         uint8_t encode_spatial_layers = (action >> 4);
         for (size_t sid = 0; sid < state.config.ss_number_layers; ++sid) {
+          if (state.config.ss_target_bitrate[sid] == 0) {
+            // Don't encode disabled spatial layers.
+            continue;
+          }
           bool drop = true;
           switch (state.frame_drop.framedrop_mode) {
             case FULL_SUPERFRAME_DROP:
@@ -472,7 +481,7 @@
         }
       } break;
       case kSetRates: {
-        // bitmask of the action: (S3)(S1)(S0)01,
+        // bitmask of the action: (S2)(S1)(S0)01,
         // where Sx is number of temporal layers to enable for spatial layer x
         // In pariculat Sx = 0 indicates spatial layer x should be disabled.
         LibvpxVp9Encoder::RateControlParameters parameters;
@@ -480,7 +489,7 @@
         for (int sid = 0; sid < codec.VP9()->numberOfSpatialLayers; ++sid) {
           int temporal_layers = (action >> ((1 + sid) * 2)) & 0b11;
           for (int tid = 0; tid < temporal_layers; ++tid) {
-            parameters.bitrate.SetBitrate(sid, tid, 100'000);
+            parameters.bitrate.SetBitrate(sid, tid, kBitrateEnabledBps);
           }
         }
         // Ignore allocation that turns off all the layers. in such case