From 3cbe2bd0122f78a44e6d59e76b43a15126b62c79 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Wed, 3 Sep 2008 00:47:54 +0200 Subject: [PATCH] vout_RenderPicture should not render subtitles on the provided picture. This prevents rendering subtitles multiple times (but at the cost of a picture copy when subtiles are rendered). --- src/video_output/vout_pictures.c | 83 ++++++++++++++++---------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index 9c620895b8..81f29ba1fc 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -299,6 +299,18 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) vlc_mutex_unlock( &p_vout->picture_lock ); } +static int vout_LockPicture( vout_thread_t *p_vout, picture_t *p_picture ) +{ + if( p_picture->pf_lock ) + return p_picture->pf_lock( p_vout, p_picture ); + return VLC_SUCCESS; +} +static void vout_UnlockPicture( vout_thread_t *p_vout, picture_t *p_picture ) +{ + if( p_picture->pf_unlock ) + p_picture->pf_unlock( p_vout, p_picture ); +} + /** * Render a picture * @@ -324,38 +336,30 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, if( p_pic->i_type == DIRECT_PICTURE ) { - if( !p_vout->render.b_allow_modify_pics || p_pic->i_refcount || - p_pic->b_force ) + /* Picture is in a direct buffer. */ + + if( p_subpic != NULL ) { - /* Picture is in a direct buffer and is still in use, - * we need to copy it to another direct buffer before - * displaying it if there are subtitles. */ - if( p_subpic != NULL ) - { - /* We have subtitles. First copy the picture to - * the spare direct buffer, then render the - * subtitles. */ - vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic ); + /* We have subtitles. First copy the picture to + * the spare direct buffer, then render the + * subtitles. */ + if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) ) + return NULL; - spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, - PP_OUTPUTPICTURE[0], p_pic, p_subpic, - i_scale_width, i_scale_height ); + vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic ); - return PP_OUTPUTPICTURE[0]; - } + spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, + PP_OUTPUTPICTURE[0], p_pic, p_subpic, + i_scale_width, i_scale_height ); - /* No subtitles, picture is in a directbuffer so - * we can display it directly even if it is still - * in use. */ - return p_pic; - } + vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] ); - /* Picture is in a direct buffer but isn't used by the - * decoder. We can safely render subtitles on it and - * display it. */ - spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_pic, p_pic, - p_subpic, i_scale_width, i_scale_height ); + return PP_OUTPUTPICTURE[0]; + } + /* No subtitles, picture is in a directbuffer so + * we can display it directly (even if it is still + * in use or not). */ return p_pic; } @@ -367,17 +371,15 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, * same size as the direct buffers. A memcpy() is enough, * then render the subtitles. */ - if( PP_OUTPUTPICTURE[0]->pf_lock ) - if( PP_OUTPUTPICTURE[0]->pf_lock( p_vout, PP_OUTPUTPICTURE[0] ) ) - return NULL; + if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) ) + return NULL; vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic ); spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, PP_OUTPUTPICTURE[0], p_pic, p_subpic, i_scale_width, i_scale_height ); - if( PP_OUTPUTPICTURE[0]->pf_unlock ) - PP_OUTPUTPICTURE[0]->pf_unlock( p_vout, PP_OUTPUTPICTURE[0] ); + vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] ); return PP_OUTPUTPICTURE[0]; } @@ -415,17 +417,15 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, p_tmp_pic, p_subpic, i_scale_width, i_scale_height ); - if( p_vout->p_picture[0].pf_lock ) - if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) ) - return NULL; + if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) ) + return NULL; vout_CopyPicture( p_vout, &p_vout->p_picture[0], p_tmp_pic ); } else { - if( p_vout->p_picture[0].pf_lock ) - if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) ) - return NULL; + if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) ) + return NULL; /* Convert image to the first direct buffer */ p_vout->p_chroma->p_owner = (filter_owner_sys_t *)&p_vout->p_picture[0]; @@ -437,8 +437,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, p_subpic, i_scale_width, i_scale_height ); } - if( p_vout->p_picture[0].pf_unlock ) - p_vout->p_picture[0].pf_unlock( p_vout, &p_vout->p_picture[0] ); + vout_UnlockPicture( p_vout, &p_vout->p_picture[0] ); return &p_vout->p_picture[0]; } @@ -678,9 +677,9 @@ int __vout_InitPicture( vlc_object_t *p_this, picture_t *p_pic, p_pic->p[i_index].i_pixel_pitch = 1; } - p_pic->pf_release = 0; - p_pic->pf_lock = 0; - p_pic->pf_unlock = 0; + p_pic->pf_release = NULL; + p_pic->pf_lock = NULL; + p_pic->pf_unlock = NULL; p_pic->i_refcount = 0; p_pic->p_q = NULL; -- 2.20.1