[FFmpeg-cvslog] lavf/icodec: Improve autodetection.

Carl Eugen Hoyos git at videolan.org
Mon Jan 18 00:37:50 CET 2016


ffmpeg | branch: master | Carl Eugen Hoyos <cehoyos at ag.or.at> | Mon Jan 18 00:36:44 2016 +0100| [9bc281beae6dbf5d5f03cae8865b377f3a61f4ff] | committer: Carl Eugen Hoyos

lavf/icodec: Improve autodetection.

Avoids misdetection of MPEG (B-)frames.

Reviewed-by: Michael Bradshaw

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

 libavformat/icodec.c |   28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/libavformat/icodec.c b/libavformat/icodec.c
index 22e2099..6ddb901 100644
--- a/libavformat/icodec.c
+++ b/libavformat/icodec.c
@@ -27,6 +27,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavcodec/bytestream.h"
 #include "libavcodec/bmp.h"
+#include "libavcodec/png.h"
 #include "avformat.h"
 #include "internal.h"
 
@@ -44,9 +45,30 @@ typedef struct {
 
 static int probe(AVProbeData *p)
 {
-    if (AV_RL16(p->buf) == 0 && AV_RL16(p->buf + 2) == 1 && AV_RL16(p->buf + 4))
-        return AVPROBE_SCORE_MAX / 4;
-    return 0;
+    unsigned i, frames = AV_RL16(p->buf + 4);
+
+    if (AV_RL16(p->buf) || AV_RL16(p->buf + 2) != 1 || !frames)
+        return 0;
+    for (i = 0; i < frames; i++) {
+        unsigned offset;
+        if (AV_RL16(p->buf + 10 + i * 16) & ~1)
+            return FFMIN(i, AVPROBE_SCORE_MAX / 4);
+        if (p->buf[13 + i * 16])
+            return FFMIN(i, AVPROBE_SCORE_MAX / 4);
+        if (AV_RL32(p->buf + 14 + i * 16) < 40)
+            return FFMIN(i, AVPROBE_SCORE_MAX / 4);
+        offset = AV_RL32(p->buf + 18 + i * 16);
+        if (offset < 22)
+            return FFMIN(i, AVPROBE_SCORE_MAX / 4);
+        if (offset + 8 > p->buf_size)
+            return AVPROBE_SCORE_MAX / 4 + FFMIN(i, 1);
+        if (p->buf[offset] != 40 && AV_RB64(p->buf + offset) != PNGSIG)
+            return FFMIN(i, AVPROBE_SCORE_MAX / 4);
+        if (i * 16 + 6 > p->buf_size)
+            return AVPROBE_SCORE_MAX / 4 + FFMIN(i, 1);
+    }
+
+    return AVPROBE_SCORE_MAX / 2 + 1;
 }
 
 static int read_header(AVFormatContext *s)



More information about the ffmpeg-cvslog mailing list