[vlc-devel] [PATCH 4/4] Add support to play multiple video instances in Android.
Paulo Vitor Magacho da Silva
pvmagacho at gmail.com
Thu Dec 11 04:16:59 CET 2014
---
modules/codec/omxil/android_mediacodec.c | 30 +++++++++-----
modules/codec/omxil/omxil.c | 27 +++++++++----
modules/codec/omxil/omxil.h | 3 ++
modules/video_output/android/android_window.c | 58 ++++++++++++++++-----------
modules/video_output/android/nativewindow.c | 14 +++----
modules/video_output/android/surface.c | 47 ++++++++++++++--------
modules/video_output/android/utils.h | 3 ++
7 files changed, 119 insertions(+), 63 deletions(-)
diff --git a/modules/codec/omxil/android_mediacodec.c b/modules/codec/omxil/android_mediacodec.c
index 2d0d346..015a27c 100644
--- a/modules/codec/omxil/android_mediacodec.c
+++ b/modules/codec/omxil/android_mediacodec.c
@@ -50,13 +50,15 @@
#define THREAD_NAME "android_mediacodec"
+typedef struct android_surf_value_t android_surf_value_t;
+
extern int jni_attach_thread(JNIEnv **env, const char *thread_name);
extern void jni_detach_thread();
/* JNI functions to get/set an Android Surface object. */
-extern jobject jni_LockAndGetAndroidJavaSurface();
-extern void jni_UnlockAndroidSurface();
-extern void jni_EventHardwareAccelerationError();
-extern bool jni_IsVideoPlayerActivityCreated();
+extern jobject jni_LockAndGetAndroidJavaSurface(android_surf_value_t *object);
+extern void jni_UnlockAndroidSurface(android_surf_value_t *object);
+extern void jni_EventHardwareAccelerationError(android_surf_value_t *android_surface);
+extern bool jni_IsVideoPlayerActivityCreated(android_surf_value_t *android_surface);
/* Implementation of a circular buffer of timestamps with overwriting
* of older values. MediaCodec has only one type of timestamp, if a
@@ -172,6 +174,8 @@ struct decoder_sys_t
picture_t** inflight_picture; /**< stores the inflight picture for each output buffer or NULL */
timestamp_fifo_t *timestamp_fifo;
+
+ android_surf_value_t *object;
};
enum Types
@@ -325,6 +329,12 @@ static int OpenDecoder(vlc_object_t *p_this)
if ((p_dec->p_sys = p_sys = calloc(1, sizeof(*p_sys))) == NULL)
return VLC_ENOMEM;
+ p_sys->object = var_CreateGetAddress (p_dec, "drawable-androidobject");
+ if (!p_sys->object) {
+ msg_Warn(p_dec, "No android_surf_value_t set.");
+ return VLC_EGENERIC;
+ }
+
p_dec->pf_decode_video = DecodeVideo;
p_dec->fmt_out.i_cat = p_dec->fmt_in.i_cat;
@@ -504,7 +514,7 @@ static int OpenDecoder(vlc_object_t *p_this)
/* If the VideoPlayerActivity is not started, MediaCodec opaque
direct rendering should be disabled since no surface will be
attached to the JNI. */
- p_sys->direct_rendering = jni_IsVideoPlayerActivityCreated() && var_InheritBool(p_dec, CFG_PREFIX "dr");
+ p_sys->direct_rendering = jni_IsVideoPlayerActivityCreated(p_sys->object) && var_InheritBool(p_dec, CFG_PREFIX "dr");
if (p_sys->direct_rendering) {
if (p_dec->fmt_in.video.orientation != ORIENT_NORMAL) {
int i_angle;
@@ -527,14 +537,14 @@ static int OpenDecoder(vlc_object_t *p_this)
i_angle);
}
- jobject surf = jni_LockAndGetAndroidJavaSurface();
+ jobject surf = jni_LockAndGetAndroidJavaSurface(p_sys->object);
if (surf) {
// Configure MediaCodec with the Android surface.
(*env)->CallVoidMethod(env, p_sys->codec, p_sys->configure, format, surf, NULL, 0);
if ((*env)->ExceptionOccurred(env)) {
msg_Warn(p_dec, "Exception occurred in MediaCodec.configure with an output surface.");
(*env)->ExceptionClear(env);
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(p_sys->object);
goto error;
}
p_dec->fmt_out.i_codec = VLC_CODEC_ANDROID_OPAQUE;
@@ -542,7 +552,7 @@ static int OpenDecoder(vlc_object_t *p_this)
msg_Warn(p_dec, "Failed to get the Android Surface, disabling direct rendering.");
p_sys->direct_rendering = false;
}
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(p_sys->object);
}
if (!p_sys->direct_rendering) {
(*env)->CallVoidMethod(env, p_sys->codec, p_sys->configure, format, NULL, NULL, 0);
@@ -597,6 +607,8 @@ static void CloseDecoder(vlc_object_t *p_this)
if (!p_sys)
return;
+ var_Destroy (p_dec, "drawable-androidobject");
+
/* Invalidate all pictures that are currently in flight in order
* to prevent the vout from using destroyed output buffers. */
if (p_sys->direct_rendering)
@@ -906,7 +918,7 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
block_Release(p_block);
if (!p_sys->error_event_sent) {
/* Signal the error to the Java. */
- jni_EventHardwareAccelerationError();
+ jni_EventHardwareAccelerationError(p_sys->object);
p_sys->error_event_sent = true;
}
return NULL;
diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
index 03814d0..5c58f07 100644
--- a/modules/codec/omxil/omxil.c
+++ b/modules/codec/omxil/omxil.c
@@ -70,9 +70,9 @@
#define THREAD_NAME "omxil"
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_IsVideoPlayerActivityCreated();
+extern jobject jni_LockAndGetAndroidJavaSurface(android_surf_value_t *object);
+extern void jni_UnlockAndroidSurface(android_surf_value_t *object);
+extern bool jni_IsVideoPlayerActivityCreated(android_surf_value_t *android_surface);
#endif
/*****************************************************************************
@@ -489,7 +489,7 @@ static OMX_ERRORTYPE AllocateBuffers(decoder_t *p_dec, OmxPort *p_port)
p_port->i_port_index, 0,
p_port->definition.nBufferSize);
OMX_DBG( "OMX_AllocateBuffer(%d) %p, %p", def->eDir,
- p_port->pp_buffers[i], p_port->pp_buffers[i] ?
+ p_port->pp_buffers[i], p_port->pp_buffers[i] ?
p_port->pp_buffers[i]->pBuffer : NULL );
}
@@ -1056,6 +1056,15 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode )
return VLC_ENOMEM;
}
+#if defined(USE_IOMX)
+ p_sys->object = var_CreateGetAddress (p_dec, "drawable-androidobject");
+ if (!p_sys->object) {
+ msg_Warn(p_dec, "No android_surf_value_t set.");
+ DeinitOmxCore();
+ return VLC_EGENERIC;
+ }
+#endif
+
/* Initialise the thread properties */
if(!b_encode)
{
@@ -1078,7 +1087,7 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode )
p_sys->in.p_fmt = &p_dec->fmt_in;
OMX_FIFO_INIT (&p_sys->out.fifo, pInputPortPrivate );
#if defined(USE_IOMX)
- p_sys->out.b_direct = jni_IsVideoPlayerActivityCreated() && var_InheritBool(p_dec, CFG_PREFIX "dr");
+ p_sys->out.b_direct = jni_IsVideoPlayerActivityCreated(p_sys->object) && var_InheritBool(p_dec, CFG_PREFIX "dr");
#else
p_sys->out.b_direct = false;
#endif
@@ -1913,6 +1922,8 @@ static void CloseGeneric( vlc_object_t *p_this )
OMX_FIFO_DESTROY( &p_sys->in.fifo );
OMX_FIFO_DESTROY( &p_sys->out.fifo );
+ var_Destroy (p_dec, "drawable-androidobject");
+
free( p_sys );
}
@@ -2089,9 +2100,9 @@ static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port )
goto error;
}
- surf = jni_LockAndGetAndroidJavaSurface();
+ surf = jni_LockAndGetAndroidJavaSurface(p_dec->p_sys->object);
if( !surf ) {
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(p_dec->p_sys->object);
msg_Warn( p_dec, "jni_LockAndGetAndroidJavaSurface failed" );
goto error;
}
@@ -2100,7 +2111,7 @@ static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port )
p_port->p_hwbuf->window = p_port->p_hwbuf->native_window.winFromSurface( p_env, surf );
jni_detach_thread();
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(p_dec->p_sys->object);
if( !p_port->p_hwbuf->window ) {
msg_Warn( p_dec, "winFromSurface failed" );
goto error;
diff --git a/modules/codec/omxil/omxil.h b/modules/codec/omxil/omxil.h
index 911f5f6..02279a3 100644
--- a/modules/codec/omxil/omxil.h
+++ b/modules/codec/omxil/omxil.h
@@ -138,4 +138,7 @@ struct decoder_sys_t
size_t i_nal_size_length; /* Length of the NAL size field for H264 */
int b_use_pts;
+#if defined(USE_IOMX)
+ android_surf_value_t *object;
+#endif
};
diff --git a/modules/video_output/android/android_window.c b/modules/video_output/android/android_window.c
index 5c50975..eee7719 100644
--- a/modules/video_output/android/android_window.c
+++ b/modules/video_output/android/android_window.c
@@ -70,14 +70,15 @@ vlc_module_end()
extern int jni_attach_thread(JNIEnv **env, const char *thread_name);
extern void jni_detach_thread();
-extern jobject jni_LockAndGetAndroidJavaSurface();
-extern jobject jni_LockAndGetSubtitlesSurface();
-extern void jni_UnlockAndroidSurface();
-extern bool jni_LockAndGetIsSurfaceAttached();
+extern jobject jni_LockAndGetAndroidJavaSurface(android_surf_value_t *object);
+extern jobject jni_LockAndGetSubtitlesSurface(android_surf_value_t *object);
-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_UnlockAndroidSurface(android_surf_value_t *object);
+extern bool jni_LockAndGetIsSurfaceAttached(android_surf_value_t *object);
+
+extern void jni_SetSurfaceLayout(android_surf_value_t *object, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
+extern int jni_ConfigureSurface(android_surf_value_t *object, int width, int height, int hal, bool *configured);
+extern int jni_GetWindowSize(android_surf_value_t *object, int *width, int *height);
static const vlc_fourcc_t subpicture_chromas[] =
{
@@ -137,9 +138,11 @@ struct vout_display_sys_t
bool b_has_subpictures;
uint8_t hash[16];
+
+ android_surf_value_t *object;
};
-static int UpdateWindowSize(video_format_t *p_fmt, bool b_cropped)
+static int UpdateWindowSize(vout_display_sys_t *sys, video_format_t *p_fmt, bool b_cropped)
{
unsigned int i_width, i_height;
unsigned int i_sar_num = 1, i_sar_den = 1;
@@ -159,7 +162,8 @@ static int UpdateWindowSize(video_format_t *p_fmt, bool b_cropped)
i_height = rot_fmt.i_height;
}
- jni_SetSurfaceLayout(i_width, i_height,
+ jni_SetSurfaceLayout(sys->object,
+ i_width, i_height,
rot_fmt.i_visible_width,
rot_fmt.i_visible_height,
i_sar_num,
@@ -437,7 +441,7 @@ static int AndroidWindow_ConfigureSurface(vout_display_sys_t *sys,
* if jni_ConfigureSurface succeed, you need to get a new surface handle.
* That's why AndroidWindow_SetSurface is called again here.
*/
- err = jni_ConfigureSurface(p_window->jsurf,
+ err = jni_ConfigureSurface(sys->object,
p_window->fmt.i_width,
p_window->fmt.i_height,
p_window->i_android_hal,
@@ -562,9 +566,9 @@ static int AndroidWindow_LockPicture(vout_display_sys_t *sys,
static int SetupWindowSurface(vout_display_sys_t *sys, unsigned i_pic_count)
{
int err;
- jobject jsurf = jni_LockAndGetAndroidJavaSurface();
+ jobject jsurf = jni_LockAndGetAndroidJavaSurface(sys->object);
err = AndroidWindow_SetSurface(sys, sys->p_window, jsurf);
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
err = err == 0 ? AndroidWindow_Setup(sys, sys->p_window, i_pic_count) : err;
return err;
}
@@ -572,9 +576,9 @@ static int SetupWindowSurface(vout_display_sys_t *sys, unsigned i_pic_count)
static int SetupWindowSubtitleSurface(vout_display_sys_t *sys)
{
int err;
- jobject jsurf = jni_LockAndGetSubtitlesSurface();
+ jobject jsurf = jni_LockAndGetSubtitlesSurface(sys->object);
err = AndroidWindow_SetSurface(sys, sys->p_sub_window, jsurf);
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
err = err == 0 ? AndroidWindow_Setup(sys, sys->p_sub_window, 1) : err;
return err;
}
@@ -602,7 +606,7 @@ static void SendEventDisplaySize(vout_display_t *vd)
vout_display_sys_t *sys = vd->sys;
int i_display_width, i_display_height;
- if (jni_GetWindowSize(&i_display_width, &i_display_height) == 0
+ if (jni_GetWindowSize(sys->object, &i_display_width, &i_display_height) == 0
&& i_display_width != 0 && i_display_height != 0
&& (i_display_width != sys->i_display_width
|| i_display_height != sys->i_display_height))
@@ -624,6 +628,12 @@ static int Open(vlc_object_t *p_this)
if (!sys)
return VLC_ENOMEM;
+ sys->object = var_CreateGetAddress (vd, "drawable-androidobject");
+ if (!sys->object) {
+ msg_Err(vd, "No android_surf_value_t set.");
+ goto error;
+ }
+
sys->p_library = LoadNativeWindowAPI(&sys->anw);
if (!sys->p_library) {
msg_Err(vd, "Could not initialize NativeWindow API.");
@@ -716,6 +726,8 @@ static void Close(vlc_object_t *p_this)
vout_display_t *vd = (vout_display_t *)p_this;
vout_display_sys_t *sys = vd->sys;
+ var_Destroy (vd, "drawable-androidobject");
+
if (!sys)
return;
@@ -792,7 +804,7 @@ static picture_pool_t *PoolAlloc(vout_display_t *vd, unsigned requested_count)
requested_count = sys->p_window->i_pic_count;
msg_Dbg(vd, "PoolAlloc: got %d frames", requested_count);
- UpdateWindowSize(&sys->p_window->fmt, sys->p_window->b_use_priv);
+ UpdateWindowSize(sys, &sys->p_window->fmt, sys->p_window->b_use_priv);
pp_pics = calloc(requested_count, sizeof(picture_t));
@@ -891,7 +903,7 @@ static void SubtitleGetDirtyBounds(vout_display_t *vd,
if (!sys->p_sub_buffer_bounds
|| sys->p_sub_buffer_bounds[i].p_pixels == NULL) {
buffer_bounds *p_bb = realloc(sys->p_sub_buffer_bounds,
- (i + 2) * sizeof(buffer_bounds));
+ (i + 2) * sizeof(buffer_bounds));
if (p_bb) {
sys->p_sub_buffer_bounds = p_bb;
sys->p_sub_buffer_bounds[i].p_pixels = sys->p_sub_pic->p[0].p_pixels;
@@ -955,12 +967,12 @@ 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) {
+ if (!jni_LockAndGetIsSurfaceAttached(sys->object) && sys->pool != NULL) {
msg_Dbg(vd, "Surface got destroyed");
picture_pool_Release(sys->pool);
sys->pool = NULL;
}
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
if (sys->pool == NULL)
sys->pool = PoolAlloc(vd, requested_count);
@@ -976,7 +988,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
SendEventDisplaySize(vd);
if (subpicture) {
- if (sys->b_sub_invalid) {
+ if (sys->b_sub_invalid) {
sys->b_sub_invalid = false;
if (sys->p_sub_pic) {
picture_Release(sys->p_sub_pic);
@@ -990,11 +1002,11 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
sys->p_sub_buffer_bounds = NULL;
}
- if (!jni_LockAndGetIsSurfaceAttached() && sys->p_sub_pic != NULL) {
+ if (!jni_LockAndGetIsSurfaceAttached(sys->object) && sys->p_sub_pic != NULL) {
picture_Release(sys->p_sub_pic);
sys->p_sub_pic = NULL;
}
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
if (!sys->p_sub_pic && SetupWindowSubtitleSurface(sys) == 0)
sys->p_sub_pic = PictureAlloc(sys, &sys->p_sub_window->fmt);
@@ -1084,7 +1096,7 @@ static int Control(vout_display_t *vd, int query, va_list args)
} else
CopySourceAspect(&sys->p_window->fmt, source);
- UpdateWindowSize(&sys->p_window->fmt, sys->p_window->b_use_priv);
+ UpdateWindowSize(sys, &sys->p_window->fmt, sys->p_window->b_use_priv);
} else {
const vout_display_cfg_t *cfg;
diff --git a/modules/video_output/android/nativewindow.c b/modules/video_output/android/nativewindow.c
index 98c03fa..584bdec 100644
--- a/modules/video_output/android/nativewindow.c
+++ b/modules/video_output/android/nativewindow.c
@@ -40,9 +40,9 @@
#define THREAD_NAME "ANativeWindow"
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 void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
+extern jobject jni_LockAndGetAndroidJavaSurface(android_surf_value_t *object);
+extern void jni_UnlockAndroidSurface(android_surf_value_t *object);
+extern void jni_SetSurfaceLayout(android_surf_value_t *object, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
static int Open(vout_window_t *, const vout_window_cfg_t *);
static void Close(vout_window_t *);
@@ -90,7 +90,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
}
// Create the native window by first getting the Java surface.
- jobject javaSurface = jni_LockAndGetAndroidJavaSurface();
+ jobject javaSurface = jni_LockAndGetAndroidJavaSurface(NULL);
if (javaSurface == NULL)
goto error;
@@ -99,7 +99,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
p_sys->window = p_sys->native_window.winFromSurface(p_env, javaSurface); // ANativeWindow_fromSurface call.
jni_detach_thread();
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(NULL);
if (p_sys->window == NULL)
goto error;
@@ -110,7 +110,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
wnd->sys = p_sys;
// Set the Java surface size.
- jni_SetSurfaceLayout(cfg->width, cfg->height, cfg->width, cfg->height, 1, 1);
+ jni_SetSurfaceLayout(NULL, cfg->width, cfg->height, cfg->width, cfg->height, 1, 1);
return VLC_SUCCESS;
@@ -144,7 +144,7 @@ static int Control(vout_window_t *wnd, int cmd, va_list ap)
{
unsigned width = va_arg(ap, unsigned);
unsigned height = va_arg(ap, unsigned);
- jni_SetSurfaceLayout(width, height, width, height, 1, 1);
+ jni_SetSurfaceLayout(NULL, width, height, width, height, 1, 1);
break;
}
case VOUT_WINDOW_SET_STATE:
diff --git a/modules/video_output/android/surface.c b/modules/video_output/android/surface.c
index 5ccb102..a07f2eb 100644
--- a/modules/video_output/android/surface.c
+++ b/modules/video_output/android/surface.c
@@ -76,12 +76,15 @@ vlc_module_end()
#define THREAD_NAME "AndroidSurface"
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);
+
+extern jobject jni_LockAndGetAndroidJavaSurface(android_surf_value_t *object);
+
+extern void jni_UnlockAndroidSurface(android_surf_value_t *object);
+extern bool jni_LockAndGetIsSurfaceAttached(android_surf_value_t *object);
+extern void *jni_AndroidJavaSurfaceToNativeSurface(jobject surf);
+
+extern void jni_SetSurfaceLayout(android_surf_value_t *object, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
+extern int jni_ConfigureSurface(android_surf_value_t *object, int width, int height, int hal, bool *configured);
// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEb
typedef void (*Surface_lock)(void *, void *, int);
@@ -125,6 +128,8 @@ struct vout_display_sys_t {
unsigned int i_alloc_height;
video_format_t fmt;
+
+ android_surf_value_t *object;
};
struct picture_sys_t {
@@ -187,7 +192,8 @@ static void UpdateLayout(vout_display_sys_t *sys)
i_height = sys->fmt.i_height;
}
- jni_SetSurfaceLayout(i_width, i_height,
+ jni_SetSurfaceLayout(sys->object,
+ i_width, i_height,
sys->fmt.i_visible_width,
sys->fmt.i_visible_height,
i_sar_num,
@@ -210,6 +216,13 @@ static int Open(vlc_object_t *p_this)
if (!sys)
goto error;
+ sys->object = var_CreateGetAddress (vd, "drawable-androidobject");
+ if (!sys->object) {
+ free(sys);
+ msg_Err(vd, "No android_surf_value_t set.");
+ return VLC_EGENERIC;
+ }
+
/* */
sys->p_library = InitLibrary(sys);
if (!sys->p_library) {
@@ -305,6 +318,8 @@ static void Close(vlc_object_t *p_this)
vout_display_t *vd = (vout_display_t *)p_this;
vout_display_sys_t *sys = vd->sys;
+ var_Destroy (vd, "drawable-androidobject");
+
if (sys) {
if (sys->pool)
picture_pool_Release(sys->pool);
@@ -329,11 +344,11 @@ static int AndroidLockSurface(picture_t *picture)
uint32_t sw, sh;
if (!sys->native_surface) {
- picsys->surf = jni_LockAndGetAndroidJavaSurface();
+ picsys->surf = jni_LockAndGetAndroidJavaSurface(sys->object);
if (unlikely(!picsys->surf))
goto error;
sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf);
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
if (!sys->native_surface)
return VLC_EGENERIC;
@@ -347,7 +362,7 @@ static int AndroidLockSurface(picture_t *picture)
if (aligned_width != sys->i_alloc_width || sh != sys->i_alloc_height) {
bool configured;
- if (jni_ConfigureSurface(picsys->surf,
+ if (jni_ConfigureSurface(sys->object,
aligned_width,
sh,
sys->i_android_hal,
@@ -360,7 +375,7 @@ static int AndroidLockSurface(picture_t *picture)
UpdateLayout(sys);
}
- if (!jni_LockAndGetIsSurfaceAttached()) {
+ if (!jni_LockAndGetIsSurfaceAttached(sys->object)) {
sys->native_surface = NULL;
goto error;
}
@@ -372,10 +387,10 @@ static int AndroidLockSurface(picture_t *picture)
if (info->w != sys->i_alloc_width || info->h != sh) {
sys->s_unlockAndPost(sys->native_surface);
- goto error;
+ return VLC_EGENERIC;
}
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
picture->p[0].p_pixels = (uint8_t*)info->bits;
picture->p[0].i_lines = info->h;
@@ -384,7 +399,7 @@ static int AndroidLockSurface(picture_t *picture)
return VLC_SUCCESS;
error:
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
return VLC_EGENERIC;
}
@@ -393,9 +408,9 @@ static void AndroidUnlockSurface(picture_t *picture)
picture_sys_t *picsys = picture->p_sys;
vout_display_sys_t *sys = picsys->sys;
- if (jni_LockAndGetIsSurfaceAttached() && sys->native_surface)
+ if (jni_LockAndGetIsSurfaceAttached(sys->object) && sys->native_surface)
sys->s_unlockAndPost(sys->native_surface);
- jni_UnlockAndroidSurface();
+ jni_UnlockAndroidSurface(sys->object);
}
static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
diff --git a/modules/video_output/android/utils.h b/modules/video_output/android/utils.h
index 96d4f86..dfc4913 100644
--- a/modules/video_output/android/utils.h
+++ b/modules/video_output/android/utils.h
@@ -24,6 +24,7 @@
# include "config.h"
#endif
+#include <pthread.h>
#include <android/native_window.h>
#include <jni.h>
#include <android/native_window_jni.h>
@@ -46,6 +47,8 @@ typedef struct
ptr_ANativeWindow_setBuffersGeometry setBuffersGeometry;
} native_window_api_t;
+typedef struct android_surf_value_t android_surf_value_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);
--
1.9.3 (Apple Git-50)
More information about the vlc-devel
mailing list