summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-04-08 12:09:55 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-04-08 13:06:13 +0200
commit069cf86d32103da7bb2a0581dcbf66f1e95508d5 (patch)
treec51096ab171bcc5bc132626c60ea9f21581209d0 /libavcodec
parentcb939468202ce9352a9a8809007f24608bbbb61a (diff)
Fix side-data memleak also for audio.
This uses the same code as in decode_video also in decode_audio. Should fix valgrind FATE failures for nellymoser encode test. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/avcodec.h2
-rw-r--r--libavcodec/utils.c16
2 files changed, 12 insertions, 6 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index a53f2c62b0..de9b245879 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3856,7 +3856,7 @@ attribute_deprecated int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *s
* AVPacket is returned.
*/
int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
- int *got_frame_ptr, AVPacket *avpkt);
+ int *got_frame_ptr, const AVPacket *avpkt);
/**
* Decode the video frame of size avpkt->size from avpkt->data into picture.
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index e63878d2c7..ab34b40c62 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1508,7 +1508,7 @@ int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *sa
int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
AVFrame *frame,
int *got_frame_ptr,
- AVPacket *avpkt)
+ const AVPacket *avpkt)
{
int ret = 0;
@@ -1524,17 +1524,23 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
}
if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
- av_packet_split_side_data(avpkt);
- apply_param_change(avctx, avpkt);
+ // copy to ensure we do not change avpkt
+ AVPacket tmp = *avpkt;
+ int did_split = av_packet_split_side_data(&tmp);
+ apply_param_change(avctx, &tmp);
- avctx->pkt = avpkt;
- ret = avctx->codec->decode(avctx, frame, got_frame_ptr, avpkt);
+ avctx->pkt = &tmp;
+ ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);
if (ret >= 0 && *got_frame_ptr) {
avctx->frame_number++;
frame->pkt_dts = avpkt->dts;
if (frame->format == AV_SAMPLE_FMT_NONE)
frame->format = avctx->sample_fmt;
}
+
+ avctx->pkt = NULL;
+ if (did_split)
+ ff_packet_free_side_data(&tmp);
}
return ret;
}