summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-07-17 09:15:14 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-07-17 09:15:14 +0000
commit1a013246fb665a5032c2a1656cf357213f1d0414 (patch)
tree9bbab54c856e949c9d4d7fca3f6c2e11f4e1125d
parentfe072fb4ee7375d9dd4c90c54cff22b12a886e88 (diff)
fixes fire.avi & subtitles.avi
Originally committed as revision 769 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h263.c4
-rw-r--r--libavcodec/msmpeg4.c35
2 files changed, 34 insertions, 5 deletions
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index d016f19725..8fe7d22e18 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -1654,14 +1654,14 @@ void init_vlc_rl(RLTable *rl)
int level, run;
if(len==0){ // illegal code
- run= 65;
+ run= 66;
level= MAX_LEVEL;
}else if(len<0){ //more bits needed
run= 0;
level= code;
}else{
if(code==rl->n){ //esc
- run= 65;
+ run= 66;
level= 0;
}else{
run= rl->table_run [code] + 1;
diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c
index 34dc3569d8..62a7d38c67 100644
--- a/libavcodec/msmpeg4.c
+++ b/libavcodec/msmpeg4.c
@@ -1625,7 +1625,7 @@ printf("%c", s->ac_pred ? 'A' : 'I');
return 0;
}
-
+//#define ERROR_DETAILS
static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
int n, int coded)
{
@@ -1792,6 +1792,12 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
#endif
i+= run + 1;
if(last) i+=192;
+#ifdef ERROR_DETAILS
+ if(run==66)
+ fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
+ else if((i>62 && i<192) || i>192+63)
+ fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
+#endif
} else {
/* second escape */
#if MIN_CACHE_BITS < 23
@@ -1804,6 +1810,12 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
LAST_SKIP_BITS(re, &s->gb, 1);
+#ifdef ERROR_DETAILS
+ if(run==66)
+ fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
+ else if((i>62 && i<192) || i>192+63)
+ fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
+#endif
}
} else {
/* first escape */
@@ -1818,17 +1830,34 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
LAST_SKIP_BITS(re, &s->gb, 1);
+#ifdef ERROR_DETAILS
+ if(run==66)
+ fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
+ else if((i>62 && i<192) || i>192+63)
+ fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
+#endif
}
} else {
i+= run;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
LAST_SKIP_BITS(re, &s->gb, 1);
+#ifdef ERROR_DETAILS
+ if(run==66)
+ fprintf(stderr, "illegal vlc code level=%d\n", level);
+ else if((i>62 && i<192) || i>192+63)
+ fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
+#endif
}
if (i > 62){
i-= 192;
if(i&(~63)){
- fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
- return -1;
+ if(i+192 == 64 && level/qmul==-1){
+ fprintf(stderr, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
+ break;
+ }else{
+ fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
+ return -1;
+ }
}
block[scan_table[i]] = level;