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