Allow passing in decoder factory to PeerConnectionFactory.

Bug: webrtc:7760
Change-Id: I8509de8f0170f1f60f917992b5806b926a8bb392
Reviewed-on: https://chromium-review.googlesource.com/535561
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#18787}
This commit is contained in:
Sami Kalliomäki
2017-06-27 13:53:38 +02:00
committed by Commit Bot
parent 8179a7cf97
commit 471f63559f
5 changed files with 52 additions and 18 deletions

View File

@ -12,11 +12,15 @@
namespace webrtc_jni {
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory() {
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
JNIEnv* jni,
jobject j_encoder_factory) {
return nullptr;
}
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory() {
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
JNIEnv* jni,
jobject j_decoder_factory) {
return nullptr;
}

View File

@ -1121,8 +1121,12 @@ PeerConnectionFactoryInterface::Options ParseOptionsFromJava(JNIEnv* jni,
return native_options;
}
JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)(
JNIEnv* jni, jclass, jobject joptions) {
JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)
(JNIEnv* jni,
jclass,
jobject joptions,
jobject jencoder_factory,
jobject jdecoder_factory) {
// talk/ assumes pretty widely that the current Thread is ThreadManager'd, but
// ThreadManager only WrapCurrentThread()s the thread where it is first
// created. Since the semantics around when auto-wrapping happens in
@ -1157,8 +1161,8 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)(
}
if (video_hw_acceleration_enabled) {
video_encoder_factory = CreateVideoEncoderFactory();
video_decoder_factory = CreateVideoDecoderFactory();
video_encoder_factory = CreateVideoEncoderFactory(jni, jencoder_factory);
video_decoder_factory = CreateVideoDecoderFactory(jni, jdecoder_factory);
}
// Do not create network_monitor_factory only if the options are
// provided and disable_network_monitor therein is set to true.

View File

@ -20,15 +20,34 @@
#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
#include "webrtc/sdk/android/src/jni/ownedfactoryandthreads.h"
#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
#include "webrtc/sdk/android/src/jni/videodecoderfactorywrapper.h"
namespace webrtc_jni {
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory() {
// TODO(sakal): Remove this once MediaCodecVideoDecoder/Encoder are no longer
// used and all applications inject their own codecs.
// This is semi broken if someone wants to create multiple peerconnection
// factories.
static MediaCodecVideoDecoderFactory* media_codec_decoder_factory;
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
JNIEnv* jni,
jobject j_encoder_factory) {
RTC_DCHECK(j_encoder_factory == nullptr)
<< "Injectable video encoders are not supported yet.";
return new MediaCodecVideoEncoderFactory();
}
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory() {
return new MediaCodecVideoDecoderFactory();
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
JNIEnv* jni,
jobject j_decoder_factory) {
if (j_decoder_factory != nullptr) {
media_codec_decoder_factory = nullptr;
return new VideoDecoderFactoryWrapper(jni, j_decoder_factory);
} else {
media_codec_decoder_factory = new MediaCodecVideoDecoderFactory();
return media_codec_decoder_factory;
}
}
jobject GetJavaSurfaceTextureHelper(
@ -90,12 +109,9 @@ JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)
encoder_factory->SetEGLContext(jni, local_egl_context);
}
MediaCodecVideoDecoderFactory* decoder_factory =
static_cast<MediaCodecVideoDecoderFactory*>(
owned_factory->decoder_factory());
if (decoder_factory) {
if (media_codec_decoder_factory) {
LOG(LS_INFO) << "Set EGL context for HW decoding.";
decoder_factory->SetEGLContext(jni, remote_egl_context);
media_codec_decoder_factory->SetEGLContext(jni, remote_egl_context);
}
}

View File

@ -24,9 +24,13 @@ namespace webrtc_jni {
class SurfaceTextureHelper;
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory();
cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
JNIEnv* jni,
jobject j_encoder_factory);
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory();
cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
JNIEnv* jni,
jobject j_decoder_factory);
jobject GetJavaSurfaceTextureHelper(
const rtc::scoped_refptr<SurfaceTextureHelper>& surface_texture_helper);