EXT_INTER: CDF coding for inter_compound_mode.

Replace deprecated tree coding when EC_ADAPT is on.

AWCY: -0.01% all metrics.

Change-Id: I021dbc1e5f2a64fec66da1a427a0bf930cfed292
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index 115a3db..b71f8b2 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -5710,7 +5710,7 @@
 
   // FIXME: cdfs not defined for super_tx
 
-  // FIXME: CONFIG_EXT_INTER cdfs not defined for inter_compound_mode,
+  AVERAGE_TILE_CDFS(inter_compound_mode_cdf)
   // interintra_mode etc
 
   AVERAGE_TILE_CDFS(y_mode_cdf)
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 4ce596b..e121337 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1045,6 +1045,27 @@
       { 25, 29, 50, 192, 128, 180, 180 },   // 6 = two intra neighbours
     };
 
+#if CONFIG_EC_ADAPT
+static const aom_cdf_prob
+    default_inter_compound_mode_cdf[INTER_MODE_CONTEXTS][CDF_SIZE(
+        INTER_COMPOUND_MODES)] = {
+      { AOM_ICDF(21971), AOM_ICDF(24071), AOM_ICDF(24317), AOM_ICDF(24421),
+        AOM_ICDF(24667), AOM_ICDF(24771), AOM_ICDF(25027), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(18052), AOM_ICDF(24530), AOM_ICDF(25289), AOM_ICDF(25610),
+        AOM_ICDF(26369), AOM_ICDF(26690), AOM_ICDF(27586), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(20666), AOM_ICDF(24802), AOM_ICDF(25287), AOM_ICDF(25492),
+        AOM_ICDF(25977), AOM_ICDF(26182), AOM_ICDF(27078), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(11703), AOM_ICDF(19503), AOM_ICDF(20417), AOM_ICDF(20803),
+        AOM_ICDF(21717), AOM_ICDF(22103), AOM_ICDF(22999), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(7936), AOM_ICDF(12400), AOM_ICDF(12923), AOM_ICDF(13144),
+        AOM_ICDF(13667), AOM_ICDF(13888), AOM_ICDF(14912), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(9679), AOM_ICDF(12865), AOM_ICDF(13238), AOM_ICDF(13396),
+        AOM_ICDF(13769), AOM_ICDF(13927), AOM_ICDF(16103), AOM_ICDF(32768), 0 },
+      { AOM_ICDF(3349), AOM_ICDF(7190), AOM_ICDF(7640), AOM_ICDF(7830),
+        AOM_ICDF(8280), AOM_ICDF(8470), AOM_ICDF(11670), AOM_ICDF(32768), 0 }
+    };
+#endif
+
 #if CONFIG_COMPOUND_SINGLEREF
 // TODO(zoeliu): Default values to be further adjusted based on the collected
 //               stats.
@@ -4747,6 +4768,9 @@
 #endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
 #if CONFIG_EXT_INTER
   av1_copy(fc->inter_compound_mode_probs, default_inter_compound_mode_probs);
+#if CONFIG_EC_ADAPT
+  av1_copy(fc->inter_compound_mode_cdf, default_inter_compound_mode_cdf);
+#endif
 #if CONFIG_COMPOUND_SINGLEREF
   av1_copy(fc->inter_singleref_comp_mode_probs,
            default_inter_singleref_comp_mode_probs);
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 51a2f46..8634d6f 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -195,6 +195,10 @@
 #if CONFIG_EXT_INTER
   aom_prob inter_compound_mode_probs[INTER_MODE_CONTEXTS]
                                     [INTER_COMPOUND_MODES - 1];
+#if CONFIG_EC_ADAPT
+  aom_cdf_prob inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
+                                      [CDF_SIZE(INTER_COMPOUND_MODES)];
+#endif
 #if CONFIG_COMPOUND_SINGLEREF
   aom_prob inter_singleref_comp_mode_probs[INTER_MODE_CONTEXTS]
                                           [INTER_SINGLEREF_COMP_MODES - 1];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index d93b0ae..1b41363 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -193,6 +193,7 @@
 #endif
 
 #if CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
 static void read_inter_compound_mode_probs(FRAME_CONTEXT *fc, aom_reader *r) {
   int i, j;
   if (aom_read(r, GROUP_DIFF_UPDATE_PROB, ACCT_STR)) {
@@ -203,6 +204,7 @@
     }
   }
 }
