Allow to use propagated field trials in VideoDecoderSoftwareFallbackWrapper

Bug: webrtc:15791
Change-Id: Ida5e1c6f46e5aa9530af441b345abb80d2a5349e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/339862
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41760}
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
index 5bdd514..9f7022c 100644
--- a/api/video_codecs/BUILD.gn
+++ b/api/video_codecs/BUILD.gn
@@ -305,6 +305,8 @@
   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 d338406..be897ae 100644
--- a/api/video_codecs/test/BUILD.gn
+++ b/api/video_codecs/test/BUILD.gn
@@ -39,9 +39,9 @@
       "../../../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 de9293b..bd83760 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 @@
       : 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<VideoDecoder>(fake_decoder_))) {}
 
@@ -74,7 +75,7 @@
     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 @@
     fake_decoder_ = new CountingFakeDecoder();
     sw_fallback_decoder_ = new CountingFakeDecoder();
     fallback_wrapper_ = CreateVideoDecoderSoftwareFallbackWrapper(
-        std::unique_ptr<VideoDecoder>(sw_fallback_decoder_),
+        env_, std::unique_ptr<VideoDecoder>(sw_fallback_decoder_),
         std::unique_ptr<VideoDecoder>(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 2af4d39..623888b 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 <string>
 #include <utility>
 
+#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 @@
  public:
   VideoDecoderSoftwareFallbackWrapper(
       std::unique_ptr<VideoDecoder> sw_fallback_decoder,
-      std::unique_ptr<VideoDecoder> hw_decoder);
+      std::unique_ptr<VideoDecoder> hw_decoder,
+      bool force_sw_decoder_fallback);
   ~VideoDecoderSoftwareFallbackWrapper() override;
 
   bool Configure(const Settings& settings) override;
@@ -67,6 +69,7 @@
   } decoder_type_;
   std::unique_ptr<VideoDecoder> hw_decoder_;
 
+  const bool force_sw_decoder_fallback_;
   Settings decoder_settings_;
   const std::unique_ptr<VideoDecoder> fallback_decoder_;
   const std::string fallback_implementation_name_;
@@ -77,9 +80,11 @@
 
 VideoDecoderSoftwareFallbackWrapper::VideoDecoderSoftwareFallbackWrapper(
     std::unique_ptr<VideoDecoder> sw_fallback_decoder,
-    std::unique_ptr<VideoDecoder> hw_decoder)
+    std::unique_ptr<VideoDecoder> 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 @@
 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 @@
 }  // namespace
 
 std::unique_ptr<VideoDecoder> CreateVideoDecoderSoftwareFallbackWrapper(
+    const Environment& env,
     std::unique_ptr<VideoDecoder> sw_fallback_decoder,
     std::unique_ptr<VideoDecoder> hw_decoder) {
   return std::make_unique<VideoDecoderSoftwareFallbackWrapper>(
-      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<VideoDecoder> CreateVideoDecoderSoftwareFallbackWrapper(
+    std::unique_ptr<VideoDecoder> sw_fallback_decoder,
+    std::unique_ptr<VideoDecoder> hw_decoder) {
+  return std::make_unique<VideoDecoderSoftwareFallbackWrapper>(
+      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 3f44e02..4fbc9a0 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 <memory>
 
+#include "api/environment/environment.h"
 #include "api/video_codecs/video_decoder.h"
 #include "rtc_base/system/rtc_export.h"
 
@@ -23,6 +24,13 @@
 // hardware restrictions, such as max resolution.
 RTC_EXPORT std::unique_ptr<VideoDecoder>
 CreateVideoDecoderSoftwareFallbackWrapper(
+    const Environment& env,
+    std::unique_ptr<VideoDecoder> sw_fallback_decoder,
+    std::unique_ptr<VideoDecoder> hw_decoder);
+
+// TODO: bugs.webrtc.org/15791 - Deprecated, remove when not used by chromium.
+RTC_EXPORT std::unique_ptr<VideoDecoder>
+CreateVideoDecoderSoftwareFallbackWrapper(
     std::unique_ptr<VideoDecoder> sw_fallback_decoder,
     std::unique_ptr<VideoDecoder> hw_decoder);