NEW_MULTISYMBOL: adapt single_ref flags.

Change-Id: I4092f9ca0f5497bffee31ec4a1e9804e90def42e
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index 75afdc0..18ff63f 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -5696,9 +5696,9 @@
 
 // FIXME: comp_ref_cdf and comp_bwd_ref not defined
 
-// FIXME: single_ref_cdf not defined
-
 #if CONFIG_NEW_MULTISYMBOL
+  AVERAGE_TILE_CDFS(single_ref_cdf)
+
   AVERAGE_TILE_CDFS(newmv_cdf)
   AVERAGE_TILE_CDFS(zeromv_cdf)
   AVERAGE_TILE_CDFS(refmv_cdf)
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 5b4ce52..433b0d8 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1421,6 +1421,49 @@
   { 33, 16 }, { 77, 74 }, { 142, 142 }, { 172, 170 }, { 238, 247 }
 #endif  // CONFIG_EXT_REFS
 };
+#if CONFIG_NEW_MULTISYMBOL
+static const aom_cdf_prob
+    default_single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)] = {
+#if CONFIG_EXT_REFS
+      { { AOM_ICDF(33 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(16 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(16 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(16 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(16 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(77 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(74 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(74 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(74 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(74 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(172 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(170 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(170 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(170 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(170 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(238 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(247 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(247 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(247 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(247 * 128), AOM_ICDF(32768), 0 } }
+#else
+      { { AOM_ICDF(33 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(16 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(77 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(74 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(142 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(172 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(170 * 128), AOM_ICDF(32768), 0 } },
+      { { AOM_ICDF(238 * 128), AOM_ICDF(32768), 0 },
+        { AOM_ICDF(247 * 128), AOM_ICDF(32768), 0 } }
+#endif  // CONFIG_EXT_REFS
+    };
+#endif
 
 #if CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
 // TODO(zoeliu): Default values to be further adjusted based on the collected
@@ -4547,6 +4590,9 @@
   av1_copy(fc->comp_bwdref_prob, default_comp_bwdref_p);
 #endif  // CONFIG_EXT_REFS
   av1_copy(fc->single_ref_prob, default_single_ref_p);
+#if CONFIG_NEW_MULTISYMBOL
+  av1_copy(fc->single_ref_cdf, default_single_ref_cdf);
+#endif
 #if CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
   av1_copy(fc->comp_inter_mode_prob, default_comp_inter_mode_p);
 #endif  // CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index e7a6ecb..b16b141 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -216,6 +216,7 @@
   aom_prob comp_inter_prob[COMP_INTER_CONTEXTS];
 #if CONFIG_NEW_MULTISYMBOL
   aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
+  aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
 #endif
   aom_prob single_ref_prob[REF_CONTEXTS][SINGLE_REFS - 1];
 #if CONFIG_EXT_REFS
diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h
index 7148849..3764576 100644
--- a/av1/common/pred_common.h
+++ b/av1/common/pred_common.h
@@ -183,6 +183,34 @@
 }
 #endif  // CONFIG_EXT_REFS
 
+#if CONFIG_NEW_MULTISYMBOL
+static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p1(
+    const MACROBLOCKD *xd) {
+  return xd->tile_ctx
+      ->single_ref_cdf[av1_get_pred_context_single_ref_p1(xd)][0];
+}
+static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p2(
+    const MACROBLOCKD *xd) {
+  return xd->tile_ctx
+      ->single_ref_cdf[av1_get_pred_context_single_ref_p2(xd)][1];
+}
+static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p3(
+    const MACROBLOCKD *xd) {
+  return xd->tile_ctx
+      ->single_ref_cdf[av1_get_pred_context_single_ref_p3(xd)][2];
+}
+static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p4(
+    const MACROBLOCKD *xd) {
+  return xd->tile_ctx
+      ->single_ref_cdf[av1_get_pred_context_single_ref_p4(xd)][3];
+}
+static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p5(
+    const MACROBLOCKD *xd) {
+  return xd->tile_ctx
+      ->single_ref_cdf[av1_get_pred_context_single_ref_p5(xd)][4];
+}
+#endif
+
 #if CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
 int av1_get_inter_mode_context(const MACROBLOCKD *xd);
 
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 96f8c70..fa8c44c 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -279,7 +279,6 @@
   if (cm->reference_mode == REFERENCE_MODE_SELECT)
     for (i = 0; i < COMP_INTER_CONTEXTS; ++i)
       av1_diff_update_prob(r, &fc->comp_inter_prob[i], ACCT_STR);
-#endif
 
   if (cm->reference_mode != COMPOUND_REFERENCE) {
     for (i = 0; i < REF_CONTEXTS; ++i) {
@@ -288,6 +287,7 @@
       }
     }
   }
+#endif
 
   if (cm->reference_mode != SINGLE_REFERENCE) {
     for (i = 0; i < REF_CONTEXTS; ++i) {
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 1f758fb..f69e32b 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1280,6 +1280,14 @@
   }
 }
 
+#if CONFIG_NEW_MULTISYMBOL
+#define READ_REF_BIT(pname) \
+  aom_read_symbol(r, av1_get_pred_cdf_##pname(xd), 2, ACCT_STR)
+#else
+#define READ_REF_BIT(pname) \
+  aom_read(r, av1_get_pred_prob_##pname(cm, xd), ACCT_STR)
+#endif
+
 // Read the referncence frame
 static void read_ref_frames(AV1_COMMON *const cm, MACROBLOCKD *const xd,
                             aom_reader *r, int segment_id,
@@ -1377,11 +1385,11 @@
       // Test need to explicitly code (L,L2,L3,G) vs (BWD,ALT) branch node in
       // tree
       if ((L_OR_L2(cm) || L3_OR_G(cm)) && BWD_OR_ALT(cm))
-        bit0 = aom_read(r, fc->single_ref_prob[ctx0][0], ACCT_STR);
+        bit0 = READ_REF_BIT(single_ref_p1);
       else
         bit0 = BWD_OR_ALT(cm);
 #else   // !CONFIG_VAR_REFS
-      const int bit0 = aom_read(r, fc->single_ref_prob[ctx0][0], ACCT_STR);
+      const int bit0 = READ_REF_BIT(single_ref_p1);
 #endif  // CONFIG_VAR_REFS
       if (counts) ++counts->single_ref[ctx0][0][bit0];
 
@@ -1391,11 +1399,11 @@
         int bit1;
         // Test need to explicitly code (BWD) vs (ALT) branch node in tree
         if (BWD_AND_ALT(cm))
-          bit1 = aom_read(r, fc->single_ref_prob[ctx1][1], ACCT_STR);
+          bit1 = READ_REF_BIT(single_ref_p2);
         else
           bit1 = ALTREF_IS_VALID(cm);
-#else   // !CONFIG_VAR_REFS
-        const int bit1 = aom_read(r, fc->single_ref_prob[ctx1][1], ACCT_STR);
+#else  // !CONFIG_VAR_REFS
+        const int bit1 = READ_REF_BIT(single_ref_p2);
 #endif  // CONFIG_VAR_REFS
         if (counts) ++counts->single_ref[ctx1][1][bit1];
         ref_frame[0] = bit1 ? ALTREF_FRAME : BWDREF_FRAME;
@@ -1405,11 +1413,11 @@
         int bit2;
         // Test need to explicitly code (L,L2) vs (L3,G) branch node in tree
         if (L_OR_L2(cm) && L3_OR_G(cm))
-          bit2 = aom_read(r, fc->single_ref_prob[ctx2][2], ACCT_STR);
+          bit2 = READ_REF_BIT(single_ref_p3);
         else
           bit2 = L3_OR_G(cm);
-#else   // !CONFIG_VAR_REFS
-        const int bit2 = aom_read(r, fc->single_ref_prob[ctx2][2], ACCT_STR);
+#else  // !CONFIG_VAR_REFS
+        const int bit2 = READ_REF_BIT(single_ref_p3);
 #endif  // CONFIG_VAR_REFS
         if (counts) ++counts->single_ref[ctx2][2][bit2];
         if (bit2) {
@@ -1418,11 +1426,11 @@
           int bit4;
           // Test need to explicitly code (L3) vs (G) branch node in tree
           if (L3_AND_G(cm))
-            bit4 = aom_read(r, fc->single_ref_prob[ctx4][4], ACCT_STR);
+            bit4 = READ_REF_BIT(single_ref_p5);
           else
             bit4 = GOLDEN_IS_VALID(cm);
-#else   // !CONFIG_VAR_REFS
-          const int bit4 = aom_read(r, fc->single_ref_prob[ctx4][4], ACCT_STR);
+#else  // !CONFIG_VAR_REFS
+          const int bit4 = READ_REF_BIT(single_ref_p5);
 #endif  // CONFIG_VAR_REFS
           if (counts) ++counts->single_ref[ctx4][4][bit4];
           ref_frame[0] = bit4 ? GOLDEN_FRAME : LAST3_FRAME;
@@ -1432,11 +1440,11 @@
           int bit3;
           // Test need to explicitly code (L) vs (L2) branch node in tree
           if (L_AND_L2(cm))
-            bit3 = aom_read(r, fc->single_ref_prob[ctx3][3], ACCT_STR);
+            bit3 = READ_REF_BIT(single_ref_p4);
           else
             bit3 = LAST2_IS_VALID(cm);
-#else   // !CONFIG_VAR_REFS
-          const int bit3 = aom_read(r, fc->single_ref_prob[ctx3][3], ACCT_STR);
+#else  // !CONFIG_VAR_REFS
+          const int bit3 = READ_REF_BIT(single_ref_p4);
 #endif  // CONFIG_VAR_REFS
           if (counts) ++counts->single_ref[ctx3][3][bit3];
           ref_frame[0] = bit3 ? LAST2_FRAME : LAST_FRAME;
@@ -1444,12 +1452,12 @@
       }
 #else   // !CONFIG_EXT_REFS
       const int ctx0 = av1_get_pred_context_single_ref_p1(xd);
-      const int bit0 = aom_read(r, fc->single_ref_prob[ctx0][0], ACCT_STR);
+      const int bit0 = READ_REF_BIT(single_ref_p1);
       if (counts) ++counts->single_ref[ctx0][0][bit0];
 
       if (bit0) {
         const int ctx1 = av1_get_pred_context_single_ref_p2(xd);
-        const int bit1 = aom_read(r, fc->single_ref_prob[ctx1][1], ACCT_STR);
+        const int bit1 = READ_REF_BIT(single_ref_p2);
         if (counts) ++counts->single_ref[ctx1][1][bit1];
         ref_frame[0] = bit1 ? ALTREF_FRAME : GOLDEN_FRAME;
       } else {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 35483a9..45247f2 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1221,6 +1221,14 @@
   }
 }
 
+#if CONFIG_NEW_MULTISYMBOL
+#define WRITE_REF_BIT(bname, pname) \
+  aom_write_symbol(w, bname, av1_get_pred_cdf_##pname(xd), 2)
+#else
+#define WRITE_REF_BIT(bname, pname) \
+  aom_write(w, bname, av1_get_pred_prob_##pname(cm, xd))
+#endif
+
 // This function encodes the reference frame
 static void write_ref_frames(const AV1_COMMON *cm, const MACROBLOCKD *xd,
                              aom_writer *w) {
@@ -1305,7 +1313,7 @@
       // tree
       if ((L_OR_L2(cm) || L3_OR_G(cm)) && BWD_OR_ALT(cm))
 #endif  // CONFIG_VAR_REFS
-        aom_write(w, bit0, av1_get_pred_prob_single_ref_p1(cm, xd));
+        WRITE_REF_BIT(bit0, single_ref_p1);
 
       if (bit0) {
 #if CONFIG_VAR_REFS
@@ -1313,7 +1321,7 @@
         if (BWD_AND_ALT(cm)) {
 #endif  // CONFIG_VAR_REFS
           const int bit1 = mbmi->ref_frame[0] == ALTREF_FRAME;
-          aom_write(w, bit1, av1_get_pred_prob_single_ref_p2(cm, xd));
+          WRITE_REF_BIT(bit1, single_ref_p2);
 #if CONFIG_VAR_REFS
         }
 #endif  // CONFIG_VAR_REFS
@@ -1324,7 +1332,7 @@
         // Test need to explicitly code (L,L2) vs (L3,G) branch node in tree
         if (L_OR_L2(cm) && L3_OR_G(cm))
 #endif  // CONFIG_VAR_REFS
-          aom_write(w, bit2, av1_get_pred_prob_single_ref_p3(cm, xd));
+          WRITE_REF_BIT(bit2, single_ref_p3);
 
         if (!bit2) {
 #if CONFIG_VAR_REFS
@@ -1332,7 +1340,7 @@
           if (L_AND_L2(cm)) {
 #endif  // CONFIG_VAR_REFS
             const int bit3 = mbmi->ref_frame[0] != LAST_FRAME;
-            aom_write(w, bit3, av1_get_pred_prob_single_ref_p4(cm, xd));
+            WRITE_REF_BIT(bit3, single_ref_p4);
 #if CONFIG_VAR_REFS
           }
 #endif  // CONFIG_VAR_REFS
@@ -1342,7 +1350,7 @@
           if (L3_AND_G(cm)) {
 #endif  // CONFIG_VAR_REFS
             const int bit4 = mbmi->ref_frame[0] != LAST3_FRAME;
-            aom_write(w, bit4, av1_get_pred_prob_single_ref_p5(cm, xd));
+            WRITE_REF_BIT(bit4, single_ref_p5);
 #if CONFIG_VAR_REFS
           }
 #endif  // CONFIG_VAR_REFS
@@ -1350,11 +1358,11 @@
       }
 #else   // !CONFIG_EXT_REFS
       const int bit0 = mbmi->ref_frame[0] != LAST_FRAME;
-      aom_write(w, bit0, av1_get_pred_prob_single_ref_p1(cm, xd));
+      WRITE_REF_BIT(bit0, single_ref_p1);
 
       if (bit0) {
         const int bit1 = mbmi->ref_frame[0] != GOLDEN_FRAME;
-        aom_write(w, bit1, av1_get_pred_prob_single_ref_p2(cm, xd));
+        WRITE_REF_BIT(bit1, single_ref_p2);
       }
 #endif  // CONFIG_EXT_REFS
     }
@@ -5029,7 +5037,6 @@
           av1_cond_prob_diff_update(header_bc, &fc->comp_inter_prob[i],
                                     counts->comp_inter[i], probwt);
     }
-#endif
 
     if (cm->reference_mode != COMPOUND_REFERENCE) {
       for (i = 0; i < REF_CONTEXTS; i++) {
@@ -5039,6 +5046,7 @@
         }
       }
     }
+#endif
     if (cm->reference_mode != SINGLE_REFERENCE) {
       for (i = 0; i < REF_CONTEXTS; i++) {
 #if CONFIG_EXT_REFS