From 313a6c65b749d87a8735e4bd0f232488797827cb Mon Sep 17 00:00:00 2001 From: James Almer Date: Thu, 9 Jan 2014 19:17:50 -0300 Subject: oggdec: validate VP8 keyframes Fixes seeking with broken files Signed-off-by: James Almer Signed-off-by: Michael Niedermayer --- libavformat/oggdec.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'libavformat') diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 66eb605..fd18e99 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -727,8 +727,16 @@ static void ogg_validate_keyframe(AVFormatContext *s, int idx, int pstart, int p { struct ogg *ogg = s->priv_data; struct ogg_stream *os = ogg->streams + idx; - if (psize && s->streams[idx]->codec->codec_id == AV_CODEC_ID_THEORA) { - if (!!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 0x40)) { + int invalid = 0; + if (psize) { + switch (s->streams[idx]->codec->codec_id) { + case AV_CODEC_ID_THEORA: + invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 0x40); + break; + case AV_CODEC_ID_VP8: + invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 1); + } + if (invalid) { os->pflags ^= AV_PKT_FLAG_KEY; av_log(s, AV_LOG_WARNING, "Broken file, %skeyframe not correctly marked.\n", (os->pflags & AV_PKT_FLAG_KEY) ? "" : "non-"); -- cgit v1.1