Commit 3cbe2bd0 authored by Laurent Aimar's avatar Laurent Aimar

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).
parent ee542a4b
...@@ -299,6 +299,18 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -299,6 +299,18 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
vlc_mutex_unlock( &p_vout->picture_lock ); 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 * Render a picture
* *
...@@ -324,38 +336,30 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -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_pic->i_type == DIRECT_PICTURE )
{ {
if( !p_vout->render.b_allow_modify_pics || p_pic->i_refcount || /* Picture is in a direct buffer. */
p_pic->b_force )
if( p_subpic != NULL )
{ {
/* Picture is in a direct buffer and is still in use, /* We have subtitles. First copy the picture to
* we need to copy it to another direct buffer before * the spare direct buffer, then render the
* displaying it if there are subtitles. */ * subtitles. */
if( p_subpic != NULL ) if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) )
{ return 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 );
spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
PP_OUTPUTPICTURE[0], p_pic, p_subpic,
i_scale_width, i_scale_height );
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 vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] );
* we can display it directly even if it is still
* in use. */
return p_pic;
}
/* Picture is in a direct buffer but isn't used by the return PP_OUTPUTPICTURE[0];
* 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 );
/* 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; return p_pic;
} }
...@@ -367,17 +371,15 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *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, * same size as the direct buffers. A memcpy() is enough,
* then render the subtitles. */ * then render the subtitles. */
if( PP_OUTPUTPICTURE[0]->pf_lock ) if( vout_LockPicture( p_vout, PP_OUTPUTPICTURE[0] ) )
if( PP_OUTPUTPICTURE[0]->pf_lock( p_vout, PP_OUTPUTPICTURE[0] ) ) return NULL;
return NULL;
vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic ); vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
PP_OUTPUTPICTURE[0], p_pic, PP_OUTPUTPICTURE[0], p_pic,
p_subpic, i_scale_width, i_scale_height ); p_subpic, i_scale_width, i_scale_height );
if( PP_OUTPUTPICTURE[0]->pf_unlock ) vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] );
PP_OUTPUTPICTURE[0]->pf_unlock( p_vout, PP_OUTPUTPICTURE[0] );
return PP_OUTPUTPICTURE[0]; return PP_OUTPUTPICTURE[0];
} }
...@@ -415,17 +417,15 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -415,17 +417,15 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
p_tmp_pic, p_subpic, p_tmp_pic, p_subpic,
i_scale_width, i_scale_height ); i_scale_width, i_scale_height );
if( p_vout->p_picture[0].pf_lock ) if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) )
if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) ) return NULL;
return NULL;
vout_CopyPicture( p_vout, &p_vout->p_picture[0], p_tmp_pic ); vout_CopyPicture( p_vout, &p_vout->p_picture[0], p_tmp_pic );
} }
else else
{ {
if( p_vout->p_picture[0].pf_lock ) if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) )
if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) ) return NULL;
return NULL;
/* Convert image to the first direct buffer */ /* Convert image to the first direct buffer */
p_vout->p_chroma->p_owner = (filter_owner_sys_t *)&p_vout->p_picture[0]; 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, ...@@ -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 ); p_subpic, i_scale_width, i_scale_height );
} }
if( p_vout->p_picture[0].pf_unlock ) vout_UnlockPicture( p_vout, &p_vout->p_picture[0] );
p_vout->p_picture[0].pf_unlock( p_vout, &p_vout->p_picture[0] );
return &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, ...@@ -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->p[i_index].i_pixel_pitch = 1;
} }
p_pic->pf_release = 0; p_pic->pf_release = NULL;
p_pic->pf_lock = 0; p_pic->pf_lock = NULL;
p_pic->pf_unlock = 0; p_pic->pf_unlock = NULL;
p_pic->i_refcount = 0; p_pic->i_refcount = 0;
p_pic->p_q = NULL; p_pic->p_q = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment