]> git.sesse.net Git - vlc/blobdiff - modules/demux/au.c
* Stringreview !!!
[vlc] / modules / demux / au.c
index 483b0faa5b715721bc9747c78474db0da493df85..fd256f4172e03347616cc8443d49711a8af04ce9 100644 (file)
@@ -2,7 +2,7 @@
  * au.c : au file input module for vlc
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: au.c,v 1.4 2003/08/17 23:02:52 fenrir Exp $
+ * $Id: au.c,v 1.12 2004/01/25 20:05:28 hartman Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -30,7 +30,6 @@
 #include <vlc/input.h>
 
 #include <codecs.h>
-#include <ninput.h>
 
 /*****************************************************************************
  * Module descriptor
@@ -93,14 +92,12 @@ typedef struct
 
 struct demux_sys_t
 {
-    stream_t        *s;
-
     au_t            au;
-    WAVEFORMATEX    wf;
 
     mtime_t         i_time;
 
-    es_descriptor_t *p_es;
+    es_format_t     fmt;
+    es_out_id_t     *p_es;
 
     int             i_frame_size;
     mtime_t         i_frame_length;
@@ -117,8 +114,6 @@ static int Open( vlc_object_t * p_this )
 
     uint8_t         *p_peek;
 
-    vlc_fourcc_t    i_fourcc;
-
     int             i_cat;
 
     /* a little test to see if it's a au file */
@@ -136,18 +131,11 @@ static int Open( vlc_object_t * p_this )
     p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) );
     p_sys->i_time = 0;
 
-
-    if( ( p_sys->s = stream_OpenInput( p_input ) ) == NULL )
-    {
-        msg_Err( p_input, "cannot create stream" );
-        goto error;
-    }
-
     /* skip signature */
-    stream_Read( p_sys->s, NULL, 4 );   /* cannot fail */
+    stream_Read( p_input->s, NULL, 4 );   /* cannot fail */
 
     /* read header */
-    if( stream_Read( p_sys->s, &p_sys->au, sizeof( au_t ) ) < (int)sizeof( au_t ) )
+    if( stream_Read( p_input->s, &p_sys->au, sizeof(au_t) )<(int)sizeof(au_t) )
     {
         msg_Err( p_input, "cannot load header" );
         goto error;
@@ -175,109 +163,97 @@ static int Open( vlc_object_t * p_this )
     /* skip extra header data */
     if( p_sys->au.i_header_size > 4 + sizeof( au_t ) )
     {
-        stream_Read( p_sys->s, NULL, p_sys->au.i_header_size - 4 - sizeof( au_t ) );
+        stream_Read( p_input->s,
+                     NULL, p_sys->au.i_header_size - 4 - sizeof( au_t ) );
     }
 
     /* Create WAVEFORMATEX structure */
-    p_sys->wf.nChannels     = p_sys->au.i_channels;
-    p_sys->wf.nSamplesPerSec= p_sys->au.i_sample_rate;
-    p_sys->wf.cbSize        = 0;
-
+    es_format_Init( &p_sys->fmt, AUDIO_ES, 0 );
+    p_sys->fmt.audio.i_channels   = p_sys->au.i_channels;
+    p_sys->fmt.audio.i_rate = p_sys->au.i_sample_rate;
     switch( p_sys->au.i_encoding )
     {
         case AU_ALAW_8:        /* 8-bit ISDN A-law */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_ALAW;   // FIXME ??
-            p_sys->wf.wBitsPerSample = 8;
-            p_sys->wf.nBlockAlign    = 1 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a','l','a','w' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a','l','a','w' );
+            p_sys->fmt.audio.i_bitspersample = 8;
+            p_sys->fmt.audio.i_blockalign    = 1 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_MULAW_8:       /* 8-bit ISDN u-law */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_MULAW;   // FIXME ??
-            p_sys->wf.wBitsPerSample = 8;
-            p_sys->wf.nBlockAlign    = 1 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'u','l','a','w' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'u','l','a','w' );
+            p_sys->fmt.audio.i_bitspersample = 8;
+            p_sys->fmt.audio.i_blockalign    = 1 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_LINEAR_8:      /* 8-bit linear PCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_PCM;
-            p_sys->wf.wBitsPerSample = 8;
-            p_sys->wf.nBlockAlign    = 1 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.audio.i_bitspersample = 8;
+            p_sys->fmt.audio.i_blockalign    = 1 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_LINEAR_16:     /* 16-bit linear PCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_PCM;
-            p_sys->wf.wBitsPerSample = 16;
-            p_sys->wf.nBlockAlign    = 2 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.audio.i_bitspersample = 16;
+            p_sys->fmt.audio.i_blockalign    = 2 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_LINEAR_24:     /* 24-bit linear PCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_PCM;
-            p_sys->wf.wBitsPerSample = 24;
-            p_sys->wf.nBlockAlign    = 3 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.audio.i_bitspersample = 24;
+            p_sys->fmt.audio.i_blockalign    = 3 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_LINEAR_32:     /* 32-bit linear PCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_PCM;
-            p_sys->wf.wBitsPerSample = 32;
-            p_sys->wf.nBlockAlign    = 4 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 't','w','o','s' );
+            p_sys->fmt.audio.i_bitspersample = 32;
+            p_sys->fmt.audio.i_blockalign    = 4 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_FLOAT:         /* 32-bit IEEE floating point */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 32;
-            p_sys->wf.nBlockAlign    = 4 * p_sys->wf.nChannels;
-            i_fourcc                  = VLC_FOURCC( 'a', 'u', 0, AU_FLOAT );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_FLOAT );
+            p_sys->fmt.audio.i_bitspersample = 32;
+            p_sys->fmt.audio.i_blockalign    = 4 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_DOUBLE:        /* 64-bit IEEE floating point */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 64;
-            p_sys->wf.nBlockAlign    = 8 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a', 'u', 0, AU_DOUBLE );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_DOUBLE );
+            p_sys->fmt.audio.i_bitspersample = 64;
+            p_sys->fmt.audio.i_blockalign    = 8 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_PCM;
             break;
 
         case AU_ADPCM_G721:    /* 4-bit CCITT g.721 ADPCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 0;
-            p_sys->wf.nBlockAlign    = 0 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G721 );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G721 );
+            p_sys->fmt.audio.i_bitspersample = 0;
+            p_sys->fmt.audio.i_blockalign    = 0 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_ADPCM;
             break;
 
         case AU_ADPCM_G722:    /* CCITT g.722 ADPCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 0;
-            p_sys->wf.nBlockAlign    = 0 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G722 );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G722 );
+            p_sys->fmt.audio.i_bitspersample = 0;
+            p_sys->fmt.audio.i_blockalign    = 0 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_ADPCM;
             break;
 
         case AU_ADPCM_G723_3:  /* CCITT g.723 3-bit ADPCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 0;
-            p_sys->wf.nBlockAlign    = 0 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G723_3 );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G723_3 );
+            p_sys->fmt.audio.i_bitspersample = 0;
+            p_sys->fmt.audio.i_blockalign    = 0 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_ADPCM;
             break;
 
         case AU_ADPCM_G723_5:  /* CCITT g.723 5-bit ADPCM */
