diff --git a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc index db20e4c47a..5c5a25cc89 100644 --- a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc +++ b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc @@ -853,11 +853,15 @@ class PreferTemporalLayersFallbackTest : public ::testing::Test { protected: void SetSupportsLayers(VideoEncoder::EncoderInfo* info, bool tl_enabled) { - info->fps_allocation[0].clear(); int num_layers = 1; if (tl_enabled) { num_layers = codec_settings.VP8()->numberOfTemporalLayers; } + SetNumLayers(info, num_layers); + } + + void SetNumLayers(VideoEncoder::EncoderInfo* info, int num_layers) { + info->fps_allocation[0].clear(); for (int i = 0; i < num_layers; ++i) { info->fps_allocation[0].push_back( VideoEncoder::EncoderInfo::kMaxFramerateFraction >> @@ -910,6 +914,15 @@ TEST_F(PreferTemporalLayersFallbackTest, UsesMainWhenNeitherSupportsTemporal) { EXPECT_EQ(wrapper_->GetEncoderInfo().implementation_name, "hw"); } +TEST_F(PreferTemporalLayersFallbackTest, UsesFallbackWhenLayersAreUndefined) { + codec_settings.VP8()->numberOfTemporalLayers = 2; + SetNumLayers(&hw_info_, 1); + SetNumLayers(&sw_info_, 0); + EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, + wrapper_->InitEncode(&codec_settings, kSettings)); + EXPECT_EQ(wrapper_->GetEncoderInfo().implementation_name, "sw"); +} + TEST_F(PreferTemporalLayersFallbackTest, PrimesEncoderOnSwitch) { codec_settings.VP8()->numberOfTemporalLayers = 2; // Both support temporal layers, will use main one. diff --git a/api/video_codecs/video_encoder_software_fallback_wrapper.cc b/api/video_codecs/video_encoder_software_fallback_wrapper.cc index 95a41d0e30..94a18171a1 100644 --- a/api/video_codecs/video_encoder_software_fallback_wrapper.cc +++ b/api/video_codecs/video_encoder_software_fallback_wrapper.cc @@ -56,7 +56,7 @@ struct ForcedFallbackParams { bool SupportsTemporalBasedSwitch(const VideoCodec& codec) const { return enable_temporal_based_switch && - SimulcastUtility::NumberOfTemporalLayers(codec, 0) > 1; + SimulcastUtility::NumberOfTemporalLayers(codec, 0) != 1; } bool enable_temporal_based_switch = false; @@ -462,7 +462,7 @@ bool VideoEncoderSoftwareFallbackWrapper::TryInitForcedFallbackEncoder() { } if (encoder_state_ == EncoderState::kMainEncoderUsed && - encoder_->GetEncoderInfo().fps_allocation[0].size() > 1) { + encoder_->GetEncoderInfo().fps_allocation[0].size() != 1) { // Primary encoder already supports temporal layers, use that instead. return true; } @@ -471,7 +471,7 @@ bool VideoEncoderSoftwareFallbackWrapper::TryInitForcedFallbackEncoder() { if (fallback_encoder_->InitEncode(&codec_settings_, encoder_settings_.value()) == WEBRTC_VIDEO_CODEC_OK) { - if (fallback_encoder_->GetEncoderInfo().fps_allocation[0].size() > 1) { + if (fallback_encoder_->GetEncoderInfo().fps_allocation[0].size() != 1) { // Fallback encoder available and supports temporal layers, use it! if (encoder_state_ == EncoderState::kMainEncoderUsed) { // Main encoder initialized but does not support temporal layers,