diff options
author | Edward Hervey <bilboed@bilboed.com> | 2010-03-02 14:09:14 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2010-03-02 21:20:31 +0100 |
commit | be186bd08979f55e5eed8128377871bae1fab526 (patch) | |
tree | ccb3f625603660a4e840e21149e709ff03274503 /gst | |
parent | ad71d43f5221fedd4a8b2733a5e572ced93b3016 (diff) |
matroskademux: Mark streams as being EOS at the right time.
This allows us to stop streaming only when all streams have gone past the
segment.stop and not before.
Fixes #611501
Diffstat (limited to 'gst')
-rw-r--r-- | gst/matroska/matroska-demux.c | 22 | ||||
-rw-r--r-- | gst/matroska/matroska-ids.h | 3 |
2 files changed, 16 insertions, 9 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index de0fc435a..b9227a8bb 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -2278,6 +2278,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, context->pos = entry->time; context->set_discont = TRUE; context->last_flow = GST_FLOW_OK; + context->eos = FALSE; } demux->segment.last_stop = entry->time; demux->seek_block = entry->block; @@ -4381,7 +4382,8 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, GST_DEBUG_OBJECT (demux, "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index, GST_TIME_ARGS (demux->segment.stop)); - ret = GST_FLOW_UNEXPECTED; + stream->eos = TRUE; + ret = GST_FLOW_OK; /* combine flows */ ret = gst_matroska_demux_combine_flows (demux, stream, ret); goto done; @@ -5163,22 +5165,24 @@ gst_matroska_demux_loop (GstPad * pad) goto pause; /* check if we're at the end of a configured segment */ - if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (demux->segment.stop))) { + if (G_LIKELY (demux->src->len)) { guint i; g_assert (demux->num_streams == demux->src->len); for (i = 0; i < demux->src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (demux->src, i); - if (context->pos >= demux->segment.stop) { - GST_INFO_OBJECT (demux, "Reached end of segment (%" G_GUINT64_FORMAT - "-%" G_GUINT64_FORMAT ") on pad %s:%s", demux->segment.start, - demux->segment.stop, GST_DEBUG_PAD_NAME (context->pad)); - ret = GST_FLOW_UNEXPECTED; - goto pause; - } + GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT, + GST_TIME_ARGS (context->pos)); + if (context->eos == FALSE) + goto next; } + + GST_INFO_OBJECT (demux, "All streams are EOS"); + ret = GST_FLOW_UNEXPECTED; + goto pause; } +next: if (G_UNLIKELY (ebml->offset == gst_ebml_read_get_length (ebml))) { GST_LOG_OBJECT (demux, "Reached end of stream, sending EOS"); ret = GST_FLOW_UNEXPECTED; diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h index d8edc378e..e35ea56f5 100644 --- a/gst/matroska/matroska-ids.h +++ b/gst/matroska/matroska-ids.h @@ -521,6 +521,9 @@ struct _GstMatroskaTrackContext { /* A GArray of GstMatroskaTrackEncoding structures which contain the * encoding (compression/encryption) settings for this track, if any */ GArray *encodings; + + /* Whether the stream is EOS */ + gboolean eos; }; typedef struct _GstMatroskaTrackVideoContext { |