diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-02-24 13:14:02 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-03-03 06:31:41 +0100 |
commit | 7fb6c9225c309c55b85f6974627e26976817bff5 (patch) | |
tree | 1a4afa03fc8bd6e07674b54e860645147a1e3084 | |
parent | e42e9b0e4d3eb8b2c9b5e1791344f211b590040c (diff) | |
download | ffmpeg-7fb6c9225c309c55b85f6974627e26976817bff5.tar.gz |
lavc: free the output packet when encoding failed or produced no output.
-rw-r--r-- | libavcodec/avcodec.h | 8 | ||||
-rw-r--r-- | libavcodec/utils.c | 8 |
2 files changed, 16 insertions, 0 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 19f114f78d..3598aaaa85 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 a91eab1ac1..f9927a1383 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; } |