From 3f6f97f1326fe9d502171012699986dd404c17c4 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Sat, 5 Mar 2005 16:49:15 +0000 Subject: [PATCH] * include/video_output.h, ALL: changed api for vout_Request()/vout_Create() to be more flexible. --- include/video_output.h | 12 ++-- modules/codec/ffmpeg/video.c | 2 + modules/video_filter/adjust.c | 13 +++- modules/video_filter/clone.c | 17 +++-- modules/video_filter/crop.c | 27 ++++++-- modules/video_filter/deinterlace.c | 26 ++++---- modules/video_filter/distort.c | 13 +++- modules/video_filter/invert.c | 13 +++- modules/video_filter/logo.c | 13 +++- modules/video_filter/motionblur.c | 13 +++- modules/video_filter/motiondetect.c | 13 +++- modules/video_filter/transform.c | 27 +++++--- modules/video_filter/wall.c | 21 +++++-- modules/visualization/goom.c | 14 +++-- modules/visualization/visual/visual.c | 14 +++-- src/input/decoder.c | 32 ++++++++-- src/video_output/video_output.c | 91 ++++++++++++++++++++------- src/video_output/vout_pictures.c | 42 ++++++------- 18 files changed, 279 insertions(+), 124 deletions(-) diff --git a/include/video_output.h b/include/video_output.h index 0ddccd9e8c..0eeacd6c67 100644 --- a/include/video_output.h +++ b/include/video_output.h @@ -121,6 +121,10 @@ struct vout_thread_t picture_heap_t output; /**< direct buffers */ vlc_bool_t b_direct; /**< rendered are like direct ? */ vout_chroma_t chroma; /**< translation tables */ + + video_format_t fmt_render; /* render format (from the decoder) */ + video_format_t fmt_in; /* input (modified render) format */ + video_format_t fmt_out; /* output format (for the video output) */ /**@}*/ /* Picture heap */ @@ -194,10 +198,10 @@ struct vout_thread_t /***************************************************************************** * Prototypes *****************************************************************************/ -#define vout_Request(a,b,c,d,e,f) __vout_Request(VLC_OBJECT(a),b,c,d,e,f) -VLC_EXPORT( vout_thread_t *, __vout_Request, ( vlc_object_t *, vout_thread_t *, unsigned int, unsigned int, uint32_t, unsigned int ) ); -#define vout_Create(a,b,c,d,e) __vout_Create(VLC_OBJECT(a),b,c,d,e) -VLC_EXPORT( vout_thread_t *, __vout_Create, ( vlc_object_t *, unsigned int, unsigned int, uint32_t, unsigned int ) ); +#define vout_Request(a,b,c) __vout_Request(VLC_OBJECT(a),b,c) +VLC_EXPORT( vout_thread_t *, __vout_Request, ( vlc_object_t *, vout_thread_t *, video_format_t * ) ); +#define vout_Create(a,b) __vout_Create(VLC_OBJECT(a),b) +VLC_EXPORT( vout_thread_t *, __vout_Create, ( vlc_object_t *, video_format_t * ) ); VLC_EXPORT( void, vout_Destroy, ( vout_thread_t * ) ); VLC_EXPORT( int, vout_VarCallback, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) ); diff --git a/modules/codec/ffmpeg/video.c b/modules/codec/ffmpeg/video.c index 146d61aa74..7813b7ad42 100644 --- a/modules/codec/ffmpeg/video.c +++ b/modules/codec/ffmpeg/video.c @@ -169,6 +169,8 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec, p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * ( av_q2d(p_context->sample_aspect_ratio) * p_context->width / p_context->height ); + p_dec->fmt_out.video.i_sar_num = p_context->sample_aspect_ratio.num; + p_dec->fmt_out.video.i_sar_den = p_context->sample_aspect_ratio.den; #else p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * p_context->aspect_ratio; diff --git a/modules/video_filter/adjust.c b/modules/video_filter/adjust.c index a3382b1183..509cd4c60f 100644 --- a/modules/video_filter/adjust.c +++ b/modules/video_filter/adjust.c @@ -150,6 +150,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -159,12 +160,18 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); /* Everything failed */ if( p_vout->p_sys->p_vout == NULL ) diff --git a/modules/video_filter/clone.c b/modules/video_filter/clone.c index f274512c57..ceb5b1542f 100644 --- a/modules/video_filter/clone.c +++ b/modules/video_filter/clone.c @@ -205,6 +205,7 @@ static int Init( vout_thread_t *p_vout ) int i_index, i_vout; picture_t *p_pic; char *psz_default_vout; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -214,6 +215,14 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video outputs" ); @@ -227,9 +236,7 @@ static int Init( vout_thread_t *p_vout ) "default", 8 ) ) ) { p_vout->p_sys->pp_vout[i_vout] = - vout_Create( p_vout, p_vout->render.i_width, - p_vout->render.i_height, p_vout->render.i_chroma, - p_vout->render.i_aspect ); + vout_Create( p_vout, &fmt ); } else { @@ -237,9 +244,7 @@ static int Init( vout_thread_t *p_vout ) config_PutPsz( p_vout, "vout", p_vout->p_sys->ppsz_vout_list[i_vout] ); p_vout->p_sys->pp_vout[i_vout] = - vout_Create( p_vout, p_vout->render.i_width, - p_vout->render.i_height, p_vout->render.i_chroma, - p_vout->render.i_aspect ); + vout_Create( p_vout, &fmt ); /* Reset the default value */ config_PutPsz( p_vout, "vout", psz_default_vout ); diff --git a/modules/video_filter/crop.c b/modules/video_filter/crop.c index 5e34196203..191a037bab 100644 --- a/modules/video_filter/crop.c +++ b/modules/video_filter/crop.c @@ -134,6 +134,7 @@ static int Init( vout_thread_t *p_vout ) int i_index; char *psz_var; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -247,10 +248,16 @@ static int Init( vout_thread_t *p_vout ) * p_vout->output.i_height / p_vout->p_sys->i_height * p_vout->p_sys->i_width / p_vout->output.i_width; + fmt.i_width = fmt.i_visible_width = p_vout->p_sys->i_width; + fmt.i_height = fmt.i_visible_height = p_vout->p_sys->i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->p_sys->i_aspect; + fmt.i_sar_num = p_vout->p_sys->i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->p_sys->i_width, p_vout->p_sys->i_height, - p_vout->render.i_chroma, p_vout->p_sys->i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); if( p_vout->p_sys->p_vout == NULL ) { msg_Err( p_vout, "failed to create vout" ); @@ -310,6 +317,8 @@ static void Destroy( vlc_object_t *p_this ) *****************************************************************************/ static int Manage( vout_thread_t *p_vout ) { + video_format_t fmt = {0}; + if( !p_vout->p_sys->b_changed ) { return VLC_SUCCESS; @@ -317,9 +326,15 @@ static int Manage( vout_thread_t *p_vout ) vout_Destroy( p_vout->p_sys->p_vout ); - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->p_sys->i_width, p_vout->p_sys->i_height, - p_vout->render.i_chroma, p_vout->p_sys->i_aspect ); + fmt.i_width = fmt.i_visible_width = p_vout->p_sys->i_width; + fmt.i_height = fmt.i_visible_height = p_vout->p_sys->i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->p_sys->i_aspect; + fmt.i_sar_num = p_vout->p_sys->i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); if( p_vout->p_sys->p_vout == NULL ) { msg_Err( p_vout, "failed to create vout" ); diff --git a/modules/video_filter/deinterlace.c b/modules/video_filter/deinterlace.c index b959f6c57e..3a4a4409c3 100644 --- a/modules/video_filter/deinterlace.c +++ b/modules/video_filter/deinterlace.c @@ -320,9 +320,18 @@ static int Init( vout_thread_t *p_vout ) static vout_thread_t *SpawnRealVout( vout_thread_t *p_vout ) { vout_thread_t *p_real_vout = NULL; + video_format_t fmt = {0}; msg_Dbg( p_vout, "spawning the real video output" ); + fmt.i_width = fmt.i_visible_width = p_vout->output.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->output.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->output.i_chroma; + fmt.i_aspect = p_vout->output.i_aspect; + fmt.i_sar_num = p_vout->output.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + switch( p_vout->render.i_chroma ) { case VLC_FOURCC('I','4','2','0'): @@ -332,28 +341,21 @@ static vout_thread_t *SpawnRealVout( vout_thread_t *p_vout ) { case DEINTERLACE_MEAN: case DEINTERLACE_DISCARD: - p_real_vout = - vout_Create( p_vout, - p_vout->output.i_width, p_vout->output.i_height / 2, - p_vout->output.i_chroma, p_vout->output.i_aspect ); + fmt.i_height = fmt.i_visible_height = p_vout->output.i_height / 2; + p_real_vout = vout_Create( p_vout, &fmt ); break; case DEINTERLACE_BOB: case DEINTERLACE_BLEND: case DEINTERLACE_LINEAR: - p_real_vout = - vout_Create( p_vout, - p_vout->output.i_width, p_vout->output.i_height, - p_vout->output.i_chroma, p_vout->output.i_aspect ); + p_real_vout = vout_Create( p_vout, &fmt ); break; } break; case VLC_FOURCC('I','4','2','2'): - p_real_vout = - vout_Create( p_vout, - p_vout->output.i_width, p_vout->output.i_height, - VLC_FOURCC('I','4','2','0'), p_vout->output.i_aspect ); + fmt.i_chroma = VLC_FOURCC('I','4','2','0'); + p_real_vout = vout_Create( p_vout, &fmt ); break; default: diff --git a/modules/video_filter/distort.c b/modules/video_filter/distort.c index bf560e83a9..f79bcd1514 100644 --- a/modules/video_filter/distort.c +++ b/modules/video_filter/distort.c @@ -165,6 +165,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -174,12 +175,18 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); /* Everything failed */ if( p_vout->p_sys->p_vout == NULL ) diff --git a/modules/video_filter/invert.c b/modules/video_filter/invert.c index 8fcbe6ced6..3cb78c5d06 100644 --- a/modules/video_filter/invert.c +++ b/modules/video_filter/invert.c @@ -111,6 +111,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -120,12 +121,18 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); /* Everything failed */ if( p_vout->p_sys->p_vout == NULL ) diff --git a/modules/video_filter/logo.c b/modules/video_filter/logo.c index 9bd00ed243..7325801152 100644 --- a/modules/video_filter/logo.c +++ b/modules/video_filter/logo.c @@ -211,6 +211,7 @@ static int Init( vout_thread_t *p_vout ) vout_sys_t *p_sys = p_vout->p_sys; picture_t *p_pic; int i_index; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -220,6 +221,14 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Load the video blending filter */ p_sys->p_blend = vlc_object_create( p_vout, sizeof(filter_t) ); vlc_object_attach( p_sys->p_blend, p_vout ); @@ -280,9 +289,7 @@ static int Init( vout_thread_t *p_vout ) /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); - p_sys->p_vout = - vout_Create( p_vout, p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_sys->p_vout = vout_Create( p_vout, &fmt ); /* Everything failed */ if( p_sys->p_vout == NULL ) diff --git a/modules/video_filter/motionblur.c b/modules/video_filter/motionblur.c index 015ba58133..406f9e59bc 100644 --- a/modules/video_filter/motionblur.c +++ b/modules/video_filter/motionblur.c @@ -129,6 +129,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -153,14 +154,20 @@ static int Init( vout_thread_t *p_vout ) msg_Dbg( p_vout, "spawning the real video output" ); + fmt.i_width = fmt.i_visible_width = p_vout->output.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->output.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->output.i_chroma; + fmt.i_aspect = p_vout->output.i_aspect; + fmt.i_sar_num = p_vout->output.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + switch( p_vout->render.i_chroma ) { case VLC_FOURCC('I','4','2','0'): case VLC_FOURCC('I','Y','U','V'): case VLC_FOURCC('Y','V','1','2'): - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->output.i_width, p_vout->output.i_height, - p_vout->output.i_chroma, p_vout->output.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); break; default: break; diff --git a/modules/video_filter/motiondetect.c b/modules/video_filter/motiondetect.c index 4daeb436a2..34bd4cff94 100644 --- a/modules/video_filter/motiondetect.c +++ b/modules/video_filter/motiondetect.c @@ -211,6 +211,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -220,12 +221,18 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); /* Everything failed */ if( p_vout->p_sys->p_vout == NULL ) diff --git a/modules/video_filter/transform.c b/modules/video_filter/transform.c index be4ede3d1e..954b96b2dd 100644 --- a/modules/video_filter/transform.c +++ b/modules/video_filter/transform.c @@ -180,6 +180,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -189,23 +190,31 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); if( p_vout->p_sys->b_rotation ) { - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_height, p_vout->render.i_width, - p_vout->render.i_chroma, - (uint64_t)VOUT_ASPECT_FACTOR - * (uint64_t)VOUT_ASPECT_FACTOR - / (uint64_t)p_vout->render.i_aspect ); + fmt.i_width = fmt.i_visible_width = p_vout->render.i_height; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_width; + fmt.i_aspect = VOUT_ASPECT_FACTOR * + (uint64_t)VOUT_ASPECT_FACTOR / p_vout->render.i_aspect; + fmt.i_sar_num = VOUT_ASPECT_FACTOR; + fmt.i_sar_den = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); } else { - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); } /* Everything failed */ diff --git a/modules/video_filter/wall.c b/modules/video_filter/wall.c index 8ebc34c3b9..3d0c309748 100644 --- a/modules/video_filter/wall.c +++ b/modules/video_filter/wall.c @@ -229,6 +229,7 @@ static int Init( vout_thread_t *p_vout ) int i_index, i_row, i_col, i_width, i_height, i_left, i_top; unsigned int i_target_width,i_target_height; picture_t *p_pic; + video_format_t fmt = {0}; int i_aspect = 4*VOUT_ASPECT_FACTOR/3; int i_align = 0; unsigned int i_hstart, i_hend, i_vstart, i_vend; @@ -269,6 +270,14 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_aspect = p_vout->render.i_aspect; var_Create( p_vout, "align", VLC_VAR_INTEGER ); + fmt.i_width = fmt.i_visible_width = p_vout->render.i_width; + fmt.i_height = fmt.i_visible_height = p_vout->render.i_height; + fmt.i_x_offset = fmt.i_y_offset = 0; + fmt.i_chroma = p_vout->render.i_chroma; + fmt.i_aspect = p_vout->render.i_aspect; + fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width; + fmt.i_sar_den = VOUT_ASPECT_FACTOR; + w1 = p_vout->output.i_width / p_vout->p_sys->i_col; w1 &= ~1; h1 = w1 * VOUT_ASPECT_FACTOR / i_aspect&~1; @@ -394,12 +403,14 @@ static int Init( vout_thread_t *p_vout ) var_SetInteger( p_vout, "video-x", i_left + i_xpos - i_width); var_SetInteger( p_vout, "video-y", i_top + i_ypos ); + fmt.i_width = fmt.i_visible_width = i_width; + fmt.i_height = fmt.i_visible_height = i_height; + fmt.i_aspect = i_aspect * i_target_height / i_height * + i_width / i_target_width; + p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout = - vout_Create( p_vout, i_width, i_height, - p_vout->render.i_chroma, - i_aspect * i_target_height / i_height * - i_width / i_target_width ); - if( p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout == NULL ) + vout_Create( p_vout, &fmt ); + if( !p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout ) { msg_Err( p_vout, "failed to get %ix%i vout threads", p_vout->p_sys->i_col, p_vout->p_sys->i_row ); diff --git a/modules/visualization/goom.c b/modules/visualization/goom.c index f9d9e0a72d..1ec0f33aae 100644 --- a/modules/visualization/goom.c +++ b/modules/visualization/goom.c @@ -131,6 +131,7 @@ static int Open( vlc_object_t *p_this ) aout_filter_sys_t *p_sys; goom_thread_t *p_thread; vlc_value_t width, height; + video_format_t fmt = {0}; if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2' ) || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) @@ -160,10 +161,13 @@ static int Open( vlc_object_t *p_this ) var_Create( p_thread, "goom-height", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); var_Get( p_thread, "goom-height", &height ); - p_thread->p_vout = - vout_Request( p_filter, NULL, width.i_int, height.i_int, - VLC_FOURCC('R','V','3','2'), - VOUT_ASPECT_FACTOR * width.i_int/height.i_int ); + fmt.i_width = fmt.i_visible_width = width.i_int; + fmt.i_height = fmt.i_visible_height = height.i_int; + fmt.i_chroma = VLC_FOURCC('R','V','3','2'); + fmt.i_aspect = VOUT_ASPECT_FACTOR * width.i_int/height.i_int; + fmt.i_sar_num = fmt.i_sar_den = 1; + + p_thread->p_vout = vout_Request( p_filter, NULL, &fmt ); if( p_thread->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); @@ -386,7 +390,7 @@ static void Close( vlc_object_t *p_this ) vlc_thread_join( p_sys->p_thread ); /* Free data */ - vout_Request( p_filter, p_sys->p_thread->p_vout, 0, 0, 0, 0 ); + vout_Request( p_filter, p_sys->p_thread->p_vout, 0 ); vlc_mutex_destroy( &p_sys->p_thread->lock ); vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_object_detach( p_sys->p_thread ); diff --git a/modules/visualization/visual/visual.c b/modules/visualization/visual/visual.c index 5d10f61888..1c0c022332 100644 --- a/modules/visualization/visual/visual.c +++ b/modules/visualization/visual/visual.c @@ -132,6 +132,7 @@ static int Open( vlc_object_t *p_this ) vlc_value_t val; char *psz_effects, *psz_parser; + video_format_t fmt = {0}; if( ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') && p_filter->input.i_format != VLC_FOURCC('f','i','3','2') ) ) @@ -246,12 +247,13 @@ static int Open( vlc_object_t *p_this ) } /* Open the video output */ - p_sys->p_vout = - vout_Request( p_filter, NULL, - p_sys->i_width, p_sys->i_height, - VLC_FOURCC('I','4','2','0'), - VOUT_ASPECT_FACTOR * p_sys->i_width/p_sys->i_height ); + fmt.i_width = fmt.i_visible_width = p_sys->i_width; + fmt.i_height = fmt.i_visible_height = p_sys->i_height; + fmt.i_chroma = VLC_FOURCC('I','4','2','0'); + fmt.i_aspect = VOUT_ASPECT_FACTOR * p_sys->i_width/p_sys->i_height; + fmt.i_sar_num = fmt.i_sar_den = 1; + p_sys->p_vout = vout_Request( p_filter, NULL, &fmt ); if( p_sys->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); @@ -329,7 +331,7 @@ static void Close( vlc_object_t *p_this ) if( p_filter->p_sys->p_vout ) { - vout_Request( p_filter, p_filter->p_sys->p_vout, 0, 0, 0, 0 ); + vout_Request( p_filter, p_filter->p_sys->p_vout, 0 ); } /* Free the list */ diff --git a/src/input/decoder.c b/src/input/decoder.c index 3eee4294d7..40ef2bb1f2 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -779,7 +779,7 @@ static void DeleteDecoder( decoder_t * p_dec ) #undef p_pic /* We are about to die. Reattach video output to p_vlc. */ - vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 ); + vout_Request( p_dec, p_dec->p_owner->p_vout, 0 ); } if( p_dec->p_owner->p_sout_input ) @@ -885,15 +885,35 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) return NULL; } + if( !p_dec->fmt_out.video.i_sar_num || + !p_dec->fmt_out.video.i_sar_den ) + { + p_dec->fmt_out.video.i_sar_num = + p_dec->fmt_out.video.i_aspect * p_dec->fmt_out.video.i_height; + + p_dec->fmt_out.video.i_sar_den = VOUT_ASPECT_FACTOR * + p_dec->fmt_out.video.i_width; + } + + vlc_reduce( &p_dec->fmt_out.video.i_sar_num, + &p_dec->fmt_out.video.i_sar_den, + p_dec->fmt_out.video.i_sar_num, + p_dec->fmt_out.video.i_sar_den, 0 ); + + if( !p_dec->fmt_out.video.i_visible_width || + !p_dec->fmt_out.video.i_visible_height ) + { + p_dec->fmt_out.video.i_visible_width = + p_dec->fmt_out.video.i_width; + p_dec->fmt_out.video.i_visible_height = + p_dec->fmt_out.video.i_height; + } + p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec; p_sys->video = p_dec->fmt_out.video; p_sys->p_vout = vout_Request( p_dec, p_sys->p_vout, - p_sys->video.i_width, - p_sys->video.i_height, - p_sys->video.i_chroma, - p_sys->video.i_aspect ); - + &p_dec->fmt_out.video ); if( p_sys->p_vout == NULL ) { msg_Err( p_dec, "failed to create video output" ); diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index ed1e29d0a5..343475d7e9 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -9,6 +9,7 @@ * $Id$ * * Authors: Vincent Seguin + * Gildas Bazin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -74,11 +75,10 @@ int vout_Snapshot( vout_thread_t *, picture_t * ); * This function looks for a video output thread matching the current * properties. If not found, it spawns a new one. *****************************************************************************/ -vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, - unsigned int i_width, unsigned int i_height, - vlc_fourcc_t i_chroma, unsigned int i_aspect ) +vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, + video_format_t *p_fmt ) { - if( !i_width || !i_height || !i_chroma ) + if( !p_fmt ) { /* Reattach video output to input before bailing out */ if( p_vout ) @@ -168,10 +168,10 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, if( psz_filter_chain ) free( psz_filter_chain ); } - if( ( p_vout->render.i_width != i_width ) || - ( p_vout->render.i_height != i_height ) || - ( p_vout->render.i_chroma != i_chroma ) || - ( p_vout->render.i_aspect != i_aspect + if( ( p_vout->fmt_render.i_width != p_fmt->i_width ) || + ( p_vout->fmt_render.i_height != p_fmt->i_height ) || + ( p_vout->fmt_render.i_chroma != p_fmt->i_chroma ) || + ( p_vout->fmt_render.i_aspect != p_fmt->i_aspect && !p_vout->b_override_aspect ) || p_vout->b_filter_change ) { @@ -195,7 +195,7 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, { msg_Dbg( p_this, "no usable vout present, spawning one" ); - p_vout = vout_Create( p_this, i_width, i_height, i_chroma, i_aspect ); + p_vout = vout_Create( p_this, p_fmt ); } return p_vout; @@ -207,9 +207,7 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, * This function creates a new video output thread, and returns a pointer * to its description. On error, it returns NULL. *****************************************************************************/ -vout_thread_t * __vout_Create( vlc_object_t *p_parent, - unsigned int i_width, unsigned int i_height, - vlc_fourcc_t i_chroma, unsigned int i_aspect ) +vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) { vout_thread_t * p_vout; /* thread descriptor */ input_thread_t * p_input_thread; @@ -217,6 +215,11 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, char * psz_plugin; vlc_value_t val, text; + unsigned int i_width = p_fmt->i_width; + unsigned int i_height = p_fmt->i_height; + vlc_fourcc_t i_chroma = p_fmt->i_chroma; + unsigned int i_aspect = p_fmt->i_aspect; + /* Allocate descriptor */ p_vout = vlc_object_create( p_parent, VLC_OBJECT_VOUT ); if( p_vout == NULL ) @@ -241,6 +244,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, /* Initialize the rendering heap */ I_RENDERPICTURES = 0; + p_vout->fmt_render = *p_fmt; /* FIXME palette */ + p_vout->fmt_in = *p_fmt; /* FIXME palette */ p_vout->render.i_width = i_width; p_vout->render.i_height = i_height; p_vout->render.i_chroma = i_chroma; @@ -558,19 +563,59 @@ static int InitThread( vout_thread_t *p_vout ) msg_Dbg( p_vout, "got %i direct buffer(s)", I_OUTPUTPICTURES ); - AspectRatio( p_vout->render.i_aspect, &i_aspect_x, &i_aspect_y ); - msg_Dbg( p_vout, - "picture in %ix%i, chroma 0x%.8x (%4.4s), aspect ratio %i:%i", - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, (char*)&p_vout->render.i_chroma, - i_aspect_x, i_aspect_y ); + AspectRatio( p_vout->fmt_render.i_aspect, &i_aspect_x, &i_aspect_y ); + + msg_Dbg( p_vout, "picture in %ix%i (%i,%i,%ix%i), " + "chroma %4.4s, ar %i:%i, sar %i:%i", + p_vout->fmt_render.i_width, p_vout->fmt_render.i_height, + p_vout->fmt_render.i_x_offset, p_vout->fmt_render.i_y_offset, + p_vout->fmt_render.i_visible_width, + p_vout->fmt_render.i_visible_height, + (char*)&p_vout->fmt_render.i_chroma, + i_aspect_x, i_aspect_y, + p_vout->fmt_render.i_sar_num, p_vout->fmt_render.i_sar_den ); + + AspectRatio( p_vout->fmt_in.i_aspect, &i_aspect_x, &i_aspect_y ); + + msg_Dbg( p_vout, "picture user %ix%i (%i,%i,%ix%i), " + "chroma %4.4s, ar %i:%i, sar %i:%i", + p_vout->fmt_in.i_width, p_vout->fmt_in.i_height, + p_vout->fmt_in.i_x_offset, p_vout->fmt_in.i_y_offset, + p_vout->fmt_in.i_visible_width, + p_vout->fmt_in.i_visible_height, + (char*)&p_vout->fmt_in.i_chroma, + i_aspect_x, i_aspect_y, + p_vout->fmt_in.i_sar_num, p_vout->fmt_in.i_sar_den ); + + if( !p_vout->fmt_out.i_width || !p_vout->fmt_out.i_height ) + { + p_vout->fmt_out.i_width = p_vout->fmt_out.i_visible_width = + p_vout->output.i_width; + p_vout->fmt_out.i_height = p_vout->fmt_out.i_visible_height = + p_vout->output.i_height; + p_vout->fmt_out.i_x_offset = p_vout->fmt_out.i_y_offset = 0; + + p_vout->fmt_out.i_aspect = p_vout->output.i_aspect; + p_vout->fmt_out.i_chroma = p_vout->output.i_chroma; + } + if( !p_vout->fmt_out.i_sar_num || !p_vout->fmt_out.i_sar_num ) + { + p_vout->fmt_out.i_sar_num = p_vout->fmt_out.i_aspect * + p_vout->fmt_out.i_height; + p_vout->fmt_out.i_sar_den = VOUT_ASPECT_FACTOR * + p_vout->fmt_out.i_width; + } + + vlc_reduce( &p_vout->fmt_out.i_sar_num, &p_vout->fmt_out.i_sar_den, + p_vout->fmt_out.i_sar_num, p_vout->fmt_out.i_sar_den, 0 ); + + AspectRatio( p_vout->fmt_out.i_aspect, &i_aspect_x, &i_aspect_y ); - AspectRatio( p_vout->output.i_aspect, &i_aspect_x, &i_aspect_y ); - msg_Dbg( p_vout, - "picture out %ix%i, chroma 0x%.8x (%4.4s), aspect ratio %i:%i", + msg_Dbg( p_vout, "picture out %ix%i, chroma %4.4s, ar %i:%i, sar %i:%i", p_vout->output.i_width, p_vout->output.i_height, - p_vout->output.i_chroma, (char*)&p_vout->output.i_chroma, - i_aspect_x, i_aspect_y ); + (char*)&p_vout->output.i_chroma, + i_aspect_x, i_aspect_y, + p_vout->fmt_out.i_sar_num, p_vout->fmt_out.i_sar_den ); /* Calculate shifts from system-updated masks */ MaskToShift( &p_vout->output.i_lrshift, &p_vout->output.i_rrshift, diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index a7ff57fbfb..b3be49e7a6 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -286,24 +286,18 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, subpicture_t *p_subpic ) { - video_format_t fmt; int i_scale_width, i_scale_height; if( p_pic == NULL ) { /* XXX: subtitles */ - return NULL; } - fmt.i_aspect = p_vout->output.i_aspect; - fmt.i_chroma = p_vout->output.i_chroma; - fmt.i_width = p_vout->output.i_width; - fmt.i_height = p_vout->output.i_height; - fmt.i_sar_num = p_vout->output.i_aspect * fmt.i_height / fmt.i_width; - fmt.i_sar_den = VOUT_ASPECT_FACTOR; - i_scale_width = p_vout->output.i_width * 1000 / p_vout->render.i_width; - i_scale_height = p_vout->output.i_height * 1000 / p_vout->render.i_height; + 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 ) { @@ -320,7 +314,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, * subtitles. */ vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic ); - spu_RenderSubpictures( p_vout->p_spu, &fmt, + spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, PP_OUTPUTPICTURE[0], p_pic, p_subpic, i_scale_width, i_scale_height ); @@ -336,8 +330,8 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, /* 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, &fmt, p_pic, p_pic, p_subpic, - i_scale_width, i_scale_height ); + spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_pic, p_pic, + p_subpic, i_scale_width, i_scale_height ); return p_pic; } @@ -355,8 +349,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, &fmt, PP_OUTPUTPICTURE[0], - p_pic, p_subpic, i_scale_width, i_scale_height); + 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] ); @@ -378,10 +373,10 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, if( p_tmp_pic->i_status == FREE_PICTURE ) { vout_AllocatePicture( VLC_OBJECT(p_vout), - p_tmp_pic, p_vout->output.i_chroma, - p_vout->output.i_width, - p_vout->output.i_height, - p_vout->output.i_aspect ); + p_tmp_pic, p_vout->fmt_out.i_chroma, + p_vout->fmt_out.i_width, + p_vout->fmt_out.i_height, + p_vout->fmt_out.i_aspect ); p_tmp_pic->i_type = MEMORY_PICTURE; p_tmp_pic->i_status = RESERVED_PICTURE; } @@ -390,7 +385,7 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, p_vout->chroma.pf_convert( p_vout, p_pic, p_tmp_pic ); /* Render subpictures on the first direct buffer */ - spu_RenderSubpictures( p_vout->p_spu, &fmt, p_tmp_pic, + spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_tmp_pic, p_tmp_pic, p_subpic, i_scale_width, i_scale_height ); @@ -410,9 +405,9 @@ picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic, p_vout->chroma.pf_convert( p_vout, p_pic, &p_vout->p_picture[0] ); /* Render subpictures on the first direct buffer */ - spu_RenderSubpictures( p_vout->p_spu, &fmt, &p_vout->p_picture[0], - &p_vout->p_picture[0], p_subpic, - i_scale_width, i_scale_height ); + spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, + &p_vout->p_picture[0], &p_vout->p_picture[0], + p_subpic, i_scale_width, i_scale_height ); } if( p_vout->p_picture[0].pf_unlock ) @@ -435,7 +430,6 @@ void vout_PlacePicture( vout_thread_t *p_vout, if( (i_width <= 0) || (i_height <=0) ) { *pi_width = *pi_height = *pi_x = *pi_y = 0; - return; } -- 2.39.5