gst/qtdemux/qtdemux.c: Handle the case where data atoms are before moov atoms in push-based mode.

Original commit message from CVS:
* gst/qtdemux/qtdemux.c: (next_entry_size), (gst_qtdemux_chain):
Handle the case where data atoms are before moov atoms in push-based mode.
Errors out gracefully.
This commit is contained in:
Edward Hervey 2006-02-14 11:24:53 +00:00
parent 7e2a049670
commit 44cded3b2f

View file

@ -761,7 +761,7 @@ next_entry_size (GstQTDemux * demux)
{ {
QtDemuxStream *stream; QtDemuxStream *stream;
int i; int i;
int smallidx = 0; int smallidx = -1;
guint64 smalloffs = -1; guint64 smalloffs = -1;
GST_LOG_OBJECT (demux, "Finding entry at offset %lld", demux->offset); GST_LOG_OBJECT (demux, "Finding entry at offset %lld", demux->offset);
@ -785,6 +785,8 @@ next_entry_size (GstQTDemux * demux)
GST_LOG_OBJECT (demux, "stream %d offset %lld demux->offset :%lld", GST_LOG_OBJECT (demux, "stream %d offset %lld demux->offset :%lld",
smallidx, smalloffs, demux->offset); smallidx, smalloffs, demux->offset);
if (smallidx == -1)
return -1;
stream = demux->streams[smallidx]; stream = demux->streams[smallidx];
if (stream->samples[stream->sample_index].offset >= demux->offset) { if (stream->samples[stream->sample_index].offset >= demux->offset) {
@ -826,7 +828,16 @@ gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf)
/* get fourcc/length, set neededbytes */ /* get fourcc/length, set neededbytes */
extract_initial_length_and_fourcc ((guint8 *) data, &size, &fourcc); extract_initial_length_and_fourcc ((guint8 *) data, &size, &fourcc);
if (fourcc == GST_MAKE_FOURCC ('m', 'd', 'a', 't')) { GST_DEBUG_OBJECT (demux,
"Peeking found [%" GST_FOURCC_FORMAT "] size:%ld",
GST_FOURCC_ARGS (fourcc), size);
if ((fourcc == GST_MAKE_FOURCC ('m', 'd', 'a', 't'))) {
if (demux->n_streams <= 0) {
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
(NULL),
("Can't handled files with header after data in push-mode!"));
ret = GST_FLOW_ERROR;
}
demux->state = QTDEMUX_STATE_MOVIE; demux->state = QTDEMUX_STATE_MOVIE;
demux->offset += 24; demux->offset += 24;
gst_adapter_flush (demux->adapter, 24); gst_adapter_flush (demux->adapter, 24);