Module: libav
Branch: master
Commit: 2f63440c59bf8c4a2e90280e23e8cadb235a42e6

Author:    Dustin Brody <li...@parsoma.net>
Committer: Anton Khirnov <an...@khirnov.net>
Date:      Sat Aug  6 04:42:34 2011 +0000

lavf: add support for error_recognition, use it in avidec, and bump minor API 
version

Signed-off-by: Anton Khirnov <an...@khirnov.net>

---

 libavformat/avformat.h |    8 ++++++++
 libavformat/avidec.c   |    6 ++++--
 libavformat/options.c  |    3 +++
 libavformat/version.h  |    2 +-
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 2f68aba..957039f 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -854,6 +854,14 @@ typedef struct AVFormatContext {
      * decoding: number of frames used to probe fps
      */
     int fps_probe_size;
+
+    /**
+     * Error recognition; higher values will detect more errors but may
+     * misdetect some more or less valid parts as errors.
+     * - encoding: unused
+     * - decoding: Set by user.
+     */
+    int error_recognition;
 } AVFormatContext;
 
 typedef struct AVPacketList {
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 0ea093c..8c0ef13 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -667,8 +667,9 @@ static int avi_read_header(AVFormatContext *s, 
AVFormatParameters *ap)
             break;
         case MKTAG('i', 'n', 'd', 'x'):
             i= avio_tell(pb);
-            if(pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX)){
-                read_braindead_odml_indx(s, 0);
+            if(pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) &&
+               read_braindead_odml_indx(s, 0) < 0 && s->error_recognition >= 
FF_ER_EXPLODE){
+                goto fail;
             }
             avio_seek(pb, i+size, SEEK_SET);
             break;
@@ -706,6 +707,7 @@ static int avi_read_header(AVFormatContext *s, 
AVFormatParameters *ap)
             if(size > 1000000){
                 av_log(s, AV_LOG_ERROR, "Something went wrong during header 
parsing, "
                                         "I will ignore it and try to continue 
anyway.\n");
+                if (s->error_recognition >= FF_ER_EXPLODE) goto fail;
                 avi->movi_list = avio_tell(pb) - 4;
                 avi->movi_end  = avio_size(pb);
                 goto end_of_header;
diff --git a/libavformat/options.c b/libavformat/options.c
index 9611628..3ca8c83 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -87,6 +87,9 @@ static const AVOption options[]={
 {"fdebug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, 
{.dbl = DEFAULT }, 0, INT_MAX, E|D, "fdebug"},
 {"ts", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_FDEBUG_TS }, INT_MIN, INT_MAX, 
E|D, "fdebug"},
 {"max_delay", "maximum muxing or demuxing delay in microseconds", 
OFFSET(max_delay), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, 0, INT_MAX, E|D},
+{"fer", "set error detection aggressivity", OFFSET(error_recognition), 
FF_OPT_TYPE_INT, {.dbl = FF_ER_CAREFUL }, INT_MIN, INT_MAX, D, "fer"},
+{"careful", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_CAREFUL }, INT_MIN, 
INT_MAX, D, "fer"},
+{"explode", "abort decoding on error recognition", 0, FF_OPT_TYPE_CONST, {.dbl 
= FF_ER_EXPLODE }, INT_MIN, INT_MAX, D, "fer"},
 {"fpsprobesize", "number of frames used to probe fps", OFFSET(fps_probe_size), 
FF_OPT_TYPE_INT, {.dbl = -1}, -1, INT_MAX-1, D},
 {NULL},
 };
diff --git a/libavformat/version.h b/libavformat/version.h
index bb12b51..4473717 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -24,7 +24,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 53
-#define LIBAVFORMAT_VERSION_MINOR  3
+#define LIBAVFORMAT_VERSION_MINOR  4
 #define LIBAVFORMAT_VERSION_MICRO  0
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \

_______________________________________________
libav-commits mailing list
libav-commits@libav.org
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to