]> git.sesse.net Git - vlc/blobdiff - modules/packetizer/mpeg4audio.c
* all : added mpeg 2.5 support.
[vlc] / modules / packetizer / mpeg4audio.c
index 5f0eb4c06e63a80c55e5ac0006fe4cbcd8c9a158..f7427ae7a046b2b6f90865ce0d0153695c57b1ff 100644 (file)
@@ -2,7 +2,7 @@
  * mpeg4audio.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4audio.c,v 1.1 2003/01/08 10:26:49 fenrir Exp $
+ * $Id: mpeg4audio.c,v 1.7 2003/09/02 20:19:26 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -59,11 +59,11 @@ typedef struct packetizer_thread_s
     bit_stream_t            bit_stream;
 
     /* Output properties */
-    sout_input_t            *p_sout_input;
-    sout_packet_format_t    output_format;
+    sout_packetizer_input_t *p_sout_input;
+    sout_format_t           output_format;
 
-    mtime_t                 i_pts_start;
-    mtime_t                 i_pts;
+//    mtime_t                 i_pts_start;
+    mtime_t                 i_last_pts;
 
     WAVEFORMATEX            *p_wf;
 
@@ -100,11 +100,11 @@ vlc_module_end();
  *****************************************************************************/
 static int Open( vlc_object_t *p_this )
 {
-    decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;
+    decoder_t *p_dec = (decoder_t*)p_this;
 
-    p_fifo->pf_run = Run;
+    p_dec->pf_run = Run;
 
-    if( p_fifo->i_fourcc == VLC_FOURCC( 'm', 'p', '4', 'a') )
+    if( p_dec->p_fifo->i_fourcc == VLC_FOURCC( 'm', 'p', '4', 'a') )
     {
         return( VLC_SUCCESS );
     }
@@ -187,17 +187,8 @@ static int InitThread( packetizer_thread_t *p_pack )
     if( p_wf && p_wf->cbSize > 0)
     {
         uint8_t *p_config = (uint8_t*)&p_wf[1];
-        int i_wf = sizeof( WAVEFORMATEX ) + p_wf->cbSize;
-        int i_index;
+        int     i_index;
 
-
-        p_pack->p_wf = malloc( i_wf );
-        memcpy( p_pack->p_wf,
-                p_wf,
-                i_wf );
-        p_pack->output_format.i_cat = AUDIO_ES;
-        p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'a' );
-        p_pack->output_format.p_format = p_pack->p_wf;
         p_pack->b_adts = 0;
 
         i_index = ( ( p_config[0] << 1 ) | ( p_config[1] >> 7 ) )&0x0f;
@@ -216,10 +207,22 @@ static int InitThread( packetizer_thread_t *p_pack )
                  "aac %dHz %d samples/frame",
                  p_pack->i_sample_rate,
                  p_pack->i_frame_size );
+
+        p_pack->output_format.i_cat = AUDIO_ES;
+        p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'a' );
+        p_pack->output_format.i_sample_rate = p_pack->i_sample_rate;
+        p_pack->output_format.i_channels    = p_wf->nChannels;
+        p_pack->output_format.i_block_align = 0;
+        p_pack->output_format.i_bitrate     = 0;
+
+        p_pack->output_format.i_extra_data = p_wf->cbSize;
+        p_pack->output_format.p_extra_data = malloc( p_wf->cbSize );
+        memcpy( p_pack->output_format.p_extra_data,
+                &p_wf[1],
+                p_wf->cbSize );
     }
     else
     {
-        int i_wf = sizeof( WAVEFORMATEX ) + 5;
         /* we will try to create a AAC Config from adts */
         p_pack->output_format.i_cat = UNKNOWN_ES;
         p_pack->output_format.i_fourcc = VLC_FOURCC( 'n', 'u', 'l', 'l' );
@@ -234,19 +237,18 @@ static int InitThread( packetizer_thread_t *p_pack )
 
     }
 
-    p_pack->p_sout_input = 
+    p_pack->p_sout_input =
         sout_InputNew( p_pack->p_fifo,
                        &p_pack->output_format );
 
     if( !p_pack->p_sout_input )
     {
-        msg_Err( p_pack->p_fifo, 
+        msg_Err( p_pack->p_fifo,
                  "cannot add a new stream" );
         return( -1 );
     }
 
-    p_pack->i_pts_start = -1;
-    p_pack->i_pts = 0;
+    p_pack->i_last_pts = 0;
     return( 0 );
 }
 
@@ -257,7 +259,8 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
 {
     sout_buffer_t   *p_sout_buffer;
     pes_packet_t    *p_pes;
-    size_t          i_size;
+    ssize_t         i_size;
+    mtime_t         i_pts;
 
     /* **** get samples count **** */
     input_ExtractPES( p_pack->p_fifo, &p_pes );
@@ -274,18 +277,27 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
     p_pack->i_pts = p_pes->i_pts - p_pack->i_pts_start;
 #endif
 
+    i_pts = p_pes->i_pts;
+
+    if( i_pts <= 0 && p_pack->i_last_pts <= 0 )
+    {
+        msg_Dbg( p_pack->p_fifo, "need a starting pts" );
+        input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
+        return;
+    }
     i_size = p_pes->i_pes_size;
 
     if( i_size > 0 )
     {
         data_packet_t   *p_data;
-        size_t          i_buffer;
+        ssize_t          i_buffer;
 
         p_sout_buffer = 
             sout_BufferNew( p_pack->p_sout_input->p_sout, i_size );
         if( !p_sout_buffer )
         {
             p_pack->p_fifo->b_error = 1;
+            input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
             return;
         }
         /* TODO: memcpy of the pes packet */
@@ -295,7 +307,7 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
         {
             size_t          i_copy;
 
-            i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start, 
+            i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
                             i_size - i_buffer );
             if( i_copy > 0 )
             {
@@ -306,15 +318,24 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
             i_buffer += i_copy;
         }
 
-        p_sout_buffer->i_length = (mtime_t)1000000 * (mtime_t)p_pack->i_frame_size / (mtime_t)p_pack->i_sample_rate;
+        if( i_pts <= 0 )
+        {
+            i_pts = p_pack->i_last_pts +
+                        (mtime_t)1000000 *
+                        (mtime_t)p_pack->i_frame_size /
+                        (mtime_t)p_pack->i_sample_rate;
+        }
+        p_pack->i_last_pts = i_pts;
+
+        p_sout_buffer->i_length = (mtime_t)1000000 *
+                                  (mtime_t)p_pack->i_frame_size /
+                                  (mtime_t)p_pack->i_sample_rate;
         p_sout_buffer->i_bitrate = 0;
-        p_sout_buffer->i_dts = p_pack->i_pts;
-        p_sout_buffer->i_pts = p_pack->i_pts;
+        p_sout_buffer->i_dts = i_pts;
+        p_sout_buffer->i_pts = i_pts;
 
         sout_InputSendBuffer( p_pack->p_sout_input,
                                p_sout_buffer );
-
-        p_pack->i_pts += (mtime_t)1000000 * (mtime_t)p_pack->i_frame_size / (mtime_t)p_pack->i_sample_rate;
     }
 
     input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
@@ -340,5 +361,5 @@ static void EndThread ( packetizer_thread_t *p_pack)
     {
         free( p_pack->p_wf );
     }
+    free( p_pack );
 }
-