1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vp9_rtcd.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h" 155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 16da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_dsp/quantize.h" 175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vpx_mem/vpx_mem.h" 18da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_ports/mem.h" 195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_idct.h" 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h" 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconintra.h" 23da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp9/common/vp9_scan.h" 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_encodemb.h" 26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp9/encoder/vp9_rd.h" 275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_tokenize.h" 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct optimize_ctx { 302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT ta[MAX_MB_PLANE][16]; 312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT tl[MAX_MB_PLANE][16]; 322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_subtract_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblock_plane *const p = &x->plane[plane]; 362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &x->e_mbd.plane[plane]; 372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); 382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize]; 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 41da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 42da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (x->e_mbd.cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 43da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_subtract_block(bh, bw, p->src_diff, bw, p->src.buf, 44da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->src.stride, pd->dst.buf, pd->dst.stride, 45da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->e_mbd.bd); 46da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 47da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 48da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 49da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_subtract_block(bh, bw, p->src_diff, bw, p->src.buf, p->src.stride, 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pd->dst.buf, pd->dst.stride); 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define RDTRUNC(RM, DM, R, D) ((128 + (R) * (RM)) & 0xFF) 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct vp9_token_state { 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int rate; 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int error; 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int next; 59da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int16_t token; 60da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int16_t qc; 61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} vp9_token_state; 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(jimbankoski): experiment to find optimal RD numbers. 64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstatic const int plane_rd_mult[PLANE_TYPES] = { 4, 2 }; 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define UPDATE_RD_COST()\ 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{\ 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);\ 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);\ 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (rd_cost0 == rd_cost1) {\ 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);\ 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);\ 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang }\ 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// This function is a place holder for now but may ultimately need 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// to scan previous tokens to work out the correct context. 7891037db265ecdd914a26e056cf69207b4f50924ehkuangstatic int trellis_get_coeff_context(const int16_t *scan, 7991037db265ecdd914a26e056cf69207b4f50924ehkuang const int16_t *nb, 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int idx, int token, 8191037db265ecdd914a26e056cf69207b4f50924ehkuang uint8_t *token_cache) { 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int bak = token_cache[scan[idx]], pt; 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang token_cache[scan[idx]] = vp9_pt_energy_class[token]; 8491037db265ecdd914a26e056cf69207b4f50924ehkuang pt = get_coef_context(nb, token_cache, idx + 1); 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang token_cache[scan[idx]] = bak; 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pt; 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstatic int optimize_b(MACROBLOCK *mb, int plane, int block, 90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian TX_SIZE tx_size, int ctx) { 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &mb->e_mbd; 92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian struct macroblock_plane *const p = &mb->plane[plane]; 93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian struct macroblockd_plane *const pd = &xd->plane[plane]; 944fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang const int ref = is_inter_block(&xd->mi[0]->mbmi); 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_token_state tokens[1025][2]; 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned best_index[1025][2]; 97ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8_t token_cache[1024]; 98da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const tran_low_t *const coeff = BLOCK_OFFSET(mb->plane[plane].coeff, block); 99da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 100da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int eob = p->eobs[block]; 1022263fc984bdc858ee931d3e35c87c404de923950Johann const PLANE_TYPE type = get_plane_type(plane); 1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int default_eob = 16 << (tx_size << 1); 104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int mul = 1 + (tx_size == TX_32X32); 1051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int16_t *dequant_ptr = pd->dequant; 1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const uint8_t *const band_translate = get_band_translate(tx_size); 107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const scan_order *const so = get_scan(xd, tx_size, type, block); 108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *const scan = so->scan; 109ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *const nb = so->neighbors; 110ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int next = eob, sz = 0; 111ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64_t rdmult = mb->rdmult * plane_rd_mult[type], rddiv = mb->rddiv; 112ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64_t rd_cost0, rd_cost1; 113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int rate0, rate1, error0, error1; 114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int16_t t0, t1; 115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian EXTRABIT e0; 116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int best, band, pt, i, final_eob; 117da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 118da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int16_t *cat6_high_cost = vp9_get_high_cost_table(xd->bd); 119da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 120da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int16_t *cat6_high_cost = vp9_get_high_cost_table(8); 121da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert((!type && !plane) || (type && plane)); 124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(eob <= default_eob); 125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Now set up a Viterbi trellis to evaluate alternative roundings. */ 127ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (!ref) 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rdmult = (rdmult * 9) >> 4; 129ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Initialize the sentinel node of the trellis. */ 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[eob][0].rate = 0; 132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[eob][0].error = 0; 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[eob][0].next = default_eob; 1342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian tokens[eob][0].token = EOB_TOKEN; 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[eob][0].qc = 0; 136ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian tokens[eob][1] = tokens[eob][0]; 137ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < eob; i++) 139ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian token_cache[scan[i]] = 140da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_pt_energy_class[vp9_get_token(qcoeff[scan[i]])]; 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 142ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian for (i = eob; i-- > 0;) { 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int base_bits, d2, dx; 144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int rc = scan[i]; 145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int x = qcoeff[rc]; 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Only add a trellis state for non-zero coefficients. */ 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x) { 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int shortcut = 0; 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang error0 = tokens[next][0].error; 150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang error1 = tokens[next][1].error; 151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Evaluate the first possibility for this state. */ 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate0 = tokens[next][0].rate; 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate1 = tokens[next][1].rate; 154da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_get_token_extra(x, &t0, &e0); 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Consider both possible successor states. */ 156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (next < default_eob) { 1579b35249446b07f40ac5fcc3205f2c048616efacchkuang band = band_translate[i + 1]; 15891037db265ecdd914a26e056cf69207b4f50924ehkuang pt = trellis_get_coeff_context(scan, nb, i, t0, token_cache); 159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian rate0 += mb->token_costs[tx_size][type][ref][band][0][pt] 160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [tokens[next][0].token]; 161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian rate1 += mb->token_costs[tx_size][type][ref][band][0][pt] 162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [tokens[next][1].token]; 163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang UPDATE_RD_COST(); 165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* And pick the best. */ 166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best = rd_cost1 < rd_cost0; 167da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian base_bits = vp9_get_cost(t0, e0, cat6_high_cost); 1682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian dx = mul * (dqcoeff[rc] - coeff[rc]); 169da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 170da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 171da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dx >>= xd->bd - 8; 172da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 173da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang d2 = dx * dx; 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][0].rate = base_bits + (best ? rate1 : rate0); 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][0].error = d2 + (best ? error1 : error0); 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][0].next = next; 178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][0].token = t0; 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][0].qc = x; 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best_index[i][0] = best; 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Evaluate the second possibility for this state. */ 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate0 = tokens[next][0].rate; 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate1 = tokens[next][1].rate; 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 186ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if ((abs(x) * dequant_ptr[rc != 0] > abs(coeff[rc]) * mul) && 187ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian (abs(x) * dequant_ptr[rc != 0] < abs(coeff[rc]) * mul + 188ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian dequant_ptr[rc != 0])) 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang shortcut = 1; 190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang shortcut = 0; 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (shortcut) { 194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sz = -(x < 0); 195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x -= 2 * sz + 1; 196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Consider both possible successor states. */ 199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!x) { 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* If we reduced this coefficient to zero, check to see if 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * we need to move the EOB back here. 202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 2032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian t0 = tokens[next][0].token == EOB_TOKEN ? EOB_TOKEN : ZERO_TOKEN; 2042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian t1 = tokens[next][1].token == EOB_TOKEN ? EOB_TOKEN : ZERO_TOKEN; 205da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian e0 = 0; 206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 207da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_get_token_extra(x, &t0, &e0); 208da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian t1 = t0; 209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (next < default_eob) { 2119b35249446b07f40ac5fcc3205f2c048616efacchkuang band = band_translate[i + 1]; 2122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (t0 != EOB_TOKEN) { 21391037db265ecdd914a26e056cf69207b4f50924ehkuang pt = trellis_get_coeff_context(scan, nb, i, t0, token_cache); 214f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang rate0 += mb->token_costs[tx_size][type][ref][band][!x][pt] 21591037db265ecdd914a26e056cf69207b4f50924ehkuang [tokens[next][0].token]; 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (t1 != EOB_TOKEN) { 21891037db265ecdd914a26e056cf69207b4f50924ehkuang pt = trellis_get_coeff_context(scan, nb, i, t1, token_cache); 219f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang rate1 += mb->token_costs[tx_size][type][ref][band][!x][pt] 22091037db265ecdd914a26e056cf69207b4f50924ehkuang [tokens[next][1].token]; 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang UPDATE_RD_COST(); 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* And pick the best. */ 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best = rd_cost1 < rd_cost0; 227da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian base_bits = vp9_get_cost(t0, e0, cat6_high_cost); 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (shortcut) { 230da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 231da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 232da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dx -= ((dequant_ptr[rc != 0] >> (xd->bd - 8)) + sz) ^ sz; 233da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 234da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dx -= (dequant_ptr[rc != 0] + sz) ^ sz; 235da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 236da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dx -= (dequant_ptr[rc != 0] + sz) ^ sz; 238da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang d2 = dx * dx; 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][1].rate = base_bits + (best ? rate1 : rate0); 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][1].error = d2 + (best ? error1 : error0); 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][1].next = next; 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][1].token = best ? t1 : t0; 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[i][1].qc = x; 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best_index[i][1] = best; 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Finally, make this the new head of the trellis. */ 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang next = i; 2495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang /* There's no choice to make for a zero coefficient, so we don't 2515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * add a new trellis node, but we do need to update the costs. 2525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 2539b35249446b07f40ac5fcc3205f2c048616efacchkuang band = band_translate[i + 1]; 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang t0 = tokens[next][0].token; 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang t1 = tokens[next][1].token; 256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Update the cost of each path if we're past the EOB token. */ 2572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (t0 != EOB_TOKEN) { 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[next][0].rate += 259f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang mb->token_costs[tx_size][type][ref][band][1][0][t0]; 260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[next][0].token = ZERO_TOKEN; 261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (t1 != EOB_TOKEN) { 263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[next][1].rate += 264f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang mb->token_costs[tx_size][type][ref][band][1][0][t1]; 265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tokens[next][1].token = ZERO_TOKEN; 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 26791037db265ecdd914a26e056cf69207b4f50924ehkuang best_index[i][0] = best_index[i][1] = 0; 268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Don't update next, because we didn't add a new node. */ 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Now pick the best path through the whole trellis. */ 2739b35249446b07f40ac5fcc3205f2c048616efacchkuang band = band_translate[i + 1]; 274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate0 = tokens[next][0].rate; 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate1 = tokens[next][1].rate; 276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang error0 = tokens[next][0].error; 277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang error1 = tokens[next][1].error; 278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang t0 = tokens[next][0].token; 279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang t1 = tokens[next][1].token; 280ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian rate0 += mb->token_costs[tx_size][type][ref][band][0][ctx][t0]; 281ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian rate1 += mb->token_costs[tx_size][type][ref][band][0][ctx][t1]; 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang UPDATE_RD_COST(); 283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best = rd_cost1 < rd_cost0; 284ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian final_eob = -1; 285da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(qcoeff, 0, sizeof(*qcoeff) * (16 << (tx_size * 2))); 286da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dqcoeff, 0, sizeof(*dqcoeff) * (16 << (tx_size * 2))); 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = next; i < eob; i = next) { 288ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int x = tokens[i][best].qc; 289ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int rc = scan[i]; 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x) { 291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang final_eob = i; 292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 293ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 2942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian qcoeff[rc] = x; 2952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian dqcoeff[rc] = (x * dequant_ptr[rc != 0]) / mul; 296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang next = tokens[i][best].next; 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang best = best_index[i][best]; 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang final_eob++; 301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mb->plane[plane].eobs[block] = final_eob; 303ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian return final_eob; 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 305ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic INLINE void fdct32x32(int rd_transform, 307da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int16_t *src, tran_low_t *dst, 308da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int src_stride) { 309da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (rd_transform) 310da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct32x32_rd(src, dst, src_stride); 311da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else 312da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct32x32(src, dst, src_stride); 313da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 314da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 315da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 316da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void highbd_fdct32x32(int rd_transform, const int16_t *src, 317da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *dst, int src_stride) { 3182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (rd_transform) 319da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct32x32_rd(src, dst, src_stride); 3202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian else 321da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct32x32(src, dst, src_stride); 322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 323da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 325ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_xform_quant_fp(MACROBLOCK *x, int plane, int block, 326ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 327ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 328ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 329ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 330ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const scan_order *const scan_order = &vp9_default_scan_orders[tx_size]; 331da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 332da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 333da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 335ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 336ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int i, j; 337ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *src_diff; 338ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 339ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian src_diff = &p->src_diff[4 * (j * diff_stride + i)]; 340ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 341da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 342da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 343da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (tx_size) { 344da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_32X32: 345da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 346da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_quantize_fp_32x32(coeff, 1024, x->skip_block, p->zbin, 347da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->round_fp, p->quant_fp, p->quant_shift, 348da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian qcoeff, dqcoeff, pd->dequant, 349da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian eob, scan_order->scan, 350da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->iscan); 351da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 352da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_16X16: 353da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 354da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_quantize_fp(coeff, 256, x->skip_block, p->zbin, p->round_fp, 355da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 356da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 357da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 358da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 359da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_8X8: 360da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 361da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_quantize_fp(coeff, 64, x->skip_block, p->zbin, p->round_fp, 362da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 363da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 364da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 365da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 366da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_4X4: 367da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 368da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_quantize_fp(coeff, 16, x->skip_block, p->zbin, p->round_fp, 369da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 370da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 371da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 372da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 373da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian default: 374da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(0); 375da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 376da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 377da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 378da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 379da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 380ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (tx_size) { 381ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_32X32: 382ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 383ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vp9_quantize_fp_32x32(coeff, 1024, x->skip_block, p->zbin, p->round_fp, 384ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 385da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 386ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian scan_order->iscan); 387ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 388ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_16X16: 389da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct16x16(src_diff, coeff, diff_stride); 390ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vp9_quantize_fp(coeff, 256, x->skip_block, p->zbin, p->round_fp, 391ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 392da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 393ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 394ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 395ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_8X8: 396da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_fdct8x8_quant(src_diff, diff_stride, coeff, 64, 397da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->skip_block, p->zbin, p->round_fp, 398da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 399da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 400da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 401ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 402ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_4X4: 403ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 404ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vp9_quantize_fp(coeff, 16, x->skip_block, p->zbin, p->round_fp, 405ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp, p->quant_shift, qcoeff, dqcoeff, 406da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 407ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 408ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 409ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian default: 410ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian assert(0); 411ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 412ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 413ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 414ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 415ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_xform_quant_dc(MACROBLOCK *x, int plane, int block, 416ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 417ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 418ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 419ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 420da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 421da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 422da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 423ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 424ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 425ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int i, j; 426ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *src_diff; 427ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 428ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 429ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian src_diff = &p->src_diff[4 * (j * diff_stride + i)]; 430ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 431da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 432da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 433da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (tx_size) { 434da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_32X32: 435da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct32x32_1(src_diff, coeff, diff_stride); 436da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_dc_32x32(coeff, x->skip_block, p->round, 437da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 438da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant[0], eob); 439da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_16X16: 441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct16x16_1(src_diff, coeff, diff_stride); 442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 256, x->skip_block, p->round, 443da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant[0], eob); 445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_8X8: 447da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct8x8_1(src_diff, coeff, diff_stride); 448da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 64, x->skip_block, p->round, 449da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 450da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant[0], eob); 451da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 452da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_4X4: 453da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 454da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 16, x->skip_block, p->round, 455da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant[0], eob); 457da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 458da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian default: 459da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(0); 460da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 461da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 462da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 463da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 464da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 465ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (tx_size) { 466ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_32X32: 467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct32x32_1(src_diff, coeff, diff_stride); 468da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_dc_32x32(coeff, x->skip_block, p->round, 469ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 470ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian pd->dequant[0], eob); 471ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 472ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_16X16: 473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct16x16_1(src_diff, coeff, diff_stride); 474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_dc(coeff, 256, x->skip_block, p->round, 475ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 476ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian pd->dequant[0], eob); 477ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 478ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_8X8: 479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct8x8_1(src_diff, coeff, diff_stride); 480da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_dc(coeff, 64, x->skip_block, p->round, 481ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 482ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian pd->dequant[0], eob); 483ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 484ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_4X4: 485ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 486da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_dc(coeff, 16, x->skip_block, p->round, 487ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 488ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian pd->dequant[0], eob); 489ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 490ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian default: 491ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian assert(0); 492ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 493ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 494ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 495ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 4962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_xform_quant(MACROBLOCK *x, int plane, int block, 4972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 4982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 4992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 5002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 5012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const scan_order *const scan_order = &vp9_default_scan_orders[tx_size]; 502da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 503da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 504da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 5052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 5062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 5072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int i, j; 5082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int16_t *src_diff; 5092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 5102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src_diff = &p->src_diff[4 * (j * diff_stride + i)]; 511ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 512da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 513da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 514da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (tx_size) { 515da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_32X32: 516da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 517da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, 518da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->round, p->quant, p->quant_shift, qcoeff, 519da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dqcoeff, pd->dequant, eob, 520da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 521da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 522da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_16X16: 523da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 524da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 525da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 526da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 527da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 528da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 529da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_8X8: 530da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 531da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, 532da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 533da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 534da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 535da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 536da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_4X4: 537da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 538da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, 539da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 540da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 541da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 542da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian default: 544da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(0); 545da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 546da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 547da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 548da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 549da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 55091037db265ecdd914a26e056cf69207b4f50924ehkuang switch (tx_size) { 551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 5522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 553da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, p->round, 55491037db265ecdd914a26e056cf69207b4f50924ehkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 555da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 5562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 558ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 559da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct16x16(src_diff, coeff, diff_stride); 560da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 56191037db265ecdd914a26e056cf69207b4f50924ehkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 562da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 5632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 566da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_fdct8x8(src_diff, coeff, diff_stride); 567da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, 56891037db265ecdd914a26e056cf69207b4f50924ehkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 569da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 5702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 572ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 5732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 574da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, 57591037db265ecdd914a26e056cf69207b4f50924ehkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 576da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 5772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang default: 580ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(0); 581ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 584ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5851184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void encode_block(int plane, int block, BLOCK_SIZE plane_bsize, 5861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang TX_SIZE tx_size, void *arg) { 587ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct encode_b_args *const args = arg; 588ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCK *const x = args->x; 589ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 5905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang struct optimize_ctx *const ctx = args->ctx; 5912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct macroblock_plane *const p = &x->plane[plane]; 592ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 593da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 5949b35249446b07f40ac5fcc3205f2c048616efacchkuang int i, j; 5959b35249446b07f40ac5fcc3205f2c048616efacchkuang uint8_t *dst; 5962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT *a, *l; 5979b35249446b07f40ac5fcc3205f2c048616efacchkuang txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 5989b35249446b07f40ac5fcc3205f2c048616efacchkuang dst = &pd->dst.buf[4 * j * pd->dst.stride + 4 * i]; 5992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian a = &ctx->ta[plane][i]; 6002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian l = &ctx->tl[plane][j]; 6015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 6025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // TODO(jingning): per transformed block zero forcing only enabled for 6035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // luma component. will integrate chroma components as well. 6045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (x->zcoeff_blk[tx_size][block] && plane == 0) { 6052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian p->eobs[block] = 0; 6062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *a = *l = 0; 6075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang return; 6085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 6095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 610ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (!x->skip_recode) { 611da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (x->quant_fp) { 612da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Encoding process for rtc mode 613da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (x->skip_txfm[0] == SKIP_TXFM_AC_DC && plane == 0) { 614da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // skip forward transform 615da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block] = 0; 616da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *a = *l = 0; 617da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 618da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 619ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vp9_xform_quant_fp(x, plane, block, plane_bsize, tx_size); 620da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 621ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else { 622da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (max_txsize_lookup[plane_bsize] == tx_size) { 623da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int txfm_blk_index = (plane << 2) + (block >> (tx_size << 1)); 624da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (x->skip_txfm[txfm_blk_index] == SKIP_TXFM_NONE) { 625da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // full forward transform and quantization 626da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_xform_quant(x, plane, block, plane_bsize, tx_size); 627da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else if (x->skip_txfm[txfm_blk_index] == SKIP_TXFM_AC_ONLY) { 628da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // fast path forward transform and quantization 629da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_xform_quant_dc(x, plane, block, plane_bsize, tx_size); 630da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 631da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // skip forward transform 632da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block] = 0; 633da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *a = *l = 0; 634da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 635da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 636da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 637da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_xform_quant(x, plane, block, plane_bsize, tx_size); 638da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 639ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 640ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6429b35249446b07f40ac5fcc3205f2c048616efacchkuang if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { 643ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int ctx = combine_entropy_contexts(*a, *l); 644ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *a = *l = optimize_b(x, plane, block, tx_size, ctx) > 0; 6459b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 6462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *a = *l = p->eobs[block] > 0; 6479b35249446b07f40ac5fcc3205f2c048616efacchkuang } 648ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (p->eobs[block]) 6502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *(args->skip) = 0; 6512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (x->skip_encode || p->eobs[block] == 0) 65391037db265ecdd914a26e056cf69207b4f50924ehkuang return; 654da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 655da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 656da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (tx_size) { 657da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_32X32: 658da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_idct32x32_add(dqcoeff, dst, pd->dst.stride, 659da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block], xd->bd); 660da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 661da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_16X16: 662da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_idct16x16_add(dqcoeff, dst, pd->dst.stride, 663da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block], xd->bd); 664da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 665da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_8X8: 666da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_idct8x8_add(dqcoeff, dst, pd->dst.stride, 667da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block], xd->bd); 668da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 669da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_4X4: 670da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // this is like vp9_short_idct4x4 but has a special case around eob<=1 671da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // which is significant (not just an optimization) for the lossless 672da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // case. 673da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->highbd_itxm_add(dqcoeff, dst, pd->dst.stride, 674da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->eobs[block], xd->bd); 675da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 676da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian default: 677da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(0 && "Invalid transform size"); 678da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 679da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 680da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 681da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 68291037db265ecdd914a26e056cf69207b4f50924ehkuang 6831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (tx_size) { 684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 6852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct32x32_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 686ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 687ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 6882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct16x16_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 689ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 6912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct8x8_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 692ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 693ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 69491037db265ecdd914a26e056cf69207b4f50924ehkuang // this is like vp9_short_idct4x4 but has a special case around eob<=1 69591037db265ecdd914a26e056cf69207b4f50924ehkuang // which is significant (not just an optimization) for the lossless 69691037db265ecdd914a26e056cf69207b4f50924ehkuang // case. 697ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian x->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 698ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 6991184aebb761cbeac9124c37189a80a1a58f04b6bhkuang default: 7002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian assert(0 && "Invalid transform size"); 701ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void encode_block_pass1(int plane, int block, BLOCK_SIZE plane_bsize, 7065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang TX_SIZE tx_size, void *arg) { 7072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MACROBLOCK *const x = (MACROBLOCK *)arg; 7085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang MACROBLOCKD *const xd = &x->e_mbd; 7092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct macroblock_plane *const p = &x->plane[plane]; 7105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 711da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 7122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int i, j; 7132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8_t *dst; 7142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 7152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian dst = &pd->dst.buf[4 * j * pd->dst.stride + 4 * i]; 7165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 7172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_xform_quant(x, plane, block, plane_bsize, tx_size); 7185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 719da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (p->eobs[block] > 0) { 720da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 721da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 722da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->highbd_itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block], xd->bd); 723da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 724da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 725da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 726ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian x->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 727da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 7285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 7295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 7302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_encode_sby_pass1(MACROBLOCK *x, BLOCK_SIZE bsize) { 7312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_subtract_plane(x, bsize, 0); 7322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, 0, 7332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian encode_block_pass1, x); 734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7361184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_encode_sb(MACROBLOCK *x, BLOCK_SIZE bsize) { 737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct optimize_ctx ctx; 7394fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 7402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct encode_b_args arg = {x, &ctx, &mbmi->skip}; 7412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int plane; 7422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 743da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mbmi->skip = 1; 744da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 745da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (x->skip) 746da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 747da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 7482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (plane = 0; plane < MAX_MB_PLANE; ++plane) { 7492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!x->skip_recode) 7502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_subtract_plane(x, bsize, plane); 7512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { 7532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblockd_plane* const pd = &xd->plane[plane]; 754ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd) : mbmi->tx_size; 7552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_get_entropy_contexts(bsize, tx_size, pd, 7562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ctx.ta[plane], ctx.tl[plane]); 7572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 758f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 7592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(xd, bsize, plane, encode_block, 7602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian &arg); 761f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang } 762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 764da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, 765da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian TX_SIZE tx_size, void *arg) { 766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct encode_b_args* const args = arg; 767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCK *const x = args->x; 768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 7694fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblock_plane *const p = &x->plane[plane]; 771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 772da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *coeff = BLOCK_OFFSET(p->coeff, block); 773da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); 774da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian tran_low_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 7752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const scan_order *scan_order; 776da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian TX_TYPE tx_type = DCT_DCT; 777ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian PREDICTION_MODE mode; 778da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const int bwl = b_width_log2_lookup[plane_bsize]; 7792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int diff_stride = 4 * (1 << bwl); 78091037db265ecdd914a26e056cf69207b4f50924ehkuang uint8_t *src, *dst; 78191037db265ecdd914a26e056cf69207b4f50924ehkuang int16_t *src_diff; 7822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint16_t *eob = &p->eobs[block]; 7832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int src_stride = p->src.stride; 7842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int dst_stride = pd->dst.stride; 7852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int i, j; 7862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); 7872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian dst = &pd->dst.buf[4 * (j * dst_stride + i)]; 7882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src = &p->src.buf[4 * (j * src_stride + i)]; 7892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src_diff = &p->src_diff[4 * (j * diff_stride + i)]; 790ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 791da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_size == TX_4X4) { 7922263fc984bdc858ee931d3e35c87c404de923950Johann tx_type = get_tx_type_4x4(get_plane_type(plane), xd, block); 793da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order = &vp9_scan_orders[TX_4X4][tx_type]; 794da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mode = plane == 0 ? get_y_mode(xd->mi[0], block) : mbmi->uv_mode; 795da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 796da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; 797da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_size == TX_32X32) { 798da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order = &vp9_default_scan_orders[TX_32X32]; 799da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 8002263fc984bdc858ee931d3e35c87c404de923950Johann tx_type = get_tx_type(get_plane_type(plane), xd); 801da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order = &vp9_scan_orders[tx_size][tx_type]; 802da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 803da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 804da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 805da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_predict_intra_block(xd, bwl, tx_size, mode, x->skip_encode ? src : dst, 806da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->skip_encode ? src_stride : dst_stride, 807da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian dst, dst_stride, i, j, plane); 808da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 809da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 810da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 811da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian switch (tx_size) { 812da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_32X32: 813da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_recode) { 814da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_subtract_block(32, 32, src_diff, diff_stride, 815da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian src, src_stride, dst, dst_stride, xd->bd); 816da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 817da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, 818da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->round, p->quant, p->quant_shift, 819da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian qcoeff, dqcoeff, pd->dequant, eob, 820da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 821da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 822da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 823da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_idct32x32_add(dqcoeff, dst, dst_stride, *eob, xd->bd); 824da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 825da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 826da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_16X16: 827da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_recode) { 828da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_subtract_block(16, 16, src_diff, diff_stride, 829da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian src, src_stride, dst, dst_stride, xd->bd); 830da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_type == DCT_DCT) 831da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 832da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else 833da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_fht16x16(src_diff, coeff, diff_stride, tx_type); 834da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 835da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 836da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 837da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 838da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 839da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 840da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_iht16x16_add(tx_type, dqcoeff, dst, dst_stride, 841da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *eob, xd->bd); 842da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 843da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 844da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_8X8: 845da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_recode) { 846da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_subtract_block(8, 8, src_diff, diff_stride, 847da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian src, src_stride, dst, dst_stride, xd->bd); 848da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_type == DCT_DCT) 849da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 850da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else 851da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_fht8x8(src_diff, coeff, diff_stride, tx_type); 852da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, 853da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 854da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 855da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 856da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 857da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 858da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_iht8x8_add(tx_type, dqcoeff, dst, dst_stride, *eob, 859da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian xd->bd); 860da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 861da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 862da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian case TX_4X4: 863da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_recode) { 864da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_subtract_block(4, 4, src_diff, diff_stride, 865da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian src, src_stride, dst, dst_stride, xd->bd); 866da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_type != DCT_DCT) 867da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_fht4x4(src_diff, coeff, diff_stride, tx_type); 868da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian else 869da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 870da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, 871da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 872da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, 873da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 874da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 875da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 876da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 877da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (tx_type == DCT_DCT) { 878da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // this is like vp9_short_idct4x4 but has a special case around 879da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // eob<=1 which is significant (not just an optimization) for the 880da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // lossless case. 881da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian x->highbd_itxm_add(dqcoeff, dst, dst_stride, *eob, xd->bd); 882da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } else { 883da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_highbd_iht4x4_16_add(dqcoeff, dst, dst_stride, tx_type, xd->bd); 884da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 885da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 886da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian break; 887da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian default: 888da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian assert(0); 889da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 890da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 891da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian if (*eob) 892da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian *(args->skip) = 0; 893da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return; 894da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 895da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 896da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 89791037db265ecdd914a26e056cf69207b4f50924ehkuang switch (tx_size) { 898ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 8999b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 900da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_subtract_block(32, 32, src_diff, diff_stride, 9012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src, src_stride, dst, dst_stride); 9022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 903da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, p->round, 9049b35249446b07f40ac5fcc3205f2c048616efacchkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 905da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 9062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 9079b35249446b07f40ac5fcc3205f2c048616efacchkuang } 90891037db265ecdd914a26e056cf69207b4f50924ehkuang if (!x->skip_encode && *eob) 9092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct32x32_add(dqcoeff, dst, dst_stride, *eob); 910ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 9129b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 913da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_subtract_block(16, 16, src_diff, diff_stride, 9142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src, src_stride, dst, dst_stride); 9152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht16x16(src_diff, coeff, diff_stride, tx_type); 916da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 9179b35249446b07f40ac5fcc3205f2c048616efacchkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 918da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 9192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 9209b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!x->skip_encode && *eob) 9222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht16x16_add(tx_type, dqcoeff, dst, dst_stride, *eob); 923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 924ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 9259b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 926da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_subtract_block(8, 8, src_diff, diff_stride, 9272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src, src_stride, dst, dst_stride); 9282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht8x8(src_diff, coeff, diff_stride, tx_type); 929da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, p->quant, 9309b35249446b07f40ac5fcc3205f2c048616efacchkuang p->quant_shift, qcoeff, dqcoeff, 931da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 9322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 9339b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!x->skip_encode && *eob) 9352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht8x8_add(tx_type, dqcoeff, dst, dst_stride, *eob); 936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 9389b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 939da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_subtract_block(4, 4, src_diff, diff_stride, 9402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian src, src_stride, dst, dst_stride); 9419b35249446b07f40ac5fcc3205f2c048616efacchkuang if (tx_type != DCT_DCT) 9422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht4x4(src_diff, coeff, diff_stride, tx_type); 9439b35249446b07f40ac5fcc3205f2c048616efacchkuang else 9442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian x->fwd_txm4x4(src_diff, coeff, diff_stride); 945da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vpx_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, p->quant, 9469b35249446b07f40ac5fcc3205f2c048616efacchkuang p->quant_shift, qcoeff, dqcoeff, 947da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 9482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 9499b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9509b35249446b07f40ac5fcc3205f2c048616efacchkuang 95191037db265ecdd914a26e056cf69207b4f50924ehkuang if (!x->skip_encode && *eob) { 95291037db265ecdd914a26e056cf69207b4f50924ehkuang if (tx_type == DCT_DCT) 95391037db265ecdd914a26e056cf69207b4f50924ehkuang // this is like vp9_short_idct4x4 but has a special case around eob<=1 95491037db265ecdd914a26e056cf69207b4f50924ehkuang // which is significant (not just an optimization) for the lossless 95591037db265ecdd914a26e056cf69207b4f50924ehkuang // case. 956ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian x->itxm_add(dqcoeff, dst, dst_stride, *eob); 95791037db265ecdd914a26e056cf69207b4f50924ehkuang else 9582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht4x4_16_add(dqcoeff, dst, dst_stride, tx_type); 95991037db265ecdd914a26e056cf69207b4f50924ehkuang } 960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 96191037db265ecdd914a26e056cf69207b4f50924ehkuang default: 96291037db265ecdd914a26e056cf69207b4f50924ehkuang assert(0); 963ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 964ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 9652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (*eob) 9662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *(args->skip) = 0; 967ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 968ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 9692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { 9702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const MACROBLOCKD *const xd = &x->e_mbd; 9714fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang struct encode_b_args arg = {x, NULL, &xd->mi[0]->mbmi.skip}; 9722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 973da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(xd, bsize, plane, 974da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian vp9_encode_block_intra, &arg); 975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 976