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