mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
gst/real/: Don't crash when we get a buffer and our input caps haven't been set yet; also, don't leak all the input b...
Original commit message from CVS: * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_chain), (gst_real_audio_dec_setcaps): * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain): Don't crash when we get a buffer and our input caps haven't been set yet; also, don't leak all the input buffers (realaudiodec only).
This commit is contained in:
parent
a7c38b8b37
commit
a6ec2ff8d5
3 changed files with 58 additions and 14 deletions
|
@ -1,3 +1,11 @@
|
|||
2007-05-16 Tim-Philipp Müller <tim at centricular dot net>
|
||||
|
||||
* gst/real/gstrealaudiodec.c: (gst_real_audio_dec_chain),
|
||||
(gst_real_audio_dec_setcaps):
|
||||
* gst/real/gstrealvideodec.c: (gst_real_video_dec_chain):
|
||||
Don't crash when we get a buffer and our input caps haven't been set
|
||||
yet; also, don't leak all the input buffers (realaudiodec only).
|
||||
|
||||
2007-05-16 Stefan Kost <ensonic@users.sf.net>
|
||||
|
||||
patch by: Stanislav Brabec <sbrabec@suse.cz>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* GStreamer
|
||||
/* RealAudio wrapper plugin
|
||||
*
|
||||
* Copyright (C) 2006 Lutz Mueller <lutz@topfrose.de>
|
||||
* Copyright (C) 2006 Edward Hervey <bilboed@bilboed.com>
|
||||
|
@ -137,30 +137,55 @@ static GstFlowReturn
|
|||
gst_real_audio_dec_chain (GstPad * pad, GstBuffer * in)
|
||||
{
|
||||
GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (GST_PAD_PARENT (pad));
|
||||
guint len;
|
||||
GstFlowReturn flow;
|
||||
GstClockTime timestamp;
|
||||
GstBuffer *out = NULL;
|
||||
guint16 res = 0;
|
||||
GstFlowReturn ret = GST_FLOW_OK;
|
||||
GstClockTime timestamp = GST_BUFFER_TIMESTAMP (in);
|
||||
guint len;
|
||||
|
||||
if (G_UNLIKELY (dec->funcs.RADecode == NULL || dec->module == NULL))
|
||||
goto not_negotiated;
|
||||
|
||||
timestamp = GST_BUFFER_TIMESTAMP (in);
|
||||
|
||||
flow = gst_pad_alloc_buffer (dec->src, GST_BUFFER_OFFSET_NONE,
|
||||
dec->width * dec->leaf_size * dec->height * 16,
|
||||
GST_PAD_CAPS (dec->src), &out);
|
||||
|
||||
if (flow != GST_FLOW_OK)
|
||||
goto done;
|
||||
|
||||
if ((ret = gst_pad_alloc_buffer (dec->src, GST_BUFFER_OFFSET_NONE,
|
||||
dec->width * dec->leaf_size * dec->height * 16,
|
||||
GST_PAD_CAPS (dec->src), &out)) != GST_FLOW_OK)
|
||||
return ret;
|
||||
res = dec->funcs.RADecode (dec->context, GST_BUFFER_DATA (in),
|
||||
GST_BUFFER_SIZE (in), GST_BUFFER_DATA (out), &len, -1);
|
||||
if (res)
|
||||
|
||||
if (res != 0)
|
||||
goto could_not_decode;
|
||||
|
||||
GST_BUFFER_SIZE (out) = len;
|
||||
GST_BUFFER_TIMESTAMP (out) = timestamp;
|
||||
return gst_pad_push (dec->src, out);
|
||||
|
||||
flow = gst_pad_push (dec->src, out);
|
||||
|
||||
done:
|
||||
gst_buffer_unref (in);
|
||||
return flow;
|
||||
|
||||
/* Errors */
|
||||
could_not_decode:
|
||||
gst_buffer_unref (out);
|
||||
GST_ELEMENT_ERROR (dec, STREAM, DECODE, ("Could not decode buffer (%i).",
|
||||
res), (NULL));
|
||||
return GST_FLOW_ERROR;
|
||||
{
|
||||
gst_buffer_unref (out);
|
||||
GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
|
||||
("Could not decode buffer (%i).", res));
|
||||
flow = GST_FLOW_ERROR;
|
||||
goto done;
|
||||
}
|
||||
not_negotiated:
|
||||
{
|
||||
GST_WARNING_OBJECT (dec, "decoder not open, probably no input caps set "
|
||||
"yet, caps on input buffer: %" GST_PTR_FORMAT, GST_BUFFER_CAPS (in));
|
||||
flow = GST_FLOW_NOT_NEGOTIATED;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -198,6 +223,7 @@ gst_real_audio_dec_setcaps (GstPad * pad, GstCaps * caps)
|
|||
!gst_structure_get_int (s, "leaf_size", &leaf_size) ||
|
||||
!gst_structure_get_int (s, "packet_size", &packet_size))
|
||||
goto missing_keys;
|
||||
|
||||
if ((v = gst_structure_get_value (s, "codec_data")))
|
||||
buf = g_value_peek_pointer (v);
|
||||
|
||||
|
|
|
@ -446,6 +446,9 @@ gst_real_video_dec_chain (GstPad * pad, GstBuffer * in)
|
|||
guint len = GST_BUFFER_SIZE (in);
|
||||
GstFlowReturn ret;
|
||||
|
||||
if (G_UNLIKELY (dec->hooks.transform == NULL || dec->hooks.module == NULL))
|
||||
goto not_negotiated;
|
||||
|
||||
/* Flags */
|
||||
if (len < 1)
|
||||
goto not_enough_data;
|
||||
|
@ -472,6 +475,13 @@ not_enough_data:
|
|||
gst_buffer_unref (in);
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
not_negotiated:
|
||||
{
|
||||
GST_WARNING_OBJECT (dec, "decoder not open, probably no input caps set "
|
||||
"yet, caps on input buffer: %" GST_PTR_FORMAT, GST_BUFFER_CAPS (in));
|
||||
gst_buffer_unref (in);
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
Loading…
Reference in a new issue