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