Index: talk/app/webrtc/java/jni/peerconnection_jni.cc |
diff --git a/talk/app/webrtc/java/jni/peerconnection_jni.cc b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
index fa52eead8f8ac126fcadf9b73657e9ff0ae6fa05..08974bc6cc21c000ab326c2a8eb94f38d6f65332 100644 |
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc |
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
@@ -89,6 +89,8 @@ |
using webrtc::LogcatTraceContext; |
#endif |
+using cricket::WebRtcVideoDecoderFactory; |
+using cricket::WebRtcVideoEncoderFactory; |
using rtc::Bind; |
using rtc::Thread; |
using rtc::ThreadManager; |
@@ -128,7 +130,7 @@ static char *field_trials_init_string = NULL; |
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) |
// Set in PeerConnectionFactory_initializeAndroidGlobals(). |
static bool factory_static_initialized = false; |
-static bool vp8_hw_acceleration_enabled = true; |
+static bool video_hw_acceleration_enabled = true; |
#endif |
extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { |
@@ -998,9 +1000,9 @@ JOW(jlong, PeerConnectionFactory_nativeCreateObserver)( |
JOW(jboolean, PeerConnectionFactory_initializeAndroidGlobals)( |
JNIEnv* jni, jclass, jobject context, |
jboolean initialize_audio, jboolean initialize_video, |
- jboolean vp8_hw_acceleration, jobject render_egl_context) { |
+ jboolean video_hw_acceleration) { |
bool failure = false; |
- vp8_hw_acceleration_enabled = vp8_hw_acceleration; |
+ video_hw_acceleration_enabled = video_hw_acceleration; |
if (!factory_static_initialized) { |
if (initialize_video) { |
failure |= webrtc::SetRenderAndroidVM(GetJVM()); |
@@ -1010,10 +1012,6 @@ JOW(jboolean, PeerConnectionFactory_initializeAndroidGlobals)( |
failure |= webrtc::VoiceEngine::SetAndroidObjects(GetJVM(), context); |
factory_static_initialized = true; |
} |
- if (initialize_video) { |
- failure |= MediaCodecVideoDecoderFactory::SetAndroidObjects(jni, |
- render_egl_context); |
- } |
return !failure; |
} |
#endif // defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) |
@@ -1043,18 +1041,26 @@ class OwnedFactoryAndThreads { |
public: |
OwnedFactoryAndThreads(Thread* worker_thread, |
Thread* signaling_thread, |
+ WebRtcVideoEncoderFactory* encoder_factory, |
+ WebRtcVideoDecoderFactory* decoder_factory, |
PeerConnectionFactoryInterface* factory) |
: worker_thread_(worker_thread), |
signaling_thread_(signaling_thread), |
+ encoder_factory_(encoder_factory), |
+ decoder_factory_(decoder_factory), |
factory_(factory) {} |
~OwnedFactoryAndThreads() { CHECK_RELEASE(factory_); } |
PeerConnectionFactoryInterface* factory() { return factory_; } |
+ WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; } |
+ WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; } |
private: |
const scoped_ptr<Thread> worker_thread_; |
const scoped_ptr<Thread> signaling_thread_; |
+ WebRtcVideoEncoderFactory* encoder_factory_; |
+ WebRtcVideoDecoderFactory* decoder_factory_; |
PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor. |
}; |
@@ -1073,22 +1079,24 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
signaling_thread->SetName("signaling_thread", NULL); |
CHECK(worker_thread->Start() && signaling_thread->Start()) |
<< "Failed to start threads"; |
- scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory; |
- scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory; |
+ WebRtcVideoEncoderFactory* encoder_factory = nullptr; |
+ WebRtcVideoDecoderFactory* decoder_factory = nullptr; |
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) |
- if (vp8_hw_acceleration_enabled) { |
- encoder_factory.reset(new MediaCodecVideoEncoderFactory()); |
- decoder_factory.reset(new MediaCodecVideoDecoderFactory()); |
+ if (video_hw_acceleration_enabled) { |
+ encoder_factory = new MediaCodecVideoEncoderFactory(); |
+ decoder_factory = new MediaCodecVideoDecoderFactory(); |
} |
#endif |
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( |
webrtc::CreatePeerConnectionFactory(worker_thread, |
signaling_thread, |
NULL, |
- encoder_factory.release(), |
- decoder_factory.release())); |
+ encoder_factory, |
+ decoder_factory)); |
OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads( |
- worker_thread, signaling_thread, factory.release()); |
+ worker_thread, signaling_thread, |
+ encoder_factory, decoder_factory, |
+ factory.release()); |
return jlongFromPointer(owned_factory); |
} |
@@ -1187,6 +1195,22 @@ JOW(void, PeerConnectionFactory_nativeSetOptions)( |
factory->SetOptions(options_to_set); |
} |
+JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)( |
+ JNIEnv* jni, jclass, jlong native_factory, jobject render_egl_context) { |
+#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) |
+ OwnedFactoryAndThreads* owned_factory = |
+ reinterpret_cast<OwnedFactoryAndThreads*>(native_factory); |
+ MediaCodecVideoDecoderFactory* decoder_factory = |
+ static_cast<MediaCodecVideoDecoderFactory*> |
+ (owned_factory->decoder_factory()); |
+ if (decoder_factory) { |
+ LOG(LS_INFO) << "Set EGL context for HW acceleration."; |
+ decoder_factory->SetEGLContext(jni, render_egl_context); |
+ } |
+#endif |
+} |
+ |
+ |
static std::string |
GetJavaEnumName(JNIEnv* jni, const std::string& className, jobject j_enum) { |
jclass enumClass = FindClass(jni, className.c_str()); |