]> git.sesse.net Git - vlc/commitdiff
* a52.c aac.c au.c dts.c flac.c wav.c: Converted all audio only demuxers
authorLaurent Aimar <fenrir@videolan.org>
Wed, 3 Mar 2004 11:40:19 +0000 (11:40 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Wed, 3 Mar 2004 11:40:19 +0000 (11:40 +0000)
 to demux2.

modules/demux/a52.c
modules/demux/aac.c
modules/demux/au.c
modules/demux/dts.c
modules/demux/flac.c
modules/demux/wav.c

index 668644cd0ca79e79b72ef5a75d46d92d6394b3a6..7a257f772f86ed28c644b6e08af36a5960e39c37 100644 (file)
@@ -2,7 +2,7 @@
  * a52.c : raw A/52 stream input module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: a52.c,v 1.6 2004/02/25 17:48:52 fenrir Exp $
+ * $Id: a52.c,v 1.7 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 #   include <unistd.h>
 #endif
 
-#define PCM_FRAME_SIZE (1536 * 4)
-#define A52_PACKET_SIZE (4 * PCM_FRAME_SIZE)
-#define A52_MAX_HEADER_SIZE 10
-
 /*****************************************************************************
- * Local prototypes
+ * Module descriptor
  *****************************************************************************/
 static int  Open  ( vlc_object_t * );
 static void Close ( vlc_object_t * );
-static int  Demux ( input_thread_t * );
 
-static int Control( input_thread_t *, int, va_list );
+vlc_module_begin();
+    set_description( _("Raw A/52 demuxer") );
+    set_capability( "demux2", 145 );
+    set_callbacks( Open, Close );
+    add_shortcut( "a52" );
+vlc_module_end();
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int Demux  ( demux_t * );
+static int Control( demux_t *, int, va_list );
 
 struct demux_sys_t
 {
@@ -57,63 +63,33 @@ struct demux_sys_t
     vlc_bool_t b_big_endian;
 };
 
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
-vlc_module_begin();
-    set_description( _("Raw A/52 demuxer") );
-    set_capability( "demux", 145 );
-    set_callbacks( Open, Close );
-    add_shortcut( "a52" );
-vlc_module_end();
+static int CheckSync( uint8_t *p_peek, vlc_bool_t *p_big_endian );
 
-/*****************************************************************************
- * CheckSync: Check if buffer starts with an A52 sync code
- *****************************************************************************/
-static int CheckSync( uint8_t *p_peek, vlc_bool_t *p_big_endian )
-{
-    /* Little endian version of the bitstream */
-    if( p_peek[0] == 0x77 && p_peek[1] == 0x0b &&
-        p_peek[4] < 0x60 /* bsid < 12 */ )
-    {
-        *p_big_endian = VLC_FALSE;
-        return VLC_SUCCESS;
-    }
-    /* Big endian version of the bitstream */
-    else if( p_peek[0] == 0x0b && p_peek[1] == 0x77 &&
-             p_peek[5] < 0x60 /* bsid < 12 */ )
-    {
-        *p_big_endian = VLC_TRUE;
-        return VLC_SUCCESS;
-    }
+#define PCM_FRAME_SIZE (1536 * 4)
+#define A52_PACKET_SIZE (4 * PCM_FRAME_SIZE)
+#define A52_MAX_HEADER_SIZE 10
 
-    return VLC_EGENERIC;
-}
 
 /*****************************************************************************
  * Open: initializes ES structures
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys;
-    byte_t *       p_peek;
-    int            i_peek = 0;
-    vlc_bool_t     b_big_endian;
-
-    p_input->pf_demux = Demux;
-    p_input->pf_demux_control = Control;
-    p_input->pf_rewind = NULL;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys;
+    byte_t      *p_peek;
+    int         i_peek = 0;
+    vlc_bool_t  b_big_endian;
 
     /* Check if we are dealing with a WAV file */
-    if( input_Peek( p_input, &p_peek, 12 ) == 12 &&
+    if( stream_Peek( p_demux->s, &p_peek, 12 ) == 12 &&
         !strncmp( p_peek, "RIFF", 4 ) && !strncmp( &p_peek[8], "WAVE", 4 ) )
     {
         int i_size;
 
         /* Skip the wave header */
         i_peek = 12 + 8;
-        while( input_Peek( p_input, &p_peek, i_peek ) == i_peek &&
+        while( stream_Peek( p_demux->s, &p_peek, i_peek ) == i_peek &&
                strncmp( p_peek + i_peek - 8, "data", 4 ) )
         {
             i_peek += GetDWLE( p_peek + i_peek - 4 ) + 8;
@@ -123,7 +99,7 @@ static int Open( vlc_object_t * p_this )
 
         /* Some A52 wav files don't begin with a sync code so we do a more
          * extensive search */
-        i_size = input_Peek( p_input, &p_peek, i_peek + A52_PACKET_SIZE * 2);
+        i_size = stream_Peek( p_demux->s, &p_peek, i_peek + A52_PACKET_SIZE * 2);
         i_size -= (PCM_FRAME_SIZE + A52_MAX_HEADER_SIZE);
 
         while( i_peek < i_size )
@@ -147,29 +123,30 @@ static int Open( vlc_object_t * p_this )
     }
 
     /* Have a peep at the show. */
-    if( input_Peek( p_input, &p_peek, i_peek + A52_MAX_HEADER_SIZE * 2 ) <
+    if( stream_Peek( p_demux->s, &p_peek, i_peek + A52_MAX_HEADER_SIZE * 2 ) <
         i_peek + A52_MAX_HEADER_SIZE * 2 )
     {
         /* Stream too short */
-        msg_Warn( p_input, "cannot peek()" );
+        msg_Warn( p_demux, "cannot peek()" );
         return VLC_EGENERIC;
     }
 
     if( CheckSync( p_peek + i_peek, &b_big_endian ) != VLC_SUCCESS )
     {
-        if( p_input->psz_demux && !strncmp( p_input->psz_demux, "a52", 3 ) )
-        {
-            /* User forced */
-            msg_Err( p_input, "this doesn't look like a A52 audio stream, "
-                     "continuing anyway" );
-        }
-        else
+        if( strncmp( p_demux->psz_demux, "a52", 3 ) )
         {
             return VLC_EGENERIC;
         }
+
+        /* User forced */
+        msg_Err( p_demux, "this doesn't look like a A52 audio stream, "
+                 "continuing anyway" );
     }
 
-    p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
+    /* Fill p_demux fields */
+    p_demux->pf_demux = Demux;
+    p_demux->pf_control = Control;
+    p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
     p_sys->b_start = VLC_TRUE;
     p_sys->i_mux_rate = 0;
     p_sys->b_big_endian = b_big_endian;
@@ -177,7 +154,7 @@ static int Open( vlc_object_t * p_this )
     /*
      * Load the A52 packetizer
      */
-    p_sys->p_packetizer = vlc_object_create( p_input, VLC_OBJECT_DECODER );
+    p_sys->p_packetizer = vlc_object_create( p_demux, VLC_OBJECT_DECODER );
     p_sys->p_packetizer->pf_decode_audio = 0;
     p_sys->p_packetizer->pf_decode_video = 0;
     p_sys->p_packetizer->pf_decode_sub = 0;
@@ -191,23 +168,12 @@ static int Open( vlc_object_t * p_this )
         module_Need( p_sys->p_packetizer, "packetizer", NULL );
     if( !p_sys->p_packetizer->p_module )
     {
-        msg_Err( p_input, "cannot find A52 packetizer" );
+        msg_Err( p_demux, "cannot find A52 packetizer" );
         return VLC_EGENERIC;
     }
 
     /* Create one program */
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    if( input_InitStream( p_input, 0 ) == -1 )
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot init stream" );
-        return VLC_EGENERIC;
-    }
-    p_input->stream.i_mux_rate = 0;
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
-
-    p_sys->p_es =
-        es_out_Add( p_input->p_es_out, &p_sys->p_packetizer->fmt_in );
+    p_sys->p_es = es_out_Add( p_demux->out, &p_sys->p_packetizer->fmt_in );
 
     return VLC_SUCCESS;
 }
@@ -217,8 +183,8 @@ static int Open( vlc_object_t * p_this )
  *****************************************************************************/
 static void Close( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t*)p_this;
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_t        *p_demux = (demux_t*)p_this;
+    demux_sys_t    *p_sys = p_demux->p_sys;
 
     /* Unneed module */
     module_Unneed( p_sys->p_packetizer, p_sys->p_packetizer->p_module );
@@ -234,16 +200,16 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************
  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
  *****************************************************************************/
-static int Demux( input_thread_t * p_input )
+static int Demux( demux_t *p_demux )
 {
-    demux_sys_t  *p_sys = p_input->p_demux_data;
-    block_t *p_block_in, *p_block_out;
+    demux_sys_t *p_sys = p_demux->p_sys;
+    block_t     *p_block_in, *p_block_out;
 
      /* Align stream */
-    int64_t i_pos = stream_Tell( p_input->s );
-    if( i_pos % 2 ) stream_Read( p_input->s, NULL, 1 );
+    int64_t i_pos = stream_Tell( p_demux->s );
+    if( i_pos % 2 ) stream_Read( p_demux->s, NULL, 1 );
 
-    if( !( p_block_in = stream_Block( p_input->s, A52_PACKET_SIZE ) ) )
+    if( !( p_block_in = stream_Block( p_demux->s, A52_PACKET_SIZE ) ) )
     {
         return 0;
     }
@@ -285,19 +251,15 @@ static int Demux( input_thread_t * p_input )
 
             /* We assume a constant bitrate */
             if( p_block_out->i_length )
-            p_sys->i_mux_rate =
-                p_block_out->i_buffer * I64C(1000000) / p_block_out->i_length;
-            p_input->stream.i_mux_rate = p_sys->i_mux_rate / 50;
-
-            input_ClockManageRef( p_input,
-                                  p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
+            {
+                p_sys->i_mux_rate =
+                    p_block_out->i_buffer * I64C(1000000)/p_block_out->i_length;
+            }
 
-            p_block_out->i_dts = p_block_out->i_pts =
-                input_ClockGetTS( p_input, p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
+            /* set PCR */
+            es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts );
 
-            es_out_Send( p_input->p_es_out, p_sys->p_es, p_block_out );
+            es_out_Send( p_demux->out, p_sys->p_es, p_block_out );
 
             p_block_out = p_next;
         }
@@ -309,36 +271,35 @@ static int Demux( input_thread_t * p_input )
 /*****************************************************************************
  * Control:
  *****************************************************************************/
-static int Control( input_thread_t *p_input, int i_query, va_list args )
+static int Control( demux_t *p_demux, int i_query, va_list args )
 {
-    demux_sys_t *p_sys  = (demux_sys_t *)p_input->p_demux_data;
-    int64_t *pi64;
+    demux_sys_t *p_sys  = p_demux->p_sys;
+    return demux2_vaControlHelper( p_demux->s,
+                                   0, -1,
+                                   8*p_sys->i_mux_rate, 1, i_query, args );
+}
 
-    switch( i_query )
+/*****************************************************************************
+ * CheckSync: Check if buffer starts with an A52 sync code
+ *****************************************************************************/
+static int CheckSync( uint8_t *p_peek, vlc_bool_t *p_big_endian )
+{
+    /* Little endian version of the bitstream */
+    if( p_peek[0] == 0x77 && p_peek[1] == 0x0b &&
+        p_peek[4] < 0x60 /* bsid < 12 */ )
     {
-        case DEMUX_GET_TIME:
-            pi64 = (int64_t*)va_arg( args, int64_t * );
-            if( p_sys->i_mux_rate > 0 )
-            {
-                *pi64 = I64C(1000000) * stream_Tell( p_input->s ) /
-                        p_sys->i_mux_rate;
-                return VLC_SUCCESS;
-            }
-            *pi64 = 0;
-            return VLC_EGENERIC;
-
-        case DEMUX_GET_LENGTH:
-            pi64 = (int64_t*)va_arg( args, int64_t * );
-            if( p_sys->i_mux_rate > 0 )
-            {
-                *pi64 = I64C(1000000) * stream_Size( p_input->s ) /
-                        p_sys->i_mux_rate;
-                return VLC_SUCCESS;
-            }
-            *pi64 = 0;
-            return VLC_EGENERIC;
-
-        default:
-            return demux_vaControlDefault( p_input, i_query, args );
+        *p_big_endian = VLC_FALSE;
+        return VLC_SUCCESS;
     }
+    /* Big endian version of the bitstream */
+    else if( p_peek[0] == 0x0b && p_peek[1] == 0x77 &&
+             p_peek[5] < 0x60 /* bsid < 12 */ )
+    {
+        *p_big_endian = VLC_TRUE;
+        return VLC_SUCCESS;
+    }
+
+    return VLC_EGENERIC;
 }
+
+
index 35bbb0bce44215eb648a914e4d24d0458539e1f0..e776fcace3caaf1d35f88dcc6bae40bb505bf854 100644 (file)
@@ -2,7 +2,7 @@
  * aac.c : Raw aac Stream input module for vlc
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: aac.c,v 1.9 2004/01/25 20:05:28 hartman Exp $
+ * $Id: aac.c,v 1.10 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -37,7 +37,7 @@ static void Close  ( vlc_object_t * );
 
 vlc_module_begin();
     set_description( _("AAC demuxer" ) );
-    set_capability( "demux", 10 );
+    set_capability( "demux2", 100 );
     set_callbacks( Open, Close );
     add_shortcut( "aac" );
 vlc_module_end();
@@ -50,8 +50,6 @@ vlc_module_end();
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static int  Demux       ( input_thread_t * );
-
 struct demux_sys_t
 {
     mtime_t         i_time;
@@ -59,9 +57,12 @@ struct demux_sys_t
     es_out_id_t     *p_es;
 };
 
+static int Demux  ( demux_t * );
+static int Control( demux_t *, int, va_list );
+
 static int i_aac_samplerate[16] =
 {
-    96000, 88200, 64000, 48000, 44100, 32000, 
+    96000, 88200, 64000, 48000, 44100, 32000,
     24000, 22050, 16000, 12000, 11025, 8000,
     7350,  0,     0,     0
 };
@@ -70,6 +71,7 @@ static int i_aac_samplerate[16] =
 #define AAC_SAMPLE_RATE( p ) i_aac_samplerate[((p)[2]>>2)&0x0f]
 #define AAC_CHANNELS( p )    ( (((p)[2]&0x01)<<2) | (((p)[3]>>6)&0x03) )
 #define AAC_FRAME_SIZE( p )  ( (((p)[3]&0x03) << 11)|( (p)[4] << 3 )|( (((p)[5]) >>5)&0x7 ) )
+
 /* FIXME it's plain wrong */
 #define AAC_FRAME_SAMPLES( p )  1024
 
@@ -86,33 +88,29 @@ static inline int HeaderCheck( uint8_t *p )
     return VLC_TRUE;
 }
 
-
 /*****************************************************************************
  * Open: initializes AAC demux structures
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys;
-    int            b_forced = VLC_FALSE;
-
-    uint8_t        *p_peek;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys;
+    int         b_forced = VLC_FALSE;
 
-    module_t       *p_id3;
+    uint8_t     *p_peek;
+    module_t    *p_id3;
+    es_format_t fmt;
 
-    es_format_t    fmt;
-
-
-    if( p_input->psz_demux && !strncmp( p_input->psz_demux, "aac", 3 ) )
+    if( !strncmp( p_demux->psz_demux, "aac", 3 ) )
     {
         b_forced = VLC_TRUE;
     }
 
-    if( p_input->psz_name )
+    if( p_demux->psz_path )
     {
-        int  i_len = strlen( p_input->psz_name );
+        int  i_len = strlen( p_demux->psz_path );
 
-        if( i_len > 4 && !strcasecmp( &p_input->psz_name[i_len - 4], ".aac" ) )
+        if( i_len > 4 && !strcasecmp( &p_demux->psz_path[i_len - 4], ".aac" ) )
         {
             b_forced = VLC_TRUE;
         }
@@ -123,33 +121,31 @@ static int Open( vlc_object_t * p_this )
         /* I haven't find any sure working aac detection so only forced or
          * extention check
          */
-        msg_Warn( p_input, "AAC module discarded" );
+        msg_Warn( p_demux, "AAC module discarded" );
         return VLC_EGENERIC;
     }
 
     /* skip possible id3 header */
-    p_id3 = module_Need( p_input, "id3", NULL );
-    if ( p_id3 )
+    if( ( p_id3 = module_Need( p_demux, "id3", NULL ) ) )
     {
-        module_Unneed( p_input, p_id3 );
+        module_Unneed( p_demux, p_id3 );
     }
 
-    p_input->pf_demux = Demux;
-    p_input->pf_demux_control = demux_vaControlDefault;
+    p_demux->pf_demux   = Demux;
+    p_demux->pf_control = Control;
+    p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
 
-    p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
     p_sys->i_time = 0;
 
     /* peek the begining (10 is for adts header) */
-    if( stream_Peek( p_input->s, &p_peek, 10 ) < 10 )
+    if( stream_Peek( p_demux->s, &p_peek, 10 ) < 10 )
     {
-        msg_Err( p_input, "cannot peek" );
+        msg_Err( p_demux, "cannot peek" );
         goto error;
     }
-
     if( !strncmp( p_peek, "ADIF", 4 ) )
     {
-        msg_Err( p_input, "ADIF file. Not yet supported. (Please report)" );
+        msg_Err( p_demux, "ADIF file. Not yet supported. (Please report)" );
         goto error;
     }
 
@@ -157,27 +153,16 @@ static int Open( vlc_object_t * p_this )
     if( HeaderCheck( p_peek ) )
     {
         fmt.audio.i_channels = AAC_CHANNELS( p_peek );
-        fmt.audio.i_rate = AAC_SAMPLE_RATE( p_peek );
+        fmt.audio.i_rate     = AAC_SAMPLE_RATE( p_peek );
 
-        msg_Dbg( p_input,
+        msg_Dbg( p_demux,
                  "adts header: id=%d channels=%d sample_rate=%d",
                  AAC_ID( p_peek ),
                  AAC_CHANNELS( p_peek ),
                  AAC_SAMPLE_RATE( p_peek ) );
     }
 
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    if( input_InitStream( p_input, 0 ) == -1)
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot init stream" );
-        goto error;
-    }
-    p_input->stream.i_mux_rate = 0 / 50;
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
-
-    p_sys->p_es = es_out_Add( p_input->p_es_out, &fmt );
-
+    p_sys->p_es = es_out_Add( p_demux->out, &fmt );
     return VLC_SUCCESS;
 
 error:
@@ -191,17 +176,17 @@ error:
  *****************************************************************************
  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
  *****************************************************************************/
-static int Demux( input_thread_t * p_input )
+static int Demux( demux_t *p_demux )
 {
-    demux_sys_t  *p_sys = p_input->p_demux_data;
-    block_t *p_block;
+    demux_sys_t *p_sys = p_demux->p_sys;
+    block_t     *p_block;
 
-    uint8_t      h[8];
-    uint8_t      *p_peek;
+    uint8_t     h[8];
+    uint8_t     *p_peek;
 
-    if( stream_Peek( p_input->s, &p_peek, 8 ) < 8 )
+    if( stream_Peek( p_demux->s, &p_peek, 8 ) < 8 )
     {
-        msg_Warn( p_input, "cannot peek" );
+        msg_Warn( p_demux, "cannot peek" );
         return 0;
     }
 
@@ -212,10 +197,10 @@ static int Demux( input_thread_t * p_input )
         int         i_skip = 0;
         int         i_peek;
 
-        i_peek = stream_Peek( p_input->s, &p_peek, 8096 );
+        i_peek = stream_Peek( p_demux->s, &p_peek, 8096 );
         if( i_peek < 8 )
         {
-            msg_Warn( p_input, "cannot peek" );
+            msg_Warn( p_demux, "cannot peek" );
             return 0;
         }
 
@@ -232,29 +217,27 @@ static int Demux( input_thread_t * p_input )
             i_skip++;
         }
 
-        msg_Warn( p_input, "garbage=%d bytes", i_skip );
-        stream_Read( p_input->s, NULL, i_skip );
+        msg_Warn( p_demux, "garbage=%d bytes", i_skip );
+        stream_Read( p_demux->s, NULL, i_skip );
         return 1;
     }
 
     memcpy( h, p_peek, 8 );    /* can't use p_peek after stream_*  */
 
-    input_ClockManageRef( p_input,
-                          p_input->stream.p_selected_program,
-                          p_sys->i_time * 9 / 100 );
 
-    if( ( p_block = stream_Block( p_input->s, AAC_FRAME_SIZE( h ) ) ) == NULL )
+
+    /* set PCR */
+    es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_time );
+
+    if( ( p_block = stream_Block( p_demux->s, AAC_FRAME_SIZE( h ) ) ) == NULL )
     {
-        msg_Warn( p_input, "cannot read data" );
+        msg_Warn( p_demux, "cannot read data" );
         return 0;
     }
 
