vlc | branch: master | Thomas Guillem <[email protected]> | Mon Jun 5 17:04:05 2017 +0200| [738b0971d0e2ec86e06f36819f0d7cf0ea227fa4] | committer: Thomas Guillem
lib/video: apply filters value to all vouts > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=738b0971d0e2ec86e06f36819f0d7cf0ea227fa4 --- lib/video.c | 73 +++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/lib/video.c b/lib/video.c index 5b5c70c6d2..3fcde1091c 100644 --- a/lib/video.c +++ b/lib/video.c @@ -699,8 +699,9 @@ void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, /* module helpers */ /* ************** */ -static void vout_EnableFilter( vlc_object_t *p_parent, const char *psz_name, - bool b_add ) +static int get_filter_str( vlc_object_t *p_parent, const char *psz_name, + bool b_add, const char **ppsz_filter_type, + char **ppsz_filter_value) { char *psz_parser; char *psz_string; @@ -710,7 +711,7 @@ static void vout_EnableFilter( vlc_object_t *p_parent, const char *psz_name, if( !p_obj ) { msg_Err( p_parent, "Unable to find filter module \"%s\".", psz_name ); - return; + return VLC_EGENERIC; } if( module_provides( p_obj, "video filter" ) ) @@ -728,7 +729,7 @@ static void vout_EnableFilter( vlc_object_t *p_parent, const char *psz_name, else { msg_Err( p_parent, "Unknown video filter type." ); - return; + return VLC_EGENERIC; } psz_string = var_GetString( p_parent, psz_filter_type ); @@ -746,14 +747,14 @@ static void vout_EnableFilter( vlc_object_t *p_parent, const char *psz_name, psz_string, psz_name ) == -1 ) { free( psz_parser ); - return; + return VLC_EGENERIC; } free( psz_parser ); } else { free( psz_string ); - return; + return VLC_EGENERIC; } } else @@ -771,13 +772,13 @@ static void vout_EnableFilter( vlc_object_t *p_parent, const char *psz_name, else { free( psz_string ); - return; + return VLC_EGENERIC; } } - var_SetString( p_parent, psz_filter_type, psz_string ); - - free( psz_string ); + *ppsz_filter_type = psz_filter_type; + *ppsz_filter_value = psz_string; + return VLC_SUCCESS; } static bool find_sub_source_by_name( libvlc_media_player_t *p_mi, const char *restrict name ) @@ -809,23 +810,22 @@ typedef const struct { static void set_value( libvlc_media_player_t *p_mi, const char *restrict name, const opt_t *restrict opt, unsigned i_expected_type, - const vlc_value_t *val ) + const vlc_value_t *val, bool b_sub_source ) { if( !opt ) return; - switch( opt->type ) + int i_type = opt->type; + vlc_value_t new_val = *val; + const char *psz_opt_name = opt->name; + switch( i_type ) { case 0: /* the enabler */ { - vout_thread_t *vout = GetVout( p_mi, 0 ); - vlc_object_t *p_parent = vout ? VLC_OBJECT( vout ) : - VLC_OBJECT( p_mi ); - vout_EnableFilter( p_parent, opt->name, val->i_int ); - if (vout != NULL) - { /* Fill sub-source */ - var_TriggerCallback( vout, "sub-source" ); - vlc_object_release( vout ); - } + int i_ret = get_filter_str( VLC_OBJECT( p_mi ), opt->name, val->i_int, + &psz_opt_name, &new_val.psz_string ); + if( i_ret != VLC_SUCCESS ) + return; + i_type = VLC_VAR_STRING; break; } case VLC_VAR_INTEGER: @@ -836,12 +836,29 @@ set_value( libvlc_media_player_t *p_mi, const char *restrict name, libvlc_printerr( "Invalid argument to %s", name ); return; } - var_SetChecked( p_mi, opt->name, opt->type, *val ); break; default: libvlc_printerr( "Invalid argument to %s", name ); return; } + + /* Set the new value to the media player. Next vouts created from this + * media player will inherit this new value */ + var_SetChecked( p_mi, psz_opt_name, i_type, new_val ); + + /* Set the new value to every loaded vouts */ + size_t i_vout_count; + vout_thread_t **pp_vouts = GetVouts( p_mi, &i_vout_count ); + for( size_t i = 0; i < i_vout_count; ++i ) + { + var_SetChecked( pp_vouts[i], psz_opt_name, i_type, new_val ); + if( b_sub_source ) + var_TriggerCallback( pp_vouts[i], "sub-source" ); + vlc_object_release( pp_vouts[i] ); + } + + if( opt->type == 0 ) + free( new_val.psz_string ); } static int @@ -946,7 +963,7 @@ void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi, unsigned option, int value ) { set_value( p_mi, "marq", marq_option_bynumber(option), VLC_VAR_INTEGER, - &(vlc_value_t) { .i_int = value } ); + &(vlc_value_t) { .i_int = value }, true ); } /***************************************************************************** @@ -956,7 +973,7 @@ void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi, unsigned option, const char * value ) { set_value( p_mi, "marq", marq_option_bynumber(option), VLC_VAR_STRING, - &(vlc_value_t){ .psz_string = (char *)value } ); + &(vlc_value_t){ .psz_string = (char *)value }, true ); } @@ -989,7 +1006,7 @@ void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, unsigned option, const char *psz_value ) { set_value( p_mi,"logo",logo_option_bynumber(option), VLC_VAR_STRING, - &(vlc_value_t){ .psz_string = (char *)psz_value } ); + &(vlc_value_t){ .psz_string = (char *)psz_value }, true ); } @@ -997,7 +1014,7 @@ void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi, unsigned option, int value ) { set_value( p_mi, "logo", logo_option_bynumber(option), VLC_VAR_INTEGER, - &(vlc_value_t) { .i_int = value } ); + &(vlc_value_t) { .i_int = value }, true ); } @@ -1036,7 +1053,7 @@ void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, unsigned option, int value ) { set_value( p_mi, "adjust", adjust_option_bynumber(option), VLC_VAR_INTEGER, - &(vlc_value_t) { .i_int = value } ); + &(vlc_value_t) { .i_int = value }, false ); } @@ -1051,7 +1068,7 @@ void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, unsigned option, float value ) { set_value( p_mi, "adjust", adjust_option_bynumber(option), VLC_VAR_FLOAT, - &(vlc_value_t) { .f_float = value } ); + &(vlc_value_t) { .f_float = value }, false ); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
