[vlc-devel] [PATCH 2/2] Update surface object when it's destroyed and recreated.
Paulo Vitor Magacho da Silva
pvmagacho at gmail.com
Fri Dec 5 02:10:18 CET 2014
---
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)
More information about the vlc-devel
mailing list