@ -22,25 +22,6 @@
# include <vlc_block.h>
# include <vlc_codec.h>
block_t * CreateAnnexbNAL ( const uint8_t * p , size_t i_size )
{
block_t * p_nal ;
p_nal = block_Alloc ( 4 + i_size ) ;
if ( ! p_nal ) return NULL ;
/* Add start code */
p_nal - > p_buffer [ 0 ] = 0x00 ;
p_nal - > p_buffer [ 1 ] = 0x00 ;
p_nal - > p_buffer [ 2 ] = 0x00 ;
p_nal - > p_buffer [ 3 ] = 0x01 ;
/* Copy nalu */
memcpy ( & p_nal - > p_buffer [ 4 ] , p , i_size ) ;
return p_nal ;
}
/****************************************************************************
* PacketizeXXC1 : Takes VCL blocks of data and creates annexe B type NAL stream
* Will always use 4 byte 0 0 0 1 startcodes
@ -66,7 +47,6 @@ block_t *PacketizeXXC1( decoder_t *p_dec, uint8_t i_nal_length_size,
for ( p = p_block - > p_buffer ; p < & p_block - > p_buffer [ p_block - > i_buffer ] ; )
{
block_t * p_pic ;
bool b_dummy ;
int i_size = 0 ;
int i ;
@ -83,21 +63,52 @@ block_t *PacketizeXXC1( decoder_t *p_dec, uint8_t i_nal_length_size,
break ;
}
block_t * p_part = CreateAnnexbNAL ( p , i_size ) ;
if ( ! p_part )
/* Convert AVC to AnnexB */
block_t * p_nal ;
/* If data exactly match remaining bytes (1 NAL only or trailing one) */
if ( i_size = = p_block - > p_buffer + p_block - > i_buffer - p )
{
p_block - > i_buffer = i_size ;
p_block - > p_buffer = p ;
p_nal = block_Realloc ( p_block , 4 , i_size ) ;
if ( p_nal )
p_block = NULL ;
}
else
{
p_nal = block_Alloc ( 4 + i_size ) ;
if ( p_nal )
{
p_nal - > i_dts = p_block - > i_dts ;
p_nal - > i_pts = p_block - > i_pts ;
/* Copy nalu */
memcpy ( & p_nal - > p_buffer [ 4 ] , p , i_size ) ;
}
p + = i_size ;
}
if ( ! p_nal )
break ;
p_part - > i_dts = p_block - > i_dts ;
p_part - > i_pts = p_block - > i_pts ;
/* Add start code */
p_nal - > p_buffer [ 0 ] = 0x00 ;
p_nal - > p_buffer [ 1 ] = 0x00 ;
p_nal - > p_buffer [ 2 ] = 0x00 ;
p_nal - > p_buffer [ 3 ] = 0x01 ;
/* Parse the NAL */
if ( ( p_pic = pf_nal_parser ( p_dec , & b_dummy , p_part ) ) )
block_t * p_pic ;
if ( ( p_pic = pf_nal_parser ( p_dec , & b_dummy , p_nal ) ) )
{
block_ChainAppend ( & p_ret , p_pic ) ;
}
p + = i_size ;
if ( ! p_block )
break ;
}
block_Release ( p_block ) ;
if ( p_block )
block_Release ( p_block ) ;
return p_ret ;
}