ext/spc/gstspc.c: Post an error and push EOS when we can't start playback for some reason. also avoid a crash when fe...

Original commit message from CVS:
Patch by: Jonathan Matthew <notverysmart at gmail dot com>
* ext/spc/gstspc.c: (gst_spc_dec_sink_event), (spc_setup):
Post an error and push EOS when we can't start playback for some reason.
also avoid a crash when fed an empty file. Fixes #480543.
This commit is contained in:
Jonathan Matthew 2008-11-25 18:28:18 +00:00 committed by Wim Taymans
parent 7615d3d8d3
commit c68ea73e3f
2 changed files with 24 additions and 9 deletions

View file

@ -1,3 +1,11 @@
2008-11-25 Wim Taymans <wim.taymans@collabora.co.uk>
Patch by: Jonathan Matthew <notverysmart at gmail dot com>
* ext/spc/gstspc.c: (gst_spc_dec_sink_event), (spc_setup):
Post an error and push EOS when we can't start playback for some reason.
also avoid a crash when fed an empty file. Fixes #480543.
2008-11-25 Sebastian Dröge <sebastian.droege@collabora.co.uk> 2008-11-25 Sebastian Dröge <sebastian.droege@collabora.co.uk>
* tests/check/elements/speexresample.c: (test_pipeline): * tests/check/elements/speexresample.c: (test_pipeline):

View file

@ -195,20 +195,27 @@ gst_spc_dec_sink_event (GstPad * pad, GstEvent * event)
{ {
GstSpcDec *spc = GST_SPC_DEC (gst_pad_get_parent (pad)); GstSpcDec *spc = GST_SPC_DEC (gst_pad_get_parent (pad));
gboolean result = TRUE; gboolean result = TRUE;
gboolean forward = FALSE;
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_EOS: case GST_EVENT_EOS:
result = spc_setup (spc); /* we get EOS when we loaded the complete file, now try to initialize the
break; * decoding */
case GST_EVENT_NEWSEGMENT: if (!(result = spc_setup (spc))) {
result = FALSE; /* can't start, post an ERROR and push EOS downstream */
GST_ELEMENT_ERROR (spc, STREAM, DEMUX, (NULL),
("can't start playback"));
forward = TRUE;
}
break; break;
default: default:
result = FALSE;
break; break;
} }
if (forward)
result = gst_pad_push_event (spc->srcpad, event);
else
gst_event_unref (event);
gst_event_unref (event);
gst_object_unref (spc); gst_object_unref (spc);
return result; return result;
@ -453,18 +460,18 @@ spc_play (GstPad * pad)
static gboolean static gboolean
spc_setup (GstSpcDec * spc) spc_setup (GstSpcDec * spc)
{ {
guchar *data = GST_BUFFER_DATA (spc->buf);
spc_tag_info *info; spc_tag_info *info;
GstTagList *taglist; GstTagList *taglist;
guint64 total_duration; guint64 total_duration;
if (!spc_negotiate (spc)) { if (!spc->buf || !spc_negotiate (spc)) {
return FALSE; return FALSE;
} }
info = &(spc->tag_info); info = &(spc->tag_info);
spc_tag_get_info (data, GST_BUFFER_SIZE (spc->buf), info); spc_tag_get_info (GST_BUFFER_DATA (spc->buf), GST_BUFFER_SIZE (spc->buf),
info);
taglist = gst_tag_list_new (); taglist = gst_tag_list_new ();