diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gst/qtdemux/qtdemux.c | 15 |
2 files changed, 19 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2006-02-14 Edward Hervey <edward@fluendo.com> + + * gst/qtdemux/qtdemux.c: (next_entry_size), (gst_qtdemux_chain): + Handle the case where data atoms are before moov atoms in push-based mode. + Errors out gracefully. + 2006-02-13 Edward Hervey <edward@fluendo.com> * gst/qtdemux/Makefile.am: diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 77458aec..20493379 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -761,7 +761,7 @@ next_entry_size (GstQTDemux * demux) { QtDemuxStream *stream; int i; - int smallidx = 0; + int smallidx = -1; guint64 smalloffs = -1; GST_LOG_OBJECT (demux, "Finding entry at offset %lld", demux->offset); @@ -785,6 +785,8 @@ next_entry_size (GstQTDemux * demux) GST_LOG_OBJECT (demux, "stream %d offset %lld demux->offset :%lld", smallidx, smalloffs, demux->offset); + if (smallidx == -1) + return -1; stream = demux->streams[smallidx]; if (stream->samples[stream->sample_index].offset >= demux->offset) { @@ -826,7 +828,16 @@ gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) /* get fourcc/length, set neededbytes */ extract_initial_length_and_fourcc ((guint8 *) data, &size, &fourcc); - if (fourcc == GST_MAKE_FOURCC ('m', 'd', 'a', 't')) { + GST_DEBUG_OBJECT (demux, + "Peeking found [%" GST_FOURCC_FORMAT "] size:%ld", + GST_FOURCC_ARGS (fourcc), size); + if ((fourcc == GST_MAKE_FOURCC ('m', 'd', 'a', 't'))) { + if (demux->n_streams <= 0) { + GST_ELEMENT_ERROR (demux, STREAM, FAILED, + (NULL), + ("Can't handled files with header after data in push-mode!")); + ret = GST_FLOW_ERROR; + } demux->state = QTDEMUX_STATE_MOVIE; demux->offset += 24; gst_adapter_flush (demux->adapter, 24); |