#if defined(USE_IOMX)
static void *DequeueThread( void *data );
-static void UnlockPicture( picture_t* p_pic );
+static void UnlockPicture( picture_t* p_pic, bool b_render );
static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port );
static void HwBuffer_Destroy( decoder_t *p_dec, OmxPort *p_port );
static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port );
/*****************************************************************************
* vout callbacks
*****************************************************************************/
-static void UnlockPicture( picture_t* p_pic )
+static void UnlockPicture( picture_t* p_pic, bool b_render )
{
picture_sys_t *p_picsys = p_pic->p_sys;
decoder_t *p_dec = p_picsys->priv.hw.p_dec;
p_handle = p_port->pp_buffers[p_picsys->priv.hw.i_index]->pBuffer;
OMX_DBG( "DisplayBuffer: %s %p",
- p_picsys->b_render ? "render" : "cancel", p_handle );
+ b_render ? "render" : "cancel", p_handle );
if( !p_handle )
{
goto end;
}
- if( p_picsys->b_render )
+ if( b_render )
p_port->p_hwbuf->anwpriv.queue( p_port->p_hwbuf->window_priv, p_handle );
else
p_port->p_hwbuf->anwpriv.cancel( p_port->p_hwbuf->window_priv, p_handle );
static void AndroidWindow_UnlockPicture(vout_display_sys_t *sys,
android_window *p_window,
- picture_t *p_pic)
+ picture_t *p_pic,
+ bool b_render)
{
picture_sys_t *p_picsys = p_pic->p_sys;
if (p_handle == NULL)
return;
- sys->anwp.unlockData(p_window->p_handle_priv, p_handle,
- p_picsys->b_render);
+ sys->anwp.unlockData(p_window->p_handle_priv, p_handle, b_render);
} else
sys->anw.unlockAndPost(p_window->p_handle);
}
p_picsys->priv.sw.buf.height < 0 ||
(unsigned)p_picsys->priv.sw.buf.width < p_window->fmt.i_width ||
(unsigned)p_picsys->priv.sw.buf.height < p_window->fmt.i_height) {
- AndroidWindow_UnlockPicture(sys, p_window, p_pic);
+ AndroidWindow_UnlockPicture(sys, p_window, p_pic, false);
return -1;
}
return AndroidWindow_LockPicture(sys, sys->p_window, p_pic);
}
-static void DefaultUnlockPicture(picture_t *p_pic)
+static void DefaultUnlockPicture(picture_t *p_pic, bool b_render)
{
picture_sys_t *p_picsys = p_pic->p_sys;
vout_display_sys_t *sys = p_picsys->p_vd_sys;
- AndroidWindow_UnlockPicture(sys, sys->p_window, p_pic);
+ AndroidWindow_UnlockPicture(sys, sys->p_window, p_pic, b_render);
}
-static int LockPicture(picture_t *p_pic)
+static void UnlockPicture(picture_t *p_pic, bool b_render)
{
picture_sys_t *p_picsys = p_pic->p_sys;
- p_picsys->b_render = false;
- if (p_picsys->pf_lock_pic)
- return p_picsys->pf_lock_pic(p_pic);
- return 0;
+ if (p_picsys->b_locked && p_picsys->pf_unlock_pic)
+ p_picsys->pf_unlock_pic(p_pic, b_render);
+ p_picsys->b_locked = false;
}
-static void UnlockPicture(picture_t *p_pic)
+static int PoolLockPicture(picture_t *p_pic)
{
picture_sys_t *p_picsys = p_pic->p_sys;
- if (p_picsys->pf_unlock_pic)
- p_picsys->pf_unlock_pic(p_pic);
+ if (p_picsys->pf_lock_pic && p_picsys->pf_lock_pic(p_pic) != 0)
+ return -1;
+ p_picsys->b_locked = true;
+ return 0;
+}
+
+static void PoolUnlockPicture(picture_t *p_pic)
+{
+ UnlockPicture(p_pic, false);
}
static picture_pool_t *PoolAlloc(vout_display_t *vd, unsigned requested_count)
memset(&pool_cfg, 0, sizeof(pool_cfg));
pool_cfg.picture_count = requested_count;
pool_cfg.picture = pp_pics;
- pool_cfg.lock = LockPicture;
- pool_cfg.unlock = UnlockPicture;
+ pool_cfg.lock = PoolLockPicture;
+ pool_cfg.unlock = PoolUnlockPicture;
pool = picture_pool_NewExtended(&pool_cfg);
error:
&sys->p_sub_pic->format);
picture_BlendSubpicture(sys->p_sub_pic, sys->p_spu_blend, subpicture);
}
- AndroidWindow_UnlockPicture(sys, sys->p_sub_window, sys->p_sub_pic);
+ AndroidWindow_UnlockPicture(sys, sys->p_sub_window, sys->p_sub_pic, true);
}
static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
subpicture_t *subpicture)
{
vout_display_sys_t *sys = vd->sys;
- picture_sys_t *p_picsys = picture->p_sys;
/* refcount lowers to 0, and pool_cfg.unlock is called */
- p_picsys->b_render = true;
+ UnlockPicture(picture, true);
picture_Release(picture);
if (subpicture) {