]> git.sesse.net Git - vlc/commitdiff
Fixed numerous bugs in ES selection.
authorChristophe Massiot <massiot@videolan.org>
Mon, 3 Dec 2001 11:49:04 +0000 (11:49 +0000)
committerChristophe Massiot <massiot@videolan.org>
Mon, 3 Dec 2001 11:49:04 +0000 (11:49 +0000)
plugins/mpeg/input_ps.c
src/input/mpeg_system.c

index ad664a6591514d8a3e484820c3f32eb097d37d7a..6fccdf71171ceea87ddce8047817e4aca30f7ca2 100644 (file)
@@ -2,7 +2,7 @@
  * input_ps.c: PS demux and packet management
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input_ps.c,v 1.39 2001/11/28 15:08:05 massiot Exp $
+ * $Id: input_ps.c,v 1.40 2001/12/03 11:49:04 massiot Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Cyril Deguet <asmax@via.ecp.fr>
@@ -291,78 +291,7 @@ static void PSInit( input_thread_t * p_input )
             /* (The PSM decoder will care about spawning the decoders) */
             p_input->stream.pp_programs[0]->b_is_ok = 1;
         }
-#ifdef AUTO_SPAWN
-        else
-        {
-            /* (We have to do it ourselves) */
-            int                 i_es;
-
-            /* FIXME: we should do multiple passes in case an audio type
-             * is not present */
-            for( i_es = 0;
-                 i_es < p_input->stream.pp_programs[0]->i_es_number;
-                 i_es++ )
-            {
-#define p_es p_input->stream.pp_programs[0]->pp_es[i_es]
-                switch( p_es->i_type )
-                {
-                    case MPEG1_VIDEO_ES:
-                    case MPEG2_VIDEO_ES:
-                        input_SelectES( p_input, p_es );
-                        break;
-
-                    case MPEG1_AUDIO_ES:
-                    case MPEG2_AUDIO_ES:
-                        if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
-                                == (p_es->i_id & 0x1F) )
-                        switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
-                        {
-                        case 0:
-                            main_PutIntVariable( INPUT_AUDIO_VAR,
-                                                 REQUESTED_MPEG );
-                        case REQUESTED_MPEG:
-                            input_SelectES( p_input, p_es );
-                        }
-                        break;
-
-                    case AC3_AUDIO_ES:
-                        if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
-                                == ((p_es->i_id & 0xF00) >> 8) )
-                        switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
-                        {
-                        case 0:
-                            main_PutIntVariable( INPUT_AUDIO_VAR,
-                                                 REQUESTED_AC3 );
-                        case REQUESTED_AC3:
-                            input_SelectES( p_input, p_es );
-                        }
-                        break;
-
-                    case DVD_SPU_ES:
-                        if( main_GetIntVariable( INPUT_SUBTITLE_VAR, -1 )
-                                == ((p_es->i_id & 0x1F00) >> 8) )
-                        {
-                            input_SelectES( p_input, p_es );
-                        }
-                        break;
-
-                    case LPCM_AUDIO_ES:
-                        if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
-                                == ((p_es->i_id & 0x1F00) >> 8) )
-                        switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
-                        {
-                        case 0:
-                            main_PutIntVariable( INPUT_AUDIO_VAR,
-                                                 REQUESTED_LPCM );
-                        case REQUESTED_LPCM:
-                            input_SelectES( p_input, p_es );
-                        }
-                        break;
-                }
-            }
-                    
-        }
-#endif
+
         if( p_main->b_stats )
         {
             input_DumpStream( p_input );
index 213a3ddb92631f35759e3bdfaf0126c3ca733fa7..5f2aca768b03db5d70913e466f665a4cae99037d 100644 (file)
@@ -2,7 +2,7 @@
  * mpeg_system.c: TS, PS and PES management
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: mpeg_system.c,v 1.65 2001/11/28 15:08:06 massiot Exp $
+ * $Id: mpeg_system.c,v 1.66 2001/12/03 11:49:04 massiot Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Michel Lespinasse <walken@via.ecp.fr>
@@ -708,8 +708,10 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
                         p_es->i_type = MPEG2_VIDEO_ES;
                         p_es->i_cat = VIDEO_ES;
 #ifdef AUTO_SPAWN
-                        if( !p_input->stream.b_seekable )
+                        if( p_main->b_video )
+                        {
                             input_SelectES( p_input, p_es );
+                        }
 #endif
                     }
                     else if( (i_id & 0xE0) == 0xC0 )
