Refactor ScalableVideoController::OnEncodeDone signature

to make it a bit simpler

Bug: None
Change-Id: Ie6288594c5a1b8535007623032b422eefc716ca6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/188460
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32405}
diff --git a/modules/video_coding/codecs/av1/scalability_structure_full_svc.cc b/modules/video_coding/codecs/av1/scalability_structure_full_svc.cc
index a638b48..302e3b0 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_full_svc.cc
+++ b/modules/video_coding/codecs/av1/scalability_structure_full_svc.cc
@@ -244,28 +244,28 @@
   return configs;
 }
 
-absl::optional<GenericFrameInfo> ScalabilityStructureFullSvc::OnEncodeDone(
-    LayerFrameConfig config) {
-  absl::optional<GenericFrameInfo> frame_info(absl::in_place);
-  frame_info->spatial_id = config.SpatialId();
-  frame_info->temporal_id = config.TemporalId();
-  frame_info->encoder_buffers = config.Buffers();
-  frame_info->decode_target_indications.reserve(num_spatial_layers_ *
-                                                num_temporal_layers_);
+GenericFrameInfo ScalabilityStructureFullSvc::OnEncodeDone(
+    const LayerFrameConfig& config) {
+  GenericFrameInfo frame_info;
+  frame_info.spatial_id = config.SpatialId();
+  frame_info.temporal_id = config.TemporalId();
+  frame_info.encoder_buffers = config.Buffers();
+  frame_info.decode_target_indications.reserve(num_spatial_layers_ *
+                                               num_temporal_layers_);
   for (int sid = 0; sid < num_spatial_layers_; ++sid) {
     for (int tid = 0; tid < num_temporal_layers_; ++tid) {
-      frame_info->decode_target_indications.push_back(Dti(sid, tid, config));
+      frame_info.decode_target_indications.push_back(Dti(sid, tid, config));
     }
   }
   if (config.TemporalId() == 0) {
-    frame_info->part_of_chain.resize(num_spatial_layers_);
+    frame_info.part_of_chain.resize(num_spatial_layers_);
     for (int sid = 0; sid < num_spatial_layers_; ++sid) {
-      frame_info->part_of_chain[sid] = config.SpatialId() <= sid;
+      frame_info.part_of_chain[sid] = config.SpatialId() <= sid;
     }
   } else {
-    frame_info->part_of_chain.assign(num_spatial_layers_, false);
+    frame_info.part_of_chain.assign(num_spatial_layers_, false);
   }
-  frame_info->active_decode_targets = active_decode_targets_;
+  frame_info.active_decode_targets = active_decode_targets_;
   return frame_info;
 }
 
diff --git a/modules/video_coding/codecs/av1/scalability_structure_full_svc.h b/modules/video_coding/codecs/av1/scalability_structure_full_svc.h
index d2d38ba..9513750 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_full_svc.h
+++ b/modules/video_coding/codecs/av1/scalability_structure_full_svc.h
@@ -13,7 +13,6 @@
 #include <bitset>
 #include <vector>
 
-#include "absl/types/optional.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "modules/video_coding/codecs/av1/scalable_video_controller.h"
@@ -28,8 +27,7 @@
   StreamLayersConfig StreamConfig() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
   void OnRatesUpdated(const VideoBitrateAllocation& bitrates) override;
 
  private:
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.cc b/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.cc
index ab76f1f..270608a 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.cc
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.cc
@@ -78,28 +78,23 @@
   return result;
 }
 
