Make lv-map decoding support per symbol cdf update

Support the per symbol cdf update at the level map syntax element
decoding process.

Change-Id: Id58bf86fb1c7c72dd14ddaa3781caaa27f446ef7
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 725cb7e..f7b81ff 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -20,6 +20,7 @@
 #endif
 
 #if CONFIG_LV_MAP
+#include "av1/common/txb_common.h"
 const aom_prob default_txb_skip[TX_SIZES][TXB_SKIP_CONTEXTS] = {
 #if CONFIG_CHROMA_2X2
   { 252, 71, 126, 184, 178, 218, 251, 49, 133, 221, 27, 92, 197 },
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c
index 6e38427..2ddb0f2 100644
--- a/av1/decoder/decodetxb.c
+++ b/av1/decoder/decodetxb.c
@@ -48,8 +48,10 @@
   FRAME_COUNTS *counts = xd->counts;
   TX_SIZE txs_ctx = get_txsize_context(tx_size);
   PLANE_TYPE plane_type = get_plane_type(plane);
+#if !LV_MAP_PROB
   aom_prob *nz_map = cm->fc->nz_map[txs_ctx][plane_type];
   aom_prob *eob_flag = cm->fc->eob_flag[txs_ctx][plane_type];
+#endif
   MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
   const int seg_eob = tx_size_2d[tx_size];
   int c = 0;
@@ -65,8 +67,13 @@
 
   memset(tcoeffs, 0, sizeof(*tcoeffs) * seg_eob);
 
+#if LV_MAP_PROB
+  int all_zero = aom_read_symbol(
+      r, cm->fc->txb_skip_cdf[txs_ctx][txb_ctx->txb_skip_ctx], 2, ACCT_STR);
+#else
   int all_zero =
       aom_read(r, cm->fc->txb_skip[txs_ctx][txb_ctx->txb_skip_ctx], ACCT_STR);
+#endif
   if (xd->counts)
     ++xd->counts->txb_skip[txs_ctx][txb_ctx->txb_skip_ctx][all_zero];
 
@@ -96,10 +103,16 @@
     int coeff_ctx = get_nz_map_ctx(tcoeffs, scan[c], bwl, height, iscan);
     int eob_ctx = get_eob_ctx(tcoeffs, scan[c], txs_ctx);
 
-    if (c < seg_eob - 1)
+    if (c < seg_eob - 1) {
+#if LV_MAP_PROB
+      is_nz = aom_read_symbol(
+          r, cm->fc->nz_map_cdf[txs_ctx][plane_type][coeff_ctx], 2, ACCT_STR);
+#else
       is_nz = aom_read(r, nz_map[coeff_ctx], ACCT_STR);
-    else
+#endif
+    } else {
       is_nz = 1;
+    }
 
     // set non-zero coefficient map.
     tcoeffs[scan[c]] = is_nz;
@@ -112,7 +125,12 @@
     if (counts) ++(*nz_map_count)[coeff_ctx][is_nz];
 
     if (is_nz) {
+#if LV_MAP_PROB
+      int is_eob = aom_read_symbol(
+          r, cm->fc->eob_flag_cdf[txs_ctx][plane_type][eob_ctx], 2, ACCT_STR);
+#else
       int is_eob = aom_read(r, eob_flag[eob_ctx], ACCT_STR);
+#endif
       if (counts) ++counts->eob_flag[txs_ctx][plane_type][eob_ctx][is_eob];
       if (is_eob) break;
     }
@@ -123,8 +141,9 @@
 
   int i;
   for (i = 0; i < NUM_BASE_LEVELS; ++i) {
+#if !LV_MAP_PROB
     aom_prob *coeff_base = cm->fc->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]];
@@ -135,7 +154,14 @@
 
       ctx = get_base_ctx(tcoeffs, scan[c], bwl, height, i + 1);
 
-      if (aom_read(r, coeff_base[ctx], ACCT_STR)) {
+#if LV_MAP_PROB
+      if (aom_read_symbol(r,
+                          cm->fc->coeff_base_cdf[txs_ctx][plane_type][i][ctx],
+                          2, ACCT_STR))
+#else
+      if (aom_read(r, coeff_base[ctx], ACCT_STR))
+#endif
+      {
         *v = i + 1;
         cul_level += i + 1;
 
@@ -143,8 +169,13 @@
 
         if (c == 0) {
           int dc_sign_ctx = txb_ctx->dc_sign_ctx;
+#if LV_MAP_PROB
+          sign = aom_read_symbol(
+              r, cm->fc->dc_sign_cdf[plane_type][dc_sign_ctx], 2, ACCT_STR);
+#else
           sign =
               aom_read(r, cm->fc->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
+#endif
           if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
         } else {
           sign = aom_read_bit(r, ACCT_STR);
@@ -170,7 +201,12 @@
 
     if (c == 0) {
       int dc_sign_ctx = txb_ctx->dc_sign_ctx;
+#if LV_MAP_PROB
+      sign = aom_read_symbol(r, cm->fc->dc_sign_cdf[plane_type][dc_sign_ctx], 2,
+                             ACCT_STR);
+#else
       sign = aom_read(r, cm->fc->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
+#endif
       if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
     } else {
       sign = aom_read_bit(r, ACCT_STR);
@@ -181,7 +217,13 @@
     if (cm->fc->coeff_lps[txs_ctx][plane_type][ctx] == 0) exit(0);
 
     for (idx = 0; idx < COEFF_BASE_RANGE; ++idx) {
-      if (aom_read(r, cm->fc->coeff_lps[txs_ctx][plane_type][ctx], ACCT_STR)) {
+#if LV_MAP_PROB
+      if (aom_read_symbol(r, cm->fc->coeff_lps_cdf[txs_ctx][plane_type][ctx], 2,
+                          ACCT_STR))
+#else
+      if (aom_read(r, cm->fc->coeff_lps[txs_ctx][plane_type][ctx], ACCT_STR))
+#endif
+      {
         *v = (idx + 1 + NUM_BASE_LEVELS);
         if (sign) *v = -(*v);
         cul_level += abs(*v);
@@ -283,6 +325,11 @@
   const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode];
   TX_SIZE tx_size;
   int ctx, plane;
+
+#if LV_MAP_PROB
+  return;
+#endif
+
   for (plane = 0; plane < PLANE_TYPES; ++plane)
     for (ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
       av1_diff_update_prob(r, &fc->dc_sign[plane][ctx], ACCT_STR);
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index 83fd9c0..d531573 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -1762,6 +1762,10 @@
   TX_SIZE tx_size;
   int ctx, plane;
 
+#if LV_MAP_PROB
+  return;
+#endif
+
   for (plane = 0; plane < PLANE_TYPES; ++plane)
     for (ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
       av1_cond_prob_diff_update(w, &cpi->common.fc->dc_sign[plane][ctx],