fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped...
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 4 Dec 2002 11:47:24 +0000 (11:47 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 4 Dec 2002 11:47:24 +0000 (11:47 +0000)
Originally committed as revision 1304 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/h263.c

index e2972696a8068fe019644c8a8b55f98fafd45cac..e6c14afa0eeb88ab1a4c3e90b0bdf923ae72f477 100644 (file)
@@ -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.
index e6578a0c5887e402a20c72333c8cc3d48d5ee93e..caa1bf4552d4fa9489727ae95a074423b438963f 100644 (file)
@@ -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;
+                                }
                             }
                         }
                     }