]> git.sesse.net Git - vlc/blobdiff - src/input/input_dec.c
* input/input.c, libvlc.h: implemented new way to break vlc preferences :
[vlc] / src / input / input_dec.c
index f83006634a7c03150daaed5e227fbf735c84e7b6..4c80c32ec39ab566ec0f1cb8008394dc14d236b9 100644 (file)
@@ -2,7 +2,7 @@
  * input_dec.c: Functions for the management of decoders
  *****************************************************************************
  * Copyright (C) 1999-2004 VideoLAN
- * $Id: input_dec.c,v 1.88 2004/01/25 17:16:05 zorglub Exp $
+ * $Id: input_dec.c,v 1.94 2004/03/03 20:39:53 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Gildas Bazin <gbazin@netcourrier.com>
@@ -66,7 +66,8 @@ struct decoder_owner_sys_t
 
     vout_thread_t   *p_vout;
 
-    sout_packetizer_input_t *p_sout;
+    sout_instance_t         *p_sout;
+    sout_packetizer_input_t *p_sout_input;
 
     /* Current format in use by the output */
     video_format_t video;
@@ -95,34 +96,17 @@ decoder_t * input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es )
     vlc_value_t    val;
 
     /* If we are in sout mode, search for packetizer module */
-    var_Get( p_input, "sout", &val );
-    if( !p_es->b_force_decoder && val.psz_string && *val.psz_string )
+    if( !p_es->b_force_decoder && p_input->stream.p_sout )
     {
-        free( val.psz_string );
-        val.b_bool = VLC_TRUE;
-
-        if( p_es->i_cat == AUDIO_ES )
-        {
-            var_Get( p_input, "sout-audio", &val );
-        }
-        else if( p_es->i_cat == VIDEO_ES )
+        /* Create the decoder configuration structure */
+        p_dec = CreateDecoder( p_input, p_es, VLC_OBJECT_PACKETIZER );
+        if( p_dec == NULL )
         {
-            var_Get( p_input, "sout-video", &val );
+            msg_Err( p_input, "could not create packetizer" );
+            return NULL;
         }
 
-        if( val.b_bool )
-        {
-            /* Create the decoder configuration structure */
-            p_dec = CreateDecoder( p_input, p_es, VLC_OBJECT_PACKETIZER );
-            if( p_dec == NULL )
-            {
-                msg_Err( p_input, "could not create packetizer" );
-                return NULL;
-            }
-
-            p_dec->p_module =
-                module_Need( p_dec, "packetizer", "$packetizer" );
-        }
+        p_dec->p_module = module_Need( p_dec, "packetizer", "$packetizer", 0 );
     }
     else
     {
@@ -135,12 +119,10 @@ decoder_t * input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es )
         }
 
         /* default Get a suitable decoder module */
-        p_dec->p_module = module_Need( p_dec, "decoder", "$codec" );
-
-        if( val.psz_string ) free( val.psz_string );
+        p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 );
     }
 
-    if( !p_dec || !p_dec->p_module )
+    if( !p_dec->p_module )
     {
         msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'.\n"
                  "VLC probably does not support this sound or video format.",
@@ -275,7 +257,8 @@ void input_DecodePES( decoder_t * p_dec, pes_packet_t * p_pes )
             }
             p_block->i_pts = p_pes->i_pts;
             p_block->i_dts = p_pes->i_dts;
-            p_block->b_discontinuity = p_pes->b_discontinuity;
+            if( p_pes->b_discontinuity )
+                p_block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
             p_block->i_rate = p_pes->i_rate;
 
             input_DecodeBlock( p_dec, p_block );
@@ -324,7 +307,7 @@ static void input_NullPacket( input_thread_t * p_input,
     if( p_block )
     {
         memset( p_block->p_buffer, 0, PADDING_PACKET_SIZE );
-        p_block->b_discontinuity = 1;
+        p_block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
 
         block_FifoPut( p_es->p_dec->p_owner->p_fifo, p_block );
     }
@@ -482,7 +465,8 @@ static decoder_t * CreateDecoder( input_thread_t * p_input,
     p_dec->p_owner->p_aout = NULL;
     p_dec->p_owner->p_aout_input = NULL;
     p_dec->p_owner->p_vout = NULL;
-    p_dec->p_owner->p_sout = NULL;
+    p_dec->p_owner->p_sout = p_input->stream.p_sout;
+    p_dec->p_owner->p_sout_input = NULL;
     p_dec->p_owner->p_es_descriptor = p_es;
     /* decoder fifo */
     if( ( p_dec->p_owner->p_fifo = block_FifoNew( p_dec ) ) == NULL )
@@ -573,7 +557,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
 
         while( (p_sout_block = p_dec->pf_packetize( p_dec, &p_block )) )
         {
-            if( !p_dec->p_owner->p_sout )
+            if( !p_dec->p_owner->p_sout_input )
             {
                 es_format_Copy( &p_dec->p_owner->sout, &p_dec->fmt_out );
                 if( p_dec->p_owner->p_es_descriptor->p_pgrm )
@@ -582,11 +566,15 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
                         p_dec->p_owner->p_es_descriptor->p_pgrm->i_number;
                 }
                 p_dec->p_owner->sout.i_id = p_dec->p_owner->p_es_descriptor->i_id - 1;
+                if( p_dec->fmt_in.psz_language )
+                {
+                    p_dec->p_owner->sout.psz_language = strdup( p_dec->fmt_in.psz_language );
+                }
 
-                p_dec->p_owner->p_sout =
-                    sout_InputNew( p_dec, &p_dec->p_owner->sout );
+                p_dec->p_owner->p_sout_input =
+                    sout_InputNew( p_dec->p_owner->p_sout, &p_dec->p_owner->sout );
 
-                if( p_dec->p_owner->p_sout == NULL )
+                if( p_dec->p_owner->p_sout_input == NULL )
                 {
                     msg_Err( p_dec, "cannot create packetizer output" );
                     p_dec->b_error = VLC_TRUE;
@@ -607,7 +595,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
                 sout_buffer_t *p_sout_buffer;
 
                 p_sout_buffer =
-                    sout_BufferNew( p_dec->p_owner->p_sout->p_sout,
+                    sout_BufferNew( p_dec->p_owner->p_sout_input->p_sout,
                                     p_sout_block->i_buffer );
                 if( p_sout_buffer == NULL )
                 {
@@ -621,10 +609,13 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
                 p_sout_buffer->i_pts = p_sout_block->i_pts;
                 p_sout_buffer->i_dts = p_sout_block->i_dts;
                 p_sout_buffer->i_length = p_sout_block->i_length;
+                p_sout_buffer->i_flags =
+                        (p_sout_block->i_flags << SOUT_BUFFER_FLAGS_BLOCK_SHIFT)
+                          & SOUT_BUFFER_FLAGS_BLOCK_MASK;
 
                 block_Release( p_sout_block );
 
-                sout_InputSendBuffer( p_dec->p_owner->p_sout, p_sout_buffer );
+                sout_InputSendBuffer( p_dec->p_owner->p_sout_input, p_sout_buffer );
 
                 p_sout_block = p_next;
             }
@@ -706,9 +697,9 @@ static void DeleteDecoder( decoder_t * p_dec )
         vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 );
     }
 
-    if( p_dec->p_owner->p_sout )
+    if( p_dec->p_owner->p_sout_input )
     {
-        sout_InputDelete( p_dec->p_owner->p_sout );
+        sout_InputDelete( p_dec->p_owner->p_sout_input );
         if( p_dec->p_owner->sout.i_extra ) free(p_dec->p_owner->sout.p_extra);
     }