]> git.sesse.net Git - ffmpeg/commitdiff
lavc: free the output packet when encoding failed or produced no output.
authorAnton Khirnov <anton@khirnov.net>
Fri, 24 Feb 2012 12:14:02 +0000 (13:14 +0100)
committerAnton Khirnov <anton@khirnov.net>
Sat, 3 Mar 2012 05:31:41 +0000 (06:31 +0100)
libavcodec/avcodec.h
libavcodec/utils.c

index 19f114f78da2084ffdd8c0c1fd17073002cecdf9..3598aaaa8510a75e67423fa8bf2f7abd578519b9 100644 (file)
@@ -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.
index a91eab1ac11f5858c80dbec0575686bc5b52f1e2..f9927a13837321afa192ca9715c6bbf736719d12 100644 (file)
@@ -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;
 }