]> git.sesse.net Git - vlc/blobdiff - modules/packetizer/mpeg4video.c
* modules/packetizer/mpeg4audio.c: ported to the new decoder api and added ADTS strea...
[vlc] / modules / packetizer / mpeg4video.c
index 4808f19f478ca9eb494c0a81fae00332623a47db..3694d097c185c48d091ee82fb00533ca6f52d008 100644 (file)
@@ -2,7 +2,7 @@
  * mpeg4video.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4video.c,v 1.7 2003/01/23 15:52:04 sam Exp $
+ * $Id: mpeg4video.c,v 1.14 2003/09/24 14:59:21 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *          Eric Petit <titer@videolan.org>
@@ -45,10 +45,10 @@ typedef struct packetizer_thread_s
     decoder_fifo_t          *p_fifo;
 
     /* 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_last_pts;
 
     int                     i_vol;
     uint8_t                 *p_vol;
@@ -104,11 +104,9 @@ 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;
-
-    switch(  p_fifo->i_fourcc )
+    switch( p_dec->p_fifo->i_fourcc )
     {
         case VLC_FOURCC( 'm', '4', 's', '2'):
         case VLC_FOURCC( 'M', '4', 'S', '2'):
@@ -123,7 +121,7 @@ static int Open( vlc_object_t *p_this )
         case VLC_FOURCC( 'D', 'X', '5', '0'):
         case VLC_FOURCC( 0x04, 0,   0,   0):
         case VLC_FOURCC( '3', 'I', 'V', '2'):
-
+            p_dec->pf_run = Run;
             return VLC_SUCCESS;
         default:
             return VLC_EGENERIC;
@@ -198,8 +196,15 @@ static int InitThread( packetizer_thread_t *p_pack )
         /* create stream input output */
         p_pack->output_format.i_cat = VIDEO_ES;
         p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v' );
-        p_pack->output_format.p_format = malloc( p_bih->biSize );
-        memcpy( p_pack->output_format.p_format, p_bih, p_bih->biSize );
+        p_pack->output_format.i_width  = p_bih->biWidth;
+        p_pack->output_format.i_height = p_bih->biHeight;
+        p_pack->output_format.i_bitrate= 0;
+
+        p_pack->output_format.i_extra_data = p_pack->i_vol;
+        p_pack->output_format.p_extra_data = malloc( p_pack->i_vol );
+        memcpy( p_pack->output_format.p_extra_data,
+                p_pack->p_vol,
+                p_pack->i_vol );
 
         msg_Warn( p_pack->p_fifo, "opening with vol size:%d", p_pack->i_vol );
         p_pack->p_sout_input =
@@ -212,7 +217,11 @@ static int InitThread( packetizer_thread_t *p_pack )
         p_pack->p_vol = 0;
         p_pack->output_format.i_cat = UNKNOWN_ES;
         p_pack->output_format.i_fourcc = VLC_FOURCC( 'n', 'u', 'l', 'l' );
-        p_pack->output_format.p_format = NULL;
+        p_pack->output_format.i_width  = 0;
+        p_pack->output_format.i_height = 0;
+        p_pack->output_format.i_bitrate= 0;
+        p_pack->output_format.i_extra_data = 0;
+        p_pack->output_format.p_extra_data = NULL;
 
         p_pack->p_sout_input =
             sout_InputNew( p_pack->p_fifo,
@@ -224,8 +233,9 @@ static int InitThread( packetizer_thread_t *p_pack )
         msg_Err( p_pack->p_fifo, "cannot add a new stream" );
         return( -1 );
     }
-    p_pack->i_pts_start = -1;
-    return( 0 );
+    p_pack->i_last_pts = 0;
+
+    return VLC_SUCCESS;
 }
 
 static int m4v_FindStartCode( uint8_t **pp_data, uint8_t *p_end )
@@ -247,7 +257,8 @@ static void PacketizeThread( 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 );
@@ -256,10 +267,16 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
         p_pack->p_fifo->b_error = 1;
         return;
     }
-    if( p_pack->i_pts_start < 0 )
+
+    i_pts = p_pes->i_pts;
+#if 0
+    if( i_pts <= 0 && p_pack->i_last_pts <= 0 )
     {
-        p_pack->i_pts_start = p_pes->i_pts;
+        msg_Dbg( p_pack->p_fifo, "need a starting pts" );
+        input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
+        return;
     }
+#endif
 
     i_size = p_pes->i_pes_size;
     if( i_size > 0 )
@@ -268,7 +285,7 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
         data_packet_t   *p_data;
         ssize_t          i_buffer;
 
-        p_sout_buffer = 
+        p_sout_buffer =
             sout_BufferNew( p_pack->p_sout_input->p_sout, i_size );
         if( !p_sout_buffer )
         {
@@ -292,9 +309,21 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
             }
             i_buffer += i_copy;
         }
