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#include "./vp9_rtcd.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h" 145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_dsp/quantize.h" 165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vpx_mem/vpx_mem.h" 177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/mem.h" 185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_idct.h" 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconinter.h" 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_reconintra.h" 227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp9/common/vp9_scan.h" 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_encodemb.h" 25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp9/encoder/vp9_rd.h" 265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_tokenize.h" 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct optimize_ctx { 292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT ta[MAX_MB_PLANE][16]; 302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT tl[MAX_MB_PLANE][16]; 312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_subtract_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblock_plane *const p = &x->plane[plane]; 352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &x->e_mbd.plane[plane]; 362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); 372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize]; 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (x->e_mbd.cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_subtract_block(bh, bw, p->src_diff, bw, p->src.buf, 437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->src.stride, pd->dst.buf, pd->dst.stride, 447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian x->e_mbd.bd); 457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_subtract_block(bh, bw, p->src_diff, bw, p->src.buf, p->src.stride, 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pd->dst.buf, pd->dst.stride); 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 527bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int plane_rd_mult[REF_TYPES][PLANE_TYPES] = { 537bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 10, 6 }, { 8, 5 }, 547bc9febe8749e98a3812a0dc4380ceae75c29450Johann}; 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 56df37111358d02836cb29bbcb9c6e4c95dff90a16Johann// 'num' can be negative, but 'shift' must be non-negative. 57df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#define RIGHT_SHIFT_POSSIBLY_NEGATIVE(num, shift) \ 58df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ((num) >= 0) ? (num) >> (shift) : -((-(num)) >> (shift)) 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 607bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_optimize_b(MACROBLOCK *mb, int plane, int block, TX_SIZE tx_size, 617bc9febe8749e98a3812a0dc4380ceae75c29450Johann int ctx) { 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &mb->e_mbd; 63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian struct macroblock_plane *const p = &mb->plane[plane]; 64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian struct macroblockd_plane *const pd = &xd->plane[plane]; 6568e1c830ade592be74773e249bf94e2bbfb50de7Johann const int ref = is_inter_block(xd->mi[0]); 66ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8_t token_cache[1024]; 67df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int eob = p->eobs[block]; 71df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const PLANE_TYPE plane_type = get_plane_type(plane); 725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const int default_eob = 16 << (tx_size << 1); 7368e1c830ade592be74773e249bf94e2bbfb50de7Johann const int shift = (tx_size == TX_32X32); 747bc9febe8749e98a3812a0dc4380ceae75c29450Johann const int16_t *const dequant_ptr = pd->dequant; 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann const uint8_t *const band_translate = get_band_translate(tx_size); 76df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const scan_order *const so = get_scan(xd, tx_size, plane_type, block); 77ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *const scan = so->scan; 78ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *const nb = so->neighbors; 79df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int64_t rdmult = 80df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ((int64_t)mb->rdmult * plane_rd_mult[ref][plane_type]) >> 1; 8168e1c830ade592be74773e249bf94e2bbfb50de7Johann const int64_t rddiv = mb->rddiv; 82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64_t rd_cost0, rd_cost1; 83df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t rate0, rate1; 847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t t0, t1; 85df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int i, final_eob; 867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 870a39d0a697ff3603e8c100300fda363658e10b23James Zern const uint16_t *cat6_high_cost = vp9_get_high_cost_table(xd->bd); 887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 890a39d0a697ff3603e8c100300fda363658e10b23James Zern const uint16_t *cat6_high_cost = vp9_get_high_cost_table(8); 907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 91df37111358d02836cb29bbcb9c6e4c95dff90a16Johann unsigned int(*const token_costs)[2][COEFF_CONTEXTS][ENTROPY_TOKENS] = 92df37111358d02836cb29bbcb9c6e4c95dff90a16Johann mb->token_costs[tx_size][plane_type][ref]; 93df37111358d02836cb29bbcb9c6e4c95dff90a16Johann unsigned int(*token_costs_cur)[2][COEFF_CONTEXTS][ENTROPY_TOKENS]; 94df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t eob_cost0, eob_cost1; 95df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int ctx0 = ctx; 96df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t accu_rate = 0; 97df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Initialized to the worst possible error for the largest transform size. 98df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // This ensures that it never goes negative. 99df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t accu_error = ((int64_t)1) << 50; 100df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t best_block_rd_cost = INT64_MAX; 101df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int x_prev = 1; 102df37111358d02836cb29bbcb9c6e4c95dff90a16Johann tran_low_t before_best_eob_qc = 0; 103df37111358d02836cb29bbcb9c6e4c95dff90a16Johann tran_low_t before_best_eob_dqc = 0; 104df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 105df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert((!plane_type && !plane) || (plane_type && plane)); 106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang assert(eob <= default_eob); 107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1080a39d0a697ff3603e8c100300fda363658e10b23James Zern for (i = 0; i < eob; i++) { 1090a39d0a697ff3603e8c100300fda363658e10b23James Zern const int rc = scan[i]; 1100a39d0a697ff3603e8c100300fda363658e10b23James Zern token_cache[rc] = vp9_pt_energy_class[vp9_get_token(qcoeff[rc])]; 1110a39d0a697ff3603e8c100300fda363658e10b23James Zern } 112df37111358d02836cb29bbcb9c6e4c95dff90a16Johann final_eob = 0; 113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 114df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Initial RD cost. 115df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_costs_cur = token_costs + band_translate[0]; 116df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rate0 = (*token_costs_cur)[0][ctx0][EOB_TOKEN]; 117df37111358d02836cb29bbcb9c6e4c95dff90a16Johann best_block_rd_cost = RDCOST(rdmult, rddiv, rate0, accu_error); 118df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 119df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // For each token, pick one of two choices greedily: 120df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // (i) First candidate: Keep current quantized value, OR 121df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // (ii) Second candidate: Reduce quantized value by 1. 122df37111358d02836cb29bbcb9c6e4c95dff90a16Johann for (i = 0; i < eob; i++) { 123ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int rc = scan[i]; 124df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int x = qcoeff[rc]; 125df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int band_cur = band_translate[i]; 126df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int ctx_cur = (i == 0) ? ctx : get_coef_context(nb, token_cache, i); 127df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int token_tree_sel_cur = (x_prev == 0); 128df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_costs_cur = token_costs + band_cur; 129df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (x == 0) { // No need to search 130df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int token = vp9_get_token(x); 131df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rate0 = (*token_costs_cur)[token_tree_sel_cur][ctx_cur][token]; 132df37111358d02836cb29bbcb9c6e4c95dff90a16Johann accu_rate += rate0; 133df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x_prev = 0; 134df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Note: accu_error does not change. 135df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { 136df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int dqv = dequant_ptr[rc != 0]; 137df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Compute the distortion for quantizing to 0. 138df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff_for_zero_raw = (0 - coeff[rc]) * (1 << shift); 139df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff_for_zero = 1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 141df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) 142df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ? RIGHT_SHIFT_POSSIBLY_NEGATIVE(diff_for_zero_raw, xd->bd - 8) 143df37111358d02836cb29bbcb9c6e4c95dff90a16Johann : 144df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif 145df37111358d02836cb29bbcb9c6e4c95dff90a16Johann diff_for_zero_raw; 146df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int64_t distortion_for_zero = 147df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (int64_t)diff_for_zero * diff_for_zero; 148df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 149df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Compute the distortion for the first candidate 150df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff0_raw = (dqcoeff[rc] - coeff[rc]) * (1 << shift); 151df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff0 = 152df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_VP9_HIGHBITDEPTH 153df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) 154df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ? RIGHT_SHIFT_POSSIBLY_NEGATIVE(diff0_raw, xd->bd - 8) 155df37111358d02836cb29bbcb9c6e4c95dff90a16Johann : 1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 157df37111358d02836cb29bbcb9c6e4c95dff90a16Johann diff0_raw; 158df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int64_t distortion0 = (int64_t)diff0 * diff0; 159df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 160df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Compute the distortion for the second candidate 161df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int sign = -(x < 0); // -1 if x is negative and 0 otherwise. 162df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int x1 = x - 2 * sign - 1; // abs(x1) = abs(x) - 1. 163df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t distortion1; 164df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (x1 != 0) { 165df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int dqv_step = 166df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_VP9_HIGHBITDEPTH 167df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) ? dqv >> (xd->bd - 8) 168df37111358d02836cb29bbcb9c6e4c95dff90a16Johann : 169df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif // CONFIG_VP9_HIGHBITDEPTH 170df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqv; 171df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff_step = (dqv_step + sign) ^ sign; 172df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int diff1 = diff0 - diff_step; 173df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(dqv > 0); // We aren't right shifting a negative number above. 174df37111358d02836cb29bbcb9c6e4c95dff90a16Johann distortion1 = (int64_t)diff1 * diff1; 17568e1c830ade592be74773e249bf94e2bbfb50de7Johann } else { 176df37111358d02836cb29bbcb9c6e4c95dff90a16Johann distortion1 = distortion_for_zero; 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 178df37111358d02836cb29bbcb9c6e4c95dff90a16Johann { 179df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Calculate RDCost for current coeff for the two candidates. 180df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int64_t base_bits0 = vp9_get_token_cost(x, &t0, cat6_high_cost); 181df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int64_t base_bits1 = vp9_get_token_cost(x1, &t1, cat6_high_cost); 182df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rate0 = 183df37111358d02836cb29bbcb9c6e4c95dff90a16Johann base_bits0 + (*token_costs_cur)[token_tree_sel_cur][ctx_cur][t0]; 184df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rate1 = 185df37111358d02836cb29bbcb9c6e4c95dff90a16Johann base_bits1 + (*token_costs_cur)[token_tree_sel_cur][ctx_cur][t1]; 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 187df37111358d02836cb29bbcb9c6e4c95dff90a16Johann { 188df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int rdcost_better_for_x1, eob_rdcost_better_for_x1; 189df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int dqc0, dqc1; 190df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t best_eob_cost_cur; 191df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int use_x1; 192df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 193df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Calculate RD Cost effect on the next coeff for the two candidates. 194df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t next_bits0 = 0; 195df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t next_bits1 = 0; 196df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t next_eob_bits0 = 0; 197df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int64_t next_eob_bits1 = 0; 198df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (i < default_eob - 1) { 199df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int ctx_next, token_tree_sel_next; 200df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int band_next = band_translate[i + 1]; 201df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int token_next = 202df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (i + 1 != eob) ? vp9_get_token(qcoeff[scan[i + 1]]) : EOB_TOKEN; 203df37111358d02836cb29bbcb9c6e4c95dff90a16Johann unsigned int( 204df37111358d02836cb29bbcb9c6e4c95dff90a16Johann *const token_costs_next)[2][COEFF_CONTEXTS][ENTROPY_TOKENS] = 205df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_costs + band_next; 206df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_cache[rc] = vp9_pt_energy_class[t0]; 207df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ctx_next = get_coef_context(nb, token_cache, i + 1); 208df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_tree_sel_next = (x == 0); 209df37111358d02836cb29bbcb9c6e4c95dff90a16Johann next_bits0 = 210df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (*token_costs_next)[token_tree_sel_next][ctx_next][token_next]; 211df37111358d02836cb29bbcb9c6e4c95dff90a16Johann next_eob_bits0 = 212df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (*token_costs_next)[token_tree_sel_next][ctx_next][EOB_TOKEN]; 213df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_cache[rc] = vp9_pt_energy_class[t1]; 214df37111358d02836cb29bbcb9c6e4c95dff90a16Johann ctx_next = get_coef_context(nb, token_cache, i + 1); 215df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_tree_sel_next = (x1 == 0); 216df37111358d02836cb29bbcb9c6e4c95dff90a16Johann next_bits1 = 217df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (*token_costs_next)[token_tree_sel_next][ctx_next][token_next]; 218df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (x1 != 0) { 219df37111358d02836cb29bbcb9c6e4c95dff90a16Johann next_eob_bits1 = 220df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (*token_costs_next)[token_tree_sel_next][ctx_next][EOB_TOKEN]; 221df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 224df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Compare the total RD costs for two candidates. 225df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rd_cost0 = RDCOST(rdmult, rddiv, (rate0 + next_bits0), distortion0); 226df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rd_cost1 = RDCOST(rdmult, rddiv, (rate1 + next_bits1), distortion1); 227df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rdcost_better_for_x1 = (rd_cost1 < rd_cost0); 228df37111358d02836cb29bbcb9c6e4c95dff90a16Johann eob_cost0 = RDCOST(rdmult, rddiv, (accu_rate + rate0 + next_eob_bits0), 229df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (accu_error + distortion0 - distortion_for_zero)); 230df37111358d02836cb29bbcb9c6e4c95dff90a16Johann eob_cost1 = eob_cost0; 231df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (x1 != 0) { 232df37111358d02836cb29bbcb9c6e4c95dff90a16Johann eob_cost1 = 233df37111358d02836cb29bbcb9c6e4c95dff90a16Johann RDCOST(rdmult, rddiv, (accu_rate + rate1 + next_eob_bits1), 234df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (accu_error + distortion1 - distortion_for_zero)); 235df37111358d02836cb29bbcb9c6e4c95dff90a16Johann eob_rdcost_better_for_x1 = (eob_cost1 < eob_cost0); 236df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { 237df37111358d02836cb29bbcb9c6e4c95dff90a16Johann eob_rdcost_better_for_x1 = 0; 238df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 240df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Calculate the two candidate de-quantized values. 241df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqc0 = dqcoeff[rc]; 242df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqc1 = 0; 243df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (rdcost_better_for_x1 + eob_rdcost_better_for_x1) { 244df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (x1 != 0) { 245df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqc1 = RIGHT_SHIFT_POSSIBLY_NEGATIVE(x1 * dqv, shift); 246df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { 247df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqc1 = 0; 248df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 249df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 25068e1c830ade592be74773e249bf94e2bbfb50de7Johann 251df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Pick and record the better quantized and de-quantized values. 252df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (rdcost_better_for_x1) { 253df37111358d02836cb29bbcb9c6e4c95dff90a16Johann qcoeff[rc] = x1; 254df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqcoeff[rc] = dqc1; 255df37111358d02836cb29bbcb9c6e4c95dff90a16Johann accu_rate += rate1; 256df37111358d02836cb29bbcb9c6e4c95dff90a16Johann accu_error += distortion1 - distortion_for_zero; 257df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(distortion1 <= distortion_for_zero); 258df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_cache[rc] = vp9_pt_energy_class[t1]; 259df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { 260df37111358d02836cb29bbcb9c6e4c95dff90a16Johann accu_rate += rate0; 261df37111358d02836cb29bbcb9c6e4c95dff90a16Johann accu_error += distortion0 - distortion_for_zero; 262df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(distortion0 <= distortion_for_zero); 263df37111358d02836cb29bbcb9c6e4c95dff90a16Johann token_cache[rc] = vp9_pt_energy_class[t0]; 264df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 265df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(accu_error >= 0); 266df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x_prev = qcoeff[rc]; // Update based on selected quantized value. 267df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 268df37111358d02836cb29bbcb9c6e4c95dff90a16Johann use_x1 = (x1 != 0) && eob_rdcost_better_for_x1; 269df37111358d02836cb29bbcb9c6e4c95dff90a16Johann best_eob_cost_cur = use_x1 ? eob_cost1 : eob_cost0; 270df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 271df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Determine whether to move the eob position to i+1 272df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (best_eob_cost_cur < best_block_rd_cost) { 273df37111358d02836cb29bbcb9c6e4c95dff90a16Johann best_block_rd_cost = best_eob_cost_cur; 274df37111358d02836cb29bbcb9c6e4c95dff90a16Johann final_eob = i + 1; 275df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (use_x1) { 276df37111358d02836cb29bbcb9c6e4c95dff90a16Johann before_best_eob_qc = x1; 277df37111358d02836cb29bbcb9c6e4c95dff90a16Johann before_best_eob_dqc = dqc1; 278df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { 279df37111358d02836cb29bbcb9c6e4c95dff90a16Johann before_best_eob_qc = x; 280df37111358d02836cb29bbcb9c6e4c95dff90a16Johann before_best_eob_dqc = dqc0; 281df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 282df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2840a39d0a697ff3603e8c100300fda363658e10b23James Zern } 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 286df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(final_eob <= eob); 287df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (final_eob > 0) { 288df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int rc; 289df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(before_best_eob_qc != 0); 290df37111358d02836cb29bbcb9c6e4c95dff90a16Johann i = final_eob - 1; 291df37111358d02836cb29bbcb9c6e4c95dff90a16Johann rc = scan[i]; 292df37111358d02836cb29bbcb9c6e4c95dff90a16Johann qcoeff[rc] = before_best_eob_qc; 293df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqcoeff[rc] = before_best_eob_dqc; 294df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 295df37111358d02836cb29bbcb9c6e4c95dff90a16Johann for (i = final_eob; i < eob; i++) { 296df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int rc = scan[i]; 297df37111358d02836cb29bbcb9c6e4c95dff90a16Johann qcoeff[rc] = 0; 298df37111358d02836cb29bbcb9c6e4c95dff90a16Johann dqcoeff[rc] = 0; 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 3002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian mb->plane[plane].eobs[block] = final_eob; 301ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian return final_eob; 302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 303df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#undef RIGHT_SHIFT_POSSIBLY_NEGATIVE 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3057bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic INLINE void fdct32x32(int rd_transform, const int16_t *src, 3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann tran_low_t *dst, int src_stride) { 3077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (rd_transform) 3087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct32x32_rd(src, dst, src_stride); 3097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 3107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct32x32(src, dst, src_stride); 3117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 3127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 3137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 3147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE void highbd_fdct32x32(int rd_transform, const int16_t *src, 3157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *dst, int src_stride) { 3162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (rd_transform) 3177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct32x32_rd(src, dst, src_stride); 3182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian else 3197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct32x32(src, dst, src_stride); 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 3217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3237bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_xform_quant_fp(MACROBLOCK *x, int plane, int block, int row, int col, 324ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 325ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 326ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 327ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 328ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const scan_order *const scan_order = &vp9_default_scan_orders[tx_size]; 3297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 3307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 3317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 332ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 333ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *src_diff; 3357bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_diff = &p->src_diff[4 * (row * diff_stride + col)]; 336df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // skip block condition should be handled before this is called. 337df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(!x->skip_block); 338ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 3397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 3407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 3417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian switch (tx_size) { 3427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_32X32: 3437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 3440a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_quantize_fp_32x32(coeff, 1024, x->skip_block, p->round_fp, 3450a39d0a697ff3603e8c100300fda363658e10b23James Zern p->quant_fp, qcoeff, dqcoeff, pd->dequant, 3460a39d0a697ff3603e8c100300fda363658e10b23James Zern eob, scan_order->scan, scan_order->iscan); 3477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 3487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_16X16: 3497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 3500a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_quantize_fp(coeff, 256, x->skip_block, p->round_fp, 3510a39d0a697ff3603e8c100300fda363658e10b23James Zern p->quant_fp, qcoeff, dqcoeff, pd->dequant, eob, 3520a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->scan, scan_order->iscan); 3537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 3547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_8X8: 3557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 3560a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_quantize_fp(coeff, 64, x->skip_block, p->round_fp, 3570a39d0a697ff3603e8c100300fda363658e10b23James Zern p->quant_fp, qcoeff, dqcoeff, pd->dequant, eob, 3580a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->scan, scan_order->iscan); 3597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 3607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_4X4: 361df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 3620a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_quantize_fp(coeff, 16, x->skip_block, p->round_fp, 3630a39d0a697ff3603e8c100300fda363658e10b23James Zern p->quant_fp, qcoeff, dqcoeff, pd->dequant, eob, 3640a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->scan, scan_order->iscan); 3657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 3667bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); 3677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 3687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 3697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 3707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 3717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 372ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (tx_size) { 373ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_32X32: 374ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 3750a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_quantize_fp_32x32(coeff, 1024, x->skip_block, p->round_fp, 3760a39d0a697ff3603e8c100300fda363658e10b23James Zern p->quant_fp, qcoeff, dqcoeff, pd->dequant, eob, 3770a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->scan, scan_order->iscan); 378ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 379ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_16X16: 3807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct16x16(src_diff, coeff, diff_stride); 3810a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_quantize_fp(coeff, 256, x->skip_block, p->round_fp, p->quant_fp, 3820a39d0a697ff3603e8c100300fda363658e10b23James Zern qcoeff, dqcoeff, pd->dequant, eob, scan_order->scan, 3830a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->iscan); 384ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 385ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_8X8: 3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_fdct8x8_quant(src_diff, diff_stride, coeff, 64, x->skip_block, 3870a39d0a697ff3603e8c100300fda363658e10b23James Zern p->round_fp, p->quant_fp, qcoeff, dqcoeff, pd->dequant, 3880a39d0a697ff3603e8c100300fda363658e10b23James Zern eob, scan_order->scan, scan_order->iscan); 389ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 390ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_4X4: 391df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 3920a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_quantize_fp(coeff, 16, x->skip_block, p->round_fp, p->quant_fp, 3930a39d0a697ff3603e8c100300fda363658e10b23James Zern qcoeff, dqcoeff, pd->dequant, eob, scan_order->scan, 3940a39d0a697ff3603e8c100300fda363658e10b23James Zern scan_order->iscan); 395ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); break; 397ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 398ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 399ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 4007bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_xform_quant_dc(MACROBLOCK *x, int plane, int block, int row, int col, 401ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 402ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 403ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 404ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 4057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 4067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 4077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 408ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 409ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 410ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int16_t *src_diff; 4117bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_diff = &p->src_diff[4 * (row * diff_stride + col)]; 412df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // skip block condition should be handled before this is called. 413df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(!x->skip_block); 414df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 4157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 4167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 4177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian switch (tx_size) { 4187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_32X32: 4197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct32x32_1(src_diff, coeff, diff_stride); 4207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_dc_32x32(coeff, x->skip_block, p->round, 4217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant_fp[0], qcoeff, dqcoeff, 4227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian pd->dequant[0], eob); 4237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 4247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_16X16: 4257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct16x16_1(src_diff, coeff, diff_stride); 4267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 256, x->skip_block, p->round, 4277bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_fp[0], qcoeff, dqcoeff, pd->dequant[0], 4287bc9febe8749e98a3812a0dc4380ceae75c29450Johann eob); 4297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 4307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_8X8: 4317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct8x8_1(src_diff, coeff, diff_stride); 4327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 64, x->skip_block, p->round, 4337bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_fp[0], qcoeff, dqcoeff, pd->dequant[0], 4347bc9febe8749e98a3812a0dc4380ceae75c29450Johann eob); 4357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 4367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_4X4: 437df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 4387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_dc(coeff, 16, x->skip_block, p->round, 4397bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_fp[0], qcoeff, dqcoeff, pd->dequant[0], 4407bc9febe8749e98a3812a0dc4380ceae75c29450Johann eob); 4417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 4427bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); 4437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 4447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 4457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 4467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 4477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 448ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (tx_size) { 449ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_32X32: 4507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct32x32_1(src_diff, coeff, diff_stride); 4517bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_dc_32x32(coeff, x->skip_block, p->round, p->quant_fp[0], 4527bc9febe8749e98a3812a0dc4380ceae75c29450Johann qcoeff, dqcoeff, pd->dequant[0], eob); 453ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 454ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_16X16: 4557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct16x16_1(src_diff, coeff, diff_stride); 4567bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_dc(coeff, 256, x->skip_block, p->round, p->quant_fp[0], 4577bc9febe8749e98a3812a0dc4380ceae75c29450Johann qcoeff, dqcoeff, pd->dequant[0], eob); 458ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 459ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_8X8: 4607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct8x8_1(src_diff, coeff, diff_stride); 4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_dc(coeff, 64, x->skip_block, p->round, p->quant_fp[0], 4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann qcoeff, dqcoeff, pd->dequant[0], eob); 463ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 464ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case TX_4X4: 465df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_dc(coeff, 16, x->skip_block, p->round, p->quant_fp[0], 4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann qcoeff, dqcoeff, pd->dequant[0], eob); 468ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 4697bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); break; 470ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 471ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 472ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 4737bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_xform_quant(MACROBLOCK *x, int plane, int block, int row, int col, 4742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { 4752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MACROBLOCKD *const xd = &x->e_mbd; 4762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblock_plane *const p = &x->plane[plane]; 4772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct macroblockd_plane *const pd = &xd->plane[plane]; 4782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const scan_order *const scan_order = &vp9_default_scan_orders[tx_size]; 4797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const coeff = BLOCK_OFFSET(p->coeff, block); 4807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); 4817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 4822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint16_t *const eob = &p->eobs[block]; 4832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; 4842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int16_t *src_diff; 4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_diff = &p->src_diff[4 * (row * diff_stride + col)]; 486df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // skip block condition should be handled before this is called. 487df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(!x->skip_block); 488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 4907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 4917bc9febe8749e98a3812a0dc4380ceae75c29450Johann switch (tx_size) { 4927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_32X32: 4937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 4947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, 4957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->round, p->quant, p->quant_shift, qcoeff, 4967bc9febe8749e98a3812a0dc4380ceae75c29450Johann dqcoeff, pd->dequant, eob, scan_order->scan, 4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 4987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 4997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_16X16: 5007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 5017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 5027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 5037bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 5057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 5067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_8X8: 5077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 5087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, 5097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 5117bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 5127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 5137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_4X4: 514df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 5157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, 5167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 5177bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 5197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); 5217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 5227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 5237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 5247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 5257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 52691037db265ecdd914a26e056cf69207b4f50924ehkuang switch (tx_size) { 527ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 5282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 5297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, p->round, 53091037db265ecdd914a26e056cf69207b4f50924ehkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 5317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 5322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 533ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 5357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct16x16(src_diff, coeff, diff_stride); 5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, p->quant, 5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 5382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 539ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 5417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_fdct8x8(src_diff, coeff, diff_stride); 5427bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, p->quant, 5437bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 5442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 547df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, p->quant, 5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 5502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 5527bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); break; 553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5567bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void encode_block(int plane, int block, int row, int col, 5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) { 558ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct encode_b_args *const args = arg; 559ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCK *const x = args->x; 560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 5612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct macroblock_plane *const p = &x->plane[plane]; 562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 5637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 5649b35249446b07f40ac5fcc3205f2c048616efacchkuang uint8_t *dst; 5652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ENTROPY_CONTEXT *a, *l; 5667bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst = &pd->dst.buf[4 * row * pd->dst.stride + 4 * col]; 5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann a = &args->ta[col]; 5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann l = &args->tl[row]; 5695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 5705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // TODO(jingning): per transformed block zero forcing only enabled for 5715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // luma component. will integrate chroma components as well. 5725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (x->zcoeff_blk[tx_size][block] && plane == 0) { 5732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian p->eobs[block] = 0; 5742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *a = *l = 0; 5755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang return; 5765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 5775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 578ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (!x->skip_recode) { 5797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (x->quant_fp) { 5807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // Encoding process for rtc mode 5817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (x->skip_txfm[0] == SKIP_TXFM_AC_DC && plane == 0) { 5827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // skip forward transform 5837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->eobs[block] = 0; 5847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *a = *l = 0; 5857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 5867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 5877bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_xform_quant_fp(x, plane, block, row, col, plane_bsize, tx_size); 5887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 589ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else { 5907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (max_txsize_lookup[plane_bsize] == tx_size) { 5917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int txfm_blk_index = (plane << 2) + (block >> (tx_size << 1)); 5927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (x->skip_txfm[txfm_blk_index] == SKIP_TXFM_NONE) { 5937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // full forward transform and quantization 5947bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_xform_quant(x, plane, block, row, col, plane_bsize, tx_size); 5957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else if (x->skip_txfm[txfm_blk_index] == SKIP_TXFM_AC_ONLY) { 5967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // fast path forward transform and quantization 5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_xform_quant_dc(x, plane, block, row, col, plane_bsize, tx_size); 5987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 5997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // skip forward transform 6007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->eobs[block] = 0; 6017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *a = *l = 0; 6027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 6037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_xform_quant(x, plane, block, row, col, plane_bsize, tx_size); 6067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 607ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 608ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6109b35249446b07f40ac5fcc3205f2c048616efacchkuang if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { 611ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int ctx = combine_entropy_contexts(*a, *l); 6127bc9febe8749e98a3812a0dc4380ceae75c29450Johann *a = *l = vp9_optimize_b(x, plane, block, tx_size, ctx) > 0; 6139b35249446b07f40ac5fcc3205f2c048616efacchkuang } else { 6142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *a = *l = p->eobs[block] > 0; 6159b35249446b07f40ac5fcc3205f2c048616efacchkuang } 616ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6177bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (p->eobs[block]) *(args->skip) = 0; 6182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6197bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (x->skip_encode || p->eobs[block] == 0) return; 6207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 6217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 6220a39d0a697ff3603e8c100300fda363658e10b23James Zern uint16_t *const dst16 = CONVERT_TO_SHORTPTR(dst); 6237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian switch (tx_size) { 6247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_32X32: 6250a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_idct32x32_add(dqcoeff, dst16, pd->dst.stride, p->eobs[block], 6267bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->bd); 6277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_16X16: 6290a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_idct16x16_add(dqcoeff, dst16, pd->dst.stride, p->eobs[block], 6307bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->bd); 6317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_8X8: 6330a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_idct8x8_add(dqcoeff, dst16, pd->dst.stride, p->eobs[block], 6347bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->bd); 6357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_4X4: 6377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // this is like vp9_short_idct4x4 but has a special case around eob<=1 6387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // which is significant (not just an optimization) for the lossless 6397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // case. 640df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->highbd_inv_txfm_add(dqcoeff, dst16, pd->dst.stride, p->eobs[block], 641df37111358d02836cb29bbcb9c6e4c95dff90a16Johann xd->bd); 6427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6437bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0 && "Invalid transform size"); 6447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 6467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 64891037db265ecdd914a26e056cf69207b4f50924ehkuang 6491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang switch (tx_size) { 650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 6512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct32x32_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 6542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct16x16_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 655ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 6572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct8x8_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 658ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 66091037db265ecdd914a26e056cf69207b4f50924ehkuang // this is like vp9_short_idct4x4 but has a special case around eob<=1 66191037db265ecdd914a26e056cf69207b4f50924ehkuang // which is significant (not just an optimization) for the lossless 66291037db265ecdd914a26e056cf69207b4f50924ehkuang // case. 663df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->inv_txfm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 6657bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0 && "Invalid transform size"); break; 666ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 6697bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void encode_block_pass1(int plane, int block, int row, int col, 6707bc9febe8749e98a3812a0dc4380ceae75c29450Johann BLOCK_SIZE plane_bsize, TX_SIZE tx_size, 6717bc9febe8749e98a3812a0dc4380ceae75c29450Johann void *arg) { 6722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MACROBLOCK *const x = (MACROBLOCK *)arg; 6735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang MACROBLOCKD *const xd = &x->e_mbd; 6742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct macroblock_plane *const p = &x->plane[plane]; 6755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 6767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 6772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8_t *dst; 6787bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst = &pd->dst.buf[4 * row * pd->dst.stride + 4 * col]; 6795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 6807bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_xform_quant(x, plane, block, row, col, plane_bsize, tx_size); 6815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 6827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (p->eobs[block] > 0) { 6837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 6847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 685df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->highbd_inv_txfm_add(dqcoeff, CONVERT_TO_SHORTPTR(dst), pd->dst.stride, 686df37111358d02836cb29bbcb9c6e4c95dff90a16Johann p->eobs[block], xd->bd); 6877bc9febe8749e98a3812a0dc4380ceae75c29450Johann return; 6887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 690df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->inv_txfm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); 6917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} 6935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 6942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_encode_sby_pass1(MACROBLOCK *x, BLOCK_SIZE bsize) { 6952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_subtract_plane(x, bsize, 0); 6962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, 0, 6972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian encode_block_pass1, x); 698ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 699ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7001184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_encode_sb(MACROBLOCK *x, BLOCK_SIZE bsize) { 701ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct optimize_ctx ctx; 70368e1c830ade592be74773e249bf94e2bbfb50de7Johann MODE_INFO *mi = xd->mi[0]; 7047bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct encode_b_args arg = { x, 1, NULL, NULL, &mi->skip }; 7052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int plane; 7062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 70768e1c830ade592be74773e249bf94e2bbfb50de7Johann mi->skip = 1; 7087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 7097bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (x->skip) return; 7107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 7112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (plane = 0; plane < MAX_MB_PLANE; ++plane) { 7127bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!x->skip_recode) vp9_subtract_plane(x, bsize, plane); 7132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { 7157bc9febe8749e98a3812a0dc4380ceae75c29450Johann const struct macroblockd_plane *const pd = &xd->plane[plane]; 71668e1c830ade592be74773e249bf94e2bbfb50de7Johann const TX_SIZE tx_size = plane ? get_uv_tx_size(mi, pd) : mi->tx_size; 7177bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp9_get_entropy_contexts(bsize, tx_size, pd, ctx.ta[plane], 7187bc9febe8749e98a3812a0dc4380ceae75c29450Johann ctx.tl[plane]); 7197bc9febe8749e98a3812a0dc4380ceae75c29450Johann arg.enable_coeff_opt = 1; 7207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7217bc9febe8749e98a3812a0dc4380ceae75c29450Johann arg.enable_coeff_opt = 0; 7222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 7237bc9febe8749e98a3812a0dc4380ceae75c29450Johann arg.ta = ctx.ta[plane]; 7247bc9febe8749e98a3812a0dc4380ceae75c29450Johann arg.tl = ctx.tl[plane]; 725f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 7262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(xd, bsize, plane, encode_block, 7272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian &arg); 728f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang } 729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7317bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_encode_block_intra(int plane, int block, int row, int col, 7327bc9febe8749e98a3812a0dc4380ceae75c29450Johann BLOCK_SIZE plane_bsize, TX_SIZE tx_size, 7337bc9febe8749e98a3812a0dc4380ceae75c29450Johann void *arg) { 7347bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct encode_b_args *const args = arg; 735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCK *const x = args->x; 736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &x->e_mbd; 73768e1c830ade592be74773e249bf94e2bbfb50de7Johann MODE_INFO *mi = xd->mi[0]; 738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblock_plane *const p = &x->plane[plane]; 739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblockd_plane *const pd = &xd->plane[plane]; 7407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *coeff = BLOCK_OFFSET(p->coeff, block); 7417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); 7427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tran_low_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); 7432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const scan_order *scan_order; 7447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian TX_TYPE tx_type = DCT_DCT; 745ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian PREDICTION_MODE mode; 7467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int bwl = b_width_log2_lookup[plane_bsize]; 7472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int diff_stride = 4 * (1 << bwl); 74891037db265ecdd914a26e056cf69207b4f50924ehkuang uint8_t *src, *dst; 74991037db265ecdd914a26e056cf69207b4f50924ehkuang int16_t *src_diff; 7502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint16_t *eob = &p->eobs[block]; 7512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int src_stride = p->src.stride; 7522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int dst_stride = pd->dst.stride; 75368e1c830ade592be74773e249bf94e2bbfb50de7Johann ENTROPY_CONTEXT *a = NULL; 75468e1c830ade592be74773e249bf94e2bbfb50de7Johann ENTROPY_CONTEXT *l = NULL; 75568e1c830ade592be74773e249bf94e2bbfb50de7Johann int entropy_ctx = 0; 7567bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst = &pd->dst.buf[4 * (row * dst_stride + col)]; 7577bc9febe8749e98a3812a0dc4380ceae75c29450Johann src = &p->src.buf[4 * (row * src_stride + col)]; 7587bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_diff = &p->src_diff[4 * (row * diff_stride + col)]; 7597bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (args->enable_coeff_opt) { 7607bc9febe8749e98a3812a0dc4380ceae75c29450Johann a = &args->ta[col]; 7617bc9febe8749e98a3812a0dc4380ceae75c29450Johann l = &args->tl[row]; 76268e1c830ade592be74773e249bf94e2bbfb50de7Johann entropy_ctx = combine_entropy_contexts(*a, *l); 76368e1c830ade592be74773e249bf94e2bbfb50de7Johann } 764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_size == TX_4X4) { 766c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann tx_type = get_tx_type_4x4(get_plane_type(plane), xd, block); 7677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian scan_order = &vp9_scan_orders[TX_4X4][tx_type]; 76868e1c830ade592be74773e249bf94e2bbfb50de7Johann mode = plane == 0 ? get_y_mode(xd->mi[0], block) : mi->uv_mode; 7697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 77068e1c830ade592be74773e249bf94e2bbfb50de7Johann mode = plane == 0 ? mi->mode : mi->uv_mode; 7717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_size == TX_32X32) { 7727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian scan_order = &vp9_default_scan_orders[TX_32X32]; 7737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 774c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann tx_type = get_tx_type(get_plane_type(plane), xd); 7757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian scan_order = &vp9_scan_orders[tx_size][tx_type]; 7767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 7777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 7787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 7790a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_predict_intra_block( 7800a39d0a697ff3603e8c100300fda363658e10b23James Zern xd, bwl, tx_size, mode, (x->skip_encode || x->fp_src_pred) ? src : dst, 7810a39d0a697ff3603e8c100300fda363658e10b23James Zern (x->skip_encode || x->fp_src_pred) ? src_stride : dst_stride, dst, 7820a39d0a697ff3603e8c100300fda363658e10b23James Zern dst_stride, col, row, plane); 7837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 784df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // skip block condition should be handled before this is called. 785df37111358d02836cb29bbcb9c6e4c95dff90a16Johann assert(!x->skip_block); 786df37111358d02836cb29bbcb9c6e4c95dff90a16Johann 7877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 7887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 7890a39d0a697ff3603e8c100300fda363658e10b23James Zern uint16_t *const dst16 = CONVERT_TO_SHORTPTR(dst); 7907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian switch (tx_size) { 7917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_32X32: 7927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_recode) { 7937bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_highbd_subtract_block(32, 32, src_diff, diff_stride, src, 7947bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_stride, dst, dst_stride, xd->bd); 7957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 7967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, 7977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->round, p->quant, p->quant_shift, 7987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian qcoeff, dqcoeff, pd->dequant, eob, 7997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian scan_order->scan, scan_order->iscan); 8007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8010a39d0a697ff3603e8c100300fda363658e10b23James Zern if (args->enable_coeff_opt && !x->skip_recode) { 8020a39d0a697ff3603e8c100300fda363658e10b23James Zern *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 8030a39d0a697ff3603e8c100300fda363658e10b23James Zern } 8047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 8050a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_idct32x32_add(dqcoeff, dst16, dst_stride, *eob, xd->bd); 8067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 8087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_16X16: 8097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_recode) { 8107bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_highbd_subtract_block(16, 16, src_diff, diff_stride, src, 8117bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_stride, dst, dst_stride, xd->bd); 8127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_type == DCT_DCT) 8137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct16x16(src_diff, coeff, diff_stride); 8147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 8157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vp9_highbd_fht16x16(src_diff, coeff, diff_stride, tx_type); 8167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, 8177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 8187bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 8197bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 8207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8210a39d0a697ff3603e8c100300fda363658e10b23James Zern if (args->enable_coeff_opt && !x->skip_recode) { 8220a39d0a697ff3603e8c100300fda363658e10b23James Zern *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 8230a39d0a697ff3603e8c100300fda363658e10b23James Zern } 8247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 8250a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_iht16x16_add(tx_type, dqcoeff, dst16, dst_stride, *eob, 8267bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->bd); 8277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 8297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_8X8: 8307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_recode) { 8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_highbd_subtract_block(8, 8, src_diff, diff_stride, src, 8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_stride, dst, dst_stride, xd->bd); 8337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_type == DCT_DCT) 8347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_fdct8x8(src_diff, coeff, diff_stride); 8357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 8367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vp9_highbd_fht8x8(src_diff, coeff, diff_stride, tx_type); 8377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, 8387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 8397bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 8407bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 8417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8420a39d0a697ff3603e8c100300fda363658e10b23James Zern if (args->enable_coeff_opt && !x->skip_recode) { 8430a39d0a697ff3603e8c100300fda363658e10b23James Zern *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 8440a39d0a697ff3603e8c100300fda363658e10b23James Zern } 8457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 8460a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_iht8x8_add(tx_type, dqcoeff, dst16, dst_stride, *eob, 8477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian xd->bd); 8487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 8507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case TX_4X4: 8517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_recode) { 8527bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_highbd_subtract_block(4, 4, src_diff, diff_stride, src, 8537bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_stride, dst, dst_stride, xd->bd); 8547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_type != DCT_DCT) 8557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vp9_highbd_fht4x4(src_diff, coeff, diff_stride, tx_type); 8567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 857df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 8587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_highbd_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, 8597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian p->quant, p->quant_shift, qcoeff, dqcoeff, 8607bc9febe8749e98a3812a0dc4380ceae75c29450Johann pd->dequant, eob, scan_order->scan, 8617bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->iscan); 8627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8630a39d0a697ff3603e8c100300fda363658e10b23James Zern if (args->enable_coeff_opt && !x->skip_recode) { 8640a39d0a697ff3603e8c100300fda363658e10b23James Zern *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 8650a39d0a697ff3603e8c100300fda363658e10b23James Zern } 8667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!x->skip_encode && *eob) { 8677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (tx_type == DCT_DCT) { 8687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // this is like vp9_short_idct4x4 but has a special case around 8697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // eob<=1 which is significant (not just an optimization) for the 8707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // lossless case. 871df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->highbd_inv_txfm_add(dqcoeff, dst16, dst_stride, *eob, xd->bd); 8727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 8730a39d0a697ff3603e8c100300fda363658e10b23James Zern vp9_highbd_iht4x4_16_add(dqcoeff, dst16, dst_stride, tx_type, 8740a39d0a697ff3603e8c100300fda363658e10b23James Zern xd->bd); 8757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 8787bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); return; 8797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (*eob) *(args->skip) = 0; 8817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return; 8827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 8837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 8847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 88591037db265ecdd914a26e056cf69207b4f50924ehkuang switch (tx_size) { 886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_32X32: 8879b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 8887bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_subtract_block(32, 32, src_diff, diff_stride, src, src_stride, dst, 8897bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst_stride); 8902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride); 8917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_quantize_b_32x32(coeff, 1024, x->skip_block, p->zbin, p->round, 8929b35249446b07f40ac5fcc3205f2c048616efacchkuang p->quant, p->quant_shift, qcoeff, dqcoeff, 8937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian pd->dequant, eob, scan_order->scan, 8942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian scan_order->iscan); 8959b35249446b07f40ac5fcc3205f2c048616efacchkuang } 8967bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (args->enable_coeff_opt && !x->skip_recode) { 8977bc9febe8749e98a3812a0dc4380ceae75c29450Johann *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 89868e1c830ade592be74773e249bf94e2bbfb50de7Johann } 89991037db265ecdd914a26e056cf69207b4f50924ehkuang if (!x->skip_encode && *eob) 9002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_idct32x32_add(dqcoeff, dst, dst_stride, *eob); 901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 902ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_16X16: 9039b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 9047bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_subtract_block(16, 16, src_diff, diff_stride, src, src_stride, dst, 9057bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst_stride); 9062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht16x16(src_diff, coeff, diff_stride, tx_type); 9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_quantize_b(coeff, 256, x->skip_block, p->zbin, p->round, p->quant, 9087bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 9097bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->scan, scan_order->iscan); 9109b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9117bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (args->enable_coeff_opt && !x->skip_recode) { 9127bc9febe8749e98a3812a0dc4380ceae75c29450Johann *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 91368e1c830ade592be74773e249bf94e2bbfb50de7Johann } 9145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!x->skip_encode && *eob) 9152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht16x16_add(tx_type, dqcoeff, dst, dst_stride, *eob); 916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_8X8: 9189b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 9197bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_subtract_block(8, 8, src_diff, diff_stride, src, src_stride, dst, 9207bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst_stride); 9212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht8x8(src_diff, coeff, diff_stride, tx_type); 9227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_quantize_b(coeff, 64, x->skip_block, p->zbin, p->round, p->quant, 9237bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 9247bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->scan, scan_order->iscan); 9259b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9267bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (args->enable_coeff_opt && !x->skip_recode) { 9277bc9febe8749e98a3812a0dc4380ceae75c29450Johann *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 92868e1c830ade592be74773e249bf94e2bbfb50de7Johann } 9295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!x->skip_encode && *eob) 9302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht8x8_add(tx_type, dqcoeff, dst, dst_stride, *eob); 931ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 932ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case TX_4X4: 9339b35249446b07f40ac5fcc3205f2c048616efacchkuang if (!x->skip_recode) { 9347bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_subtract_block(4, 4, src_diff, diff_stride, src, src_stride, dst, 9357bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst_stride); 9369b35249446b07f40ac5fcc3205f2c048616efacchkuang if (tx_type != DCT_DCT) 9372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_fht4x4(src_diff, coeff, diff_stride, tx_type); 9389b35249446b07f40ac5fcc3205f2c048616efacchkuang else 939df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->fwd_txfm4x4(src_diff, coeff, diff_stride); 9407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_quantize_b(coeff, 16, x->skip_block, p->zbin, p->round, p->quant, 9417bc9febe8749e98a3812a0dc4380ceae75c29450Johann p->quant_shift, qcoeff, dqcoeff, pd->dequant, eob, 9427bc9febe8749e98a3812a0dc4380ceae75c29450Johann scan_order->scan, scan_order->iscan); 9439b35249446b07f40ac5fcc3205f2c048616efacchkuang } 9447bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (args->enable_coeff_opt && !x->skip_recode) { 9457bc9febe8749e98a3812a0dc4380ceae75c29450Johann *a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; 94668e1c830ade592be74773e249bf94e2bbfb50de7Johann } 94791037db265ecdd914a26e056cf69207b4f50924ehkuang if (!x->skip_encode && *eob) { 94891037db265ecdd914a26e056cf69207b4f50924ehkuang if (tx_type == DCT_DCT) 94991037db265ecdd914a26e056cf69207b4f50924ehkuang // this is like vp9_short_idct4x4 but has a special case around eob<=1 95091037db265ecdd914a26e056cf69207b4f50924ehkuang // which is significant (not just an optimization) for the lossless 95191037db265ecdd914a26e056cf69207b4f50924ehkuang // case. 952df37111358d02836cb29bbcb9c6e4c95dff90a16Johann x->inv_txfm_add(dqcoeff, dst, dst_stride, *eob); 95391037db265ecdd914a26e056cf69207b4f50924ehkuang else 9542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vp9_iht4x4_16_add(dqcoeff, dst, dst_stride, tx_type); 95591037db265ecdd914a26e056cf69207b4f50924ehkuang } 956ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 9577bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: assert(0); break; 958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 9597bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (*eob) *(args->skip) = 0; 960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 961ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 96268e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane, 96368e1c830ade592be74773e249bf94e2bbfb50de7Johann int enable_optimize_b) { 9642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const MACROBLOCKD *const xd = &x->e_mbd; 96568e1c830ade592be74773e249bf94e2bbfb50de7Johann struct optimize_ctx ctx; 9667bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct encode_b_args arg = { x, enable_optimize_b, ctx.ta[plane], 9677bc9febe8749e98a3812a0dc4380ceae75c29450Johann ctx.tl[plane], &xd->mi[0]->skip }; 96868e1c830ade592be74773e249bf94e2bbfb50de7Johann 96968e1c830ade592be74773e249bf94e2bbfb50de7Johann if (enable_optimize_b && x->optimize && 97068e1c830ade592be74773e249bf94e2bbfb50de7Johann (!x->skip_recode || !x->skip_optimize)) { 9717bc9febe8749e98a3812a0dc4380ceae75c29450Johann const struct macroblockd_plane *const pd = &xd->plane[plane]; 9727bc9febe8749e98a3812a0dc4380ceae75c29450Johann const TX_SIZE tx_size = 9737bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane ? get_uv_tx_size(xd->mi[0], pd) : xd->mi[0]->tx_size; 97468e1c830ade592be74773e249bf94e2bbfb50de7Johann vp9_get_entropy_contexts(bsize, tx_size, pd, ctx.ta[plane], ctx.tl[plane]); 9757bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9767bc9febe8749e98a3812a0dc4380ceae75c29450Johann arg.enable_coeff_opt = 0; 97768e1c830ade592be74773e249bf94e2bbfb50de7Johann } 9782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vp9_foreach_transformed_block_in_plane(xd, bsize, plane, 9807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vp9_encode_block_intra, &arg); 981ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 982