[vlc-commits] Clean --v4l2-set-ctrls up
Rémi Denis-Courmont
git at videolan.org
Thu Sep 1 20:17:49 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Sep 1 20:36:52 2011 +0300| [43782114e39bdd7a4dc72375bf2a178b439ffd80] | committer: Rémi Denis-Courmont
Clean --v4l2-set-ctrls up
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=43782114e39bdd7a4dc72375bf2a178b439ffd80
---
modules/access/v4l2.c | 98 ++++++++++++++++++++-----------------------------
1 files changed, 40 insertions(+), 58 deletions(-)
diff --git a/modules/access/v4l2.c b/modules/access/v4l2.c
index e38c83e..077b60b 100644
--- a/modules/access/v4l2.c
+++ b/modules/access/v4l2.c
@@ -430,7 +430,7 @@ vlc_module_end ()
static void CommonClose( vlc_object_t *, demux_sys_t * );
static char *ParseMRL( vlc_object_t *, const char * );
static void GetV4L2Params( demux_sys_t *, vlc_object_t * );
-static void SetAvailControlsByString( vlc_object_t *, demux_sys_t *, int );
+static void SetAvailControlsByString( vlc_object_t *, int );
static int DemuxControl( demux_t *, int, va_list );
static int AccessControl( access_t *, int, va_list );
@@ -597,9 +597,6 @@ struct demux_sys_t
int i_frequency;
int i_tuner_audio_mode;
- /* Controls */
- char *psz_set_ctrls;
-
#ifdef HAVE_LIBV4L2
bool b_libv4l2;
#endif
@@ -692,8 +689,6 @@ static void GetV4L2Params( demux_sys_t *p_sys, vlc_object_t *p_obj )
p_sys->i_frequency = var_CreateGetInteger( p_obj, "v4l2-tuner-frequency" );
p_sys->i_tuner_audio_mode = var_CreateGetInteger( p_obj, "v4l2-tuner-audio-mode" );
- p_sys->psz_set_ctrls = var_CreateGetString( p_obj, "v4l2-set-ctrls" );
-
char *psz_aspect = var_CreateGetString( p_obj, "v4l2-aspect-ratio" );
char *psz_delim = !EMPTY_STR(psz_aspect) ? strchr( psz_aspect, ':' ) : NULL;
if( psz_delim )
@@ -824,7 +819,6 @@ static void CommonClose( vlc_object_t *p_this, demux_sys_t *p_sys )
free( p_sys->psz_standard );
free( p_sys->p_codecs );
free( p_sys->psz_requested_chroma );
- free( p_sys->psz_set_ctrls );
free( p_sys );
}
@@ -1642,7 +1636,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
/* if MPEG encoder card, no need to do anything else after this */
ControlList( p_obj, i_fd, var_GetBool( p_obj, "v4l2-controls-reset" ),
b_demux );
- SetAvailControlsByString( p_obj, p_sys, i_fd );
+ SetAvailControlsByString( p_obj, i_fd );
/* Reset Cropping */
memset( &cropcap, 0, sizeof(cropcap) );
@@ -2555,79 +2549,67 @@ static int ControlList( vlc_object_t *p_obj, int i_fd, bool b_reset,
return VLC_SUCCESS;
}
-static void SetAvailControlsByString( vlc_object_t *p_obj, demux_sys_t *p_sys,
- int i_fd )
+static void SetAvailControlsByString( vlc_object_t *p_obj, int i_fd )
{
- char *psz_parser = p_sys->psz_set_ctrls;
- vlc_value_t val, text, name;
-
- if( psz_parser == NULL )
+ char *ctrls = var_InheritString( p_obj, CFG_PREFIX"set-ctrls" );
+ if( ctrls == NULL )
return;
- if( *psz_parser == '{' )
- psz_parser++;
+ vlc_value_t val, text;
- int i_ret = var_Change( p_obj, "allcontrols", VLC_VAR_GETCHOICES,
- &val, &text );
- if( i_ret < 0 )
+ if( var_Change( p_obj, "allcontrols", VLC_VAR_GETCHOICES, &val, &text ) )
{
msg_Err( p_obj, "Oops, can't find 'allcontrols' variable." );
+ free( ctrls );
return;
}
- while( *psz_parser && *psz_parser != '}' )
- {
- char *psz_delim, *psz_assign;
+ char *p = ctrls;
+ if( *p == '{' )
+ p++;
- while( *psz_parser == ',' || *psz_parser == ' ' )
- psz_parser++;
+ while( p != NULL && *p && *p != '}' )
+ {
+ p += strspn( p, ", " );
- psz_delim = strchr( psz_parser, ',' );
- if( psz_delim == NULL )
- psz_delim = strchr( psz_parser, '}' );
- if( psz_delim == NULL )
- psz_delim = psz_parser + strlen( psz_parser );
+ const char *name = p;
+ char *end = strchr( p, ',' );
+ if( end == NULL )
+ end = strchr( p, '}' );
+ if( end != NULL )
+ *(end++) = '\0';
- psz_assign = memchr( psz_parser, '=', psz_delim - psz_parser );
- if( psz_assign == NULL )
+ char *value = strchr( p, '=' );
+ if( value == NULL )
{
- char *psz_name = strndup( psz_parser, psz_delim - psz_parser );
- msg_Err( p_obj, "%s missing '='", psz_name );
- free( psz_name );
- psz_parser = psz_delim + 1;
+ msg_Err( p_obj, "syntax error in \"%s\": missing '='", name );
+ p = end;
continue;
}
+ *(value++) = '\0';
- for( int i = 0;
- i < val.p_list->i_count ;//&& psz_parser < psz_assign;
- i++ )
+ for( int i = 0; i < val.p_list->i_count; i++ )
{
- const char *psz_var = text.p_list->p_values[i].psz_string;
- int i_cid = val.p_list->p_values[i].i_int;
- var_Change( p_obj, psz_var, VLC_VAR_GETTEXT, &name, NULL );
- const char *psz_name = name.psz_string;
-
- int i_availstrlen = strlen( psz_name );
- int i_parsestrlen = psz_assign - psz_parser;
- int i_maxstrlen = __MAX( i_availstrlen, i_parsestrlen);
+ vlc_value_t vartext;
+ const char *var = text.p_list->p_values[i].psz_string;
- if( !strncasecmp( psz_name, psz_parser, i_maxstrlen ) )
+ var_Change( p_obj, var, VLC_VAR_GETTEXT, &vartext, NULL );
+ if( !strcasecmp( vartext.psz_string, name ) )
{
- Control( p_obj, i_fd, psz_name, i_cid,
- strtol( ++psz_assign, &psz_parser, 0) );
+ Control( p_obj, i_fd, name,
+ val.p_list->p_values[i].i_int,
+ strtol( value, NULL, 0 ) );
+ free( vartext.psz_string );
+ goto found;
}
- free( name.psz_string );
- }
-
- if( psz_parser < psz_assign )
- {
- char *psz_name = strndup( psz_parser, psz_assign - psz_parser );
- msg_Err( p_obj, "Control %s not available", psz_name );
- free( psz_name );
- psz_parser = ( *psz_delim ) ? ( psz_delim + 1 ) : psz_delim;
+ free( vartext.psz_string );
}
+ msg_Err( p_obj, "control %s not available", name );
+ found:
+ p = end;
}
var_FreeList( &val, &text );
+ free( ctrls );
}
/*****************************************************************************
More information about the vlc-commits
mailing list