From 9786ac4147c27fbc2ead747d4ec908fd34c01ef5 Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Sun, 1 Oct 2006 16:33:59 +0000 Subject: [PATCH] use config chain for the --sub-filter option. Example: --sub-filter "marq{marquee=pouet}:marq{marquee=\$N,y=50,x=50}" Sub filters other than marq still need to be changed rc interface marq callbacks need to be fixed too --- include/vlc_filter.h | 2 +- modules/video_filter/marq.c | 36 ++++++++++++++++++----------- src/video_output/video_output.c | 2 +- src/video_output/vout_subpictures.c | 23 +++++++++++------- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/include/vlc_filter.h b/include/vlc_filter.h index 10db66bec8..bb651a69b1 100644 --- a/include/vlc_filter.h +++ b/include/vlc_filter.h @@ -58,7 +58,7 @@ struct filter_t es_format_t fmt_out; /* Filter configuration */ - config_chain_t * p_cfg; + config_chain_t * p_cfg; picture_t * ( * pf_video_filter ) ( filter_t *, picture_t * ); block_t * ( * pf_audio_filter ) ( filter_t *, block_t * ); diff --git a/modules/video_filter/marq.c b/modules/video_filter/marq.c index efbd180610..ef1f2c29b6 100644 --- a/modules/video_filter/marq.c +++ b/modules/video_filter/marq.c @@ -130,6 +130,8 @@ static char *ppsz_pos_descriptions[] = { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"), N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") }; +#define CFG_PREFIX "marq-" + /***************************************************************************** * Module descriptor *****************************************************************************/ @@ -139,26 +141,27 @@ vlc_module_begin(); set_callbacks( CreateFilter, DestroyFilter ); set_category( CAT_VIDEO ); set_subcategory( SUBCAT_VIDEO_SUBPIC ); - add_string( "marq-marquee", "VLC", NULL, MSG_TEXT, MSG_LONGTEXT, + add_string( CFG_PREFIX "marquee", "VLC", NULL, MSG_TEXT, MSG_LONGTEXT, VLC_FALSE ); set_section( N_("Position"), NULL ); - add_integer( "marq-x", -1, NULL, POSX_TEXT, POSX_LONGTEXT, VLC_TRUE ); - add_integer( "marq-y", 0, NULL, POSY_TEXT, POSY_LONGTEXT, VLC_TRUE ); - add_integer( "marq-position", 5, NULL, POS_TEXT, POS_LONGTEXT, VLC_FALSE ); + add_integer( CFG_PREFIX "x", -1, NULL, POSX_TEXT, POSX_LONGTEXT, VLC_TRUE ); + add_integer( CFG_PREFIX "y", 0, NULL, POSY_TEXT, POSY_LONGTEXT, VLC_TRUE ); + add_integer( CFG_PREFIX "position", 5, NULL, POS_TEXT, POS_LONGTEXT, VLC_FALSE ); set_section( N_("Font"), NULL ); /* 5 sets the default to top [1] left [4] */ change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); - add_integer_with_range( "marq-opacity", 255, 0, 255, NULL, + add_integer_with_range( CFG_PREFIX "opacity", 255, 0, 255, NULL, OPACITY_TEXT, OPACITY_LONGTEXT, VLC_FALSE ); - add_integer( "marq-color", 0xFFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, - VLC_FALSE ); + add_integer( CFG_PREFIX "color", 0xFFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, + VLC_FALSE ); change_integer_list( pi_color_values, ppsz_color_descriptions, 0 ); - add_integer( "marq-size", -1, NULL, SIZE_TEXT, SIZE_LONGTEXT, VLC_FALSE ); + add_integer( CFG_PREFIX "size", -1, NULL, SIZE_TEXT, SIZE_LONGTEXT, + VLC_FALSE ); set_section( N_("Misc"), NULL ); - add_integer( "marq-timeout", 0, NULL, TIMEOUT_TEXT, TIMEOUT_LONGTEXT, + add_integer( CFG_PREFIX "timeout", 0, NULL, TIMEOUT_TEXT, TIMEOUT_LONGTEXT, VLC_FALSE ); set_description( _("Marquee display") ); @@ -166,6 +169,10 @@ vlc_module_begin(); add_shortcut( "time" ); vlc_module_end(); +static const char *ppsz_filter_options[] = { + "marquee", "x", "y", "position", "color", "size", "timeout", NULL +}; + /***************************************************************************** * CreateFilter: allocates marquee video filter *****************************************************************************/ @@ -185,9 +192,12 @@ static int CreateFilter( vlc_object_t *p_this ) p_sys->p_style = malloc( sizeof( text_style_t ) ); memcpy( p_sys->p_style, &default_text_style, sizeof( text_style_t ) ); + config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options, + p_filter->p_cfg ); + #define CREATE_VAR( stor, type, var ) \ - p_sys->stor = var_CreateGet##type( p_filter->p_libvlc, var ); \ - var_AddCallback( p_filter->p_libvlc, var, MarqueeCallback, p_sys ); + p_sys->stor = var_CreateGet##type( p_filter, var ); \ + var_AddCallback( p_filter, var, MarqueeCallback, p_sys ); CREATE_VAR( i_xoff, Integer, "marq-x" ); CREATE_VAR( i_yoff, Integer, "marq-y" ); @@ -221,8 +231,8 @@ static void DestroyFilter( vlc_object_t *p_this ) /* Delete the marquee variables */ #define DEL_VAR(var) \ - var_DelCallback( p_filter->p_libvlc, var, MarqueeCallback, p_sys ); \ - var_Destroy( p_filter->p_libvlc, var ); + var_DelCallback( p_filter, var, MarqueeCallback, p_sys ); \ + var_Destroy( p_filter, var ); DEL_VAR( "marq-x" ); DEL_VAR( "marq-y" ); DEL_VAR( "marq-marquee" ); diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index b686b3b11d..fc7530bd7e 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -1555,7 +1555,7 @@ static int ParseVideoFilter2Chain( vout_thread_t *p_vout, char *psz_vfilters ) &p_vout->psz_vfilters[p_vout->i_vfilters_cfg], &p_vout->p_vfilters_cfg[p_vout->i_vfilters_cfg], psz_parser ); - msg_Dbg( p_vout, "adding vfilter: %s\n", + msg_Dbg( p_vout, "adding vfilter: %s", p_vout->psz_vfilters[p_vout->i_vfilters_cfg] ); p_vout->i_vfilters_cfg++; if( psz_parser && psz_parser ) diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 303d7babff..cb75b68efe 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -98,7 +98,8 @@ spu_t *__spu_Create( vlc_object_t *p_this ) */ int spu_Init( spu_t *p_spu ) { - char *psz_filter, *psz_filter_orig; + char *psz_filter; + char *psz_parser; vlc_value_t val; /* If the user requested a sub margin, we force the position. */ @@ -108,21 +109,28 @@ int spu_Init( spu_t *p_spu ) var_Create( p_spu, "sub-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_spu, "sub-filter", &val ); - psz_filter = psz_filter_orig = val.psz_string; - while( psz_filter && *psz_filter ) + + psz_filter = val.psz_string; + psz_parser = psz_filter; + + while( psz_parser && *psz_parser ) { - char *psz_parser = strchr( psz_filter, ':' ); + config_chain_t *p_cfg; /* Do we ever need to free this ? */ + char *psz_name; + + psz_parser = config_ChainCreate( &psz_name, &p_cfg, psz_parser ); - if( psz_parser ) *psz_parser++ = 0; + msg_Dbg( p_spu, "adding sub-filter: %s", psz_name ); p_spu->pp_filter[p_spu->i_filter] = vlc_object_create( p_spu, VLC_OBJECT_FILTER ); vlc_object_attach( p_spu->pp_filter[p_spu->i_filter], p_spu ); p_spu->pp_filter[p_spu->i_filter]->pf_sub_buffer_new = sub_new_buffer; p_spu->pp_filter[p_spu->i_filter]->pf_sub_buffer_del = sub_del_buffer; + p_spu->pp_filter[p_spu->i_filter]->p_cfg = p_cfg;; p_spu->pp_filter[p_spu->i_filter]->p_module = module_Need( p_spu->pp_filter[p_spu->i_filter], - "sub filter", psz_filter, 0 ); + "sub filter", psz_name, 0 ); if( p_spu->pp_filter[p_spu->i_filter]->p_module ) { filter_owner_sys_t *p_sys = malloc( sizeof(filter_owner_sys_t) ); @@ -143,9 +151,8 @@ int spu_Init( spu_t *p_spu ) msg_Dbg( p_spu, "can't add anymore filters" ); } - psz_filter = psz_parser; + free( psz_name ); } - if( psz_filter_orig ) free( psz_filter_orig ); return VLC_EGENERIC; } -- 2.39.2