-            p_sys->wf.wFormatTag     = WAVE_FORMAT_UNKNOWN;
-            p_sys->wf.wBitsPerSample = 0;
-            p_sys->wf.nBlockAlign    = 0 * p_sys->wf.nChannels;
-            i_fourcc                 = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G723_5 );
+            p_sys->fmt.i_codec               = VLC_FOURCC( 'a', 'u', 0, AU_ADPCM_G723_5 );
+            p_sys->fmt.audio.i_bitspersample = 0;
+            p_sys->fmt.audio.i_blockalign    = 0 * p_sys->fmt.audio.i_channels;
             i_cat                    = AU_CAT_ADPCM;
             break;
 
@@ -286,9 +262,9 @@ static int Open( vlc_object_t * p_this )
             i_cat                    = AU_CAT_UNKNOWN;
             goto error;
     }
-    p_sys->wf.nAvgBytesPerSec        = p_sys->wf.nSamplesPerSec * p_sys->wf.nChannels * p_sys->wf.wBitsPerSample / 8;
-
-
+    p_sys->fmt.i_bitrate = p_sys->fmt.audio.i_rate *
+                           p_sys->fmt.audio.i_channels *
+                           p_sys->fmt.audio.i_bitspersample;
 
     if( i_cat == AU_CAT_UNKNOWN || i_cat == AU_CAT_ADPCM )
     {
@@ -303,26 +279,26 @@ static int Open( vlc_object_t * p_this )
         int i_samples, i_modulo;
 
         /* read samples for 50ms of */
-        i_samples = __MAX( p_sys->wf.nSamplesPerSec / 20, 1 );
+        i_samples = __MAX( p_sys->fmt.audio.i_rate / 20, 1 );
 
-        p_sys->i_frame_size = i_samples * p_sys->wf.nChannels * ( (p_sys->wf.wBitsPerSample + 7) / 8 );
+        p_sys->i_frame_size = i_samples * p_sys->fmt.audio.i_channels * ( (p_sys->fmt.audio.i_bitspersample + 7) / 8 );
 
-        if( p_sys->wf.nBlockAlign > 0 )
+        if( p_sys->fmt.audio.i_blockalign > 0 )
         {
-            if( ( i_modulo = p_sys->i_frame_size % p_sys->wf.nBlockAlign ) != 0 )
+            if( ( i_modulo = p_sys->i_frame_size % p_sys->fmt.audio.i_blockalign ) != 0 )
             {
-                p_sys->i_frame_size += p_sys->wf.nBlockAlign - i_modulo;
+                p_sys->i_frame_size += p_sys->fmt.audio.i_blockalign - i_modulo;
             }
         }
 
         p_sys->i_frame_length = (mtime_t)1000000 *
                                 (mtime_t)i_samples /
-                                (mtime_t)p_sys->wf.nSamplesPerSec;
+                                (mtime_t)p_sys->fmt.audio.i_rate;
 
         p_input->pf_demux = DemuxPCM;
+        p_input->pf_demux_control = demux_vaControlDefault;
     }
 
