<div dir="ltr">Hi,<div>do you think this patch can be accepted ? I need this to submit the multiple video instances patch.</div><div>Thanks</div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-12-04 23:10 GMT-02:00 Paulo Vitor Magacho da Silva <span dir="ltr"><<a href="mailto:pvmagacho@gmail.com" target="_blank">pvmagacho@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
modules/video_output/android/android_window.c | 14 ++++++++++++++<br>
modules/video_output/android/surface.c | 23 +++++++++++++++++------<br>
2 files changed, 31 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/modules/video_output/android/android_window.c b/modules/video_output/android/android_window.c<br>
index e584a54..5c50975 100644<br>
--- a/modules/video_output/android/android_window.c<br>
+++ b/modules/video_output/android/android_window.c<br>
@@ -73,6 +73,7 @@ extern void jni_detach_thread();<br>
extern jobject jni_LockAndGetAndroidJavaSurface();<br>
extern jobject jni_LockAndGetSubtitlesSurface();<br>
extern void jni_UnlockAndroidSurface();<br>
+extern bool jni_LockAndGetIsSurfaceAttached();<br>
<br>
extern void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);<br>
extern int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *configured);<br>
@@ -954,6 +955,13 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)<br>
{<br>
vout_display_sys_t *sys = vd->sys;<br>
<br>
+ if (!jni_LockAndGetIsSurfaceAttached() && sys->pool != NULL) {<br>
+ msg_Dbg(vd, "Surface got destroyed");<br>
+ picture_pool_Release(sys->pool);<br>
+ sys->pool = NULL;<br>
+ }<br>
+ jni_UnlockAndroidSurface();<br>
+<br>
if (sys->pool == NULL)<br>
sys->pool = PoolAlloc(vd, requested_count);<br>
return sys->pool;<br>
@@ -982,6 +990,12 @@ static void Prepare(vout_display_t *vd, picture_t *picture,<br>
sys->p_sub_buffer_bounds = NULL;<br>
}<br>
<br>
+ if (!jni_LockAndGetIsSurfaceAttached() && sys->p_sub_pic != NULL) {<br>
+ picture_Release(sys->p_sub_pic);<br>
+ sys->p_sub_pic = NULL;<br>
+ }<br>
+ jni_UnlockAndroidSurface();<br>
+<br>
if (!sys->p_sub_pic && SetupWindowSubtitleSurface(sys) == 0)<br>
sys->p_sub_pic = PictureAlloc(sys, &sys->p_sub_window->fmt);<br>
if (!sys->p_spu_blend)<br>
diff --git a/modules/video_output/android/surface.c b/modules/video_output/android/surface.c<br>
index ce1f922..5ccb102 100644<br>
--- a/modules/video_output/android/surface.c<br>
+++ b/modules/video_output/android/surface.c<br>
@@ -78,6 +78,7 @@ extern int jni_attach_thread(JNIEnv **env, const char *thread_name);<br>
extern void jni_detach_thread();<br>
extern jobject jni_LockAndGetAndroidJavaSurface();<br>
extern void jni_UnlockAndroidSurface();<br>
+extern bool jni_LockAndGetIsSurfaceAttached();<br>
extern void *jni_AndroidJavaSurfaceToNativeSurface(jobject *surf);<br>
extern void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);<br>
extern int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *configured);<br>
@@ -329,10 +330,8 @@ static int AndroidLockSurface(picture_t *picture)<br>
<br>
if (!sys->native_surface) {<br>
picsys->surf = jni_LockAndGetAndroidJavaSurface();<br>
- if (unlikely(!picsys->surf)) {<br>
- jni_UnlockAndroidSurface();<br>
- return VLC_EGENERIC;<br>
- }<br>
+ if (unlikely(!picsys->surf))<br>
+ goto error;<br>
sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf);<br>
jni_UnlockAndroidSurface();<br>
<br>
@@ -361,6 +360,11 @@ static int AndroidLockSurface(picture_t *picture)<br>
UpdateLayout(sys);<br>
}<br>
<br>
+ if (!jni_LockAndGetIsSurfaceAttached()) {<br>
+ sys->native_surface = NULL;<br>
+ goto error;<br>
+ }<br>
+<br>
if (sys->s_lock)<br>
sys->s_lock(sys->native_surface, info, 1);<br>
else<br>
@@ -368,14 +372,20 @@ static int AndroidLockSurface(picture_t *picture)<br>
<br>
if (info->w != sys->i_alloc_width || info->h != sh) {<br>
sys->s_unlockAndPost(sys->native_surface);<br>
- return VLC_EGENERIC;<br>
+ goto error;<br>
}<br>
<br>
+ jni_UnlockAndroidSurface();<br>
+<br>
picture->p[0].p_pixels = (uint8_t*)info->bits;<br>
picture->p[0].i_lines = info->h;<br>
picture->p[0].i_pitch = picture->p[0].i_pixel_pitch * info->s;<br>
<br>
return VLC_SUCCESS;<br>
+<br>
+error:<br>
+ jni_UnlockAndroidSurface();<br>
+ return VLC_EGENERIC;<br>
}<br>
<br>
static void AndroidUnlockSurface(picture_t *picture)<br>
@@ -383,8 +393,9 @@ static void AndroidUnlockSurface(picture_t *picture)<br>
picture_sys_t *picsys = picture->p_sys;<br>
vout_display_sys_t *sys = picsys->sys;<br>
<br>
- if (sys->native_surface)<br>
+ if (jni_LockAndGetIsSurfaceAttached() && sys->native_surface)<br>
sys->s_unlockAndPost(sys->native_surface);<br>
+ jni_UnlockAndroidSurface();<br>
}<br>
<br>
static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.3 (Apple Git-50)<br>
<br>
</font></span></blockquote></div><br></div>