* all: improved perfs (using block_ChainLastAppend).
authorLaurent Aimar <fenrir@videolan.org>
Sat, 15 May 2004 14:42:16 +0000 (14:42 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Sat, 15 May 2004 14:42:16 +0000 (14:42 +0000)
include/vlc_block.h
modules/demux/ts.c
modules/packetizer/mpegvideo.c
src/misc/block.c

index 8ded716..422433a 100644 (file)
@@ -112,6 +112,7 @@ static inline block_t *block_Realloc( block_t *p_block, int i_pre, int i_body )
     return p_block->pf_realloc( p_block, i_pre, i_body );
 }
 VLC_EXPORT( void,       block_ChainAppend,  ( block_t **, block_t * ) );
+VLC_EXPORT( void,       block_ChainLastAppend,  ( block_t ***ppp_last, block_t * ) );
 VLC_EXPORT( void,       block_ChainRelease, ( block_t * ) );
 VLC_EXPORT( int,        block_ChainExtract, ( block_t *, void *, int ) );
 VLC_EXPORT( block_t *,  block_ChainGather,  ( block_t * ) );
index 8ae3e13..8f80cfa 100644 (file)
@@ -186,8 +186,10 @@ typedef struct
     es_format_t  fmt;
     es_out_id_t *id;
     block_t     *p_pes;
+    block_t     **pp_last;
 
     es_mpeg4_descriptor_t *p_mpeg4desc;
+    int         b_gather;
 } ts_es_t;
 
 typedef struct
@@ -790,7 +792,9 @@ static void PIDInit( ts_pid_t *pid, vlc_bool_t b_psi, ts_psi_t *p_owner )
         es_format_Init( &pid->es->fmt, UNKNOWN_ES, 0 );
         pid->es->id      = NULL;
         pid->es->p_pes   = NULL;
+        pid->es->pp_last = &pid->es->p_pes;
         pid->es->p_mpeg4desc = NULL;
+        pid->es->b_gather = VLC_FALSE;
     }
 }
 
@@ -857,6 +861,7 @@ static void ParsePES ( demux_t *p_demux, ts_pid_t *pid )
 
     /* remove the pes from pid */
     pid->es->p_pes = NULL;
+    pid->es->pp_last = &pid->es->p_pes;
 
     /* FIXME find real max size */
     i_max = block_ChainExtract( p_pes, header, 30 );
@@ -1003,9 +1008,16 @@ static void ParsePES ( demux_t *p_demux, ts_pid_t *pid )
             p_pes->i_pts = i_pts * 100 / 9;
         }
 
-        /* For mpeg4/mscodec we first gather the packet.
-         * This will make ffmpeg a lot happier */
-        p_block = block_ChainGather( p_pes );
+        if( pid->es->b_gather )
+        {
+            /* For mpeg4/mscodec we first gather the packet.
+             * This will make ffmpeg a lot happier */
+            p_block = block_ChainGather( p_pes );
+        }
+        else
+        {
+            p_block = p_pes;
+        }
 
         for( i = 0; i < pid->i_extra_es; i++ )
         {
@@ -1154,7 +1166,7 @@ static vlc_bool_t GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
                 i_ret = VLC_TRUE;
             }
 
-            pid->es->p_pes = p_bk;
+            block_ChainLastAppend( &pid->es->pp_last, p_bk );
         }
         else
         {
@@ -1167,7 +1179,7 @@ static vlc_bool_t GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
             {
                 /* TODO check if when have gathered enough packets to form a
                  * PES (ie read PES size)*/
-                block_ChainAppend( &pid->es->p_pes, p_bk );
+                block_ChainLastAppend( &pid->es->pp_last, p_bk );
             }
         }
     }
@@ -1196,6 +1208,7 @@ static int PIDFillFormat( ts_pid_t *pid, int i_stream_type )
             break;
         case 0x10:  /* MPEG4 (video) */
             es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', '4', 'v' ) );
+            pid->es->b_gather = VLC_TRUE;
             break;
         case 0x1B:  /* H264 <- check transport syntax/needed descriptor */
             es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'h', '2', '6', '4' ) );
@@ -1230,8 +1243,12 @@ static int PIDFillFormat( ts_pid_t *pid, int i_stream_type )
             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 's', 'd', 'd', 'b' ) );
             break;
 
