]> git.sesse.net Git - vlc/blobdiff - modules/packetizer/mpeg4audio.c
* all : added mpeg 2.5 support.
[vlc] / modules / packetizer / mpeg4audio.c
index 5235775e7c005c98572e5bb7aabaa75cc0c604f7..f7427ae7a046b2b6f90865ce0d0153695c57b1ff 100644 (file)
@@ -2,7 +2,7 @@
  * mpeg4audio.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4audio.c,v 1.3 2003/03/11 19:02:31 fenrir Exp $
+ * $Id: mpeg4audio.c,v 1.7 2003/09/02 20:19:26 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -60,10 +60,10 @@ typedef struct packetizer_thread_s
 
     /* Output properties */
     sout_packetizer_input_t *p_sout_input;
-    sout_packet_format_t    output_format;
+    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,6 +207,19 @@ 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
     {
@@ -233,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 );
 }
 
@@ -256,7 +259,8 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
 {
     sout_buffer_t   *p_sout_buffer;
     pes_packet_t    *p_pes;
-    ssize_t          i_size;
+    ssize_t         i_size;
+    mtime_t         i_pts;
 
     /* **** get samples count **** */
     input_ExtractPES( p_pack->p_fifo, &p_pes );
@@ -273,6 +277,14 @@ 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 )
@@ -285,6 +297,7 @@ static void PacketizeThreadMPEG4( packetizer_thread_t *p_pack )
         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 */
@@ -305,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 );
@@ -339,5 +361,5 @@ static void EndThread ( packetizer_thread_t *p_pack)
     {
         free( p_pack->p_wf );
     }
+    free( p_pack );
 }
-