Commit 86cf8393 authored by Felix Abecassis's avatar Felix Abecassis Committed by Jean-Baptiste Kempf

android: use common function LoadNativeWindowAPI instead of duplicating code in vout modules.

Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 5adb5920
...@@ -12,7 +12,7 @@ SOURCES_yuv = yuv.c ...@@ -12,7 +12,7 @@ SOURCES_yuv = yuv.c
SOURCES_vout_macosx = macosx.m opengl.h opengl.c SOURCES_vout_macosx = macosx.m opengl.h opengl.c
SOURCES_vout_coregraphicslayer = coregraphicslayer.m SOURCES_vout_coregraphicslayer = coregraphicslayer.m
SOURCES_vout_ios2 = ios2.m opengl.h opengl.c SOURCES_vout_ios2 = ios2.m opengl.h opengl.c
SOURCES_android_surface = android/surface.c SOURCES_android_surface = android/surface.c android/utils.c
if HAVE_DECKLINK if HAVE_DECKLINK
libdecklinkoutput_plugin_la_SOURCES = decklink.cpp libdecklinkoutput_plugin_la_SOURCES = decklink.cpp
...@@ -186,7 +186,7 @@ libegl_android_plugin_la_SOURCES = egl.c ...@@ -186,7 +186,7 @@ libegl_android_plugin_la_SOURCES = egl.c
libegl_android_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS) -DUSE_PLATFORM_ANDROID=1 libegl_android_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS) -DUSE_PLATFORM_ANDROID=1
libegl_android_plugin_la_LIBADD = $(EGL_LIBS) libegl_android_plugin_la_LIBADD = $(EGL_LIBS)
libandroid_native_window_plugin_la_SOURCES = android/nativewindow.c libandroid_native_window_plugin_la_SOURCES = android/nativewindow.c android/utils.c
libandroid_native_window_plugin_la_CFLAGS = $(AM_CFLAGS) libandroid_native_window_plugin_la_CFLAGS = $(AM_CFLAGS)
libandroid_native_window_plugin_la_LIBADD = -ldl libandroid_native_window_plugin_la_LIBADD = -ldl
......
...@@ -33,13 +33,9 @@ ...@@ -33,13 +33,9 @@
#include <vlc_vout_window.h> #include <vlc_vout_window.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <android/native_window.h>
#include <jni.h> #include <jni.h>
#include <android/native_window_jni.h>
#include "utils.h"
typedef ANativeWindow* (*ptr_ANativeWindow_fromSurface)(JNIEnv*, jobject);
typedef void (*ptr_ANativeWindow_release)(ANativeWindow*);
extern JavaVM *myVm; extern JavaVM *myVm;
extern jobject jni_LockAndGetAndroidJavaSurface(); extern jobject jni_LockAndGetAndroidJavaSurface();
...@@ -66,38 +62,11 @@ vlc_module_end() ...@@ -66,38 +62,11 @@ vlc_module_end()
struct vout_window_sys_t struct vout_window_sys_t
{ {
void *p_library; void *p_library;
native_window_api_t native_window;
ptr_ANativeWindow_fromSurface s_winFromSurface;
ptr_ANativeWindow_release s_winRelease;
ANativeWindow *window; ANativeWindow *window;
}; };
/**
* Dynamically load the libandroid library and the needed symbols.
*/
static void *InitLibrary(vout_window_sys_t *p_sys)
{
void *p_library = dlopen("libandroid.so", RTLD_NOW);
if (!p_library)
return NULL;
p_sys->s_winFromSurface =
(ptr_ANativeWindow_fromSurface)(dlsym(p_library, "ANativeWindow_fromSurface"));
p_sys->s_winRelease =
(ptr_ANativeWindow_release)(dlsym(p_library, "ANativeWindow_release"));
if (p_sys->s_winFromSurface == NULL || p_sys->s_winRelease == NULL)
{
dlclose(p_sys->p_library);
return NULL;
}
return p_library;
}
/** /**
* Create an Android native window. * Create an Android native window.
*/ */
...@@ -107,7 +76,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg) ...@@ -107,7 +76,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
if (p_sys == NULL) if (p_sys == NULL)
return VLC_ENOMEM; return VLC_ENOMEM;
p_sys->p_library = InitLibrary(p_sys); p_sys->p_library = LoadNativeWindowAPI(&p_sys->native_window);
if (p_sys->p_library == NULL) if (p_sys->p_library == NULL)
{ {
free(p_sys); free(p_sys);
...@@ -121,7 +90,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg) ...@@ -121,7 +90,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
JNIEnv *p_env; JNIEnv *p_env;
(*myVm)->AttachCurrentThread(myVm, &p_env, NULL); (*myVm)->AttachCurrentThread(myVm, &p_env, NULL);
p_sys->window = p_sys->s_winFromSurface(p_env, javaSurface); // ANativeWindow_fromSurface call. p_sys->window = p_sys->native_window.winFromSurface(p_env, javaSurface); // ANativeWindow_fromSurface call.
(*myVm)->DetachCurrentThread(myVm); (*myVm)->DetachCurrentThread(myVm);
jni_UnlockAndroidSurface(); jni_UnlockAndroidSurface();
...@@ -151,7 +120,7 @@ error: ...@@ -151,7 +120,7 @@ error:
static void Close(vout_window_t *wnd) static void Close(vout_window_t *wnd)
{ {
vout_window_sys_t *p_sys = wnd->sys; vout_window_sys_t *p_sys = wnd->sys;
p_sys->s_winRelease(p_sys->window); // Release the native window. p_sys->native_window.winRelease(p_sys->window); // Release the native window.
dlclose(p_sys->p_library); // Close the library. dlclose(p_sys->p_library); // Close the library.
free (p_sys); free (p_sys);
} }
......
...@@ -32,9 +32,9 @@ ...@@ -32,9 +32,9 @@
#include <vlc_picture_pool.h> #include <vlc_picture_pool.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <android/native_window.h>
#include <jni.h> #include <jni.h>
#include <android/native_window_jni.h>
#include "utils.h"
#ifndef ANDROID_SYM_S_LOCK #ifndef ANDROID_SYM_S_LOCK
# define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb" # define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb"
...@@ -86,11 +86,6 @@ typedef void (*Surface_lock2)(void *, void *, void *); ...@@ -86,11 +86,6 @@ typedef void (*Surface_lock2)(void *, void *, void *);
// _ZN7android7Surface13unlockAndPostEv // _ZN7android7Surface13unlockAndPostEv
typedef void (*Surface_unlockAndPost)(void *); typedef void (*Surface_unlockAndPost)(void *);
typedef ANativeWindow* (*ptr_ANativeWindow_fromSurface)(JNIEnv*, jobject);
typedef void (*ptr_ANativeWindow_release)(ANativeWindow*);
typedef int32_t (*ptr_ANativeWindow_lock)(ANativeWindow*, ANativeWindow_Buffer*, ARect*);
// Just using the normal Surface_unlockAndPost as prototype for ANativeWindow_unlockAndPost
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
...@@ -117,9 +112,7 @@ struct vout_display_sys_t { ...@@ -117,9 +112,7 @@ struct vout_display_sys_t {
Surface_lock s_lock; Surface_lock s_lock;
Surface_lock2 s_lock2; Surface_lock2 s_lock2;
Surface_unlockAndPost s_unlockAndPost; Surface_unlockAndPost s_unlockAndPost;
ptr_ANativeWindow_fromSurface s_winFromSurface; native_window_api_t native_window;
ptr_ANativeWindow_release s_winRelease;
ptr_ANativeWindow_lock s_winLock;
jobject jsurf; jobject jsurf;
ANativeWindow *window; ANativeWindow *window;
...@@ -177,33 +170,6 @@ static void *InitLibrary(vout_display_sys_t *sys) ...@@ -177,33 +170,6 @@ static void *InitLibrary(vout_display_sys_t *sys)
return NULL; return NULL;
} }
static void *InitLibrary2(vout_display_sys_t *sys)
{
void *p_library = dlopen("libandroid.so", RTLD_NOW);
if (!p_library)
return NULL;
sys->s_winFromSurface =
(ptr_ANativeWindow_fromSurface)(dlsym(p_library, "ANativeWindow_fromSurface"));
sys->s_winRelease =
(ptr_ANativeWindow_release)(dlsym(p_library, "ANativeWindow_release"));
sys->s_winLock =
(ptr_ANativeWindow_lock)(dlsym(p_library, "ANativeWindow_lock"));
sys->s_unlockAndPost =
(Surface_unlockAndPost)(dlsym(p_library, "ANativeWindow_unlockAndPost"));
if (sys->s_winFromSurface && sys->s_winRelease && sys->s_winLock && sys->s_unlockAndPost)
return p_library;
sys->s_winFromSurface = NULL;
sys->s_winRelease = NULL;
sys->s_winLock = NULL;
sys->s_unlockAndPost = NULL;
dlclose(p_library);
return NULL;
}
static int Open(vlc_object_t *p_this) static int Open(vlc_object_t *p_this)
{ {
vout_display_t *vd = (vout_display_t *)p_this; vout_display_t *vd = (vout_display_t *)p_this;
...@@ -222,7 +188,8 @@ static int Open(vlc_object_t *p_this) ...@@ -222,7 +188,8 @@ static int Open(vlc_object_t *p_this)
} }
/* */ /* */
sys->p_library = InitLibrary2(sys); sys->p_library = LoadNativeWindowAPI(&sys->native_window);
sys->s_unlockAndPost = (Surface_unlockAndPost)sys->native_window.unlockAndPost;
if (!sys->p_library) if (!sys->p_library)
sys->p_library = InitLibrary(sys); sys->p_library = InitLibrary(sys);
if (!sys->p_library) { if (!sys->p_library) {
...@@ -328,7 +295,7 @@ static void Close(vlc_object_t *p_this) ...@@ -328,7 +295,7 @@ static void Close(vlc_object_t *p_this)
picture_pool_Delete(sys->pool); picture_pool_Delete(sys->pool);
if (sys->window) if (sys->window)
sys->s_winRelease(sys->window); sys->native_window.winRelease(sys->window);
dlclose(sys->p_library); dlclose(sys->p_library);
free(sys); free(sys);
vlc_mutex_unlock(&single_instance); vlc_mutex_unlock(&single_instance);
...@@ -380,21 +347,21 @@ static int AndroidLockSurface(picture_t *picture) ...@@ -380,21 +347,21 @@ static int AndroidLockSurface(picture_t *picture)
sw = sys->fmt.i_width; sw = sys->fmt.i_width;
sh = sys->fmt.i_height; sh = sys->fmt.i_height;
if (sys->s_winFromSurface) { if (sys->native_window.winFromSurface) {
jobject jsurf = jni_LockAndGetAndroidJavaSurface(); jobject jsurf = jni_LockAndGetAndroidJavaSurface();
if (unlikely(!jsurf)) { if (unlikely(!jsurf)) {
jni_UnlockAndroidSurface(); jni_UnlockAndroidSurface();
return VLC_EGENERIC; return VLC_EGENERIC;
} }
if (sys->window && jsurf != sys->jsurf) { if (sys->window && jsurf != sys->jsurf) {
sys->s_winRelease(sys->window); sys->native_window.winRelease(sys->window);
sys->window = NULL; sys->window = NULL;
} }
sys->jsurf = jsurf; sys->jsurf = jsurf;
if (!sys->window) { if (!sys->window) {
JNIEnv *p_env; JNIEnv *p_env;
(*myVm)->AttachCurrentThread(myVm, &p_env, NULL); (*myVm)->AttachCurrentThread(myVm, &p_env, NULL);
sys->window = sys->s_winFromSurface(p_env, jsurf); sys->window = sys->native_window.winFromSurface(p_env, jsurf);
(*myVm)->DetachCurrentThread(myVm); (*myVm)->DetachCurrentThread(myVm);
} }
// Using sys->window instead of the native surface object // Using sys->window instead of the native surface object
...@@ -409,9 +376,9 @@ static int AndroidLockSurface(picture_t *picture) ...@@ -409,9 +376,9 @@ static int AndroidLockSurface(picture_t *picture)
} }
info = &picsys->info; info = &picsys->info;
if (sys->s_winLock) { if (sys->native_window.winLock) {
ANativeWindow_Buffer buf = { 0 }; ANativeWindow_Buffer buf = { 0 };
sys->s_winLock(sys->window, &buf, NULL); sys->native_window.winLock(sys->window, &buf, NULL);
info->w = buf.width; info->w = buf.width;
info->h = buf.height; info->h = buf.height;
info->bits = buf.bits; info->bits = buf.bits;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment