summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorzuxy <zuxy@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-19 11:42:05 +0000
committerzuxy <zuxy@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-19 11:42:05 +0000
commit757e575aebb0036c21cf9182e2155712ee9815af (patch)
tree444ad23800ef496d128b016c4b154b5a6f2dce9f /libmpdemux
parentfdae4e00953986c5de187b917ac2c9897dd4de57 (diff)
downloadmpv-757e575aebb0036c21cf9182e2155712ee9815af.tar.bz2
mpv-757e575aebb0036c21cf9182e2155712ee9815af.tar.xz
Be more robust against corrupted RM files that contain invalid packet length
by seeking to a known good place when index table is available. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28665 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_real.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c
index 4c5456fc42..c0299e0fed 100644
--- a/libmpdemux/demux_real.c
+++ b/libmpdemux/demux_real.c
@@ -624,7 +624,15 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
if (len < 12){
mp_msg(MSGT_DEMUX, MSGL_V,"%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len);
mp_msg(MSGT_DEMUX, MSGL_WARN,"bad packet len (%d)\n", len);
- stream_skip(demuxer->stream, len);
+ if ((unsigned)demuxer->video->id < MAX_STREAMS) {
+ if (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id]) {
+ stream_seek(demuxer->stream, priv->index_table[demuxer->video->id][++priv->current_vpacket].offset);
+ }
+ } else if ((unsigned)demuxer->audio->id < MAX_STREAMS) {
+ if (priv->current_apacket + 1 < priv->index_table_size[demuxer->audio->id]) {
+ stream_seek(demuxer->stream, priv->index_table[demuxer->audio->id][++priv->current_apacket].offset);
+ }
+ }
continue; //goto loop;
}