gst/qtdemux/qtdemux.c: Patch from dcm@acm.org (David Moore) to allow qtdemux to use non-seekable streams. (bug #142272)

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)
This commit is contained in:
David Moore 2004-05-19 06:23:38 +00:00 committed by David Schleef
parent 10052f2f01
commit 7a9127835c
2 changed files with 37 additions and 5 deletions

View file

@ -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> 2004-05-18 David Schleef <ds@schleef.org>
* gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16), * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16),

View file

@ -478,20 +478,21 @@ gst_qtdemux_change_state (GstElement * element)
switch (GST_STATE_TRANSITION (element)) { switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY: case GST_STATE_NULL_TO_READY:
break;
case GST_STATE_READY_TO_PAUSED:
qtdemux->bs = gst_bytestream_new (qtdemux->sinkpad); qtdemux->bs = gst_bytestream_new (qtdemux->sinkpad);
qtdemux->state = QTDEMUX_STATE_HEADER; qtdemux->state = QTDEMUX_STATE_HEADER;
GST_DEBUG ("new bytestream");
/* FIXME */ /* FIXME */
break; break;
case GST_STATE_READY_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_PLAYING: case GST_STATE_PAUSED_TO_PLAYING:
break; break;
case GST_STATE_PLAYING_TO_PAUSED: case GST_STATE_PLAYING_TO_PAUSED:
break; break;
case GST_STATE_PAUSED_TO_READY: case GST_STATE_PAUSED_TO_READY:
gst_bytestream_destroy (qtdemux->bs);
break; break;
case GST_STATE_READY_TO_NULL: case GST_STATE_READY_TO_NULL:
gst_bytestream_destroy (qtdemux->bs);
break; break;
default: default:
break; break;
@ -579,6 +580,7 @@ gst_qtdemux_loop_header (GstElement * element)
break; break;
} }
} while (1); } while (1);
qtdemux->offset += length;
qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length);
if (1) { if (1) {
@ -597,8 +599,18 @@ gst_qtdemux_loop_header (GstElement * element)
} }
ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length, ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length,
GST_SEEK_METHOD_SET); GST_SEEK_METHOD_SET);
qtdemux->offset = cur_offset + length;
GST_DEBUG ("seek returned %d", ret); 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; break;
} }
case QTDEMUX_STATE_SEEKING_EOS: 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); ret = gst_bytestream_seek (qtdemux->bs, 0, GST_SEEK_METHOD_END);
GST_DEBUG ("seek returned %d", ret); GST_DEBUG ("seek returned %d", ret);
if (ret == FALSE) {
gst_bytestream_flush (qtdemux->bs, 0xffffffff);
}
qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; qtdemux->state = QTDEMUX_STATE_SEEKING_EOS;
return; return;
@ -663,12 +678,22 @@ gst_qtdemux_loop_header (GstElement * element)
index, stream->sample_index, offset, size, index, stream->sample_index, offset, size,
stream->samples[stream->sample_index].timestamp); 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) { if (offset != cur_offset) {
GST_DEBUG ("seeking to offset %d", offset); GST_DEBUG ("seeking to offset %d", offset);
GST_LOG ("seeking to offset %d", offset); GST_LOG ("seeking to offset %d", offset);
ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET); ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET);
GST_DEBUG ("seek returned %d", ret); 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; return;
} }
@ -685,6 +710,7 @@ gst_qtdemux_loop_header (GstElement * element)
break; break;
} }
} while (TRUE); } while (TRUE);
qtdemux->offset += size;
if (buf) { if (buf) {
/* hum... */ /* hum... */