diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-02-28 14:00:26 +0200 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2023-02-28 13:51:12 +0000 |
commit | 6b16b41889c5728332d117840652273be708b465 (patch) | |
tree | 9762da243d643c4a4734bb5408938e0c2de525c1 | |
parent | ccb77f72ef08843743d6b42b53ac3e1e875dd7cb (diff) |
ffmpeg: avauddec/avviddec: Free packet side data after usage
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/4079>
-rw-r--r-- | subprojects/gst-libav/ext/libav/gstavauddec.c | 2 | ||||
-rw-r--r-- | subprojects/gst-libav/ext/libav/gstavviddec.c | 8 |
2 files changed, 7 insertions, 3 deletions
diff --git a/subprojects/gst-libav/ext/libav/gstavauddec.c b/subprojects/gst-libav/ext/libav/gstavauddec.c index 7415143b22..7ba04f0d59 100644 --- a/subprojects/gst-libav/ext/libav/gstavauddec.c +++ b/subprojects/gst-libav/ext/libav/gstavauddec.c @@ -726,8 +726,10 @@ gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf) goto unmap; 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 */ diff --git a/subprojects/gst-libav/ext/libav/gstavviddec.c b/subprojects/gst-libav/ext/libav/gstavviddec.c index 9d45f84c78..e2758c788b 100644 --- a/subprojects/gst-libav/ext/libav/gstavviddec.c +++ b/subprojects/gst-libav/ext/libav/gstavviddec.c @@ -2048,6 +2048,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; @@ -2057,9 +2060,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; @@ -2075,8 +2075,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 { |