@ -946,6 +946,14 @@ int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
return AVERROR ( EINVAL ) ;
}
av_assert0 ( ! avpkt - > data | | avpkt - > data ! = avctx - > internal - > byte_buffer ) ;
if ( ! avpkt - > data | | avpkt - > size < size ) {
av_fast_padded_malloc ( & avctx - > internal - > byte_buffer , & avctx - > internal - > byte_buffer_size , size ) ;
avpkt - > data = avctx - > internal - > byte_buffer ;
avpkt - > size = avctx - > internal - > byte_buffer_size ;
avpkt - > destruct = NULL ;
}
if ( avpkt - > data ) {
void * destruct = avpkt - > destruct ;
@ -977,7 +985,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
int * got_packet_ptr )
{
int ret ;
int user_packet = ! ! avpkt - > data ;
AVPacket user_pkt = * avpkt ;
int nb_samples ;
* got_packet_ptr = 0 ;
@ -1023,7 +1031,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
the size otherwise */
int fs_tmp = 0 ;
int buf_size = avpkt - > size ;
if ( ! user_packet ) {
if ( ! user_pkt . data ) {
if ( avctx - > codec - > capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ) {
av_assert0 ( av_get_bits_per_sample ( avctx - > codec_id ) ! = 0 ) ;
if ( ! frame )
@ -1060,7 +1068,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
if ( ! ret ) {
/* no output. if the packet data was allocated by libavcodec,
free it */
if ( ! user_pac ket )
if ( ! user_pkt . data & & avp kt - > data ! = avctx - > int ernal - > byte_buffer )
av_freep ( & avpkt - > data ) ;
} else {
if ( avctx - > coded_frame )
@ -1081,8 +1089,26 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
if ( fs_tmp )
avctx - > frame_size = fs_tmp ;
}
if ( avpkt - > data & & avpkt - > data = = avctx - > internal - > byte_buffer ) {
if ( user_pkt . data ) {
if ( user_pkt . size > = avpkt - > size ) {
memcpy ( user_pkt . data , avpkt - > data , avpkt - > size ) ;
} else {
av_log ( avctx , AV_LOG_ERROR , " Provided packet is too small, needs to be %d \n " , avpkt - > size ) ;
avpkt - > size = user_pkt . size ;
ret = - 1 ;
}
avpkt - > data = user_pkt . data ;
avpkt - > destruct = user_pkt . destruct ;
} else {
if ( av_dup_packet ( avpkt ) < 0 ) {
ret = AVERROR ( ENOMEM ) ;
}
}
}
if ( ! ret ) {
if ( ! user_packet & & avpkt - > data ) {
if ( ! user_pkt . data & & avpkt - > data ) {
uint8_t * new_data = av_realloc ( avpkt - > data , avpkt - > size + FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( new_data )
avpkt - > data = new_data ;
@ -1219,7 +1245,7 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
int * got_packet_ptr )
{
int ret ;
int user_packet = ! ! avpkt - > data ;
AVPacket user_pkt = * avpkt ;
* got_packet_ptr = 0 ;
@ -1236,13 +1262,33 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
av_assert0 ( avctx - > codec - > encode2 ) ;
ret = avctx - > codec - > encode2 ( avctx , avpkt , frame , got_packet_ptr ) ;
av_assert0 ( ret < = 0 ) ;
if ( avpkt - > data & & avpkt - > data = = avctx - > internal - > byte_buffer ) {
if ( user_pkt . data ) {
if ( user_pkt . size > = avpkt - > size ) {
memcpy ( user_pkt . data , avpkt - > data , avpkt - > size ) ;
} else {
av_log ( avctx , AV_LOG_ERROR , " Provided packet is too small, needs to be %d \n " , avpkt - > size ) ;
avpkt - > size = user_pkt . size ;
ret = - 1 ;
}
avpkt - > data = user_pkt . data ;
avpkt - > destruct = user_pkt . destruct ;
} else {
if ( av_dup_packet ( avpkt ) < 0 ) {
ret = AVERROR ( ENOMEM ) ;
}
}
}
if ( ! ret ) {
if ( ! * got_packet_ptr )
avpkt - > size = 0 ;
else if ( ! ( avctx - > codec - > capabilities & CODEC_CAP_DELAY ) )
avpkt - > pts = avpkt - > dts = frame - > pts ;
if ( ! user_packet & & avpkt - > data & &
if ( ! user_pkt . data & & avpkt - > data & &
avpkt - > destruct = = av_destruct_packet ) {
uint8_t * new_data = av_realloc ( avpkt - > data , avpkt - > size + FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( new_data )
@ -1538,6 +1584,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
avctx - > codec - > close ( avctx ) ;
avcodec_default_free_buffers ( avctx ) ;
avctx - > coded_frame = NULL ;
avctx - > internal - > byte_buffer_size = 0 ;
av_freep ( & avctx - > internal - > byte_buffer ) ;
av_freep ( & avctx - > internal ) ;
}