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 a638b48a9f..302e3b02e5 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 @@ ScalabilityStructureFullSvc::NextFrameConfig(bool restart) { return configs; } -absl::optional ScalabilityStructureFullSvc::OnEncodeDone( - LayerFrameConfig config) { - absl::optional 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 d2d38ba058..9513750b95 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 #include -#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 @@ class ScalabilityStructureFullSvc : public ScalableVideoController { StreamLayersConfig StreamConfig() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional 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 ab76f1f7ef..270608a340 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 @@ ScalabilityStructureL2T1Key::NextFrameConfig(bool restart) { return result; } -absl::optional ScalabilityStructureL2T1Key::OnEncodeDone( - LayerFrameConfig config) { - absl::optional 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 c1d8c8947f..edddf2ef77 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 @@ class ScalabilityStructureL2T1Key : public ScalableVideoController { FrameDependencyStructure DependencyStructure() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional 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 a59ef1a97d..1a459ddec1 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 @@ ScalabilityStructureL2T2Key::NextFrameConfig(bool restart) { return result; } -absl::optional 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 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 9adfcbcd58..24da4a965a 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 @@ class ScalabilityStructureL2T2Key : public ScalableVideoController { FrameDependencyStructure DependencyStructure() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional 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 d205b4a1c6..c0fd4ffa2c 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 @@ ScalabilityStructureL2T2KeyShift::NextFrameConfig(bool restart) { return result; } -absl::optional 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 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 1b18bd7c17..f36d2f8bc4 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 @@ class ScalabilityStructureL2T2KeyShift : public ScalableVideoController { FrameDependencyStructure DependencyStructure() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional 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 182891fa50..0cf6ee54dd 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 @@ ScalabilityStructureS2T1::NextFrameConfig(bool restart) { return result; } -absl::optional ScalabilityStructureS2T1::OnEncodeDone( - LayerFrameConfig config) { - absl::optional 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 06a99775c4..a93a6a95fd 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 @@ class ScalabilityStructureS2T1 : public ScalableVideoController { FrameDependencyStructure DependencyStructure() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional 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 0167820798..b976ca1c55 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 #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 @@ class ScalableVideoController { virtual std::vector NextFrameConfig(bool restart) = 0; // Returns configuration to pass to EncoderCallback. - virtual absl::optional 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 0d211fb911..0b2280fa6e 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 @@ ScalableVideoControllerNoLayering::NextFrameConfig(bool restart) { return result; } -absl::optional -ScalableVideoControllerNoLayering::OnEncodeDone(LayerFrameConfig config) { +GenericFrameInfo ScalableVideoControllerNoLayering::OnEncodeDone( + const LayerFrameConfig& config) { RTC_DCHECK_EQ(config.Id(), 0); - absl::optional 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 ad730989af..7423667f5d 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 @@ class ScalableVideoControllerNoLayering : public ScalableVideoController { FrameDependencyStructure DependencyStructure() const override; std::vector NextFrameConfig(bool restart) override; - absl::optional OnEncodeDone( - LayerFrameConfig config) override; + GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override; private: bool start_ = true;