-    p_block->i_dts =
-    p_block->i_pts = input_ClockGetTS( p_input,
-                                     p_input->stream.p_selected_program,
-                                     p_sys->i_time * 9 / 100 );
+    p_block->i_dts = p_block->i_pts = p_sys->i_time;
 
-    es_out_Send( p_input->p_es_out, p_sys->p_es, p_block );
+    es_out_Send( p_demux->out, p_sys->p_es, p_block );
 
     p_sys->i_time += (mtime_t)1000000 *
                      (mtime_t)AAC_FRAME_SAMPLES( h ) /
@@ -267,9 +250,21 @@ static int Demux( input_thread_t * p_input )
  *****************************************************************************/
 static void Close( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t*)p_this;
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     free( p_sys );
 }
 
+/*****************************************************************************
+ * Control:
+ *****************************************************************************/
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+    /* demux_sys_t *p_sys  = p_demux->p_sys; */
+    /* FIXME calculate the bitrate */
+    return demux2_vaControlHelper( p_demux->s,
+                                   0, -1,
+                                   8*0, 1, i_query, args );
+}
+
index cebd0bc285f2539a861d19b8ed9adc7fe370ad86..b73ed5ae447d0104b1961a0e0c0f8d3274e5a4fe 100644 (file)
@@ -2,7 +2,7 @@
  * au.c : au file input module for vlc
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: au.c,v 1.13 2004/01/29 15:11:17 fenrir Exp $
+ * $Id: au.c,v 1.14 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -331,75 +331,9 @@ static void Close( vlc_object_t * p_this )
 static int Control( demux_t *p_demux, int i_query, va_list args )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
