[vlc-devel] [PATCH 2/2] Update surface object when it's destroyed and recreated.
Paulo Vitor Magacho da Silva
pvmagacho at gmail.com
Mon Dec 8 14:10:57 CET 2014
Hi,
do you think this patch can be accepted ? I need this to submit the
multiple video instances patch.
Thanks
2014-12-04 23:10 GMT-02:00 Paulo Vitor Magacho da Silva <pvmagacho at gmail.com
>:
> ---
> modules/video_output/android/android_window.c | 14 ++++++++++++++
> modules/video_output/android/surface.c | 23 +++++++++++++++++------
> 2 files changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/modules/video_output/android/android_window.c
> b/modules/video_output/android/android_window.c
> index e584a54..5c50975 100644
> --- a/modules/video_output/android/android_window.c
> +++ b/modules/video_output/android/android_window.c
> @@ -73,6 +73,7 @@ extern void jni_detach_thread();
> extern jobject jni_LockAndGetAndroidJavaSurface();
> extern jobject jni_LockAndGetSubtitlesSurface();
> extern void jni_UnlockAndroidSurface();
> +extern bool jni_LockAndGetIsSurfaceAttached();
>
> 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);
> @@ -954,6 +955,13 @@ static picture_pool_t *Pool(vout_display_t *vd,
> unsigned requested_count)
> {
> vout_display_sys_t *sys = vd->sys;
>
> + if (!jni_LockAndGetIsSurfaceAttached() && sys->pool != NULL) {
> + msg_Dbg(vd, "Surface got destroyed");
> + picture_pool_Release(sys->pool);
> + sys->pool = NULL;
> + }
> + jni_UnlockAndroidSurface();
> +
> if (sys->pool == NULL)
> sys->pool = PoolAlloc(vd, requested_count);
> return sys->pool;
> @@ -982,6 +990,12 @@ static void Prepare(vout_display_t *vd, picture_t
> *picture,
> sys->p_sub_buffer_bounds = NULL;
> }
>
> + if (!jni_LockAndGetIsSurfaceAttached() && sys->p_sub_pic != NULL)
> {
> + picture_Release(sys->p_sub_pic);
> + sys->p_sub_pic = NULL;
> + }
> + jni_UnlockAndroidSurface();
> +
> if (!sys->p_sub_pic && SetupWindowSubtitleSurface(sys) == 0)
> sys->p_sub_pic = PictureAlloc(sys, &sys->p_sub_window->fmt);
> if (!sys->p_spu_blend)
> diff --git a/modules/video_output/android/surface.c
> b/modules/video_output/android/surface.c
> index ce1f922..5ccb102 100644
> --- a/modules/video_output/android/surface.c
> +++ b/modules/video_output/android/surface.c
> @@ -78,6 +78,7 @@ extern int jni_attach_thread(JNIEnv **env, const char
> *thread_name);
> extern void jni_detach_thread();
> extern jobject jni_LockAndGetAndroidJavaSurface();
> extern void jni_UnlockAndroidSurface();
> +extern bool jni_LockAndGetIsSurfaceAttached();
> 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);
> @@ -329,10 +330,8 @@ static int AndroidLockSurface(picture_t *picture)
>
> if (!sys->native_surface) {
> picsys->surf = jni_LockAndGetAndroidJavaSurface();
> - if (unlikely(!picsys->surf)) {
> - jni_UnlockAndroidSurface();
> - return VLC_EGENERIC;
> - }
> + if (unlikely(!picsys->surf))
> + goto error;
> sys->native_surface =
> jni_AndroidJavaSurfaceToNativeSurface(picsys->surf);
> jni_UnlockAndroidSurface();
>
> @@ -361,6 +360,11 @@ static int AndroidLockSurface(picture_t *picture)
> UpdateLayout(sys);
> }
>
> + if (!jni_LockAndGetIsSurfaceAttached()) {
> + sys->native_surface = NULL;
> + goto error;
> + }
> +
> if (sys->s_lock)
> sys->s_lock(sys->native_surface, info, 1);
> else
> @@ -368,14 +372,20 @@ static int AndroidLockSurface(picture_t *picture)
>
> if (info->w != sys->i_alloc_width || info->h != sh) {
> sys->s_unlockAndPost(sys->native_surface);
> - return VLC_EGENERIC;
> + goto error;
> }
>
> + jni_UnlockAndroidSurface();
> +
> 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;
> +
> +error:
> + jni_UnlockAndroidSurface();
> + return VLC_EGENERIC;
> }
>
> static void AndroidUnlockSurface(picture_t *picture)
> @@ -383,8 +393,9 @@ static void AndroidUnlockSurface(picture_t *picture)
> picture_sys_t *picsys = picture->p_sys;
> vout_display_sys_t *sys = picsys->sys;
>
> - if (sys->native_surface)
> + if (jni_LockAndGetIsSurfaceAttached() && sys->native_surface)
> sys->s_unlockAndPost(sys->native_surface);
> + jni_UnlockAndroidSurface();
> }
>
> static void Display(vout_display_t *vd, picture_t *picture, subpicture_t
> *subpicture)
> --
> 1.9.3 (Apple Git-50)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20141208/6ea592d9/attachment.html>
More information about the vlc-devel
mailing list