mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
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:
parent
10052f2f01
commit
7a9127835c
2 changed files with 37 additions and 5 deletions
|
@ -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),
|
||||||
|
|
|
@ -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... */
|
||||||
|
|
Loading…
Reference in a new issue