-    double f, *pf;
-    int64_t *pi64;
 
-    switch( i_query )
-    {
-        case DEMUX_GET_POSITION:
-        {
-            int64_t i_tell = stream_Tell( p_demux->s );
-            int64_t i_end  = stream_Size( p_demux->s );
-
-            pf = (double*) va_arg( args, double* );
-
-            if( p_sys->i_header_size < i_end )
-            {
-                *pf = (double)( i_tell - p_sys->i_header_size ) /
-                      (double)(i_end - p_sys->i_header_size);
-                return VLC_SUCCESS;
-            }
-            return VLC_EGENERIC;
-        }
-        case DEMUX_SET_POSITION:
-        {
-            int64_t i_end  = stream_Size( p_demux->s );
-
-            f = (double) va_arg( args, double );
-
-            if( p_sys->i_header_size < i_end )
-            {
-                int64_t i_frame = (f * ( i_end - p_sys->i_header_size )) /
-                                  p_sys->fmt.audio.i_blockalign;
-
-                if( stream_Seek( p_demux->s, p_sys->i_header_size +
-                                             i_frame * p_sys->fmt.audio.i_blockalign ) )
-                {
-                    return VLC_EGENERIC;
-                }
-                p_sys->i_time = 1 + ( i_frame * p_sys->fmt.audio.i_blockalign / p_sys->i_frame_size ) * p_sys->i_frame_length;
-                return VLC_SUCCESS;
-            }
-            return VLC_EGENERIC;
-        }
-
-        case DEMUX_GET_TIME:
-            pi64 = (int64_t*)va_arg( args, int64_t * );
-            *pi64 = p_sys->i_time;
-            return VLC_SUCCESS;
-
-        case DEMUX_GET_LENGTH:
-        {
-            int64_t i_size  = stream_Size( p_demux->s ) - p_sys->i_header_size;
-            if( i_size > 0 )
-            {
-                pi64 = (int64_t*)va_arg( args, int64_t * );
-                *pi64 = i_size / p_sys->i_frame_size * p_sys->i_frame_length;
-                return VLC_SUCCESS;
-            }
-            return VLC_EGENERIC;
-        }
-        case DEMUX_SET_TIME:
-        case DEMUX_GET_FPS:
-        default:
-            return VLC_EGENERIC;
-    }
+    return demux2_vaControlHelper( p_demux->s, p_sys->i_header_size, -1,
+                                   p_sys->fmt.i_bitrate, p_sys->fmt.audio.i_blockalign,
+                                   i_query, args );
 }
 
