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
SOURCES_vout_macosx = macosx.m opengl.h opengl.c
SOURCES_vout_coregraphicslayer = coregraphicslayer.m
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
libdecklinkoutput_plugin_la_SOURCES = decklink.cpp
......@@ -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_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_LIBADD = -ldl
......
......@@ -33,13 +33,9 @@
#include <vlc_vout_window.h>
#include <dlfcn.h>
#include <android/native_window.h>
#include <jni.h>
#include <android/native_window_jni.h>
typedef ANativeWindow* (*ptr_ANativeWindow_fromSurface)(JNIEnv*, jobject);
typedef void (*ptr_ANativeWindow_release)(ANativeWindow*);
#include "utils.h"
extern JavaVM *myVm;
extern jobject jni_LockAndGetAndroidJavaSurface();
......@@ -66,38 +62,11 @@ vlc_module_end()
struct vout_window_sys_t
{
void *p_library;
ptr_ANativeWindow_fromSurface s_winFromSurface;
ptr_ANativeWindow_release s_winRelease;
native_window_api_t native_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.
*/
......@@ -107,7 +76,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
if (p_sys == NULL)
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)
{
free(p_sys);
......@@ -121,7 +90,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
JNIEnv *p_env;
(*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);
jni_UnlockAndroidSurface();
......@@ -151,7 +120,7 @@ error:
static void Close(vout_window_t *wnd)
{
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.
free (p_sys);
}
......
......@@ -32,9 +32,9 @@
#include <vlc_picture_pool.h>
#include <dlfcn.h>
#include <android/native_window.h>
#include <jni.h>
#include <android/native_window_jni.h>
#include "utils.h"
#ifndef ANDROID_SYM_S_LOCK
# define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb"
......@@ -86,11 +86,6 @@ typedef void (*Surface_lock2)(void *, void *, void *);
// _ZN7android7Surface13unlockAndPostEv
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
*****************************************************************************/
......@@ -117,9 +112,7 @@ struct vout_display_sys_t {
Surface_lock s_lock;
Surface_lock2 s_lock2;
Surface_unlockAndPost s_unlockAndPost;
ptr_ANativeWindow_fromSurface s_winFromSurface;
ptr_ANativeWindow_release s_winRelease;
ptr_ANativeWindow_lock s_winLock;
native_window_api_t native_window;
jobject jsurf;
ANativeWindow *window;
......@@ -177,33 +170,6 @@ static void *InitLibrary(vout_display_sys_t *sys)
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)
{
vout_display_t *vd = (vout_display_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)
sys->p_library = InitLibrary(sys);
if (!sys->p_library) {
......@@ -328,7 +295,7 @@ static void Close(vlc_object_t *p_this)
picture_pool_Delete(sys->pool);
if (sys->window)
sys->s_winRelease(sys->window);
sys->native_window.winRelease(sys->window);
dlclose(sys->p_library);
free(sys);
vlc_mutex_unlock(&single_instance);
......@@ -380,21 +347,21 @@ static int AndroidLockSurface(picture_t *picture)
sw = sys->fmt.i_width;
sh = sys->fmt.i_height;
if (sys->s_winFromSurface) {
if (sys->native_window.winFromSurface) {
jobject jsurf = jni_LockAndGetAndroidJavaSurface();
if (unlikely(!jsurf)) {
jni_UnlockAndroidSurface();
return VLC_EGENERIC;
}
if (sys->window && jsurf != sys->jsurf) {
sys->s_winRelease(sys->window);
sys->native_window.winRelease(sys->window);
sys->window = NULL;
}
sys->jsurf = jsurf;
if (!sys->window) {
JNIEnv *p_env;
(*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);
}
// Using sys->window instead of the native surface object
......@@ -409,9 +376,9 @@ static int AndroidLockSurface(picture_t *picture)
}
info = &picsys->info;
if (sys->s_winLock) {
if (sys->native_window.winLock) {
ANativeWindow_Buffer buf = { 0 };
sys->s_winLock(sys->window, &buf, NULL);
sys->native_window.winLock(sys->window, &buf, NULL);
info->w = buf.width;
info->h = buf.height;
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