From 034ae114634510d7cdf7fe15e2e76ac34c1a6ddf Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Tue, 8 Jun 2010 20:39:01 +0300 Subject: [PATCH] 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. --- 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 8d644a1822..1468ba4a7c 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 2947634b72..9f3b7bb3d9 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 0ad6ff43c3..92e738f291 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 a280c8e9df..120aa4bbdd 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" */ -- 2.39.2