diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-07-17 09:15:14 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-07-17 09:15:14 +0000 |
commit | 1a013246fb665a5032c2a1656cf357213f1d0414 (patch) | |
tree | 9bbab54c856e949c9d4d7fca3f6c2e11f4e1125d /libavcodec/msmpeg4.c | |
parent | fe072fb4ee7375d9dd4c90c54cff22b12a886e88 (diff) | |
download | ffmpeg-1a013246fb665a5032c2a1656cf357213f1d0414.tar.gz |
fixes fire.avi & subtitles.avi
Originally committed as revision 769 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/msmpeg4.c')
-rw-r--r-- | libavcodec/msmpeg4.c | 35 |
1 files changed, 32 insertions, 3 deletions
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; |