11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann#include <math.h>
131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
141b362b15af34006e6a11974088a46d42b903418eJohann
151b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h"
167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp8/encoder/quantize.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/quant_common.h"
181b362b15af34006e6a11974088a46d42b903418eJohann
191b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d)
201b362b15af34006e6a11974088a46d42b903418eJohann{
211b362b15af34006e6a11974088a46d42b903418eJohann    int i, rc, eob;
221b362b15af34006e6a11974088a46d42b903418eJohann    int x, y, z, sz;
231b362b15af34006e6a11974088a46d42b903418eJohann    short *coeff_ptr   = b->coeff;
241b362b15af34006e6a11974088a46d42b903418eJohann    short *round_ptr   = b->round;
251b362b15af34006e6a11974088a46d42b903418eJohann    short *quant_ptr   = b->quant_fast;
261b362b15af34006e6a11974088a46d42b903418eJohann    short *qcoeff_ptr  = d->qcoeff;
271b362b15af34006e6a11974088a46d42b903418eJohann    short *dqcoeff_ptr = d->dqcoeff;
281b362b15af34006e6a11974088a46d42b903418eJohann    short *dequant_ptr = d->dequant;
291b362b15af34006e6a11974088a46d42b903418eJohann
301b362b15af34006e6a11974088a46d42b903418eJohann    eob = -1;
311b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 16; i++)
321b362b15af34006e6a11974088a46d42b903418eJohann    {
331b362b15af34006e6a11974088a46d42b903418eJohann        rc   = vp8_default_zig_zag1d[i];
341b362b15af34006e6a11974088a46d42b903418eJohann        z    = coeff_ptr[rc];
351b362b15af34006e6a11974088a46d42b903418eJohann
361b362b15af34006e6a11974088a46d42b903418eJohann        sz = (z >> 31);                              /* sign of z */
371b362b15af34006e6a11974088a46d42b903418eJohann        x  = (z ^ sz) - sz;                          /* x = abs(z) */
381b362b15af34006e6a11974088a46d42b903418eJohann
391b362b15af34006e6a11974088a46d42b903418eJohann        y  = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */
401b362b15af34006e6a11974088a46d42b903418eJohann        x  = (y ^ sz) - sz;                          /* get the sign back */
411b362b15af34006e6a11974088a46d42b903418eJohann        qcoeff_ptr[rc] = x;                          /* write to destination */
421b362b15af34006e6a11974088a46d42b903418eJohann        dqcoeff_ptr[rc] = x * dequant_ptr[rc];       /* dequantized value */
431b362b15af34006e6a11974088a46d42b903418eJohann
441b362b15af34006e6a11974088a46d42b903418eJohann        if (y)
451b362b15af34006e6a11974088a46d42b903418eJohann        {
461b362b15af34006e6a11974088a46d42b903418eJohann            eob = i;                                 /* last nonzero coeffs */
471b362b15af34006e6a11974088a46d42b903418eJohann        }
481b362b15af34006e6a11974088a46d42b903418eJohann    }
491b362b15af34006e6a11974088a46d42b903418eJohann    *d->eob = (char)(eob + 1);
501b362b15af34006e6a11974088a46d42b903418eJohann}
511b362b15af34006e6a11974088a46d42b903418eJohann
521b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d)
531b362b15af34006e6a11974088a46d42b903418eJohann{
541b362b15af34006e6a11974088a46d42b903418eJohann    int i, rc, eob;
551b362b15af34006e6a11974088a46d42b903418eJohann    int zbin;
561b362b15af34006e6a11974088a46d42b903418eJohann    int x, y, z, sz;
571b362b15af34006e6a11974088a46d42b903418eJohann    short *zbin_boost_ptr  = b->zrun_zbin_boost;
581b362b15af34006e6a11974088a46d42b903418eJohann    short *coeff_ptr       = b->coeff;
591b362b15af34006e6a11974088a46d42b903418eJohann    short *zbin_ptr        = b->zbin;
601b362b15af34006e6a11974088a46d42b903418eJohann    short *round_ptr       = b->round;
611b362b15af34006e6a11974088a46d42b903418eJohann    short *quant_ptr       = b->quant;
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    short *quant_shift_ptr = b->quant_shift;
631b362b15af34006e6a11974088a46d42b903418eJohann    short *qcoeff_ptr      = d->qcoeff;
641b362b15af34006e6a11974088a46d42b903418eJohann    short *dqcoeff_ptr     = d->dqcoeff;
651b362b15af34006e6a11974088a46d42b903418eJohann    short *dequant_ptr     = d->dequant;
661b362b15af34006e6a11974088a46d42b903418eJohann    short zbin_oq_value    = b->zbin_extra;
671b362b15af34006e6a11974088a46d42b903418eJohann
687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(qcoeff_ptr, 0, 32);
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(dqcoeff_ptr, 0, 32);
701b362b15af34006e6a11974088a46d42b903418eJohann
711b362b15af34006e6a11974088a46d42b903418eJohann    eob = -1;
721b362b15af34006e6a11974088a46d42b903418eJohann
731b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 16; i++)
741b362b15af34006e6a11974088a46d42b903418eJohann    {
751b362b15af34006e6a11974088a46d42b903418eJohann        rc   = vp8_default_zig_zag1d[i];
761b362b15af34006e6a11974088a46d42b903418eJohann        z    = coeff_ptr[rc];
771b362b15af34006e6a11974088a46d42b903418eJohann
781b362b15af34006e6a11974088a46d42b903418eJohann        zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
791b362b15af34006e6a11974088a46d42b903418eJohann
801b362b15af34006e6a11974088a46d42b903418eJohann        zbin_boost_ptr ++;
811b362b15af34006e6a11974088a46d42b903418eJohann        sz = (z >> 31);                              /* sign of z */
821b362b15af34006e6a11974088a46d42b903418eJohann        x  = (z ^ sz) - sz;                          /* x = abs(z) */
831b362b15af34006e6a11974088a46d42b903418eJohann
841b362b15af34006e6a11974088a46d42b903418eJohann        if (x >= zbin)
851b362b15af34006e6a11974088a46d42b903418eJohann        {
861b362b15af34006e6a11974088a46d42b903418eJohann            x += round_ptr[rc];
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            y  = ((((x * quant_ptr[rc]) >> 16) + x)
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 * quant_shift_ptr[rc]) >> 16;       /* quantize (x) */
891b362b15af34006e6a11974088a46d42b903418eJohann            x  = (y ^ sz) - sz;                      /* get the sign back */
901b362b15af34006e6a11974088a46d42b903418eJohann            qcoeff_ptr[rc]  = x;                     /* write to destination */
911b362b15af34006e6a11974088a46d42b903418eJohann            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */
921b362b15af34006e6a11974088a46d42b903418eJohann
931b362b15af34006e6a11974088a46d42b903418eJohann            if (y)
941b362b15af34006e6a11974088a46d42b903418eJohann            {
951b362b15af34006e6a11974088a46d42b903418eJohann                eob = i;                             /* last nonzero coeffs */
961b362b15af34006e6a11974088a46d42b903418eJohann                zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */
971b362b15af34006e6a11974088a46d42b903418eJohann            }
981b362b15af34006e6a11974088a46d42b903418eJohann        }
991b362b15af34006e6a11974088a46d42b903418eJohann    }
1001b362b15af34006e6a11974088a46d42b903418eJohann
1011b362b15af34006e6a11974088a46d42b903418eJohann    *d->eob = (char)(eob + 1);
1021b362b15af34006e6a11974088a46d42b903418eJohann}
1031b362b15af34006e6a11974088a46d42b903418eJohann
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vp8_quantize_mby(MACROBLOCK *x)
1051b362b15af34006e6a11974088a46d42b903418eJohann{
1061b362b15af34006e6a11974088a46d42b903418eJohann    int i;
1071b362b15af34006e6a11974088a46d42b903418eJohann    int has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
1081b362b15af34006e6a11974088a46d42b903418eJohann        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
1091b362b15af34006e6a11974088a46d42b903418eJohann
1101b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 16; i++)
1111b362b15af34006e6a11974088a46d42b903418eJohann        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
1121b362b15af34006e6a11974088a46d42b903418eJohann
1131b362b15af34006e6a11974088a46d42b903418eJohann    if(has_2nd_order)
1141b362b15af34006e6a11974088a46d42b903418eJohann        x->quantize_b(&x->block[24], &x->e_mbd.block[24]);
1151b362b15af34006e6a11974088a46d42b903418eJohann}
1161b362b15af34006e6a11974088a46d42b903418eJohann
1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vp8_quantize_mb(MACROBLOCK *x)
1181b362b15af34006e6a11974088a46d42b903418eJohann{
1191b362b15af34006e6a11974088a46d42b903418eJohann    int i;
1201b362b15af34006e6a11974088a46d42b903418eJohann    int has_2nd_order=(x->e_mbd.mode_info_context->mbmi.mode != B_PRED
1211b362b15af34006e6a11974088a46d42b903418eJohann        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
1221b362b15af34006e6a11974088a46d42b903418eJohann
1231b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 24+has_2nd_order; i++)
1241b362b15af34006e6a11974088a46d42b903418eJohann        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
1251b362b15af34006e6a11974088a46d42b903418eJohann}
1261b362b15af34006e6a11974088a46d42b903418eJohann
1271b362b15af34006e6a11974088a46d42b903418eJohann
1287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vp8_quantize_mbuv(MACROBLOCK *x)
1291b362b15af34006e6a11974088a46d42b903418eJohann{
1301b362b15af34006e6a11974088a46d42b903418eJohann    int i;
1311b362b15af34006e6a11974088a46d42b903418eJohann
1321b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 16; i < 24; i++)
1331b362b15af34006e6a11974088a46d42b903418eJohann        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
1341b362b15af34006e6a11974088a46d42b903418eJohann}
1351b362b15af34006e6a11974088a46d42b903418eJohann
1361b362b15af34006e6a11974088a46d42b903418eJohannstatic const int qrounding_factors[129] =
1371b362b15af34006e6a11974088a46d42b903418eJohann{
1381b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1391b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1401b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1411b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1421b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1431b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1441b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1451b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1461b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1471b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1481b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1491b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1501b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1511b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1521b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1531b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1541b362b15af34006e6a11974088a46d42b903418eJohann    48
1551b362b15af34006e6a11974088a46d42b903418eJohann};
1561b362b15af34006e6a11974088a46d42b903418eJohann
1571b362b15af34006e6a11974088a46d42b903418eJohann
1581b362b15af34006e6a11974088a46d42b903418eJohannstatic const int qzbin_factors[129] =
1591b362b15af34006e6a11974088a46d42b903418eJohann{
1601b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1611b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1621b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1631b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1641b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1651b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
1661b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1671b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1681b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1691b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1701b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1711b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1721b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1731b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1741b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1751b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
1761b362b15af34006e6a11974088a46d42b903418eJohann    80
1771b362b15af34006e6a11974088a46d42b903418eJohann};
1781b362b15af34006e6a11974088a46d42b903418eJohann
1791b362b15af34006e6a11974088a46d42b903418eJohann
1801b362b15af34006e6a11974088a46d42b903418eJohannstatic const int qrounding_factors_y2[129] =
1811b362b15af34006e6a11974088a46d42b903418eJohann{
1821b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1831b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1841b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1851b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1861b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1871b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1881b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1891b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1901b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1911b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1921b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1931b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1941b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1951b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1961b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1971b362b15af34006e6a11974088a46d42b903418eJohann    48, 48, 48, 48, 48, 48, 48, 48,
1981b362b15af34006e6a11974088a46d42b903418eJohann    48
1991b362b15af34006e6a11974088a46d42b903418eJohann};
2001b362b15af34006e6a11974088a46d42b903418eJohann
2011b362b15af34006e6a11974088a46d42b903418eJohann
2021b362b15af34006e6a11974088a46d42b903418eJohannstatic const int qzbin_factors_y2[129] =
2031b362b15af34006e6a11974088a46d42b903418eJohann{
2041b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2051b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2061b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2071b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2081b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2091b362b15af34006e6a11974088a46d42b903418eJohann    84, 84, 84, 84, 84, 84, 84, 84,
2101b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2111b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2121b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2131b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2141b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2151b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2161b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2171b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2181b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2191b362b15af34006e6a11974088a46d42b903418eJohann    80, 80, 80, 80, 80, 80, 80, 80,
2201b362b15af34006e6a11974088a46d42b903418eJohann    80
2211b362b15af34006e6a11974088a46d42b903418eJohann};
2221b362b15af34006e6a11974088a46d42b903418eJohann
2231b362b15af34006e6a11974088a46d42b903418eJohann
2241b362b15af34006e6a11974088a46d42b903418eJohannstatic void invert_quant(int improved_quant, short *quant,
225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                         short *shift, short d)
2261b362b15af34006e6a11974088a46d42b903418eJohann{
2271b362b15af34006e6a11974088a46d42b903418eJohann    if(improved_quant)
2281b362b15af34006e6a11974088a46d42b903418eJohann    {
2291b362b15af34006e6a11974088a46d42b903418eJohann        unsigned t;
2301b362b15af34006e6a11974088a46d42b903418eJohann        int l;
2311b362b15af34006e6a11974088a46d42b903418eJohann        t = d;
2321b362b15af34006e6a11974088a46d42b903418eJohann        for(l = 0; t > 1; l++)
2331b362b15af34006e6a11974088a46d42b903418eJohann            t>>=1;
2341b362b15af34006e6a11974088a46d42b903418eJohann        t = 1 + (1<<(16+l))/d;
2351b362b15af34006e6a11974088a46d42b903418eJohann        *quant = (short)(t - (1<<16));
2361b362b15af34006e6a11974088a46d42b903418eJohann        *shift = l;
237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        /* use multiplication and constant shift by 16 */
238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        *shift = 1 << (16 - *shift);
2391b362b15af34006e6a11974088a46d42b903418eJohann    }
2401b362b15af34006e6a11974088a46d42b903418eJohann    else
2411b362b15af34006e6a11974088a46d42b903418eJohann    {
2421b362b15af34006e6a11974088a46d42b903418eJohann        *quant = (1 << 16) / d;
2431b362b15af34006e6a11974088a46d42b903418eJohann        *shift = 0;
244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        /* use multiplication and constant shift by 16 */
245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        *shift = 1 << (16 - *shift);
2461b362b15af34006e6a11974088a46d42b903418eJohann    }
2471b362b15af34006e6a11974088a46d42b903418eJohann}
2481b362b15af34006e6a11974088a46d42b903418eJohann
2491b362b15af34006e6a11974088a46d42b903418eJohann
2501b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8cx_init_quantizer(VP8_COMP *cpi)
2511b362b15af34006e6a11974088a46d42b903418eJohann{
2521b362b15af34006e6a11974088a46d42b903418eJohann    int i;
2531b362b15af34006e6a11974088a46d42b903418eJohann    int quant_val;
2541b362b15af34006e6a11974088a46d42b903418eJohann    int Q;
2551b362b15af34006e6a11974088a46d42b903418eJohann
2561b362b15af34006e6a11974088a46d42b903418eJohann    int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44,
2571b362b15af34006e6a11974088a46d42b903418eJohann                          44, 44};
2581b362b15af34006e6a11974088a46d42b903418eJohann
2591b362b15af34006e6a11974088a46d42b903418eJohann    for (Q = 0; Q < QINDEX_RANGE; Q++)
2601b362b15af34006e6a11974088a46d42b903418eJohann    {
2611b362b15af34006e6a11974088a46d42b903418eJohann        /* dc values */
2621b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
2631b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val;
2641b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0,
2651b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->Y1quant_shift[Q] + 0, quant_val);
2661b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
2671b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
2681b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.Y1dequant[Q][0] = quant_val;
2691b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
2701b362b15af34006e6a11974088a46d42b903418eJohann
2711b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
2721b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val;
2731b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0,
2741b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->Y2quant_shift[Q] + 0, quant_val);
2751b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
2761b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
2771b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.Y2dequant[Q][0] = quant_val;
2781b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
2791b362b15af34006e6a11974088a46d42b903418eJohann
2801b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
2811b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val;
2821b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0,
2831b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->UVquant_shift[Q] + 0, quant_val);
2841b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
2851b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
2861b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.UVdequant[Q][0] = quant_val;
2871b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
2881b362b15af34006e6a11974088a46d42b903418eJohann
2891b362b15af34006e6a11974088a46d42b903418eJohann        /* all the ac values = ; */
2901b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_ac_yquant(Q);
2911b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1quant_fast[Q][1] = (1 << 16) / quant_val;
2921b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 1,
2931b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->Y1quant_shift[Q] + 1, quant_val);
2941b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1zbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
2951b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y1round[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
2961b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.Y1dequant[Q][1] = quant_val;
2971b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_y1[Q][1] = (quant_val * zbin_boost[1]) >> 7;
2981b362b15af34006e6a11974088a46d42b903418eJohann
2991b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
3001b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2quant_fast[Q][1] = (1 << 16) / quant_val;
3011b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 1,
3021b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->Y2quant_shift[Q] + 1, quant_val);
3031b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2zbin[Q][1] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
3041b362b15af34006e6a11974088a46d42b903418eJohann        cpi->Y2round[Q][1] = (qrounding_factors_y2[Q] * quant_val) >> 7;
3051b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.Y2dequant[Q][1] = quant_val;
3061b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_y2[Q][1] = (quant_val * zbin_boost[1]) >> 7;
3071b362b15af34006e6a11974088a46d42b903418eJohann
3081b362b15af34006e6a11974088a46d42b903418eJohann        quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
3091b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVquant_fast[Q][1] = (1 << 16) / quant_val;
3101b362b15af34006e6a11974088a46d42b903418eJohann        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 1,
3111b362b15af34006e6a11974088a46d42b903418eJohann                     cpi->UVquant_shift[Q] + 1, quant_val);
3121b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVzbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
3131b362b15af34006e6a11974088a46d42b903418eJohann        cpi->UVround[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
3141b362b15af34006e6a11974088a46d42b903418eJohann        cpi->common.UVdequant[Q][1] = quant_val;
3151b362b15af34006e6a11974088a46d42b903418eJohann        cpi->zrun_zbin_boost_uv[Q][1] = (quant_val * zbin_boost[1]) >> 7;
3161b362b15af34006e6a11974088a46d42b903418eJohann
3171b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 2; i < 16; i++)
3181b362b15af34006e6a11974088a46d42b903418eJohann        {
3191b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y1quant_fast[Q][i] = cpi->Y1quant_fast[Q][1];
3201b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y1quant[Q][i] = cpi->Y1quant[Q][1];
3211b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y1quant_shift[Q][i] = cpi->Y1quant_shift[Q][1];
3221b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y1zbin[Q][i] = cpi->Y1zbin[Q][1];
3231b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y1round[Q][i] = cpi->Y1round[Q][1];
3241b362b15af34006e6a11974088a46d42b903418eJohann            cpi->zrun_zbin_boost_y1[Q][i] = (cpi->common.Y1dequant[Q][1] *
3251b362b15af34006e6a11974088a46d42b903418eJohann                                             zbin_boost[i]) >> 7;
3261b362b15af34006e6a11974088a46d42b903418eJohann
3271b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y2quant_fast[Q][i] = cpi->Y2quant_fast[Q][1];
3281b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y2quant[Q][i] = cpi->Y2quant[Q][1];
3291b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y2quant_shift[Q][i] = cpi->Y2quant_shift[Q][1];
3301b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y2zbin[Q][i] = cpi->Y2zbin[Q][1];
3311b362b15af34006e6a11974088a46d42b903418eJohann            cpi->Y2round[Q][i] = cpi->Y2round[Q][1];
3321b362b15af34006e6a11974088a46d42b903418eJohann            cpi->zrun_zbin_boost_y2[Q][i] = (cpi->common.Y2dequant[Q][1] *
3331b362b15af34006e6a11974088a46d42b903418eJohann                                             zbin_boost[i]) >> 7;
3341b362b15af34006e6a11974088a46d42b903418eJohann
3351b362b15af34006e6a11974088a46d42b903418eJohann            cpi->UVquant_fast[Q][i] = cpi->UVquant_fast[Q][1];
3361b362b15af34006e6a11974088a46d42b903418eJohann            cpi->UVquant[Q][i] = cpi->UVquant[Q][1];
3371b362b15af34006e6a11974088a46d42b903418eJohann            cpi->UVquant_shift[Q][i] = cpi->UVquant_shift[Q][1];
3381b362b15af34006e6a11974088a46d42b903418eJohann            cpi->UVzbin[Q][i] = cpi->UVzbin[Q][1];
3391b362b15af34006e6a11974088a46d42b903418eJohann            cpi->UVround[Q][i] = cpi->UVround[Q][1];
3401b362b15af34006e6a11974088a46d42b903418eJohann            cpi->zrun_zbin_boost_uv[Q][i] = (cpi->common.UVdequant[Q][1] *
3411b362b15af34006e6a11974088a46d42b903418eJohann                                             zbin_boost[i]) >> 7;
3421b362b15af34006e6a11974088a46d42b903418eJohann        }
3431b362b15af34006e6a11974088a46d42b903418eJohann    }
3441b362b15af34006e6a11974088a46d42b903418eJohann}
3451b362b15af34006e6a11974088a46d42b903418eJohann
3461b362b15af34006e6a11974088a46d42b903418eJohann#define ZBIN_EXTRA_Y \
3471b362b15af34006e6a11974088a46d42b903418eJohann    (( cpi->common.Y1dequant[QIndex][1] *  \
348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ( x->zbin_over_quant +  \
349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      x->zbin_mode_boost +  \
3501b362b15af34006e6a11974088a46d42b903418eJohann      x->act_zbin_adj ) ) >> 7)
3511b362b15af34006e6a11974088a46d42b903418eJohann
3521b362b15af34006e6a11974088a46d42b903418eJohann#define ZBIN_EXTRA_UV \
3531b362b15af34006e6a11974088a46d42b903418eJohann    (( cpi->common.UVdequant[QIndex][1] *  \
354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ( x->zbin_over_quant +  \
355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      x->zbin_mode_boost +  \
3561b362b15af34006e6a11974088a46d42b903418eJohann      x->act_zbin_adj ) ) >> 7)
3571b362b15af34006e6a11974088a46d42b903418eJohann
3581b362b15af34006e6a11974088a46d42b903418eJohann#define ZBIN_EXTRA_Y2 \
3591b362b15af34006e6a11974088a46d42b903418eJohann    (( cpi->common.Y2dequant[QIndex][1] *  \
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ( (x->zbin_over_quant / 2) +  \
361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang       x->zbin_mode_boost +  \
3621b362b15af34006e6a11974088a46d42b903418eJohann       x->act_zbin_adj ) ) >> 7)
3631b362b15af34006e6a11974088a46d42b903418eJohann
3641b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x, int ok_to_skip)
3651b362b15af34006e6a11974088a46d42b903418eJohann{
3661b362b15af34006e6a11974088a46d42b903418eJohann    int i;
3671b362b15af34006e6a11974088a46d42b903418eJohann    int QIndex;
3681b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
3691b362b15af34006e6a11974088a46d42b903418eJohann    int zbin_extra;
3701b362b15af34006e6a11974088a46d42b903418eJohann
3711b362b15af34006e6a11974088a46d42b903418eJohann    /* Select the baseline MB Q index. */
3721b362b15af34006e6a11974088a46d42b903418eJohann    if (xd->segmentation_enabled)
3731b362b15af34006e6a11974088a46d42b903418eJohann    {
3741b362b15af34006e6a11974088a46d42b903418eJohann        /* Abs Value */
3751b362b15af34006e6a11974088a46d42b903418eJohann        if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
3761b362b15af34006e6a11974088a46d42b903418eJohann            QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
3771b362b15af34006e6a11974088a46d42b903418eJohann        /* Delta Value */
3781b362b15af34006e6a11974088a46d42b903418eJohann        else
3791b362b15af34006e6a11974088a46d42b903418eJohann        {
3801b362b15af34006e6a11974088a46d42b903418eJohann            QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
3811b362b15af34006e6a11974088a46d42b903418eJohann            /* Clamp to valid range */
3821b362b15af34006e6a11974088a46d42b903418eJohann            QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;
3831b362b15af34006e6a11974088a46d42b903418eJohann        }
3841b362b15af34006e6a11974088a46d42b903418eJohann    }
3851b362b15af34006e6a11974088a46d42b903418eJohann    else
3861b362b15af34006e6a11974088a46d42b903418eJohann        QIndex = cpi->common.base_qindex;
3871b362b15af34006e6a11974088a46d42b903418eJohann
3881b362b15af34006e6a11974088a46d42b903418eJohann    /* This initialization should be called at least once. Use ok_to_skip to
3891b362b15af34006e6a11974088a46d42b903418eJohann     * decide if it is ok to skip.
3901b362b15af34006e6a11974088a46d42b903418eJohann     * Before encoding a frame, this function is always called with ok_to_skip
3911b362b15af34006e6a11974088a46d42b903418eJohann     * =0, which means no skiping of calculations. The "last" values are
3921b362b15af34006e6a11974088a46d42b903418eJohann     * initialized at that time.
3931b362b15af34006e6a11974088a46d42b903418eJohann     */
3941b362b15af34006e6a11974088a46d42b903418eJohann    if (!ok_to_skip || QIndex != x->q_index)
3951b362b15af34006e6a11974088a46d42b903418eJohann    {
3961b362b15af34006e6a11974088a46d42b903418eJohann
3971b362b15af34006e6a11974088a46d42b903418eJohann        xd->dequant_y1_dc[0] = 1;
3981b362b15af34006e6a11974088a46d42b903418eJohann        xd->dequant_y1[0] = cpi->common.Y1dequant[QIndex][0];
3991b362b15af34006e6a11974088a46d42b903418eJohann        xd->dequant_y2[0] = cpi->common.Y2dequant[QIndex][0];
4001b362b15af34006e6a11974088a46d42b903418eJohann        xd->dequant_uv[0] = cpi->common.UVdequant[QIndex][0];
4011b362b15af34006e6a11974088a46d42b903418eJohann
4021b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 1; i < 16; i++)
4031b362b15af34006e6a11974088a46d42b903418eJohann        {
4041b362b15af34006e6a11974088a46d42b903418eJohann            xd->dequant_y1_dc[i] =
4051b362b15af34006e6a11974088a46d42b903418eJohann            xd->dequant_y1[i] = cpi->common.Y1dequant[QIndex][1];
4061b362b15af34006e6a11974088a46d42b903418eJohann            xd->dequant_y2[i] = cpi->common.Y2dequant[QIndex][1];
4071b362b15af34006e6a11974088a46d42b903418eJohann            xd->dequant_uv[i] = cpi->common.UVdequant[QIndex][1];
4081b362b15af34006e6a11974088a46d42b903418eJohann        }
4091b362b15af34006e6a11974088a46d42b903418eJohann#if 1
4101b362b15af34006e6a11974088a46d42b903418eJohann        /*TODO:  Remove dequant from BLOCKD.  This is a temporary solution until
4111b362b15af34006e6a11974088a46d42b903418eJohann         * the quantizer code uses a passed in pointer to the dequant constants.
4121b362b15af34006e6a11974088a46d42b903418eJohann         * This will also require modifications to the x86 and neon assembly.
4131b362b15af34006e6a11974088a46d42b903418eJohann         * */
4141b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i++)
4151b362b15af34006e6a11974088a46d42b903418eJohann            x->e_mbd.block[i].dequant = xd->dequant_y1;
4161b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 16; i < 24; i++)
4171b362b15af34006e6a11974088a46d42b903418eJohann            x->e_mbd.block[i].dequant = xd->dequant_uv;
4181b362b15af34006e6a11974088a46d42b903418eJohann        x->e_mbd.block[24].dequant = xd->dequant_y2;
4191b362b15af34006e6a11974088a46d42b903418eJohann#endif
4201b362b15af34006e6a11974088a46d42b903418eJohann
4211b362b15af34006e6a11974088a46d42b903418eJohann        /* Y */
4221b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_Y;
4231b362b15af34006e6a11974088a46d42b903418eJohann
4241b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i++)
4251b362b15af34006e6a11974088a46d42b903418eJohann        {
4261b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant = cpi->Y1quant[QIndex];
4271b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant_fast = cpi->Y1quant_fast[QIndex];
4281b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant_shift = cpi->Y1quant_shift[QIndex];
4291b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin = cpi->Y1zbin[QIndex];
4301b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].round = cpi->Y1round[QIndex];
4311b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex];
4321b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin_extra = (short)zbin_extra;
4331b362b15af34006e6a11974088a46d42b903418eJohann        }
4341b362b15af34006e6a11974088a46d42b903418eJohann
4351b362b15af34006e6a11974088a46d42b903418eJohann        /* UV */
4361b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_UV;
4371b362b15af34006e6a11974088a46d42b903418eJohann
4381b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 16; i < 24; i++)
4391b362b15af34006e6a11974088a46d42b903418eJohann        {
4401b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant = cpi->UVquant[QIndex];
4411b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant_fast = cpi->UVquant_fast[QIndex];
4421b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].quant_shift = cpi->UVquant_shift[QIndex];
4431b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin = cpi->UVzbin[QIndex];
4441b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].round = cpi->UVround[QIndex];
4451b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
4461b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin_extra = (short)zbin_extra;
4471b362b15af34006e6a11974088a46d42b903418eJohann        }
4481b362b15af34006e6a11974088a46d42b903418eJohann
4491b362b15af34006e6a11974088a46d42b903418eJohann        /* Y2 */
4501b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_Y2;
4511b362b15af34006e6a11974088a46d42b903418eJohann
4521b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].quant_fast = cpi->Y2quant_fast[QIndex];
4531b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].quant = cpi->Y2quant[QIndex];
4541b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].quant_shift = cpi->Y2quant_shift[QIndex];
4551b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].zbin = cpi->Y2zbin[QIndex];
4561b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].round = cpi->Y2round[QIndex];
4571b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex];
4581b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].zbin_extra = (short)zbin_extra;
4591b362b15af34006e6a11974088a46d42b903418eJohann
4601b362b15af34006e6a11974088a46d42b903418eJohann        /* save this macroblock QIndex for vp8_update_zbin_extra() */
4611b362b15af34006e6a11974088a46d42b903418eJohann        x->q_index = QIndex;
4621b362b15af34006e6a11974088a46d42b903418eJohann
463ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        x->last_zbin_over_quant = x->zbin_over_quant;
464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        x->last_zbin_mode_boost = x->zbin_mode_boost;
4651b362b15af34006e6a11974088a46d42b903418eJohann        x->last_act_zbin_adj = x->act_zbin_adj;
4661b362b15af34006e6a11974088a46d42b903418eJohann
4671b362b15af34006e6a11974088a46d42b903418eJohann
4681b362b15af34006e6a11974088a46d42b903418eJohann
4691b362b15af34006e6a11974088a46d42b903418eJohann    }
470ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    else if(x->last_zbin_over_quant != x->zbin_over_quant
471ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            || x->last_zbin_mode_boost != x->zbin_mode_boost
4721b362b15af34006e6a11974088a46d42b903418eJohann            || x->last_act_zbin_adj != x->act_zbin_adj)
4731b362b15af34006e6a11974088a46d42b903418eJohann    {
4741b362b15af34006e6a11974088a46d42b903418eJohann        /* Y */
4751b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_Y;
4761b362b15af34006e6a11974088a46d42b903418eJohann
4771b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i++)
4781b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin_extra = (short)zbin_extra;
4791b362b15af34006e6a11974088a46d42b903418eJohann
4801b362b15af34006e6a11974088a46d42b903418eJohann        /* UV */
4811b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_UV;
4821b362b15af34006e6a11974088a46d42b903418eJohann
4831b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 16; i < 24; i++)
4841b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i].zbin_extra = (short)zbin_extra;
4851b362b15af34006e6a11974088a46d42b903418eJohann
4861b362b15af34006e6a11974088a46d42b903418eJohann        /* Y2 */
4871b362b15af34006e6a11974088a46d42b903418eJohann        zbin_extra = ZBIN_EXTRA_Y2;
4881b362b15af34006e6a11974088a46d42b903418eJohann        x->block[24].zbin_extra = (short)zbin_extra;
4891b362b15af34006e6a11974088a46d42b903418eJohann
490ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        x->last_zbin_over_quant = x->zbin_over_quant;
491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        x->last_zbin_mode_boost = x->zbin_mode_boost;
4921b362b15af34006e6a11974088a46d42b903418eJohann        x->last_act_zbin_adj = x->act_zbin_adj;
4931b362b15af34006e6a11974088a46d42b903418eJohann    }
4941b362b15af34006e6a11974088a46d42b903418eJohann}
4951b362b15af34006e6a11974088a46d42b903418eJohann
4961b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x)
4971b362b15af34006e6a11974088a46d42b903418eJohann{
4981b362b15af34006e6a11974088a46d42b903418eJohann    int i;
4991b362b15af34006e6a11974088a46d42b903418eJohann    int QIndex = x->q_index;
5001b362b15af34006e6a11974088a46d42b903418eJohann    int zbin_extra;
5011b362b15af34006e6a11974088a46d42b903418eJohann
5021b362b15af34006e6a11974088a46d42b903418eJohann    /* Y */
5031b362b15af34006e6a11974088a46d42b903418eJohann    zbin_extra = ZBIN_EXTRA_Y;
5041b362b15af34006e6a11974088a46d42b903418eJohann
5051b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 16; i++)
5061b362b15af34006e6a11974088a46d42b903418eJohann        x->block[i].zbin_extra = (short)zbin_extra;
5071b362b15af34006e6a11974088a46d42b903418eJohann
5081b362b15af34006e6a11974088a46d42b903418eJohann    /* UV */
5091b362b15af34006e6a11974088a46d42b903418eJohann    zbin_extra = ZBIN_EXTRA_UV;
5101b362b15af34006e6a11974088a46d42b903418eJohann
5111b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 16; i < 24; i++)
5121b362b15af34006e6a11974088a46d42b903418eJohann        x->block[i].zbin_extra = (short)zbin_extra;
5131b362b15af34006e6a11974088a46d42b903418eJohann
5141b362b15af34006e6a11974088a46d42b903418eJohann    /* Y2 */
5151b362b15af34006e6a11974088a46d42b903418eJohann    zbin_extra = ZBIN_EXTRA_Y2;
5161b362b15af34006e6a11974088a46d42b903418eJohann    x->block[24].zbin_extra = (short)zbin_extra;
5171b362b15af34006e6a11974088a46d42b903418eJohann}
5181b362b15af34006e6a11974088a46d42b903418eJohann#undef ZBIN_EXTRA_Y
5191b362b15af34006e6a11974088a46d42b903418eJohann#undef ZBIN_EXTRA_UV
5201b362b15af34006e6a11974088a46d42b903418eJohann#undef ZBIN_EXTRA_Y2
5211b362b15af34006e6a11974088a46d42b903418eJohann
5221b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8cx_frame_init_quantizer(VP8_COMP *cpi)
5231b362b15af34006e6a11974088a46d42b903418eJohann{
5241b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear Zbin mode boost for default case */
525ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->mb.zbin_mode_boost = 0;
5261b362b15af34006e6a11974088a46d42b903418eJohann
5271b362b15af34006e6a11974088a46d42b903418eJohann    /* MB level quantizer setup */
5281b362b15af34006e6a11974088a46d42b903418eJohann    vp8cx_mb_init_quantizer(cpi, &cpi->mb, 0);
5291b362b15af34006e6a11974088a46d42b903418eJohann}
5301b362b15af34006e6a11974088a46d42b903418eJohann
5311b362b15af34006e6a11974088a46d42b903418eJohann
5321b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_set_quantizer(struct VP8_COMP *cpi, int Q)
5331b362b15af34006e6a11974088a46d42b903418eJohann{
5341b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMMON *cm = &cpi->common;
5351b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *mbd = &cpi->mb.e_mbd;
5361b362b15af34006e6a11974088a46d42b903418eJohann    int update = 0;
5371b362b15af34006e6a11974088a46d42b903418eJohann    int new_delta_q;
5387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int new_uv_delta_q;
5391b362b15af34006e6a11974088a46d42b903418eJohann    cm->base_qindex = Q;
5401b362b15af34006e6a11974088a46d42b903418eJohann
5411b362b15af34006e6a11974088a46d42b903418eJohann    /* if any of the delta_q values are changing update flag has to be set */
5421b362b15af34006e6a11974088a46d42b903418eJohann    /* currently only y2dc_delta_q may change */
5431b362b15af34006e6a11974088a46d42b903418eJohann
5441b362b15af34006e6a11974088a46d42b903418eJohann    cm->y1dc_delta_q = 0;
5451b362b15af34006e6a11974088a46d42b903418eJohann    cm->y2ac_delta_q = 0;
5461b362b15af34006e6a11974088a46d42b903418eJohann
5471b362b15af34006e6a11974088a46d42b903418eJohann    if (Q < 4)
5481b362b15af34006e6a11974088a46d42b903418eJohann    {
5491b362b15af34006e6a11974088a46d42b903418eJohann        new_delta_q = 4-Q;
5501b362b15af34006e6a11974088a46d42b903418eJohann    }
5511b362b15af34006e6a11974088a46d42b903418eJohann    else
5521b362b15af34006e6a11974088a46d42b903418eJohann        new_delta_q = 0;
5531b362b15af34006e6a11974088a46d42b903418eJohann
5541b362b15af34006e6a11974088a46d42b903418eJohann    update |= cm->y2dc_delta_q != new_delta_q;
5551b362b15af34006e6a11974088a46d42b903418eJohann    cm->y2dc_delta_q = new_delta_q;
5561b362b15af34006e6a11974088a46d42b903418eJohann
5577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    new_uv_delta_q = 0;
5587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // For screen content, lower the q value for UV channel. For now, select
5597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // conservative delta; same delta for dc and ac, and decrease it with lower
5607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // Q, and set to 0 below some threshold. May want to condition this in
5617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // future on the variance/energy in UV channel.
5627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (cpi->oxcf.screen_content_mode && Q > 40) {
5637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      new_uv_delta_q = -(int)(0.15 * Q);
5647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // Check range: magnitude of delta is 4 bits.
5657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      if (new_uv_delta_q < -15) {
5667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        new_uv_delta_q = -15;
5677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
5687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
5697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    update |= cm->uvdc_delta_q != new_uv_delta_q;
5707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cm->uvdc_delta_q = new_uv_delta_q;
5717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cm->uvac_delta_q = new_uv_delta_q;
5721b362b15af34006e6a11974088a46d42b903418eJohann
5731b362b15af34006e6a11974088a46d42b903418eJohann    /* Set Segment specific quatizers */
5741b362b15af34006e6a11974088a46d42b903418eJohann    mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LVL_ALT_Q][0];
5751b362b15af34006e6a11974088a46d42b903418eJohann    mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LVL_ALT_Q][1];
5761b362b15af34006e6a11974088a46d42b903418eJohann    mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LVL_ALT_Q][2];
5771b362b15af34006e6a11974088a46d42b903418eJohann    mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LVL_ALT_Q][3];
5781b362b15af34006e6a11974088a46d42b903418eJohann
5791b362b15af34006e6a11974088a46d42b903418eJohann    /* quantizer has to be reinitialized for any delta_q changes */
5801b362b15af34006e6a11974088a46d42b903418eJohann    if(update)
5811b362b15af34006e6a11974088a46d42b903418eJohann        vp8cx_init_quantizer(cpi);
5821b362b15af34006e6a11974088a46d42b903418eJohann
5831b362b15af34006e6a11974088a46d42b903418eJohann}
584