vlc | branch: master | Thomas Guillem <[email protected]> | Thu Nov 24 18:34:30 2016 +0100| [3d9f101c5bded52f243f655bbe86c686fe8f5f41] | committer: Thomas Guillem
vout: android: don't poll window size and mouse events > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3d9f101c5bded52f243f655bbe86c686fe8f5f41 --- modules/video_output/android/display.c | 43 +------------ modules/video_output/android/utils.c | 106 ++++++--------------------------- modules/video_output/android/utils.h | 35 ++++++----- modules/video_output/android/window.c | 35 +++++++++-- 4 files changed, 65 insertions(+), 154 deletions(-) diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c index 16ab0c0..18ea4a2 100644 --- a/modules/video_output/android/display.c +++ b/modules/video_output/android/display.c @@ -77,7 +77,6 @@ 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; @@ -643,19 +642,6 @@ static void SetRGBMask(video_format_t *p_fmt) } } -static void SendEventDisplaySize(vout_display_t *vd) -{ - vout_display_sys_t *sys = vd->sys; - int i_display_width, i_display_height; - - if (AWindowHandler_getWindowSize(sys->p_awh, &i_display_width, &i_display_height) - && i_display_width != 0 && i_display_height != 0 - && (i_display_width != sys->i_display_width - || i_display_height != sys->i_display_height)) - vout_display_SendEventDisplaySize(vd, i_display_width, - i_display_height); -} - static int Open(vlc_object_t *p_this) { vout_display_t *vd = (vout_display_t*)p_this; @@ -750,11 +736,11 @@ static int Open(vlc_object_t *p_this) vd->prepare = Prepare; vd->display = Display; vd->control = Control; - vd->manage = Manage; + vd->manage = NULL; + vd->info.has_event_thread = true; /* Fix initial state */ vout_display_SendEventFullscreen(vd, true); - SendEventDisplaySize(vd); return VLC_SUCCESS; @@ -1011,8 +997,6 @@ static void Prepare(vout_display_t *vd, picture_t *picture, vout_display_sys_t *sys = vd->sys; VLC_UNUSED(picture); - SendEventDisplaySize(vd); - if (subpicture && sys->p_sub_window) { if (sys->b_sub_invalid) { sys->b_sub_invalid = false; @@ -1140,26 +1124,3 @@ static int Control(vout_display_t *vd, int query, va_list args) return VLC_EGENERIC; } } - -static void Manage(vout_display_t *vd) -{ - vout_display_sys_t *sys = vd->sys; - int x, y, button, action; - - if (AWindowHandler_getMouseCoordinates(sys->p_awh, - &action, &button, &x, &y)) - { - 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.c b/modules/video_output/android/utils.c index 83a6e14..8a52b94 100644 --- a/modules/video_output/android/utils.c +++ b/modules/video_output/android/utils.c @@ -33,6 +33,7 @@ struct AWindowHandler { JavaVM *p_jvm; jobject jobj; + vout_window_t *wnd; struct { jobject jsurface; @@ -45,15 +46,9 @@ struct AWindowHandler native_window_api_t anw_api; native_window_priv_api_t anwpriv_api; - vlc_mutex_t lock; struct { bool b_registered; - struct { - int i_action, i_button, i_x, i_y; - } mouse; - struct { - int i_width, i_height; - } window; + awh_events_t cb; } event; }; @@ -458,29 +453,29 @@ AWindowHandler_getEnv(AWindowHandler *p_awh) } AWindowHandler * -AWindowHandler_new(vlc_object_t *p_obj) +AWindowHandler_new(vout_window_t *wnd, awh_events_t *p_events) { AWindowHandler *p_awh; JNIEnv *p_env; - JavaVM *p_jvm = var_InheritAddress(p_obj, "android-jvm"); - jobject jobj = var_InheritAddress(p_obj, "drawable-androidwindow"); + JavaVM *p_jvm = var_InheritAddress(wnd, "android-jvm"); + jobject jobj = var_InheritAddress(wnd, "drawable-androidwindow"); if (!p_jvm || !jobj) { - msg_Err(p_obj, "libvlc_media_player options not set"); + msg_Err(wnd, "libvlc_media_player options not set"); return NULL; } p_env = android_getEnvCommon(NULL, p_jvm, "AWindowHandler"); if (!p_env) { - msg_Err(p_obj, "can't get JNIEnv"); + msg_Err(wnd, "can't get JNIEnv"); return NULL; } - if (InitJNIFields(p_env, p_obj, jobj) != VLC_SUCCESS) + if (InitJNIFields(p_env, VLC_OBJECT(wnd), jobj) != VLC_SUCCESS) { - msg_Err(p_obj, "InitJNIFields failed"); + msg_Err(wnd, "InitJNIFields failed"); return NULL; } p_awh = calloc(1, sizeof(AWindowHandler)); @@ -489,10 +484,10 @@ AWindowHandler_new(vlc_object_t *p_obj) p_awh->p_jvm = p_jvm; p_awh->jobj = (*p_env)->NewGlobalRef(p_env, jobj); LoadNativeWindowAPI(p_awh); - vlc_mutex_init(&p_awh->lock); - p_awh->event.mouse.i_action = p_awh->event.mouse.i_button = - p_awh->event.mouse.i_x = p_awh->event.mouse.i_y = -1; - p_awh->event.window.i_width = p_awh->event.window.i_height = -1; + p_awh->wnd = wnd; + p_awh->event.cb = *p_events; + p_awh->event.b_registered = JNI_CALL(CallBooleanMethod, setCallback, + (jlong)(intptr_t)p_awh); return p_awh; } @@ -550,8 +545,6 @@ AWindowHandler_destroy(AWindowHandler *p_awh) (*p_env)->DeleteGlobalRef(p_env, p_awh->jobj); } - vlc_mutex_destroy(&p_awh->lock); - if (p_awh->p_anw_dl) dlclose(p_awh->p_anw_dl); @@ -638,12 +631,8 @@ AndroidNativeWindow_onMouseEvent(JNIEnv* env, jobject clazz, jlong handle, (void) env; (void) clazz; AWindowHandler *p_awh = jlong_AWindowHandler(handle); - vlc_mutex_lock(&p_awh->lock); - p_awh->event.mouse.i_action = action; - p_awh->event.mouse.i_button = button; - p_awh->event.mouse.i_x = x; - p_awh->event.mouse.i_y = y; - vlc_mutex_unlock(&p_awh->lock); + p_awh->event.cb.on_new_mouse_coords(p_awh->wnd, + & (struct awh_mouse_coords) { action, button, x, y }); } static void @@ -653,69 +642,8 @@ AndroidNativeWindow_onWindowSize(JNIEnv* env, jobject clazz, jlong handle, (void) env; (void) clazz; AWindowHandler *p_awh = jlong_AWindowHandler(handle); - vlc_mutex_lock(&p_awh->lock); - p_awh->event.window.i_width = width; - p_awh->event.window.i_height = height; - vlc_mutex_unlock(&p_awh->lock); -} - -static bool -AWindowHandler_registerCallback(AWindowHandler *p_awh) -{ - if (!p_awh->event.b_registered) - { - JNIEnv *p_env = AWindowHandler_getEnv(p_awh); - if (!p_env) - return false; - p_awh->event.b_registered = JNI_CALL(CallBooleanMethod, - setCallback, - (jlong)(intptr_t)p_awh); - } - return p_awh->event.b_registered; -} - -bool -AWindowHandler_getMouseCoordinates(AWindowHandler *p_awh, - int *p_action, int *p_button, - int *p_x, int *p_y) -{ - if (!AWindowHandler_registerCallback(p_awh)) - return false; - - vlc_mutex_lock(&p_awh->lock); - if (p_awh->event.mouse.i_action == -1 - || p_awh->event.mouse.i_button == -1 - || p_awh->event.mouse.i_x <= 0 || p_awh->event.mouse.i_y <= 0) - { - vlc_mutex_unlock(&p_awh->lock); - return false; - } - *p_action = p_awh->event.mouse.i_action; - *p_button = p_awh->event.mouse.i_button; - *p_x = p_awh->event.mouse.i_x; - *p_y = p_awh->event.mouse.i_y; - vlc_mutex_unlock(&p_awh->lock); - return true; -} - -bool -AWindowHandler_getWindowSize(AWindowHandler *p_awh, - int *p_width, int *p_height) -{ - if (!AWindowHandler_registerCallback(p_awh)) - return false; - - vlc_mutex_lock(&p_awh->lock); - if (p_awh->event.window.i_width <= 0 - || p_awh->event.window.i_height <= 0) - { - vlc_mutex_unlock(&p_awh->lock); - return false; - } - *p_width = p_awh->event.window.i_width; - *p_height = p_awh->event.window.i_height; - vlc_mutex_unlock(&p_awh->lock); - return true; + if (width >= 0 && height >= 0) + p_awh->event.cb.on_new_window_size(p_awh->wnd, width, height); } int diff --git a/modules/video_output/android/utils.h b/modules/video_output/android/utils.h index 79cc15b..31d65e9 100644 --- a/modules/video_output/android/utils.h +++ b/modules/video_output/android/utils.h @@ -74,6 +74,22 @@ typedef struct int (*setOrientation) (native_window_priv *, int); } native_window_priv_api_t; +struct awh_mouse_coords +{ + int i_action; + int i_button; + int i_x; + int i_y; +}; + +typedef struct +{ + void (*on_new_window_size)(vout_window_t *wnd, unsigned i_width, + unsigned i_height); + void (*on_new_mouse_coords)(vout_window_t *wnd, + const struct awh_mouse_coords *coords); +} awh_events_t; + /** * Load a private native window API * @@ -100,7 +116,7 @@ JNIEnv *android_getEnv(vlc_object_t *p_obj, const char *psz_thread_name); * \return a valid AWindowHandler * or NULL. It must be released with * AWindowHandler_destroy. */ -AWindowHandler *AWindowHandler_new(vlc_object_t *p_obj); +AWindowHandler *AWindowHandler_new(vout_window_t *wnd, awh_events_t *p_events); void AWindowHandler_destroy(AWindowHandler *p_awh); /** @@ -112,23 +128,6 @@ void AWindowHandler_destroy(AWindowHandler *p_awh); native_window_api_t *AWindowHandler_getANativeWindowAPI(AWindowHandler *p_awh); /** - * Retrieves the mouse coordinates - * - * \return true if the coordinates are valid. - */ -bool AWindowHandler_getMouseCoordinates(AWindowHandler *p_awh, - int *p_action, int *p_button, - int *p_x, int *p_y); - -/** - * Retrieves the window size - * - * \return true if the size is valid. - */ -bool AWindowHandler_getWindowSize(AWindowHandler *p_awh, - int *p_width, int *p_height); - -/** * Get the Video or the Subtitles Android Surface * * \return the surface in a jobject, or NULL. It should be released with diff --git a/modules/video_output/android/window.c b/modules/video_output/android/window.c index 38e9789..4b752ee 100644 --- a/modules/video_output/android/window.c +++ b/modules/video_output/android/window.c @@ -61,6 +61,29 @@ struct vout_window_sys_t AWindowHandler *p_awh; }; +static void OnNewWindowSize(vout_window_t *wnd, + unsigned i_width, unsigned i_height) +{ + vout_window_ReportSize(wnd, i_width, i_height); +} + +static void OnNewMouseCoords(vout_window_t *wnd, + const struct awh_mouse_coords *coords) +{ + vout_window_ReportMouseMoved(wnd, coords->i_x, coords->i_y); + switch (coords->i_action) + { + case AMOTION_EVENT_ACTION_DOWN: + vout_window_ReportMousePressed(wnd, coords->i_button); + break; + case AMOTION_EVENT_ACTION_UP: + vout_window_ReportMouseReleased(wnd, coords->i_button); + break; + case AMOTION_EVENT_ACTION_MOVE: + break; + } +} + /** * Create an Android native window. */ @@ -73,22 +96,21 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg) vout_window_sys_t *p_sys = malloc(sizeof (*p_sys)); if (p_sys == NULL) return VLC_ENOMEM; + wnd->sys = p_sys; - p_sys->p_awh = AWindowHandler_new(VLC_OBJECT(wnd)); + p_sys->p_awh = AWindowHandler_new(wnd, + &(awh_events_t) { OnNewWindowSize, OnNewMouseCoords }); if (!p_sys->p_awh) goto error; wnd->type = VOUT_WINDOW_TYPE_ANDROID_NATIVE; wnd->handle.anativewindow = p_sys->p_awh; wnd->control = Control; - wnd->sys = p_sys; return VLC_SUCCESS; error: - if (p_sys->p_awh) - AWindowHandler_destroy(p_sys->p_awh); - free(p_sys); + Close(wnd); return VLC_EGENERIC; } @@ -99,7 +121,8 @@ error: static void Close(vout_window_t *wnd) { vout_window_sys_t *p_sys = wnd->sys; - AWindowHandler_destroy(p_sys->p_awh); + if (p_sys->p_awh) + AWindowHandler_destroy(p_sys->p_awh); free (p_sys); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
