From ef801bc9edd2b821983be8269b75a308782f2841 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Tue, 16 Sep 2008 23:50:07 +0200 Subject: [PATCH] Fixed spu_RenderSubpictures prototype. It now requires source format instead of scaling parameters. --- include/vlc_osd.h | 9 ++++++- modules/stream_out/transcode.c | 10 ++------ src/video_output/vout_pictures.c | 38 +++++++++++------------------ src/video_output/vout_subpictures.c | 15 +++++------- 4 files changed, 30 insertions(+), 42 deletions(-) diff --git a/include/vlc_osd.h b/include/vlc_osd.h index 9b92b52735..d704272066 100644 --- a/include/vlc_osd.h +++ b/include/vlc_osd.h @@ -122,7 +122,14 @@ VLC_EXPORT( subpicture_region_t *,__spu_CreateRegion, ( vlc_object_t *, video_fo #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 ) ); /** @}*/ diff --git a/modules/stream_out/transcode.c b/modules/stream_out/transcode.c index 2e67558742..0450f9e182 100644 --- a/modules/stream_out/transcode.c +++ b/modules/stream_out/transcode.c @@ -1988,14 +1988,8 @@ static int transcode_video_process( sout_stream_t *p_stream, /* 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 */ @@ -2017,8 +2011,8 @@ static int transcode_video_process( sout_stream_t *p_stream, 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 */ diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index bdb2a177f1..223d85a611 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -320,21 +320,11 @@ static void vout_UnlockPicture( vout_thread_t *p_vout, picture_t *p_picture ) * 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 ) { @@ -350,9 +340,9 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, 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] ); @@ -377,9 +367,9 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, 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] ); @@ -415,9 +405,9 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, 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; @@ -434,9 +424,9 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, 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] ); diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index bcf1f624b9..5cff7dfb26 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -949,17 +949,16 @@ exit: 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 ); @@ -971,10 +970,8 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt_a, 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; -- 2.39.2