gst/qtdemux/qtdemux.c: Patch from dcm@acm.org (David Moore) to allow qtdemux to use...
authorDavid Moore <dcm@acm.org>
Wed, 19 May 2004 06:23:38 +0000 (06:23 +0000)
committerDavid Schleef <ds@schleef.org>
Wed, 19 May 2004 06:23:38 +0000 (06:23 +0000)
Original commit message from CVS:
* gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state),
(gst_qtdemux_loop_header):  Patch from dcm@acm.org (David Moore)
to allow qtdemux to use non-seekable streams. (bug #142272)

ChangeLog
gst/qtdemux/qtdemux.c

index d06fe44da8e3ee0ba3722ee8c023fb999c233059..24e306b26f4c674db84aaa14369b951e536b9bd0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-05-18  David Schleef  <ds@schleef.org>
+
+       * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state),
+       (gst_qtdemux_loop_header):  Patch from dcm@acm.org (David Moore)
+       to allow qtdemux to use non-seekable streams. (bug #142272)
+
 2004-05-18  David Schleef  <ds@schleef.org>
 
        * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16),
index 4afdf0cf66858f7c51573f417de80e15b3305078..a1a9c92b23996419b7b74c426a483f6b31202b70 100644 (file)
@@ -478,20 +478,21 @@ gst_qtdemux_change_state (GstElement * element)
 
   switch (GST_STATE_TRANSITION (element)) {
     case GST_STATE_NULL_TO_READY:
-      break;
-    case GST_STATE_READY_TO_PAUSED:
       qtdemux->bs = gst_bytestream_new (qtdemux->sinkpad);
       qtdemux->state = QTDEMUX_STATE_HEADER;
+      GST_DEBUG ("new bytestream");
       /* FIXME */
       break;
+    case GST_STATE_READY_TO_PAUSED:
+      break;
     case GST_STATE_PAUSED_TO_PLAYING:
       break;
     case GST_STATE_PLAYING_TO_PAUSED:
       break;
     case GST_STATE_PAUSED_TO_READY:
-      gst_bytestream_destroy (qtdemux->bs);
       break;
     case GST_STATE_READY_TO_NULL:
+      gst_bytestream_destroy (qtdemux->bs);
       break;
     default:
       break;
@@ -579,6 +580,7 @@ gst_qtdemux_loop_header (GstElement * element)
               break;
             }
           } while (1);
+          qtdemux->offset += length;
 
           qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length);
           if (1) {
@@ -597,8 +599,18 @@ gst_qtdemux_loop_header (GstElement * element)
       }
       ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length,
           GST_SEEK_METHOD_SET);
-      qtdemux->offset = cur_offset + length;
       GST_DEBUG ("seek returned %d", ret);
+      if (ret == FALSE) {
+        length = cur_offset + length;
+        cur_offset = qtdemux->offset;
+        length -= cur_offset;
+        if (gst_bytestream_flush (qtdemux->bs, length) == FALSE) {
+          if (!gst_qtdemux_handle_sink_event (qtdemux)) {
+            return;
+          }
+        }
+      }
+      qtdemux->offset = cur_offset + length;
       break;
     }
     case QTDEMUX_STATE_SEEKING_EOS:
@@ -648,6 +660,9 @@ gst_qtdemux_loop_header (GstElement * element)
         }
         ret = gst_bytestream_seek (qtdemux->bs, 0, GST_SEEK_METHOD_END);
         GST_DEBUG ("seek returned %d", ret);
+        if (ret == FALSE) {
+          gst_bytestream_flush (qtdemux->bs, 0xffffffff);
+        }
 
         qtdemux->state = QTDEMUX_STATE_SEEKING_EOS;
         return;
@@ -663,12 +678,22 @@ gst_qtdemux_loop_header (GstElement * element)
           index, stream->sample_index, offset, size,
           stream->samples[stream->sample_index].timestamp);
 
-      cur_offset = gst_bytestream_tell (qtdemux->bs);
+      // cur_offset = gst_bytestream_tell (qtdemux->bs);
+      cur_offset = qtdemux->offset;
       if (offset != cur_offset) {
         GST_DEBUG ("seeking to offset %d", offset);
         GST_LOG ("seeking to offset %d", offset);
         ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET);
         GST_DEBUG ("seek returned %d", ret);
+        if (ret == FALSE && offset > cur_offset) {
+          if (gst_bytestream_flush (qtdemux->bs, offset - cur_offset) == FALSE) {
+            if (!gst_qtdemux_handle_sink_event (qtdemux)) {
+              return;
+            }
+          }
+        } else if (ret == FALSE && offset < cur_offset)
+          GST_ERROR ("cannot flush backwards");
+        qtdemux->offset = offset;
         return;
       }
 
@@ -685,6 +710,7 @@ gst_qtdemux_loop_header (GstElement * element)
           break;
         }
       } while (TRUE);
+      qtdemux->offset += size;
 
       if (buf) {
         /* hum... */