From: Anton Khirnov Date: Fri, 24 Feb 2012 12:14:02 +0000 (+0100) Subject: lavc: free the output packet when encoding failed or produced no output. X-Git-Tag: v9_beta1~2585 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7fb6c9225c309c55b85f6974627e26976817bff5;p=platform%2Fupstream%2Flibav.git lavc: free the output packet when encoding failed or produced no output. --- diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 19f114f..3598aaa 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3788,6 +3788,10 @@ int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx, * avpkt->data is NULL, the encoder will allocate it. * The encoder will set avpkt->size to the size of the * output packet. + * + * If this function fails or produces no output, avpkt will be + * freed using av_free_packet() (i.e. avpkt->destruct will be + * called to free the user supplied buffer). * @param[in] frame AVFrame containing the raw audio data to be encoded. * May be NULL when flushing an encoder that has the * CODEC_CAP_DELAY capability set. @@ -3870,6 +3874,10 @@ int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, * The encoder will set avpkt->size to the size of the * output packet. The returned data (if any) belongs to the * caller, he is responsible for freeing it. + * + * If this function fails or produces no output, avpkt will be + * freed using av_free_packet() (i.e. avpkt->destruct will be + * called to free the user supplied buffer). * @param[in] frame AVFrame containing the raw video data to be encoded. * May be NULL when flushing an encoder that has the * CODEC_CAP_DELAY capability set. diff --git a/libavcodec/utils.c b/libavcodec/utils.c index a91eab1..f9927a1 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -864,6 +864,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, *got_packet_ptr = 0; if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) { + av_free_packet(avpkt); av_init_packet(avpkt); avpkt->size = 0; return 0; @@ -962,6 +963,9 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, if (!ret) avctx->frame_number++; + if (ret < 0 || !*got_packet_ptr) + av_free_packet(avpkt); + /* NOTE: if we add any audio encoders which output non-keyframe packets, this needs to be moved to the encoders, but for now we can do it here to simplify things */ @@ -1095,6 +1099,7 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, *got_packet_ptr = 0; if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) { + av_free_packet(avpkt); av_init_packet(avpkt); avpkt->size = 0; return 0; @@ -1121,6 +1126,9 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, avctx->frame_number++; } + if (ret < 0 || !*got_packet_ptr) + av_free_packet(avpkt); + emms_c(); return ret; }