[NORMATIVE] Unify tx size context model for inter / intra blocks

Unify the transform block size coding context model for intra
block with that for inter block.

Tested on 30 frames in speed 1. The coding performance changes are

lowres: PSNR 0.019%, SSIM -0.125%
lowres_cam: PSNR -0.045%, SSIM -0.25%
midres: PSNR -0.042%, SSIM -0.089%

BUG=aomedia:1057

Change-Id: If52825a7c8355f2c4baf1854cecb29ee61579200
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index af9648f..4f69604 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -650,27 +650,49 @@
     };
 #endif
 
-static const aom_cdf_prob
-    default_tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS][CDF_SIZE(MAX_TX_DEPTH +
-                                                                1)] = {
+static const aom_cdf_prob default_tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS]
+                                             [CDF_SIZE(MAX_TX_DEPTH + 1)] = {
 #if MAX_TX_DEPTH == 2
-      { { AOM_CDF2(19968) }, { AOM_CDF2(24320) } },
-      { { AOM_CDF3(12272, 30172) }, { AOM_CDF3(18677, 30848) } },
-      { { AOM_CDF3(12986, 15180) }, { AOM_CDF3(24302, 25602) } },
-      { { AOM_CDF3(5782, 11475) }, { AOM_CDF3(16803, 22759) } },
+                                               { { AOM_CDF2(19968) },
+                                                 { AOM_CDF2(19968) },
+                                                 { AOM_CDF2(24320) } },
+                                               { { AOM_CDF3(12272, 30172) },
+                                                 { AOM_CDF3(12272, 30172) },
+                                                 { AOM_CDF3(18677, 30848) } },
+                                               { { AOM_CDF3(12986, 15180) },
+                                                 { AOM_CDF3(12986, 15180) },
+                                                 { AOM_CDF3(24302, 25602) } },
+                                               { { AOM_CDF3(5782, 11475) },
+                                                 { AOM_CDF3(5782, 11475) },
+                                                 { AOM_CDF3(16803, 22759) } },
 #elif MAX_TX_DEPTH == 3
-      { { AOM_CDF2(19968) }, { AOM_CDF2(24320) } },
-      { { AOM_CDF3(12272, 30172) }, { AOM_CDF3(18677, 30848) } },
-      { { AOM_CDF4(12986, 15180, 32384) }, { AOM_CDF4(24302, 25602, 32128) } },
-      { { AOM_CDF4(5782, 11475, 24480) }, { AOM_CDF4(16803, 22759, 28560) } },
+                                               { { AOM_CDF2(19968) },
+                                                 { AOM_CDF2(24320) } },
+                                               { { AOM_CDF3(12272, 30172) },
+                                                 { AOM_CDF3(18677, 30848) } },
+                                               { { AOM_CDF4(12986, 15180,
+                                                            32384) },
+                                                 { AOM_CDF4(24302, 25602,
+                                                            32128) } },
+                                               { { AOM_CDF4(5782, 11475,
+                                                            24480) },
+                                                 { AOM_CDF4(16803, 22759,
+                                                            28560) } },
 #else
-      { { AOM_CDF2(19968) }, { AOM_CDF2(24320) } },
-      { { AOM_CDF3(12272, 30172) }, { AOM_CDF3(18677, 30848) } },
-      { { AOM_CDF4(12986, 15180, 32384) }, { AOM_CDF4(24302, 25602, 32128) } },
-      { { AOM_CDF5(5782, 11475, 24480, 32640) },
-        { AOM_CDF5(16803, 22759, 28560, 32640) } },
+                                               { { AOM_CDF2(19968) },
+                                                 { AOM_CDF2(24320) } },
+                                               { { AOM_CDF3(12272, 30172) },
+                                                 { AOM_CDF3(18677, 30848) } },
+                                               { { AOM_CDF4(12986, 15180,
+                                                            32384) },
+                                                 { AOM_CDF4(24302, 25602,
+                                                            32128) } },
+                                               { { AOM_CDF5(5782, 11475, 24480,
+                                                            32640) },
+                                                 { AOM_CDF5(16803, 22759, 28560,
+                                                            32640) } },
 #endif  // MAX_TX_DEPTH == 2
-    };
+                                             };
 
 static const aom_cdf_prob
     default_if_y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)] = {
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 2921dc2..8fa3377 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -24,7 +24,7 @@
 
 #define BLOCK_SIZE_GROUPS 4
 
-#define TX_SIZE_CONTEXTS 2
+#define TX_SIZE_CONTEXTS 3
 
 #define INTER_OFFSET(mode) ((mode)-NEARESTMV)
 #define INTER_COMPOUND_OFFSET(mode) ((mode)-NEAREST_NEARESTMV)
diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h
index 85490e3..9cbee02 100644
--- a/av1/common/pred_common.h
+++ b/av1/common/pred_common.h
@@ -322,29 +322,33 @@
 static INLINE int get_tx_size_context(const MACROBLOCKD *xd, int is_inter) {
   const MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
   (void)is_inter;
+  const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
+  const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
   const TX_SIZE max_tx_size = max_txsize_rect_lookup[mbmi->sb_type];
   const int max_tx_wide = tx_size_wide[max_tx_size];
   const int max_tx_high = tx_size_high[max_tx_size];
-  const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
-  const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
   const int has_above = xd->up_available;
   const int has_left = xd->left_available;
 
-  if (!has_above || above_mbmi->skip) {
-    if (!has_left || left_mbmi->skip) {
-      return 1;
-    } else {
-      return 2 * tx_size_high[left_mbmi->tx_size] > max_tx_high;
-    }
-  } else {
-    if (!has_left || left_mbmi->skip) {
-      return 2 * tx_size_wide[above_mbmi->tx_size] > max_tx_wide;
-    } else {
-      const int above_ctx = (int)tx_size_wide[above_mbmi->tx_size];
-      const int left_ctx = (int)tx_size_high[left_mbmi->tx_size];
-      return 2 * (above_ctx + left_ctx) > max_tx_wide + max_tx_high;
-    }
-  }
+  int above = xd->above_txfm_context[0] >= max_tx_wide;
+  int left = xd->left_txfm_context[0] >= max_tx_high;
+
+  if (has_above)
+    if (is_inter_block(above_mbmi))
+      above = block_size_wide[above_mbmi->sb_type] >= max_tx_wide;
+
+  if (has_left)
+    if (is_inter_block(left_mbmi))
+      left = block_size_high[left_mbmi->sb_type] >= max_tx_high;
+
+  if (has_above && has_left)
+    return (above + left);
+  else if (has_above)
+    return above;
+  else if (has_left)
+    return left;
+  else
+    return 0;
 }
 
 #ifdef __cplusplus
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 5cbd95b..a37f274 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1029,13 +1029,12 @@
   mbmi->filter_intra_mode_info.use_filter_intra = 0;
 #endif  // CONFIG_FILTER_INTRA
 
+  xd->above_txfm_context =
+      cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
+  xd->left_txfm_context = xd->left_txfm_context_buffer +
+                          ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
+
 #if CONFIG_INTRABC
-  if (cm->allow_screen_content_tools) {
-    xd->above_txfm_context =
-        cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
-    xd->left_txfm_context = xd->left_txfm_context_buffer +
-                            ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
-  }
   if (av1_allow_intrabc(cm)) {
     read_intrabc_info(cm, xd, mi_row, mi_col, r);
     if (is_intrabc_block(mbmi)) return;
@@ -1043,11 +1042,7 @@
 #endif  // CONFIG_INTRABC
 
   mbmi->tx_size = read_tx_size(cm, xd, 0, 1, r);
-#if CONFIG_INTRABC
-  if (cm->allow_screen_content_tools)
-    set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, mbmi->skip, xd);
-#endif  // CONFIG_INTRABC
-
+  set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, mbmi->skip, xd);
   mbmi->mode = read_intra_mode(r, get_y_mode_cdf(ec_ctx, above_mi, left_mi));
 
   const int use_angle_delta = av1_use_angle_delta(bsize);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 6d2663d..25b3b37 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1171,8 +1171,8 @@
         for (idx = 0; idx < width; idx += bw)
           write_tx_size_vartx(cm, xd, mbmi, max_tx_size, 0, idy, idx, w);
     } else {
-      set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, skip, xd);
       write_selected_tx_size(cm, xd, w);
