Rediff of a patch written by David Moore at http://bugzilla.gnome.org/show_bug.cgi?id=142272 Currently qtdemux will not play files through fdsrc, because qtdemux requires seeking and fdsrc does not support this. This patch falls back to gst_bytestream_flush() when gst_bytestream_seek() fails. This solves the above problem. --- gst-plugins/gst/qtdemux/qtdemux.c.orig 2005-01-24 14:47:50.071452576 +0000 +++ gst-plugins/gst/qtdemux/qtdemux.c 2005-01-24 14:55:49.144622384 +0000 @@ -511,10 +511,11 @@ 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"); + break; + case GST_STATE_READY_TO_PAUSED: break; case GST_STATE_PAUSED_TO_PLAYING: break; @@ -524,9 +525,9 @@ qtdemux->last_ts = GST_CLOCK_TIME_NONE; qtdemux->need_discont = FALSE; qtdemux->need_flush = FALSE; - gst_bytestream_destroy (qtdemux->bs); break; case GST_STATE_READY_TO_NULL: + gst_bytestream_destroy (qtdemux->bs); break; default: break; @@ -614,6 +615,7 @@ break; } } while (1); + qtdemux->offset += length; qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); if (1) { @@ -632,11 +634,18 @@ } ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length, GST_SEEK_METHOD_SET); - if (!ret) { - g_warning ("seek failed"); + 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; - GST_DEBUG ("seek returned %d", ret); break; } case QTDEMUX_STATE_SEEKING_EOS: @@ -685,8 +694,8 @@ GST_DATA (gst_event_new (GST_EVENT_EOS))); } ret = gst_bytestream_seek (qtdemux->bs, 0, GST_SEEK_METHOD_END); - if (!ret) { - g_warning ("seek failed"); + if (ret == FALSE) { + gst_bytestream_flush(qtdemux->bs, 0xffffffff); } GST_DEBUG ("seek returned %d", ret); @@ -706,16 +715,23 @@ /* don't believe bytestream */ //cur_offset = gst_bytestream_tell (qtdemux->bs); + cur_offset = qtdemux->offset; if (offset != cur_offset) { GST_DEBUG ("seeking to offset %d (currently at %d)", offset, cur_offset); ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET); - if (!ret) { - g_warning ("seek failed"); + 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; - GST_DEBUG ("seek returned %d", ret); return; } @@ -732,6 +748,7 @@ break; } } while (TRUE); + qtdemux->offset += size; if (buf) { /* hum... FIXME changing framerate breaks horribly, better set