-
-
-
-
-
-
-
index ae8931bef2fe5868f9d4710da574ee5e7b9d7bc7..3e20ec8446201880d0b45d390e285285fde41a3f 100644 (file)
@@ -2,7 +2,7 @@
  * dts.c : raw DTS stream input module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: dts.c,v 1.10 2004/02/25 17:48:52 fenrir Exp $
+ * $Id: dts.c,v 1.11 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 #include <vlc/input.h>
 #include <vlc_codec.h>
 
-#define DTS_PACKET_SIZE 16384
-#define DTS_PROBE_SIZE (DTS_PACKET_SIZE * 4)
-#define DTS_MAX_HEADER_SIZE 11
-
 /*****************************************************************************
- * Local prototypes
+ * Module descriptor
  *****************************************************************************/
 static int  Open  ( vlc_object_t * );
 static void Close ( vlc_object_t * );
-static int  Demux ( input_thread_t * );
 
-static int Control( input_thread_t *, int, va_list );
+vlc_module_begin();
+    set_description( _("Raw DTS demuxer") );
+    set_capability( "demux2", 155 );
+    set_callbacks( Open, Close );
+    add_shortcut( "dts" );
+vlc_module_end();
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int Demux  ( demux_t * );
+static int Control( demux_t *, int, va_list );
 
 struct demux_sys_t
 {
@@ -52,67 +58,24 @@ struct demux_sys_t
     int i_mux_rate;
 };
 
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
-vlc_module_begin();
-    set_description( _("Raw DTS demuxer") );
-    set_capability( "demux", 155 );
-    set_callbacks( Open, Close );
-    add_shortcut( "dts" );
-vlc_module_end();
-
-/*****************************************************************************
- * CheckSync: Check if buffer starts with a DTS sync code
- *****************************************************************************/
-static int CheckSync( uint8_t *p_peek )
-{
-    /* 14 bits, little endian version of the bitstream */
-    if( p_peek[0] == 0xff && p_peek[1] == 0x1f &&
-        p_peek[2] == 0x00 && p_peek[3] == 0xe8 &&
-        (p_peek[4] & 0xf0) == 0xf0 && p_peek[5] == 0x07 )
-    {
-        return VLC_SUCCESS;
-    }
-    /* 14 bits, big endian version of the bitstream */
-    else if( p_peek[0] == 0x1f && p_peek[1] == 0xff &&
-             p_peek[2] == 0xe8 && p_peek[3] == 0x00 &&
-             p_peek[4] == 0x07 && (p_peek[5] & 0xf0) == 0xf0)
-    {
-        return VLC_SUCCESS;
-    }
-    /* 16 bits, big endian version of the bitstream */
-    else if( p_peek[0] == 0x7f && p_peek[1] == 0xfe &&
-             p_peek[2] == 0x80 && p_peek[3] == 0x01 )
-    {
-        return VLC_SUCCESS;
-    }
-    /* 16 bits, little endian version of the bitstream */
-    else if( p_peek[0] == 0xfe && p_peek[1] == 0x7f &&
-             p_peek[2] == 0x01 && p_peek[3] == 0x80 )
-    {
-        return VLC_SUCCESS;
-    }
+static int CheckSync( uint8_t *p_peek );
 
-    return VLC_EGENERIC;
-}
+#define DTS_PACKET_SIZE 16384
+#define DTS_PROBE_SIZE (DTS_PACKET_SIZE * 4)
+#define DTS_MAX_HEADER_SIZE 11
 
 /*****************************************************************************
  * Open: initializes ES structures
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys;
-    byte_t *       p_peek;
-    int            i_peek = 0;
-
-    p_input->pf_demux = Demux;
-    p_input->pf_demux_control = Control;
-    p_input->pf_rewind = NULL;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys;
+    byte_t *     p_peek;
+    int          i_peek = 0;
 
     /* Check if we are dealing with a WAV file */
-    if( input_Peek( p_input, &p_peek, 20 ) == 20 &&
+    if( stream_Peek( p_demux->s, &p_peek, 20 ) == 20 &&
         !strncmp( p_peek, "RIFF", 4 ) && !strncmp( &p_peek[8], "WAVE", 4 ) )
     {
         int i_size;
@@ -125,7 +88,7 @@ static int Open( vlc_object_t * p_this )
             if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC;
             i_peek += i_size + 8;
 
-            if( input_Peek( p_input, &p_peek, i_peek ) != i_peek )
+            if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek )
                 return VLC_EGENERIC;
         }
 
@@ -133,7 +96,7 @@ static int Open( vlc_object_t * p_this )
         i_size = GetDWLE( p_peek + i_peek - 4 );
         if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC;
         i_peek += i_size + 8;
-        if( input_Peek( p_input, &p_peek, i_peek ) != i_peek )
+        if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek )
             return VLC_EGENERIC;
         if( GetWLE( p_peek + i_peek - i_size - 8 /* wFormatTag */ ) !=
             1 /* WAVE_FORMAT_PCM */ )
@@ -151,13 +114,13 @@ static int Open( vlc_object_t * p_this )
             if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC;
             i_peek += i_size + 8;
 
-            if( input_Peek( p_input, &p_peek, i_peek ) != i_peek )
+            if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek )
                 return VLC_EGENERIC;
         }
 
         /* Some DTS wav files don't begin with a sync code so we do a more
          * extensive search */
-        i_size = input_Peek( p_input, &p_peek, DTS_PROBE_SIZE );
+        i_size = stream_Peek( p_demux->s, &p_peek, DTS_PROBE_SIZE );
         i_size -= DTS_MAX_HEADER_SIZE;
 
         while( i_peek < i_size )
@@ -171,36 +134,35 @@ static int Open( vlc_object_t * p_this )
     }
 
     /* Have a peep at the show. */
