shithub: libvpx

Download patch

ref: 511ef2072c43c6d2c352dc3219563c8bf94f5d78
parent: 56352f189d4bb4c727e9a968053b372e0963d0fc
author: Ronald S. Bultje <rbultje@google.com>
date: Sat Nov 17 05:35:47 EST 2012

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

--- a/vp9/decoder/detokenize.c
+++ b/vp9/decoder/detokenize.c
@@ -119,45 +119,6 @@
 // #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 @@
   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 @@
                         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 @@
       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 @@
 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,6 +230,7 @@
     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;
     }
@@ -267,12 +237,12 @@
     // 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])) {
@@ -279,12 +249,12 @@
       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,7 +263,7 @@
         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);
@@ -300,7 +270,7 @@
       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,7 +280,7 @@
       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) {
@@ -317,11 +287,11 @@
       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;
 }