summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-04-25 19:03:35 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-04-25 19:03:35 +0000
commit3c0da30c01194ad123b6fd998fc4f4184ebd25cb (patch)
treeb1d4704179d97148adfcc5508d750c28bcda7c48 /libavcodec
parent49f3806dd8d9f910af0941cad7f86f05985b667b (diff)
fix decoding with quant matrixes which contain elements <16
Originally committed as revision 3069 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/h263.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index 28707b2d59..2e9cadd88e 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -4722,6 +4722,8 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
if (cache&0x80000000) {
if (cache&0x40000000) {
+ int ulevel;
+
/* third escape */
SKIP_CACHE(re, &s->gb, 2);
last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
@@ -4747,10 +4749,16 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
SKIP_COUNTER(re, &s->gb, 1+12+1);
}
- if(level*s->qscale>1024 || level*s->qscale<-1024){
+ if(s->mpeg_quant){
+ if(intra) ulevel= level*s->qscale*s->intra_matrix[scan_table[1]];
+ else ulevel= level*s->qscale*s->inter_matrix[scan_table[0]];
+ }else
+ ulevel= level*s->qscale*16;
+ if(ulevel>1030*16 || ulevel<-1030*16){
av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
return -1;
}
+
#if 0
if(s->error_resilience >= FF_ER_COMPLIANT){
const int abs_level= ABS(level);