From a1a579afebca2e82715e9e57a91e591bb3a0802f Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Sun, 27 Jan 2013 12:54:15 +0100 Subject: [PATCH] qtdemux: push mode: only parse moov 1 once Fixes https://bugzilla.gnome.org/show_bug.cgi?id=691570 --- gst/isomp4/qtdemux.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index 1e491a9..60349a6 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -4226,22 +4226,30 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf) extract_initial_length_and_fourcc (data, demux->neededbytes, NULL, &fourcc); if (fourcc == FOURCC_moov) { - GST_DEBUG_OBJECT (demux, "Parsing [moov]"); + /* in usual fragmented setup we could try to scan for more + * and end up at the the moov (after mdat) again */ + if (demux->got_moov && demux->n_streams > 0) { + GST_DEBUG_OBJECT (demux, + "Skipping moov atom as we have one already"); + } else { + GST_DEBUG_OBJECT (demux, "Parsing [moov]"); - demux->got_moov = TRUE; + demux->got_moov = TRUE; - /* prepare newsegment to send when streaming actually starts */ - if (!demux->pending_newsegment) - demux->pending_newsegment = gst_event_new_segment (&demux->segment); + /* prepare newsegment to send when streaming actually starts */ + if (!demux->pending_newsegment) + demux->pending_newsegment = + gst_event_new_segment (&demux->segment); - qtdemux_parse_moov (demux, data, demux->neededbytes); - qtdemux_node_dump (demux, demux->moov_node); - qtdemux_parse_tree (demux); - qtdemux_expose_streams (demux); + qtdemux_parse_moov (demux, data, demux->neededbytes); + qtdemux_node_dump (demux, demux->moov_node); + qtdemux_parse_tree (demux); + qtdemux_expose_streams (demux); - g_node_destroy (demux->moov_node); - demux->moov_node = NULL; - GST_DEBUG_OBJECT (demux, "Finished parsing the header"); + g_node_destroy (demux->moov_node); + demux->moov_node = NULL; + GST_DEBUG_OBJECT (demux, "Finished parsing the header"); + } } else if (fourcc == FOURCC_moof) { if (demux->got_moov && demux->fragmented) { GST_DEBUG_OBJECT (demux, "Parsing [moof]"); -- 2.7.4