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