]> git.sesse.net Git - vlc/commitdiff
TS input : only one audio & spu ES selected at a time
authorHenri Fallon <henri@videolan.org>
Fri, 13 Apr 2001 01:49:22 +0000 (01:49 +0000)
committerHenri Fallon <henri@videolan.org>
Fri, 13 Apr 2001 01:49:22 +0000 (01:49 +0000)
Intf : ts streams in menu
       fixed a typo

There be certainly need for debug on the TS input as vls complains about
wrong sized PES packets, and that many streams do not seem to work.

btw, I forgot to mention in my last commit the function that nooone will
ever use : "right button" key of 105 keys keybords support under X11,
Xv, Sdl

TODO
plugins/dvd/input_dvd.c
plugins/gnome/intf_gnome.c
plugins/gtk/intf_gtk.c
src/input/mpeg_system.c

diff --git a/TODO b/TODO
index 4889e527e65456c8a60d048ac47d7b1e4ebabf95..40381884a8e5bdaac632755f7c70fd12fcaca3fb 100644 (file)
--- a/TODO
+++ b/TODO
@@ -199,7 +199,7 @@ Description: Make aout eat less CPU
  When the vlc is launched without a stream, the audio_output thread
  eats all memory, probably because there is no msleep() when no data
  is available in the audio_output queue.
-Status: Done one doesn't know when by some unknown stranger
+Status: Done (henri)
 
 Task: 0x37
 Difficulty: Guru
index 3db7823e9332947f9e0dd4f6a8dc39ef6761b568..977dc61f2af68044a060c989e14bf4aada40b915 100644 (file)
@@ -10,7 +10,7 @@
  *  -dvd_udf to find files
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.43 2001/04/12 02:40:09 stef Exp $
+ * $Id: input_dvd.c,v 1.44 2001/04/13 01:49:22 henri Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -759,7 +759,7 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
             i_spu = main_GetIntVariable( INPUT_SUBTITLE_VAR, 0 );
             if( i_spu < 0 || i_spu > vts.manager_inf.i_spu_nb )
             {
-                main_PutIntVariable( INPUT_CHANNEL_VAR, 1 );
+                main_PutIntVariable( INPUT_SUBTITLE_VAR, 0 );
                 i_spu = 0;
             }
             if( i_spu > 0 && vts.manager_inf.i_spu_nb > 0 )
index cc560c836e18a89509f54025ab2fc221f0e66eec..d3653ad6ce80ec722331b225c614f6b2e448e148 100644 (file)
@@ -2,7 +2,7 @@
  * intf_gnome.c: Gnome interface
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_gnome.c,v 1.28 2001/04/12 03:26:53 stef Exp $
+ * $Id: intf_gnome.c,v 1.29 2001/04/13 01:49:22 henri Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -351,11 +351,13 @@ static gint GnomeManage( gpointer p_data )
         char            psz_title[3];
         char            psz_chapter[3];
 
+        /* Used by TS input when PMT changes */
         if( p_intf->p_input->stream.b_changed )
         {
             p_intf->p_sys->b_menus_update = 1;
             p_intf->p_input->stream.b_changed = 0;
-fprintf( stderr, "########changed interface##########\n" );
+            intf_WarnMsg( 2, 
+                          "Interface menus refreshed as stream has changed" );
         }
 
 #define p_area p_intf->p_input->stream.p_selected_area
index 9801c98b0e1b81e048fc83c9f3fbc5f10cbf11a6..e9c85b766033e3d7363c0b6e230ea4bb7b129567 100644 (file)
@@ -2,7 +2,7 @@
  * intf_gtk.c: Gtk+ interface
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_gtk.c,v 1.12 2001/04/11 12:52:10 sam Exp $
+ * $Id: intf_gtk.c,v 1.13 2001/04/13 01:49:22 henri Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -321,6 +321,19 @@ static gint GtkManage( gpointer p_data )
         p_intf->b_menu_change = 0;
     }
 
