@ -250,6 +250,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
enum AVCodecID codec_id )
{
int consumed , ret = 0 ;
const uint8_t * next_avc = is_nalff ? buf : buf + length ;
pkt - > nb_nals = 0 ;
while ( length > = 4 ) {
@ -257,7 +258,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
int extract_length = 0 ;
int skip_trailing_zeros = 1 ;
if ( is_nalff ) {
if ( buf > = next_avc ) {
int i ;
for ( i = 0 ; i < nal_length_size ; i + + )
extract_length = ( extract_length < < 8 ) | buf [ i ] ;
@ -268,6 +269,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
av_log ( logctx , AV_LOG_ERROR , " Invalid NAL unit size. \n " ) ;
return AVERROR_INVALIDDATA ;
}
next_avc = buf + extract_length ;
} else {
/* search start code */
while ( buf [ 0 ] ! = 0 | | buf [ 1 ] ! = 0 | | buf [ 2 ] ! = 1 ) {
@ -282,12 +284,21 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
av_log ( logctx , AV_LOG_ERROR , " No start code is found. \n " ) ;
return AVERROR_INVALIDDATA ;
}
}
} else if ( buf > = ( next_avc - 3 ) )
break ;
}
buf + = 3 ;
length - = 3 ;
extract_length = length ;
if ( buf > = next_avc ) {
/* skip to the start of the next NAL */
int offset = next_avc - buf ;
buf + = offset ;
length - = offset ;
continue ;
}
}
if ( pkt - > nals_allocated < pkt - > nb_nals + 1 ) {
@ -315,6 +326,11 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
if ( consumed < 0 )
return consumed ;
if ( is_nalff & & ( extract_length ! = consumed ) & & extract_length )
av_log ( logctx , AV_LOG_DEBUG ,
" NALFF: Consumed only %d bytes instead of %d \n " ,
consumed , extract_length ) ;
pkt - > nb_nals + + ;
/* see commit 3566042a0 */