gst/qtdemux/qtdemux.c: Handle the case where data atoms are before moov atoms in...
authorEdward Hervey <bilboed@bilboed.com>
Tue, 14 Feb 2006 11:24:53 +0000 (11:24 +0000)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 14 Feb 2006 11:24:53 +0000 (11:24 +0000)
Original commit message from CVS:
* 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.

gst/qtdemux/qtdemux.c

index 77458ae..2049337 100644 (file)
@@ -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);