[vlc-devel] commit: vout_RenderPicture should not render subtitles on the provided picture. ( Laurent Aimar )
git version control
git at videolan.org
Wed Sep 3 01:01:40 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Sep 3 00:47:54 2008 +0200| [3cbe2bd0122f78a44e6d59e76b43a15126b62c79] | committer: 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).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3cbe2bd0122f78a44e6d59e76b43a15126b62c79
---
src/video_output/vout_pictures.c | 83 +++++++++++++++++++-------------------
1 files changed, 41 insertions(+), 42 deletions(-)
diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c
index 9c62089..81f29ba 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;
More information about the vlc-devel
mailing list