From 1ed9de2f68121163a547512d7fbeeaa33ee7b8fc Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 14 Aug 2006 10:49:10 +0000 Subject: [PATCH] ext/ogg/gstoggdemux.c: Add some more debug info. Original commit message from CVS: * ext/ogg/gstoggdemux.c: (gst_ogg_demux_submit_buffer), (gst_ogg_demux_get_next_page), (gst_ogg_demux_perform_seek), (gst_ogg_demux_read_chain), (gst_ogg_demux_loop): Add some more debug info. Don't crash when a seek failed. Actually return the result of the seek instead of TRUE. Ignore multiple BOS pages with the same serial so that we don't create the same stream multiple times. Post an error when we fail to do the initial seek. --- ChangeLog | 12 ++++++++++++ ext/ogg/gstoggdemux.c | 32 +++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2a3fece0c4..36214305a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-08-14 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_submit_buffer), + (gst_ogg_demux_get_next_page), (gst_ogg_demux_perform_seek), + (gst_ogg_demux_read_chain), (gst_ogg_demux_loop): + Add some more debug info. + Don't crash when a seek failed. + Actually return the result of the seek instead of TRUE. + Ignore multiple BOS pages with the same serial so that we don't create + the same stream multiple times. + Post an error when we fail to do the initial seek. + 2006-08-13 Wim Taymans * ext/alsa/gstalsa.c: (gst_alsa_detect_rates), diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index 08daa1433f..781052f199 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -1494,6 +1494,8 @@ gst_ogg_demux_submit_buffer (GstOggDemux * ogg, GstBuffer * buffer) size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); + GST_DEBUG_OBJECT (ogg, "submitting %u bytes", size); + oggbuffer = ogg_sync_buffer (&ogg->sync, size); memcpy (oggbuffer, data, size); ogg_sync_wrote (&ogg->sync, size); @@ -1585,6 +1587,8 @@ gst_ogg_demux_get_next_page (GstOggDemux * ogg, ogg_page * og, gint64 boundary) more = ogg_sync_pageseek (&ogg->sync, og); + GST_LOG_OBJECT (ogg, "pageseek gave %ld", more); + if (more < 0) { GST_LOG_OBJECT (ogg, "skipped %ld bytes", more); /* skipped n bytes */ @@ -2069,6 +2073,11 @@ gst_ogg_demux_perform_seek (GstOggDemux * ogg, GstEvent * event) res = gst_ogg_demux_do_seek (ogg, ogg->segment.last_stop, accurate, &chain); + /* seek failed, make sure we continue the current chain */ + if (!res) { + chain = ogg->current_chain; + } + /* now we have a new position, prepare for streaming again */ { GstEvent *event; @@ -2119,7 +2128,7 @@ gst_ogg_demux_perform_seek (GstOggDemux * ogg, GstEvent * event) /* streaming can continue now */ GST_PAD_STREAM_UNLOCK (ogg->sinkpad); - return TRUE; + return res; error: { @@ -2240,6 +2249,12 @@ gst_ogg_demux_read_chain (GstOggDemux * ogg) } serial = ogg_page_serialno (&op); + if (gst_ogg_chain_get_stream (chain, serial) != NULL) { + GST_WARNING_OBJECT (ogg, "found serial %08x BOS page twice, ignoring", + serial); + continue; + } + pad = gst_ogg_chain_new_stream (chain, serial); gst_ogg_pad_submit_page (pad, &op); } @@ -2769,8 +2784,9 @@ gst_ogg_demux_loop (GstOggPad * pad) if (ogg->need_chains) { gboolean got_chains; + gboolean res; - /* this is the only place where we write chains */ + /* this is the only place where we write chains and thus need to lock. */ GST_CHAIN_LOCK (ogg); ogg->chain_error = GST_FLOW_OK; got_chains = gst_ogg_demux_find_chains (ogg); @@ -2787,9 +2803,12 @@ gst_ogg_demux_loop (GstOggPad * pad) GST_OBJECT_UNLOCK (ogg); /* and seek to configured positions without FLUSH */ - gst_ogg_demux_perform_seek (ogg, event); + res = gst_ogg_demux_perform_seek (ogg, event); if (event) gst_event_unref (event); + + if (!res) + goto seek_failed; } if (ogg->offset == ogg->length) { @@ -2827,6 +2846,13 @@ chain_read_failed: ret = ogg->chain_error; goto pause; } +seek_failed: + { + GST_ELEMENT_ERROR (ogg, STREAM, DEMUX, (NULL), + ("failed to start demuxing ogg")); + ret = GST_FLOW_ERROR; + goto pause; + } eos: { ret = GST_FLOW_UNEXPECTED;