summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@google.com>2012-12-07 16:09:59 -0800
committerRonald S. Bultje <rbultje@google.com>2012-12-07 16:09:59 -0800
commit885cf816ebb85ad795d7a21c15103e734eaa1bcd (patch)
treea8a43e3e08ceab5c420ea1219d372748a2175698 /vp9/decoder
parentc456b35fdf1b1e9fd3c964b822e9de05437544e2 (diff)
downloadlibvpx-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.c36
-rw-r--r--vp9/decoder/vp9_detokenize.c47
-rw-r--r--vp9/decoder/vp9_onyxd_int.h2
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];