diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-04-30 19:50:26 +0300 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-04-30 20:07:38 +0300 |
commit | 035611f0a773b1e8e8eb0f2ba8cf94933392605f (patch) | |
tree | 8d0e11b2d1bd44a93d32bfc1d144a483a1ec788e /libmpdemux | |
parent | f38efd166e43f5cae783f38f9913d2859557143e (diff) |
demux_y4m: fix failure with nonseekable input
Playback of nonseekable y4m streams was broken by a change merged from
svn, r30970 which added support for multiple yuv4mpeg files
concatenated together. The change included a stream_skip(stream, -1)
call which only works for seekable files. Work around this by
disabling the concatenated-file check for nonseekable streams. This
means concatenated files are only supported if the stream is seekable,
but this is an improvement compared to the svn commit which caused a
regression making _all_ files fail in the nonseekable case.
It would be reasonably easy to make the concatenation support work in
all cases, either by modifying demux_y4m or (probably better) adding a
general stream API to allow pushing back the read byte. However for
now I'm only fixing the regression with the above trivial change.
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_y4m.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/libmpdemux/demux_y4m.c b/libmpdemux/demux_y4m.c index 31dec39386..90a62b3891 100644 --- a/libmpdemux/demux_y4m.c +++ b/libmpdemux/demux_y4m.c @@ -31,7 +31,7 @@ #include "mp_msg.h" #include "yuv4mpeg.h" -//#include "stream/stream.h" +#include "stream/stream.h" #include "demuxer.h" #include "stheader.h" @@ -89,11 +89,14 @@ static int demux_y4m_fill_buffer(demuxer_t *demux, demux_stream_t *dsds) { int err, size; int nextc; - nextc = stream_read_char(demux->stream); - stream_skip(demux->stream, -1); - if (nextc == 'Y') { - read_streaminfo(demux); - demux->seekable = 0; + // Concatenated stream check; only done if seekable so skip(-1) works + if (demux->stream->flags & MP_STREAM_SEEK_BW) { + nextc = stream_read_char(demux->stream); + stream_skip(demux->stream, -1); + if (nextc == 'Y') { + read_streaminfo(demux); + demux->seekable = 0; + } } y4m_init_frame_info(&fi); |