-absl::optional<GenericFrameInfo> ScalabilityStructureL2T1Key::OnEncodeDone(
-    LayerFrameConfig config) {
-  absl::optional<GenericFrameInfo> frame_info;
-  if (config.IsKeyframe()) {
-    config = KeyFrameConfig();
-  }
+GenericFrameInfo ScalabilityStructureL2T1Key::OnEncodeDone(
+    const LayerFrameConfig& config) {
+  RTC_CHECK_GE(config.Id(), 0);
+  RTC_CHECK_LT(config.Id(), ABSL_ARRAYSIZE(kDtis));
 
-  if (config.Id() < 0 || config.Id() >= int{ABSL_ARRAYSIZE(kDtis)}) {
-    RTC_LOG(LS_ERROR) << "Unexpected config id " << config.Id();
-    return frame_info;
-  }
-  frame_info.emplace();
-  frame_info->spatial_id = config.SpatialId();
-  frame_info->temporal_id = config.TemporalId();
-  frame_info->encoder_buffers = std::move(config.Buffers());
-  frame_info->decode_target_indications.assign(std::begin(kDtis[config.Id()]),
-                                               std::end(kDtis[config.Id()]));
+  GenericFrameInfo frame_info;
+  frame_info.spatial_id = config.SpatialId();
+  frame_info.temporal_id = config.TemporalId();
+  frame_info.encoder_buffers = config.Buffers();
+  int config_id = config.IsKeyframe() ? 0 : config.Id();
+  frame_info.decode_target_indications.assign(std::begin(kDtis[config_id]),
+                                              std::end(kDtis[config_id]));
   if (config.IsKeyframe()) {
-    frame_info->part_of_chain = {true, true};
+    frame_info.part_of_chain = {true, true};
   } else {
-    frame_info->part_of_chain = {config.SpatialId() == 0,
-                                 config.SpatialId() == 1};
+    frame_info.part_of_chain = {config.SpatialId() == 0,
+                                config.SpatialId() == 1};
   }
   return frame_info;
 }
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.h b/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.h
index c1d8c89..edddf2e 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.h
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t1_key.h
@@ -29,8 +29,7 @@
   FrameDependencyStructure DependencyStructure() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
 
  private:
   LayerFrameConfig KeyFrameConfig() const;
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.cc b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.cc
index a59ef1a..1a459dd 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.cc
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.cc
@@ -99,30 +99,25 @@
   return result;
 }
 
