@ -156,8 +156,9 @@ static char *extradata2psets(AVCodecContext *c)
const uint8_t * r ;
static const char pset_string [ ] = " ; sprop-parameter-sets= " ;
static const char profile_string [ ] = " ; profile-level-id= " ;
uint8_t * orig_extradata = NULL ;
int orig_extradata_size = 0 ;
uint8_t * extradata = c - > extradata ;
int extradata_size = c - > extradata_size ;
uint8_t * tmpbuf = NULL ;
const uint8_t * sps = NULL , * sps_end ;
if ( c - > extradata_size > MAX_EXTRADATA_SIZE ) {
@ -166,44 +167,28 @@ static char *extradata2psets(AVCodecContext *c)
return NULL ;
}
if ( c - > extradata [ 0 ] = = 1 ) {
uint8_t * dummy_p ;
int dummy_int ;
AVBitStreamFilterContext * bsfc = av_bitstream_filter_init ( " h264_mp4toannexb " ) ;
if ( ! bsfc ) {
av_log ( c , AV_LOG_ERROR , " Cannot open the h264_mp4toannexb BSF! \n " ) ;
if ( ff_avc_write_annexb_extradata ( c - > extradata , & extradata ,
& extradata_size ) )
return NULL ;
}
orig_extradata_size = c - > extradata_size ;
orig_extradata = av_mallocz ( orig_extradata_size +
FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( ! orig_extradata ) {
av_bitstream_filter_close ( bsfc ) ;
return NULL ;
}
memcpy ( orig_extradata , c - > extradata , orig_extradata_size ) ;
av_bitstream_filter_filter ( bsfc , c , NULL , & dummy_p , & dummy_int , NULL , 0 , 0 ) ;
av_bitstream_filter_close ( bsfc ) ;
tmpbuf = extradata ;
}
psets = av_mallocz ( MAX_PSET_SIZE ) ;
if ( ! psets ) {
av_log ( c , AV_LOG_ERROR , " Cannot allocate memory for the parameter sets. \n " ) ;
av_free ( orig_extradata ) ;
av_free ( tmpbuf ) ;
return NULL ;
}
memcpy ( psets , pset_string , strlen ( pset_string ) ) ;
p = psets + strlen ( pset_string ) ;
r = ff_avc_find_startcode ( c - > extradata , c - > extradata + c - > extradata_size ) ;
while ( r < c - > extradata + c - > extradata_size ) {
r = ff_avc_find_startcode ( extradata , extradata + extradata_size ) ;
while ( r < extradata + extradata_size ) {
const uint8_t * r1 ;
uint8_t nal_type ;
while ( ! * ( r + + ) ) ;
nal_type = * r & 0x1f ;
r1 = ff_avc_find_startcode ( r , c - > extradata + c - > extradata_size ) ;
r1 = ff_avc_find_startcode ( r , extradata + extradata_size ) ;
if ( nal_type ! = 7 & & nal_type ! = 8 ) { /* Only output SPS and PPS */
r = r1 ;
continue ;
@ -219,6 +204,7 @@ static char *extradata2psets(AVCodecContext *c)
if ( ! av_base64_encode ( p , MAX_PSET_SIZE - ( p - psets ) , r , r1 - r ) ) {
av_log ( c , AV_LOG_ERROR , " Cannot Base64-encode %td %td! \n " , MAX_PSET_SIZE - ( p - psets ) , r1 - r ) ;
av_free ( psets ) ;
av_free ( tmpbuf ) ;
return NULL ;
}
@ -231,11 +217,7 @@ static char *extradata2psets(AVCodecContext *c)
ff_data_to_hex ( p , sps + 1 , 3 , 0 ) ;
p [ 6 ] = ' \0 ' ;
}
if ( orig_extradata ) {
av_free ( c - > extradata ) ;
c - > extradata = orig_extradata ;
c - > extradata_size = orig_extradata_size ;
}
av_free ( tmpbuf ) ;
return psets ;
}