---
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..cad0ac1 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -752,6 +752,14 @@ typedef struct AVFormatContext {
#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom
AVIOContext, don't avio_close() it.
#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted
+ /**
+ * 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;
+
#if FF_API_LOOP_INPUT
/**
* @deprecated, use the 'loop' img2 demuxer private option.
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, \
--
1.7.2.5
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel