diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e2972696a8068fe019644c8a8b55f98fafd45cac..e6c14afa0eeb88ab1a4c3e90b0bdf923ae72f477 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -548,12 +548,16 @@ typedef struct AVCodecContext { float b_quant_offset; /** - * error resilience {-1,0,1} higher values will detect more errors but may missdetect + * error resilience higher values will detect more errors but may missdetect * some more or less valid parts as errors * encoding: unused * decoding: set by user */ int error_resilience; +#define FF_ER_CAREFULL 1 +#define FF_ER_COMPLIANT 2 +#define FF_ER_AGGRESSIVE 3 +#define FF_ER_VERY_AGGRESSIVE 4 /** * called at the beginning of each frame to get a buffer for it. diff --git a/libavcodec/h263.c b/libavcodec/h263.c index e6578a0c5887e402a20c72333c8cc3d48d5ee93e..caa1bf4552d4fa9489727ae95a074423b438963f 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -3624,19 +3624,21 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, #if 1 { const int abs_level= ABS(level); - if(abs_level<=MAX_LEVEL && run<=MAX_RUN && ((s->workaround_bugs&FF_BUG_AC_VLC)==0)){ + if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ const int run1= run - rl->max_run[last][abs_level] - 1; if(abs_level <= rl->max_level[last][run]){ fprintf(stderr, "illegal 3. esc, vlc encoding possible\n"); return -1; } - if(abs_level <= rl->max_level[last][run]*2){ - fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); - return -1; - } - if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ - fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); - return -1; + if(s->error_resilience > FF_ER_COMPLIANT){ + if(abs_level <= rl->max_level[last][run]*2){ + fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); + return -1; + } + if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ + fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); + return -1; + } } } }