-    if( input_Peek( p_input, &p_peek, i_peek + DTS_MAX_HEADER_SIZE * 2 ) <
+    if( stream_Peek( p_demux->s, &p_peek, i_peek + DTS_MAX_HEADER_SIZE * 2 ) <
         i_peek + DTS_MAX_HEADER_SIZE * 2 )
     {
         /* Stream too short */
-        msg_Warn( p_input, "cannot peek()" );
+        msg_Warn( p_demux, "cannot peek()" );
         return VLC_EGENERIC;
     }
 
     if( CheckSync( p_peek + i_peek ) != VLC_SUCCESS )
     {
-        if( p_input->psz_demux && !strncmp( p_input->psz_demux, "dts", 3 ) )
-        {
-            /* User forced */
-            msg_Err( p_input, "this doesn't look like a DTS audio stream, "
-                     "continuing anyway" );
-        }
-        else
+        if( strncmp( p_demux->psz_demux, "dts", 3 ) )
         {
             return VLC_EGENERIC;
         }
+        /* User forced */
+        msg_Err( p_demux, "this doesn't look like a DTS audio stream, "
+                 "continuing anyway" );
     }
 
-    p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
+    p_demux->pf_demux = Demux;
+    p_demux->pf_control = Control;
+    p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
     p_sys->b_start = VLC_TRUE;
     p_sys->i_mux_rate = 0;
 
     /*
      * Load the DTS packetizer
      */
-    p_sys->p_packetizer = vlc_object_create( p_input, VLC_OBJECT_DECODER );
+    p_sys->p_packetizer = vlc_object_create( p_demux, VLC_OBJECT_DECODER );
     p_sys->p_packetizer->pf_decode_audio = 0;
     p_sys->p_packetizer->pf_decode_video = 0;
     p_sys->p_packetizer->pf_decode_sub = 0;
@@ -214,23 +176,11 @@ static int Open( vlc_object_t * p_this )
         module_Need( p_sys->p_packetizer, "packetizer", NULL );
     if( !p_sys->p_packetizer->p_module )
     {
-        msg_Err( p_input, "cannot find DTS packetizer" );
+        msg_Err( p_demux, "cannot find DTS packetizer" );
         return VLC_EGENERIC;
     }
 
-    /* Create one program */
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    if( input_InitStream( p_input, 0 ) == -1 )
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot init stream" );
-        return VLC_EGENERIC;
-    }
-    p_input->stream.i_mux_rate = 0;
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
-
-    p_sys->p_es =
-        es_out_Add( p_input->p_es_out, &p_sys->p_packetizer->fmt_in );
+    p_sys->p_es = es_out_Add( p_demux->out, &p_sys->p_packetizer->fmt_in );
 
     return VLC_SUCCESS;
 }
@@ -238,10 +188,10 @@ static int Open( vlc_object_t * p_this )
 /*****************************************************************************
  * Close: frees unused data
  *****************************************************************************/
-static void Close( vlc_object_t * p_this )
+static void Close( vlc_object_t *p_this )
 {
-    input_thread_t *p_input = (input_thread_t*)p_this;
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     /* Unneed module */
     module_Unneed( p_sys->p_packetizer, p_sys->p_packetizer->p_module );
@@ -257,12 +207,12 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************
  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
  *****************************************************************************/
-static int Demux( input_thread_t * p_input )
+static int Demux( demux_t *p_demux )
 {
-    demux_sys_t  *p_sys = p_input->p_demux_data;
+    demux_sys_t *p_sys = p_demux->p_sys;
     block_t *p_block_in, *p_block_out;
 
-    if( !( p_block_in = stream_Block( p_input->s, DTS_PACKET_SIZE ) ) )
+    if( !( p_block_in = stream_Block( p_demux->s, DTS_PACKET_SIZE ) ) )
     {
         return 0;
     }
@@ -283,19 +233,15 @@ static int Demux( input_thread_t * p_input )
 
             /* We assume a constant bitrate */
             if( p_block_out->i_length )
-            p_sys->i_mux_rate =
-                p_block_out->i_buffer * I64C(1000000) / p_block_out->i_length;
-            p_input->stream.i_mux_rate = p_sys->i_mux_rate / 50;
-
-            input_ClockManageRef( p_input,
-                                  p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
+            {
+                p_sys->i_mux_rate =
+                    p_block_out->i_buffer * I64C(1000000) / p_block_out->i_length;
+            }
 
-            p_block_out->i_dts = p_block_out->i_pts =
-                input_ClockGetTS( p_input, p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
+            /* set PCR */
+            es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts );
 
-            es_out_Send( p_input->p_es_out, p_sys->p_es, p_block_out );
+            es_out_Send( p_demux->out, p_sys->p_es, p_block_out );
 
             p_block_out = p_next;
         }
@@ -307,36 +253,46 @@ static int Demux( input_thread_t * p_input )
 /*****************************************************************************
  * Control:
  *****************************************************************************/
-static int Control( input_thread_t *p_input, int i_query, va_list args )
+static int Control( demux_t *p_demux, int i_query, va_list args )
 {
-    demux_sys_t *p_sys  = (demux_sys_t *)p_input->p_demux_data;
-    int64_t *pi64;
+    demux_sys_t *p_sys  = p_demux->p_sys;
+    return demux2_vaControlHelper( p_demux->s,
+                                   0, -1,
+                                   8*p_sys->i_mux_rate, 1, i_query, args );
+}
 
-    switch( i_query )
+/*****************************************************************************
+ * CheckSync: Check if buffer starts with a DTS sync code
+ *****************************************************************************/
+static int CheckSync( uint8_t *p_peek )
+{
+    /* 14 bits, little endian version of the bitstream */
+    if( p_peek[0] == 0xff && p_peek[1] == 0x1f &&
+        p_peek[2] == 0x00 && p_peek[3] == 0xe8 &&
+        (p_peek[4] & 0xf0) == 0xf0 && p_peek[5] == 0x07 )
     {
-        case DEMUX_GET_TIME:
-            pi64 = (int64_t*)va_arg( args, int64_t * );
-            if( p_sys->i_mux_rate > 0 )
-            {
-                *pi64 = I64C(1000000) * stream_Tell( p_input->s ) /
-                        p_sys->i_mux_rate;
-                return VLC_SUCCESS;
-            }
-            *pi64 = 0;
-            return VLC_EGENERIC;
-
-        case DEMUX_GET_LENGTH:
-            pi64 = (int64_t*)va_arg( args, int64_t * );
-            if( p_sys->i_mux_rate > 0 )
-            {
-                *pi64 = I64C(1000000) * stream_Size( p_input->s ) /
-                        p_sys->i_mux_rate;
-                return VLC_SUCCESS;
-            }
-            *pi64 = 0;
-            return VLC_EGENERIC;
-
-        default:
-            return demux_vaControlDefault( p_input, i_query, args );
+        return VLC_SUCCESS;
+    }
+    /* 14 bits, big endian version of the bitstream */
+    else if( p_peek[0] == 0x1f && p_peek[1] == 0xff &&
+             p_peek[2] == 0xe8 && p_peek[3] == 0x00 &&
+             p_peek[4] == 0x07 && (p_peek[5] & 0xf0) == 0xf0)
+    {
+        return VLC_SUCCESS;
     }
+    /* 16 bits, big endian version of the bitstream */
+    else if( p_peek[0] == 0x7f && p_peek[1] == 0xfe &&
+             p_peek[2] == 0x80 && p_peek[3] == 0x01 )
+    {
+        return VLC_SUCCESS;
+    }
+    /* 16 bits, little endian version of the bitstream */
+    else if( p_peek[0] == 0xfe && p_peek[1] == 0x7f &&
+             p_peek[2] == 0x01 && p_peek[3] == 0x80 )
+    {
+        return VLC_SUCCESS;
+    }
+
+    return VLC_EGENERIC;
 }
+
index 9e042614db89d33ce5450b340b208b9cc8bb1009..a041d781119a852604460d73f5990ba3e720e6c2 100644 (file)
@@ -2,7 +2,7 @@
  * flac.c : FLAC demux module for vlc
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: flac.c,v 1.11 2004/02/25 17:48:52 fenrir Exp $
+ * $Id: flac.c,v 1.12 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -10,7 +10,7 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 #include <vlc/input.h>
 #include <vlc_codec.h>
 
-#define STREAMINFO_SIZE 38
-#define FLAC_PACKET_SIZE 16384
-
 /*****************************************************************************
- * Local prototypes
+ * Module descriptor
  *****************************************************************************/
 static int  Open  ( vlc_object_t * );
 static void Close ( vlc_object_t * );
-static int  Demux ( input_thread_t * );
+
+vlc_module_begin();
+    set_description( _("FLAC demuxer") );
+    set_capability( "demux2", 155 );
+    set_callbacks( Open, Close );
+    add_shortcut( "flac" );
+vlc_module_end();
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int Demux  ( demux_t * );
+static int Control( demux_t *, int, va_list );
 
 struct demux_sys_t
 {
@@ -47,76 +56,64 @@ struct demux_sys_t
     decoder_t *p_packetizer;
 };
 
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
-vlc_module_begin();                                      
-    set_description( _("FLAC demuxer") );                       
-    set_capability( "demux", 155 );
-    set_callbacks( Open, Close );
-    add_shortcut( "flac" );
-vlc_module_end();
+#define STREAMINFO_SIZE 38
+#define FLAC_PACKET_SIZE 16384
 
 /*****************************************************************************
  * Open: initializes ES structures
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys;
-    int            i_peek;
-    byte_t *       p_peek;
-    es_format_t    fmt;
-
-    p_input->pf_demux = Demux;
-    p_input->pf_demux_control = demux_vaControlDefault;
-    p_input->pf_rewind = NULL;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys;
+    int          i_peek;
+    byte_t      *p_peek;
+    es_format_t  fmt;
 
     /* Have a peep at the show. */
-    if( input_Peek( p_input, &p_peek, 4 ) < 4 )
+    if( stream_Peek( p_demux->s, &p_peek, 4 ) < 4 )
     {
         /* Stream shorter than 4 bytes... */
-        msg_Err( p_input, "cannot peek()" );
+        msg_Err( p_demux, "cannot peek()" );
         return VLC_EGENERIC;
     }
 
     if( p_peek[0]!='f' || p_peek[1]!='L' || p_peek[2]!='a' || p_peek[3]!='C' )
     {
-        if( p_input->psz_demux && !strncmp( p_input->psz_demux, "flac", 4 ) )
+        if( strncmp( p_demux->psz_demux, "flac", 4 ) )
         {
-            /* User forced */
-            msg_Err( p_input, "this doesn't look like a flac stream, "
-                     "continuing anyway" );
-        }
-        else
-        {
-            msg_Warn( p_input, "flac module discarded (no startcode)" );
+            msg_Warn( p_demux, "flac module discarded (no startcode)" );
             return VLC_EGENERIC;
         }
+        /* User forced */
+        msg_Err( p_demux, "this doesn't look like a flac stream, "
+                 "continuing anyway" );
     }
 
-    p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
+    p_demux->pf_demux   = Demux;
+    p_demux->pf_control = Control;
+    p_demux->p_sys      = p_sys = malloc( sizeof( demux_sys_t ) );
     es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( 'f', 'l', 'a', 'c' ) );
     p_sys->b_start = VLC_TRUE;
 
     /* We need to read and store the STREAMINFO metadata */
-    i_peek = stream_Peek( p_input->s, &p_peek, 8 );
+    i_peek = stream_Peek( p_demux->s, &p_peek, 8 );
     if( p_peek[4] & 0x7F )
     {
-        msg_Err( p_input, "this isn't a STREAMINFO metadata block" );
+        msg_Err( p_demux, "this isn't a STREAMINFO metadata block" );
         return VLC_EGENERIC;
     }
 
     if( ((p_peek[5]<<16)+(p_peek[6]<<8)+p_peek[7]) != (STREAMINFO_SIZE - 4) )
     {
-        msg_Err( p_input, "invalid size for a STREAMINFO metadata block" );
+        msg_Err( p_demux, "invalid size for a STREAMINFO metadata block" );
         return VLC_EGENERIC;
     }
 
     /*
      * Load the FLAC packetizer
      */
-    p_sys->p_packetizer = vlc_object_create( p_input, VLC_OBJECT_DECODER );
+    p_sys->p_packetizer = vlc_object_create( p_demux, VLC_OBJECT_DECODER );
     p_sys->p_packetizer->pf_decode_audio = 0;
     p_sys->p_packetizer->pf_decode_video = 0;
     p_sys->p_packetizer->pf_decode_sub = 0;
@@ -129,7 +126,7 @@ static int Open( vlc_object_t * p_this )
     /* Store STREAMINFO for the decoder and packetizer */
     p_sys->p_packetizer->fmt_in.i_extra = fmt.i_extra = STREAMINFO_SIZE + 4;
     p_sys->p_packetizer->fmt_in.p_extra = malloc( STREAMINFO_SIZE + 4 );
-    stream_Read( p_input->s, p_sys->p_packetizer->fmt_in.p_extra,
+    stream_Read( p_demux->s, p_sys->p_packetizer->fmt_in.p_extra,
                  STREAMINFO_SIZE + 4 );
 
     /* Fake this as the last metadata block */
@@ -146,22 +143,11 @@ static int Open( vlc_object_t * p_this )
             free( p_sys->p_packetizer->fmt_in.p_extra );
 
         vlc_object_destroy( p_sys->p_packetizer );
-        msg_Err( p_input, "cannot find flac packetizer" );
-        return VLC_EGENERIC;
-    }
-
-    /* Create one program */
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    if( input_InitStream( p_input, 0 ) == -1 )
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot init stream" );
+        msg_Err( p_demux, "cannot find flac packetizer" );
         return VLC_EGENERIC;
     }
