Migrate legacy Android video codec factories.
Prepare for building without built-in software codecs. When passing
null, inject the new type of factories but wrap them in the built-in
software codecs outside the videoengine.
Bug: webrtc:7925
Change-Id: I7408e6e46e6b9efdf346852954bf51a97e023b5c
Reviewed-on: https://webrtc-review.googlesource.com/83729
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23897}
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 4083230..1c24f91 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -113,6 +113,7 @@
"../sdk/android:audio_api_java",
"../sdk/android:base_java",
"../sdk/android:camera_java",
+ "../sdk/android:default_video_codec_factory_java",
"../sdk/android:filevideo_java",
"../sdk/android:hwcodecs_java",
"../sdk/android:java_audio_device_module_java",
diff --git a/media/engine/convert_legacy_video_factory.cc b/media/engine/convert_legacy_video_factory.cc
index af37a39..075ef91 100644
--- a/media/engine/convert_legacy_video_factory.cc
+++ b/media/engine/convert_legacy_video_factory.cc
@@ -101,6 +101,11 @@
absl::make_unique<CricketToWebRtcEncoderFactory>(
std::move(external_encoder_factory))) {}
+ explicit EncoderAdapter(
+ std::unique_ptr<webrtc::VideoEncoderFactory> external_encoder_factory)
+ : internal_encoder_factory_(new webrtc::InternalEncoderFactory()),
+ external_encoder_factory_(std::move(external_encoder_factory)) {}
+
webrtc::VideoEncoderFactory::CodecInfo QueryVideoEncoder(
const webrtc::SdpVideoFormat& format) const override {
if (IsFormatSupported(external_encoder_factory_->GetSupportedFormats(),
@@ -171,40 +176,18 @@
const std::unique_ptr<webrtc::VideoEncoderFactory> external_encoder_factory_;
};
-// This class combines an external factory with the internal factory and adds
-// internal SW codecs, simulcast, and SW fallback wrappers.
-class DecoderAdapter : public webrtc::VideoDecoderFactory {
+// Converts the cricket::WebRtcVideoDecoderFactory to a
+// webrtc::VideoDecoderFactory (without adding any SW fallback).
+class CricketToWebRtcDecoderFactory : public webrtc::VideoDecoderFactory {
public:
- explicit DecoderAdapter(
+ explicit CricketToWebRtcDecoderFactory(
std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory)
: external_decoder_factory_(std::move(external_decoder_factory)) {}
std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
const webrtc::SdpVideoFormat& format) override {
- std::unique_ptr<webrtc::VideoDecoder> internal_decoder;
- webrtc::InternalDecoderFactory internal_decoder_factory;
- if (IsFormatSupported(internal_decoder_factory.GetSupportedFormats(),
- format)) {
- internal_decoder = internal_decoder_factory.CreateVideoDecoder(format);
- }
-
- const VideoCodec codec(format);
- const VideoDecoderParams params = {};
- if (external_decoder_factory_ != nullptr) {
- std::unique_ptr<webrtc::VideoDecoder> external_decoder =
- CreateScopedVideoDecoder(external_decoder_factory_.get(), codec,
- params);
- if (external_decoder) {
- if (!internal_decoder)
- return external_decoder;
- // Both external and internal decoder available - create fallback
- // wrapper.
- return webrtc::CreateVideoDecoderSoftwareFallbackWrapper(
- std::move(internal_decoder), std::move(external_decoder));
- }
- }
-
- return internal_decoder;
+ return CreateScopedVideoDecoder(external_decoder_factory_.get(),
+ VideoCodec(format), {});
}
std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override {
@@ -217,6 +200,65 @@
const std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory_;
};
+// This class combines an external factory with the internal factory and adds
+// internal SW codecs and SW fallback wrappers.
+class DecoderAdapter : public webrtc::VideoDecoderFactory {
+ public:
+ explicit DecoderAdapter(
+ std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory)
+ : internal_decoder_factory_(new webrtc::InternalDecoderFactory()),
+ external_decoder_factory_(
+ absl::make_unique<CricketToWebRtcDecoderFactory>(
+ std::move(external_decoder_factory))) {}
+
+ explicit DecoderAdapter(
+ std::unique_ptr<webrtc::VideoDecoderFactory> external_decoder_factory)
+ : internal_decoder_factory_(new webrtc::InternalDecoderFactory()),
+ external_decoder_factory_(std::move(external_decoder_factory)) {}
+
+ std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
+ const webrtc::SdpVideoFormat& format) override {
+ std::unique_ptr<webrtc::VideoDecoder> internal_decoder;
+ if (IsFormatSupported(internal_decoder_factory_->GetSupportedFormats(),
+ format)) {
+ internal_decoder = internal_decoder_factory_->CreateVideoDecoder(format);
+ }
+
+ std::unique_ptr<webrtc::VideoDecoder> external_decoder = nullptr;
+ if (external_decoder_factory_ != nullptr) {
+ external_decoder = external_decoder_factory_->CreateVideoDecoder(format);
+ }
+
+ if (internal_decoder && external_decoder) {
+ // Both internal SW decoder and external HW decoder available - create
+ // fallback decoder.
+ return webrtc::CreateVideoDecoderSoftwareFallbackWrapper(
+ std::move(internal_decoder), std::move(external_decoder));
+ }
+ return external_decoder ? std::move(external_decoder)
+ : std::move(internal_decoder);
+ }
+
+ std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override {
+ std::vector<webrtc::SdpVideoFormat> formats =
+ internal_decoder_factory_->GetSupportedFormats();
+
+ // Add external codecs.
+ for (const webrtc::SdpVideoFormat& format :
+ external_decoder_factory_->GetSupportedFormats()) {
+ // Don't add same codec twice.
+ if (!IsFormatSupported(formats, format))
+ formats.push_back(format);
+ }
+
+ return formats;
+ }
+
+ private:
+ const std::unique_ptr<webrtc::VideoDecoderFactory> internal_decoder_factory_;
+ const std::unique_ptr<webrtc::VideoDecoderFactory> external_decoder_factory_;
+};
+
} // namespace
std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
@@ -225,10 +267,22 @@
new EncoderAdapter(std::move(external_encoder_factory)));
}
+std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
+ std::unique_ptr<webrtc::VideoEncoderFactory> external_encoder_factory) {
+ return std::unique_ptr<webrtc::VideoEncoderFactory>(
+ new EncoderAdapter(std::move(external_encoder_factory)));
+}
+
std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory) {
return std::unique_ptr<webrtc::VideoDecoderFactory>(
new DecoderAdapter(std::move(external_decoder_factory)));
}
+std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
+ std::unique_ptr<webrtc::VideoDecoderFactory> external_decoder_factory) {
+ return std::unique_ptr<webrtc::VideoDecoderFactory>(
+ new DecoderAdapter(std::move(external_decoder_factory)));
+}
+
} // namespace cricket
diff --git a/media/engine/convert_legacy_video_factory.h b/media/engine/convert_legacy_video_factory.h
index 5bd3580..9d0d154 100644
--- a/media/engine/convert_legacy_video_factory.h
+++ b/media/engine/convert_legacy_video_factory.h
@@ -30,9 +30,15 @@
std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory);
+std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
+ std::unique_ptr<webrtc::VideoEncoderFactory> external_encoder_factory);
+
std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory);
+std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
+ std::unique_ptr<webrtc::VideoDecoderFactory> external_decoder_factory);
+
} // namespace cricket
#endif // MEDIA_ENGINE_CONVERT_LEGACY_VIDEO_FACTORY_H_
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index a7e9939..33ecace 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -297,6 +297,7 @@
"src/jni/androidvideotracksource.h",
"src/jni/encodedimage.cc",
"src/jni/encodedimage.h",
+ "src/jni/hardwarevideoencoderfactory.cc",
"src/jni/jni_generator_helper.h",
"src/jni/nativecapturerobserver.cc",
"src/jni/nativecapturerobserver.h",
@@ -317,37 +318,21 @@
"src/jni/videoencoderfallback.cc",
"src/jni/videoencoderwrapper.cc",
"src/jni/videoencoderwrapper.h",
- "src/jni/videoframe.cc",
- "src/jni/videoframe.h",
"src/jni/videosink.cc",
"src/jni/videosink.h",
"src/jni/videosource.cc",
"src/jni/videotrack.cc",
- "src/jni/wrapped_native_i420_buffer.cc",
- "src/jni/wrapped_native_i420_buffer.h",
"src/jni/yuvhelper.cc",
]
- if (rtc_use_builtin_sw_codecs) {
- sources += [
- "src/jni/androidmediacodeccommon.h",
- "src/jni/androidmediadecoder.cc",
- "src/jni/androidmediadecoder_jni.h",
- "src/jni/androidmediaencoder.cc",
- "src/jni/androidmediaencoder_jni.h",
- "src/jni/hardwarevideoencoderfactory.cc",
- ]
-
- deps += [
- ":vp8_jni",
- ":vp9_jni",
- "../../media:rtc_internal_video_codecs",
- ]
- }
deps += [
":base_jni",
":generated_video_jni",
+ ":legacy_video_jni", # TODO(bugs.webrtc.org/7925): Remove.
":native_api_jni",
+ ":videoframe_jni",
+ ":vp8_jni", # TODO(bugs.webrtc.org/7925): Remove.
+ ":vp9_jni", # TODO(bugs.webrtc.org/7925): Remove.
"../..:webrtc_common",
"../../api:libjingle_peerconnection_api",
"../../api/video:video_frame",
@@ -356,6 +341,7 @@
"../../common_video:common_video",
"../../media:rtc_audio_video",
"../../media:rtc_h264_profile_id",
+ "../../media:rtc_internal_video_codecs",
"../../media:rtc_media_base",
"../../modules:module_api",
"../../modules/utility:utility",
@@ -374,6 +360,61 @@
]
}
+rtc_static_library("videoframe_jni") {
+ sources = [
+ "src/jni/videoframe.cc",
+ "src/jni/videoframe.h",
+ "src/jni/wrapped_native_i420_buffer.cc",
+ "src/jni/wrapped_native_i420_buffer.h",
+ ]
+
+ deps = [
+ ":base_jni",
+ ":generated_video_jni",
+ ":native_api_jni",
+ "../../api/video:video_frame",
+ "../../common_video:common_video",
+ "../../rtc_base:checks",
+ "../../rtc_base:rtc_base",
+ "../../rtc_base:rtc_base_approved",
+ "../../rtc_base/memory:aligned_malloc",
+ "//third_party/libyuv",
+ ]
+}
+
+# TODO(bugs.webrtc.org/7925): Remove.
+rtc_static_library("legacy_video_jni") {
+ sources = [
+ "src/jni/androidmediacodeccommon.h",
+ "src/jni/androidmediadecoder.cc",
+ "src/jni/androidmediadecoder_jni.h",
+ "src/jni/androidmediaencoder.cc",
+ "src/jni/androidmediaencoder_jni.h",
+ ]
+
+ deps = [
+ ":base_jni",
+ ":generated_video_jni",
+ ":native_api_jni",
+ ":videoframe_jni",
+ "../..:webrtc_common",
+ "../../api/video_codecs:video_codecs_api",
+ "../../common_video:common_video",
+ "../../media:rtc_internal_video_codecs",
+ "../../media:rtc_media_base",
+ "../../modules/video_coding:video_codec_interface",
+ "../../modules/video_coding:video_coding_utility",
+ "../../rtc_base:checks",
+ "../../rtc_base:rtc_base",
+ "../../rtc_base:rtc_base_approved",
+ "../../rtc_base:rtc_task_queue",
+ "../../rtc_base:sequenced_task_checker",
+ "../../rtc_base:weak_ptr",
+ "../../system_wrappers:field_trial_api",
+ "//third_party/libyuv",
+ ]
+}
+
rtc_static_library("null_video_jni") {
sources = [
"src/jni/pc/null_video.cc",
@@ -381,6 +422,7 @@
deps = [
":base_jni",
+ "../../api/video_codecs:video_codecs_api",
]
}
@@ -627,6 +669,9 @@
rtc_static_library("libjingle_peerconnection_metrics_default_jni") {
visibility = [ "*" ]
+
+ allow_poison = [ "software_video_codecs" ] # TODO(bugs.webrtc.org/7925): Remove.
+
sources = [
"src/jni/androidmetrics.cc",
]
@@ -698,6 +743,7 @@
":audio_api_java",
":base_java",
":camera_java",
+ ":default_video_codec_factory_java",
":filevideo_java",
":hwcodecs_java",
":java_audio_device_module_java",
@@ -707,15 +753,12 @@
":peerconnection_java",
":screencapturer_java",
":surfaceviewrenderer_java",
+ ":swcodecs_java",
":video_api_java",
":video_java",
"../../modules/audio_device:audio_device_java",
"../../rtc_base:base_java",
]
-
- if (rtc_use_builtin_sw_codecs) {
- deps += [ ":swcodecs_java" ]
- }
}
# TODO(sakal): Extract files from this target to releveant subtargets, video, audio etc.
@@ -905,24 +948,22 @@
]
}
-if (rtc_use_builtin_sw_codecs) {
- rtc_android_library("swcodecs_java") {
- java_files = [
- "api/org/webrtc/SoftwareVideoDecoderFactory.java",
- "api/org/webrtc/SoftwareVideoEncoderFactory.java",
- "src/java/org/webrtc/VP8Encoder.java",
- "src/java/org/webrtc/VP8Decoder.java",
- "src/java/org/webrtc/VP9Encoder.java",
- "src/java/org/webrtc/VP9Decoder.java",
- ]
+rtc_android_library("swcodecs_java") {
+ java_files = [
+ "api/org/webrtc/SoftwareVideoDecoderFactory.java",
+ "api/org/webrtc/SoftwareVideoEncoderFactory.java",
+ "src/java/org/webrtc/VP8Encoder.java",
+ "src/java/org/webrtc/VP8Decoder.java",
+ "src/java/org/webrtc/VP9Encoder.java",
+ "src/java/org/webrtc/VP9Decoder.java",
+ ]
- deps = [
- ":base_java",
- ":video_api_java",
- ":video_java",
- "//rtc_base:base_java",
- ]
- }
+ deps = [
+ ":base_java",
+ ":video_api_java",
+ ":video_java",
+ "//rtc_base:base_java",
+ ]
}
rtc_android_library("hwcodecs_java") {
@@ -1021,15 +1062,6 @@
"//modules/audio_device:audio_device_java",
"//rtc_base:base_java",
]
-
- if (rtc_use_builtin_sw_codecs) {
- deps += [ ":swcodecs_java" ]
-
- java_files += [
- "api/org/webrtc/DefaultVideoDecoderFactory.java",
- "api/org/webrtc/DefaultVideoEncoderFactory.java",
- ]
- }
}
rtc_android_library("libjingle_peerconnection_metrics_default_java") {
@@ -1042,6 +1074,19 @@
]
}
+rtc_android_library("default_video_codec_factory_java") {
+ java_files = [
+ "api/org/webrtc/DefaultVideoDecoderFactory.java",
+ "api/org/webrtc/DefaultVideoEncoderFactory.java",
+ ]
+
+ deps = [
+ ":hwcodecs_java",
+ ":swcodecs_java",
+ ":video_api_java",
+ ]
+}
+
if (rtc_include_tests) {
rtc_instrumentation_test_apk("libjingle_peerconnection_android_unittest") {
apk_name = "libjingle_peerconnection_android_unittest"
@@ -1079,6 +1124,7 @@
deps = [
":base_java",
+ ":default_video_codec_factory_java",
":libjingle_peerconnection_java",
":libjingle_peerconnection_metrics_default_java",
":video_api_java",
@@ -1222,6 +1268,9 @@
# API for creating Java PeerConnectionFactory from C++ equivalents.
rtc_static_library("native_api_peerconnection") {
visibility = [ "*" ]
+
+ allow_poison = [ "software_video_codecs" ] # TODO(bugs.webrtc.org/7925): Remove.
+
sources = [
"native_api/peerconnection/peerconnectionfactory.cc",
"native_api/peerconnection/peerconnectionfactory.h",
@@ -1258,6 +1307,7 @@
deps = [
":native_api_jni",
":video_jni",
+ ":videoframe_jni",
"//api:libjingle_peerconnection_api",
"//api/video:video_frame",
"//rtc_base:rtc_base_approved",
diff --git a/sdk/android/src/jni/androidmediadecoder.cc b/sdk/android/src/jni/androidmediadecoder.cc
index 96fc748..74a6a52 100644
--- a/sdk/android/src/jni/androidmediadecoder.cc
+++ b/sdk/android/src/jni/androidmediadecoder.cc
@@ -17,14 +17,17 @@
// androidmediacodeccommon.h to avoid build errors.
#include "sdk/android/src/jni/androidmediadecoder_jni.h"
+#include "api/video_codecs/sdp_video_format.h"
#include "common_video/h264/h264_bitstream_parser.h"
#include "common_video/include/i420_buffer_pool.h"
+#include "media/base/mediaconstants.h"
#include "modules/video_coding/include/video_codec_interface.h"
#include "modules/video_coding/utility/vp8_header_parser.h"
#include "rtc_base/bind.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_conversions.h"
+#include "rtc_base/ptr_util.h"
#include "rtc_base/scoped_ref_ptr.h"
#include "rtc_base/thread.h"
#include "rtc_base/timeutils.h"
@@ -781,24 +784,24 @@
ALOGD << "MediaCodecVideoDecoderFactory ctor";
JNIEnv* jni = AttachCurrentThreadIfNeeded();
ScopedLocalRefFrame local_ref_frame(jni);
- supported_codec_types_.clear();
+ supported_formats_.clear();
if (Java_MediaCodecVideoDecoder_isVp8HwSupported(jni) &&
!CheckException(jni)) {
ALOGD << "VP8 HW Decoder supported.";
- supported_codec_types_.push_back(kVideoCodecVP8);
+ supported_formats_.push_back(SdpVideoFormat(cricket::kVp8CodecName));
}
if (Java_MediaCodecVideoDecoder_isVp9HwSupported(jni) &&
!CheckException(jni)) {
ALOGD << "VP9 HW Decoder supported.";
- supported_codec_types_.push_back(kVideoCodecVP9);
+ supported_formats_.push_back(SdpVideoFormat(cricket::kVp9CodecName));
}
if (Java_MediaCodecVideoDecoder_isH264HwSupported(jni) &&
!CheckException(jni)) {
ALOGD << "H264 HW Decoder supported.";
- supported_codec_types_.push_back(kVideoCodecH264);
+ supported_formats_.push_back(SdpVideoFormat(cricket::kH264CodecName));
}
}
@@ -823,27 +826,28 @@
}
}
-VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
- VideoCodecType type) {
- if (supported_codec_types_.empty()) {
- ALOGW << "No HW video decoder for type " << static_cast<int>(type);
- return nullptr;
- }
- for (VideoCodecType codec_type : supported_codec_types_) {
- if (codec_type == type) {
- ALOGD << "Create HW video decoder for type " << static_cast<int>(type);
- JNIEnv* jni = AttachCurrentThreadIfNeeded();
- ScopedLocalRefFrame local_ref_frame(jni);
- return new MediaCodecVideoDecoder(jni, type, egl_context_);
- }
- }
- ALOGW << "Can not find HW video decoder for type " << static_cast<int>(type);
- return nullptr;
+std::vector<SdpVideoFormat> MediaCodecVideoDecoderFactory::GetSupportedFormats()
+ const {
+ return supported_formats_;
}
-void MediaCodecVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder* decoder) {
- ALOGD << "Destroy video decoder.";
- delete decoder;
+std::unique_ptr<VideoDecoder> MediaCodecVideoDecoderFactory::CreateVideoDecoder(
+ const SdpVideoFormat& format) {
+ if (supported_formats_.empty()) {
+ ALOGW << "No HW video decoder for type " << format.name;
+ return nullptr;
+ }
+ for (SdpVideoFormat supported_format : supported_formats_) {
+ if (supported_format == format) {
+ ALOGD << "Create HW video decoder for type " << format.name;
+ JNIEnv* jni = AttachCurrentThreadIfNeeded();
+ ScopedLocalRefFrame local_ref_frame(jni);
+ return rtc::MakeUnique<MediaCodecVideoDecoder>(
+ jni, PayloadStringToCodecType(format.name), egl_context_);
+ }
+ }
+ ALOGW << "Can not find HW video decoder for type " << format.name;
+ return nullptr;
}
bool MediaCodecVideoDecoderFactory::IsH264HighProfileSupported(JNIEnv* env) {
diff --git a/sdk/android/src/jni/androidmediadecoder_jni.h b/sdk/android/src/jni/androidmediadecoder_jni.h
index b984dc5..28b8652 100644
--- a/sdk/android/src/jni/androidmediadecoder_jni.h
+++ b/sdk/android/src/jni/androidmediadecoder_jni.h
@@ -13,31 +13,30 @@
#include <vector>
-#include "media/engine/webrtcvideodecoderfactory.h"
+#include "api/video_codecs/video_decoder_factory.h"
#include "sdk/android/src/jni/jni_helpers.h"
namespace webrtc {
namespace jni {
// Implementation of Android MediaCodec based decoder factory.
-class MediaCodecVideoDecoderFactory
- : public cricket::WebRtcVideoDecoderFactory {
+class MediaCodecVideoDecoderFactory : public VideoDecoderFactory {
public:
MediaCodecVideoDecoderFactory();
~MediaCodecVideoDecoderFactory() override;
void SetEGLContext(JNIEnv* jni, jobject render_egl_context);
- // WebRtcVideoDecoderFactory implementation.
- VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
-
- void DestroyVideoDecoder(VideoDecoder* decoder) override;
+ // VideoDecoderFactory implementation.
+ std::vector<SdpVideoFormat> GetSupportedFormats() const override;
+ std::unique_ptr<VideoDecoder> CreateVideoDecoder(
+ const SdpVideoFormat& format) override;
static bool IsH264HighProfileSupported(JNIEnv* env);
private:
jobject egl_context_;
- std::vector<VideoCodecType> supported_codec_types_;
+ std::vector<SdpVideoFormat> supported_formats_;
};
} // namespace jni
diff --git a/sdk/android/src/jni/androidmediaencoder.cc b/sdk/android/src/jni/androidmediaencoder.cc
index 9edbf2d..595484a 100644
--- a/sdk/android/src/jni/androidmediaencoder.cc
+++ b/sdk/android/src/jni/androidmediaencoder.cc
@@ -18,11 +18,14 @@
#include <string>
#include <utility>
+#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_encoder.h"
#include "common_types.h" // NOLINT(build/include)
#include "common_video/h264/h264_bitstream_parser.h"
#include "common_video/h264/h264_common.h"
#include "common_video/h264/profile_level_id.h"
+#include "media/base/codec.h"
+#include "media/base/mediaconstants.h"
#include "media/engine/internalencoderfactory.h"
#include "modules/video_coding/include/video_codec_interface.h"
#include "modules/video_coding/utility/quality_scaler.h"
@@ -31,6 +34,7 @@
#include "rtc_base/bind.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
+#include "rtc_base/ptr_util.h"
#include "rtc_base/sequenced_task_checker.h"
#include "rtc_base/task_queue.h"
#include "rtc_base/thread.h"
@@ -93,7 +97,7 @@
public:
~MediaCodecVideoEncoder() override;
MediaCodecVideoEncoder(JNIEnv* jni,
- const cricket::VideoCodec& codec,
+ const SdpVideoFormat& format,
jobject egl_context);
// VideoEncoder implementation.
@@ -197,7 +201,7 @@
#endif
// Type of video codec.
- const cricket::VideoCodec codec_;
+ const SdpVideoFormat format_;
EncodedImageCallback* callback_;
@@ -297,9 +301,9 @@
}
MediaCodecVideoEncoder::MediaCodecVideoEncoder(JNIEnv* jni,
- const cricket::VideoCodec& codec,
+ const SdpVideoFormat& format,
jobject egl_context)
- : codec_(codec),
+ : format_(format),
callback_(NULL),
j_media_codec_video_encoder_(
jni,
@@ -348,7 +352,7 @@
profile_ = H264::Profile::kProfileBaseline;
if (codec_type == kVideoCodecH264) {
const absl::optional<H264::ProfileLevelId> profile_level_id =
- H264::ParseSdpProfileLevelId(codec_.params);
+ H264::ParseSdpProfileLevelId(format_.parameters);
RTC_DCHECK(profile_level_id);
profile_ = profile_level_id->profile;
ALOGD << "H.264 profile: " << profile_;
@@ -425,12 +429,14 @@
return false;
}
-bool IsFormatSupported(
- const std::vector<webrtc::SdpVideoFormat>& supported_formats,
- const std::string& name) {
- for (const webrtc::SdpVideoFormat& supported_format : supported_formats) {
- if (cricket::CodecNamesEq(name, supported_format.name))
+bool IsFormatSupported(const std::vector<SdpVideoFormat>& supported_formats,
+ const SdpVideoFormat& format) {
+ for (const SdpVideoFormat& supported_format : supported_formats) {
+ if (cricket::IsSameCodec(format.name, format.parameters,
+ supported_format.name,
+ supported_format.parameters)) {
return true;
+ }
}
return false;
}
@@ -439,7 +445,7 @@
bool reset_if_fallback_unavailable) {
ALOGE << "ProcessHWError";
if (IsFormatSupported(InternalEncoderFactory().GetSupportedFormats(),
- codec_.name)) {
+ format_)) {
ALOGE << "Fallback to SW encoder.";
sw_fallback_required_ = true;
return false;
@@ -457,7 +463,7 @@
}
VideoCodecType MediaCodecVideoEncoder::GetCodecType() const {
- return PayloadStringToCodecType(codec_.name);
+ return PayloadStringToCodecType(format_.name);
}
int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
@@ -1210,20 +1216,20 @@
: egl_context_(nullptr) {
JNIEnv* jni = AttachCurrentThreadIfNeeded();
ScopedLocalRefFrame local_ref_frame(jni);
- supported_codecs_.clear();
+ supported_formats_.clear();
bool is_vp8_hw_supported = Java_MediaCodecVideoEncoder_isVp8HwSupported(jni);
if (is_vp8_hw_supported) {
ALOGD << "VP8 HW Encoder supported.";
- supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp8CodecName));
+ supported_formats_.push_back(SdpVideoFormat(cricket::kVp8CodecName));
}
bool is_vp9_hw_supported = Java_MediaCodecVideoEncoder_isVp9HwSupported(jni);
if (is_vp9_hw_supported) {
ALOGD << "VP9 HW Encoder supported.";
- supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp9CodecName));
+ supported_formats_.push_back(SdpVideoFormat(cricket::kVp9CodecName));
}
- supported_codecs_with_h264_hp_ = supported_codecs_;
+ supported_formats_with_h264_hp_ = supported_formats_;
// Check if high profile is supported by decoder. If yes, encoder can always
// fall back to baseline profile as a subset as high profile.
@@ -1233,15 +1239,14 @@
ALOGD << "H.264 High Profile HW Encoder supported.";
// TODO(magjed): Enumerate actual level instead of using hardcoded level
// 3.1. Level 3.1 is 1280x720@30fps which is enough for now.
- cricket::VideoCodec constrained_high(cricket::kH264CodecName);
+ SdpVideoFormat constrained_high(cricket::kH264CodecName);
const H264::ProfileLevelId constrained_high_profile(
H264::kProfileConstrainedHigh, H264::kLevel3_1);
- constrained_high.SetParam(
- cricket::kH264FmtpProfileLevelId,
- *H264::ProfileLevelIdToString(constrained_high_profile));
- constrained_high.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
- constrained_high.SetParam(cricket::kH264FmtpPacketizationMode, "1");
- supported_codecs_with_h264_hp_.push_back(constrained_high);
+ constrained_high.parameters[cricket::kH264FmtpProfileLevelId] =
+ *H264::ProfileLevelIdToString(constrained_high_profile);
+ constrained_high.parameters[cricket::kH264FmtpLevelAsymmetryAllowed] = "1";
+ constrained_high.parameters[cricket::kH264FmtpPacketizationMode] = "1";
+ supported_formats_with_h264_hp_.push_back(constrained_high);
}
bool is_h264_hw_supported =
@@ -1252,16 +1257,16 @@
// ready, http://crbug/webrtc/6337. We can negotiate Constrained High
// profile as long as we have decode support for it and still send Baseline
// since Baseline is a subset of the High profile.
- cricket::VideoCodec constrained_baseline(cricket::kH264CodecName);
+ SdpVideoFormat constrained_baseline(cricket::kH264CodecName);
const H264::ProfileLevelId constrained_baseline_profile(
H264::kProfileConstrainedBaseline, H264::kLevel3_1);
- constrained_baseline.SetParam(
- cricket::kH264FmtpProfileLevelId,
- *H264::ProfileLevelIdToString(constrained_baseline_profile));
- constrained_baseline.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
- constrained_baseline.SetParam(cricket::kH264FmtpPacketizationMode, "1");
- supported_codecs_.push_back(constrained_baseline);
- supported_codecs_with_h264_hp_.push_back(constrained_baseline);
+ constrained_baseline.parameters[cricket::kH264FmtpProfileLevelId] =
+ *H264::ProfileLevelIdToString(constrained_baseline_profile);
+ constrained_baseline.parameters[cricket::kH264FmtpLevelAsymmetryAllowed] =
+ "1";
+ constrained_baseline.parameters[cricket::kH264FmtpPacketizationMode] = "1";
+ supported_formats_.push_back(constrained_baseline);
+ supported_formats_with_h264_hp_.push_back(constrained_baseline);
}
}
@@ -1286,30 +1291,34 @@
}
}
-VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
- const cricket::VideoCodec& codec) {
- if (supported_codecs().empty()) {
- ALOGW << "No HW video encoder for codec " << codec.name;
+std::unique_ptr<VideoEncoder> MediaCodecVideoEncoderFactory::CreateVideoEncoder(
+ const SdpVideoFormat& format) {
+ if (GetSupportedFormats().empty()) {
+ ALOGW << "No HW video encoder for codec " << format.name;
return nullptr;
}
- if (FindMatchingCodec(supported_codecs(), codec)) {
- ALOGD << "Create HW video encoder for " << codec.name;
+ if (IsFormatSupported(GetSupportedFormats(), format)) {
+ ALOGD << "Create HW video encoder for " << format.name;
JNIEnv* jni = AttachCurrentThreadIfNeeded();
ScopedLocalRefFrame local_ref_frame(jni);
- return new MediaCodecVideoEncoder(jni, codec, egl_context_);
+ return rtc::MakeUnique<MediaCodecVideoEncoder>(jni, format, egl_context_);
}
- ALOGW << "Can not find HW video encoder for type " << codec.name;
+ ALOGW << "Can not find HW video encoder for type " << format.name;
return nullptr;
}
-const std::vector<cricket::VideoCodec>&
-MediaCodecVideoEncoderFactory::supported_codecs() const {
- return supported_codecs_with_h264_hp_;
+std::vector<SdpVideoFormat> MediaCodecVideoEncoderFactory::GetSupportedFormats()
+ const {
+ return supported_formats_with_h264_hp_;
}
-void MediaCodecVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) {
- ALOGD << "Destroy video encoder.";
- delete encoder;
+VideoEncoderFactory::CodecInfo MediaCodecVideoEncoderFactory::QueryVideoEncoder(
+ const SdpVideoFormat& format) const {
+ VideoEncoderFactory::CodecInfo codec_info;
+ codec_info.is_hardware_accelerated =
+ IsFormatSupported(supported_formats_, format);
+ codec_info.has_internal_source = false;
+ return codec_info;
}
static void JNI_MediaCodecVideoEncoder_FillInputBuffer(
diff --git a/sdk/android/src/jni/androidmediaencoder_jni.h b/sdk/android/src/jni/androidmediaencoder_jni.h
index 4fd06bb..ff63c95 100644
--- a/sdk/android/src/jni/androidmediaencoder_jni.h
+++ b/sdk/android/src/jni/androidmediaencoder_jni.h
@@ -13,32 +13,32 @@
#include <vector>
-#include "media/engine/webrtcvideoencoderfactory.h"
+#include "api/video_codecs/video_encoder_factory.h"
#include "sdk/android/src/jni/jni_helpers.h"
namespace webrtc {
namespace jni {
// Implementation of Android MediaCodec based encoder factory.
-class MediaCodecVideoEncoderFactory
- : public cricket::WebRtcVideoEncoderFactory {
+class MediaCodecVideoEncoderFactory : public VideoEncoderFactory {
public:
MediaCodecVideoEncoderFactory();
~MediaCodecVideoEncoderFactory() override;
void SetEGLContext(JNIEnv* jni, jobject egl_context);
- // WebRtcVideoEncoderFactory implementation.
- VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override;
- const std::vector<cricket::VideoCodec>& supported_codecs() const override;
- void DestroyVideoEncoder(VideoEncoder* encoder) override;
+ // VideoEncoderFactory implementation.
+ std::vector<SdpVideoFormat> GetSupportedFormats() const override;
+ CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override;
+ std::unique_ptr<VideoEncoder> CreateVideoEncoder(
+ const SdpVideoFormat& format) override;
private:
jobject egl_context_;
// Empty if platform support is lacking, const after ctor returns.
- std::vector<cricket::VideoCodec> supported_codecs_;
- std::vector<cricket::VideoCodec> supported_codecs_with_h264_hp_;
+ std::vector<SdpVideoFormat> supported_formats_;
+ std::vector<SdpVideoFormat> supported_formats_with_h264_hp_;
};
} // namespace jni
diff --git a/sdk/android/src/jni/pc/media.cc b/sdk/android/src/jni/pc/media.cc
index 55ebae4..dba85fbf 100644
--- a/sdk/android/src/jni/pc/media.cc
+++ b/sdk/android/src/jni/pc/media.cc
@@ -30,21 +30,6 @@
return webrtc::CreateRtcEventLogFactory().release();
}
-#if defined(USE_BUILTIN_SW_CODECS)
-cricket::MediaEngineInterface* CreateMediaEngine(
- AudioDeviceModule* adm,
- const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
- const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
- cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
- cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
- rtc::scoped_refptr<AudioMixer> audio_mixer,
- rtc::scoped_refptr<AudioProcessing> audio_processor) {
- return cricket::WebRtcMediaEngineFactory::Create(
- adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
- video_decoder_factory, audio_mixer, audio_processor);
-}
-#endif
-
cricket::MediaEngineInterface* CreateMediaEngine(
rtc::scoped_refptr<AudioDeviceModule> adm,
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
diff --git a/sdk/android/src/jni/pc/media.h b/sdk/android/src/jni/pc/media.h
index 809f48c..8a0bb52 100644
--- a/sdk/android/src/jni/pc/media.h
+++ b/sdk/android/src/jni/pc/media.h
@@ -29,8 +29,6 @@
namespace cricket {
class MediaEngineInterface;
-class WebRtcVideoEncoderFactory;
-class WebRtcVideoDecoderFactory;
} // namespace cricket
namespace webrtc {
@@ -40,15 +38,6 @@
RtcEventLogFactoryInterface* CreateRtcEventLogFactory();
cricket::MediaEngineInterface* CreateMediaEngine(
- AudioDeviceModule* adm,
- const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
- const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
- cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
- cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
- rtc::scoped_refptr<AudioMixer> audio_mixer,
- rtc::scoped_refptr<AudioProcessing> audio_processor);
-
-cricket::MediaEngineInterface* CreateMediaEngine(
rtc::scoped_refptr<AudioDeviceModule> adm,
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
diff --git a/sdk/android/src/jni/pc/null_media.cc b/sdk/android/src/jni/pc/null_media.cc
index d74eaa6..c59c476 100644
--- a/sdk/android/src/jni/pc/null_media.cc
+++ b/sdk/android/src/jni/pc/null_media.cc
@@ -22,17 +22,6 @@
}
cricket::MediaEngineInterface* CreateMediaEngine(
- AudioDeviceModule* adm,
- const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
- const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
- cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
- cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
- rtc::scoped_refptr<AudioMixer> audio_mixer,
- rtc::scoped_refptr<AudioProcessing> audio_processor) {
- return nullptr;
-}
-
-cricket::MediaEngineInterface* CreateMediaEngine(
rtc::scoped_refptr<AudioDeviceModule> adm,
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
diff --git a/sdk/android/src/jni/pc/null_video.cc b/sdk/android/src/jni/pc/null_video.cc
index 72cc506..c14b84c 100644
--- a/sdk/android/src/jni/pc/null_video.cc
+++ b/sdk/android/src/jni/pc/null_video.cc
@@ -10,6 +10,9 @@
#include "sdk/android/src/jni/pc/video.h"
+#include "api/video_codecs/video_decoder_factory.h"
+#include "api/video_codecs/video_encoder_factory.h"
+
namespace webrtc {
namespace jni {
@@ -26,10 +29,10 @@
}
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoEncoderFactory* encoder_factory,
+ VideoEncoderFactory* encoder_factory,
const JavaRef<jobject>& egl_context) {}
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoDecoderFactory* decoder_factory,
+ VideoDecoderFactory* decoder_factory,
const JavaRef<jobject>& egl_context) {}
void* CreateVideoSource(JNIEnv* env,
@@ -39,28 +42,21 @@
return nullptr;
}
-void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoEncoderFactory* encoder_factory,
- jobject egl_context) {}
-void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoDecoderFactory* decoder_factory,
- jobject egl_context) {}
-
-cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory() {
+std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory() {
return nullptr;
}
-cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory() {
+std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory() {
return nullptr;
}
-VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
- cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory) {
+std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
+ std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory) {
return nullptr;
}
-VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
- cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory) {
+std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
+ std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory) {
return nullptr;
}
diff --git a/sdk/android/src/jni/pc/ownedfactoryandthreads.h b/sdk/android/src/jni/pc/ownedfactoryandthreads.h
index 27e262a..0f46e57 100644
--- a/sdk/android/src/jni/pc/ownedfactoryandthreads.h
+++ b/sdk/android/src/jni/pc/ownedfactoryandthreads.h
@@ -18,8 +18,6 @@
#include "api/peerconnectioninterface.h"
#include "rtc_base/thread.h"
-using cricket::WebRtcVideoDecoderFactory;
-using cricket::WebRtcVideoEncoderFactory;
using rtc::Thread;
namespace webrtc {
@@ -38,8 +36,8 @@
OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread,
std::unique_ptr<Thread> worker_thread,
std::unique_ptr<Thread> signaling_thread,
- WebRtcVideoEncoderFactory* legacy_encoder_factory,
- WebRtcVideoDecoderFactory* legacy_decoder_factory,
+ VideoEncoderFactory* legacy_encoder_factory,
+ VideoDecoderFactory* legacy_decoder_factory,
rtc::NetworkMonitorFactory* network_monitor_factory,
PeerConnectionFactoryInterface* factory)
: network_thread_(std::move(network_thread)),
@@ -56,10 +54,10 @@
Thread* network_thread() { return network_thread_.get(); }
Thread* signaling_thread() { return signaling_thread_.get(); }
Thread* worker_thread() { return worker_thread_.get(); }
- WebRtcVideoEncoderFactory* legacy_encoder_factory() {
+ VideoEncoderFactory* legacy_encoder_factory() {
return legacy_encoder_factory_;
}
- WebRtcVideoDecoderFactory* legacy_decoder_factory() {
+ VideoDecoderFactory* legacy_decoder_factory() {
return legacy_decoder_factory_;
}
rtc::NetworkMonitorFactory* network_monitor_factory() {
@@ -72,8 +70,8 @@
const std::unique_ptr<Thread> network_thread_;
const std::unique_ptr<Thread> worker_thread_;
const std::unique_ptr<Thread> signaling_thread_;
- WebRtcVideoEncoderFactory* legacy_encoder_factory_;
- WebRtcVideoDecoderFactory* legacy_decoder_factory_;
+ VideoEncoderFactory* legacy_encoder_factory_;
+ VideoDecoderFactory* legacy_decoder_factory_;
rtc::NetworkMonitorFactory* network_monitor_factory_;
PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor.
};
diff --git a/sdk/android/src/jni/pc/peerconnectionfactory.cc b/sdk/android/src/jni/pc/peerconnectionfactory.cc
index 04f9353..5dcc7e1 100644
--- a/sdk/android/src/jni/pc/peerconnectionfactory.cc
+++ b/sdk/android/src/jni/pc/peerconnectionfactory.cc
@@ -241,54 +241,43 @@
std::unique_ptr<RtcEventLogFactoryInterface> rtc_event_log_factory(
CreateRtcEventLogFactory());
- cricket::WebRtcVideoEncoderFactory* legacy_video_encoder_factory = nullptr;
- cricket::WebRtcVideoDecoderFactory* legacy_video_decoder_factory = nullptr;
+ VideoEncoderFactory* legacy_video_encoder_factory = nullptr;
+ VideoDecoderFactory* legacy_video_decoder_factory = nullptr;
std::unique_ptr<cricket::MediaEngineInterface> media_engine;
- if (jencoder_factory.is_null() && jdecoder_factory.is_null()) {
-#if defined(USE_BUILTIN_SW_CODECS)
- // This uses the legacy API, which automatically uses the internal SW
- // codecs in WebRTC.
- if (video_hw_acceleration_enabled) {
- legacy_video_encoder_factory = CreateLegacyVideoEncoderFactory();
- legacy_video_decoder_factory = CreateLegacyVideoDecoderFactory();
- }
- media_engine.reset(CreateMediaEngine(
- audio_device_module, audio_encoder_factory, audio_decoder_factory,
- legacy_video_encoder_factory, legacy_video_decoder_factory, audio_mixer,
- audio_processor));
-#endif
+
+ 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();
+ video_encoder_factory =
+ WrapLegacyVideoEncoderFactory(std::move(legacy_factory));
} else {
- // This uses the new API, does not automatically include software codecs.
- std::unique_ptr<VideoEncoderFactory> video_encoder_factory = nullptr;
- if (jencoder_factory.is_null()) {
-#if defined(USE_BUILTIN_SW_CODECS)
- legacy_video_encoder_factory = CreateLegacyVideoEncoderFactory();
- video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
- WrapLegacyVideoEncoderFactory(legacy_video_encoder_factory));
-#endif
- } 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()) {
-#if defined(USE_BUILTIN_SW_CODECS)
- legacy_video_decoder_factory = CreateLegacyVideoDecoderFactory();
- video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
- WrapLegacyVideoDecoderFactory(legacy_video_decoder_factory));
-#endif
- } 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),
- audio_mixer, audio_processor));
+ 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();
+ 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),
+ audio_mixer, audio_processor));
+
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
CreateModularPeerConnectionFactory(
network_thread.get(), worker_thread.get(), signaling_thread.get(),
@@ -484,14 +473,12 @@
jlong native_factory,
const JavaParamRef<jobject>& local_egl_context,
const JavaParamRef<jobject>& remote_egl_context) {
-#if defined(USE_BUILTIN_SW_CODECS)
OwnedFactoryAndThreads* owned_factory =
reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
SetEglContext(jni, owned_factory->legacy_encoder_factory(),
local_egl_context);
SetEglContext(jni, owned_factory->legacy_decoder_factory(),
remote_egl_context);
-#endif
}
static jlong JNI_PeerConnectionFactory_GetNativePeerConnectionFactory(
diff --git a/sdk/android/src/jni/pc/video.cc b/sdk/android/src/jni/pc/video.cc
index 9bf528c..83ef8c7 100644
--- a/sdk/android/src/jni/pc/video.cc
+++ b/sdk/android/src/jni/pc/video.cc
@@ -16,12 +16,9 @@
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "api/videosourceproxy.h"
-#if defined(USE_BUILTIN_SW_CODECS)
-#include "media/engine/convert_legacy_video_factory.h" // nogncheck
-#endif
-#include "media/engine/webrtcvideodecoderfactory.h"
-#include "media/engine/webrtcvideoencoderfactory.h"
+#include "media/engine/convert_legacy_video_factory.h"
#include "rtc_base/logging.h"
+#include "rtc_base/ptr_util.h"
#include "sdk/android/generated_video_jni/jni/EglBase14_jni.h"
#include "sdk/android/src/jni/androidmediadecoder_jni.h"
#include "sdk/android/src/jni/androidmediaencoder_jni.h"
@@ -45,9 +42,8 @@
}
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoEncoderFactory* encoder_factory,
+ VideoEncoderFactory* encoder_factory,
const JavaRef<jobject>& egl_context) {
-#if defined(USE_BUILTIN_SW_CODECS)
if (encoder_factory) {
MediaCodecVideoEncoderFactory* media_codec_factory =
static_cast<MediaCodecVideoEncoderFactory*>(encoder_factory);
@@ -56,16 +52,10 @@
media_codec_factory->SetEGLContext(env, egl_context.obj());
}
}
-#else
- if (Java_Context_isEgl14Context(env, egl_context)) {
- RTC_LOG(LS_INFO) << "Set EGL context for HW encoding.";
- }
-#endif
}
-#if defined(USE_BUILTIN_SW_CODECS)
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoDecoderFactory* decoder_factory,
+ VideoDecoderFactory* decoder_factory,
const JavaRef<jobject>& egl_context) {
if (decoder_factory) {
MediaCodecVideoDecoderFactory* media_codec_factory =
@@ -76,7 +66,6 @@
}
}
}
-#endif
void* CreateVideoSource(JNIEnv* env,
rtc::Thread* signaling_thread,
@@ -89,31 +78,25 @@
.release();
}
-#if defined(USE_BUILTIN_SW_CODECS)
-cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory() {
- return new MediaCodecVideoEncoderFactory();
+std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory() {
+ return rtc::MakeUnique<MediaCodecVideoEncoderFactory>();
}
-cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory() {
- return new MediaCodecVideoDecoderFactory();
+std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory() {
+ return rtc::MakeUnique<MediaCodecVideoDecoderFactory>();
}
-VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
- cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory) {
- return ConvertVideoEncoderFactory(
- std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(
- legacy_encoder_factory))
- .release();
+std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
+ std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory) {
+ return std::unique_ptr<VideoEncoderFactory>(
+ cricket::ConvertVideoEncoderFactory(std::move(legacy_encoder_factory)));
}
-VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
- cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory) {
- return ConvertVideoDecoderFactory(
- std::unique_ptr<cricket::WebRtcVideoDecoderFactory>(
- legacy_decoder_factory))
- .release();
+std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
+ std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory) {
+ return std::unique_ptr<VideoDecoderFactory>(
+ cricket::ConvertVideoDecoderFactory(std::move(legacy_decoder_factory)));
}
-#endif
} // namespace jni
} // namespace webrtc
diff --git a/sdk/android/src/jni/pc/video.h b/sdk/android/src/jni/pc/video.h
index a341488..c198038 100644
--- a/sdk/android/src/jni/pc/video.h
+++ b/sdk/android/src/jni/pc/video.h
@@ -17,11 +17,6 @@
#include "rtc_base/thread.h"
#include "sdk/android/native_api/jni/scoped_java_ref.h"
-namespace cricket {
-class WebRtcVideoEncoderFactory;
-class WebRtcVideoDecoderFactory;
-} // namespace cricket
-
namespace webrtc {
class VideoEncoderFactory;
class VideoDecoderFactory;
@@ -39,10 +34,10 @@
const JavaRef<jobject>& j_decoder_factory);
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoEncoderFactory* encoder_factory,
+ VideoEncoderFactory* encoder_factory,
const JavaRef<jobject>& egl_context);
void SetEglContext(JNIEnv* env,
- cricket::WebRtcVideoDecoderFactory* decoder_factory,
+ VideoDecoderFactory* decoder_factory,
const JavaRef<jobject>& egl_context);
void* CreateVideoSource(JNIEnv* env,
@@ -50,13 +45,13 @@
rtc::Thread* worker_thread,
jboolean is_screencast);
-cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory();
-cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory();
+std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory();
+std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory();
-VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
- cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory);
-VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
- cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory);
+std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
+ std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory);
+std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
+ std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory);
} // namespace jni
} // namespace webrtc