+#endif  // CONFIG_EC_ADAPT
 
 #if CONFIG_COMPOUND_SINGLEREF
 static void read_inter_singleref_comp_mode_probs(FRAME_CONTEXT *fc,
@@ -5100,7 +5102,9 @@
 #endif
 
 #if CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
     read_inter_compound_mode_probs(fc, &r);
+#endif
 #if CONFIG_COMPOUND_SINGLEREF
     read_inter_singleref_comp_mode_probs(fc, &r);
 #endif  // CONFIG_COMPOUND_SINGLEREF
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index f3f8b89..9003ed4 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -380,9 +380,16 @@
 #if CONFIG_EXT_INTER
 static PREDICTION_MODE read_inter_compound_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
                                                 aom_reader *r, int16_t ctx) {
+#if CONFIG_EC_ADAPT
+  (void)cm;
+  const int mode =
+      aom_read_symbol(r, xd->tile_ctx->inter_compound_mode_cdf[ctx],
+                      INTER_COMPOUND_MODES, ACCT_STR);
+#else
   const int mode =
       aom_read_tree(r, av1_inter_compound_mode_tree,
                     cm->fc->inter_compound_mode_probs[ctx], ACCT_STR);
+#endif
   FRAME_COUNTS *counts = xd->counts;
 
   if (counts) ++counts->inter_compound_mode[ctx][mode];
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 386c8b3..4797a9d 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -64,11 +64,13 @@
 #define ENC_MISMATCH_DEBUG 0
 
 #if CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
 static const struct av1_token
     inter_compound_mode_encodings[INTER_COMPOUND_MODES] = {
       { 2, 2 },  { 12, 4 }, { 52, 6 }, { 53, 6 },
       { 54, 6 }, { 55, 6 }, { 0, 1 },  { 7, 3 }
     };
+#endif
 #if CONFIG_COMPOUND_SINGLEREF
 static struct av1_token
     inter_singleref_comp_mode_encodings[INTER_SINGLEREF_COMP_MODES];
@@ -318,15 +320,23 @@
 }
 
 #if CONFIG_EXT_INTER
-static void write_inter_compound_mode(AV1_COMMON *cm, aom_writer *w,
-                                      PREDICTION_MODE mode,
+static void write_inter_compound_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
+                                      aom_writer *w, PREDICTION_MODE mode,
                                       const int16_t mode_ctx) {
+  assert(is_inter_compound_mode(mode));
+#if CONFIG_EC_ADAPT
+  (void)cm;
+  aom_write_symbol(w, INTER_COMPOUND_OFFSET(mode),
+                   xd->tile_ctx->inter_compound_mode_cdf[mode_ctx],
+                   INTER_COMPOUND_MODES);
+#else
+  (void)xd;
   const aom_prob *const inter_compound_probs =
       cm->fc->inter_compound_mode_probs[mode_ctx];
 
-  assert(is_inter_compound_mode(mode));
   av1_write_token(w, av1_inter_compound_mode_tree, inter_compound_probs,
                   &inter_compound_mode_encodings[INTER_COMPOUND_OFFSET(mode)]);
+#endif
 }
 
 #if CONFIG_COMPOUND_SINGLEREF
@@ -367,7 +377,7 @@
 }
 #endif
 
-#if CONFIG_EXT_INTER || !CONFIG_EC_ADAPT
+#if !CONFIG_EC_ADAPT || CONFIG_COMPOUND_SINGLEREF
 static int prob_diff_update_savings(const aom_tree_index *tree,
                                     aom_prob probs[/*n - 1*/],
                                     const unsigned int counts[/*n - 1*/], int n,
@@ -385,7 +395,7 @@
   }
   return savings;
 }
-#endif  // CONFIG_EXT_INTER || !CONFIG_EC_ADAPT
+#endif  // !CONFIG_EC_ADAPT || CONFIG_COMPOUND_SINGLEREF
 
 #if CONFIG_VAR_TX
 static void write_tx_size_vartx(const AV1_COMMON *cm, const MACROBLOCKD *xd,
@@ -507,6 +517,7 @@
 #endif
 
 #if CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
 static void update_inter_compound_mode_probs(AV1_COMMON *cm, int probwt,
                                              aom_writer *w) {
   const int savings_thresh = av1_cost_one(GROUP_DIFF_UPDATE_PROB) -
@@ -529,6 +540,7 @@
     }
   }
 }
+#endif
 
 #if CONFIG_COMPOUND_SINGLEREF
 static void update_inter_singleref_comp_mode_probs(AV1_COMMON *cm, int probwt,
@@ -2065,7 +2077,7 @@
       if (bsize >= BLOCK_8X8 || unify_bsize) {
 #if CONFIG_EXT_INTER
         if (is_inter_compound_mode(mode))
-          write_inter_compound_mode(cm, w, mode, mode_ctx);
+          write_inter_compound_mode(cm, xd, w, mode, mode_ctx);
 #if CONFIG_COMPOUND_SINGLEREF
         else if (is_inter_singleref_comp_mode(mode))
           write_inter_singleref_comp_mode(cm, w, mode, mode_ctx);
@@ -2112,7 +2124,7 @@
                                                  mbmi->ref_frame, bsize, j);
 #if CONFIG_EXT_INTER
           if (is_inter_compound_mode(b_mode))
-            write_inter_compound_mode(cm, w, b_mode, mode_ctx);
+            write_inter_compound_mode(cm, xd, w, b_mode, mode_ctx);
           else if (is_inter_singleref_mode(b_mode))
 #endif  // CONFIG_EXT_INTER
             write_inter_mode(w, b_mode, ec_ctx, mode_ctx);
@@ -5086,7 +5098,9 @@
     update_inter_mode_probs(cm, header_bc, counts);
 #endif
 #if CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
     update_inter_compound_mode_probs(cm, probwt, header_bc);
+#endif
 #if CONFIG_COMPOUND_SINGLEREF
     update_inter_singleref_comp_mode_probs(cm, probwt, header_bc);
 #endif  // CONFIG_COMPOUND_SINGLEREF