aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2020-08-30 23:57:23 -0300
committerJames Almer <jamrial@gmail.com>2020-09-01 10:05:05 -0300
commit0271098e6c9ff8f2a97d65087e424f6d547e53f9 (patch)
treea15eaf66d360b0ed41e2c013562a233d41a12a49 /libavcodec
parent2a14d55a7c41ba8665cfd17b82d96e669ecd0e4c (diff)
downloadffmpeg-0271098e6c9ff8f2a97d65087e424f6d547e53f9.tar.gz
avcodec/encode: unref the packet on AVCodec.receive_packet() failure
Fixes memleaks with some encoders that don't unref the packet before returning. This is consistent with the behavior of AVCodec.encode() implementations in encode_simple_internal(). Found-by: mkver Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/encode.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index 8bc10c4abb..2e540baf37 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -242,7 +242,9 @@ static int encode_receive_packet_internal(AVCodecContext *avctx, AVPacket *avpkt
if (avctx->codec->receive_packet) {
ret = avctx->codec->receive_packet(avctx, avpkt);
- if (!ret)
+ if (ret < 0)
+ av_packet_unref(avpkt);
+ else
// Encoders must always return ref-counted buffers.
// Side-data only packets have no data and can be not ref-counted.
av_assert0(!avpkt->data || avpkt->buf);