ffmpeg: avauddec/avviddec: Free packet side data after usage
authorSebastian Dröge <sebastian@centricular.com>
Tue, 28 Feb 2023 12:00:26 +0000 (14:00 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 28 Feb 2023 12:45:59 +0000 (12:45 +0000)
As we don't use proper refcounting with AVPacket we have to manage this
ourselves.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2006

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4078>

subprojects/gst-libav/ext/libav/gstavauddec.c
subprojects/gst-libav/ext/libav/gstavviddec.c

index a24f7d5..597cb54 100644 (file)
@@ -773,8 +773,10 @@ gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
   }
 
   if (avcodec_send_packet (ffmpegdec->context, &packet) < 0) {
+    av_packet_free_side_data (&packet);
     goto send_packet_failed;
   }
+  av_packet_free_side_data (&packet);
 
   do {
     /* decode a frame of audio now */
index 6d7c4cd..336da5b 100644 (file)
@@ -2119,6 +2119,9 @@ gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
   /* now decode the frame */
   gst_avpacket_init (&packet, data, size);
 
+  if (!packet.size)
+    goto done;
+
   if (ffmpegdec->palette) {
     guint8 *pal;
 
@@ -2128,9 +2131,6 @@ gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
     GST_DEBUG_OBJECT (ffmpegdec, "copy pal %p %p", &packet, pal);
   }
 
-  if (!packet.size)
-    goto done;
-
   /* save reference to the timing info */
   ffmpegdec->context->reordered_opaque = (gint64) frame->system_frame_number;
   ffmpegdec->picture->reordered_opaque = (gint64) frame->system_frame_number;
@@ -2146,8 +2146,10 @@ gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
   GST_VIDEO_DECODER_STREAM_UNLOCK (ffmpegdec);
   if (avcodec_send_packet (ffmpegdec->context, &packet) < 0) {
     GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
+    av_packet_free_side_data (&packet);
     goto send_packet_failed;
   }
+  av_packet_free_side_data (&packet);
   GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
 
   do {