summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@google.com>2012-11-17 10:35:47 -0800
committerRonald S. Bultje <rbultje@google.com>2012-11-17 10:35:47 -0800
commit511ef2072c43c6d2c352dc3219563c8bf94f5d78 (patch)
tree928eeb5daec018c0c7699d3fa372374d9befddf1
parent56352f189d4bb4c727e9a968053b372e0963d0fc (diff)
downloadlibvpx-511ef2072c43c6d2c352dc3219563c8bf94f5d78.tar
libvpx-511ef2072c43c6d2c352dc3219563c8bf94f5d78.tar.gz
libvpx-511ef2072c43c6d2c352dc3219563c8bf94f5d78.tar.bz2
libvpx-511ef2072c43c6d2c352dc3219563c8bf94f5d78.zip
Inline count_tokens() in decode_coefs().
This prevents the relatively expensive token-from-coefficient lookup function get_token(), plus a duplicate loop.. Change-Id: Ibecd407b2a91d3593d439ec4646e43fa26d2ff91
-rw-r--r--vp9/decoder/detokenize.c78
1 files changed, 24 insertions, 54 deletions
diff --git a/vp9/decoder/detokenize.c b/vp9/decoder/detokenize.c
index 6dc48613c..dff92dca5 100644
--- a/vp9/decoder/detokenize.c
+++ b/vp9/decoder/detokenize.c
@@ -119,45 +119,6 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp9_norm[256]);
// #define PREV_CONTEXT_INC(val) (vp9_prev_token_class[(val)])
#define PREV_CONTEXT_INC(val) (vp9_prev_token_class[(val)>10?10:(val)])
-static int get_token(int v) {
- if (v < 0) v = -v;
- if (v == 0) return ZERO_TOKEN;
- else if (v == 1) return ONE_TOKEN;
- else if (v == 2) return TWO_TOKEN;
- else if (v == 3) return THREE_TOKEN;
- else if (v == 4) return FOUR_TOKEN;
- else if (v <= 6) return DCT_VAL_CATEGORY1;
- else if (v <= 10) return DCT_VAL_CATEGORY2;
- else if (v <= 18) return DCT_VAL_CATEGORY3;
- else if (v <= 34) return DCT_VAL_CATEGORY4;
- else if (v <= 66) return DCT_VAL_CATEGORY5;
- else return DCT_VAL_CATEGORY6;
-}
-
-static void count_tokens(INT16 *qcoeff_ptr, PLANE_TYPE type,
- ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
- int eob, int seg_eob,
- const int *scan, const int *bands,
- unsigned int (*coef_counts)[PREV_COEF_CONTEXTS]
- [MAX_ENTROPY_TOKENS]) {
- int c, pt, token, band;
-
- VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- for (c = !type; c < eob; ++c) {
- int rc = scan[c];
- int v = qcoeff_ptr[rc];
- band = bands[c];
- token = get_token(v);
- coef_counts[band][pt][token]++;
- pt = vp9_prev_token_class[token];
- }
-
- if (eob < seg_eob) {
- band = bands[c];
- coef_counts[band][pt][DCT_EOB_TOKEN]++;
- }
-}
-
static int get_signed(BOOL_DECODER *br, int value_to_sign) {
const int split = (br->range + 1) >> 1;
const VP9_BD_VALUE bigsplit = (VP9_BD_VALUE)split << (VP9_BD_VALUE_SIZE - 8);
@@ -181,10 +142,17 @@ static int get_signed(BOOL_DECODER *br, int value_to_sign) {
return v;
}
-#define WRITE_COEF_CONTINUE(val) \
+#define INCREMENT_COUNT(token) \
+ do { \
+ coef_counts[coef_bands[c]][pt][token]++; \
+ pt = vp9_prev_token_class[token]; \
+ } while (0)
+
+#define WRITE_COEF_CONTINUE(val, token) \
{ \
prob = coef_probs + (ENTROPY_NODES*PREV_CONTEXT_INC(val));\
qcoeff_ptr[scan[c]] = (INT16) get_signed(br, val); \
+ INCREMENT_COUNT(token); \
c++; \
continue; \
}
@@ -205,7 +173,7 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
const int *coef_bands_x,
const int *coef_bands) {
FRAME_CONTEXT *const fc = &dx->common.fc;
- int tmp, c = (type == PLANE_TYPE_Y_NO_DC);
+ int pt, c = (type == PLANE_TYPE_Y_NO_DC);
const vp9_prob *prob, *coef_probs;
unsigned int (*coef_counts)[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
@@ -240,8 +208,8 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
break;
}
- VP9_COMBINEENTROPYCONTEXTS(tmp, *a, *l);
- prob = coef_probs + tmp * ENTROPY_NODES;
+ VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
+ prob = coef_probs + pt * ENTROPY_NODES;
while (1) {
int val;
@@ -253,6 +221,7 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
SKIP_START:
if (c >= seg_eob) break;
if (!vp9_read(br, prob[ZERO_CONTEXT_NODE])) {
+ INCREMENT_COUNT(ZERO_TOKEN);
++c;
prob = coef_probs + coef_bands_x[c];
goto SKIP_START;
@@ -261,30 +230,31 @@ SKIP_START:
if (!vp9_read(br, prob[ONE_CONTEXT_NODE])) {
prob = coef_probs + ENTROPY_NODES;
qcoeff_ptr[scan[c]] = (INT16) get_signed(br, 1);
+ INCREMENT_COUNT(ONE_TOKEN);
++c;
continue;
}
// LOW_VAL_CONTEXT_NODE_0_
if (!vp9_read(br, prob[LOW_VAL_CONTEXT_NODE])) {
if (!vp9_read(br, prob[TWO_CONTEXT_NODE])) {
- WRITE_COEF_CONTINUE(2);
+ WRITE_COEF_CONTINUE(2, TWO_TOKEN);
}
if (!vp9_read(br, prob[THREE_CONTEXT_NODE])) {
- WRITE_COEF_CONTINUE(3);
+ WRITE_COEF_CONTINUE(3, THREE_TOKEN);
}
- WRITE_COEF_CONTINUE(4);
+ WRITE_COEF_CONTINUE(4, FOUR_TOKEN);
}
// HIGH_LOW_CONTEXT_NODE_0_
if (!vp9_read(br, prob[HIGH_LOW_CONTEXT_NODE])) {
if (!vp9_read(br, prob[CAT_ONE_CONTEXT_NODE])) {
val = CAT1_MIN_VAL;
ADJUST_COEF(CAT1_PROB0, 0);
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY1);
}
val = CAT2_MIN_VAL;
ADJUST_COEF(CAT2_PROB1, 1);
ADJUST_COEF(CAT2_PROB0, 0);
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY2);
}
// CAT_THREEFOUR_CONTEXT_NODE_0_
if (!vp9_read(br, prob[CAT_THREEFOUR_CONTEXT_NODE])) {
@@ -293,14 +263,14 @@ SKIP_START:
ADJUST_COEF(CAT3_PROB2, 2);
ADJUST_COEF(CAT3_PROB1, 1);
ADJUST_COEF(CAT3_PROB0, 0);
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY3);
}
val = CAT4_MIN_VAL;
ADJUST_COEF(CAT4_PROB3, 3);
ADJUST_COEF(CAT4_PROB2, 2);
ADJUST_COEF(CAT4_PROB1, 1);
ADJUST_COEF(CAT4_PROB0, 0);
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY4);
}
// CAT_FIVE_CONTEXT_NODE_0_:
if (!vp9_read(br, prob[CAT_FIVE_CONTEXT_NODE])) {
@@ -310,18 +280,18 @@ SKIP_START:
ADJUST_COEF(CAT5_PROB2, 2);
ADJUST_COEF(CAT5_PROB1, 1);
ADJUST_COEF(CAT5_PROB0, 0);
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY5);
}
val = 0;
while (*cat6) {
val = (val << 1) | vp9_read(br, *cat6++);
}
val += CAT6_MIN_VAL;
- WRITE_COEF_CONTINUE(val);
+ WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY6);
}
- count_tokens(qcoeff_ptr, type, a, l, c, seg_eob, scan,
- coef_bands, coef_counts);
+ if (c < seg_eob)
+ coef_counts[coef_bands[c]][pt][DCT_EOB_TOKEN]++;
return c;
}