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 * ) );
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
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;
}
}
/* 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 );
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++ )
{
i_ret = VLC_TRUE;
}
- pid->es->p_pes = p_bk;
+ block_ChainLastAppend( &pid->es->pp_last, p_bk );
}
else
{
{
/* 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 );
}
}
}
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' ) );
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;
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 );
/* 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;
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;
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;
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;
}
/* Reset context */
p_sys->p_frame = NULL;
+ p_sys->pp_last = &p_sys->p_frame;
p_sys->b_frame_slice = VLC_FALSE;
}
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;
}
/* Append the block */
- block_ChainAppend( &p_sys->p_frame, p_frag );
+ block_ChainLastAppend( &p_sys->pp_last, p_frag );
return p_pic;
}