diff --git a/modules/video_coding/svc/BUILD.gn b/modules/video_coding/svc/BUILD.gn index b8ce91d99a..89a8dda365 100644 --- a/modules/video_coding/svc/BUILD.gn +++ b/modules/video_coding/svc/BUILD.gn @@ -19,6 +19,7 @@ rtc_source_set("scalability_mode_util") { "../../../rtc_base:checks", ] absl_deps = [ + "//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/types:optional", ] diff --git a/modules/video_coding/svc/scalability_mode_util.cc b/modules/video_coding/svc/scalability_mode_util.cc index c6b3b471d8..580500f5b4 100644 --- a/modules/video_coding/svc/scalability_mode_util.cc +++ b/modules/video_coding/svc/scalability_mode_util.cc @@ -11,8 +11,10 @@ #include "modules/video_coding/svc/scalability_mode_util.h" #include -#include +#include +#include +#include "absl/algorithm/container.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/video_codecs/scalability_mode.h" @@ -22,46 +24,292 @@ namespace webrtc { namespace { + struct ScalabilityModeParameters { - int num_spatial_layers; - int num_temporal_layers; - InterLayerPredMode inter_layer_pred; - absl::optional ratio; - bool shift; - - constexpr bool operator==(const ScalabilityModeParameters& other) const { - // For all L1Tx modes, ignore inter_layer_pred, ratio and shift. - if (this->num_spatial_layers == 1) { - return this->num_spatial_layers == other.num_spatial_layers && - this->num_temporal_layers == other.num_temporal_layers; - } - return this->num_spatial_layers == other.num_spatial_layers && - this->num_temporal_layers == other.num_temporal_layers && - this->inter_layer_pred == other.inter_layer_pred && - this->ratio == other.ratio && this->shift == other.shift; - } -}; - -struct ScalabilityModeConfiguration { - explicit ScalabilityModeConfiguration(ScalabilityMode scalability_mode) - : scalability_mode(scalability_mode), - params{ - .num_spatial_layers = - (ScalabilityModeToNumSpatialLayers(scalability_mode)), - .num_temporal_layers = - (ScalabilityModeToNumTemporalLayers(scalability_mode)), - .inter_layer_pred = - (ScalabilityModeToInterLayerPredMode(scalability_mode)), - .ratio = (ScalabilityModeToResolutionRatio(scalability_mode)), - .shift = (ScalabilityModeIsShiftMode(scalability_mode)), - } {} - const ScalabilityMode scalability_mode; - const ScalabilityModeParameters params; + const absl::string_view name; + const int num_spatial_layers; + const int num_temporal_layers; + const InterLayerPredMode inter_layer_pred; + const absl::optional ratio = + ScalabilityModeResolutionRatio::kTwoToOne; + const bool shift = false; }; constexpr size_t kNumScalabilityModes = static_cast(ScalabilityMode::kS3T3h) + 1; + +constexpr ScalabilityModeParameters kScalabilityModeParams[] = { + ScalabilityModeParameters{.scalability_mode = ScalabilityMode::kL1T1, + .name = "L1T1", + .num_spatial_layers = 1, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = absl::nullopt}, + ScalabilityModeParameters{.scalability_mode = ScalabilityMode::kL1T2, + .name = "L1T2", + .num_spatial_layers = 1, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = absl::nullopt}, + ScalabilityModeParameters{.scalability_mode = ScalabilityMode::kL1T3, + .name = "L1T3", + .num_spatial_layers = 1, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = absl::nullopt}, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T1, + .name = "L2T1", + .num_spatial_layers = 2, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T1h, + .name = "L2T1h", + .num_spatial_layers = 2, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T1_KEY, + .name = "L2T1_KEY", + .num_spatial_layers = 2, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T2, + .name = "L2T2", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T2h, + .name = "L2T2h", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T2_KEY, + .name = "L2T2_KEY", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T2_KEY_SHIFT, + .name = "L2T2_KEY_SHIFT", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + .shift = true}, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T3, + .name = "L2T3", + .num_spatial_layers = 2, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T3h, + .name = "L2T3h", + .num_spatial_layers = 2, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL2T3_KEY, + .name = "L2T3_KEY", + .num_spatial_layers = 2, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T1, + .name = "L3T1", + .num_spatial_layers = 3, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T1h, + .name = "L3T1h", + .num_spatial_layers = 3, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T1_KEY, + .name = "L3T1_KEY", + .num_spatial_layers = 3, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T2, + .name = "L3T2", + .num_spatial_layers = 3, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T2h, + .name = "L3T2h", + .num_spatial_layers = 3, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T2_KEY, + .name = "L3T2_KEY", + .num_spatial_layers = 3, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T3, + .name = "L3T3", + .num_spatial_layers = 3, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOn, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T3h, + .name = "L3T3h", + .num_spatial_layers = 3, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOn, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kL3T3_KEY, + .name = "L3T3_KEY", + .num_spatial_layers = 3, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOnKeyPic, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T1, + .name = "S2T1", + .num_spatial_layers = 2, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T1h, + .name = "S2T1h", + .num_spatial_layers = 2, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T2, + .name = "S2T2", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T2h, + .name = "S2T2h", + .num_spatial_layers = 2, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T3, + .name = "S2T3", + .num_spatial_layers = 2, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS2T3h, + .name = "S2T3h", + .num_spatial_layers = 2, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T1, + .name = "S3T1", + .num_spatial_layers = 3, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T1h, + .name = "S3T1h", + .num_spatial_layers = 3, + .num_temporal_layers = 1, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T2, + .name = "S3T2", + .num_spatial_layers = 3, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T2h, + .name = "S3T2h", + .num_spatial_layers = 3, + .num_temporal_layers = 2, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T3, + .name = "S3T3", + .num_spatial_layers = 3, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOff, + }, + ScalabilityModeParameters{ + .scalability_mode = ScalabilityMode::kS3T3h, + .name = "S3T3h", + .num_spatial_layers = 3, + .num_temporal_layers = 3, + .inter_layer_pred = InterLayerPredMode::kOff, + .ratio = ScalabilityModeResolutionRatio::kThreeToTwo, + }, +}; + +// This could be replaced with std::all_of in c++20. +constexpr bool CheckScalabilityModeParams() { + static_assert(std::size(kScalabilityModeParams) == kNumScalabilityModes); + for (size_t s = 0; s < kNumScalabilityModes; ++s) { + if (kScalabilityModeParams[s].scalability_mode != + static_cast(s)) { + return false; + } + } + return true; +} + +static_assert(CheckScalabilityModeParams(), + "There is a scalability mode mismatch in the array!"); + +constexpr auto Idx(ScalabilityMode s) { + const auto index = static_cast>(s); + RTC_CHECK_LT(index, kNumScalabilityModes); + return index; +} + } // namespace absl::optional MakeScalabilityMode( @@ -70,50 +318,14 @@ absl::optional MakeScalabilityMode( InterLayerPredMode inter_layer_pred, absl::optional ratio, bool shift) { - ScalabilityModeParameters params{num_spatial_layers, num_temporal_layers, - inter_layer_pred, std::move(ratio), shift}; - - static const ScalabilityModeConfiguration kScalabilityModeConfigs[] = { - ScalabilityModeConfiguration{ScalabilityMode::kL1T1}, - ScalabilityModeConfiguration{ScalabilityMode::kL1T2}, - ScalabilityModeConfiguration{ScalabilityMode::kL1T3}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T1}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T1h}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T1_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T2}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T2h}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T2_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T2_KEY_SHIFT}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T3}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T3h}, - ScalabilityModeConfiguration{ScalabilityMode::kL2T3_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T1}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T1h}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T1_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T2}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T2h}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T2_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T3}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T3h}, - ScalabilityModeConfiguration{ScalabilityMode::kL3T3_KEY}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T1}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T1h}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T2}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T2h}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T3}, - ScalabilityModeConfiguration{ScalabilityMode::kS2T3h}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T1}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T1h}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T2}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T2h}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T3}, - ScalabilityModeConfiguration{ScalabilityMode::kS3T3h}, - }; - static_assert(std::size(kScalabilityModeConfigs) == kNumScalabilityModes); - - for (const auto& candidate_mode : kScalabilityModeConfigs) { - if (candidate_mode.params == params) { - return candidate_mode.scalability_mode; + for (const auto& candidate_mode : kScalabilityModeParams) { + if (candidate_mode.num_spatial_layers == num_spatial_layers && + candidate_mode.num_temporal_layers == num_temporal_layers) { + if (num_spatial_layers == 1 || + (candidate_mode.inter_layer_pred == inter_layer_pred && + candidate_mode.ratio == ratio && candidate_mode.shift == shift)) { + return candidate_mode.scalability_mode; + } } } return absl::nullopt; @@ -121,277 +333,33 @@ absl::optional MakeScalabilityMode( absl::optional ScalabilityModeFromString( absl::string_view mode_string) { - if (mode_string == "L1T1") - return ScalabilityMode::kL1T1; - if (mode_string == "L1T2") - return ScalabilityMode::kL1T2; - if (mode_string == "L1T3") - return ScalabilityMode::kL1T3; - - if (mode_string == "L2T1") - return ScalabilityMode::kL2T1; - if (mode_string == "L2T1h") - return ScalabilityMode::kL2T1h; - if (mode_string == "L2T1_KEY") - return ScalabilityMode::kL2T1_KEY; - - if (mode_string == "L2T2") - return ScalabilityMode::kL2T2; - if (mode_string == "L2T2h") - return ScalabilityMode::kL2T2h; - if (mode_string == "L2T2_KEY") - return ScalabilityMode::kL2T2_KEY; - if (mode_string == "L2T2_KEY_SHIFT") - return ScalabilityMode::kL2T2_KEY_SHIFT; - if (mode_string == "L2T3") - return ScalabilityMode::kL2T3; - if (mode_string == "L2T3h") - return ScalabilityMode::kL2T3h; - if (mode_string == "L2T3_KEY") - return ScalabilityMode::kL2T3_KEY; - - if (mode_string == "L3T1") - return ScalabilityMode::kL3T1; - if (mode_string == "L3T1h") - return ScalabilityMode::kL3T1h; - if (mode_string == "L3T1_KEY") - return ScalabilityMode::kL3T1_KEY; - - if (mode_string == "L3T2") - return ScalabilityMode::kL3T2; - if (mode_string == "L3T2h") - return ScalabilityMode::kL3T2h; - if (mode_string == "L3T2_KEY") - return ScalabilityMode::kL3T2_KEY; - - if (mode_string == "L3T3") - return ScalabilityMode::kL3T3; - if (mode_string == "L3T3h") - return ScalabilityMode::kL3T3h; - if (mode_string == "L3T3_KEY") - return ScalabilityMode::kL3T3_KEY; - - if (mode_string == "S2T1") - return ScalabilityMode::kS2T1; - if (mode_string == "S2T1h") - return ScalabilityMode::kS2T1h; - if (mode_string == "S2T2") - return ScalabilityMode::kS2T2; - if (mode_string == "S2T2h") - return ScalabilityMode::kS2T2h; - if (mode_string == "S2T3") - return ScalabilityMode::kS2T3; - if (mode_string == "S2T3h") - return ScalabilityMode::kS2T3h; - if (mode_string == "S3T1") - return ScalabilityMode::kS3T1; - if (mode_string == "S3T1h") - return ScalabilityMode::kS3T1h; - if (mode_string == "S3T2") - return ScalabilityMode::kS3T2; - if (mode_string == "S3T2h") - return ScalabilityMode::kS3T2h; - if (mode_string == "S3T3") - return ScalabilityMode::kS3T3; - if (mode_string == "S3T3h") - return ScalabilityMode::kS3T3h; - + const auto it = + absl::c_find_if(kScalabilityModeParams, + [&](const ScalabilityModeParameters& candidate_mode) { + return candidate_mode.name == mode_string; + }); + if (it != std::end(kScalabilityModeParams)) { + return it->scalability_mode; + } return absl::nullopt; } InterLayerPredMode ScalabilityModeToInterLayerPredMode( ScalabilityMode scalability_mode) { - switch (scalability_mode) { - case ScalabilityMode::kL1T1: - case ScalabilityMode::kL1T2: - case ScalabilityMode::kL1T3: - case ScalabilityMode::kL2T1: - case ScalabilityMode::kL2T1h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL2T1_KEY: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kL2T2: - case ScalabilityMode::kL2T2h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL2T2_KEY: - case ScalabilityMode::kL2T2_KEY_SHIFT: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kL2T3: - case ScalabilityMode::kL2T3h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL2T3_KEY: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kL3T1: - case ScalabilityMode::kL3T1h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL3T1_KEY: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kL3T2: - case ScalabilityMode::kL3T2h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL3T2_KEY: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kL3T3: - case ScalabilityMode::kL3T3h: - return InterLayerPredMode::kOn; - case ScalabilityMode::kL3T3_KEY: - return InterLayerPredMode::kOnKeyPic; - case ScalabilityMode::kS2T1: - case ScalabilityMode::kS2T1h: - case ScalabilityMode::kS2T2: - case ScalabilityMode::kS2T2h: - case ScalabilityMode::kS2T3: - case ScalabilityMode::kS2T3h: - case ScalabilityMode::kS3T1: - case ScalabilityMode::kS3T1h: - case ScalabilityMode::kS3T2: - case ScalabilityMode::kS3T2h: - case ScalabilityMode::kS3T3: - case ScalabilityMode::kS3T3h: - return InterLayerPredMode::kOff; - } - RTC_CHECK_NOTREACHED(); + return kScalabilityModeParams[Idx(scalability_mode)].inter_layer_pred; } int ScalabilityModeToNumSpatialLayers(ScalabilityMode scalability_mode) { - switch (scalability_mode) { - case ScalabilityMode::kL1T1: - case ScalabilityMode::kL1T2: - case ScalabilityMode::kL1T3: - return 1; - case ScalabilityMode::kL2T1: - case ScalabilityMode::kL2T1h: - case ScalabilityMode::kL2T1_KEY: - case ScalabilityMode::kL2T2: - case ScalabilityMode::kL2T2h: - case ScalabilityMode::kL2T2_KEY: - case ScalabilityMode::kL2T2_KEY_SHIFT: - case ScalabilityMode::kL2T3: - case ScalabilityMode::kL2T3h: - case ScalabilityMode::kL2T3_KEY: - return 2; - case ScalabilityMode::kL3T1: - case ScalabilityMode::kL3T1h: - case ScalabilityMode::kL3T1_KEY: - case ScalabilityMode::kL3T2: - case ScalabilityMode::kL3T2h: - case ScalabilityMode::kL3T2_KEY: - case ScalabilityMode::kL3T3: - case ScalabilityMode::kL3T3h: - case ScalabilityMode::kL3T3_KEY: - return 3; - case ScalabilityMode::kS2T1: - case ScalabilityMode::kS2T1h: - case ScalabilityMode::kS2T2: - case ScalabilityMode::kS2T2h: - case ScalabilityMode::kS2T3: - case ScalabilityMode::kS2T3h: - return 2; - case ScalabilityMode::kS3T1: - case ScalabilityMode::kS3T1h: - case ScalabilityMode::kS3T2: - case ScalabilityMode::kS3T2h: - case ScalabilityMode::kS3T3: - case ScalabilityMode::kS3T3h: - return 3; - } - RTC_CHECK_NOTREACHED(); + return kScalabilityModeParams[Idx(scalability_mode)].num_spatial_layers; } int ScalabilityModeToNumTemporalLayers(ScalabilityMode scalability_mode) { - switch (scalability_mode) { - case ScalabilityMode::kL1T1: - return 1; - case ScalabilityMode::kL1T2: - return 2; - case ScalabilityMode::kL1T3: - return 3; - case ScalabilityMode::kL2T1: - case ScalabilityMode::kL2T1h: - case ScalabilityMode::kL2T1_KEY: - return 1; - case ScalabilityMode::kL2T2: - case ScalabilityMode::kL2T2h: - case ScalabilityMode::kL2T2_KEY: - case ScalabilityMode::kL2T2_KEY_SHIFT: - return 2; - case ScalabilityMode::kL2T3: - case ScalabilityMode::kL2T3h: - case ScalabilityMode::kL2T3_KEY: - return 3; - case ScalabilityMode::kL3T1: - case ScalabilityMode::kL3T1h: - case ScalabilityMode::kL3T1_KEY: - return 1; - case ScalabilityMode::kL3T2: - case ScalabilityMode::kL3T2h: - case ScalabilityMode::kL3T2_KEY: - return 2; - case ScalabilityMode::kL3T3: - case ScalabilityMode::kL3T3h: - case ScalabilityMode::kL3T3_KEY: - return 3; - case ScalabilityMode::kS2T1: - case ScalabilityMode::kS2T1h: - case ScalabilityMode::kS3T1: - case ScalabilityMode::kS3T1h: - return 1; - case ScalabilityMode::kS2T2: - case ScalabilityMode::kS2T2h: - case ScalabilityMode::kS3T2: - case ScalabilityMode::kS3T2h: - return 2; - case ScalabilityMode::kS2T3: - case ScalabilityMode::kS2T3h: - case ScalabilityMode::kS3T3: - case ScalabilityMode::kS3T3h: - return 3; - } - RTC_CHECK_NOTREACHED(); + return kScalabilityModeParams[Idx(scalability_mode)].num_temporal_layers; } absl::optional ScalabilityModeToResolutionRatio( ScalabilityMode scalability_mode) { - switch (scalability_mode) { - case ScalabilityMode::kL1T1: - case ScalabilityMode::kL1T2: - case ScalabilityMode::kL1T3: - return absl::nullopt; - case ScalabilityMode::kL2T1: - case ScalabilityMode::kL2T1_KEY: - case ScalabilityMode::kL2T2: - case ScalabilityMode::kL2T2_KEY: - case ScalabilityMode::kL2T2_KEY_SHIFT: - case ScalabilityMode::kL2T3: - case ScalabilityMode::kL2T3_KEY: - case ScalabilityMode::kL3T1: - case ScalabilityMode::kL3T1_KEY: - case ScalabilityMode::kL3T2: - case ScalabilityMode::kL3T2_KEY: - case ScalabilityMode::kL3T3: - case ScalabilityMode::kL3T3_KEY: - case ScalabilityMode::kS2T1: - case ScalabilityMode::kS2T2: - case ScalabilityMode::kS2T3: - case ScalabilityMode::kS3T1: - case ScalabilityMode::kS3T2: - case ScalabilityMode::kS3T3: - return ScalabilityModeResolutionRatio::kTwoToOne; - case ScalabilityMode::kL2T1h: - case ScalabilityMode::kL2T2h: - case ScalabilityMode::kL2T3h: - case ScalabilityMode::kL3T1h: - case ScalabilityMode::kL3T2h: - case ScalabilityMode::kL3T3h: - case ScalabilityMode::kS2T1h: - case ScalabilityMode::kS2T2h: - case ScalabilityMode::kS2T3h: - case ScalabilityMode::kS3T1h: - case ScalabilityMode::kS3T2h: - case ScalabilityMode::kS3T3h: - return ScalabilityModeResolutionRatio::kThreeToTwo; - } - RTC_CHECK_NOTREACHED(); + return kScalabilityModeParams[Idx(scalability_mode)].ratio; } ScalabilityMode LimitNumSpatialLayers(ScalabilityMode scalability_mode, @@ -490,7 +458,7 @@ ScalabilityMode LimitNumSpatialLayers(ScalabilityMode scalability_mode, } bool ScalabilityModeIsShiftMode(ScalabilityMode scalability_mode) { - return scalability_mode == ScalabilityMode::kL2T2_KEY_SHIFT; + return kScalabilityModeParams[Idx(scalability_mode)].shift; } } // namespace webrtc