-    p_input->stream.i_mux_rate = 0;
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
 
-    p_sys->p_es = es_out_Add( p_input->p_es_out, &fmt );
+    p_sys->p_es = es_out_Add( p_demux->out, &fmt );
 
     return VLC_SUCCESS;
 }
@@ -171,8 +157,8 @@ static int Open( vlc_object_t * p_this )
  *****************************************************************************/
 static void Close( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t*)p_this;
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     /* Unneed module */
     module_Unneed( p_sys->p_packetizer, p_sys->p_packetizer->p_module );
@@ -191,12 +177,12 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************
  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
  *****************************************************************************/
-static int Demux( input_thread_t * p_input )
+static int Demux( demux_t *p_demux )
 {
-    demux_sys_t  *p_sys = p_input->p_demux_data;
-    block_t *p_block_in, *p_block_out;
+    demux_sys_t *p_sys = p_demux->p_sys;
+    block_t     *p_block_in, *p_block_out;
 
-    if( !( p_block_in = stream_Block( p_input->s, FLAC_PACKET_SIZE ) ) )
+    if( !( p_block_in = stream_Block( p_demux->s, FLAC_PACKET_SIZE ) ) )
     {
         return 0;
     }
@@ -218,15 +204,10 @@ static int Demux( input_thread_t * p_input )
         {
             block_t *p_next = p_block_out->p_next;
 
-            input_ClockManageRef( p_input,
-                                  p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
-
-            p_block_out->i_dts = p_block_out->i_pts =
-                input_ClockGetTS( p_input, p_input->stream.p_selected_program,
-                                  p_block_out->i_pts * 9 / 100 );
+            /* set PCR */
+            es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts );
 
-            es_out_Send( p_input->p_es_out, p_sys->p_es, p_block_out );
+            es_out_Send( p_demux->out, p_sys->p_es, p_block_out );
 
             p_block_out = p_next;
         }
@@ -234,3 +215,16 @@ static int Demux( input_thread_t * p_input )
 
     return 1;
 }
+
+/*****************************************************************************
+ * Control:
+ *****************************************************************************/
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+    /* demux_sys_t *p_sys  = p_demux->p_sys; */
+    /* FIXME bitrate */
+    return demux2_vaControlHelper( p_demux->s,
+                                   0, -1,
+                                   8*0, 1, i_query, args );
+}
+
index d2ac680b7ac1913ffdd969561551ab5481d8cbf4..3ee091bbb8768834c7cfee14fb3adc6ba4bdd25a 100644 (file)
@@ -2,7 +2,7 @@
  * wav.c : wav file input module for vlc
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: wav.c,v 1.14 2004/02/23 23:01:05 gbazin Exp $
+ * $Id: wav.c,v 1.15 2004/03/03 11:40:19 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -39,14 +39,15 @@ static void Close( vlc_object_t * );
 
 vlc_module_begin();
     set_description( _("WAV demuxer") );
