]> git.sesse.net Git - vlc/blobdiff - src/input/input_programs.c
* all: better handling of multiple (video) tracks.
[vlc] / src / input / input_programs.c
index acd3f4f163b4c8f828ba42b62be904908d8f4325..a2467100d29c1b0045d0799b04a0683430c1e3f3 100644 (file)
@@ -2,7 +2,7 @@
  * input_programs.c: es_descriptor_t, pgrm_descriptor_t management
  *****************************************************************************
  * Copyright (C) 1999-2002 VideoLAN
- * $Id: input_programs.c,v 1.122 2003/11/24 00:39:02 fenrir Exp $
+ * $Id: input_programs.c,v 1.125 2003/11/29 11:12:46 fenrir Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -376,6 +376,7 @@ input_area_t * input_AddArea( input_thread_t * p_input,
         }
 
         if( text2.psz_string ) free( text2.psz_string );
+        free( val.psz_string );
     }
 
     if( p_input->stream.i_area_nb == 2 )
@@ -472,7 +473,7 @@ int input_SetProgram( input_thread_t * p_input, pgrm_descriptor_t * p_new_prg )
         switch( p_new_prg->pp_es[i_es_index]->i_cat )
         {
             case VIDEO_ES:
-                msg_Dbg( p_input, "selecting ES %x",
+                msg_Dbg( p_input, "selecting video ES %x",
                          p_new_prg->pp_es[i_es_index]->i_id );
                 input_SelectES( p_input, p_new_prg->pp_es[i_es_index] );
                 break;
@@ -480,7 +481,7 @@ int input_SetProgram( input_thread_t * p_input, pgrm_descriptor_t * p_new_prg )
                 i_audio_es += 1;
                 if( i_audio_es <= i_required_audio_es )
                 {
-                    msg_Dbg( p_input, "selecting ES %x",
+                    msg_Dbg( p_input, "selecting audio ES %x",
                              p_new_prg->pp_es[i_es_index]->i_id );
                     input_SelectES( p_input, p_new_prg->pp_es[i_es_index]);
                 }
@@ -490,7 +491,7 @@ int input_SetProgram( input_thread_t * p_input, pgrm_descriptor_t * p_new_prg )
                 i_spu_es += 1;
                 if( i_spu_es <= i_required_spu_es )
                 {
-                    msg_Dbg( p_input, "selecting ES %x",
+                    msg_Dbg( p_input, "selecting spu ES %x",
                              p_new_prg->pp_es[i_es_index]->i_id );
                     input_SelectES( p_input, p_new_prg->pp_es[i_es_index] );
                 }
@@ -544,6 +545,8 @@ void input_DelArea( input_thread_t * p_input, input_area_t * p_area )
         sprintf( val.psz_string, "title %i", p_area->i_id );
         var_Change( p_input, "navigation", VLC_VAR_DELCHOICE, &val, NULL );
         var_Destroy( p_input, val.psz_string );
+
+        free( val.psz_string );
     }
 
     /* Remove this area from the stream's list of areas */
@@ -1133,13 +1136,25 @@ static int ESCallback( vlc_object_t *p_this, char const *psz_cmd,
     input_thread_t *p_input = (input_thread_t *)p_this;
     unsigned int i;
     vlc_value_t val;
+    unsigned int i_cat = UNKNOWN_ES;
+    es_descriptor_t *p_es = NULL;
 
     vlc_mutex_lock( &p_input->stream.stream_lock );
 
-    /* Unselect old ES */
+    /* First search old es type */
     for( i = 0 ; i < p_input->stream.i_es_number ; i++ )
     {
-        if( p_input->stream.pp_es[i]->i_id == oldval.i_int &&
+        if( p_input->stream.pp_es[i]->i_id == oldval.i_int )
+        {
+            i_cat = p_input->stream.pp_es[i]->i_cat;
+        }
+    }
+
+    /* Unselect all old ES */
+    for( i = 0 ; i < p_input->stream.i_es_number ; i++ )
+    {
+        if( p_input->stream.pp_es[i]->i_cat == i_cat &&
+            p_input->stream.pp_es[i]->i_id != newval.i_int &&
             p_input->stream.pp_es[i]->p_dec != NULL )
         {
             input_UnselectES( p_input, p_input->stream.pp_es[i] );
@@ -1149,10 +1164,31 @@ static int ESCallback( vlc_object_t *p_this, char const *psz_cmd,
     /* Select new ES */
     for( i = 0 ; i < p_input->stream.i_es_number ; i++ )
     {
-        if( p_input->stream.pp_es[i]->i_id == newval.i_int &&
-            p_input->stream.pp_es[i]->p_dec == NULL )
+        if( p_input->stream.pp_es[i]->i_id == newval.i_int )
+        {
+            p_es = p_input->stream.pp_es[i];
+            if( p_es->p_dec == NULL )
+            {
+                input_SelectES( p_input, p_es );
+            }
+        }
+    }
+
+    if( p_es )
+    {
+        /* Fix value (mainly for multiple selected ES */
+        val.i_int = p_es->i_id;
+        switch( p_es->i_cat )
         {
-            input_SelectES( p_input, p_input->stream.pp_es[i] );
+        case AUDIO_ES:
+            var_Change( p_input, "audio-es", VLC_VAR_SETVALUE, &val, NULL );
+            break;
+        case SPU_ES:
+            var_Change( p_input, "spu-es", VLC_VAR_SETVALUE, &val, NULL );
+            break;
+        case VIDEO_ES:
+            var_Change( p_input, "video-es", VLC_VAR_SETVALUE, &val, NULL );
+            break;
         }
     }