+    if( p_intf->p_input != NULL )
+    {
+        /* Used by TS input when PMT changes */
+        if( p_intf->p_input->stream.b_changed )
+        {
+            p_intf->p_sys->b_menus_update = 1;
+            p_intf->p_input->stream.b_changed = 0;
+            intf_WarnMsg( 2, 
+                          "Interface menus refreshed as stream has changed" );
+        }
+
+    }
+    
     /* Update language/chapter menus after user request */
     if( p_intf->p_input != NULL && p_intf->p_sys->p_window != NULL &&
         p_intf->p_sys->b_menus_update )
index d1e276e4749ffddff414bbd1dd7e15afa52318fd..132a34f4d904d246b94b51fc000913a08251db08 100644 (file)
@@ -2,7 +2,7 @@
  * mpeg_system.c: TS, PS and PES management
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: mpeg_system.c,v 1.49 2001/04/12 03:26:53 stef Exp $
+ * $Id: mpeg_system.c,v 1.50 2001/04/13 01:49:22 henri Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Michel Lespinasse <walken@via.ecp.fr>
@@ -1169,8 +1169,8 @@ void input_DemuxPSI( input_thread_t * p_input, data_packet_t * p_data,
          * (see ISO/IEC 13818 (2.4.4.2) which should be set to 0x00 */
         if( (u8)p[0] != 0x00 )
         {
-        /*    intf_WarnMsg( 2, */
-            intf_ErrMsg( "Non zero pointer field found. Trying to continue" );
+            intf_WarnMsg( 2, 
+                          "Non zero pointer field found. Trying to continue" );
             p+=(u8)p[0];
         }
         else
@@ -1180,7 +1180,7 @@ void input_DemuxPSI( input_thread_t * p_input, data_packet_t * p_data,
 
         if( ((u8)(p[1]) & 0xc0) != 0x80 ) 
         {
-            intf_ErrMsg( "Invalid PSI packet" );
+            intf_WarnMsg( 2, "Invalid PSI packet" );
             p_psi->b_trash = 1;
         }
         else 
@@ -1271,7 +1271,7 @@ void input_DemuxPSI( input_thread_t * p_input, data_packet_t * p_data,
                 input_DecodePMT( p_input, p_es );
                 break;
             default:
-                intf_ErrMsg("Received unknown PSI in demuxPSI");
+                intf_WarnMsg(2, "Received unknown PSI in demuxPSI");
         }
     }
 #undef p_psi    
@@ -1299,7 +1299,7 @@ static void input_DecodePAT( input_thread_t * p_input, es_descriptor_t * p_es )
         /* PAT has changed. We are going to delete all programms and 
          * create new ones. We chose not to only change what was needed
          * as a PAT change may mean the stream is radically changing and
-         * this is a secure method to avoid krashed */
+         * this is a secure method to avoid krashes */
         pgrm_descriptor_t * p_pgrm;
         es_descriptor_t   * p_current_es;
         es_ts_data_t      * p_es_demux;
@@ -1367,7 +1367,7 @@ static void input_DecodePAT( input_thread_t * p_input, es_descriptor_t * p_es )
  * DecodePMT : decode a given Program Stream Map
  * ***************************************************************************
  * When the PMT changes, it may mean a deep change in the stream, and it is
- * careful to deletes the ES and add them again. If the PMT doesn't change,
+ * careful to delete the ES and add them again. If the PMT doesn't change,
  * there no need to do anything.
  *****************************************************************************/
 static void input_DecodePMT( input_thread_t * p_input, es_descriptor_t * p_es )
@@ -1389,15 +1389,52 @@ static void input_DecodePMT( input_thread_t * p_input, es_descriptor_t * p_es )
         int                 i_section_length,i_current_section;
         int                 i_prog_info_length, i_loop;
         int                 i_es_info_length, i_pid, i_stream_type;
+        int                 i_audio_es, i_spu_es;
+        int                 i_required_audio_es, i_required_spu_es;
         
         p_current_section = p_psi->buffer;
         p_current_data = p_psi->buffer;
         
         p_pgrm_data->i_pcr_pid = U16_AT(p_current_section + 8) & 0x1fff;
         
+        i_audio_es = 0;
+        i_spu_es = 0;
+        
         /* Lock stream information */
         vlc_mutex_lock( &p_input->stream.stream_lock );
 
+        /* Get the number of the required audio stream */
+        if( p_main->b_audio )
+        {
+            /* Default is the first one */
+            i_required_audio_es = main_GetIntVariable( INPUT_CHANNEL_VAR, 1 );
+            if( i_required_audio_es < 0 )
+            {
+                main_PutIntVariable( INPUT_CHANNEL_VAR, 1 );
+                i_required_audio_es = 1;
+            }
+        }
+        else
+        {
+            i_required_audio_es = 0;
+        }
+
+        /* Same thing for subtitles */
+        if( p_main->b_video )
+        {
+            /* for spu, default is none */
+            i_required_spu_es = main_GetIntVariable( INPUT_SUBTITLE_VAR, 0 );
+            if( i_required_spu_es < 0 )
+            {
+                main_PutIntVariable( INPUT_SUBTITLE_VAR, 0 );
+                i_required_spu_es = 0;
+            }
+        }
+        else
+        {
+            i_required_spu_es = 0;
+        }
+        
         /* Delete all ES in this program  except the PSI */
         for( i_loop=0; i_loop < p_es->p_pgrm->i_es_number; i_loop++ )
         {
@@ -1429,10 +1466,40 @@ static void input_DecodePMT( input_thread_t * p_input, es_descriptor_t * p_es )
                 /* Add this ES to the program */
                 p_new_es = input_AddES( p_input, p_es->p_pgrm, 
                                         (u16)i_pid, sizeof( es_ts_data_t ) );
+
+                /* Tell the decoders what kind of stream it is */
                 p_new_es->i_type = i_stream_type;
+
+                /* Tell the interface what kind of stream it is and select 
+                 * the required ones */
+                switch( i_stream_type )
+                {
+                    case MPEG1_VIDEO_ES:
+                    case MPEG2_VIDEO_ES:
+                        p_new_es->i_cat = VIDEO_ES;
+                        input_SelectES( p_input, p_new_es );
+                        break;
+                    case MPEG1_AUDIO_ES:
+                    case MPEG2_AUDIO_ES:
+                    case AC3_AUDIO_ES :
+                    case LPCM_AUDIO_ES :
+                        p_new_es->i_cat = AUDIO_ES;
+                        i_audio_es += 1;
+                        if( i_audio_es == i_required_audio_es )
+                            input_SelectES( p_input, p_new_es );
+                        break;
+                    /* Not sure this one is fully norm-compliant */
+                    case DVD_SPU_ES :
+                        p_new_es->i_cat = SPU_ES;
+                        i_spu_es += 1;
+                        if( i_spu_es == i_required_spu_es )
+                            input_SelectES( p_input, p_new_es );
+                        break;
+                    default :
+                        p_new_es->i_cat = UNKNOWN_ES;
+                        break;
+                }
                 
-                /* We want to decode */
-                input_SelectES( p_input, p_new_es );
                 p_current_data += 5 + i_es_info_length;
             }
 
@@ -1443,6 +1510,12 @@ static void input_DecodePMT( input_thread_t * p_input, es_descriptor_t * p_es )
             
         } while( i_current_section < p_psi->i_last_section_number );
 
+        if( i_required_audio_es > i_audio_es )
+            intf_WarnMsg( 2, "TS input: Non-existing audio es required." );
+        
+        if( i_required_spu_es > i_spu_es )
+            intf_WarnMsg( 2, "TS input: Non-existing subtitles es required." );
+        
         p_pgrm_data->i_pmt_version = p_psi->i_version_number;
 
         /* inform interface that stream has changed */