Commit 9b8eedd7 authored by Peter Ross's avatar Peter Ross Committed by Michael Niedermayer

avformat/wtvdec: seek over broken chunks

Fixes ticket #3898
Signed-off-by: 's avatarPeter Ross <pross@xvid.org>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 72732f2d
...@@ -750,6 +750,26 @@ enum { ...@@ -750,6 +750,26 @@ enum {
SEEK_TO_PTS, SEEK_TO_PTS,
}; };
/**
* Try to seek over a broken chunk
* @return <0 on error
*/
static int recover(WtvContext *wtv, uint64_t broken_pos)
{
AVIOContext *pb = wtv->pb;
int i;
for (i = 0; i < wtv->nb_index_entries; i++) {
if (wtv->index_entries[i].pos > broken_pos) {
int ret = avio_seek(pb, wtv->index_entries[i].pos, SEEK_SET);
if (ret < 0)
return ret;
wtv->pts = wtv->index_entries[i].timestamp;
return 0;
}
}
return AVERROR(EIO);
}
/** /**
* Parse WTV chunks * Parse WTV chunks
* @param mode SEEK_TO_DATA or SEEK_TO_PTS * @param mode SEEK_TO_DATA or SEEK_TO_PTS
...@@ -767,8 +787,13 @@ static int parse_chunks(AVFormatContext *s, int mode, int64_t seekts, int *len_p ...@@ -767,8 +787,13 @@ static int parse_chunks(AVFormatContext *s, int mode, int64_t seekts, int *len_p
ff_get_guid(pb, &g); ff_get_guid(pb, &g);
len = avio_rl32(pb); len = avio_rl32(pb);
if (len < 32) if (len < 32) {
break; int ret;
av_log(s, AV_LOG_WARNING, "encountered broken chunk\n");
if ((ret = recover(wtv, avio_tell(pb) - 20)) < 0)
return ret;
continue;
}
sid = avio_rl32(pb) & 0x7FFF; sid = avio_rl32(pb) & 0x7FFF;
avio_skip(pb, 8); avio_skip(pb, 8);
consumed = 32; consumed = 32;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment