[FFmpeg-cvslog] oggdec: validate VP8 keyframes

James Almer git at videolan.org
Mon Feb 24 02:37:19 CET 2014


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Thu Jan  9 19:17:50 2014 -0300| [313a6c65b749d87a8735e4bd0f232488797827cb] | committer: Michael Niedermayer

oggdec: validate VP8 keyframes

Fixes seeking with broken files

Signed-off-by: James Almer <jamrial at gmail.com>
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=313a6c65b749d87a8735e4bd0f232488797827cb
---

 libavformat/oggdec.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

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-");



More information about the ffmpeg-cvslog mailing list