1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h>
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "onyx_int.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "quantize.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/quant_common.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXACT_QUANT
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef EXACT_FASTQUANT
22233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d)
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i, rc, eob;
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin;
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int x, y, z, sz;
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff_ptr       = b->coeff;
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin_ptr        = b->zbin;
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *round_ptr       = b->round;
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_ptr       = b->quant_fast;
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char *quant_shift_ptr = b->quant_shift;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *qcoeff_ptr      = d->qcoeff;
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dqcoeff_ptr     = d->dqcoeff;
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dequant_ptr     = d->dequant;
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(qcoeff_ptr, 0, 32);
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(dqcoeff_ptr, 0, 32);
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eob = -1;
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc   = vp8_default_zig_zag1d[i];
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan        z    = coeff_ptr[rc];
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin = zbin_ptr[rc] ;
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sz = (z >> 31);                              /* sign of z */
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x  = (z ^ sz) - sz;                          /* x = abs(z) */
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (x >= zbin)
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x += round_ptr[rc];
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan            y  = ((((x * quant_ptr[rc]) >> 16) + x)
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 * quant_shift_ptr[rc]) >> 16;       /* quantize (x) */
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x  = (y ^ sz) - sz;                      /* get the sign back */
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan            qcoeff_ptr[rc] = x;                      /* write to destination */
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (y)
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan                eob = i;                             /* last nonzero coeffs */
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *d->eob = (char)(eob + 1);
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan
70233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d)
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i, rc, eob;
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int x, y, z, sz;
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff_ptr   = b->coeff;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *round_ptr   = b->round;
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_ptr   = b->quant_fast;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *qcoeff_ptr  = d->qcoeff;
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dqcoeff_ptr = d->dqcoeff;
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dequant_ptr = d->dequant;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eob = -1;
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc   = vp8_default_zig_zag1d[i];
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan        z    = coeff_ptr[rc];
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sz = (z >> 31);                              /* sign of z */
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x  = (z ^ sz) - sz;                          /* x = abs(z) */
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan        y  = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x  = (y ^ sz) - sz;                          /* get the sign back */
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan        qcoeff_ptr[rc] = x;                          /* write to destination */
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dqcoeff_ptr[rc] = x * dequant_ptr[rc];       /* dequantized value */
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (y)
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan            eob = i;                                 /* last nonzero coeffs */
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *d->eob = (char)(eob + 1);
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef EXACT_QUANT
106233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d)
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i, rc, eob;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int x, y, z, sz;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin_boost_ptr  = b->zrun_zbin_boost;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff_ptr       = b->coeff;
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin_ptr        = b->zbin;
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *round_ptr       = b->round;
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_ptr       = b->quant;
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_shift_ptr = b->quant_shift;
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *qcoeff_ptr      = d->qcoeff;
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dqcoeff_ptr     = d->dqcoeff;
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dequant_ptr     = d->dequant;
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short zbin_oq_value    = b->zbin_extra;
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(qcoeff_ptr, 0, 32);
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(dqcoeff_ptr, 0, 32);
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eob = -1;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc   = vp8_default_zig_zag1d[i];
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan        z    = coeff_ptr[rc];
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_boost_ptr ++;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sz = (z >> 31);                              /* sign of z */
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x  = (z ^ sz) - sz;                          /* x = abs(z) */
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (x >= zbin)
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x += round_ptr[rc];
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan            y  = ((((x * quant_ptr[rc]) >> 16) + x)
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 * quant_shift_ptr[rc]) >> 16;       /* quantize (x) */
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x  = (y ^ sz) - sz;                      /* get the sign back */
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan            qcoeff_ptr[rc]  = x;                     /* write to destination */
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (y)
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan                eob = i;                             /* last nonzero coeffs */
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan                zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *d->eob = (char)(eob + 1);
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Perform regular quantization, with unbiased rounding and no zero bin. */
159233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_strict_quantize_b_c(BLOCK *b, BLOCKD *d)
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int rc;
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int eob;
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int x;
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int y;
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int z;
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int sz;
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff_ptr;
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_ptr;
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_shift_ptr;
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *qcoeff_ptr;
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dqcoeff_ptr;
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dequant_ptr;
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    coeff_ptr       = b->coeff;
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    quant_ptr       = b->quant;
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    quant_shift_ptr = b->quant_shift;
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    qcoeff_ptr      = d->qcoeff;
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan    dqcoeff_ptr     = d->dqcoeff;
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    dequant_ptr     = d->dequant;
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eob = - 1;
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(qcoeff_ptr, 0, 32);
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(dqcoeff_ptr, 0, 32);
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int dq;
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int rounding;
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /*TODO: These arrays should be stored in zig-zag order.*/
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc = vp8_default_zig_zag1d[i];
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan        z = coeff_ptr[rc];
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dq = dequant_ptr[rc];
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rounding = dq >> 1;
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Sign of z. */
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sz = -(z < 0);
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x = (z + sz) ^ sz;
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x += rounding;
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (x >= dq)
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan            /* Quantize x. */
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan            y  = ((((x * quant_ptr[rc]) >> 16) + x) * quant_shift_ptr[rc]) >> 16;
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan            /* Put the sign back. */
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x = (y + sz) ^ sz;
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan            /* Save the coefficient and its dequantized value. */
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan            qcoeff_ptr[rc] = x;
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dqcoeff_ptr[rc] = x * dq;
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan            /* Remember the last non-zero coefficient. */
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (y)
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan                eob = i;
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *d->eob = (char)(eob + 1);
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
218233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d)
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i, rc, eob;
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin;
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int x, y, z, sz;
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin_boost_ptr = b->zrun_zbin_boost;
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff_ptr      = b->coeff;
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin_ptr       = b->zbin;
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *round_ptr      = b->round;
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_ptr      = b->quant;
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *qcoeff_ptr     = d->qcoeff;
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dqcoeff_ptr    = d->dqcoeff;
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dequant_ptr    = d->dequant;
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short zbin_oq_value   = b->zbin_extra;
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(qcoeff_ptr, 0, 32);
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vpx_memset(dqcoeff_ptr, 0, 32);
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eob = -1;
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc   = vp8_default_zig_zag1d[i];
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan        z    = coeff_ptr[rc];
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_boost_ptr ++;
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan        sz = (z >> 31);                              /* sign of z */
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x  = (z ^ sz) - sz;                          /* x = abs(z) */
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (x >= zbin)
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan            y  = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x  = (y ^ sz) - sz;                      /* get the sign back */
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan            qcoeff_ptr[rc]  = x;                     /* write to destination */
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dqcoeff_ptr[rc] = x * dequant_ptr[rc];   /* dequantized value */
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (y)
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan                eob = i;                             /* last nonzero coeffs */
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan                zbin_boost_ptr = &b->zrun_zbin_boost[0]; /* reset zrl */
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *d->eob = (char)(eob + 1);
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan
269233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_quantize_mby_c(MACROBLOCK *x)
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if(has_2nd_order)
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->quantize_b(&x->block[24], &x->e_mbd.block[24]);
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
282233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_quantize_mb_c(MACROBLOCK *x)
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int has_2nd_order=(x->e_mbd.mode_info_context->mbmi.mode != B_PRED
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan        && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 24+has_2nd_order; i++)
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
293233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_quantize_mbuv_c(MACROBLOCK *x)
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 16; i < 24; i++)
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan
301233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* quantize_b_pair function pointer in MACROBLOCK structure is set to one of
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan * these two C functions if corresponding optimized routine is not available.
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan * NEON optimized version implements currently the fast quantization for pair
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan * of blocks. */
305233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_regular_quantize_b_pair(BLOCK *b1, BLOCK *b2, BLOCKD *d1, BLOCKD *d2)
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_regular_quantize_b(b1, d1);
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_regular_quantize_b(b2, d2);
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
311233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_fast_quantize_b_pair_c(BLOCK *b1, BLOCK *b2, BLOCKD *d1, BLOCKD *d2)
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_fast_quantize_b_c(b1, d1);
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_fast_quantize_b_c(b2, d2);
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan
318233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int qrounding_factors[129] =
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan
339233d2500723e5594f3e7c70896ffeeef32b9c950ywan
340233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int qzbin_factors[129] =
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan
362233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int qrounding_factors_y2[129] =
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48, 48, 48, 48, 48, 48, 48, 48,
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan    48
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan
384233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int qzbin_factors_y2[129] =
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    84, 84, 84, 84, 84, 84, 84, 84,
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80, 80, 80, 80, 80, 80, 80, 80,
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    80
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
404233d2500723e5594f3e7c70896ffeeef32b9c950ywan
405233d2500723e5594f3e7c70896ffeeef32b9c950ywan
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXACT_QUANT
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef EXACT_QUANT
408233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void invert_quant(int improved_quant, short *quant,
409233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         short *shift, short d)
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
411233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if(improved_quant)
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned t;
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int l;
415233d2500723e5594f3e7c70896ffeeef32b9c950ywan        t = d;
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for(l = 0; t > 1; l++)
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan            t>>=1;
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan        t = 1 + (1<<(16+l))/d;
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *quant = (short)(t - (1<<16));
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *shift = l;
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* use multiplication and constant shift by 16 */
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *shift = 1 << (16 - *shift);
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *quant = (1 << 16) / d;
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *shift = 0;
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* use multiplication and constant shift by 16 */
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *shift = 1 << (16 - *shift);
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
431233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
434233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8cx_init_quantizer(VP8_COMP *cpi)
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int quant_val;
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int Q;
439233d2500723e5594f3e7c70896ffeeef32b9c950ywan
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44,
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          44, 44};
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan
443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (Q = 0; Q < QINDEX_RANGE; Q++)
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
445233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* dc values */
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val;
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0,
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->Y1quant_shift[Q] + 0, quant_val);
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y1dequant[Q][0] = quant_val;
453233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan
455233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val;
457233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0,
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->Y2quant_shift[Q] + 0, quant_val);
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y2dequant[Q][0] = quant_val;
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
463233d2500723e5594f3e7c70896ffeeef32b9c950ywan
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
465233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val;
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0,
467233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->UVquant_shift[Q] + 0, quant_val);
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
469233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.UVdequant[Q][0] = quant_val;
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
472233d2500723e5594f3e7c70896ffeeef32b9c950ywan
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* all the ac values = ; */
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_ac_yquant(Q);
475233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1quant_fast[Q][1] = (1 << 16) / quant_val;
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 1,
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->Y1quant_shift[Q] + 1, quant_val);
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1zbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1round[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y1dequant[Q][1] = quant_val;
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y1[Q][1] = (quant_val * zbin_boost[1]) >> 7;
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2quant_fast[Q][1] = (1 << 16) / quant_val;
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 1,
486233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->Y2quant_shift[Q] + 1, quant_val);
487233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2zbin[Q][1] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
488233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2round[Q][1] = (qrounding_factors_y2[Q] * quant_val) >> 7;
489233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y2dequant[Q][1] = quant_val;
490233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y2[Q][1] = (quant_val * zbin_boost[1]) >> 7;
491233d2500723e5594f3e7c70896ffeeef32b9c950ywan
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVquant_fast[Q][1] = (1 << 16) / quant_val;
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan        invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 1,
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     cpi->UVquant_shift[Q] + 1, quant_val);
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVzbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVround[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.UVdequant[Q][1] = quant_val;
499233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_uv[Q][1] = (quant_val * zbin_boost[1]) >> 7;
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 2; i < 16; i++)
502233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
503233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1quant_fast[Q][i] = cpi->Y1quant_fast[Q][1];
504233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1quant[Q][i] = cpi->Y1quant[Q][1];
505233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1quant_shift[Q][i] = cpi->Y1quant_shift[Q][1];
506233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1zbin[Q][i] = cpi->Y1zbin[Q][1];
507233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1round[Q][i] = cpi->Y1round[Q][1];
508233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_y1[Q][i] = (cpi->common.Y1dequant[Q][1] *
509233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             zbin_boost[i]) >> 7;
510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
511233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2quant_fast[Q][i] = cpi->Y2quant_fast[Q][1];
512233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2quant[Q][i] = cpi->Y2quant[Q][1];
513233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2quant_shift[Q][i] = cpi->Y2quant_shift[Q][1];
514233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2zbin[Q][i] = cpi->Y2zbin[Q][1];
515233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2round[Q][i] = cpi->Y2round[Q][1];
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_y2[Q][i] = (cpi->common.Y2dequant[Q][1] *
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             zbin_boost[i]) >> 7;
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVquant_fast[Q][i] = cpi->UVquant_fast[Q][1];
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVquant[Q][i] = cpi->UVquant[Q][1];
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVquant_shift[Q][i] = cpi->UVquant_shift[Q][1];
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVzbin[Q][i] = cpi->UVzbin[Q][1];
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVround[Q][i] = cpi->UVround[Q][1];
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_uv[Q][i] = (cpi->common.UVdequant[Q][1] *
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             zbin_boost[i]) >> 7;
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
530233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8cx_init_quantizer(VP8_COMP *cpi)
531233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int quant_val;
534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int Q;
535233d2500723e5594f3e7c70896ffeeef32b9c950ywan
536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 44, 44};
537233d2500723e5594f3e7c70896ffeeef32b9c950ywan
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (Q = 0; Q < QINDEX_RANGE; Q++)
539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* dc values */
541233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1quant[Q][0] = (1 << 16) / quant_val;
543233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
545233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y1dequant[Q][0] = quant_val;
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
547233d2500723e5594f3e7c70896ffeeef32b9c950ywan
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
549233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2quant[Q][0] = (1 << 16) / quant_val;
550233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
551233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.Y2dequant[Q][0] = quant_val;
553233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan
555233d2500723e5594f3e7c70896ffeeef32b9c950ywan        quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVquant[Q][0] = (1 << 16) / quant_val;
557233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
558233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
559233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->common.UVdequant[Q][0] = quant_val;
560233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
561233d2500723e5594f3e7c70896ffeeef32b9c950ywan
562233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* all the ac values = ; */
563233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 1; i < 16; i++)
564233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
565233d2500723e5594f3e7c70896ffeeef32b9c950ywan            int rc = vp8_default_zig_zag1d[i];
566233d2500723e5594f3e7c70896ffeeef32b9c950ywan
567233d2500723e5594f3e7c70896ffeeef32b9c950ywan            quant_val = vp8_ac_yquant(Q);
568233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1quant[Q][rc] = (1 << 16) / quant_val;
569233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1zbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
570233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y1round[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
571233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->common.Y1dequant[Q][rc] = quant_val;
572233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7;
573233d2500723e5594f3e7c70896ffeeef32b9c950ywan
574233d2500723e5594f3e7c70896ffeeef32b9c950ywan            quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
575233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2quant[Q][rc] = (1 << 16) / quant_val;
576233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2zbin[Q][rc] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
577233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->Y2round[Q][rc] = (qrounding_factors_y2[Q] * quant_val) >> 7;
578233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->common.Y2dequant[Q][rc] = quant_val;
579233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7;
580233d2500723e5594f3e7c70896ffeeef32b9c950ywan
581233d2500723e5594f3e7c70896ffeeef32b9c950ywan            quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
582233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVquant[Q][rc] = (1 << 16) / quant_val;
583233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVzbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
584233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->UVround[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
585233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->common.UVdequant[Q][rc] = quant_val;
586233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7;
587233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
589233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
590233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
591233d2500723e5594f3e7c70896ffeeef32b9c950ywan
592233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ZBIN_EXTRA_Y \
593233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (( cpi->common.Y1dequant[QIndex][1] *  \
594233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ( x->zbin_over_quant +  \
595233d2500723e5594f3e7c70896ffeeef32b9c950ywan      x->zbin_mode_boost +  \
596233d2500723e5594f3e7c70896ffeeef32b9c950ywan      x->act_zbin_adj ) ) >> 7)
597233d2500723e5594f3e7c70896ffeeef32b9c950ywan
598233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ZBIN_EXTRA_UV \
599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (( cpi->common.UVdequant[QIndex][1] *  \
600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ( x->zbin_over_quant +  \
601233d2500723e5594f3e7c70896ffeeef32b9c950ywan      x->zbin_mode_boost +  \
602233d2500723e5594f3e7c70896ffeeef32b9c950ywan      x->act_zbin_adj ) ) >> 7)
603233d2500723e5594f3e7c70896ffeeef32b9c950ywan
604233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ZBIN_EXTRA_Y2 \
605233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (( cpi->common.Y2dequant[QIndex][1] *  \
606233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ( (x->zbin_over_quant / 2) +  \
607233d2500723e5594f3e7c70896ffeeef32b9c950ywan       x->zbin_mode_boost +  \
608233d2500723e5594f3e7c70896ffeeef32b9c950ywan       x->act_zbin_adj ) ) >> 7)
609233d2500723e5594f3e7c70896ffeeef32b9c950ywan
610233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x, int ok_to_skip)
611233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
613233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int QIndex;
614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACROBLOCKD *xd = &x->e_mbd;
615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_extra;
616233d2500723e5594f3e7c70896ffeeef32b9c950ywan
617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Select the baseline MB Q index. */
618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (xd->segmentation_enabled)
619233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
620233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Abs Value */
621233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
622233d2500723e5594f3e7c70896ffeeef32b9c950ywan            QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
623233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Delta Value */
624233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
625233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
626233d2500723e5594f3e7c70896ffeeef32b9c950ywan            QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
627233d2500723e5594f3e7c70896ffeeef32b9c950ywan            /* Clamp to valid range */
628233d2500723e5594f3e7c70896ffeeef32b9c950ywan            QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;
629233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
632233d2500723e5594f3e7c70896ffeeef32b9c950ywan        QIndex = cpi->common.base_qindex;
633233d2500723e5594f3e7c70896ffeeef32b9c950ywan
634233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* This initialization should be called at least once. Use ok_to_skip to
635233d2500723e5594f3e7c70896ffeeef32b9c950ywan     * decide if it is ok to skip.
636233d2500723e5594f3e7c70896ffeeef32b9c950ywan     * Before encoding a frame, this function is always called with ok_to_skip
637233d2500723e5594f3e7c70896ffeeef32b9c950ywan     * =0, which means no skiping of calculations. The "last" values are
638233d2500723e5594f3e7c70896ffeeef32b9c950ywan     * initialized at that time.
639233d2500723e5594f3e7c70896ffeeef32b9c950ywan     */
640233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!ok_to_skip || QIndex != x->q_index)
641233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
642233d2500723e5594f3e7c70896ffeeef32b9c950ywan
643233d2500723e5594f3e7c70896ffeeef32b9c950ywan        xd->dequant_y1_dc[0] = 1;
644233d2500723e5594f3e7c70896ffeeef32b9c950ywan        xd->dequant_y1[0] = cpi->common.Y1dequant[QIndex][0];
645233d2500723e5594f3e7c70896ffeeef32b9c950ywan        xd->dequant_y2[0] = cpi->common.Y2dequant[QIndex][0];
646233d2500723e5594f3e7c70896ffeeef32b9c950ywan        xd->dequant_uv[0] = cpi->common.UVdequant[QIndex][0];
647233d2500723e5594f3e7c70896ffeeef32b9c950ywan
648233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 1; i < 16; i++)
649233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
650233d2500723e5594f3e7c70896ffeeef32b9c950ywan            xd->dequant_y1_dc[i] =
651233d2500723e5594f3e7c70896ffeeef32b9c950ywan            xd->dequant_y1[i] = cpi->common.Y1dequant[QIndex][1];
652233d2500723e5594f3e7c70896ffeeef32b9c950ywan            xd->dequant_y2[i] = cpi->common.Y2dequant[QIndex][1];
653233d2500723e5594f3e7c70896ffeeef32b9c950ywan            xd->dequant_uv[i] = cpi->common.UVdequant[QIndex][1];
654233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
655233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 1
656233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /*TODO:  Remove dequant from BLOCKD.  This is a temporary solution until
657233d2500723e5594f3e7c70896ffeeef32b9c950ywan         * the quantizer code uses a passed in pointer to the dequant constants.
658233d2500723e5594f3e7c70896ffeeef32b9c950ywan         * This will also require modifications to the x86 and neon assembly.
659233d2500723e5594f3e7c70896ffeeef32b9c950ywan         * */
660233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 0; i < 16; i++)
661233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->e_mbd.block[i].dequant = xd->dequant_y1;
662233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 16; i < 24; i++)
663233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->e_mbd.block[i].dequant = xd->dequant_uv;
664233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->e_mbd.block[24].dequant = xd->dequant_y2;
665233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
666233d2500723e5594f3e7c70896ffeeef32b9c950ywan
667233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Y */
668233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_Y;
669233d2500723e5594f3e7c70896ffeeef32b9c950ywan
670233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 0; i < 16; i++)
671233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
672233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant = cpi->Y1quant[QIndex];
673233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant_fast = cpi->Y1quant_fast[QIndex];
674233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant_shift = cpi->Y1quant_shift[QIndex];
675233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin = cpi->Y1zbin[QIndex];
676233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].round = cpi->Y1round[QIndex];
677233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex];
678233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin_extra = (short)zbin_extra;
679233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
680233d2500723e5594f3e7c70896ffeeef32b9c950ywan
681233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* UV */
682233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_UV;
683233d2500723e5594f3e7c70896ffeeef32b9c950ywan
684233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 16; i < 24; i++)
685233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
686233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant = cpi->UVquant[QIndex];
687233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant_fast = cpi->UVquant_fast[QIndex];
688233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].quant_shift = cpi->UVquant_shift[QIndex];
689233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin = cpi->UVzbin[QIndex];
690233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].round = cpi->UVround[QIndex];
691233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
692233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin_extra = (short)zbin_extra;
693233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
694233d2500723e5594f3e7c70896ffeeef32b9c950ywan
695233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Y2 */
696233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_Y2;
697233d2500723e5594f3e7c70896ffeeef32b9c950ywan
698233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].quant_fast = cpi->Y2quant_fast[QIndex];
699233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].quant = cpi->Y2quant[QIndex];
700233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].quant_shift = cpi->Y2quant_shift[QIndex];
701233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].zbin = cpi->Y2zbin[QIndex];
702233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].round = cpi->Y2round[QIndex];
703233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex];
704233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].zbin_extra = (short)zbin_extra;
705233d2500723e5594f3e7c70896ffeeef32b9c950ywan
706233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* save this macroblock QIndex for vp8_update_zbin_extra() */
707233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->q_index = QIndex;
708233d2500723e5594f3e7c70896ffeeef32b9c950ywan
709233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_zbin_over_quant = x->zbin_over_quant;
710233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_zbin_mode_boost = x->zbin_mode_boost;
711233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_act_zbin_adj = x->act_zbin_adj;
712233d2500723e5594f3e7c70896ffeeef32b9c950ywan
713233d2500723e5594f3e7c70896ffeeef32b9c950ywan
714233d2500723e5594f3e7c70896ffeeef32b9c950ywan
715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if(x->last_zbin_over_quant != x->zbin_over_quant
717233d2500723e5594f3e7c70896ffeeef32b9c950ywan            || x->last_zbin_mode_boost != x->zbin_mode_boost
718233d2500723e5594f3e7c70896ffeeef32b9c950ywan            || x->last_act_zbin_adj != x->act_zbin_adj)
719233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
720233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Y */
721233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_Y;
722233d2500723e5594f3e7c70896ffeeef32b9c950ywan
723233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 0; i < 16; i++)
724233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin_extra = (short)zbin_extra;
725233d2500723e5594f3e7c70896ffeeef32b9c950ywan
726233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* UV */
727233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_UV;
728233d2500723e5594f3e7c70896ffeeef32b9c950ywan
729233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 16; i < 24; i++)
730233d2500723e5594f3e7c70896ffeeef32b9c950ywan            x->block[i].zbin_extra = (short)zbin_extra;
731233d2500723e5594f3e7c70896ffeeef32b9c950ywan
732233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* Y2 */
733233d2500723e5594f3e7c70896ffeeef32b9c950ywan        zbin_extra = ZBIN_EXTRA_Y2;
734233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[24].zbin_extra = (short)zbin_extra;
735233d2500723e5594f3e7c70896ffeeef32b9c950ywan
736233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_zbin_over_quant = x->zbin_over_quant;
737233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_zbin_mode_boost = x->zbin_mode_boost;
738233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->last_act_zbin_adj = x->act_zbin_adj;
739233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
740233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
741233d2500723e5594f3e7c70896ffeeef32b9c950ywan
742233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x)
743233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
744233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
745233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int QIndex = x->q_index;
746233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_extra;
747233d2500723e5594f3e7c70896ffeeef32b9c950ywan
748233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Y */
749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    zbin_extra = ZBIN_EXTRA_Y;
750233d2500723e5594f3e7c70896ffeeef32b9c950ywan
751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 16; i++)
752233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[i].zbin_extra = (short)zbin_extra;
753233d2500723e5594f3e7c70896ffeeef32b9c950ywan
754233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* UV */
755233d2500723e5594f3e7c70896ffeeef32b9c950ywan    zbin_extra = ZBIN_EXTRA_UV;
756233d2500723e5594f3e7c70896ffeeef32b9c950ywan
757233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 16; i < 24; i++)
758233d2500723e5594f3e7c70896ffeeef32b9c950ywan        x->block[i].zbin_extra = (short)zbin_extra;
759233d2500723e5594f3e7c70896ffeeef32b9c950ywan
760233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Y2 */
761233d2500723e5594f3e7c70896ffeeef32b9c950ywan    zbin_extra = ZBIN_EXTRA_Y2;
762233d2500723e5594f3e7c70896ffeeef32b9c950ywan    x->block[24].zbin_extra = (short)zbin_extra;
763233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
764233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef ZBIN_EXTRA_Y
765233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef ZBIN_EXTRA_UV
766233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef ZBIN_EXTRA_Y2
767233d2500723e5594f3e7c70896ffeeef32b9c950ywan
768233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8cx_frame_init_quantizer(VP8_COMP *cpi)
769233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
770233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Clear Zbin mode boost for default case */
771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cpi->mb.zbin_mode_boost = 0;
772233d2500723e5594f3e7c70896ffeeef32b9c950ywan
773233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* MB level quantizer setup */
774233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8cx_mb_init_quantizer(cpi, &cpi->mb, 0);
775233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
776233d2500723e5594f3e7c70896ffeeef32b9c950ywan
777233d2500723e5594f3e7c70896ffeeef32b9c950ywan
778233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_set_quantizer(struct VP8_COMP *cpi, int Q)
779233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VP8_COMMON *cm = &cpi->common;
781233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACROBLOCKD *mbd = &cpi->mb.e_mbd;
782233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int update = 0;
783233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int new_delta_q;
784233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->base_qindex = Q;
785233d2500723e5594f3e7c70896ffeeef32b9c950ywan
786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* if any of the delta_q values are changing update flag has to be set */
787233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* currently only y2dc_delta_q may change */
788233d2500723e5594f3e7c70896ffeeef32b9c950ywan
789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->y1dc_delta_q = 0;
790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->y2ac_delta_q = 0;
791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->uvdc_delta_q = 0;
792233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->uvac_delta_q = 0;
793233d2500723e5594f3e7c70896ffeeef32b9c950ywan
794233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (Q < 4)
795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
796233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new_delta_q = 4-Q;
797233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
798233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
799233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new_delta_q = 0;
800233d2500723e5594f3e7c70896ffeeef32b9c950ywan
801233d2500723e5594f3e7c70896ffeeef32b9c950ywan    update |= cm->y2dc_delta_q != new_delta_q;
802233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->y2dc_delta_q = new_delta_q;
803233d2500723e5594f3e7c70896ffeeef32b9c950ywan
804233d2500723e5594f3e7c70896ffeeef32b9c950ywan
805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Set Segment specific quatizers */
806233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LVL_ALT_Q][0];
807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LVL_ALT_Q][1];
808233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LVL_ALT_Q][2];
809233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LVL_ALT_Q][3];
810233d2500723e5594f3e7c70896ffeeef32b9c950ywan
811233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* quantizer has to be reinitialized for any delta_q changes */
812233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if(update)
813233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vp8cx_init_quantizer(cpi);
814233d2500723e5594f3e7c70896ffeeef32b9c950ywan
815233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
816