summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/demuxers/demux_ts.c29
-rw-r--r--src/xine-engine/xine_internal.h2
2 files changed, 31 insertions, 0 deletions
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index 5d6b8cb8c..f22526054 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -540,6 +540,30 @@ static void demux_ts_update_spu_channel(demux_ts_t *this)
this->video_fifo->put(this->video_fifo, buf);
}
+static void demux_ts_flush_media(demux_ts_media *m)
+{
+ if (m->buf) {
+ m->buf->content = m->buf->mem;
+ m->buf->size = m->buffered_bytes;
+ m->buf->type = m->type;
+ m->buf->decoder_flags |= BUF_FLAG_FRAME_END;
+ m->buf->pts = m->pts;
+ m->buf->extra_info->input_normpos = m->input_normpos;
+ m->buf->extra_info->input_time = m->input_time;
+ m->fifo->put(m->fifo, m->buf);
+ m->buffered_bytes = 0;
+ m->buf = NULL;
+ }
+}
+
+static void demux_ts_flush(demux_ts_t *this)
+{
+ unsigned int i;
+ for (i = 0; i < this->media_num; ++i) {
+ demux_ts_flush_media(&this->media[i]);
+ }
+}
+
/*
* demux_ts_parse_pat
*
@@ -2076,6 +2100,11 @@ static void demux_ts_event_handler (demux_ts_t *this) {
switch (event->type) {
+ case XINE_EVENT_END_OF_CLIP:
+ /* flush all streams */
+ demux_ts_flush(this);
+ /* fall thru */
+
case XINE_EVENT_PIDS_CHANGE:
this->videoPid = INVALID_PID;
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 7566c83e0..939876ebe 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -519,6 +519,8 @@ int _x_get_spu_channel (xine_stream_t *stream) XINE_PROTECTED;
/* sent by dvb frontend to inform ts demuxer of new pids */
#define XINE_EVENT_PIDS_CHANGE 0x80000000
+/* sent by BluRay input plugin to inform ts demuxer about end of clip */
+#define XINE_EVENT_END_OF_CLIP 0x80000001
/*
* pids change event - inform ts demuxer of new pids