@@ -719,16 +721,18 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
                         p_es->b_audio = 1;
                         p_es->i_cat = AUDIO_ES;
 #ifdef AUTO_SPAWN
-                        if( !p_input->stream.b_seekable )
-                        if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
-                                == (p_es->i_id & 0x1F) )
-                        switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+                        if( p_main->b_audio )
                         {
-                        case 0:
-                            main_PutIntVariable( INPUT_CHANNEL_VAR,
-                                                 REQUESTED_MPEG );
-                        case REQUESTED_MPEG:
-                            input_SelectES( p_input, p_es );
+                            if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
+                                    == (p_es->i_id & 0x1F) )
+                            switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+                            {
+                            case 0:
+                                main_PutIntVariable( INPUT_CHANNEL_VAR,
+                                                     REQUESTED_MPEG );
+                            case REQUESTED_MPEG:
+                                input_SelectES( p_input, p_es );
+                            }
                         }
 #endif
                     }
@@ -739,16 +743,18 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
                         p_es->b_audio = 1;
                         p_es->i_cat = AUDIO_ES;
 #ifdef AUTO_SPAWN
-                        if( !p_input->stream.b_seekable )
-                        if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
-                                == ((p_es->i_id & 0xF00) >> 8) )
-                        switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+                        if( p_main->b_audio )
                         {
-                        case 0:
-                            main_PutIntVariable( INPUT_CHANNEL_VAR,
-                                                 REQUESTED_AC3 );
-                        case REQUESTED_AC3:
-                            input_SelectES( p_input, p_es );
+                            if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
+                                    == ((p_es->i_id & 0xF00) >> 8) )
+                            switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+                            {
+                            case 0:
+                                main_PutIntVariable( INPUT_CHANNEL_VAR,
+                                                     REQUESTED_AC3 );
+                            case REQUESTED_AC3:
+                                input_SelectES( p_input, p_es );
+                            }
                         }
 #endif
                     }
@@ -758,11 +764,13 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
                         p_es->i_type = DVD_SPU_ES;
                         p_es->i_cat = SPU_ES;
 #ifdef AUTO_SPAWN
-                        if( main_GetIntVariable( INPUT_SUBTITLE_VAR, -1 )
-                                == ((p_es->i_id & 0x1F00) >> 8) )
+                        if( p_main->b_video )
                         {
-                            if( !p_input->stream.b_seekable )
+                            if( main_GetIntVariable( INPUT_SUBTITLE_VAR, -1 )
+                                    == ((p_es->i_id & 0x1F00) >> 8) )
+                            {
                                 input_SelectES( p_input, p_es );
+                            }
                         }
 #endif
                     }
@@ -773,12 +781,30 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
                         p_es->b_audio = 1;
                         p_es->i_cat = AUDIO_ES;
                         /* FIXME : write the decoder */
+#ifdef AUTO_SPAWN
+                        if( p_main->b_audio )
+                        {
+                            if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
+                                    == ((p_es->i_id & 0x1F00) >> 8) )
+                            switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+                            {
+                            case 0:
+                                main_PutIntVariable( INPUT_CHANNEL_VAR,
+                                                     REQUESTED_LPCM );
+                            case REQUESTED_LPCM:
+                                input_SelectES( p_input, p_es );
+                            }
+                        }
+#endif
                     }
                     else
                     {
                         p_es->i_type = UNKNOWN_ES;
                     }
                 }
+
+                /* Inform the interface that the stream has changed */
+                p_input->stream.b_changed = 1;
             }
         } /* stream.b_is_ok */
         vlc_mutex_unlock( &p_input->stream.stream_lock );