/* Utility function used by API below */ static int ChangeFiltersString( vlc_object_t * p_obj, const char* psz_variable, const char *psz_name, bool b_add ) { vlc_value_t val; char *psz_parser; var_Get( p_obj, psz_variable, &val ); if( !val.psz_string ) val.psz_string = strdup(""); psz_parser = strstr( val.psz_string, psz_name ); if( b_add ) { if( !psz_parser ) { psz_parser = val.psz_string; asprintf( &val.psz_string, (*val.psz_string) ? "%s:%s" : "%s%s", val.psz_string, psz_name ); free( psz_parser ); } else { return 0; } } else { if( psz_parser ) { memmove( psz_parser, psz_parser + strlen(psz_name) + (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ), strlen(psz_parser + strlen(psz_name)) + 1 ); } else { free( val.psz_string ); return 0; } } var_Set( p_obj, psz_variable, val ); free( val.psz_string ); return 1; } void libvlc_video_new_marq( libvlc_media_player_t *p_mi, const char *psz_target_name, libvlc_exception_t *p_e ) { vout_thread_t *p_vout = GetVout( p_mi, p_e ); /* GetVout will raise the exception for us */ if( !p_vout ) { return; } char *psz_name = malloc( strlen(psz_target_name) + 6); if (psz_name != NULL) { strcpy( psz_name, "marq@"); strcat( psz_name, psz_target_name); ChangeFiltersString( VLC_OBJECT( p_vout->p_spu ), "sub-filter", psz_name, true ); free( psz_name ); } vlc_object_release( p_vout ); } void libvlc_video_release_marq( libvlc_media_player_t *p_mi, const char *psz_target_name, libvlc_exception_t *p_e ) { vout_thread_t *p_vout = GetVout( p_mi, p_e ); vlc_object_t *p_filter; /* GetVout will raise the exception for us */ if( !p_vout ) { return; } char *psz_name = malloc( strlen(psz_target_name) + 6); if (psz_name != NULL) { strcpy( psz_name, "marq@"); strcat( psz_name, psz_target_name); p_filter = (vlc_object_t *) vlc_object_find_name( p_vout, psz_target_name, FIND_ANYWHERE ); if (p_filter) { var_SetString( p_filter, "marq-marquee", ""); vlc_object_release( p_filter ); } ChangeFiltersString( VLC_OBJECT( p_vout->p_spu ), "sub-filter", psz_name, false ); free( psz_name ); } vlc_object_release( p_vout ); } void libvlc_video_set_marq_settings( libvlc_media_player_t *p_mi, const char *psz_target_name, int i_position, int i_x, int i_y, int i_opacity, int i_color, int i_size, int i_timeout, libvlc_exception_t *p_e ) { vout_thread_t *p_vout = GetVout( p_mi, p_e ); vlc_object_t *p_filter; /* GetVout will raise the exception for us */ if( !p_vout ) { return; } p_filter = (vlc_object_t *) vlc_object_find_name( p_vout, psz_target_name, FIND_ANYWHERE ); if (p_filter) { var_SetInteger( p_filter, "marq-position", i_position); var_SetInteger( p_filter, "marq-x", i_x); var_SetInteger( p_filter, "marq-y", i_y); var_SetInteger( p_filter, "marq-opacity", i_opacity); var_SetInteger( p_filter, "marq-color", i_color); var_SetInteger( p_filter, "marq-size", i_size); var_SetInteger( p_filter, "marq-timeout", i_timeout); vlc_object_release( p_filter ); } vlc_object_release( p_vout ); } void libvlc_video_set_marq_marquee( libvlc_media_player_t *p_mi, const char *psz_target_name, const char *psz_marquee, libvlc_exception_t *p_e ) { vout_thread_t *p_vout = GetVout( p_mi, p_e ); vlc_object_t *p_filter; /* GetVout will raise the exception for us */ if( !p_vout ) { return; } p_filter = (vlc_object_t *) vlc_object_find_name( p_vout, psz_target_name, FIND_ANYWHERE ); if (p_filter) { var_SetString( p_filter, "marq-marquee", psz_marquee); vlc_object_release( p_filter ); } vlc_object_release( p_vout ); }