From patchwork Wed Apr 25 18:07:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Borsboom X-Patchwork-Id: 8645 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp987298jad; Wed, 25 Apr 2018 11:08:05 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+WMoHksyYV7WDbrux6OxjmbhOsO8rxock07BQPv1vLBMIiWzGvWdp5jgC+15pec0bAm/eZ X-Received: by 2002:adf:9e8c:: with SMTP id a12-v6mr25296145wrf.191.1524679685197; Wed, 25 Apr 2018 11:08:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524679685; cv=none; d=google.com; s=arc-20160816; b=N6X0FGukhgEsD5Uav0g9/XTxDqAAxrhHakdAqoEg3UVtVPOBT+FhAu1QtynGXhBDhn uzKFN7xc3JoWoLZbTHoLsEaZBkn6cductL903EL4u7ix2e4UVxhJeBClV0Qk2KpYu6s1 Ob9HEeWq2jGWTPDIrQelXJrl9qvKRWYRgV6WmgiJtYMVKHts+Jb1CjqeUMTlfX3q5Syv yPK6rykMSLLMVD8JlDV/EoO74mKiyuokVl8T+JAIDYKkpS5T5RzCMHo4rsWackwp386/ k+z4QtIctUawf4qQhFr2w5nGNIvRlc4kUogBN+KovaSLorvCXGz2vUupm3iDIcOBQZNV Mt3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:mime-version:user-agent:date :message-id:from:to:dkim-signature:delivered-to :arc-authentication-results; bh=ratYCdXnORmiF5Z4uz9h1XT5h/Coq37r0lPZDj4efAE=; b=ro02qYcigFdC+GunVS98xtryGtXO2hIJLZ0CHg3WDllQyBEHl/b/nEG+q9yIY247qO /BByjye1BlpByRMRimApiFnnzj+o2sLIDzk4Bv6kGVi4ZaVb3wlwmm05uZJOwQcQjHbo tdSbj0KhUUPEP6afdk35oUVd2W/UsOU+5QlKDk5nG0SyFN5qkhwPf/VYHukFGpjLAe2i q4yoVial6MjWerQMxQlz5eSvb1z4JqJGKBc5Xn6u1N0yEGss4FNLdqA0Z4MCmrkS+2EH 8GTd6Yl8DHkqRjPMG3jtj36o46sMcH1HFXcQxIdg9FT3QP58r+O125KEKES+ED9CDqx9 57Cw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@carpalis.nl header.s=default header.b=T0ZVlmNP; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r67si3408854wmf.162.2018.04.25.11.08.02; Wed, 25 Apr 2018 11:08:05 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@carpalis.nl header.s=default header.b=T0ZVlmNP; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D806068A262; Wed, 25 Apr 2018 21:07:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from kyoto.xs4all.nl (kyoto.xs4all.nl [83.161.153.34]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 15D38689FC8 for ; Wed, 25 Apr 2018 21:07:24 +0300 (EEST) Received: from [IPv6:2001:980:9507:0:8e70:5aff:fec6:83fc] ([IPv6:2001:980:9507:0:8e70:5aff:fec6:83fc]) (authenticated bits=0) by kyoto.xs4all.nl (8.14.7/8.14.7) with ESMTP id w3PI7rMN032092 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 25 Apr 2018 20:07:54 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=carpalis.nl; s=default; t=1524679674; bh=rEMla/FIk8RM+a5Yf6m6k/m1H7SboGWvHb4lURTY90k=; h=To:From:Subject:Date; b=T0ZVlmNPQtPW8XBbUgfPO7wI1GsWxwHmOVuFh0zAd3xTKXnPU0D69u+98vcnuOan6 iL3iuxdTeTchBecVFTYlVoDbV/7z8gZDhXrrAfaOOwXdseSqAzT5T0LAaFaeSL6UsS SOqMS0p8QcsEZYwoOfIIfCpKCnV7kILOlVMmCNVxmX0QJePltU/YMuw9aHd05ShjxD J7ytog5Iu24cs4DZFjF3HNUTFicY5koE6BG6YnsC3h5+m5AYTcEA6HQdyNJMNaZCPm AKUL3FRJAeG+jxBnvedav6C5+S0C7cTZJvKyWWh2VUGd9FO3qXiXa2kaBDjeiJqU5o pHOf42Vx56gcw== To: ffmpeg-devel@ffmpeg.org From: Jerome Borsboom Message-ID: Date: Wed, 25 Apr 2018 20:07:53 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 Content-Language: nl Subject: [FFmpeg-devel] [PATCH] avcodec/vc1: more corrections for AC inverse quantization scaling X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" HALFQP should only be added to the inverse quantizer when the block is coded with PQUANT. When PQUANT is equal to ALTPQUANT, the original test for the addition of HALFQP fails. A negative value for mquant indicates that the value was derived from VOPDQUANT. Fixes #4372 Signed-off-by: Jerome Borsboom --- libavcodec/vc1.c | 1 + libavcodec/vc1_block.c | 129 ++++++++++++++++++++++++++----------------------- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 20cc84eb8e..949fec6bee 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -991,6 +991,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->pquantizer = 1; break; } + v->dquantfrm = 0; if (v->postprocflag) v->postproc = get_bits(gb, 2); diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index af40fbd21d..0caa5ebb85 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -160,13 +160,13 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) int edges = 0; \ if (v->dqprofile == DQPROFILE_ALL_MBS) { \ if (v->dqbilevel) { \ - mquant = (get_bits1(gb)) ? v->altpq : v->pq; \ + mquant = (get_bits1(gb)) ? -v->altpq : v->pq; \ } else { \ mqdiff = get_bits(gb, 3); \ if (mqdiff != 7) \ - mquant = v->pq + mqdiff; \ + mquant = -v->pq - mqdiff; \ else \ - mquant = get_bits(gb, 5); \ + mquant = -get_bits(gb, 5); \ } \ } \ if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \ @@ -176,13 +176,13 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \ edges = 15; \ if ((edges&1) && !s->mb_x) \ - mquant = v->altpq; \ + mquant = -v->altpq; \ if ((edges&2) && s->first_slice_line) \ - mquant = v->altpq; \ + mquant = -v->altpq; \ if ((edges&4) && s->mb_x == (s->mb_width - 1)) \ - mquant = v->altpq; \ + mquant = -v->altpq; \ if ((edges&8) && s->mb_y == (s->mb_height - 1)) \ - mquant = v->altpq; \ + mquant = -v->altpq; \ if (!mquant || mquant > 31) { \ av_log(v->s.avctx, AV_LOG_ERROR, \ "Overriding invalid mquant %d\n", mquant); \ @@ -388,7 +388,7 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, int dqscale_index; /* scale predictors if needed */ - q1 = s->current_picture.qscale_table[mb_pos]; + q1 = FFABS(s->current_picture.qscale_table[mb_pos]); dqscale_index = s->y_dc_scale_table[q1] - 1; if (dqscale_index < 0) return 0; @@ -404,12 +404,12 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, a = dc_val[ - wrap]; if (c_avail && (n != 1 && n != 3)) { - q2 = s->current_picture.qscale_table[mb_pos - 1]; + q2 = FFABS(s->current_picture.qscale_table[mb_pos - 1]); if (q2 && q2 != q1) c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; } if (a_avail && (n != 2 && n != 3)) { - q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; + q2 = FFABS(s->current_picture.qscale_table[mb_pos - s->mb_stride]); if (q2 && q2 != q1) a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; } @@ -419,7 +419,7 @@ static inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, off--; if (n != 2) off -= s->mb_stride; - q2 = s->current_picture.qscale_table[off]; + q2 = FFABS(s->current_picture.qscale_table[off]); if (q2 && q2 != q1) b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18; } @@ -700,6 +700,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, int scale; int q1, q2 = 0; int mb_pos = s->mb_x + s->mb_y * s->mb_stride; + int quant = FFABS(mquant); /* Get DC differential */ if (n < 4) { @@ -712,7 +713,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, return -1; } if (dcdiff) { - const int m = (mquant == 1 || mquant == 2) ? 3 - mquant : 0; + const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; if (dcdiff == 119 /* ESC index value */) { dcdiff = get_bits(gb, 8 + m); } else { @@ -724,7 +725,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, } /* Prediction */ - dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); + dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); *dc_val = dcdiff; /* Store the quantized DC coeff, used for prediction */ @@ -738,7 +739,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, if (!a_avail && !c_avail) use_pred = 0; - scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0); + scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); ac_val = s->ac_val[0][0] + s->block_index[n] * 16; ac_val2 = ac_val; @@ -804,11 +805,12 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, ac_val += 8; } /* scale predictors if needed*/ + q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; + if (q1 < 1) + return AVERROR_INVALIDDATA; + if (q2) + q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; if (q2 && q1 != q2) { - q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; - if (q1 < 1) - return AVERROR_INVALIDDATA; - q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; for (k = 1; k < 8; k++) block[k << sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; } else { @@ -827,7 +829,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, if (block[k]) { block[k] *= scale; if (!v->pquantizer) - block[k] += (block[k] < 0) ? -mquant : mquant; + block[k] += (block[k] < 0) ? -quant : quant; } } else { // no AC coeffs @@ -846,18 +848,19 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, ac_val2 += 8; } memcpy(ac_val2, ac_val, 8 * 2); + q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; + if (q1 < 1) + return AVERROR_INVALIDDATA; + if (q2) + q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; if (q2 && q1 != q2) { - q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; - q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; - if (q1 < 1) - return AVERROR_INVALIDDATA; for (k = 1; k < 8; k++) ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; } for (k = 1; k < 8; k++) { block[k << sh] = ac_val2[k] * scale; if (!v->pquantizer && block[k << sh]) - block[k << sh] += (block[k << sh] < 0) ? -mquant : mquant; + block[k << sh] += (block[k << sh] < 0) ? -quant : quant; } } } @@ -890,15 +893,16 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, int use_pred = s->ac_pred; int scale; int q1, q2 = 0; + int quant = FFABS(mquant); s->bdsp.clear_block(block); /* XXX: Guard against dumb values of mquant */ - mquant = av_clip_uintp2(mquant, 5); + quant = av_clip_uintp2(quant, 5); /* Set DC scale - y and c use the same */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[quant]; + s->c_dc_scale = s->c_dc_scale_table[quant]; /* Get DC differential */ if (n < 4) { @@ -911,7 +915,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, return -1; } if (dcdiff) { - const int m = (mquant == 1 || mquant == 2) ? 3 - mquant : 0; + const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; if (dcdiff == 119 /* ESC index value */) { dcdiff = get_bits(gb, 8 + m); } else { @@ -923,7 +927,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, } /* Prediction */ - dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); + dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); *dc_val = dcdiff; /* Store the quantized DC coeff, used for prediction */ @@ -944,7 +948,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, ac_val = s->ac_val[0][0] + s->block_index[n] * 16; ac_val2 = ac_val; - scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0); + scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); if (dc_pred_dir) //left ac_val -= 16; @@ -988,12 +992,12 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, /* apply AC prediction if needed */ if (use_pred) { /* scale predictors if needed*/ + q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; + if (q1 < 1) + return AVERROR_INVALIDDATA; + if (q2) + q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; if (q2 && q1 != q2) { - q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; - q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; - - if (q1 < 1) - return AVERROR_INVALIDDATA; if (dc_pred_dir) { // left for (k = 1; k < 8; k++) block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; @@ -1022,7 +1026,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, if (block[k]) { block[k] *= scale; if (!v->pquantizer) - block[k] += (block[k] < 0) ? -mquant : mquant; + block[k] += (block[k] < 0) ? -quant : quant; } if (use_pred) i = 63; @@ -1033,11 +1037,12 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, if (dc_pred_dir) { // left if (use_pred) { memcpy(ac_val2, ac_val, 8 * 2); + q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; + if (q1 < 1) + return AVERROR_INVALIDDATA; + if (q2) + q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; if (q2 && q1 != q2) { - q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; - q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; - if (q1 < 1) - return AVERROR_INVALIDDATA; for (k = 1; k < 8; k++) ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; } @@ -1045,11 +1050,12 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, } else { // top if (use_pred) { memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); + q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1; + if (q1 < 1) + return AVERROR_INVALIDDATA; + if (q2) + q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1; if (q2 && q1 != q2) { - q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; - q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; - if (q1 < 1) - return AVERROR_INVALIDDATA; for (k = 1; k < 8; k++) ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; } @@ -1062,13 +1068,13 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, for (k = 1; k < 8; k++) { block[k << v->left_blk_sh] = ac_val2[k] * scale; if (!v->pquantizer && block[k << v->left_blk_sh]) - block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant; + block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -quant : quant; } } else { // top for (k = 1; k < 8; k++) { block[k << v->top_blk_sh] = ac_val2[k + 8] * scale; if (!v->pquantizer && block[k << v->top_blk_sh]) - block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant; + block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -quant : quant; } } i = 63; @@ -1093,6 +1099,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, int scale, off, idx, last, skip, value; int ttblk = ttmb & 7; int pat = 0; + int quant = FFABS(mquant); s->bdsp.clear_block(block); @@ -1113,7 +1120,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8; } - scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0); + scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq); // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) { @@ -1140,7 +1147,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, idx = v->zzi_8x8[i++]; block[idx] = value * scale; if (!v->pquantizer) - block[idx] += (block[idx] < 0) ? -mquant : mquant; + block[idx] += (block[idx] < 0) ? -quant : quant; } if (!skip_block) { if (i == 1) @@ -1168,7 +1175,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, idx = ff_vc1_adv_interlaced_4x4_zz[i++]; block[idx + off] = value * scale; if (!v->pquantizer) - block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; + block[idx + off] += (block[idx + off] < 0) ? -quant : quant; } if (!(subblkpat & (1 << (3 - j))) && !skip_block) { if (i == 1) @@ -1195,7 +1202,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off; block[idx] = value * scale; if (!v->pquantizer) - block[idx] += (block[idx] < 0) ? -mquant : mquant; + block[idx] += (block[idx] < 0) ? -quant : quant; } if (!(subblkpat & (1 << (1 - j))) && !skip_block) { if (i == 1) @@ -1222,7 +1229,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off; block[idx] = value * scale; if (!v->pquantizer) - block[idx] += (block[idx] < 0) ? -mquant : mquant; + block[idx] += (block[idx] < 0) ? -quant : quant; } if (!(subblkpat & (1 << (1 - j))) && !skip_block) { if (i == 1) @@ -1549,8 +1556,8 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; /* Set DC scale - y and c use the same (not sure if necessary here) */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; + s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; dst_idx = 0; for (i = 0; i < 6; i++) { v->a_avail = v->c_avail = 0; @@ -1711,8 +1718,8 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; /* Set DC scale - y and c use the same (not sure if necessary here) */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; + s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = idx_mbmode & 1; if (mb_has_coeffs) @@ -1989,8 +1996,8 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; /* Set DC scale - y and c use the same (not sure if necessary here) */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; + s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = idx_mbmode & 1; if (mb_has_coeffs) @@ -2218,8 +2225,8 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; /* Set DC scale - y and c use the same (not sure if necessary here) */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; + s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; dst_idx = 0; for (i = 0; i < 6; i++) { v->a_avail = v->c_avail = 0; @@ -2687,8 +2694,8 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) s->current_picture.qscale_table[mb_pos] = mquant; /* Set DC scale - y and c use the same */ - s->y_dc_scale = s->y_dc_scale_table[mquant]; - s->c_dc_scale = s->c_dc_scale_table[mquant]; + s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)]; + s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)]; for (k = 0; k < 6; k++) { v->mb_type[0][s->block_index[k]] = 1;