Adapt motion mode syntax.
Remove deprecated tree coding when EC_ADAPT is on.
AWCY, objective-1-fast, High Latency:
PSNR (Y, Cb, Cr) : -0.10%, -0.40%, -0.37%
SSIM: -0.11%
PSNR-HVS: -0.07%
MS-SSIM: -0.06%
Change-Id: Ic2d436e037312e1af238a8586983f1288a9a95a8
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index 1978424..1052307 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -5703,8 +5703,6 @@
AVERAGE_TILE_CDFS(drl_cdf)
#endif
-// FIXME: cdfs not defined for motion_mode_prob
-
// FIXME: cdfs not defined for super_tx
#if CONFIG_EXT_INTER
@@ -5732,10 +5730,13 @@
}
#if CONFIG_NEW_MULTISYMBOL
AVERAGE_TILE_CDFS(intra_inter_cdf)
+#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+ AVERAGE_TILE_CDFS(motion_mode_cdf)
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
AVERAGE_TILE_CDFS(obmc_cdf)
#endif
#endif
+#endif
}
#if CONFIG_PVQ
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 6d6bc88..266bda2 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1310,8 +1310,8 @@
const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
-SIMPLE_TRANSLATION, -OBMC_CAUSAL
};
-static const aom_prob default_motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1] =
- {
+static const aom_cdf_prob
+ default_motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1] = {
#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
{ 255 }, { 255 }, { 255 },
#endif
@@ -1343,6 +1343,34 @@
#endif // CONFIG_EXT_PARTITION
};
#endif
+#if CONFIG_EC_ADAPT
+static const aom_cdf_prob
+ default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+#endif
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(151 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(153 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(144 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(178 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(165 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(207 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(195 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(168 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(244 * 128), AOM_ICDF(32768), 0 },
+#if CONFIG_EXT_PARTITION
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+#endif // CONFIG_EXT_PARTITION
+ };
+#endif // CONFIG_EC_ADAPT
#elif !CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
@@ -1362,6 +1390,35 @@
#endif // CONFIG_EXT_PARTITION
};
+#if CONFIG_EC_ADAPT
+static const aom_cdf_prob
+ default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+#endif
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(151 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(153 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(144 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(178 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(165 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(207 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(195 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(168 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(244 * 128), AOM_ICDF(32768), 0 },
+#if CONFIG_EXT_PARTITION
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 },
+#endif // CONFIG_EXT_PARTITION
+ };
+#endif // CONFIG_EC_ADAPT
+
#elif CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
@@ -1380,6 +1437,35 @@
#endif // CONFIG_EXT_PARTITION
};
+#if CONFIG_EC_ADAPT
+static const aom_cdf_prob
+ default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+#endif
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(19328), AOM_ICDF(29828), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(19584), AOM_ICDF(29884), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(18432), AOM_ICDF(29632), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(22784), AOM_ICDF(30584), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(21120), AOM_ICDF(30220), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(20480), AOM_ICDF(30080), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(26496), AOM_ICDF(31396), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(24960), AOM_ICDF(31060), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(21504), AOM_ICDF(30304), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(31232), AOM_ICDF(32432), AOM_ICDF(32768), 0 },
+#if CONFIG_EXT_PARTITION
+ { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
+#endif
+ };
+#endif // !CONFIG_EC_ADAPT
+
// Probability for the case that only 1 additional motion mode is allowed
static const aom_prob default_obmc_prob[BLOCK_SIZES] = {
#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
@@ -4931,6 +5017,9 @@
#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
av1_copy(fc->ncobmc_mode_prob, default_ncobmc_mode_prob);
#endif
+#if CONFIG_EC_ADAPT
+ av1_copy(fc->motion_mode_cdf, default_motion_mode_cdf);
+#endif
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
av1_copy(fc->obmc_prob, default_obmc_prob);
#if CONFIG_NEW_MULTISYMBOL
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index eb509bf..a1451c7 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -223,11 +223,12 @@
#endif // CONFIG_EXT_INTER
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
aom_prob motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1];
-
+#if CONFIG_EC_ADAPT
+ aom_cdf_prob motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)];
+#endif
#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
aom_prob ncobmc_mode_prob[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES - 1];
#endif
-
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
aom_prob obmc_prob[BLOCK_SIZES];
#if CONFIG_NEW_MULTISYMBOL
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 35116bf..9affe14 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -5004,8 +5004,7 @@
FRAME_CONTEXT *const fc = cm->fc;
aom_reader r;
int i;
-#if !CONFIG_EC_ADAPT || \
- (CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION || CONFIG_EXT_INTER)
+#if !CONFIG_EC_ADAPT
int j;
#endif
@@ -5183,12 +5182,14 @@
#endif // !CONFIG_EC_ADAPT && (CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE)
#endif // CONFIG_EXT_INTER
+#if !CONFIG_EC_ADAPT
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
for (i = BLOCK_8X8; i < BLOCK_SIZES; ++i) {
for (j = 0; j < MOTION_MODES - 1; ++j)
av1_diff_update_prob(&r, &fc->motion_mode_prob[i][j], ACCT_STR);
}
#endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+#endif // !CONFIG_EC_ADAPT
#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
for (i = 0; i < ADAPT_OVERLAP_BLOCKS; ++i) {
@@ -5199,7 +5200,7 @@
#if !CONFIG_EC_ADAPT
if (cm->interp_filter == SWITCHABLE) read_switchable_interp_probs(fc, &r);
-#endif
+#endif // !CONFIG_EC_ADAPT
#if !CONFIG_NEW_MULTISYMBOL
for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
av1_diff_update_prob(&r, &fc->intra_inter_prob[i], ACCT_STR);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 79dd298..9f42d06 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -322,6 +322,10 @@
static MOTION_MODE read_motion_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
MODE_INFO *mi, aom_reader *r) {
MB_MODE_INFO *mbmi = &mi->mbmi;
+#if CONFIG_NEW_MULTISYMBOL
+ (void)cm;
+#endif
+
#if CONFIG_NCOBMC_ADAPT_WEIGHT
const MOTION_MODE last_motion_mode_allowed =
motion_mode_allowed_wrapper(0,
@@ -352,9 +356,15 @@
return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
} else {
#endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
+#if CONFIG_EC_ADAPT
motion_mode =
- aom_read_tree(r, av1_motion_mode_tree,
- cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR);
+ aom_read_symbol(r, xd->tile_ctx->motion_mode_cdf[mbmi->sb_type],
+ MOTION_MODES, ACCT_STR);
+#else
+ motion_mode =
+ aom_read_tree(r, av1_motion_mode_tree,
+ cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR);
+#endif
if (counts) ++counts->motion_mode[mbmi->sb_type][motion_mode];
return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index cf209f3..6e30597 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -116,7 +116,9 @@
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#endif // CONFIG_EXT_INTER
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+#if !CONFIG_EC_ADAPT
static struct av1_token motion_mode_encodings[MOTION_MODES];
+#endif
#if CONFIG_NCOBMC_ADAPT_WEIGHT
static struct av1_token ncobmc_mode_encodings[MAX_NCOBMC_MODES];
#endif
@@ -172,7 +174,9 @@
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#endif // CONFIG_EXT_INTER
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+#if !CONFIG_EC_ADAPT
av1_tokens_from_tree(motion_mode_encodings, av1_motion_mode_tree);
+#endif
#if CONFIG_NCOBMC_ADAPT_WEIGHT
av1_tokens_from_tree(ncobmc_mode_encodings, av1_ncobmc_mode_tree);
#endif
@@ -351,8 +355,7 @@
aom_wb_write_literal(wb, data, get_unsigned_bits(max));
}
-#if !CONFIG_EC_ADAPT || \
- (CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION || CONFIG_EXT_INTER)
+#if !CONFIG_EC_ADAPT || CONFIG_NCOBMC_ADAPT_WEIGHT || CONFIG_COMPOUND_SINGLEREF
static void prob_diff_update(const aom_tree_index *tree,
aom_prob probs[/*n - 1*/],
const unsigned int counts[/* n */], int n,
@@ -612,7 +615,7 @@
static void write_motion_mode(const AV1_COMMON *cm, MACROBLOCKD *xd,
const MODE_INFO *mi, aom_writer *w) {
const MB_MODE_INFO *mbmi = &mi->mbmi;
-#if !CONFIG_NEW_MULTISYMBOL
+#if !CONFIG_EC_ADAPT
(void)xd;
#endif
@@ -642,9 +645,15 @@
#endif
} else {
#endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
- av1_write_token(w, av1_motion_mode_tree,
- cm->fc->motion_mode_prob[mbmi->sb_type],
- &motion_mode_encodings[mbmi->motion_mode]);
+#if CONFIG_EC_ADAPT
+ aom_write_symbol(w, mbmi->motion_mode,
+ xd->tile_ctx->motion_mode_cdf[mbmi->sb_type],
+ MOTION_MODES);
+#else
+ av1_write_token(w, av1_motion_mode_tree,
+ cm->fc->motion_mode_prob[mbmi->sb_type],
+ &motion_mode_encodings[mbmi->motion_mode]);
+#endif
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
}
#endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
@@ -5022,6 +5031,11 @@
#else
const int probwt = 1;
#endif
+#if CONFIG_EC_ADAPT
+ (void)probwt;
+ (void)i;
+ (void)fc;
+#endif
#if CONFIG_ANS
int header_size;
@@ -5193,9 +5207,11 @@
#endif // CONFIG_EXT_INTER
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+#if !CONFIG_EC_ADAPT
for (i = BLOCK_8X8; i < BLOCK_SIZES; ++i)
prob_diff_update(av1_motion_mode_tree, fc->motion_mode_prob[i],
counts->motion_mode[i], MOTION_MODES, probwt, header_bc);
+#endif
#if CONFIG_NCOBMC_ADAPT_WEIGHT
for (i = ADAPT_OVERLAP_BLOCK_8X8; i < ADAPT_OVERLAP_BLOCKS; ++i) {
prob_diff_update(av1_ncobmc_mode_tree, fc->ncobmc_mode_prob[i],
@@ -5204,10 +5220,11 @@
}
#endif
#endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+
#if !CONFIG_EC_ADAPT
if (cm->interp_filter == SWITCHABLE)
update_switchable_interp_probs(cm, header_bc, counts);
-#endif
+#endif // !CONFIG_EC_ADAPT
#if !CONFIG_NEW_MULTISYMBOL
for (i = 0; i < INTRA_INTER_CONTEXTS; i++)