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