-    set_capability( "demux", 142 );
+    set_capability( "demux2", 142 );
     set_callbacks( Open, Close );
 vlc_module_end();
 
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static int Demux( input_thread_t * );
+static int Demux  ( demux_t * );
+static int Control( demux_t *, int i_query, va_list args );
 
 struct demux_sys_t
 {
@@ -61,36 +62,33 @@ struct demux_sys_t
     mtime_t         i_frame_length;
 };
 
-/*****************************************************************************
- * Declaration of local function
- *****************************************************************************/
 #define __EVEN( x ) ( ( (x)%2 != 0 ) ? ((x)+1) : (x) )
 
-static int ChunkFind( input_thread_t *, char *, unsigned int * );
+static int ChunkFind( demux_t *, char *, unsigned int * );
 
-static void FrameInfo_IMA_ADPCM( input_thread_t *, unsigned int *, mtime_t * );
-static void FrameInfo_MS_ADPCM ( input_thread_t *, unsigned int *, mtime_t * );
-static void FrameInfo_PCM      ( input_thread_t *, unsigned int *, mtime_t * );
+static void FrameInfo_IMA_ADPCM( demux_t *, unsigned int *, mtime_t * );
+static void FrameInfo_MS_ADPCM ( demux_t *, unsigned int *, mtime_t * );
+static void FrameInfo_PCM      ( demux_t *, unsigned int *, mtime_t * );
 
 /*****************************************************************************
  * Open: check file and initializes structures
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys;
 
-    uint8_t        *p_peek;
-    unsigned int   i_size, i_extended;
-    char *psz_name;
+    uint8_t     *p_peek;
+    unsigned int i_size, i_extended;
+    char        *psz_name;
 
     WAVEFORMATEXTENSIBLE *p_wf_ext;
     WAVEFORMATEX         *p_wf;
 
     /* Is it a wav file ? */
-    if( input_Peek( p_input, &p_peek, 12 ) < 12 )
+    if( stream_Peek( p_demux->s, &p_peek, 12 ) < 12 )
     {
-        msg_Warn( p_input, "WAV module discarded (cannot peek)" );
+        msg_Warn( p_demux, "WAV module discarded (cannot peek)" );
         return VLC_EGENERIC;
     }
     if( strncmp( p_peek, "RIFF", 4 ) || strncmp( &p_peek[8], "WAVE", 4 ) )
@@ -98,35 +96,35 @@ static int Open( vlc_object_t * p_this )
         return VLC_EGENERIC;
     }
 
-    p_input->pf_demux     = Demux;
-    p_input->pf_demux_control = demux_vaControlDefault;
-    p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
-    p_sys->p_es           = NULL;
-    p_sys->i_time         = 0;
+    p_demux->pf_demux   = Demux;
+    p_demux->pf_control = Control;
+    p_demux->p_sys      = p_sys = malloc( sizeof( demux_sys_t ) );
+    p_sys->p_es         = NULL;
+    p_sys->i_time       = 0;
 
     /* skip riff header */
-    stream_Read( p_input->s, NULL, 12 );  /* cannot fail as peek succeed */
+    stream_Read( p_demux->s, NULL, 12 );  /* cannot fail as peek succeed */
 
     /* search fmt chunk */
-    if( ChunkFind( p_input, "fmt ", &i_size ) )
+    if( ChunkFind( p_demux, "fmt ", &i_size ) )
     {
-        msg_Err( p_input, "cannot find 'fmt ' chunk" );
+        msg_Err( p_demux, "cannot find 'fmt ' chunk" );
         goto error;
     }
     if( i_size < sizeof( WAVEFORMATEX ) - 2 )   /* XXX -2 isn't a typo */
     {
-        msg_Err( p_input, "invalid 'fmt ' chunk" );
+        msg_Err( p_demux, "invalid 'fmt ' chunk" );
         goto error;
     }
-    stream_Read( p_input->s, NULL, 8 );   /* Cannot fail */
+    stream_Read( p_demux->s, NULL, 8 );   /* Cannot fail */
 
     /* load waveformatex */
     p_wf = (WAVEFORMATEX *)p_wf_ext = malloc( __EVEN( i_size ) + 2 );
     p_wf->cbSize = 0;
-    if( stream_Read( p_input->s,
+    if( stream_Read( p_demux->s,
                      p_wf, __EVEN( i_size ) ) < (int)__EVEN( i_size ) )
     {
-        msg_Err( p_input, "cannot load 'fmt ' chunk" );
+        msg_Err( p_demux, "cannot load 'fmt ' chunk" );
         goto error;
     }
 
@@ -158,7 +156,7 @@ static int Open( vlc_object_t * p_this )
                 p_sys->fmt.i_extra );
     }
 
