From 211100f4853aa5cfcc8a735355e0971fe84596c1 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sat, 15 May 2004 14:42:16 +0000 Subject: [PATCH] * all: improved perfs (using block_ChainLastAppend). --- include/vlc_block.h | 1 + modules/demux/ts.c | 30 ++++++++++++++++++++++++------ modules/packetizer/mpegvideo.c | 14 +++++++++----- src/misc/block.c | 13 ++++++++++++- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/include/vlc_block.h b/include/vlc_block.h index 8ded716d7f..422433ae8a 100644 --- a/include/vlc_block.h +++ b/include/vlc_block.h @@ -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 * ) ); diff --git a/modules/demux/ts.c b/modules/demux/ts.c index 8ae3e13699..8f80cfa215 100644 --- a/modules/demux/ts.c +++ b/modules/demux/ts.c @@ -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 ); diff --git a/modules/packetizer/mpegvideo.c b/modules/packetizer/mpegvideo.c index 5c7f9cbf0f..a642782eed 100644 --- a/modules/packetizer/mpegvideo.c +++ b/modules/packetizer/mpegvideo.c @@ -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; } diff --git a/src/misc/block.c b/src/misc/block.c index 87cdd142b4..d6c56bf943 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -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 ) -- 2.39.2