From 28fdf598e41d255bf851b4b7367e1c3a4e8ae4d3 Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Tue, 8 Apr 2025 15:08:11 -0400 Subject: [PATCH] v4l2codecs: Unref the frame before leaving on error In h264, h265 and mpeg2, make sure that dec_submit_bitstream() doesn't leak a frame when dec_ensure_output_buffer() fails. Part-of: --- .../gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c | 4 +++- .../gst-plugins-bad/sys/v4l2codecs/gstv4l2codech265dec.c | 4 +++- .../gst-plugins-bad/sys/v4l2codecs/gstv4l2codecmpeg2dec.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c index b2fa130e1e..5dcfc0e3c9 100644 --- a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c +++ b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c @@ -1241,8 +1241,10 @@ gst_v4l2_codec_h264_dec_submit_bitstream (GstV4l2CodecH264Dec * self, system_frame_number); g_return_val_if_fail (frame, FALSE); - if (!gst_v4l2_codec_h264_dec_ensure_output_buffer (self, frame)) + if (!gst_v4l2_codec_h264_dec_ensure_output_buffer (self, frame)) { + gst_video_codec_frame_unref (frame); goto done; + } request = gst_v4l2_decoder_alloc_request (self->decoder, system_frame_number, self->bitstream, frame->output_buffer); diff --git a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech265dec.c b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech265dec.c index 2f38959d6e..72ca794939 100644 --- a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech265dec.c +++ b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech265dec.c @@ -1392,8 +1392,10 @@ gst_v4l2_codec_h265_dec_submit_bitstream (GstV4l2CodecH265Dec * self, system_frame_number); g_return_val_if_fail (frame, FALSE); - if (!gst_v4l2_codec_h265_dec_ensure_output_buffer (self, frame)) + if (!gst_v4l2_codec_h265_dec_ensure_output_buffer (self, frame)) { + gst_video_codec_frame_unref (frame); goto done; + } request = gst_v4l2_decoder_alloc_request (self->decoder, system_frame_number, self->bitstream, frame->output_buffer); diff --git a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codecmpeg2dec.c b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codecmpeg2dec.c index 478bade5db..1449cd3053 100644 --- a/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codecmpeg2dec.c +++ b/subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codecmpeg2dec.c @@ -874,8 +874,10 @@ gst_v4l2_codec_mpeg2_dec_submit_bitstream (GstV4l2CodecMpeg2Dec * self, system_frame_number); g_return_val_if_fail (frame, FALSE); - if (!gst_v4l2_codec_mpeg2_dec_ensure_output_buffer (self, frame)) + if (!gst_v4l2_codec_mpeg2_dec_ensure_output_buffer (self, frame)) { + gst_video_codec_frame_unref (frame); goto done; + } request = gst_v4l2_decoder_alloc_request (self->decoder, system_frame_number, self->bitstream, frame->output_buffer);