Android: Honor disabling legacy video HW codec acceleration

This CL is a forward fix of
https://webrtc-review.googlesource.com/c/src/+/83729. That CL
accidentally changed the behavior in a specific case when a client would
both explicitly call setEnableVideoHwAcceleration(false) and also not
inject neither a encoder nor a decoder factory.
This CL restores the behavior for that specific case.

Bug: webrtc:7925
Change-Id: I7653453d5dceb2e61fede164216ff2c879d760ed
Reviewed-on: https://webrtc-review.googlesource.com/87847
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23909}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 33ecace..3ec3354 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -336,6 +336,8 @@
     "../..:webrtc_common",
     "../../api:libjingle_peerconnection_api",
     "../../api/video:video_frame",
+    "../../api/video_codecs:builtin_video_decoder_factory",
+    "../../api/video_codecs:builtin_video_encoder_factory",
     "../../api/video_codecs:rtc_software_fallback_wrappers",
     "../../api/video_codecs:video_codecs_api",
     "../../common_video:common_video",
diff --git a/sdk/android/src/jni/pc/peerconnectionfactory.cc b/sdk/android/src/jni/pc/peerconnectionfactory.cc
index 5dcc7e1..62778c6 100644
--- a/sdk/android/src/jni/pc/peerconnectionfactory.cc
+++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc
@@ -243,36 +243,47 @@
 
   VideoEncoderFactory* legacy_video_encoder_factory = nullptr;
   VideoDecoderFactory* legacy_video_decoder_factory = nullptr;
+  std::unique_ptr<VideoEncoderFactory> video_encoder_factory;
+  std::unique_ptr<VideoDecoderFactory> video_decoder_factory;
   std::unique_ptr<cricket::MediaEngineInterface> media_engine;
 
-  std::unique_ptr<VideoEncoderFactory> video_encoder_factory = nullptr;
-  if (jencoder_factory.is_null()) {
-    // TODO(bugs.webrtc.org/7925): When all clients switched to injectable
-    // factories, remove the legacy codec factories
-    std::unique_ptr<VideoEncoderFactory> legacy_factory =
-        CreateLegacyVideoEncoderFactory();
-    legacy_video_encoder_factory = legacy_factory.get();
+  if (jencoder_factory.is_null() && jdecoder_factory.is_null() &&
+      !video_hw_acceleration_enabled) {
+    // Legacy path for clients that are explicitly calling
+    // setEnableVideoHwAcceleration(false) and not injecting neither encoder nor
+    // decoder. These clients should be migrated to only pass in
+    // SoftwareVideoEncoderFactory instead.
     video_encoder_factory =
-        WrapLegacyVideoEncoderFactory(std::move(legacy_factory));
-  } else {
-    video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
-        CreateVideoEncoderFactory(jni, jencoder_factory));
-  }
-
-  std::unique_ptr<VideoDecoderFactory> video_decoder_factory = nullptr;
-  if (jdecoder_factory.is_null()) {
-    // TODO(bugs.webrtc.org/7925): When all clients switched to injectable
-    // factories, remove the legacy codec factories
-    std::unique_ptr<VideoDecoderFactory> legacy_factory =
-        CreateLegacyVideoDecoderFactory();
-    legacy_video_decoder_factory = legacy_factory.get();
+        WrapLegacyVideoEncoderFactory(/* legacy_encoder_factory= */ nullptr);
     video_decoder_factory =
-        WrapLegacyVideoDecoderFactory(std::move(legacy_factory));
+        WrapLegacyVideoDecoderFactory(/* legacy_decoder_factory= */ nullptr);
   } else {
-    video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
-        CreateVideoDecoderFactory(jni, jdecoder_factory));
-  }
+    if (jencoder_factory.is_null()) {
+      // TODO(bugs.webrtc.org/7925): When all clients switched to injectable
+      // factories, remove the legacy codec factories
+      std::unique_ptr<VideoEncoderFactory> legacy_factory =
+          CreateLegacyVideoEncoderFactory();
+      legacy_video_encoder_factory = legacy_factory.get();
+      video_encoder_factory =
+          WrapLegacyVideoEncoderFactory(std::move(legacy_factory));
+    } else {
+      video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
+          CreateVideoEncoderFactory(jni, jencoder_factory));
+    }
 
+    if (jdecoder_factory.is_null()) {
+      // TODO(bugs.webrtc.org/7925): When all clients switched to injectable
+      // factories, remove the legacy codec factories
+      std::unique_ptr<VideoDecoderFactory> legacy_factory =
+          CreateLegacyVideoDecoderFactory();
+      legacy_video_decoder_factory = legacy_factory.get();
+      video_decoder_factory =
+          WrapLegacyVideoDecoderFactory(std::move(legacy_factory));
+    } else {
+      video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
+          CreateVideoDecoderFactory(jni, jdecoder_factory));
+    }
+  }
   media_engine.reset(CreateMediaEngine(
       audio_device_module, audio_encoder_factory, audio_decoder_factory,
       std::move(video_encoder_factory), std::move(video_decoder_factory),
diff --git a/sdk/android/src/jni/pc/video.cc b/sdk/android/src/jni/pc/video.cc
index 83ef8c7..027cada 100644
--- a/sdk/android/src/jni/pc/video.cc
+++ b/sdk/android/src/jni/pc/video.cc
@@ -13,6 +13,8 @@
 #include <jni.h>
 #include <memory>
 
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "api/videosourceproxy.h"
@@ -88,14 +90,18 @@
 
 std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
     std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory) {
-  return std::unique_ptr<VideoEncoderFactory>(
-      cricket::ConvertVideoEncoderFactory(std::move(legacy_encoder_factory)));
+  return legacy_encoder_factory ? std::unique_ptr<VideoEncoderFactory>(
+                                      cricket::ConvertVideoEncoderFactory(
+                                          std::move(legacy_encoder_factory)))
+                                : CreateBuiltinVideoEncoderFactory();
 }
 
 std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
     std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory) {
-  return std::unique_ptr<VideoDecoderFactory>(
-      cricket::ConvertVideoDecoderFactory(std::move(legacy_decoder_factory)));
+  return legacy_decoder_factory ? std::unique_ptr<VideoDecoderFactory>(
+                                      cricket::ConvertVideoDecoderFactory(
+                                          std::move(legacy_decoder_factory)))
+                                : CreateBuiltinVideoDecoderFactory();
 }
 
 }  // namespace jni