diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn index 5bdd514a65..9f7022ca67 100644 --- a/api/video_codecs/BUILD.gn +++ b/api/video_codecs/BUILD.gn @@ -305,6 +305,8 @@ rtc_library("rtc_software_fallback_wrappers") { deps = [ ":video_codecs_api", "..:fec_controller_api", + "../../api:field_trials_view", + "../../api/environment", "../../api/transport:field_trial_based_config", "../../api/video:video_frame", "../../media:rtc_media_base", diff --git a/api/video_codecs/test/BUILD.gn b/api/video_codecs/test/BUILD.gn index d338406bc4..be897ae124 100644 --- a/api/video_codecs/test/BUILD.gn +++ b/api/video_codecs/test/BUILD.gn @@ -39,9 +39,9 @@ if (rtc_include_tests) { "../../../modules/video_coding:webrtc_vp8", "../../../rtc_base:checks", "../../../rtc_base:rtc_base_tests_utils", + "../../../test:explicit_key_value_config", "../../../test:fake_video_codecs", "../../../test:field_trial", - "../../../test:scoped_key_value_config", "../../../test:test_support", "../../../test:video_test_common", "../../environment", diff --git a/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc index de9293bbe0..bd837605b0 100644 --- a/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc +++ b/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc @@ -22,8 +22,8 @@ #include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_error_codes.h" #include "rtc_base/checks.h" +#include "test/explicit_key_value_config.h" #include "test/gtest.h" -#include "test/scoped_key_value_config.h" namespace webrtc { @@ -33,10 +33,11 @@ class VideoDecoderSoftwareFallbackWrapperTest : public ::testing::Test { : VideoDecoderSoftwareFallbackWrapperTest("") {} explicit VideoDecoderSoftwareFallbackWrapperTest( const std::string& field_trials) - : override_field_trials_(field_trials), - env_(CreateEnvironment(&override_field_trials_)), + : field_trials_(field_trials), + env_(CreateEnvironment(&field_trials_)), fake_decoder_(new CountingFakeDecoder()), fallback_wrapper_(CreateVideoDecoderSoftwareFallbackWrapper( + env_, CreateVp8Decoder(env_), std::unique_ptr(fake_decoder_))) {} @@ -74,7 +75,7 @@ class VideoDecoderSoftwareFallbackWrapperTest : public ::testing::Test { int release_count_ = 0; int reset_count_ = 0; }; - test::ScopedKeyValueConfig override_field_trials_; + test::ExplicitKeyValueConfig field_trials_; const Environment env_; // `fake_decoder_` is owned and released by `fallback_wrapper_`. CountingFakeDecoder* fake_decoder_; @@ -279,7 +280,7 @@ class ForcedSoftwareDecoderFallbackTest fake_decoder_ = new CountingFakeDecoder(); sw_fallback_decoder_ = new CountingFakeDecoder(); fallback_wrapper_ = CreateVideoDecoderSoftwareFallbackWrapper( - std::unique_ptr(sw_fallback_decoder_), + env_, std::unique_ptr(sw_fallback_decoder_), std::unique_ptr(fake_decoder_)); } diff --git a/api/video_codecs/video_decoder_software_fallback_wrapper.cc b/api/video_codecs/video_decoder_software_fallback_wrapper.cc index 2af4d39b3a..623888b9e2 100644 --- a/api/video_codecs/video_decoder_software_fallback_wrapper.cc +++ b/api/video_codecs/video_decoder_software_fallback_wrapper.cc @@ -16,6 +16,7 @@ #include #include +#include "api/field_trials_view.h" #include "api/video/encoded_image.h" #include "api/video_codecs/video_decoder.h" #include "modules/video_coding/include/video_error_codes.h" @@ -35,7 +36,8 @@ class VideoDecoderSoftwareFallbackWrapper final : public VideoDecoder { public: VideoDecoderSoftwareFallbackWrapper( std::unique_ptr sw_fallback_decoder, - std::unique_ptr hw_decoder); + std::unique_ptr hw_decoder, + bool force_sw_decoder_fallback); ~VideoDecoderSoftwareFallbackWrapper() override; bool Configure(const Settings& settings) override; @@ -67,6 +69,7 @@ class VideoDecoderSoftwareFallbackWrapper final : public VideoDecoder { } decoder_type_; std::unique_ptr hw_decoder_; + const bool force_sw_decoder_fallback_; Settings decoder_settings_; const std::unique_ptr fallback_decoder_; const std::string fallback_implementation_name_; @@ -77,9 +80,11 @@ class VideoDecoderSoftwareFallbackWrapper final : public VideoDecoder { VideoDecoderSoftwareFallbackWrapper::VideoDecoderSoftwareFallbackWrapper( std::unique_ptr sw_fallback_decoder, - std::unique_ptr hw_decoder) + std::unique_ptr hw_decoder, + bool force_sw_decoder_fallback) : decoder_type_(DecoderType::kNone), hw_decoder_(std::move(hw_decoder)), + force_sw_decoder_fallback_(force_sw_decoder_fallback), fallback_decoder_(std::move(sw_fallback_decoder)), fallback_implementation_name_( fallback_decoder_->GetDecoderInfo().implementation_name + @@ -94,7 +99,7 @@ VideoDecoderSoftwareFallbackWrapper::~VideoDecoderSoftwareFallbackWrapper() = bool VideoDecoderSoftwareFallbackWrapper::Configure(const Settings& settings) { decoder_settings_ = settings; - if (webrtc::field_trial::IsEnabled("WebRTC-Video-ForcedSwDecoderFallback")) { + if (force_sw_decoder_fallback_) { RTC_LOG(LS_INFO) << "Forced software decoder fallback enabled."; RTC_DCHECK(decoder_type_ == DecoderType::kNone); return InitFallbackDecoder(); @@ -276,10 +281,20 @@ VideoDecoder& VideoDecoderSoftwareFallbackWrapper::active_decoder() const { } // namespace std::unique_ptr CreateVideoDecoderSoftwareFallbackWrapper( + const Environment& env, std::unique_ptr sw_fallback_decoder, std::unique_ptr hw_decoder) { return std::make_unique( - std::move(sw_fallback_decoder), std::move(hw_decoder)); + std::move(sw_fallback_decoder), std::move(hw_decoder), + env.field_trials().IsEnabled("WebRTC-Video-ForcedSwDecoderFallback")); +} + +std::unique_ptr CreateVideoDecoderSoftwareFallbackWrapper( + std::unique_ptr sw_fallback_decoder, + std::unique_ptr hw_decoder) { + return std::make_unique( + std::move(sw_fallback_decoder), std::move(hw_decoder), + webrtc::field_trial::IsEnabled("WebRTC-Video-ForcedSwDecoderFallback")); } } // namespace webrtc diff --git a/api/video_codecs/video_decoder_software_fallback_wrapper.h b/api/video_codecs/video_decoder_software_fallback_wrapper.h index 3f44e02b26..4fbc9a0048 100644 --- a/api/video_codecs/video_decoder_software_fallback_wrapper.h +++ b/api/video_codecs/video_decoder_software_fallback_wrapper.h @@ -13,6 +13,7 @@ #include +#include "api/environment/environment.h" #include "api/video_codecs/video_decoder.h" #include "rtc_base/system/rtc_export.h" @@ -22,6 +23,13 @@ namespace webrtc { // software decoding when a hardware decoder fails to decode a stream due to // hardware restrictions, such as max resolution. RTC_EXPORT std::unique_ptr +CreateVideoDecoderSoftwareFallbackWrapper( + const Environment& env, + std::unique_ptr sw_fallback_decoder, + std::unique_ptr hw_decoder); + +// TODO: bugs.webrtc.org/15791 - Deprecated, remove when not used by chromium. +RTC_EXPORT std::unique_ptr CreateVideoDecoderSoftwareFallbackWrapper( std::unique_ptr sw_fallback_decoder, std::unique_ptr hw_decoder);