-        case 0x06:  /* PES_PRIVATE  (fixed later) */
         case 0xa0:  /* MSCODEC vlc (video) (fixed later) */
+            es_format_Init( fmt, UNKNOWN_ES, 0 );
+            pid->es->b_gather = VLC_TRUE;
+            break;
+
+        case 0x06:  /* PES_PRIVATE  (fixed later) */
         default:
             es_format_Init( fmt, UNKNOWN_ES, 0 );
             break;
@@ -1849,6 +1866,7 @@ static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
                         p_es->fmt = pid->es->fmt;
                         p_es->id = NULL;
                         p_es->p_pes = NULL;
+                        p_es->pp_last = &p_es->p_pes;
                         p_es->p_mpeg4desc = NULL;
 
                         p_es->fmt.psz_language = malloc( 4 );
index 5c7f9cb..a642782 100644 (file)
@@ -82,6 +82,8 @@ struct decoder_sys_t
 
     /* Current frame being built */
     block_t    *p_frame;
+    block_t    **pp_last;
+
     vlc_bool_t b_frame_slice;
     mtime_t i_pts;
     mtime_t i_dts;
@@ -147,6 +149,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->p_seq = NULL;
     p_sys->p_ext = NULL;
     p_sys->p_frame = NULL;
+    p_sys->pp_last = &p_sys->p_frame;
     p_sys->b_frame_slice = VLC_FALSE;
 
     p_sys->i_dts = p_sys->i_pts = 0;
@@ -216,6 +219,7 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
         p_sys->i_state = STATE_NOSYNC;
         if( p_sys->p_frame ) block_ChainRelease( p_sys->p_frame );
         p_sys->p_frame = NULL;
+        p_sys->pp_last = &p_sys->p_frame;
         p_sys->b_frame_slice = VLC_FALSE;
         block_Release( *pp_block );
         return NULL;
@@ -332,6 +336,7 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
         msg_Dbg( p_dec, "waiting for sequence start" );
         if( p_sys->p_frame ) block_ChainRelease( p_sys->p_frame );
         p_sys->p_frame = NULL;
+        p_sys->pp_last = &p_sys->p_frame;
         p_sys->b_frame_slice = VLC_FALSE;
 
     }
@@ -440,6 +445,7 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
 
         /* Reset context */
         p_sys->p_frame = NULL;
+        p_sys->pp_last = &p_sys->p_frame;
         p_sys->b_frame_slice = VLC_FALSE;
     }
 
@@ -453,12 +459,10 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
             p_sys->i_seq_old > p_sys->i_frame_rate/p_sys->i_frame_rate_base )
         {
             /* Usefull for mpeg1: repeat sequence header every second */
-            block_ChainAppend( &p_sys->p_frame,
-                               block_Duplicate( p_sys->p_seq ) );
+            block_ChainLastAppend( &p_sys->pp_last, block_Duplicate( p_sys->p_seq ) );
             if( p_sys->p_ext )
             {
-                block_ChainAppend( &p_sys->p_frame,
-                                   block_Duplicate( p_sys->p_ext ) );
+                block_ChainLastAppend( &p_sys->pp_last, block_Duplicate( p_sys->p_ext ) );
             }
 
             p_sys->i_seq_old = 0;
@@ -572,7 +576,7 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
     }
 
     /* Append the block */
-    block_ChainAppend( &p_sys->p_frame, p_frag );
+    block_ChainLastAppend( &p_sys->pp_last, p_frag );
 
     return p_pic;
 }
index 87cdd14..d6c56bf 100644 (file)
@@ -239,7 +239,6 @@ block_t *__block_New( vlc_object_t *p_obj, int i_size )
 
 void block_ChainAppend( block_t **pp_list, block_t *p_block )
 {
-
     if( *pp_list == NULL )
     {
         *pp_list = p_block;
@@ -256,6 +255,18 @@ void block_ChainAppend( block_t **pp_list, block_t *p_block )
     }
 }
 
+void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block  )
+{
+    block_t *p_last = p_block;
+
+    /* Append the block */
+    **ppp_last = p_block;
+
+    /* Update last pointer */
+    while( p_last->p_next ) p_last = p_last->p_next;
+    *ppp_last = &p_last->p_next;
+}
+
 void block_ChainRelease( block_t *p_block )
 {
     while( p_block )