Split video engine android initialization into each internal module initialization.

This is to later on allow targets to pick at link time if to include the external or internal implementation. In order to do that the video_engine cannot compile different based on which option is picked later on.

BUG=3768,3770
R=glaznev@webrtc.org, stefan@webrtc.org
TBR=henrike@webrtc.org, mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/25529004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7208 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
andresp@webrtc.org 2014-09-17 11:44:51 +00:00
parent ab990ae43a
commit 85ef770d92
12 changed files with 93 additions and 77 deletions

View File

@ -90,6 +90,8 @@
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) #if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD)
#include <android/log.h> #include <android/log.h>
#include "webrtc/modules/video_capture/video_capture_internal.h"
#include "webrtc/modules/video_render/video_render_internal.h"
#include "webrtc/system_wrappers/interface/logcat_trace_context.h" #include "webrtc/system_wrappers/interface/logcat_trace_context.h"
#include "webrtc/system_wrappers/interface/tick_util.h" #include "webrtc/system_wrappers/interface/tick_util.h"
using webrtc::CodecSpecificInfo; using webrtc::CodecSpecificInfo;
@ -2765,8 +2767,10 @@ JOW(jboolean, PeerConnectionFactory_initializeAndroidGlobals)(
CHECK(g_jvm) << "JNI_OnLoad failed to run?"; CHECK(g_jvm) << "JNI_OnLoad failed to run?";
bool failure = false; bool failure = false;
if (!factory_static_initialized) { if (!factory_static_initialized) {
if (initialize_video) if (initialize_video) {
failure |= webrtc::VideoEngine::SetAndroidObjects(g_jvm, context); failure |= webrtc::SetCaptureAndroidVM(g_jvm, context);
failure |= webrtc::SetRenderAndroidVM(g_jvm);
}
if (initialize_audio) if (initialize_audio)
failure |= webrtc::VoiceEngine::SetAndroidObjects(g_jvm, jni, context); failure |= webrtc::VoiceEngine::SetAndroidObjects(g_jvm, jni, context);
factory_static_initialized = true; factory_static_initialized = true;

View File

@ -15,7 +15,8 @@
#include "webrtc/examples/android/media_demo/jni/jni_helpers.h" #include "webrtc/examples/android/media_demo/jni/jni_helpers.h"
#include "webrtc/examples/android/media_demo/jni/video_engine_jni.h" #include "webrtc/examples/android/media_demo/jni/video_engine_jni.h"
#include "webrtc/examples/android/media_demo/jni/voice_engine_jni.h" #include "webrtc/examples/android/media_demo/jni/voice_engine_jni.h"
#include "webrtc/video_engine/include/vie_base.h" #include "webrtc/modules/video_capture/video_capture_internal.h"
#include "webrtc/modules/video_render/video_render_internal.h"
#include "webrtc/voice_engine/include/voe_base.h" #include "webrtc/voice_engine/include/voe_base.h"
// Macro for native functions that can be found by way of jni-auto discovery. // Macro for native functions that can be found by way of jni-auto discovery.
@ -38,8 +39,10 @@ JOWW(void, NativeWebRtcContextRegistry_register)(
jobject context) { jobject context) {
webrtc_examples::SetVoeDeviceObjects(g_vm); webrtc_examples::SetVoeDeviceObjects(g_vm);
webrtc_examples::SetVieDeviceObjects(g_vm); webrtc_examples::SetVieDeviceObjects(g_vm);
CHECK(webrtc::VideoEngine::SetAndroidObjects(g_vm, context) == 0, CHECK(webrtc::SetCaptureAndroidVM(g_vm, context) == 0,
"Failed to register android objects to video engine"); "Failed to register android objects to video capture");
CHECK(webrtc::SetRenderAndroidVM(g_vm) == 0,
"Failed to register android objects to video render");
CHECK(webrtc::VoiceEngine::SetAndroidObjects(g_vm, jni, context) == 0, CHECK(webrtc::VoiceEngine::SetAndroidObjects(g_vm, jni, context) == 0,
"Failed to register android objects to voice engine"); "Failed to register android objects to voice engine");
} }
@ -47,8 +50,10 @@ JOWW(void, NativeWebRtcContextRegistry_register)(
JOWW(void, NativeWebRtcContextRegistry_unRegister)( JOWW(void, NativeWebRtcContextRegistry_unRegister)(
JNIEnv* jni, JNIEnv* jni,
jclass) { jclass) {
CHECK(webrtc::VideoEngine::SetAndroidObjects(NULL, NULL) == 0, CHECK(webrtc::SetCaptureAndroidVM(NULL, NULL) == 0,
"Failed to unregister android objects from video engine"); "Failed to unregister android objects from video capture");
CHECK(webrtc::SetRenderAndroidVM(NULL) == 0,
"Failed to unregister android objects from video render");
CHECK(webrtc::VoiceEngine::SetAndroidObjects(NULL, NULL, NULL) == 0, CHECK(webrtc::VoiceEngine::SetAndroidObjects(NULL, NULL, NULL) == 0,
"Failed to unregister android objects from voice engine"); "Failed to unregister android objects from voice engine");
webrtc_examples::ClearVieDeviceObjects(); webrtc_examples::ClearVieDeviceObjects();

View File

@ -10,7 +10,7 @@
// Platform-specific initialization bits, if any, go here. // Platform-specific initialization bits, if any, go here.
#if !defined(ANDROID) || !defined(WEBRTC_CHROMIUM_BUILD) #ifndef ANDROID
namespace webrtc { namespace webrtc {
namespace videocapturemodule { namespace videocapturemodule {
@ -18,26 +18,15 @@ void EnsureInitialized() {}
} // namespace videocapturemodule } // namespace videocapturemodule
} // namespace webrtc } // namespace webrtc
#else // !defined(ANDROID) || !defined(WEBRTC_CHROMIUM_BUILD) #else
#include <assert.h>
#include <pthread.h> #include <pthread.h>
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "webrtc/base/checks.h"
// Handy alternative to assert() which suppresses unused-variable warnings when #include "webrtc/modules/video_capture/video_capture_internal.h"
// assert() is a no-op (i.e. in Release builds).
#ifdef NDEBUG
#define ASSERT(x) if (false && (x)); else
#else
#define ASSERT(x) assert(x)
#endif
namespace webrtc { namespace webrtc {
// Declared in webrtc/modules/video_capture/include/video_capture.h.
int32_t SetCaptureAndroidVM(JavaVM* javaVM, jobject g_context);
namespace videocapturemodule { namespace videocapturemodule {
static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT; static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT;
@ -46,18 +35,15 @@ void EnsureInitializedOnce() {
JNIEnv* jni = ::base::android::AttachCurrentThread(); JNIEnv* jni = ::base::android::AttachCurrentThread();
jobject context = ::base::android::GetApplicationContext(); jobject context = ::base::android::GetApplicationContext();
JavaVM* jvm = NULL; JavaVM* jvm = NULL;
int status = jni->GetJavaVM(&jvm); CHECK_EQ(0, jni->GetJavaVM(&jvm));
ASSERT(status == 0); CHECK_EQ(0, webrtc::SetCaptureAndroidVM(jvm, context));
status = webrtc::SetCaptureAndroidVM(jvm, context) == 0;
ASSERT(status);
} }
void EnsureInitialized() { void EnsureInitialized() {
int ret = pthread_once(&g_initialize_once, &EnsureInitializedOnce); CHECK_EQ(0, pthread_once(&g_initialize_once, &EnsureInitializedOnce));
ASSERT(ret == 0);
} }
} // namespace videocapturemodule } // namespace videocapturemodule
} // namespace webrtc } // namespace webrtc
#endif // ANDROID & WEBRTC_CHROMIUM_BUILD #endif // !ANDROID

View File

@ -14,16 +14,8 @@
#include "webrtc/modules/interface/module.h" #include "webrtc/modules/interface/module.h"
#include "webrtc/modules/video_capture/include/video_capture_defines.h" #include "webrtc/modules/video_capture/include/video_capture_defines.h"
#ifdef ANDROID
#include <jni.h>
#endif
namespace webrtc { namespace webrtc {
#if defined(ANDROID)
int32_t SetCaptureAndroidVM(JavaVM* javaVM, jobject context);
#endif
class VideoCaptureModule: public RefCountedModule { class VideoCaptureModule: public RefCountedModule {
public: public:
// Interface for receiving information about available camera devices. // Interface for receiving information about available camera devices.

View File

@ -36,10 +36,6 @@ class VideoCaptureFactory {
static VideoCaptureModule::DeviceInfo* CreateDeviceInfo( static VideoCaptureModule::DeviceInfo* CreateDeviceInfo(
const int32_t id); const int32_t id);
#ifdef WEBRTC_ANDROID
static int32_t SetAndroidObjects(void* javaVM, void* javaContext);
#endif
private: private:
~VideoCaptureFactory(); ~VideoCaptureFactory();
}; };

View File

@ -187,6 +187,13 @@
'dependencies': [ 'dependencies': [
'<(DEPTH)/testing/android/native_test.gyp:native_test_native_code', '<(DEPTH)/testing/android/native_test.gyp:native_test_native_code',
], ],
# Need to disable error due to the line in
# base/android/jni_android.h triggering it:
# const BASE_EXPORT jobject GetApplicationContext()
# error: type qualifiers ignored on function return type
'cflags': [
'-Wno-ignored-qualifiers',
],
}], }],
['OS=="mac"', { ['OS=="mac"', {
'dependencies': [ 'dependencies': [

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_INTERNAL_H_
#define WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_INTERNAL_H_
#ifdef ANDROID
#include <jni.h>
namespace webrtc {
// In order to be able to use the internal webrtc video capture
// for android, the jvm objects must be set via this method.
int32_t SetCaptureAndroidVM(JavaVM* javaVM, jobject context);
} // namespace webrtc
#endif // ANDROID
#endif // WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_INTERNAL_H_

View File

@ -10,6 +10,7 @@
#include "webrtc/modules/video_render/android/video_render_android_impl.h" #include "webrtc/modules/video_render/android/video_render_android_impl.h"
#include "webrtc/modules/video_render/video_render_internal.h"
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/event_wrapper.h" #include "webrtc/system_wrappers/interface/event_wrapper.h"
#include "webrtc/system_wrappers/interface/thread_wrapper.h" #include "webrtc/system_wrappers/interface/thread_wrapper.h"
@ -29,13 +30,11 @@ namespace webrtc {
JavaVM* VideoRenderAndroid::g_jvm = NULL; JavaVM* VideoRenderAndroid::g_jvm = NULL;
#if defined(WEBRTC_ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) int32_t SetRenderAndroidVM(JavaVM* javaVM) {
int32_t SetRenderAndroidVM(void* javaVM) {
WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, -1, "%s", __FUNCTION__); WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, -1, "%s", __FUNCTION__);
VideoRenderAndroid::g_jvm = (JavaVM*)javaVM; VideoRenderAndroid::g_jvm = javaVM;
return 0; return 0;
} }
#endif
VideoRenderAndroid::VideoRenderAndroid( VideoRenderAndroid::VideoRenderAndroid(
const int32_t id, const int32_t id,

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_VIDEO_RENDER_VIDEO_RENDER_INTERNAL_H_
#define WEBRTC_MODULES_VIDEO_RENDER_VIDEO_RENDER_INTERNAL_H_
#ifdef ANDROID
#include <jni.h>
namespace webrtc {
// In order to be able to use the internal webrtc video render
// for android, the jvm objects must be set via this method.
int32_t SetRenderAndroidVM(JavaVM* javaVM);
} // namespace webrtc
#endif // ANDROID
#endif // WEBRTC_MODULES_VIDEO_RENDER_VIDEO_RENDER_INTERNAL_H_

View File

@ -21,10 +21,6 @@
#include "webrtc/common_types.h" #include "webrtc/common_types.h"
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD)
#include <jni.h>
#endif
namespace webrtc { namespace webrtc {
class Config; class Config;
@ -142,11 +138,6 @@ class WEBRTC_DLLEXPORT VideoEngine {
// user receives callbacks for generated trace messages. // user receives callbacks for generated trace messages.
static int SetTraceCallback(TraceCallback* callback); static int SetTraceCallback(TraceCallback* callback);
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD)
// Android specific.
static int SetAndroidObjects(JavaVM* java_vm, jobject context);
#endif
protected: protected:
VideoEngine() {} VideoEngine() {}
virtual ~VideoEngine() {} virtual ~VideoEngine() {}

View File

@ -13,15 +13,18 @@
#include <android/log.h> #include <android/log.h>
#include <stdio.h> #include <stdio.h>
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h" #include "webrtc/modules/video_capture/video_capture_internal.h"
#include "webrtc/modules/video_render/video_render_internal.h"
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h" #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
int ViEAutoTestAndroid::RunAutotest(int testSelection, int subTestSelection, int ViEAutoTestAndroid::RunAutotest(int testSelection, int subTestSelection,
void* window1, void* window2, void* window1, void* window2,
JavaVM* javaVM, void* env, void* context) { JavaVM* javaVM, void* env, void* context) {
ViEAutoTest vieAutoTest(window1, window2); ViEAutoTest vieAutoTest(window1, window2);
ViETest::Log("RunAutoTest(%d, %d)", testSelection, subTestSelection); ViETest::Log("RunAutoTest(%d, %d)", testSelection, subTestSelection);
webrtc::VideoEngine::SetAndroidObjects(javaVM, static_cast<jobject>(context)); webrtc::SetCaptureAndroidVM(javaVM, static_cast<jobject>(context));
webrtc::SetRenderAndroidVM(javaVM);
#ifndef WEBRTC_ANDROID_OPENSLES #ifndef WEBRTC_ANDROID_OPENSLES
// voice engine calls into ADM directly // voice engine calls into ADM directly
webrtc::VoiceEngine::SetAndroidObjects(javaVM, env, context); webrtc::VoiceEngine::SetAndroidObjects(javaVM, env, context);

View File

@ -14,11 +14,6 @@
#include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/logging.h"
#include "webrtc/system_wrappers/interface/trace.h" #include "webrtc/system_wrappers/interface/trace.h"
#ifdef WEBRTC_ANDROID
#include "webrtc/modules/video_capture/include/video_capture_factory.h"
#include "webrtc/modules/video_render/include/video_render.h"
#endif
namespace webrtc { namespace webrtc {
enum { kModuleId = 0 }; enum { kModuleId = 0 };
@ -139,20 +134,4 @@ int VideoEngine::SetTraceCallback(TraceCallback* callback) {
return Trace::SetTraceCallback(callback); return Trace::SetTraceCallback(callback);
} }
#if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD)
int VideoEngine::SetAndroidObjects(JavaVM* javaVM, jobject context) {
LOG_F(LS_INFO);
if (SetCaptureAndroidVM(javaVM, context) != 0) {
LOG(LS_ERROR) << "Could not set capture Android VM";
return -1;
}
if (SetRenderAndroidVM(javaVM) != 0) {
LOG(LS_ERROR) << "Could not set render Android VM";
return -1;
}
return 0;
}
#endif
} // namespace webrtc } // namespace webrtc