From 43782114e39bdd7a4dc72375bf2a178b439ffd80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net> Date: Thu, 1 Sep 2011 20:36:52 +0300 Subject: [PATCH] Clean --v4l2-set-ctrls up --- modules/access/v4l2.c | 98 ++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 58 deletions(-) diff --git a/modules/access/v4l2.c b/modules/access/v4l2.c index e38c83e8b12c..077b60b7055c 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 ); } /***************************************************************************** -- GitLab