-        p_sout_buffer->i_length = 0;
-        p_sout_buffer->i_dts = p_pes->i_pts - p_pack->i_pts_start;
-        p_sout_buffer->i_pts = p_pes->i_pts - p_pack->i_pts_start;
+
+        input_ShowPES( p_pack->p_fifo, &p_pes_next );
+        if( p_pes_next && p_pes_next->i_pts > 0 )
+        {
+            mtime_t i_gap;
+
+            i_gap = p_pes_next->i_pts - p_pes->i_pts;
+            p_sout_buffer->i_length = i_gap;
+        }
+        else
+        {
+            p_sout_buffer->i_length = 0;
+        }
+        p_sout_buffer->i_dts = i_pts;
+        p_sout_buffer->i_pts = i_pts;
         p_sout_buffer->i_bitrate = 0;
 
         if( p_pack->p_vol == NULL )
@@ -346,8 +375,8 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
 
                 if( p_vol_end != NULL && p_vol_begin < p_vol_end )
                 {
-                    BITMAPINFOHEADER *p_bih;
-
+                    BITMAPINFOHEADER *p_bih =
+                        (BITMAPINFOHEADER*)p_pack->p_fifo->p_bitmapinfoheader;
                     p_pack->i_vol = p_vol_end - p_vol_begin;
                     msg_Dbg( p_pack->p_fifo, "Reopening output" );
 
@@ -358,21 +387,24 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
 
                     p_pack->output_format.i_cat = VIDEO_ES;
                     p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v' );
-                    p_pack->output_format.p_format =
-                        (void*)p_bih = malloc( sizeof( BITMAPINFOHEADER ) + p_pack->i_vol);
-
-                    p_bih->biSize = sizeof( BITMAPINFOHEADER ) + p_pack->i_vol;
-                    p_bih->biWidth  = 0;
-                    p_bih->biHeight = 0;
-                    p_bih->biPlanes = 1;
-                    p_bih->biBitCount = 24;
-                    p_bih->biCompression = VLC_FOURCC( 'd', 'i', 'v', 'x' );
-                    p_bih->biSizeImage = 0;
-                    p_bih->biXPelsPerMeter = 0;
-                    p_bih->biYPelsPerMeter = 0;
-                    p_bih->biClrUsed = 0;
-                    p_bih->biClrImportant = 0;
-                    memcpy( &p_bih[1], p_pack->p_vol, p_pack->i_vol );
+
+                    if( p_bih )
+                    {
+                        p_pack->output_format.i_width  = p_bih->biWidth;
+                        p_pack->output_format.i_height = p_bih->biHeight;
+                    }
+                    else
+                    {
+                        p_pack->output_format.i_width  = 0;
+                        p_pack->output_format.i_height = 0;
+                    }
+                    p_pack->output_format.i_bitrate= 0;
+
+                    p_pack->output_format.i_extra_data = p_pack->i_vol;
+                    p_pack->output_format.p_extra_data = malloc( p_pack->i_vol );
+                    memcpy( p_pack->output_format.p_extra_data,
+                            p_pack->p_vol,
+                            p_pack->i_vol );
 
                     p_pack->p_sout_input =
                         sout_InputNew( p_pack->p_fifo,
@@ -392,39 +424,16 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
             }
         }
 
-        input_ShowPES( p_pack->p_fifo, &p_pes_next );
-        if( p_pes_next )
+        if( i_pts > 0 )
         {
-            mtime_t i_gap;
-
-            i_gap = p_pes_next->i_pts - p_pes->i_pts;
-#if 0
-            if( i_gap > 1000000 / 4 )  // too littl fps < 4 is no sense
-            {
-                i_gap = 1000000 / 25;
-                p_pack->i_pts_start =
-                    - ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts - i_gap;
-
-            }
-            else if( i_gap < 0 )
-            {
-                p_pack->i_pts_start =
-                    ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts;
-                i_gap = 0;
-            }
-            if( i_gap < 0 )
-            {
-                msg_Dbg( p_pack->p_fifo, "pts:%lld next_pts:%lld", p_pes->i_pts, p_pes_next->i_pts );
-                /* work around for seek */
-                p_pack->i_pts_start -= i_gap;
-            }
-
-//            msg_Dbg( p_pack->p_fifo, "gap %lld date %lld next diff %lld", i_gap, p_pes->i_pts,  p_pes_next->i_pts-p_pack->i_pts_start );
-#endif
-            p_sout_buffer->i_length = i_gap;
+            sout_InputSendBuffer( p_pack->p_sout_input,
+                                  p_sout_buffer );
         }
-        sout_InputSendBuffer( p_pack->p_sout_input,
+        else
+        {
+            sout_BufferDelete( p_pack->p_sout_input->p_sout,
                                p_sout_buffer );
+        }
     }
 
     input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
@@ -440,6 +449,7 @@ static void EndThread ( packetizer_thread_t *p_pack)
     {
         sout_InputDelete( p_pack->p_sout_input );
     }
+    free( p_pack );
 }
 
 static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes )
@@ -473,4 +483,3 @@ static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes )
         *pp_pes = p_pes;
     }
 }
-