+      set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, skip, xd);
     }
   } else {
     set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, skip, xd);
@@ -1509,10 +1509,8 @@
 #endif  // CONFIG_INTRABC
 
   if (enable_tx_size) write_selected_tx_size(cm, xd, w);
-#if CONFIG_INTRABC
-  if (cm->allow_screen_content_tools)
-    set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, mbmi->skip, xd);
-#endif  // CONFIG_INTRABC
+
+  set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, mbmi->skip, xd);
 
   write_intra_mode_kf(ec_ctx, mi, above_mi, left_mi, mode, w);
 
@@ -1685,25 +1683,18 @@
 #endif  // CONFIG_DEPENDENT_HORZTILES
                  cm->mi_rows, cm->mi_cols);
 
+  xd->above_txfm_context =
+      cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
+  xd->left_txfm_context = xd->left_txfm_context_buffer +
+                          ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
+
   if (frame_is_intra_only(cm)) {
-#if CONFIG_INTRABC
-    if (cm->allow_screen_content_tools) {
-      xd->above_txfm_context =
-          cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
-      xd->left_txfm_context = xd->left_txfm_context_buffer +
-                              ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
-    }
-#endif  // CONFIG_INTRABC
     write_mb_modes_kf(cpi, xd,
 #if CONFIG_INTRABC
                       cpi->td.mb.mbmi_ext,
 #endif  // CONFIG_INTRABC
                       mi_row, mi_col, w);
   } else {
-    xd->above_txfm_context =
-        cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
-    xd->left_txfm_context = xd->left_txfm_context_buffer +
-                            ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
     // has_subpel_mv_component needs the ref frame buffers set up to look
     // up if they are scaled. has_subpel_mv_component is in turn needed by
     // write_switchable_interp_filter, which is called by pack_inter_mode_mvs.
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 3a3b7a2..25a83ca 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -772,18 +772,6 @@
   (void)counts;
   const BLOCK_SIZE bsize = mbmi->sb_type;
 
-  // Update intra tx size cdf
-  if (block_signals_txsize(bsize) && !xd->lossless[mbmi->segment_id] &&
-      allow_update_cdf) {
-    const TX_SIZE tx_size = mbmi->tx_size;
-    const int tx_size_ctx = get_tx_size_context(xd, 0);
-    const int32_t tx_size_cat = bsize_to_tx_size_cat(bsize, 0);
-    const int depth = tx_size_to_depth(tx_size, bsize, 0);
-    const int max_depths = bsize_to_max_depth(bsize, 0);
-    update_cdf(fc->tx_size_cdf[tx_size_cat][tx_size_ctx], depth,
-               max_depths + 1);
-  }
-
   if (intraonly) {
 #if CONFIG_ENTROPY_STATS
     const PREDICTION_MODE above = av1_above_block_mode(above_mi);
@@ -5015,6 +5003,15 @@
         }
       } else {
         intra_tx_size = tx_size;
+        if (block_signals_txsize(bsize) && !xd->lossless[mbmi->segment_id] &&
+            tile_data->allow_update_cdf) {
+          const int tx_size_ctx = get_tx_size_context(xd, 0);
+          const int32_t tx_size_cat = bsize_to_tx_size_cat(bsize, 0);
+          const int depth = tx_size_to_depth(tx_size, bsize, 0);
+          const int max_depths = bsize_to_max_depth(bsize, 0);
+          update_cdf(xd->tile_ctx->tx_size_cdf[tx_size_cat][tx_size_ctx], depth,
+                     max_depths + 1);
+        }
       }
 
       for (j = 0; j < mi_height; j++)
diff --git a/test/decode_to_md5.sh b/test/decode_to_md5.sh
index ef2711c..9f4980c 100755
--- a/test/decode_to_md5.sh
+++ b/test/decode_to_md5.sh
@@ -57,7 +57,7 @@
 
 decode_to_md5_av1() {
   # expected MD5 sum for the last frame.
-  local expected_md5="6ebec9f224ad2ad53910c05261b04ee3"
+  local expected_md5="287f864f910ee2b5a9e1836de96bbb77"
   local file="${AV1_IVF_FILE}"
 
   # TODO(urvang): Check in the encoded file (like libvpx does) to avoid