diff options
author | Ronald S. Bultje <rbultje@google.com> | 2012-12-07 16:09:59 -0800 |
---|---|---|
committer | Ronald S. Bultje <rbultje@google.com> | 2012-12-07 16:09:59 -0800 |
commit | 885cf816ebb85ad795d7a21c15103e734eaa1bcd (patch) | |
tree | a8a43e3e08ceab5c420ea1219d372748a2175698 /vp9/decoder | |
parent | c456b35fdf1b1e9fd3c964b822e9de05437544e2 (diff) | |
download | libvpx-885cf816ebb85ad795d7a21c15103e734eaa1bcd.tar libvpx-885cf816ebb85ad795d7a21c15103e734eaa1bcd.tar.gz libvpx-885cf816ebb85ad795d7a21c15103e734eaa1bcd.tar.bz2 libvpx-885cf816ebb85ad795d7a21c15103e734eaa1bcd.zip |
Introduce vp9_coeff_probs/counts/stats/accum types.
Use these, instead of the 4/5-dimensional arrays, to hold statistics,
counts, accumulations and probabilities for coefficient tokens. This
commit also re-allows ENTROPY_STATS to compile.
Change-Id: If441ffac936f52a3af91d8f2922ea8a0ceabdaa5
Diffstat (limited to 'vp9/decoder')
-rw-r--r-- | vp9/decoder/vp9_decodframe.c | 36 | ||||
-rw-r--r-- | vp9/decoder/vp9_detokenize.c | 47 | ||||
-rw-r--r-- | vp9/decoder/vp9_onyxd_int.h | 2 |
3 files changed, 43 insertions, 42 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 7f851a18a..ffdf9f371 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -1231,14 +1231,13 @@ static void init_frame(VP9D_COMP *pbi) { } -static void read_coef_probs_common( - BOOL_DECODER* const bc, - vp9_prob coef_probs[BLOCK_TYPES][COEF_BANDS] - [PREV_COEF_CONTEXTS][ENTROPY_NODES]) { +static void read_coef_probs_common(BOOL_DECODER* const bc, + vp9_coeff_probs *coef_probs, + int block_types) { int i, j, k, l; if (vp9_read_bit(bc)) { - for (i = 0; i < BLOCK_TYPES; i++) { + for (i = 0; i < block_types; i++) { for (j = !i; j < COEF_BANDS; j++) { /* NB: This j loop starts from 1 on block type i == 0 */ for (k = 0; k < PREV_COEF_CONTEXTS; k++) { @@ -1261,20 +1260,21 @@ static void read_coef_probs_common( static void read_coef_probs(VP9D_COMP *pbi, BOOL_DECODER* const bc) { VP9_COMMON *const pc = &pbi->common; - read_coef_probs_common(bc, pc->fc.coef_probs); - read_coef_probs_common(bc, pc->fc.hybrid_coef_probs); + read_coef_probs_common(bc, pc->fc.coef_probs_4x4, BLOCK_TYPES_4X4); + read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_4x4, BLOCK_TYPES_4X4); if (pbi->common.txfm_mode != ONLY_4X4) { - read_coef_probs_common(bc, pc->fc.coef_probs_8x8); - read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_8x8); + read_coef_probs_common(bc, pc->fc.coef_probs_8x8, BLOCK_TYPES_8X8); + read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_8x8, BLOCK_TYPES_8X8); } if (pbi->common.txfm_mode > ALLOW_8X8) { - read_coef_probs_common(bc, pc->fc.coef_probs_16x16); - read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_16x16); + read_coef_probs_common(bc, pc->fc.coef_probs_16x16, BLOCK_TYPES_16X16); + read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_16x16, + BLOCK_TYPES_16X16); } #if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS if (pbi->common.txfm_mode > ALLOW_16X16) { - read_coef_probs_common(bc, pc->fc.coef_probs_32x32); + read_coef_probs_common(bc, pc->fc.coef_probs_32x32, BLOCK_TYPES_32X32); } #endif } @@ -1619,10 +1619,10 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) { fclose(z); } - vp9_copy(pbi->common.fc.pre_coef_probs, - pbi->common.fc.coef_probs); - vp9_copy(pbi->common.fc.pre_hybrid_coef_probs, - pbi->common.fc.hybrid_coef_probs); + vp9_copy(pbi->common.fc.pre_coef_probs_4x4, + pbi->common.fc.coef_probs_4x4); + vp9_copy(pbi->common.fc.pre_hybrid_coef_probs_4x4, + pbi->common.fc.hybrid_coef_probs_4x4); vp9_copy(pbi->common.fc.pre_coef_probs_8x8, pbi->common.fc.coef_probs_8x8); vp9_copy(pbi->common.fc.pre_hybrid_coef_probs_8x8, @@ -1648,8 +1648,8 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) { pbi->common.fc.pre_interintra_prob = pbi->common.fc.interintra_prob; #endif pbi->common.fc.pre_nmvc = pbi->common.fc.nmvc; - vp9_zero(pbi->common.fc.coef_counts); - vp9_zero(pbi->common.fc.hybrid_coef_counts); + vp9_zero(pbi->common.fc.coef_counts_4x4); + vp9_zero(pbi->common.fc.hybrid_coef_counts_4x4); vp9_zero(pbi->common.fc.coef_counts_8x8); vp9_zero(pbi->common.fc.hybrid_coef_counts_8x8); vp9_zero(pbi->common.fc.coef_counts_16x16); diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c index 35a26477a..46ccf627f 100644 --- a/vp9/decoder/vp9_detokenize.c +++ b/vp9/decoder/vp9_detokenize.c @@ -100,10 +100,10 @@ static int get_signed(BOOL_DECODER *br, int value_to_sign) { return v; } -#define INCREMENT_COUNT(token) \ - do { \ - coef_counts[coef_bands[c]][pt][token]++; \ - pt = vp9_prev_token_class[token]; \ +#define INCREMENT_COUNT(token) \ + do { \ + coef_counts[type][coef_bands[c]][pt][token]++; \ + pt = vp9_prev_token_class[token]; \ } while (0) #define WRITE_COEF_CONTINUE(val, token) \ @@ -130,42 +130,43 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd, const int *coef_bands) { FRAME_CONTEXT *const fc = &dx->common.fc; int pt, c = (type == PLANE_TYPE_Y_NO_DC); - vp9_prob (*coef_probs)[PREV_COEF_CONTEXTS][ENTROPY_NODES], *prob; - unsigned int (*coef_counts)[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; + vp9_coeff_probs *coef_probs; + vp9_prob *prob; + vp9_coeff_count *coef_counts; switch (txfm_size) { default: case TX_4X4: if (tx_type == DCT_DCT) { - coef_probs = fc->coef_probs[type]; - coef_counts = fc->coef_counts[type]; + coef_probs = fc->coef_probs_4x4; + coef_counts = fc->coef_counts_4x4; } else { - coef_probs = fc->hybrid_coef_probs[type]; - coef_counts = fc->hybrid_coef_counts[type]; + coef_probs = fc->hybrid_coef_probs_4x4; + coef_counts = fc->hybrid_coef_counts_4x4; } break; case TX_8X8: if (tx_type == DCT_DCT) { - coef_probs = fc->coef_probs_8x8[type]; - coef_counts = fc->coef_counts_8x8[type]; + coef_probs = fc->coef_probs_8x8; + coef_counts = fc->coef_counts_8x8; } else { - coef_probs = fc->hybrid_coef_probs_8x8[type]; - coef_counts = fc->hybrid_coef_counts_8x8[type]; + coef_probs = fc->hybrid_coef_probs_8x8; + coef_counts = fc->hybrid_coef_counts_8x8; } break; case TX_16X16: if (tx_type == DCT_DCT) { - coef_probs = fc->coef_probs_16x16[type]; - coef_counts = fc->coef_counts_16x16[type]; + coef_probs = fc->coef_probs_16x16; + coef_counts = fc->coef_counts_16x16; } else { - coef_probs = fc->hybrid_coef_probs_16x16[type]; - coef_counts = fc->hybrid_coef_counts_16x16[type]; + coef_probs = fc->hybrid_coef_probs_16x16; + coef_counts = fc->hybrid_coef_counts_16x16; } break; #if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS case TX_32X32: - coef_probs = fc->coef_probs_32x32[type]; - coef_counts = fc->coef_counts_32x32[type]; + coef_probs = fc->coef_probs_32x32; + coef_counts = fc->coef_counts_32x32; break; #endif } @@ -175,7 +176,7 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd, int val; const uint8_t *cat6 = cat6_prob; if (c >= seg_eob) break; - prob = coef_probs[coef_bands[c]][pt]; + prob = coef_probs[type][coef_bands[c]][pt]; if (!vp9_read(br, prob[EOB_CONTEXT_NODE])) break; SKIP_START: @@ -183,7 +184,7 @@ SKIP_START: if (!vp9_read(br, prob[ZERO_CONTEXT_NODE])) { INCREMENT_COUNT(ZERO_TOKEN); ++c; - prob = coef_probs[coef_bands[c]][pt]; + prob = coef_probs[type][coef_bands[c]][pt]; goto SKIP_START; } // ONE_CONTEXT_NODE_0_ @@ -247,7 +248,7 @@ SKIP_START: } if (c < seg_eob) - coef_counts[coef_bands[c]][pt][DCT_EOB_TOKEN]++; + coef_counts[type][coef_bands[c]][pt][DCT_EOB_TOKEN]++; a[0] = l[0] = (c > !type); diff --git a/vp9/decoder/vp9_onyxd_int.h b/vp9/decoder/vp9_onyxd_int.h index e4f3228c7..471442944 100644 --- a/vp9/decoder/vp9_onyxd_int.h +++ b/vp9/decoder/vp9_onyxd_int.h @@ -46,7 +46,7 @@ typedef struct { INT16 *qcoeff_start_ptr; - vp9_prob const *coef_probs[BLOCK_TYPES]; + vp9_prob const *coef_probs_4x4[BLOCK_TYPES_4X4]; vp9_prob const *coef_probs_8x8[BLOCK_TYPES_8X8]; vp9_prob const *coef_probs_16X16[BLOCK_TYPES_16X16]; |