Update txb context calculation code

Split coefficients into signs (0 or 1) and levels (0 to 255),
so that they both can be fit in 1-byte.

Change-Id: I0f486368b7b819a77aaddda4710e83189e53fc55
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c
index 13f944b..df8bc11 100644
--- a/av1/decoder/decodetxb.c
+++ b/av1/decoder/decodetxb.c
@@ -289,6 +289,9 @@
   const int bwl = b_width_log2_lookup[txsize_to_bsize[tx_size]] + 2;
   const int height = tx_size_high[tx_size];
   int cul_level = 0;
+  uint8_t levels[64 * 64];
+  int8_t signs[64 * 64];
+
   memset(tcoeffs, 0, sizeof(*tcoeffs) * seg_eob);
 
 #if LV_MAP_PROB
@@ -311,6 +314,8 @@
     return 0;
   }
 
+  memset(signs, 0, sizeof(signs[0]) * seg_eob);
+
   (void)blk_row;
   (void)blk_col;
 #if CONFIG_TXK_SEL
@@ -357,19 +362,23 @@
   *max_scan_line = *eob;
 
   int i;
+  for (i = 0; i < seg_eob; i++) {
+    levels[i] = (uint8_t)tcoeffs[i];
+  }
+
   for (i = 0; i < NUM_BASE_LEVELS; ++i) {
 #if !LV_MAP_PROB
     aom_prob *coeff_base = ec_ctx->coeff_base[txs_ctx][plane_type][i];
 #endif
     update_eob = 0;
     for (c = *eob - 1; c >= 0; --c) {
-      tran_low_t *v = &tcoeffs[scan[c]];
-      int sign;
+      uint8_t *const level = &levels[scan[c]];
+      int8_t *const sign = &signs[scan[c]];
       int ctx;
 
-      if (*v <= i) continue;
+      if (*level <= i) continue;
 
-      ctx = get_base_ctx(tcoeffs, scan[c], bwl, height, i + 1);
+      ctx = get_base_ctx(levels, scan[c], bwl, height, i + 1);
 
 #if LV_MAP_PROB
       if (av1_read_record_bin(
@@ -379,7 +388,7 @@
       if (aom_read(r, coeff_base[ctx], ACCT_STR))
 #endif
       {
-        *v = i + 1;
+        assert(*level == i + 1);
         cul_level += i + 1;
 
         if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][1];
@@ -387,21 +396,20 @@
         if (c == 0) {
           int dc_sign_ctx = txb_ctx->dc_sign_ctx;
 #if LV_MAP_PROB
-          sign = av1_read_record_bin(
+          *sign = av1_read_record_bin(
               counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2,
               ACCT_STR);
 #else
-          sign =
+          *sign =
               aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
 #endif
-          if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
+          if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
         } else {
-          sign = av1_read_record_bit(counts, r, ACCT_STR);
+          *sign = av1_read_record_bit(counts, r, ACCT_STR);
         }
-        if (sign) *v = -(*v);
         continue;
       }
-      *v = i + 2;
+      *level = i + 2;
       if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][0];
 
       // update the eob flag for coefficients with magnitude above 1.
@@ -410,27 +418,27 @@
   }
 
   for (c = update_eob; c >= 0; --c) {
-    tran_low_t *v = &tcoeffs[scan[c]];
-    int sign;
+    uint8_t *const level = &levels[scan[c]];
+    int8_t *const sign = &signs[scan[c]];
     int idx;
     int ctx;
 
-    if (*v <= NUM_BASE_LEVELS) continue;
+    if (*level <= NUM_BASE_LEVELS) continue;
 
     if (c == 0) {
       int dc_sign_ctx = txb_ctx->dc_sign_ctx;
 #if LV_MAP_PROB
-      sign = av1_read_record_bin(
+      *sign = av1_read_record_bin(
           counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2, ACCT_STR);
 #else
-      sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
+      *sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
 #endif
-      if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
+      if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
     } else {
-      sign = av1_read_record_bit(counts, r, ACCT_STR);
+      *sign = av1_read_record_bit(counts, r, ACCT_STR);
     }
 
-    ctx = get_br_ctx(tcoeffs, scan[c], bwl, height);
+    ctx = get_br_ctx(levels, scan[c], bwl, height);
 
 #if BR_NODE
     for (idx = 0; idx < BASE_RANGE_SETS; ++idx) {
@@ -468,9 +476,8 @@
 
         int br_base = br_index_to_coeff[idx];
 
-        *v = NUM_BASE_LEVELS + 1 + br_base + br_offset;
-        cul_level += *v;
-        if (sign) *v = -(*v);
+        *level = NUM_BASE_LEVELS + 1 + br_base + br_offset;
+        cul_level += *level;
         break;
       }
       if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][0];
@@ -487,9 +494,8 @@
       if (aom_read(r, ec_ctx->coeff_lps[txs_ctx][plane_type][ctx], ACCT_STR))
 #endif
       {
-        *v = (idx + 1 + NUM_BASE_LEVELS);
-        if (sign) *v = -(*v);
-        cul_level += abs(*v);
+        *level = idx + 1 + NUM_BASE_LEVELS;
+        cul_level += *level;
 
         if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][1];
         break;
@@ -500,20 +506,19 @@
 #endif
 
     // decode 0-th order Golomb code
-    *v = read_golomb(xd, r, counts) + COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
-    if (sign) *v = -(*v);
-    cul_level += abs(*v);
+    *level =
+        read_golomb(xd, r, counts) + COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
+    cul_level += *level;
   }
 
   for (c = 0; c < *eob; ++c) {
-    int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
-    tran_low_t *v = &tcoeffs[scan[c]];
+    const int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
+    const int level = levels[scan[c]];
+    const int16_t t = (level * dqv) >> shift;
 #if CONFIG_SYMBOLRATE
-    av1_record_coeff(counts, abs(*v));
+    av1_record_coeff(counts, level);
 #endif
-    int sign = (*v) < 0;
-    *v = (abs(*v) * dqv) >> shift;
-    if (sign) *v = -(*v);
+    tcoeffs[scan[c]] = signs[scan[c]] ? -t : t;
   }
 
   cul_level = AOMMIN(63, cul_level);