From 918ed4d12d965a6effd6be94b79b4b9f33d718c7 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Mon, 22 Jun 2015 15:36:44 +0200 Subject: [PATCH] android: merge android_surface with android_window This commits remove the android_surface module. The old android surface API is now used by the android_window module via native_window_api_t. --- configure.ac | 10 - modules/MODULES_LIST | 1 - modules/video_output/Makefile.am | 7 - modules/video_output/android/android_window.c | 51 ++- modules/video_output/android/surface.c | 433 ------------------ modules/video_output/android/utils.c | 172 ++++++- modules/video_output/android/utils.h | 24 +- po/POTFILES.in | 1 - 8 files changed, 200 insertions(+), 499 deletions(-) delete mode 100644 modules/video_output/android/surface.c diff --git a/configure.ac b/configure.ac index 05eb82a149..c401f3f3e0 100644 --- a/configure.ac +++ b/configure.ac @@ -3251,16 +3251,6 @@ dnl PKG_ENABLE_MODULES_VLC([SVG], [], [librsvg-2.0 >= 2.9.0], [SVG rendering library],[auto]) PKG_ENABLE_MODULES_VLC([SVGDEC], [], [librsvg-2.0 >= 2.9.0 cairo >= 1.13.1], [SVG image decoder library],[auto]) -dnl -dnl android surface module -dnl -AC_ARG_ENABLE(android-surface, - [ --enable-android-surface Android Surface video output module (default disabled)]) -if test "${enable_android_surface}" = "yes"; then - VLC_ADD_PLUGIN([android_surface]) - VLC_ADD_PLUGIN([android_window]) -fi - dnl dnl Windows DirectX module dnl diff --git a/modules/MODULES_LIST b/modules/MODULES_LIST index e77361358b..0f130b6ee7 100644 --- a/modules/MODULES_LIST +++ b/modules/MODULES_LIST @@ -36,7 +36,6 @@ $Id$ * android_audiotrack: audio output for Android, based on AudioTrack * android_logger: logger output to native Android logs (adb logcat) * android_native_window: Android native window provider module - * android_surface: video output for Android, based on Surface * android_window: Android direct/undirect rendering video output * antiflicker: anti-flicker video filter * araw: Pseudo audio decoder for raw PCM diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am index 2c8f9304cf..f052702d66 100644 --- a/modules/video_output/Makefile.am +++ b/modules/video_output/Makefile.am @@ -276,16 +276,9 @@ libandroid_window_plugin_la_LIBADD = $(LIBDL) libandroid_window_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)' EXTRA_LTLIBRARIES += libandroid_window_plugin.la -libandroid_surface_plugin_la_SOURCES = video_output/android/surface.c video_output/android/utils.c video_output/android/utils.h -libandroid_surface_plugin_la_CFLAGS = $(AM_CFLAGS) -libandroid_surface_plugin_la_LIBADD = $(LIBDL) -libandroid_surface_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)' -EXTRA_LTLIBRARIES += libandroid_surface_plugin.la - if HAVE_ANDROID vout_LTLIBRARIES += libandroid_native_window_plugin.la vout_LTLIBRARIES += $(LTLIBandroid_window) -vout_LTLIBRARIES += $(LTLIBandroid_surface) if HAVE_EGL vout_LTLIBRARIES += libegl_android_plugin.la endif diff --git a/modules/video_output/android/android_window.c b/modules/video_output/android/android_window.c index a1de1d6802..1beef8e99d 100644 --- a/modules/video_output/android/android_window.c +++ b/modules/video_output/android/android_window.c @@ -75,6 +75,7 @@ extern void jni_UnlockAndroidSurface(); extern void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den); extern int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *configured); extern int jni_GetWindowSize(int *width, int *height); +extern void jni_getMouseCoordinates(int *, int *, int *, int *); static const vlc_fourcc_t subpicture_chromas[] = { @@ -85,6 +86,7 @@ static const vlc_fourcc_t subpicture_chromas[] = static picture_pool_t *Pool (vout_display_t *, unsigned); static void Prepare(vout_display_t *, picture_t *, subpicture_t *); static void Display(vout_display_t *, picture_t *, subpicture_t *); +static void Manage(vout_display_t *vd); static int Control(vout_display_t *, int, va_list); typedef struct android_window android_window; @@ -137,6 +139,25 @@ struct vout_display_sys_t uint8_t hash[16]; }; +#define PRIV_WINDOW_FORMAT_YV12 0x32315659 + +static inline int ChromaToAndroidHal(vlc_fourcc_t i_chroma) +{ + switch (i_chroma) { + case VLC_CODEC_YV12: + case VLC_CODEC_I420: + return PRIV_WINDOW_FORMAT_YV12; + case VLC_CODEC_RGB16: + return WINDOW_FORMAT_RGB_565; + case VLC_CODEC_RGB32: + return WINDOW_FORMAT_RGBX_8888; + case VLC_CODEC_RGBA: + return WINDOW_FORMAT_RGBA_8888; + default: + return -1; + } +} + static int UpdateWindowSize(video_format_t *p_fmt, bool b_cropped) { unsigned int i_width, i_height; @@ -479,7 +500,7 @@ static int AndroidWindow_SetupANW(vout_display_sys_t *sys, p_window->i_pic_count = 1; p_window->i_min_undequeued = 0; - if (!b_java_configured) + if (!b_java_configured && sys->anw.setBuffersGeometry) return sys->anw.setBuffersGeometry(p_window->p_handle, p_window->fmt.i_width, p_window->fmt.i_height, @@ -631,9 +652,10 @@ static int Open(vlc_object_t *p_this) return VLC_ENOMEM; sys->p_library = LoadNativeWindowAPI(&sys->anw); - if (!sys->p_library) { - msg_Err(vd, "Could not initialize NativeWindow API."); - goto error; + if (!sys->p_library) + { + msg_Warn(vd, "Using old Android Surface"); + LoadNativeSurfaceAPI(&sys->anw); } #ifdef USE_ANWP @@ -1103,3 +1125,24 @@ static int Control(vout_display_t *vd, int query, va_list args) return VLC_EGENERIC; } } + +static void Manage(vout_display_t *vd) +{ + int x, y, button, action; + jni_getMouseCoordinates(&action, &button, &x, &y); + if (x >= 0 && y >= 0) + { + switch( action ) + { + case AMOTION_EVENT_ACTION_DOWN: + vout_display_SendEventMouseMoved(vd, x, y); + vout_display_SendEventMousePressed(vd, button); break; + case AMOTION_EVENT_ACTION_UP: + vout_display_SendEventMouseMoved(vd, x, y); + vout_display_SendEventMouseReleased(vd, button); break; + case AMOTION_EVENT_ACTION_MOVE: + vout_display_SendEventMouseMoved(vd, x, y); break; + } + } +} + diff --git a/modules/video_output/android/surface.c b/modules/video_output/android/surface.c deleted file mode 100644 index 15e1f546de..0000000000 --- a/modules/video_output/android/surface.c +++ /dev/null @@ -1,433 +0,0 @@ -/***************************************************************************** - * androidsurface.c: android video output using Surface Flinger - ***************************************************************************** - * Copyright © 2011 VideoLAN - * - * Authors: Ming Hu - * Ludovic Fauvet - * Sébastien Toque - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include - -#include "utils.h" - -#ifndef ANDROID_SYM_S_LOCK -# define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb" -#endif -#ifndef ANDROID_SYM_S_LOCK2 -# define ANDROID_SYM_S_LOCK2 "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE" -#endif -#ifndef ANDROID_SYM_S_UNLOCK -# define ANDROID_SYM_S_UNLOCK "_ZN7android7Surface13unlockAndPostEv" -#endif - -/***************************************************************************** - * Module descriptor - *****************************************************************************/ -#define CHROMA_TEXT N_("Chroma used") -#define CHROMA_LONGTEXT N_(\ - "Force use of a specific chroma for output. Default is RGB32.") - -#define CFG_PREFIX "androidsurface-" - -static int Open (vlc_object_t *); -static void Close(vlc_object_t *); - -vlc_module_begin() - set_category(CAT_VIDEO) - set_subcategory(SUBCAT_VIDEO_VOUT) - set_shortname("AndroidSurface") - set_description(N_("Android Surface video output")) - set_capability("vout display", 155) - add_shortcut("androidsurface", "android") - add_string(CFG_PREFIX "chroma", NULL, CHROMA_TEXT, CHROMA_LONGTEXT, true) - set_callbacks(Open, Close) -vlc_module_end() - -/***************************************************************************** - * JNI prototypes - *****************************************************************************/ - -extern jobject jni_LockAndGetAndroidJavaSurface(); -extern void jni_UnlockAndroidSurface(); -extern void *jni_AndroidJavaSurfaceToNativeSurface(jobject surf); -extern void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den); -extern int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *configured); - -// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEb -typedef void (*Surface_lock)(void *, void *, int); -// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE -typedef void (*Surface_lock2)(void *, void *, void *); -// _ZN7android7Surface13unlockAndPostEv -typedef void (*Surface_unlockAndPost)(void *); - -/***************************************************************************** - * Local prototypes - *****************************************************************************/ - -static picture_pool_t *Pool (vout_display_t *, unsigned); -static void Display(vout_display_t *, picture_t *, subpicture_t *); -static int Control(vout_display_t *, int, va_list); - -/* */ -typedef struct _SurfaceInfo { - uint32_t w; - uint32_t h; - uint32_t s; - uint32_t usage; - uint32_t format; - uint32_t* bits; - uint32_t reserved[2]; -} SurfaceInfo; - -/* */ -struct vout_display_sys_t { - picture_pool_t *pool; - void *p_library; - Surface_lock s_lock; - Surface_lock2 s_lock2; - Surface_unlockAndPost s_unlockAndPost; - - jobject jsurf; - void *native_surface; - - int i_android_hal; - unsigned int i_alloc_width; - unsigned int i_alloc_height; - - video_format_t fmt; -}; - -struct picture_sys_t { - void *surf; - SurfaceInfo info; - vout_display_sys_t *sys; -}; - -static int AndroidLockSurface(picture_t *); -static void AndroidUnlockSurface(picture_t *); - -static inline void *LoadSurface(const char *psz_lib, vout_display_sys_t *sys) -{ - void *p_library = dlopen(psz_lib, RTLD_NOW); - if (!p_library) - return NULL; - - sys->s_lock = (Surface_lock)(dlsym(p_library, ANDROID_SYM_S_LOCK)); - sys->s_lock2 = (Surface_lock2)(dlsym(p_library, ANDROID_SYM_S_LOCK2)); - sys->s_unlockAndPost = - (Surface_unlockAndPost)(dlsym(p_library, ANDROID_SYM_S_UNLOCK)); - - if ((sys->s_lock || sys->s_lock2) && sys->s_unlockAndPost) - return p_library; - - dlclose(p_library); - return NULL; -} - -static void *InitLibrary(vout_display_sys_t *sys) -{ - static const char *libs[] = { - "libsurfaceflinger_client.so", - "libgui.so", - "libui.so" - }; - - for (size_t i = 0; i < sizeof(libs) / sizeof(*libs); i++) { - void *lib = LoadSurface(libs[i], sys); - if (lib) - return lib; - } - return NULL; -} - -static void UpdateLayout(vout_display_sys_t *sys) -{ - unsigned int i_sar_num = 1, i_sar_den = 1; - unsigned int i_width, i_height; - - if (sys->fmt.i_sar_num != 0 && sys->fmt.i_sar_den != 0) { - i_sar_num = sys->fmt.i_sar_num; - i_sar_den = sys->fmt.i_sar_den; - } - if (sys->i_alloc_width != 0 && sys->i_alloc_height != 0) { - i_width = sys->i_alloc_width; - i_height = sys->i_alloc_height; - } else { - i_width = sys->fmt.i_width; - i_height = sys->fmt.i_height; - } - - jni_SetSurfaceLayout(i_width, i_height, - sys->fmt.i_visible_width, - sys->fmt.i_visible_height, - i_sar_num, - i_sar_den); -} - -static int Open(vlc_object_t *p_this) -{ - vout_display_t *vd = (vout_display_t *)p_this; - video_format_t fmt; - video_format_ApplyRotation(&fmt, &vd->fmt); - - if (fmt.i_chroma == VLC_CODEC_ANDROID_OPAQUE) - return VLC_EGENERIC; - if (vout_display_IsWindowed(vd)) - return VLC_EGENERIC; - - /* Allocate structure */ - vout_display_sys_t *sys = (struct vout_display_sys_t*) calloc(1, sizeof(*sys)); - if (!sys) - goto error; - - /* */ - sys->p_library = InitLibrary(sys); - if (!sys->p_library) { - msg_Err(vd, "Could not initialize libandroid.so/libui.so/libgui.so/libsurfaceflinger_client.so!"); - goto error; - } - - /* Setup chroma */ - char *psz_fcc = var_InheritString(vd, CFG_PREFIX "chroma"); - if( psz_fcc ) { - fmt.i_chroma = vlc_fourcc_GetCodecFromString(VIDEO_ES, psz_fcc); - free(psz_fcc); - } else - fmt.i_chroma = VLC_CODEC_RGB32; - - switch(fmt.i_chroma) { - case VLC_CODEC_RGB16: - fmt.i_bmask = 0x0000001f; - fmt.i_gmask = 0x000007e0; - fmt.i_rmask = 0x0000f800; - break; - - case VLC_CODEC_YV12: - case VLC_CODEC_I420: - fmt.i_chroma = VLC_CODEC_RGB32; - case VLC_CODEC_RGB32: - fmt.i_rmask = 0x000000ff; - fmt.i_gmask = 0x0000ff00; - fmt.i_bmask = 0x00ff0000; - break; - - default: - return VLC_EGENERIC; - } - video_format_FixRgb(&fmt); - - msg_Dbg(vd, "Pixel format %4.4s", (char*)&fmt.i_chroma); - sys->i_android_hal = ChromaToAndroidHal(fmt.i_chroma); - if (sys->i_android_hal == -1) - goto error; - - sys->fmt = fmt; - UpdateLayout(sys); - - /* Create the associated picture */ - picture_sys_t *picsys = calloc(1, sizeof(picture_sys_t)); - if (unlikely(picsys == NULL)) - goto error; - picsys->sys = sys; - - picture_resource_t resource = { .p_sys = picsys }; - picture_t *picture = picture_NewFromResource(&fmt, &resource); - if (!picture) { - free(picsys); - goto error; - } - - /* Wrap it into a picture pool */ - picture_pool_configuration_t pool_cfg; - memset(&pool_cfg, 0, sizeof(pool_cfg)); - pool_cfg.picture_count = 1; - pool_cfg.picture = &picture; - pool_cfg.lock = AndroidLockSurface; - pool_cfg.unlock = AndroidUnlockSurface; - - sys->pool = picture_pool_NewExtended(&pool_cfg); - if (!sys->pool) { - picture_Release(picture); - goto error; - } - - /* Setup vout_display */ - vd->sys = sys; - vd->fmt = fmt; - vd->pool = Pool; - vd->display = Display; - vd->control = Control; - vd->prepare = NULL; - vd->manage = Manage; - - /* Fix initial state */ - vout_display_SendEventFullscreen(vd, false); - - return VLC_SUCCESS; - -error: - Close(p_this); - return VLC_ENOMEM; -} - -static void Close(vlc_object_t *p_this) -{ - vout_display_t *vd = (vout_display_t *)p_this; - vout_display_sys_t *sys = vd->sys; - - if (sys) { - if (sys->pool) - picture_pool_Release(sys->pool); - if (sys->p_library) - dlclose(sys->p_library); - free(sys); - } -} - -static picture_pool_t *Pool(vout_display_t *vd, unsigned count) -{ - VLC_UNUSED(count); - - return vd->sys->pool; -} - -static int AndroidLockSurface(picture_t *picture) -{ - picture_sys_t *picsys = picture->p_sys; - vout_display_sys_t *sys = picsys->sys; - SurfaceInfo *info = &picsys->info; - uint32_t sw, sh; - - if (!sys->native_surface) { - picsys->surf = jni_LockAndGetAndroidJavaSurface(); - if (unlikely(!picsys->surf)) { - jni_UnlockAndroidSurface(); - return VLC_EGENERIC; - } - sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf); - jni_UnlockAndroidSurface(); - - if (!sys->native_surface) - return VLC_EGENERIC; - } - - sw = sys->fmt.i_width; - sh = sys->fmt.i_height; - // For RGB (32 or 16) we need to align on 8 or 4 pixels, 16 pixels for YUV - int align_pixels = (16 / picture->p[0].i_pixel_pitch) - 1; - uint32_t aligned_width = (sw + align_pixels) & ~align_pixels; - - if (aligned_width != sys->i_alloc_width || sh != sys->i_alloc_height) { - bool configured; - if (jni_ConfigureSurface(picsys->surf, - aligned_width, - sh, - sys->i_android_hal, - &configured) == -1 || !configured) { - return VLC_EGENERIC; - } - sys->i_alloc_width = aligned_width; - sys->i_alloc_height = sh; - sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf); - UpdateLayout(sys); - } - - if (sys->s_lock) - sys->s_lock(sys->native_surface, info, 1); - else - sys->s_lock2(sys->native_surface, info, NULL); - - if (info->w != sys->i_alloc_width || info->h != sh) { - sys->s_unlockAndPost(sys->native_surface); - return VLC_EGENERIC; - } - - picture->p[0].p_pixels = (uint8_t*)info->bits; - picture->p[0].i_lines = info->h; - picture->p[0].i_pitch = picture->p[0].i_pixel_pitch * info->s; - - return VLC_SUCCESS; -} - -static void AndroidUnlockSurface(picture_t *picture) -{ - picture_sys_t *picsys = picture->p_sys; - vout_display_sys_t *sys = picsys->sys; - - if (sys->native_surface) - sys->s_unlockAndPost(sys->native_surface); -} - -static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture) -{ - VLC_UNUSED(vd); - VLC_UNUSED(subpicture); - - /* refcount lowers to 0, and pool_cfg.unlock is called */ - - picture_Release(picture); -} - -static int Control(vout_display_t *vd, int query, va_list args) -{ - VLC_UNUSED(args); - - switch (query) { - case VOUT_DISPLAY_HIDE_MOUSE: - return VLC_SUCCESS; - - case VOUT_DISPLAY_CHANGE_SOURCE_CROP: - case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT: - { - vout_display_sys_t *sys = vd->sys; - - const video_format_t *source = (const video_format_t *)va_arg(args, const video_format_t *); - - if (query == VOUT_DISPLAY_CHANGE_SOURCE_CROP) { - video_format_CopyCrop(&sys->fmt, source); - } else { - sys->fmt.i_sar_num = source->i_sar_num; - sys->fmt.i_sar_den = source->i_sar_den; - } - UpdateLayout(sys); - - return VLC_SUCCESS; - } - - default: - msg_Err(vd, "Unknown request in android vout display"); - - case VOUT_DISPLAY_CHANGE_FULLSCREEN: - case VOUT_DISPLAY_CHANGE_WINDOW_STATE: - case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE: - case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED: - case VOUT_DISPLAY_CHANGE_ZOOM: - return VLC_EGENERIC; - } -} diff --git a/modules/video_output/android/utils.c b/modules/video_output/android/utils.c index 93b57ade2d..a2dbf99423 100644 --- a/modules/video_output/android/utils.c +++ b/modules/video_output/android/utils.c @@ -22,6 +22,151 @@ #include "utils.h" #include +/* + * Android Surface (pre android 2.3) + */ + +extern void *jni_AndroidJavaSurfaceToNativeSurface(jobject surf); +#ifndef ANDROID_SYM_S_LOCK +# define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb" +#endif +#ifndef ANDROID_SYM_S_LOCK2 +# define ANDROID_SYM_S_LOCK2 "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE" +#endif +#ifndef ANDROID_SYM_S_UNLOCK +# define ANDROID_SYM_S_UNLOCK "_ZN7android7Surface13unlockAndPostEv" +#endif +typedef void (*AndroidSurface_lock)(void *, void *, int); +typedef void (*AndroidSurface_lock2)(void *, void *, void *); +typedef void (*AndroidSurface_unlockAndPost)(void *); + +typedef struct { + void *p_dl_handle; + void *p_surface_handle; + AndroidSurface_lock pf_lock; + AndroidSurface_lock2 pf_lock2; + AndroidSurface_unlockAndPost pf_unlockAndPost; +} NativeSurface; + +static inline void * +NativeSurface_Load(const char *psz_lib, NativeSurface *p_ns) +{ + void *p_lib = dlopen(psz_lib, RTLD_NOW); + if (!p_lib) + return NULL; + + p_ns->pf_lock = (AndroidSurface_lock)(dlsym(p_lib, ANDROID_SYM_S_LOCK)); + p_ns->pf_lock2 = (AndroidSurface_lock2)(dlsym(p_lib, ANDROID_SYM_S_LOCK2)); + p_ns->pf_unlockAndPost = + (AndroidSurface_unlockAndPost)(dlsym(p_lib, ANDROID_SYM_S_UNLOCK)); + + if ((p_ns->pf_lock || p_ns->pf_lock2) && p_ns->pf_unlockAndPost) + return p_lib; + + dlclose(p_lib); + return NULL; +} + + +static ANativeWindow* +NativeSurface_fromSurface(JNIEnv *env, jobject jsurf) +{ + (void) env; + void *p_surface_handle; + NativeSurface *p_ns; + + static const char *libs[] = { + "libsurfaceflinger_client.so", + "libgui.so", + "libui.so" + }; + p_surface_handle = jni_AndroidJavaSurfaceToNativeSurface(jsurf); + if (!p_surface_handle) + return NULL; + p_ns = malloc(sizeof(NativeSurface)); + if (!p_ns) + return NULL; + p_ns->p_surface_handle = p_surface_handle; + + for (size_t i = 0; i < sizeof(libs) / sizeof(*libs); i++) + { + void *p_dl_handle = NativeSurface_Load(libs[i], p_ns); + if (p_dl_handle) + { + p_ns->p_dl_handle = p_dl_handle; + return (ANativeWindow*)p_ns; + } + } + free(p_ns); + return NULL; +} + +static void +NativeSurface_release(ANativeWindow* p_anw) +{ + NativeSurface *p_ns = (NativeSurface *)p_anw; + + dlclose(p_ns->p_dl_handle); + free(p_ns); +} + +static int32_t +NativeSurface_lock(ANativeWindow *p_anw, ANativeWindow_Buffer *p_anb, + ARect *p_rect) +{ + (void) p_rect; + NativeSurface *p_ns = (NativeSurface *)p_anw; + struct { + uint32_t w; + uint32_t h; + uint32_t s; + uint32_t usage; + uint32_t format; + uint32_t* bits; + uint32_t reserved[2]; + } info = { 0 }; + + if (p_ns->pf_lock) + p_ns->pf_lock(p_ns->p_surface_handle, &info, 1); + else + p_ns->pf_lock2(p_ns->p_surface_handle, &info, NULL); + + if (!info.w || !info.h) { + p_ns->pf_unlockAndPost(p_ns->p_surface_handle); + return -1; + } + + if (p_anb) { + p_anb->bits = info.bits; + p_anb->width = info.w; + p_anb->height = info.h; + p_anb->stride = info.s; + p_anb->format = info.format; + } + return 0; +} + +static void +NativeSurface_unlockAndPost(ANativeWindow *p_anw) +{ + NativeSurface *p_ns = (NativeSurface *)p_anw; + + p_ns->pf_unlockAndPost(p_ns->p_surface_handle); +} + +void LoadNativeSurfaceAPI(native_window_api_t *native) +{ + native->winFromSurface = NativeSurface_fromSurface; + native->winRelease = NativeSurface_release; + native->winLock = NativeSurface_lock; + native->unlockAndPost = NativeSurface_unlockAndPost; + native->setBuffersGeometry = NULL; +} + +/* + * Android NativeWindow (post android 2.3) + */ + void *LoadNativeWindowAPI(native_window_api_t *native) { void *p_library = dlopen("libandroid.so", RTLD_NOW); @@ -53,6 +198,10 @@ void *LoadNativeWindowAPI(native_window_api_t *native) return NULL; } +/* + * Android private NativeWindow (post android 2.3) + */ + int LoadNativeWindowPrivAPI(native_window_priv_api_t *native) { native->connect = dlsym(RTLD_DEFAULT, "ANativeWindowPriv_connect"); @@ -77,26 +226,3 @@ int LoadNativeWindowPrivAPI(native_window_priv_api_t *native) native->dequeue && native->lock && native->lockData && native->unlockData && native->queue && native->cancel && native->setOrientation ? 0 : -1; } - -extern void jni_getMouseCoordinates(int *, int *, int *, int *); - -void Manage(vout_display_t *vd) -{ - int x, y, button, action; - jni_getMouseCoordinates(&action, &button, &x, &y); - if (x >= 0 && y >= 0) - { - switch( action ) - { - case AMOTION_EVENT_ACTION_DOWN: - vout_display_SendEventMouseMoved(vd, x, y); - vout_display_SendEventMousePressed(vd, button); break; - case AMOTION_EVENT_ACTION_UP: - vout_display_SendEventMouseMoved(vd, x, y); - vout_display_SendEventMouseReleased(vd, button); break; - case AMOTION_EVENT_ACTION_MOVE: - vout_display_SendEventMouseMoved(vd, x, y); break; - } - } -} - diff --git a/modules/video_output/android/utils.h b/modules/video_output/android/utils.h index 2c649ccc3f..91a790980c 100644 --- a/modules/video_output/android/utils.h +++ b/modules/video_output/android/utils.h @@ -43,32 +43,16 @@ typedef struct ptr_ANativeWindow_release winRelease; ptr_ANativeWindow_lock winLock; ptr_ANativeWindow_unlockAndPost unlockAndPost; - ptr_ANativeWindow_setBuffersGeometry setBuffersGeometry; + ptr_ANativeWindow_setBuffersGeometry setBuffersGeometry; /* can be NULL */ } native_window_api_t; /* Fill the structure passed as parameter and return a library handle that should be destroyed with dlclose. */ void *LoadNativeWindowAPI(native_window_api_t *native); -void Manage(vout_display_t *); -#define PRIV_WINDOW_FORMAT_YV12 0x32315659 - -static inline int ChromaToAndroidHal(vlc_fourcc_t i_chroma) -{ - switch (i_chroma) { - case VLC_CODEC_YV12: - case VLC_CODEC_I420: - return PRIV_WINDOW_FORMAT_YV12; - case VLC_CODEC_RGB16: - return WINDOW_FORMAT_RGB_565; - case VLC_CODEC_RGB32: - return WINDOW_FORMAT_RGBX_8888; - case VLC_CODEC_RGBA: - return WINDOW_FORMAT_RGBA_8888; - default: - return -1; - } -} +/* Pre Android 2.3 NativeSurface, no need to free a handle, + * native->sys->anwp.setBuffersGeometry will be NULL. */ +void LoadNativeSurfaceAPI(native_window_api_t *native); typedef struct native_window_priv native_window_priv; typedef native_window_priv *(*ptr_ANativeWindowPriv_connect) (void *); diff --git a/po/POTFILES.in b/po/POTFILES.in index 3df64efc5e..c819d60659 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1168,7 +1168,6 @@ modules/video_filter/yuvp.c modules/video_output/aa.c modules/video_output/android/android_window.c modules/video_output/android/nativewindow.c -modules/video_output/android/surface.c modules/video_output/caca.c modules/video_output/caopengllayer.m modules/video_output/decklink.cpp