summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_avi.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-01-15 05:07:09 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-01-15 05:57:31 +0200
commit9bcd12fdf5c6f85e9bb391caa2713021624a957e (patch)
tree375eac533ead90a45e7121e5ab307861b4ef52c8 /libmpdemux/demux_avi.c
parentd419ecd161634e79dab3ac57d57c4bccba2adcdc (diff)
parente0d66b140e1da7a793bff15003cadab79544b1dd (diff)
downloadmpv-9bcd12fdf5c6f85e9bb391caa2713021624a957e.tar.bz2
mpv-9bcd12fdf5c6f85e9bb391caa2713021624a957e.tar.xz
Merge svn changes up to r28310
The libdvdread4 and libdvdnav directories, which are externals in the svn repository, are at least for now not included in any form. I added configure checks to automatically disable internal libdvdread and libdvdnav if the corresponding directories are not present; if they're added manually then things work the same as in svn.
Diffstat (limited to 'libmpdemux/demux_avi.c')
-rw-r--r--libmpdemux/demux_avi.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c
index 765463168d..9695fcb556 100644
--- a/libmpdemux/demux_avi.c
+++ b/libmpdemux/demux_avi.c
@@ -160,6 +160,9 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in
ds_read_packet(ds,demux->stream,len,pts,idxpos,flags);
skip-=len;
}
+ skip = FFMAX(skip, 0);
+ if (avi_stream_id(id) > 99 && id != mmioFOURCC('J','U','N','K'))
+ skip = FFMIN(skip, 65536);
if(skip){
mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_AVI: Skipping %d bytes from packet %04X\n",skip,id);
stream_skip(demux->stream,skip);
@@ -167,6 +170,18 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in
return ds?1:0;
}
+static uint32_t avi_find_id(stream_t *stream) {
+ uint32_t id = stream_read_dword_le(stream);
+ if (!id) {
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "Incomplete stream? Trying resync.\n");
+ do {
+ id = stream_read_dword_le(stream);
+ if (stream_eof(stream)) return 0;
+ } while (avi_stream_id(id) > 99);
+ }
+ return id;
+}
+
// return value:
// 0 = EOF or no stream found
// 1 = successfully read a packet
@@ -224,7 +239,7 @@ do{
demux->stream->eof=1;
return 0;
}
- id=stream_read_dword_le(demux->stream);
+ id=avi_find_id(demux->stream);
len=stream_read_dword_le(demux->stream);
if(stream_eof(demux->stream)) return 0; // EOF!
@@ -349,7 +364,7 @@ do{
return 0;
}
- id=stream_read_dword_le(demux->stream);
+ id=avi_find_id(demux->stream);
len=stream_read_dword_le(demux->stream);
if(stream_eof(demux->stream)) return 0;