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.
}
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 )
{
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 );
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 );
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
{
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 );
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" */