summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Hintukainen <phintuka@users.sourceforge.net>2013-09-22 20:42:54 +0300
committerPetri Hintukainen <phintuka@users.sourceforge.net>2013-09-22 20:42:54 +0300
commit94415c2babfaef6edf40e6ce852e463157b431f0 (patch)
tree2fd462e44bd4e992ffe6084fef35fa505023287e
parentd880e292d0041db40dd7cb1e6549808f9a8e7a20 (diff)
downloadxine-lib-94415c2babfaef6edf40e6ce852e463157b431f0.tar.gz
xine-lib-94415c2babfaef6edf40e6ce852e463157b431f0.tar.bz2
demux_ts: flush buffer when video data ends to sequence end code
(there won't be any more data -> no pusi -> last buffer is never flushed)
-rw-r--r--src/demuxers/demux_ts.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index 7bb1fd178..15286a264 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -1357,6 +1357,35 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
demux_ts_flush_media(m);
/* skip rest data - there shouldn't be any */
m->corrupted_pes = 1;
+ } else {
+
+ /* If video data ends to sequence end code, flush buffer. */
+ /* (there won't be any more data -> no pusi -> last buffer is never flushed) */
+ if (m->pid == this->videoPid && m->buf->size > 4 && m->buf->mem[m->buf->size-4] == 0) {
+
+ if (m->type == BUF_VIDEO_MPEG) {
+ if (!memcmp(&m->buf->mem[m->buf->size-4], "\x00\x00\x01\xb7", 4)) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_ts: PID 0x%.4x: flushing after MPEG end of sequence code\n", m->pid);
+ demux_ts_flush_media(m);
+ }
+
+ } else if (m->type == BUF_VIDEO_H264) {
+ if ((!memcmp(&m->buf->mem[m->buf->size-4], "\x00\x00\x01\x0a", 4)) ||
+ (m->buf->size > 5 &&
+ !memcmp(&m->buf->mem[m->buf->size-5], "\x00\x00\x01\x0a", 4))) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_ts: PID 0x%.4x: flushing after H.264 end of sequence code\n", m->pid);
+ demux_ts_flush_media(m);
+ }
+ } else if (m->type == BUF_VIDEO_VC1) {
+ if (!memcmp(&m->buf->mem[m->buf->size-4], "\x00\x00\x01\x0a", 4)) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_ts: PID 0x%.4x: flushing after VC-1 end of sequence code\n", m->pid);
+ demux_ts_flush_media(m);
+ }
+ }
+ }
}
}
}