[FFmpeg-cvslog] Fix side-data memleak also for audio.

Reimar Döffinger git at videolan.org
Sun Apr 8 13:06:35 CEST 2012


ffmpeg | branch: master | Reimar Döffinger <Reimar.Doeffinger at gmx.de> | Sun Apr  8 12:09:55 2012 +0200| [069cf86d32103da7bb2a0581dcbf66f1e95508d5] | committer: Reimar Döffinger

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 at gmx.de>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=069cf86d32103da7bb2a0581dcbf66f1e95508d5
---

 libavcodec/avcodec.h |    2 +-
 libavcodec/utils.c   |   16 +++++++++++-----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index a53f2c6..de9b245 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 e63878d..ab34b40 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;
 }



More information about the ffmpeg-cvslog mailing list