Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / libavcodec / utils.c
index f462bd1..47e29c9 100644 (file)
@@ -945,14 +945,13 @@ int ff_alloc_packet(AVPacket *avpkt, int size)
         return AVERROR(EINVAL);
 
     if (avpkt->data) {
-        uint8_t *pkt_data;
+        void *destruct = avpkt->destruct;
 
         if (avpkt->size < size)
             return AVERROR(EINVAL);
 
-        pkt_data = avpkt->data;
         av_init_packet(avpkt);
-        avpkt->data = pkt_data;
+        avpkt->destruct = destruct;
         avpkt->size = size;
         return 0;
     } else {
@@ -972,6 +971,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;
@@ -1072,6 +1072,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 */
@@ -1203,6 +1206,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;
@@ -1230,6 +1234,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;
 }