-    /*  create one program */
     vlc_mutex_lock( &p_input->stream.stream_lock );
     if( input_InitStream( p_input, 0 ) == -1)
     {
@@ -330,36 +306,13 @@ static int Open( vlc_object_t * p_this )
         msg_Err( p_input, "cannot init stream" );
         goto error;
     }
-    if( input_AddProgram( p_input, 0, 0) == NULL )
-    {
-        vlc_mutex_unlock( &p_input->stream.stream_lock );
-        msg_Err( p_input, "cannot add program" );
-        goto error;
-    }
-
-    p_input->stream.p_selected_program = p_input->stream.pp_programs[0];
-    p_input->stream.i_mux_rate =  p_sys->wf.nAvgBytesPerSec / 50;
-
-    p_sys->p_es = input_AddES( p_input, p_input->stream.p_selected_program,
-                               0x01, AUDIO_ES, NULL, 0 );
-
-    p_sys->p_es->i_stream_id   = 0x01;
-    p_sys->p_es->i_fourcc      = i_fourcc;
-    p_sys->p_es->p_waveformatex= malloc( sizeof( WAVEFORMATEX ) );
-    memcpy( p_sys->p_es->p_waveformatex, &p_sys->wf, sizeof( WAVEFORMATEX ) );
-
-    input_SelectES( p_input, p_sys->p_es );
-
-    p_input->stream.p_selected_program->b_is_ok = 1;
+    p_input->stream.i_mux_rate =  p_sys->fmt.i_bitrate / 50 / 8;
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
+    p_sys->p_es = es_out_Add( p_input->p_es_out, &p_sys->fmt );
     return VLC_SUCCESS;
 
 error:
-    if( p_sys->s )
-    {
-        stream_Release( p_sys->s );
-    }
     free( p_sys );
     return VLC_EGENERIC;
 }
@@ -372,19 +325,18 @@ error:
 static int DemuxPCM( input_thread_t *p_input )
 {
     demux_sys_t  *p_sys = p_input->p_demux_data;
-    pes_packet_t *p_pes;
+    block_t *p_block;
 
     if( p_input->stream.p_selected_program->i_synchro_state == SYNCHRO_REINIT )
     {
-        int64_t i_pos;
+        int64_t i_pos = stream_Tell( p_input->s );
 
-        stream_Control( p_sys->s, STREAM_GET_POSITION, &i_pos );
-        if( p_sys->wf.nBlockAlign != 0 )
+        if( p_sys->fmt.audio.i_blockalign != 0 )
         {
-            i_pos += p_sys->wf.nBlockAlign - i_pos % p_sys->wf.nBlockAlign;
-            if( stream_Control( p_sys->s, STREAM_SET_POSITION, i_pos ) )
+            i_pos += p_sys->fmt.audio.i_blockalign - i_pos % p_sys->fmt.audio.i_blockalign;
+            if( stream_Seek( p_input->s, i_pos ) )
             {
-                msg_Err( p_input, "STREAM_SET_POSITION failed (cannot resync)" );
+                msg_Err( p_input, "seek failed (cannot resync)" );
             }
         }
     }
@@ -393,25 +345,20 @@ static int DemuxPCM( input_thread_t *p_input )
                           p_input->stream.p_selected_program,
                           p_sys->i_time * 9 / 100 );
 
-    if( ( p_pes = stream_PesPacket( p_sys->s, p_sys->i_frame_size ) ) == NULL )
+    if( ( p_block = stream_Block( p_input->s, p_sys->i_frame_size ) ) == NULL )
     {
         msg_Warn( p_input, "cannot read data" );
         return 0;
     }
-    p_pes->i_dts =
-    p_pes->i_pts = input_ClockGetTS( p_input,
+    p_block->i_dts =
+    p_block->i_pts = input_ClockGetTS( p_input,
                                      p_input->stream.p_selected_program,
                                      p_sys->i_time * 9 / 100 );
 
-    if( !p_sys->p_es->p_decoder_fifo )
-    {
-        msg_Err( p_input, "no audio decoder" );
-        input_DeletePES( p_input->p_method_data, p_pes );
-        return( -1 );
-    }
+    es_out_Send( p_input->p_es_out, p_sys->p_es, p_block );
 
-    input_DecodePES( p_sys->p_es->p_decoder_fifo, p_pes );
     p_sys->i_time += p_sys->i_frame_length;
+
     return( 1 );
 }
 
@@ -423,7 +370,6 @@ 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;
 
-    stream_Release( p_sys->s );
     free( p_sys );
 }