[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 22:15:20 CEST 2010


vlc/vlc-1.1 | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Jun  8 20:39:01 2010 +0300| [fc267198ebbd86f33dcf5e6af063670279ae6fd3] | 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.
(cherry picked from commit 034ae114634510d7cdf7fe15e2e76ac34c1a6ddf)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=fc267198ebbd86f33dcf5e6af063670279ae6fd3
---

 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 e53a6c6..085bd25 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -1145,7 +1145,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 );
@@ -1154,22 +1154,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 );
@@ -1182,7 +1191,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 93b967a..5fca34b 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 9df5a40..1cbfefa 100644
--- a/src/misc/variables.c
+++ b/src/misc/variables.c
@@ -1046,12 +1046,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