-absl::optional<GenericFrameInfo> ScalabilityStructureL2T2Key::OnEncodeDone(
-    LayerFrameConfig config) {
-  if (config.IsKeyframe()) {
-    config = KeyFrameConfig();
-  }
+GenericFrameInfo ScalabilityStructureL2T2Key::OnEncodeDone(
+    const LayerFrameConfig& config) {
+  RTC_CHECK_GE(config.Id(), 0);
+  RTC_CHECK_LT(config.Id(), ABSL_ARRAYSIZE(kDtis));
 
-  absl::optional<GenericFrameInfo> frame_info;
-  if (config.Id() < 0 || config.Id() >= int{ABSL_ARRAYSIZE(kDtis)}) {
-    RTC_LOG(LS_ERROR) << "Unexpected config id " << config.Id();
-    return frame_info;
-  }
-  frame_info.emplace();
-  frame_info->spatial_id = config.SpatialId();
-  frame_info->temporal_id = config.TemporalId();
-  frame_info->encoder_buffers = config.Buffers();
-  frame_info->decode_target_indications.assign(std::begin(kDtis[config.Id()]),
-                                               std::end(kDtis[config.Id()]));
+  GenericFrameInfo frame_info;
+  frame_info.spatial_id = config.SpatialId();
+  frame_info.temporal_id = config.TemporalId();
+  frame_info.encoder_buffers = config.Buffers();
+  int config_id = config.IsKeyframe() ? 0 : config.Id();
+  frame_info.decode_target_indications.assign(std::begin(kDtis[config_id]),
+                                              std::end(kDtis[config_id]));
   if (config.IsKeyframe()) {
-    frame_info->part_of_chain = {true, true};
+    frame_info.part_of_chain = {true, true};
   } else if (config.TemporalId() == 0) {
-    frame_info->part_of_chain = {config.SpatialId() == 0,
-                                 config.SpatialId() == 1};
+    frame_info.part_of_chain = {config.SpatialId() == 0,
+                                config.SpatialId() == 1};
   } else {
-    frame_info->part_of_chain = {false, false};
+    frame_info.part_of_chain = {false, false};
   }
   return frame_info;
 }
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.h b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.h
index 9adfcbc..24da4a9 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.h
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key.h
@@ -34,8 +34,7 @@
   FrameDependencyStructure DependencyStructure() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
 
  private:
   enum FramePattern {
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.cc b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.cc
index d205b4a..c0fd4ff 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.cc
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.cc
@@ -99,30 +99,25 @@
   return result;
 }
 
-absl::optional<GenericFrameInfo> ScalabilityStructureL2T2KeyShift::OnEncodeDone(
-    LayerFrameConfig config) {
-  if (config.IsKeyframe()) {
-    config = KeyFrameConfig();
-  }
+GenericFrameInfo ScalabilityStructureL2T2KeyShift::OnEncodeDone(
+    const LayerFrameConfig& config) {
+  RTC_CHECK_GE(config.Id(), 0);
+  RTC_CHECK_LT(config.Id(), ABSL_ARRAYSIZE(kDtis));
 
-  absl::optional<GenericFrameInfo> frame_info;
-  if (config.Id() < 0 || config.Id() >= int{ABSL_ARRAYSIZE(kDtis)}) {
-    RTC_LOG(LS_ERROR) << "Unexpected config id " << config.Id();
-    return frame_info;
-  }
-  frame_info.emplace();
-  frame_info->spatial_id = config.SpatialId();
-  frame_info->temporal_id = config.TemporalId();
-  frame_info->encoder_buffers = config.Buffers();
-  frame_info->decode_target_indications.assign(std::begin(kDtis[config.Id()]),
-                                               std::end(kDtis[config.Id()]));
+  GenericFrameInfo frame_info;
+  frame_info.spatial_id = config.SpatialId();
+  frame_info.temporal_id = config.TemporalId();
+  frame_info.encoder_buffers = config.Buffers();
+  int config_id = config.IsKeyframe() ? 0 : config.Id();
+  frame_info.decode_target_indications.assign(std::begin(kDtis[config_id]),
+                                              std::end(kDtis[config_id]));
   if (config.IsKeyframe()) {
-    frame_info->part_of_chain = {true, true};
+    frame_info.part_of_chain = {true, true};
   } else if (config.TemporalId() == 0) {
-    frame_info->part_of_chain = {config.SpatialId() == 0,
-                                 config.SpatialId() == 1};
+    frame_info.part_of_chain = {config.SpatialId() == 0,
+                                config.SpatialId() == 1};
   } else {
-    frame_info->part_of_chain = {false, false};
+    frame_info.part_of_chain = {false, false};
   }
   return frame_info;
 }
diff --git a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.h b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.h
index 1b18bd7..f36d2f8 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.h
+++ b/modules/video_coding/codecs/av1/scalability_structure_l2t2_key_shift.h
@@ -34,8 +34,7 @@
   FrameDependencyStructure DependencyStructure() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
 
  private:
   enum FramePattern {
diff --git a/modules/video_coding/codecs/av1/scalability_structure_s2t1.cc b/modules/video_coding/codecs/av1/scalability_structure_s2t1.cc
index 182891f..0cf6ee5 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_s2t1.cc
+++ b/modules/video_coding/codecs/av1/scalability_structure_s2t1.cc
@@ -70,23 +70,21 @@
   return result;
 }
 
-absl::optional<GenericFrameInfo> ScalabilityStructureS2T1::OnEncodeDone(
-    LayerFrameConfig config) {
-  absl::optional<GenericFrameInfo> frame_info;
+GenericFrameInfo ScalabilityStructureS2T1::OnEncodeDone(
+    const LayerFrameConfig& config) {
+  GenericFrameInfo frame_info;
   if (config.SpatialId() < 0 ||
       config.SpatialId() >= int{ABSL_ARRAYSIZE(kDtis)}) {
     RTC_LOG(LS_ERROR) << "Unexpected spatial id " << config.SpatialId();
     return frame_info;
   }
-  frame_info.emplace();
-  frame_info->spatial_id = config.SpatialId();
-  frame_info->temporal_id = config.TemporalId();
-  frame_info->encoder_buffers = std::move(config.Buffers());
-  frame_info->decode_target_indications.assign(
+  frame_info.spatial_id = config.SpatialId();
+  frame_info.temporal_id = config.TemporalId();
+  frame_info.encoder_buffers = std::move(config.Buffers());
+  frame_info.decode_target_indications.assign(
       std::begin(kDtis[config.SpatialId()]),
       std::end(kDtis[config.SpatialId()]));
-  frame_info->part_of_chain = {config.SpatialId() == 0,
-                               config.SpatialId() == 1};
+  frame_info.part_of_chain = {config.SpatialId() == 0, config.SpatialId() == 1};
   return frame_info;
 }
 
diff --git a/modules/video_coding/codecs/av1/scalability_structure_s2t1.h b/modules/video_coding/codecs/av1/scalability_structure_s2t1.h
index 06a9977..a93a6a9 100644
--- a/modules/video_coding/codecs/av1/scalability_structure_s2t1.h
+++ b/modules/video_coding/codecs/av1/scalability_structure_s2t1.h
@@ -29,8 +29,7 @@
   FrameDependencyStructure DependencyStructure() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
 
  private:
   bool keyframe_ = true;
diff --git a/modules/video_coding/codecs/av1/scalable_video_controller.h b/modules/video_coding/codecs/av1/scalable_video_controller.h
index 0167820..b976ca1 100644
--- a/modules/video_coding/codecs/av1/scalable_video_controller.h
+++ b/modules/video_coding/codecs/av1/scalable_video_controller.h
@@ -13,7 +13,6 @@
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
-#include "absl/types/optional.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
@@ -95,8 +94,7 @@
   virtual std::vector<LayerFrameConfig> NextFrameConfig(bool restart) = 0;
 
   // Returns configuration to pass to EncoderCallback.
-  virtual absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) = 0;
+  virtual GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) = 0;
 };
 
 // Below are implementation details.
diff --git a/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.cc b/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.cc
index 0d211fb..0b2280f 100644
--- a/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.cc
+++ b/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.cc
@@ -50,17 +50,17 @@
   return result;
 }
 
