[vlc-devel] [PATCH] subsdelay filter - initial version
Rémi Denis-Courmont
remi at remlab.net
Sun Mar 20 18:18:37 CET 2011
A few comments inline...
Le dimanche 20 mars 2011 00:34:25 Yuval Tze, vous avez écrit :
> struct
> {
> subpicture_t * (*pf_filter) ( filter_t *, mtime_t );
> + subpicture_t * (*pf_filter2) ( filter_t *, subpicture_t * );
Given you are introducing that callback for a new plugin class, you should
probably define a new structure within the callback union instead of extending
the subpicture structure.
(...)
> +static int SubsdelayCallback( vlc_object_t *p_this, char const
> *psz_var, vlc_value_t oldval, vlc_value_t newval, + void *p_data )
> +{
> + filter_sys_t *p_sys = (filter_sys_t *) p_data;
> +
> + VLC_UNUSED( oldval );
> +
> + if( !strcmp( psz_var, CFG_MODE ) )
> + {
> + p_sys->i_mode = newval.i_int;
> + }
> + else if( !strcmp( psz_var, CFG_FACTOR ) )
> + {
> + p_sys->i_factor = FLOAT_FACTOR_TO_INT_FACTOR( newval.f_float );
> + }
> + else if( !strcmp( psz_var, CFG_OVERLAP ) )
> + {
> + p_sys->i_overlap = newval.i_int;
> + }
> + else if( !strcmp( psz_var, CFG_MIN_ALPHA ) )
> + {
> + p_sys->i_min_alpha = newval.i_int;
> + }
> + else if( !strcmp( psz_var, CFG_MIN_STOPS_INTERVAL ) )
> + {
> + p_sys->i_min_stops_interval = MILLISEC_TO_MICROSEC( newval.i_int
> );
> + }
> + else if( !strcmp( psz_var, CFG_MIN_STOP_START_INTERVAL ) )
> + {
> + p_sys->i_min_stop_start_interval = MILLISEC_TO_MICROSEC(
> newval.i_int );
> + }
> + else if( !strcmp( psz_var, CFG_MIN_START_STOP_INTERVAL ) )
> + {
> + p_sys->i_min_start_stop_interval = MILLISEC_TO_MICROSEC(
> newval.i_int ); + }
> + else
> + {
> + return VLC_ENOVAR;
> + }
> +
> + SubsdelayRecalculateDelays( (filter_t *) p_this );
> +
> + return VLC_SUCCESS;
> +}
This does not seem to be thread-safe. Keep in mind that the UI thread may call
this function asynchronously (as far as the video thread is concerned anyway).
Depending on your taste, you might prefer to have one callback per variable
than a series of strcmp().
> +/*************************************************************************
> **** + * SubsdelayGetWordRank: Calculate single word rank according to its
> length +
> **************************************************************************
> ***/ +static int SubsdelayGetWordRank( int i_length )
> +{
> + static int p_rank[20] = { 0 };
> + int i;
> +
> + if( p_rank[0] == 0 )
> + {
> + /* inititalize rank array */
> + p_rank[0] = 300; /* base rank */
> + p_rank[1] = p_rank[0];
> + p_rank[2] = p_rank[1];
> +
> + for( i = 3; i < 20; i++ )
> + {
> + p_rank[i] = (int) ( 1.1 * p_rank[i - 1] );
> + }
This is not thread-safe, as there could be concurrent instances of the plugin
from different LibVLC pipelines in the same process. Precomputed values in a
'static const' table would seem more appropriate. You can still spell the
original 'formula' as a comment.
(...)
> +/*************************************************************************
> **** + * SubsdelayIsTextEmpty: Check if the text contains spaces only
> +
> **************************************************************************
> ***/ +static bool SubsdelayIsTextEmpty( char *psz_text )
> +{
> + int i;
> +
> + if( !psz_text )
> + {
> + return false;
> + }
> +
> + i = 0;
> + while ( psz_text[i] != '\0' )
> + {
> + if( psz_text[i] != ' ' )
> + {
> + return false;
> + }
> +
> + i++;
> + }
> +
> + return true;
> +}
> +
This could be simplified to:
psz_text += strspn( psz_text, " " );
return *psz_text;
Best regards,
--
Rémi Denis-Courmont
http://www.remlab.info/
http://fi.linkedin.com/in/remidenis
More information about the vlc-devel
mailing list