diff options
Diffstat (limited to 'vp9/common/vp9_entropy.c')
-rw-r--r-- | vp9/common/vp9_entropy.c | 1394 |
1 files changed, 99 insertions, 1295 deletions
diff --git a/vp9/common/vp9_entropy.c b/vp9/common/vp9_entropy.c index 5e6cba2ed..a5437d889 100644 --- a/vp9/common/vp9_entropy.c +++ b/vp9/common/vp9_entropy.c @@ -400,65 +400,6 @@ static const vp9_prob Pcat6[] = { 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 }; -#if CONFIG_CODE_NONZEROCOUNT -const vp9_tree_index vp9_nzc4x4_tree[2 * NZC4X4_NODES] = { - -NZC_0, 2, - 4, 6, - -NZC_1, -NZC_2, - -NZC_3TO4, 8, - -NZC_5TO8, -NZC_9TO16, -}; -struct vp9_token vp9_nzc4x4_encodings[NZC4X4_TOKENS]; - -const vp9_tree_index vp9_nzc8x8_tree[2 * NZC8X8_NODES] = { - -NZC_0, 2, - 4, 6, - -NZC_1, -NZC_2, - 8, 10, - -NZC_3TO4, -NZC_5TO8, - -NZC_9TO16, 12, - -NZC_17TO32, -NZC_33TO64, -}; -struct vp9_token vp9_nzc8x8_encodings[NZC8X8_TOKENS]; - -const vp9_tree_index vp9_nzc16x16_tree[2 * NZC16X16_NODES] = { - -NZC_0, 2, - 4, 6, - -NZC_1, -NZC_2, - 8, 10, - -NZC_3TO4, -NZC_5TO8, - 12, 14, - -NZC_9TO16, -NZC_17TO32, - -NZC_33TO64, 16, - -NZC_65TO128, -NZC_129TO256, -}; -struct vp9_token vp9_nzc16x16_encodings[NZC16X16_TOKENS]; - -const vp9_tree_index vp9_nzc32x32_tree[2 * NZC32X32_NODES] = { - -NZC_0, 2, - 4, 6, - -NZC_1, -NZC_2, - 8, 10, - -NZC_3TO4, -NZC_5TO8, - 12, 14, - -NZC_9TO16, -NZC_17TO32, - 16, 18, - -NZC_33TO64, -NZC_65TO128, - -NZC_129TO256, 20, - -NZC_257TO512, -NZC_513TO1024, -}; -struct vp9_token vp9_nzc32x32_encodings[NZC32X32_TOKENS]; - -const int vp9_extranzcbits[NZC32X32_TOKENS] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 -}; - -const int vp9_basenzcvalue[NZC32X32_TOKENS] = { - 0, 1, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513 -}; - -#endif // CONFIG_CODE_NONZEROCOUNT - #if CONFIG_MODELCOEFPROB #if UNCONSTRAINED_NODES == 2 @@ -1310,7 +1251,7 @@ static void init_bit_trees() { init_bit_tree(cat6, 14); } -vp9_extra_bit_struct vp9_extra_bits[12] = { +vp9_extra_bit vp9_extra_bits[12] = { { 0, 0, 0, 0}, { 0, 0, 0, 1}, { 0, 0, 0, 2}, @@ -1344,10 +1285,10 @@ int vp9_get_coef_context(const int *scan, const int *neighbors, int ctx; assert(neighbors[MAX_NEIGHBORS * c + 0] >= 0); if (neighbors[MAX_NEIGHBORS * c + 1] >= 0) { - ctx = (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] + - token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >> 1; + ctx = (1 + token_cache[scan[neighbors[MAX_NEIGHBORS * c + 0]]] + + token_cache[scan[neighbors[MAX_NEIGHBORS * c + 1]]]) >> 1; } else { - ctx = token_cache[neighbors[MAX_NEIGHBORS * c + 0]]; + ctx = token_cache[scan[neighbors[MAX_NEIGHBORS * c + 0]]]; } return vp9_pt_energy_class[ctx]; } @@ -1357,55 +1298,6 @@ void vp9_default_coef_probs(VP9_COMMON *pc) { #if CONFIG_MODELCOEFPROB int b, r, c, p; #endif -#if CONFIG_CODE_NONZEROCOUNT -#ifdef NZC_DEFAULT_COUNTS - int h, g; - for (h = 0; h < MAX_NZC_CONTEXTS; ++h) { - for (g = 0; g < REF_TYPES; ++g) { - int i; - unsigned int branch_ct4x4[NZC4X4_NODES][2]; - unsigned int branch_ct8x8[NZC8X8_NODES][2]; - unsigned int branch_ct16x16[NZC16X16_NODES][2]; - unsigned int branch_ct32x32[NZC32X32_NODES][2]; - for (i = 0; i < BLOCK_TYPES; ++i) { - vp9_tree_probs_from_distribution( - vp9_nzc4x4_tree, - pc->fc.nzc_probs_4x4[h][g][i], branch_ct4x4, - default_nzc_counts_4x4[h][g][i], 0); - } - for (i = 0; i < BLOCK_TYPES; ++i) { - vp9_tree_probs_from_distribution( - vp9_nzc8x8_tree, - pc->fc.nzc_probs_8x8[h][g][i], branch_ct8x8, - default_nzc_counts_8x8[h][g][i], 0); - } - for (i = 0; i < BLOCK_TYPES; ++i) { - vp9_tree_probs_from_distribution( - vp9_nzc16x16_tree, - pc->fc.nzc_probs_16x16[h][g][i], branch_ct16x16, - default_nzc_counts_16x16[h][g][i], 0); - } - for (i = 0; i < BLOCK_TYPES; ++i) { - vp9_tree_probs_from_distribution( - vp9_nzc32x32_tree, - pc->fc.nzc_probs_32x32[h][g][i], branch_ct32x32, - default_nzc_counts_32x32[h][g][i], 0); - } - } - } -#else - vpx_memcpy(pc->fc.nzc_probs_4x4, default_nzc_probs_4x4, - sizeof(pc->fc.nzc_probs_4x4)); - vpx_memcpy(pc->fc.nzc_probs_8x8, default_nzc_probs_8x8, - sizeof(pc->fc.nzc_probs_8x8)); - vpx_memcpy(pc->fc.nzc_probs_16x16, default_nzc_probs_16x16, - sizeof(pc->fc.nzc_probs_16x16)); - vpx_memcpy(pc->fc.nzc_probs_32x32, default_nzc_probs_32x32, - sizeof(pc->fc.nzc_probs_32x32)); -#endif - vpx_memcpy(pc->fc.nzc_pcat_probs, default_nzc_pcat_probs, - sizeof(pc->fc.nzc_pcat_probs)); -#endif // CONFIG_CODE_NONZEROCOUNT #if CONFIG_MODELCOEFPROB for (b = 0; b < BLOCK_TYPES; ++b) for (r = 0; r < REF_TYPES; ++r) @@ -1447,6 +1339,16 @@ void vp9_default_coef_probs(VP9_COMMON *pc) { vpx_memcpy(pc->fc.coef_probs_32x32, default_coef_probs_32x32, sizeof(pc->fc.coef_probs_32x32)); #endif +#if CONFIG_CODE_ZEROGROUP + vpx_memcpy(pc->fc.zpc_probs_4x4, default_zpc_probs_4x4, + sizeof(pc->fc.zpc_probs_4x4)); + vpx_memcpy(pc->fc.zpc_probs_8x8, default_zpc_probs_8x8, + sizeof(pc->fc.zpc_probs_8x8)); + vpx_memcpy(pc->fc.zpc_probs_16x16, default_zpc_probs_16x16, + sizeof(pc->fc.zpc_probs_16x16)); + vpx_memcpy(pc->fc.zpc_probs_32x32, default_zpc_probs_32x32, + sizeof(pc->fc.zpc_probs_32x32)); +#endif } // Neighborhood 5-tuples for various scans and blocksizes, @@ -1597,1099 +1499,8 @@ void vp9_coef_tree_initialize() { vp9_init_neighbors(); init_bit_trees(); vp9_tokens_from_tree(vp9_coef_encodings, vp9_coef_tree); -#if CONFIG_CODE_NONZEROCOUNT - vp9_tokens_from_tree(vp9_nzc4x4_encodings, vp9_nzc4x4_tree); - vp9_tokens_from_tree(vp9_nzc8x8_encodings, vp9_nzc8x8_tree); - vp9_tokens_from_tree(vp9_nzc16x16_encodings, vp9_nzc16x16_tree); - vp9_tokens_from_tree(vp9_nzc32x32_encodings, vp9_nzc32x32_tree); -#endif -} - -#if CONFIG_CODE_NONZEROCOUNT - -#define mb_in_cur_tile(cm, mb_row, mb_col) \ - ((mb_col) >= (cm)->cur_tile_mb_col_start && \ - (mb_col) <= (cm)->cur_tile_mb_col_end && \ - (mb_row) >= 0) - -#define choose_nzc_context(nzc_exp, t2, t1) \ - ((nzc_exp) >= (t2) ? 2 : (nzc_exp) >= (t1) ? 1 : 0) - -#define NZC_T2_32X32 (16 << 6) -#define NZC_T1_32X32 (4 << 6) - -#define NZC_T2_16X16 (12 << 6) -#define NZC_T1_16X16 (3 << 6) - -#define NZC_T2_8X8 (8 << 6) -#define NZC_T1_8X8 (2 << 6) - -#define NZC_T2_4X4 (4 << 6) -#define NZC_T1_4X4 (1 << 6) - -// Transforms a mb16 block index to a sb64 block index -static inline int mb16_to_sb64_index(int mb_row, int mb_col, int block) { - int r = (mb_row & 3); - int c = (mb_col & 3); - int b; - if (block < 16) { // Y - int ib = block >> 2; - int jb = block & 3; - ib += r * 4; - jb += c * 4; - b = ib * 16 + jb; - assert(b < 256); - return b; - } else { // UV - int base = block - (block & 3); - int ib = (block - base) >> 1; - int jb = (block - base) & 1; - ib += r * 2; - jb += c * 2; - b = base * 16 + ib * 8 + jb; - assert(b >= 256 && b < 384); - return b; - } -} - -// Transforms a mb16 block index to a sb32 block index -static inline int mb16_to_sb32_index(int mb_row, int mb_col, int block) { - int r = (mb_row & 1); - int c = (mb_col & 1); - int b; - if (block < 16) { // Y - int ib = block >> 2; - int jb = block & 3; - ib += r * 4; - jb += c * 4; - b = ib * 8 + jb; - assert(b < 64); - return b; - } else { // UV - int base = block - (block & 3); - int ib = (block - base) >> 1; - int jb = (block - base) & 1; - ib += r * 2; - jb += c * 2; - b = base * 4 + ib * 4 + jb; - assert(b >= 64 && b < 96); - return b; - } -} - -static inline int block_to_txfm_index(int block, TX_SIZE tx_size, int s) { - // s is the log of the number of 4x4 blocks in each row/col of larger block - int b, ib, jb, nb; - ib = block >> s; - jb = block - (ib << s); - ib >>= tx_size; - jb >>= tx_size; - nb = 1 << (s - tx_size); - b = (ib * nb + jb) << (2 * tx_size); - return b; -} - -/* BEGIN - Helper functions to get the y nzcs */ -static unsigned int get_nzc_4x4_y_sb64(MB_MODE_INFO *mi, int block) { - int b; - assert(block < 256); - b = block_to_txfm_index(block, mi->txfm_size, 4); - assert(b < 256); - return mi->nzcs[b] << (6 - 2 * mi->txfm_size); -} - -static unsigned int get_nzc_4x4_y_sb32(MB_MODE_INFO *mi, int block) { - int b; - assert(block < 64); - b = block_to_txfm_index(block, mi->txfm_size, 3); - assert(b < 64); - return mi->nzcs[b] << (6 - 2 * mi->txfm_size); -} - -static unsigned int get_nzc_4x4_y_mb16(MB_MODE_INFO *mi, int block) { - int b; - assert(block < 16); - b = block_to_txfm_index(block, mi->txfm_size, 2); - assert(b < 16); - return mi->nzcs[b] << (6 - 2 * mi->txfm_size); -} -/* END - Helper functions to get the y nzcs */ - -/* Function to get y nzc where block index is in mb16 terms */ -static unsigned int get_nzc_4x4_y(VP9_COMMON *cm, MODE_INFO *m, - int mb_row, int mb_col, int block) { - // NOTE: All values returned are at 64 times the true value at 4x4 scale - MB_MODE_INFO *const mi = &m->mbmi; - const int mis = cm->mode_info_stride; - if (mi->mb_skip_coeff || !mb_in_cur_tile(cm, mb_row, mb_col)) - return 0; - if (mi->sb_type == BLOCK_SIZE_SB64X64) { - int r = mb_row & 3; - int c = mb_col & 3; - m -= c + r * mis; - if (m->mbmi.mb_skip_coeff || !mb_in_cur_tile(cm, mb_row - r, mb_col - c)) - return 0; - else - return get_nzc_4x4_y_sb64( - &m->mbmi, mb16_to_sb64_index(mb_row, mb_col, block)); - } else if (mi->sb_type == BLOCK_SIZE_SB32X32) { - int r = mb_row & 1; - int c = mb_col & 1; - m -= c + r * mis; - if (m->mbmi.mb_skip_coeff || !mb_in_cur_tile(cm, mb_row - r, mb_col - c)) - return 0; - else - return get_nzc_4x4_y_sb32( - &m->mbmi, mb16_to_sb32_index(mb_row, mb_col, block)); - } else { - if (m->mbmi.mb_skip_coeff || !mb_in_cur_tile(cm, mb_row, mb_col)) - return 0; - return get_nzc_4x4_y_mb16(mi, block); - } -} - -/* BEGIN - Helper functions to get the uv nzcs */ -static unsigned int get_nzc_4x4_uv_sb64(MB_MODE_INFO *mi, int block) { - int b; - int base, uvtxfm_size; - assert(block >= 256 && block < 384); - uvtxfm_size = mi->txfm_size; - base = 256 + (block & 64); - block -= base; - b = base + block_to_txfm_index(block, uvtxfm_size, 3); - assert(b >= 256 && b < 384); - return mi->nzcs[b] << (6 - 2 * uvtxfm_size); -} - -static unsigned int get_nzc_4x4_uv_sb32(MB_MODE_INFO *mi, int block) { - int b; - int base, uvtxfm_size; - assert(block >= 64 && block < 96); - if (mi->txfm_size == TX_32X32) - uvtxfm_size = TX_16X16; - else - uvtxfm_size = mi->txfm_size; - base = 64 + (block & 16); - block -= base; - b = base + block_to_txfm_index(block, uvtxfm_size, 2); - assert(b >= 64 && b < 96); - return mi->nzcs[b] << (6 - 2 * uvtxfm_size); -} - -static unsigned int get_nzc_4x4_uv_mb16(MB_MODE_INFO *mi, int block) { - int b; - int base, uvtxfm_size; - assert(block >= 16 && block < 24); - if (mi->txfm_size == TX_8X8 && - (mi->mode == SPLITMV || mi->mode == I8X8_PRED)) - uvtxfm_size = TX_4X4; - else if (mi->txfm_size == TX_16X16) - uvtxfm_size = TX_8X8; - else - uvtxfm_size = mi->txfm_size; - base = 16 + (block & 4); - block -= base; - b = base + block_to_txfm_index(block, uvtxfm_size, 1); - assert(b >= 16 && b < 24); - return mi->nzcs[b] << (6 - 2 * uvtxfm_size); -} -/* END - Helper functions to get the uv nzcs */ - -/* Function to get uv nzc where block index is in mb16 terms */ -static unsigned int get_nzc_4x4_uv(VP9_COMMON *cm, MODE_INFO *m, - int mb_row, int mb_col, int block) { - // NOTE: All values returned are at 64 times the true value at 4x4 scale - MB_MODE_INFO *const mi = &m->mbmi; - const int mis = cm->mode_info_stride; - if (mi->mb_skip_coeff || !mb_in_cur_tile(cm, mb_row, mb_col)) - return 0; - if (mi->sb_type == BLOCK_SIZE_SB64X64) { - int r = mb_row & 3; - int c = mb_col & 3; - m -= c + r * mis; - if (m->mbmi.mb_skip_coeff || !mb_in_cur_tile(cm, mb_row - r, mb_col - c)) - return 0; - else - return get_nzc_4x4_uv_sb64( - &m->mbmi, mb16_to_sb64_index(mb_row, mb_col, block)); - } else if (mi->sb_type == BLOCK_SIZE_SB32X32) { - int r = mb_row & 1; - int c = mb_col & 1; - m -= c + r * mis; - if (m->mbmi.mb_skip_coeff || !mb_in_cur_tile(cm, mb_row - r, mb_col - c)) - return 0; - else - return get_nzc_4x4_uv_sb32( - &m->mbmi, mb16_to_sb32_index(mb_row, mb_col, block)); - } else { - return get_nzc_4x4_uv_mb16(mi, block); - } -} - -int vp9_get_nzc_context_y_sb64(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - assert(block < 256); - switch (txfm_size) { - case TX_32X32: - assert((block & 63) == 0); - if (block < 128) { - int o = (block >> 6) * 2; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 12) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 13) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 14) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 15) + - get_nzc_4x4_y(cm, cur - mis + o + 1, - mb_row - 1, mb_col + o + 1, 12) + - get_nzc_4x4_y(cm, cur - mis + o + 1, - mb_row - 1, mb_col + o + 1, 13) + - get_nzc_4x4_y(cm, cur - mis + o + 1, - mb_row - 1, mb_col + o + 1, 14) + - get_nzc_4x4_y(cm, cur - mis + o + 1, - mb_row - 1, mb_col + o + 1, 15); - } else { - nzc_exp = cur->mbmi.nzcs[block - 128] << 3; - } - if ((block & 127) == 0) { - int o = (block >> 7) * 2; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 15) + - get_nzc_4x4_y(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, 15); - } else { - nzc_exp += cur->mbmi.nzcs[block - 64] << 3; - } - nzc_exp <<= 2; - // Note nzc_exp is 64 times the average value expected at 32x32 scale - return choose_nzc_context(nzc_exp, NZC_T2_32X32, NZC_T1_32X32); - break; - - case TX_16X16: - assert((block & 15) == 0); - if (block < 64) { - int o = block >> 4; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 12) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 13) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 14) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 15); - } else { - nzc_exp = cur->mbmi.nzcs[block - 64] << 4; - } - if ((block & 63) == 0) { - int o = block >> 6; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 15); - } else { - nzc_exp += cur->mbmi.nzcs[block - 16] << 4; - } - nzc_exp <<= 1; - // Note nzc_exp is 64 times the average value expected at 16x16 scale - return choose_nzc_context(nzc_exp, NZC_T2_16X16, NZC_T1_16X16); - break; - - case TX_8X8: - assert((block & 3) == 0); - if (block < 32) { - int o = block >> 3; - int p = ((block >> 2) & 1) ? 14 : 12; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, p) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, p + 1); - } else { - nzc_exp = cur->mbmi.nzcs[block - 32] << 5; - } - if ((block & 31) == 0) { - int o = block >> 6; - int p = ((block >> 5) & 1) ? 11 : 3; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, p) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, p + 4); - } else { - nzc_exp += cur->mbmi.nzcs[block - 4] << 5; - } - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - break; - - case TX_4X4: - if (block < 16) { - int o = block >> 2; - int p = block & 3; - nzc_exp = get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, - 12 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 16] << 6); - } - if ((block & 15) == 0) { - int o = block >> 6; - int p = (block >> 4) & 3; - nzc_exp += get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - 3 + 4 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - break; - - default: - return 0; - } -} - -int vp9_get_nzc_context_y_sb32(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - assert(block < 64); - switch (txfm_size) { - case TX_32X32: - assert(block == 0); - nzc_exp = - (get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 12) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 13) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 14) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 15) + - get_nzc_4x4_y(cm, cur - mis + 1, mb_row - 1, mb_col + 1, 12) + - get_nzc_4x4_y(cm, cur - mis + 1, mb_row - 1, mb_col + 1, 13) + - get_nzc_4x4_y(cm, cur - mis + 1, mb_row - 1, mb_col + 1, 14) + - get_nzc_4x4_y(cm, cur - mis + 1, mb_row - 1, mb_col + 1, 15) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 15) + - get_nzc_4x4_y(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, 15)) << 2; - // Note nzc_exp is 64 times the average value expected at 32x32 scale - return choose_nzc_context(nzc_exp, NZC_T2_32X32, NZC_T1_32X32); - break; - - case TX_16X16: - assert((block & 15) == 0); - if (block < 32) { - int o = (block >> 4) & 1; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 12) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 13) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 14) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, 15); - } else { - nzc_exp = cur->mbmi.nzcs[block - 32] << 4; - } - if ((block & 31) == 0) { - int o = block >> 5; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, 15); - } else { - nzc_exp += cur->mbmi.nzcs[block - 16] << 4; - } - nzc_exp <<= 1; - // Note nzc_exp is 64 times the average value expected at 16x16 scale - return choose_nzc_context(nzc_exp, NZC_T2_16X16, NZC_T1_16X16); - break; - - case TX_8X8: - assert((block & 3) == 0); - if (block < 16) { - int o = block >> 3; - int p = ((block >> 2) & 1) ? 14 : 12; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, p) + - get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, p + 1); - } else { - nzc_exp = cur->mbmi.nzcs[block - 16] << 5; - } - if ((block & 15) == 0) { - int o = block >> 5; - int p = ((block >> 4) & 1) ? 11 : 3; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, p) + - get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, p + 4); - } else { - nzc_exp += cur->mbmi.nzcs[block - 4] << 5; - } - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - break; - - case TX_4X4: - if (block < 8) { - int o = block >> 2; - int p = block & 3; - nzc_exp = get_nzc_4x4_y(cm, cur - mis + o, mb_row - 1, mb_col + o, - 12 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 8] << 6); - } - if ((block & 7) == 0) { - int o = block >> 5; - int p = (block >> 3) & 3; - nzc_exp += get_nzc_4x4_y(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - 3 + 4 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - break; - - default: - return 0; - break; - } -} - -int vp9_get_nzc_context_y_mb16(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - assert(block < 16); - switch (txfm_size) { - case TX_16X16: - assert(block == 0); - nzc_exp = - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 12) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 13) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 14) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, 15) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 3) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 7) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 11) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, 15); - nzc_exp <<= 1; - // Note nzc_exp is 64 times the average value expected at 16x16 scale - return choose_nzc_context(nzc_exp, NZC_T2_16X16, NZC_T1_16X16); - - case TX_8X8: - assert((block & 3) == 0); - if (block < 8) { - int p = ((block >> 2) & 1) ? 14 : 12; - nzc_exp = - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, p) + - get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, p + 1); - } else { - nzc_exp = cur->mbmi.nzcs[block - 8] << 5; - } - if ((block & 7) == 0) { - int p = ((block >> 3) & 1) ? 11 : 3; - nzc_exp += - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, p) + - get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, p + 4); - } else { - nzc_exp += cur->mbmi.nzcs[block - 4] << 5; - } - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - - case TX_4X4: - if (block < 4) { - int p = block & 3; - nzc_exp = get_nzc_4x4_y(cm, cur - mis, mb_row - 1, mb_col, - 12 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 4] << 6); - } - if ((block & 3) == 0) { - int p = (block >> 2) & 3; - nzc_exp += get_nzc_4x4_y(cm, cur - 1, mb_row, mb_col - 1, - 3 + 4 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - - default: - return 0; - break; - } -} - -int vp9_get_nzc_context_uv_sb64(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - const int base = block - (block & 63); - const int boff = (block & 63); - const int base_mb16 = base >> 4; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - TX_SIZE txfm_size_uv; - - assert(block >= 256 && block < 384); - txfm_size_uv = txfm_size; - - switch (txfm_size_uv) { - case TX_32X32: - assert(block == 256 || block == 320); - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - mis + 1, mb_row - 1, mb_col + 1, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + 1, mb_row - 1, mb_col + 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - mis + 2, mb_row - 1, mb_col + 2, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + 2, mb_row - 1, mb_col + 2, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - mis + 3, mb_row - 1, mb_col + 3, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + 3, mb_row - 1, mb_col + 3, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1, mb_row, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1, mb_row, mb_col - 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + 2 * mis, mb_row + 2, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + 2 * mis, mb_row + 2, mb_col - 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + 3 * mis, mb_row + 3, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + 3 * mis, mb_row + 3, mb_col - 1, - base_mb16 + 3); - nzc_exp <<= 2; - // Note nzc_exp is 64 times the average value expected at 32x32 scale - return choose_nzc_context(nzc_exp, NZC_T2_32X32, NZC_T1_32X32); - - case TX_16X16: - // uv txfm_size 16x16 - assert((block & 15) == 0); - if (boff < 32) { - int o = (boff >> 4) & 1; - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - mis + o + 1, mb_row - 1, mb_col + o + 1, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + o + 1, mb_row - 1, mb_col + o + 1, - base_mb16 + 3); - } else { - nzc_exp = cur->mbmi.nzcs[block - 32] << 4; - } - if ((boff & 31) == 0) { - int o = boff >> 5; - nzc_exp += - get_nzc_4x4_uv(cm, cur - 1 + o * mis, - mb_row + o, mb_col - 1, base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + o * mis, - mb_row + o, mb_col - 1, base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + o * mis + mis, - mb_row + o + 1, mb_col - 1, base_mb16 + 3); - } else { - nzc_exp += cur->mbmi.nzcs[block - 16] << 4; - } - nzc_exp <<= 1; - // Note nzc_exp is 64 times the average value expected at 16x16 scale - return choose_nzc_context(nzc_exp, NZC_T2_16X16, NZC_T1_16X16); - - case TX_8X8: - assert((block & 3) == 0); - if (boff < 16) { - int o = boff >> 2; - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 3); - } else { - nzc_exp = cur->mbmi.nzcs[block - 16] << 5; - } - if ((boff & 15) == 0) { - int o = boff >> 4; - nzc_exp += - get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 3); - } else { - nzc_exp += cur->mbmi.nzcs[block - 4] << 5; - } - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - - case TX_4X4: - if (boff < 8) { - int o = boff >> 1; - int p = boff & 1; - nzc_exp = get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 2 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 8] << 6); - } - if ((boff & 7) == 0) { - int o = boff >> 4; - int p = (boff >> 3) & 1; - nzc_exp += get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 1 + 2 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - - default: - return 0; - } -} - -int vp9_get_nzc_context_uv_sb32(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - const int base = block - (block & 15); - const int boff = (block & 15); - const int base_mb16 = base >> 2; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - TX_SIZE txfm_size_uv; - - assert(block >= 64 && block < 96); - if (txfm_size == TX_32X32) - txfm_size_uv = TX_16X16; - else - txfm_size_uv = txfm_size; - - switch (txfm_size_uv) { - case TX_16X16: - // uv txfm_size 16x16 - assert(block == 64 || block == 80); - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - mis + 1, mb_row - 1, mb_col + 1, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + 1, mb_row - 1, mb_col + 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row, mb_col - 1, - base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + mis, mb_row + 1, mb_col - 1, - base_mb16 + 3); - nzc_exp <<= 1; - // Note nzc_exp is 64 times the average value expected at 16x16 scale - return choose_nzc_context(nzc_exp, NZC_T2_16X16, NZC_T1_16X16); - break; - - case TX_8X8: - assert((block & 3) == 0); - if (boff < 8) { - int o = boff >> 2; - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 3); - } else { - nzc_exp = cur->mbmi.nzcs[block - 8] << 5; - } - if ((boff & 7) == 0) { - int o = boff >> 3; - nzc_exp += - get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 3); - } else { - nzc_exp += cur->mbmi.nzcs[block - 4] << 5; - } - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - - case TX_4X4: - if (boff < 4) { - int o = boff >> 1; - int p = boff & 1; - nzc_exp = get_nzc_4x4_uv(cm, cur - mis + o, mb_row - 1, mb_col + o, - base_mb16 + 2 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 4] << 6); - } - if ((boff & 3) == 0) { - int o = boff >> 3; - int p = (boff >> 2) & 1; - nzc_exp += get_nzc_4x4_uv(cm, cur - 1 + o * mis, mb_row + o, mb_col - 1, - base_mb16 + 1 + 2 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - - default: - return 0; - } -} - -int vp9_get_nzc_context_uv_mb16(VP9_COMMON *cm, MODE_INFO *cur, - int mb_row, int mb_col, int block) { - // returns an index in [0, MAX_NZC_CONTEXTS - 1] to reflect how busy - // neighboring blocks are - int mis = cm->mode_info_stride; - int nzc_exp = 0; - const int base = block - (block & 3); - const int boff = (block & 3); - const int base_mb16 = base; - TX_SIZE txfm_size = cur->mbmi.txfm_size; - TX_SIZE txfm_size_uv; - - assert(block >= 16 && block < 24); - if (txfm_size == TX_16X16) - txfm_size_uv = TX_8X8; - else if (txfm_size == TX_8X8 && - (cur->mbmi.mode == I8X8_PRED || cur->mbmi.mode == SPLITMV)) - txfm_size_uv = TX_4X4; - else - txfm_size_uv = txfm_size; - - switch (txfm_size_uv) { - case TX_8X8: - assert((block & 3) == 0); - nzc_exp = - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, base_mb16 + 2) + - get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, base_mb16 + 3) + - get_nzc_4x4_uv(cm, cur - 1, mb_row, mb_col - 1, base_mb16 + 1) + - get_nzc_4x4_uv(cm, cur - 1, mb_row, mb_col - 1, base_mb16 + 3); - // Note nzc_exp is 64 times the average value expected at 8x8 scale - return choose_nzc_context(nzc_exp, NZC_T2_8X8, NZC_T1_8X8); - - case TX_4X4: - if (boff < 2) { - int p = boff & 1; - nzc_exp = get_nzc_4x4_uv(cm, cur - mis, mb_row - 1, mb_col, - base_mb16 + 2 + p); - } else { - nzc_exp = (cur->mbmi.nzcs[block - 2] << 6); - } - if ((boff & 1) == 0) { - int p = (boff >> 1) & 1; - nzc_exp += get_nzc_4x4_uv(cm, cur - 1, mb_row, mb_col - 1, - base_mb16 + 1 + 2 * p); - } else { - nzc_exp += (cur->mbmi.nzcs[block - 1] << 6); - } - nzc_exp >>= 1; - // Note nzc_exp is 64 times the average value expected at 4x4 scale - return choose_nzc_context(nzc_exp, NZC_T2_4X4, NZC_T1_4X4); - - default: - return 0; - } -} - -int vp9_get_nzc_context(VP9_COMMON *cm, MACROBLOCKD *xd, int block) { - if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64) { - assert(block < 384); - if (block < 256) - return vp9_get_nzc_context_y_sb64(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - else - return vp9_get_nzc_context_uv_sb64(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - } else if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32) { - assert(block < 96); - if (block < 64) - return vp9_get_nzc_context_y_sb32(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - else - return vp9_get_nzc_context_uv_sb32(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - } else { - assert(block < 64); - if (block < 16) - return vp9_get_nzc_context_y_mb16(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - else - return vp9_get_nzc_context_uv_mb16(cm, xd->mode_info_context, - get_mb_row(xd), get_mb_col(xd), block); - } -} - -static void update_nzc(VP9_COMMON *cm, - uint16_t nzc, - int nzc_context, - TX_SIZE tx_size, - int ref, - int type) { - int e, c; - if (!get_nzc_used(tx_size)) return; - c = codenzc(nzc); - if (tx_size == TX_32X32) - cm->fc.nzc_counts_32x32[nzc_context][ref][type][c]++; - else if (tx_size == TX_16X16) - cm->fc.nzc_counts_16x16[nzc_context][ref][type][c]++; - else if (tx_size == TX_8X8) - cm->fc.nzc_counts_8x8[nzc_context][ref][type][c]++; - else if (tx_size == TX_4X4) - cm->fc.nzc_counts_4x4[nzc_context][ref][type][c]++; - else - assert(0); - - if ((e = vp9_extranzcbits[c])) { - int x = nzc - vp9_basenzcvalue[c]; - while (e--) { - int b = (x >> e) & 1; - cm->fc.nzc_pcat_counts[nzc_context][c - NZC_TOKENS_NOEXTRA][e][b]++; - } - } -} - -static void update_nzcs_sb64(VP9_COMMON *cm, - MACROBLOCKD *xd, - int mb_row, - int mb_col) { - MODE_INFO *m = xd->mode_info_context; - MB_MODE_INFO *const mi = &m->mbmi; - int j, nzc_context; - const int ref = m->mbmi.ref_frame != INTRA_FRAME; - - assert(mb_col == get_mb_col(xd)); - assert(mb_row == get_mb_row(xd)); - - if (mi->mb_skip_coeff) - return; - - switch (mi->txfm_size) { - case TX_32X32: - for (j = 0; j < 256; j += 64) { - nzc_context = vp9_get_nzc_context_y_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_32X32, ref, 0); - } - for (j = 256; j < 384; j += 64) { - nzc_context = vp9_get_nzc_context_uv_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_32X32, ref, 1); - } - break; - - case TX_16X16: - for (j = 0; j < 256; j += 16) { - nzc_context = vp9_get_nzc_context_y_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 0); - } - for (j = 256; j < 384; j += 16) { - nzc_context = vp9_get_nzc_context_uv_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 1); - } - break; - - case TX_8X8: - for (j = 0; j < 256; j += 4) { - nzc_context = vp9_get_nzc_context_y_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 0); - } - for (j = 256; j < 384; j += 4) { - nzc_context = vp9_get_nzc_context_uv_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 1); - } - break; - - case TX_4X4: - for (j = 0; j < 256; ++j) { - nzc_context = vp9_get_nzc_context_y_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 0); - } - for (j = 256; j < 384; ++j) { - nzc_context = vp9_get_nzc_context_uv_sb64(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 1); - } - break; - - default: - break; - } } -static void update_nzcs_sb32(VP9_COMMON *cm, - MACROBLOCKD *xd, - int mb_row, - int mb_col) { - MODE_INFO *m = xd->mode_info_context; - MB_MODE_INFO *const mi = &m->mbmi; - int j, nzc_context; - const int ref = m->mbmi.ref_frame != INTRA_FRAME; - - assert(mb_col == get_mb_col(xd)); - assert(mb_row == get_mb_row(xd)); - - if (mi->mb_skip_coeff) - return; - - switch (mi->txfm_size) { - case TX_32X32: - for (j = 0; j < 64; j += 64) { - nzc_context = vp9_get_nzc_context_y_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_32X32, ref, 0); - } - for (j = 64; j < 96; j += 16) { - nzc_context = vp9_get_nzc_context_uv_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 1); - } - break; - - case TX_16X16: - for (j = 0; j < 64; j += 16) { - nzc_context = vp9_get_nzc_context_y_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 0); - } - for (j = 64; j < 96; j += 16) { - nzc_context = vp9_get_nzc_context_uv_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 1); - } - break; - - case TX_8X8: - for (j = 0; j < 64; j += 4) { - nzc_context = vp9_get_nzc_context_y_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 0); - } - for (j = 64; j < 96; j += 4) { - nzc_context = vp9_get_nzc_context_uv_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 1); - } - break; - - case TX_4X4: - for (j = 0; j < 64; ++j) { - nzc_context = vp9_get_nzc_context_y_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 0); - } - for (j = 64; j < 96; ++j) { - nzc_context = vp9_get_nzc_context_uv_sb32(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 1); - } - break; - - default: - break; - } -} - -static void update_nzcs_mb16(VP9_COMMON *cm, - MACROBLOCKD *xd, - int mb_row, - int mb_col) { - MODE_INFO *m = xd->mode_info_context; - MB_MODE_INFO *const mi = &m->mbmi; - int j, nzc_context; - const int ref = m->mbmi.ref_frame != INTRA_FRAME; - - assert(mb_col == get_mb_col(xd)); - assert(mb_row == get_mb_row(xd)); - - if (mi->mb_skip_coeff) - return; - - switch (mi->txfm_size) { - case TX_16X16: - for (j = 0; j < 16; j += 16) { - nzc_context = vp9_get_nzc_context_y_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_16X16, ref, 0); - } - for (j = 16; j < 24; j += 4) { - nzc_context = vp9_get_nzc_context_uv_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 1); - } - break; - - case TX_8X8: - for (j = 0; j < 16; j += 4) { - nzc_context = vp9_get_nzc_context_y_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 0); - } - if (mi->mode == I8X8_PRED || mi->mode == SPLITMV) { - for (j = 16; j < 24; ++j) { - nzc_context = vp9_get_nzc_context_uv_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 1); - } - } else { - for (j = 16; j < 24; j += 4) { - nzc_context = vp9_get_nzc_context_uv_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_8X8, ref, 1); - } - } - break; - - case TX_4X4: - for (j = 0; j < 16; ++j) { - nzc_context = vp9_get_nzc_context_y_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 0); - } - for (j = 16; j < 24; ++j) { - nzc_context = vp9_get_nzc_context_uv_mb16(cm, m, mb_row, mb_col, j); - update_nzc(cm, m->mbmi.nzcs[j], nzc_context, TX_4X4, ref, 1); - } - break; - - default: - break; - } -} - -void vp9_update_nzc_counts(VP9_COMMON *cm, - MACROBLOCKD *xd, - int mb_row, - int mb_col) { - if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64) - update_nzcs_sb64(cm, xd, mb_row, mb_col); - else if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32) - update_nzcs_sb32(cm, xd, mb_row, mb_col); - else - update_nzcs_mb16(cm, xd, mb_row, mb_col); -} -#endif // CONFIG_CODE_NONZEROCOUNT - // #define COEF_COUNT_TESTING #define COEF_COUNT_SAT 24 @@ -2777,111 +1588,105 @@ void vp9_adapt_coef_probs(VP9_COMMON *cm) { count_sat, update_factor); } -#if CONFIG_CODE_NONZEROCOUNT -static void adapt_nzc_probs_common(VP9_COMMON *cm, +#if CONFIG_CODE_ZEROGROUP +OrientationType vp9_get_orientation(int rc, TX_SIZE tx_size) { + int i = rc >> (tx_size + 2); + int j = rc & ((4 << tx_size) - 1); + if (i > 2 * j) + return VERTICAL; + else if (j > 2 * i) + return HORIZONTAL; + else + return DIAGONAL; + /* + if (i == 0 && j == 0) return DIAGONAL; + while (i > 1 || j > 1) { + i >>= 1; + j >>= 1; + } + if (i == 0 && j == 1) + return HORIZONTAL; // horizontal + else if (i == 1 && j == 1) + return DIAGONAL; // diagonal + else if (i == 1 && j == 0) + return VERTICAL; // vertical + assert(0); + */ +} + +int vp9_use_eoo(int c, int seg_eob, const int *scan, + TX_SIZE tx_size, int *is_last_zero, int *is_eoo) { + // NOTE: returning 0 from this function will turn off eoo symbols + // For instance we can experiment with turning eoo off for smaller blocks + // and/or lower bands + int o = vp9_get_orientation(scan[c], tx_size); + int band = get_coef_band(scan, tx_size, c); + int use_eoo = (!is_last_zero[o] && + !is_eoo[o] && + band <= ZPC_EOO_BAND_UPPER && + band >= ZPC_EOO_BAND_LOWER && + get_zpc_used(tx_size) && + seg_eob - c > (ZPC_USEEOO_THRESH << tx_size) && + is_eoo[0] + is_eoo[1] + is_eoo[2] < 2); + return use_eoo; +} + +int vp9_is_eoo(int c, int eob, const int *scan, TX_SIZE tx_size, + const int16_t *qcoeff_ptr, int *last_nz_pos) { + int rc = scan[c]; + int o = vp9_get_orientation(rc, tx_size); + int eoo = c > last_nz_pos[o]; + return eoo; +} + +static void adapt_zpc_probs_common(VP9_COMMON *cm, TX_SIZE tx_size, int count_sat, int update_factor) { - int c, r, b, n; + int r, b, p, n; int count, factor; - unsigned int nzc_branch_ct[NZC32X32_NODES][2]; - vp9_prob nzc_probs[NZC32X32_NODES]; - int tokens, nodes; - const vp9_tree_index *nzc_tree; - vp9_prob *dst_nzc_probs; - vp9_prob *pre_nzc_probs; - unsigned int *nzc_counts; - - if (!get_nzc_used(tx_size)) return; + vp9_zpc_probs *zpc_probs; + vp9_zpc_probs *pre_zpc_probs; + vp9_zpc_count *zpc_counts; + if (!get_zpc_used(tx_size)) return; if (tx_size == TX_32X32) { - tokens = NZC32X32_TOKENS; - nzc_tree = vp9_nzc32x32_tree; - dst_nzc_probs = cm->fc.nzc_probs_32x32[0][0][0]; - pre_nzc_probs = cm->fc.pre_nzc_probs_32x32[0][0][0]; - nzc_counts = cm->fc.nzc_counts_32x32[0][0][0]; + zpc_probs = &cm->fc.zpc_probs_32x32; + pre_zpc_probs = &cm->fc.pre_zpc_probs_32x32; + zpc_counts = &cm->fc.zpc_counts_32x32; } else if (tx_size == TX_16X16) { - tokens = NZC16X16_TOKENS; - nzc_tree = vp9_nzc16x16_tree; - dst_nzc_probs = cm->fc.nzc_probs_16x16[0][0][0]; - pre_nzc_probs = cm->fc.pre_nzc_probs_16x16[0][0][0]; - nzc_counts = cm->fc.nzc_counts_16x16[0][0][0]; + zpc_probs = &cm->fc.zpc_probs_16x16; + pre_zpc_probs = &cm->fc.pre_zpc_probs_16x16; + zpc_counts = &cm->fc.zpc_counts_16x16; } else if (tx_size == TX_8X8) { - tokens = NZC8X8_TOKENS; - nzc_tree = vp9_nzc8x8_tree; - dst_nzc_probs = cm->fc.nzc_probs_8x8[0][0][0]; - pre_nzc_probs = cm->fc.pre_nzc_probs_8x8[0][0][0]; - nzc_counts = cm->fc.nzc_counts_8x8[0][0][0]; + zpc_probs = &cm->fc.zpc_probs_8x8; + pre_zpc_probs = &cm->fc.pre_zpc_probs_8x8; + zpc_counts = &cm->fc.zpc_counts_8x8; } else { - nzc_tree = vp9_nzc4x4_tree; - tokens = NZC4X4_TOKENS; - dst_nzc_probs = cm->fc.nzc_probs_4x4[0][0][0]; - pre_nzc_probs = cm->fc.pre_nzc_probs_4x4[0][0][0]; - nzc_counts = cm->fc.nzc_counts_4x4[0][0][0]; + zpc_probs = &cm->fc.zpc_probs_4x4; + pre_zpc_probs = &cm->fc.pre_zpc_probs_4x4; + zpc_counts = &cm->fc.zpc_counts_4x4; } - nodes = tokens - 1; - for (c = 0; c < MAX_NZC_CONTEXTS; ++c) - for (r = 0; r < REF_TYPES; ++r) - for (b = 0; b < BLOCK_TYPES; ++b) { - int offset = c * REF_TYPES * BLOCK_TYPES + r * BLOCK_TYPES + b; - int offset_nodes = offset * nodes; - int offset_tokens = offset * tokens; - vp9_tree_probs_from_distribution(nzc_tree, - nzc_probs, nzc_branch_ct, - nzc_counts + offset_tokens, 0); - for (n = 0; n < nodes; ++n) { - count = nzc_branch_ct[n][0] + nzc_branch_ct[n][1]; + for (r = 0; r < REF_TYPES; ++r) { + for (b = 0; b < ZPC_BANDS; ++b) { + for (p = 0; p < ZPC_PTOKS; ++p) { + for (n = 0; n < ZPC_NODES; ++n) { + vp9_prob prob = get_binary_prob((*zpc_counts)[r][b][p][n][0], + (*zpc_counts)[r][b][p][n][1]); + count = (*zpc_counts)[r][b][p][n][0] + (*zpc_counts)[r][b][p][n][1]; count = count > count_sat ? count_sat : count; factor = (update_factor * count / count_sat); - dst_nzc_probs[offset_nodes + n] = - weighted_prob(pre_nzc_probs[offset_nodes + n], - nzc_probs[n], factor); + (*zpc_probs)[r][b][p][n] = weighted_prob( + (*pre_zpc_probs)[r][b][p][n], prob, factor); } } -} - -static void adapt_nzc_pcat(VP9_COMMON *cm, int count_sat, int update_factor) { - int c, t; - int count, factor; - if (!(get_nzc_used(TX_4X4) || get_nzc_used(TX_8X8) || - get_nzc_used(TX_16X16) || get_nzc_used(TX_32X32))) - return; - for (c = 0; c < MAX_NZC_CONTEXTS; ++c) { - for (t = 0; t < NZC_TOKENS_EXTRA; ++t) { - int bits = vp9_extranzcbits[t + NZC_TOKENS_NOEXTRA]; - int b; - for (b = 0; b < bits; ++b) { - vp9_prob prob = get_binary_prob(cm->fc.nzc_pcat_counts[c][t][b][0], - cm->fc.nzc_pcat_counts[c][t][b][1]); - count = cm->fc.nzc_pcat_counts[c][t][b][0] + - cm->fc.nzc_pcat_counts[c][t][b][1]; - count = count > count_sat ? count_sat : count; - factor = (update_factor * count / count_sat); - cm->fc.nzc_pcat_probs[c][t][b] = weighted_prob( - cm->fc.pre_nzc_pcat_probs[c][t][b], prob, factor); - } } } } -// #define NZC_COUNT_TESTING -void vp9_adapt_nzc_probs(VP9_COMMON *cm) { +// #define ZPC_COUNT_TESTING +void vp9_adapt_zpc_probs(VP9_COMMON *cm) { int count_sat; int update_factor; /* denominator 256 */ -#ifdef NZC_COUNT_TESTING - int c, r, b, t; - printf("\n"); - for (c = 0; c < MAX_NZC_CONTEXTS; ++c) - for (r = 0; r < REF_TYPES; ++r) { - for (b = 0; b < BLOCK_TYPES; ++b) { - printf(" {"); - for (t = 0; t < NZC4X4_TOKENS; ++t) { - printf(" %d,", cm->fc.nzc_counts_4x4[c][r][b][t]); - } - printf("}\n"); - } - printf("\n"); - } -#endif if (cm->frame_type == KEY_FRAME) { update_factor = COEF_MAX_UPDATE_FACTOR_KEY; @@ -2894,10 +1699,9 @@ void vp9_adapt_nzc_probs(VP9_COMMON *cm) { count_sat = COEF_COUNT_SAT; } - adapt_nzc_probs_common(cm, TX_4X4, count_sat, update_factor); - adapt_nzc_probs_common(cm, TX_8X8, count_sat, update_factor); - adapt_nzc_probs_common(cm, TX_16X16, count_sat, update_factor); - adapt_nzc_probs_common(cm, TX_32X32, count_sat, update_factor); - adapt_nzc_pcat(cm, count_sat, update_factor); + adapt_zpc_probs_common(cm, TX_4X4, count_sat, update_factor); + adapt_zpc_probs_common(cm, TX_8X8, count_sat, update_factor); + adapt_zpc_probs_common(cm, TX_16X16, count_sat, update_factor); + adapt_zpc_probs_common(cm, TX_32X32, count_sat, update_factor); } -#endif // CONFIG_CODE_NONZEROCOUNT +#endif // CONFIG_CODE_ZEROGROUP |