[vlc-commits] commit: programs is a string, which is a string, which is not a list ( Rémi Denis-Courmont )
git at videolan.org
git at videolan.org
Tue Jun 8 19:41:22 CEST 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Jun 8 20:39:01 2010 +0300| [034ae114634510d7cdf7fe15e2e76ac34c1a6ddf] | committer: Rémi Denis-Courmont
programs is a string, which is a string, which is not a list
This fixes an assertion failure whenever --programs is used.
This should also fix a memory leak in the ES output.
This needs testing and backport to 1.1-bugfix.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=034ae114634510d7cdf7fe15e2e76ac34c1a6ddf
---
src/input/es_out.c | 23 ++++++++++++++---------
src/input/input.c | 28 +++++++++++++++++++---------
src/input/var.c | 2 +-
src/misc/variables.c | 7 +------
4 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 8d644a1..1468ba4 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1747,19 +1747,24 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
}
else if( p_sys->i_mode == ES_OUT_MODE_PARTIAL )
{
- vlc_value_t val;
- int i;
- var_Get( p_sys->p_input, "programs", &val );
- for ( i = 0; i < val.p_list->i_count; i++ )
+ char *prgms = var_GetNonEmptyString( p_sys->p_input, "programs" );
+ if( prgms != NULL )
{
- if ( val.p_list->p_values[i].i_int == es->p_pgrm->i_id || b_force )
+ char *buf;
+
+ for ( const char *prgm = strtok_r( prgms, ",", &buf );
+ prgm != NULL;
+ prgm = strtok_r( NULL, ",", &buf ) )
{
- if( !EsIsSelected( es ) )
- EsSelect( out, es );
- break;
+ if( atoi( prgm ) == es->p_pgrm->i_id || b_force )
+ {
+ if( !EsIsSelected( es ) )
+ EsSelect( out, es );
+ break;
+ }
}
+ free( prgms );
}
- var_FreeList( &val, NULL );
}
else if( p_sys->i_mode == ES_OUT_MODE_AUTO )
{
diff --git a/src/input/input.c b/src/input/input.c
index 2947634..9f3b7bb 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1139,7 +1139,7 @@ static void UpdatePtsDelay( input_thread_t *p_input )
static void InitPrograms( input_thread_t * p_input )
{
int i_es_out_mode;
- vlc_value_t val;
+ vlc_list_t list;
/* Compute correct pts_delay */
UpdatePtsDelay( p_input );
@@ -1148,22 +1148,31 @@ static void InitPrograms( input_thread_t * p_input )
i_es_out_mode = ES_OUT_MODE_AUTO;
if( p_input->p->p_sout )
{
+ char *prgms;
+
if( var_GetBool( p_input, "sout-all" ) )
{
i_es_out_mode = ES_OUT_MODE_ALL;
}
else
+ if( (prgms = var_GetNonEmptyString( p_input, "programs" )) != NULL )
{
- var_Get( p_input, "programs", &val );
- if( val.p_list && val.p_list->i_count )
+ char *buf;
+
+ TAB_INIT( list.i_count, list.p_values );
+ for( const char *prgm = strtok_r( prgms, ",", &buf );
+ prgm != NULL;
+ prgm = strtok_r( NULL, ",", &buf ) )
{
+ vlc_value_t val = { .i_int = atoi( prgm ) };
+ TAB_APPEND( list.i_count, list.p_values, val );
+ }
+
+ if( list.i_count > 0 )
i_es_out_mode = ES_OUT_MODE_PARTIAL;
/* Note : we should remove the "program" callback. */
- }
- else
- {
- var_FreeList( &val, NULL );
- }
+
+ free( prgms );
}
}
es_out_SetMode( p_input->p->p_es_out, i_es_out_mode );
@@ -1176,7 +1185,8 @@ static void InitPrograms( input_thread_t * p_input )
else if( i_es_out_mode == ES_OUT_MODE_PARTIAL )
{
demux_Control( p_input->p->input.p_demux, DEMUX_SET_GROUP, -1,
- val.p_list );
+ &list );
+ TAB_CLEAN( list.i_count, list.p_values );
}
else
{
diff --git a/src/input/var.c b/src/input/var.c
index 0ad6ff4..92e738f 100644
--- a/src/input/var.c
+++ b/src/input/var.c
@@ -178,7 +178,7 @@ void input_ControlVarInit ( input_thread_t *p_input )
var_Change( p_input, "program", VLC_VAR_SETTEXT, &text, NULL );
/* Programs */
- var_Create( p_input, "programs", VLC_VAR_LIST | VLC_VAR_DOINHERIT );
+ var_Create( p_input, "programs", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
text.psz_string = _("Programs");
var_Change( p_input, "programs", VLC_VAR_SETTEXT, &text, NULL );
diff --git a/src/misc/variables.c b/src/misc/variables.c
index a280c8e..120aa4b 100644
--- a/src/misc/variables.c
+++ b/src/misc/variables.c
@@ -1048,12 +1048,7 @@ void var_OptionParse( vlc_object_t *p_obj, const char *psz_option,
if( psz_value != NULL )
*psz_value++ = '\0';
- /* FIXME: :programs should be handled generically */
- if( !strcmp( psz_name, "programs" ) )
- i_type = VLC_VAR_LIST;
- else
- i_type = config_GetType( p_obj, psz_name );
-
+ i_type = config_GetType( p_obj, psz_name );
if( !i_type && !psz_value )
{
/* check for "no-foo" or "nofoo" */
More information about the vlc-commits
mailing list