gst/qtdemux/qtdemux.c: Don't crash on files with 0 samples, EOS immediatly instead.
authorWim Taymans <wim.taymans@gmail.com>
Thu, 15 Jun 2006 08:50:09 +0000 (08:50 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 15 Jun 2006 08:50:09 +0000 (08:50 +0000)
Original commit message from CVS:
* gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header),
(gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample),
(gst_qtdemux_add_stream):
Don't crash on files with 0 samples, EOS immediatly instead.
Fixes #344944.

ChangeLog
gst/qtdemux/qtdemux.c

index 41560021fcd349b1589ee563a97132d1db938d23..977e555f12bc85b78cef90ba5cacf61f01aaf8fa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-06-15  Wim Taymans  <wim@fluendo.com>
+
+       * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header),
+       (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample),
+       (gst_qtdemux_add_stream):
+       Don't crash on files with 0 samples, EOS immediatly instead.
+       Fixes #344944.
+
 2006-06-14  Tim-Philipp Müller  <tim at centricular dot net>
 
        Patch by: Wouter Paesen  <wouter at kangaroot net>
index 2510a859cbddebe76e4a94ceb21f2b92f26e7582..a7d2c30fcf2870a071f5ab3a2939a33dabaacb2f 100644 (file)
@@ -1016,8 +1016,8 @@ gst_qtdemux_loop_state_header (GstQTDemux * qtdemux)
       qtdemux->state = QTDEMUX_STATE_MOVIE;
       GST_DEBUG_OBJECT (qtdemux, "switching state to STATE_MOVIE (%d)",
           qtdemux->state);
-    }
       break;
+    }
     ed_edd_and_eddy:
     default:{
       GST_LOG ("unknown %08x '%" GST_FOURCC_FORMAT "' at %d",
@@ -1150,6 +1150,9 @@ gst_qtdemux_prepare_current_sample (GstQTDemux * qtdemux,
   if (stream->segment_index != seg_idx)
     gst_qtdemux_activate_segment (qtdemux, stream, seg_idx, time_position);
 
+  if (stream->sample_index >= stream->n_samples)
+    goto eos;
+
   /* now get the info for the sample we're at */
   sample = &stream->samples[stream->sample_index];
 
@@ -1186,7 +1189,7 @@ gst_qtdemux_advance_sample (GstQTDemux * qtdemux, QtDemuxStream * stream)
   segment = &stream->segments[stream->segment_index];
 
   /* reached the last sample, we need the next segment */
-  if (stream->sample_index == stream->n_samples)
+  if (stream->sample_index >= stream->n_samples)
     goto next_segment;
 
   /* get next sample */
@@ -1410,12 +1413,11 @@ invalid_state:
 }
 
 /*
-  next_entry_size
-  
-  Returns the size of the first entry at the current offset.
-  If -1, there are none (which means EOS or empty file).
-*/
-
+ * next_entry_size
+ * 
+ * Returns the size of the first entry at the current offset.
+ * If -1, there are none (which means EOS or empty file).
+ */
 static guint64
 next_entry_size (GstQTDemux * demux)
 {
@@ -1753,6 +1755,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
     /* fps is calculated base on the duration of the first frames since
      * qt does not have a fixed framerate. */
     if ((stream->n_samples == 1) && (stream->min_duration == 0)) {
+      /* still frame */
       stream->fps_n = 0;
       stream->fps_d = 1;
     } else {
@@ -1768,6 +1771,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
           "width", G_TYPE_INT, stream->width,
           "height", G_TYPE_INT, stream->height,
           "framerate", GST_TYPE_FRACTION, stream->fps_n, stream->fps_d, NULL);
+
       if ((stream->bits_per_sample & 0x1F) == 8) {
         const guint32 *palette_data = NULL;