[vlc-devel] [Patch] New audio & video filters for audio bargraph display inside video

Rémi Denis-Courmont remi at remlab.net
Wed Oct 21 19:47:47 CEST 2009


	Hello,

>diff -ruN vlc-1.0.2/configure.ac vlc-1.0.2_audiobargraph/configure.ac
>--- vlc-1.0.2/configure.ac	2009-09-19 21:30:22.000000000 +0200
>+++ vlc-1.0.2_audiobargraph/configure.ac	2009-10-19 12:17:13.906250000 +0200

New features should really be diffed against the master branch.

>+    add_integer( CFG_PREFIX "barGraph", 1, NULL, BARGRAPH_TEXT,
>BARGRAPH_LONGTEXT, false )

Conventionally, VLC uses only lower case for configuration items. Separate 
words with dash.

>+struct aout_filter_sys_t
>+{
>+	char*			address;
>+	int 			port;
>+	int 			barGraph;
>+	int 			barGraphRepetition;
>+	int 			silence;
>+	int 			timeWindow;
>+	float 			alarmThreshold;
>+	int 			repetitionTime;
>+	int				TCPconnection;
>+	int 			counter;
>+	int				nbChannels;
>+	ValueDate_t* 	first;
>+	ValueDate_t* 	last;

You're making your life more miserable with pointers. You can allocate those 
two structures directly inside aout_filter_sys_t.

>+    if( ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') &&
>+          p_filter->input.i_format != VLC_FOURCC('f','i','3','2') ) )

Why do you allow fixed-point? It seems this filter only works with floats.

>+	p_sys->TCPconnection = net_ConnectTCP(p_this,p_sys->address,p_sys->port);

net_ConnectTCP() can fail. You shouldn't blindly write to a socket -later- if 
you don't check that it was created succesfully.

>+    p_filter->pf_do_work = DoWork;
>+    p_filter->b_in_place= 1;

We use pf_audio_filter nowadays. The pf_do_work interface won't work in the 
master branch.

>+	for ( i_line = 20; i_line < scale+20; i_line++ ) {
>+		// black
>+		*(p_pic->p[0].p_pixels +
>+			(scale + 30 - i_line - 1) *
>+			p_pic->p[0].i_pitch + 20) = 0;
...

This piece of code is very repetitive. If you cannot factor it out, you might 
at least want to use a macro.

>+ * vout_sys_t: logo video output method descriptor

This is NOT the logo filter...

>+    /* FIXME missing lock */

Yes indeed...

>+forward:
>+    return var_Set( p_vout, psz_var, newval );

Uuuuuuuuuh, you are setting a variable from the variable callback? How come 
this is not deadlocking?

>+    var_AddCallback( p_filter, "audiobargraph_v-barWidth", BarGraphCallback, 
p_sys );
>+
>+    /* Misc init */
>+    p_filter->pf_sub_filter = Filter;
>+    p_sys->b_need_update = true;

Too late. You already registered a callback that might modify this value 
asynchronously.


>+    vlc_mutex_unlock( &p_BarGraph->lock );
>+
>+    /*  where to locate the bar graph: */
>+    if( p_sys->pos < 0 )

p_sys->pos is modified by a callback. You need to protect concurrent accesses. 
This applies to a few other variables too.

>+static int BarGraphCallback( vlc_object_t *p_this, char const *psz_var,
>+                         vlc_value_t oldval, vlc_value_t newval, void
>*p_data )
>+{
>+    VLC_UNUSED(oldval);
>+    filter_sys_t *p_sys = (filter_sys_t *)p_data;
>+    BarGraph_t *p_BarGraph = p_sys->p_BarGraph;
>+	char* i_values;
>+	char* res = NULL;
>+	char delim[] = ":";
>+
>+    if ( !strcmp( psz_var, "audiobargraph_v-x" ) )
>+    {
>+        p_sys->posx = newval.i_int;

Missing thread synchronization here too.

Best regards,

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list