summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2010-03-02 14:09:14 +0100
committerEdward Hervey <bilboed@bilboed.com>2010-03-02 21:20:31 +0100
commitbe186bd08979f55e5eed8128377871bae1fab526 (patch)
treeccb3f625603660a4e840e21149e709ff03274503 /gst
parentad71d43f5221fedd4a8b2733a5e572ced93b3016 (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.c22
-rw-r--r--gst/matroska/matroska-ids.h3
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 {