#define spu_DestroyRegion(a,b) __spu_DestroyRegion(VLC_OBJECT(a),b)
VLC_EXPORT( void, __spu_DestroyRegion, ( vlc_object_t *, subpicture_region_t * ) );
VLC_EXPORT( subpicture_t *, spu_SortSubpictures, ( spu_t *, mtime_t display_date, bool b_paused, bool b_subtitle_only ) );
-VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, video_format_t *, picture_t *, subpicture_t *, int, int ) );
+
+/**
+ * This function renders a list of subpicture_t on the provided picture.
+ *
+ * \param p_fmt_dst is the format of the destination picture.
+ * \param p_fmt_src is the format of the original(source) video.
+ */
+VLC_EXPORT( void, spu_RenderSubpictures, ( spu_t *, picture_t *, video_format_t *p_fmt_dst, subpicture_t *p_list, const video_format_t *p_fmt_src ) );
/** @}*/
/* Overlay subpicture */
if( p_subpic )
{
- int i_scale_width, i_scale_height;
video_format_t fmt;
- i_scale_width = id->p_encoder->fmt_in.video.i_width * 1000 /
- id->p_decoder->fmt_out.video.i_width;
- i_scale_height = id->p_encoder->fmt_in.video.i_height * 1000 /
- id->p_decoder->fmt_out.video.i_height;
-
if( p_pic->i_refcount && !filter_chain_GetLength( id->p_f_chain ) )
{
/* We can't modify the picture, we need to duplicate it */
fmt.i_sar_num = fmt.i_aspect * fmt.i_height / fmt.i_width;
fmt.i_sar_den = VOUT_ASPECT_FACTOR;
- spu_RenderSubpictures( p_sys->p_spu, &fmt, p_pic, p_subpic,
- i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_sys->p_spu, p_pic, &fmt,
+ p_subpic, &id->p_decoder->fmt_out.video );
}
/* Run user specified filter chain */
* before rendering, does the subpicture magic, and tells the video output
* thread which direct buffer needs to be displayed.
*/
-picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
- subpicture_t *p_subpic )
+picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
+ subpicture_t *p_subpic )
{
- int i_scale_width, i_scale_height;
-
if( p_pic == NULL )
- {
- /* XXX: subtitles */
return NULL;
- }
-
- i_scale_width = p_vout->fmt_out.i_visible_width * 1000 /
- p_vout->fmt_in.i_visible_width;
- i_scale_height = p_vout->fmt_out.i_visible_height * 1000 /
- p_vout->fmt_in.i_visible_height;
if( p_pic->i_type == DIRECT_PICTURE )
{
vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- PP_OUTPUTPICTURE[0], p_subpic,
- i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ PP_OUTPUTPICTURE[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
vout_UnlockPicture( 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_subpic, i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ PP_OUTPUTPICTURE[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
vout_UnlockPicture( p_vout, PP_OUTPUTPICTURE[0] );
p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic );
/* Render subpictures on the first direct buffer */
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- p_tmp_pic, p_subpic,
- i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ p_tmp_pic, &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
if( vout_LockPicture( p_vout, &p_vout->p_picture[0] ) )
return NULL;
p_vout->p_chroma->pf_video_filter( p_vout->p_chroma, p_pic );
/* Render subpictures on the first direct buffer */
- spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
- &p_vout->p_picture[0],
- p_subpic, i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_vout->p_spu,
+ &p_vout->p_picture[0], &p_vout->fmt_out,
+ p_subpic, &p_vout->fmt_in );
}
vout_UnlockPicture( p_vout, &p_vout->p_picture[0] );
p_region->fmt = fmt_original;
}
-void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt_a,
- picture_t *p_pic_dst,
+void spu_RenderSubpictures( spu_t *p_spu,
+ picture_t *p_pic_dst, video_format_t *p_fmt_dst,
subpicture_t *p_subpic_list,
- int i_scale_width_orig, int i_scale_height_orig )
+ const video_format_t *p_fmt_src )
{
- video_format_t fmt = *p_fmt_a, *p_fmt = &fmt;
+ video_format_t *p_fmt = p_fmt_dst;
const mtime_t i_current_date = mdate();
int i_source_video_width;
int i_source_video_height;
subpicture_t *p_subpic;
- spu_scale_t scale_size_org;
/* Get lock */
vlc_mutex_lock( &p_spu->subpicture_lock );
return;
}
- scale_size_org = spu_scale_create( i_scale_width_orig, i_scale_height_orig );
-
- i_source_video_width = p_fmt->i_width * SCALE_UNIT / scale_size_org.w;
- i_source_video_height = p_fmt->i_height * SCALE_UNIT / scale_size_org.h;
+ i_source_video_width = p_fmt_src->i_width;
+ i_source_video_height = p_fmt_src->i_height;
/* */
for( p_subpic = p_subpic_list;