-    msg_Dbg( p_input, "format: 0x%4.4x, fourcc: %4.4s, channels: %d, "
+    msg_Dbg( p_demux, "format: 0x%4.4x, fourcc: %4.4s, channels: %d, "
              "freq: %d Hz, bitrate: %dKo/s, blockalign: %d, bits/samples: %d, "
              "extra size: %d",
              GetWLE( &p_wf->wFormatTag ), (char *)&p_sys->fmt.i_codec,
@@ -174,20 +172,20 @@ static int Open( vlc_object_t * p_this )
     case VLC_FOURCC( 'a', 'f', 'l', 't' ):
     case VLC_FOURCC( 'u', 'l', 'a', 'w' ):
     case VLC_FOURCC( 'a', 'l', 'a', 'w' ):
-        FrameInfo_PCM( p_input, &p_sys->i_frame_size, &p_sys->i_frame_length );
+        FrameInfo_PCM( p_demux, &p_sys->i_frame_size, &p_sys->i_frame_length );
         break;
     case VLC_FOURCC( 'm', 's', 0x00, 0x02 ):
-        FrameInfo_MS_ADPCM( p_input, &p_sys->i_frame_size,
+        FrameInfo_MS_ADPCM( p_demux, &p_sys->i_frame_size,
                             &p_sys->i_frame_length );
         break;
     case VLC_FOURCC( 'm', 's', 0x00, 0x11 ):
-        FrameInfo_IMA_ADPCM( p_input, &p_sys->i_frame_size,
+        FrameInfo_IMA_ADPCM( p_demux, &p_sys->i_frame_size,
                              &p_sys->i_frame_length );
         break;
     case VLC_FOURCC( 'm', 's', 0x00, 0x61 ):
     case VLC_FOURCC( 'm', 's', 0x00, 0x62 ):
         /* FIXME not sure at all FIXME */
-        FrameInfo_MS_ADPCM( p_input, &p_sys->i_frame_size,
+        FrameInfo_MS_ADPCM( p_demux, &p_sys->i_frame_size,
                             &p_sys->i_frame_length );
         break;
     case VLC_FOURCC( 'm', 'p', 'g', 'a' ):
@@ -195,43 +193,28 @@ static int Open( vlc_object_t * p_this )
         /* FIXME set end of area FIXME */
         goto relay;
     default:
-        msg_Err( p_input, "unsupported codec (%4.4s)",
+        msg_Err( p_demux, "unsupported codec (%4.4s)",
                  (char*)&p_sys->fmt.i_codec );
         goto error;
     }
 
-    msg_Dbg( p_input, "found %s audio format", psz_name );
+    msg_Dbg( p_demux, "found %s audio format", psz_name );
 
-    if( ChunkFind( p_input, "data", &p_sys->i_data_size ) )
+    if( ChunkFind( p_demux, "data", &p_sys->i_data_size ) )
     {
-        msg_Err( p_input, "cannot find 'data' chunk" );
+        msg_Err( p_demux, "cannot find 'data' chunk" );
         goto error;
     }
-    stream_Read( p_input->s, NULL, 8 );   /* Cannot fail */
-    p_sys->i_data_pos = stream_Tell( p_input->s );
+    stream_Read( p_demux->s, NULL, 8 );   /* Cannot fail */
+    p_sys->i_data_pos = stream_Tell( p_demux->s );
 
-    /* Create one program */
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    if( input_InitStream( p_input, 0 ) == -1)
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot init stream" );
-        goto error;
-    }
-
-    p_input->stream.i_mux_rate = 0;
-    if( p_sys->fmt.i_bitrate )
-    {
-        p_input->stream.i_mux_rate = p_sys->fmt.i_bitrate / 50 / 8;
-    }
-    else if( p_sys->i_data_size > 0 )
+    if( p_sys->fmt.i_bitrate <= 0 )
     {
-        p_input->stream.i_mux_rate = (mtime_t)p_sys->i_frame_size *
-            (mtime_t)1000000 / 50 / p_sys->i_frame_length;
+        p_sys->fmt.i_bitrate = (mtime_t)p_sys->i_frame_size *
+            I64C(8000000) / p_sys->i_frame_length;
     }
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
 
-    p_sys->p_es = es_out_Add( p_input->p_es_out, &p_sys->fmt );
+    p_sys->p_es = es_out_Add( p_demux->out, &p_sys->fmt );
     return VLC_SUCCESS;
 
 error:
@@ -245,34 +228,13 @@ relay:
  *****************************************************************************
  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
  *****************************************************************************/
-static int Demux( input_thread_t *p_input )
+static int Demux( demux_t *p_demux )
 {
-    demux_sys_t *p_sys = p_input->p_demux_data;
+    demux_sys_t *p_sys = p_demux->p_sys;
     int64_t     i_pos;
     block_t     *p_block;
 
-    if( p_input->stream.p_selected_program->i_synchro_state == SYNCHRO_REINIT )
-    {
-        i_pos = stream_Tell( p_input->s );
-    }
-
-    input_ClockManageRef( p_input, p_input->stream.p_selected_program,
-                          p_sys->i_time * 9 / 100 );
-
-    i_pos = stream_Tell( p_input->s );
-
-    /* Check alignment */
-    if( p_sys->fmt.audio.i_blockalign != 0 &&
-        i_pos % p_sys->fmt.audio.i_blockalign )
-    {
-        int i_skip = p_sys->fmt.audio.i_blockalign -
-            i_pos % p_sys->fmt.audio.i_blockalign;
-
-        if( stream_Read( p_input->s, NULL, i_skip ) != i_skip )
-        {
-            msg_Err( p_input, "failed to re-align stream" );
-        }
-    }
+    i_pos = stream_Tell( p_demux->s );
 
     if( p_sys->i_data_size > 0 &&
         i_pos >= p_sys->i_data_pos + p_sys->i_data_size )
@@ -281,17 +243,17 @@ static int Demux( input_thread_t *p_input )
         return 0;
     }
 
-    if( ( p_block = stream_Block( p_input->s, p_sys->i_frame_size ) ) == NULL )
+    if( ( p_block = stream_Block( p_demux->s, p_sys->i_frame_size ) ) == NULL )
     {
-        msg_Warn( p_input, "cannot read data" );
+        msg_Warn( p_demux, "cannot read data" );
         return 0;
     }
-    p_block->i_dts =
-    p_block->i_pts = input_ClockGetTS( p_input,
-                                       p_input->stream.p_selected_program,
-                                       p_sys->i_time * 9 / 100 );
+    p_block->i_dts = p_block->i_pts = p_sys->i_time;
 
-    es_out_Send( p_input->p_es_out, p_sys->p_es, p_block );
+    /* set PCR */
+    es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_time );
+
+    es_out_Send( p_demux->out, p_sys->p_es, p_block );
 
     p_sys->i_time += p_sys->i_frame_length;
 
@@ -303,16 +265,33 @@ static int Demux( input_thread_t *p_input )
  *****************************************************************************/
 static void Close ( vlc_object_t * p_this )
 {
-    input_thread_t *p_input = (input_thread_t *)p_this;
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_t     *p_demux = (demux_t*)p_this;
+    demux_sys_t *p_sys  = p_demux->p_sys;
 
     free( p_sys );
 }
 
+/*****************************************************************************
+ * Control:
+ *****************************************************************************/
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+    demux_sys_t *p_sys  = p_demux->p_sys;
+    int64_t i_end = -1;
+    if( p_sys->i_data_size > 0 )
+    {
+        i_end = p_sys->i_data_pos + p_sys->i_data_size;
+    }
+    return demux2_vaControlHelper( p_demux->s,
+                                   p_sys->i_data_pos, i_end,
+                                   p_sys->fmt.i_bitrate, p_sys->fmt.audio.i_blockalign,
+                                   i_query, args );
+}
+
 /*****************************************************************************
  * Local functions
  *****************************************************************************/
-static int ChunkFind( input_thread_t *p_input,
+static int ChunkFind( demux_t *p_demux,
                       char *fcc, unsigned int *pi_size )
 {
     uint8_t *p_peek;
@@ -321,15 +300,15 @@ static int ChunkFind( input_thread_t *p_input,
     {
         int i_size;
 
-        if( stream_Peek( p_input->s, &p_peek, 8 ) < 8 )
+        if( stream_Peek( p_demux->s, &p_peek, 8 ) < 8 )
         {
-            msg_Err( p_input, "cannot peek()" );
+            msg_Err( p_demux, "cannot peek()" );
             return VLC_EGENERIC;
         }
 
         i_size = GetDWLE( p_peek + 4 );
 
-        msg_Dbg( p_input, "Chunk: fcc=`%4.4s` size=%d", p_peek, i_size );
+        msg_Dbg( p_demux, "Chunk: fcc=`%4.4s` size=%d", p_peek, i_size );
 
         if( !strncmp( p_peek, fcc, 4 ) )
         {
@@ -341,18 +320,18 @@ static int ChunkFind( input_thread_t *p_input,
         }
 
         i_size = __EVEN( i_size ) + 8;
-        if( stream_Read( p_input->s, NULL, i_size ) != i_size )
+        if( stream_Read( p_demux->s, NULL, i_size ) != i_size )
         {
             return VLC_EGENERIC;
         }
     }
 }
 
-static void FrameInfo_PCM( input_thread_t *p_input,
-                           unsigned int   *pi_size,
-                           mtime_t        *pi_length )
+static void FrameInfo_PCM( demux_t      *p_demux,
+                           unsigned int *pi_size,
+                           mtime_t      *pi_length )
 {
-    demux_sys_t    *p_sys = p_input->p_demux_data;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     int i_samples;
 
@@ -381,11 +360,11 @@ static void FrameInfo_PCM( input_thread_t *p_input,
     *pi_size = i_bytes;
 }
 
-static void FrameInfo_MS_ADPCM( input_thread_t *p_input,
-                                unsigned int   *pi_size,
-                                mtime_t        *pi_length )
+static void FrameInfo_MS_ADPCM( demux_t      *p_demux,
+                                unsigned int *pi_size,
+                                mtime_t      *pi_length )
 {
-    demux_sys_t *p_sys = p_input->p_demux_data;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     int i_samples;
 
@@ -398,11 +377,11 @@ static void FrameInfo_MS_ADPCM( input_thread_t *p_input,
     *pi_size = p_sys->fmt.audio.i_blockalign;
 }
 
-static void FrameInfo_IMA_ADPCM( input_thread_t *p_input,
-                                 unsigned int   *pi_size,
-                                 mtime_t        *pi_length )
+static void FrameInfo_IMA_ADPCM( demux_t      *p_demux,
+                                 unsigned int *pi_size,
+                                 mtime_t      *pi_length )
 {
-    demux_sys_t *p_sys = p_input->p_demux_data;
+    demux_sys_t *p_sys = p_demux->p_sys;
 
     int i_samples;
 
@@ -414,3 +393,5 @@ static void FrameInfo_IMA_ADPCM( input_thread_t *p_input,
 
     *pi_size = p_sys->fmt.audio.i_blockalign;
 }
+
+