-absl::optional<GenericFrameInfo>
-ScalableVideoControllerNoLayering::OnEncodeDone(LayerFrameConfig config) {
+GenericFrameInfo ScalableVideoControllerNoLayering::OnEncodeDone(
+    const LayerFrameConfig& config) {
   RTC_DCHECK_EQ(config.Id(), 0);
-  absl::optional<GenericFrameInfo> frame_info(absl::in_place);
-  frame_info->encoder_buffers = config.Buffers();
+  GenericFrameInfo frame_info;
+  frame_info.encoder_buffers = config.Buffers();
   if (config.IsKeyframe()) {
-    for (auto& buffer : frame_info->encoder_buffers) {
+    for (auto& buffer : frame_info.encoder_buffers) {
       buffer.referenced = false;
     }
   }
-  frame_info->decode_target_indications = {DecodeTargetIndication::kSwitch};
+  frame_info.decode_target_indications = {DecodeTargetIndication::kSwitch};
   return frame_info;
 }
 
diff --git a/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.h b/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.h
index ad73098..7423667 100644
--- a/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.h
+++ b/modules/video_coding/codecs/av1/scalable_video_controller_no_layering.h
@@ -26,8 +26,7 @@
   FrameDependencyStructure DependencyStructure() const override;
 
   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
-  absl::optional<GenericFrameInfo> OnEncodeDone(
-      LayerFrameConfig config) override;
+  GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
 
  private:
   bool start_ = true;