EC_ADAPT: use tile context for intra mode syntax.
Change-Id: Id01c785ad48134075c4f6643233413564f0b8fbc
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 8cd7326..9af1201 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1844,7 +1844,7 @@
for (i = 0; i < INTRA_MODES; ++i)
for (j = 0; j < INTRA_MODES; ++j)
av1_tree_to_cdf(av1_intra_mode_tree, cm->kf_y_prob[i][j],
- cm->kf_y_cdf[i][j]);
+ cm->fc->kf_y_cdf[i][j]);
for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j)
av1_tree_to_cdf(av1_switchable_interp_tree, fc->switchable_interp_prob[j],
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index a49ea86..d895c1d 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -183,6 +183,10 @@
aom_cdf_prob switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
[SWITCHABLE_FILTERS];
aom_cdf_prob inter_mode_cdf[INTER_MODE_CONTEXTS][INTER_MODES];
+ /* Keep track of kf_y_cdf here, as this makes handling
+ multiple copies for adaptation in tiles easier */
+ aom_cdf_prob kf_y_cdf[INTRA_MODES][INTRA_MODES][INTRA_MODES];
+
#if !CONFIG_EXT_TX
aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES];
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index d0517c1..a5f79c9 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -396,9 +396,6 @@
// - this is intentionally not placed in FRAME_CONTEXT since it's reset upon
// each keyframe and not used afterwards
aom_prob kf_y_prob[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1];
-#if CONFIG_EC_MULTISYMBOL
- aom_cdf_prob kf_y_cdf[INTRA_MODES][INTRA_MODES][INTRA_MODES];
-#endif
#if CONFIG_GLOBAL_MOTION
WarpedMotionParams global_motion[TOTAL_REFS_PER_FRAME];
#endif
@@ -633,13 +630,14 @@
}
#if CONFIG_EC_MULTISYMBOL
-static INLINE aom_cdf_prob *get_y_mode_cdf(AV1_COMMON *cm, const MODE_INFO *mi,
+static INLINE aom_cdf_prob *get_y_mode_cdf(FRAME_CONTEXT *tile_ctx,
+ const MODE_INFO *mi,
const MODE_INFO *above_mi,
const MODE_INFO *left_mi,
int block) {
const PREDICTION_MODE above = av1_above_block_mode(mi, above_mi, block);
const PREDICTION_MODE left = av1_left_block_mode(mi, left_mi, block);
- return cm->kf_y_cdf[above][left];
+ return tile_ctx->kf_y_cdf[above][left];
}
#endif
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 6788302..8ce5733 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4469,7 +4469,7 @@
if (frame_is_intra_only(cm)) {
av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);
#if CONFIG_EC_MULTISYMBOL
- av1_copy(cm->kf_y_cdf, av1_kf_y_mode_cdf);
+ av1_copy(cm->fc->kf_y_cdf, av1_kf_y_mode_cdf);
#endif
#if !CONFIG_EC_ADAPT
for (k = 0; k < INTRA_MODES; k++)
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 6ce29c8..fae7529 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -96,13 +96,22 @@
static PREDICTION_MODE read_intra_mode_y(AV1_COMMON *cm, MACROBLOCKD *xd,
aom_reader *r, int size_group) {
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
+#elif CONFIG_EC_MULTISYMBOL
+ FRAME_CONTEXT *ec_ctx = cm->fc;
+#endif
+
const PREDICTION_MODE y_mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, cm->fc->y_mode_cdf[size_group]);
+ read_intra_mode(r, ec_ctx->y_mode_cdf[size_group]);
#else
read_intra_mode(r, cm->fc->y_mode_prob[size_group]);
#endif
FRAME_COUNTS *counts = xd->counts;
+#if CONFIG_EC_ADAPT
+ (void)cm;
+#endif
if (counts) ++counts->y_mode[size_group][y_mode];
return y_mode;
}
@@ -110,13 +119,22 @@
static PREDICTION_MODE read_intra_mode_uv(AV1_COMMON *cm, MACROBLOCKD *xd,
aom_reader *r,
PREDICTION_MODE y_mode) {
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
+#elif CONFIG_EC_MULTISYMBOL
+ FRAME_CONTEXT *ec_ctx = cm->fc;
+#endif
+
const PREDICTION_MODE uv_mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, cm->fc->uv_mode_cdf[y_mode]);
+ read_intra_mode(r, ec_ctx->uv_mode_cdf[y_mode]);
#else
read_intra_mode(r, cm->fc->uv_mode_prob[y_mode]);
#endif
FRAME_COUNTS *counts = xd->counts;
+#if CONFIG_EC_ADAPT
+ (void)cm;
+#endif
if (counts) ++counts->uv_mode[y_mode][uv_mode];
return uv_mode;
}
@@ -789,6 +807,11 @@
// TODO(slavarnway): move x_mis, y_mis into xd ?????
const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh);
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
+#elif CONFIG_EC_MULTISYMBOL
+ FRAME_CONTEXT *ec_ctx = cm->fc;
+#endif
mbmi->segment_id = read_intra_segment_id(cm, xd, mi_offset, x_mis, y_mis, r);
mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r);
@@ -810,7 +833,7 @@
(void)i;
mbmi->mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#endif
@@ -820,7 +843,8 @@
for (i = 0; i < 4; ++i)
mi->bmi[i].as_mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, i));
+ read_intra_mode(r,
+ get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, i));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, i));
#endif
@@ -829,13 +853,13 @@
case BLOCK_4X8:
mi->bmi[0].as_mode = mi->bmi[2].as_mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#endif
mi->bmi[1].as_mode = mi->bmi[3].as_mode = mbmi->mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 1));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 1));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 1));
#endif
@@ -843,13 +867,13 @@
case BLOCK_8X4:
mi->bmi[0].as_mode = mi->bmi[1].as_mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#endif
mi->bmi[2].as_mode = mi->bmi[3].as_mode = mbmi->mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 2));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 2));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 2));
#endif
@@ -857,7 +881,7 @@
default:
mbmi->mode =
#if CONFIG_EC_MULTISYMBOL
- read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
+ read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
#else
read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#endif
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index 6713537..12add96 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -66,6 +66,9 @@
/* forward transformed predicted image, a reference for PVQ */
DECLARE_ALIGNED(16, tran_low_t, pvq_ref_coeff[OD_TXSIZE_MAX * OD_TXSIZE_MAX]);
#endif
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT tctx;
+#endif
#if CONFIG_PALETTE
DECLARE_ALIGNED(16, uint8_t, color_index_map[2][MAX_SB_SQUARE]);
#endif // CONFIG_PALETTE
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 9dc11fd..bf70d88 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1354,7 +1354,7 @@
if (bsize >= BLOCK_8X8 || unify_bsize) {
#if CONFIG_EC_MULTISYMBOL
aom_write_symbol(w, av1_intra_mode_ind[mode],
- cm->fc->y_mode_cdf[size_group_lookup[bsize]],
+ ec_ctx->y_mode_cdf[size_group_lookup[bsize]],
INTRA_MODES);
#else
write_intra_mode(w, mode, cm->fc->y_mode_prob[size_group_lookup[bsize]]);
@@ -1367,7 +1367,7 @@
for (idx = 0; idx < 2; idx += num_4x4_w) {
const PREDICTION_MODE b_mode = mi->bmi[idy * 2 + idx].as_mode;
#if CONFIG_EC_MULTISYMBOL
- aom_write_symbol(w, av1_intra_mode_ind[b_mode], cm->fc->y_mode_cdf[0],
+ aom_write_symbol(w, av1_intra_mode_ind[b_mode], ec_ctx->y_mode_cdf[0],
INTRA_MODES);
#else
write_intra_mode(w, b_mode, cm->fc->y_mode_prob[0]);
@@ -1377,7 +1377,7 @@
}
#if CONFIG_EC_MULTISYMBOL
aom_write_symbol(w, av1_intra_mode_ind[mbmi->uv_mode],
- cm->fc->uv_mode_cdf[mode], INTRA_MODES);
+ ec_ctx->uv_mode_cdf[mode], INTRA_MODES);
#else
write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]);
#endif
@@ -1681,6 +1681,12 @@
const int unify_bsize = 0;
#endif
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
+#elif CONFIG_EC_MULTISYMBOL
+ FRAME_CONTEXT *ec_ctx = cm->fc;
+#endif
+
if (seg->update_map) write_segment_id(w, seg, segp, mbmi->segment_id);
#if CONFIG_DELTA_Q
@@ -1707,7 +1713,8 @@
if (bsize >= BLOCK_8X8 || unify_bsize) {
#if CONFIG_EC_MULTISYMBOL
aom_write_symbol(w, av1_intra_mode_ind[mbmi->mode],
- get_y_mode_cdf(cm, mi, above_mi, left_mi, 0), INTRA_MODES);
+ get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0),
+ INTRA_MODES);
#else
write_intra_mode(w, mbmi->mode,
get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
@@ -1722,7 +1729,7 @@
const int block = idy * 2 + idx;
#if CONFIG_EC_MULTISYMBOL
aom_write_symbol(w, av1_intra_mode_ind[mi->bmi[block].as_mode],
- get_y_mode_cdf(cm, mi, above_mi, left_mi, block),
+ get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, block),
INTRA_MODES);
#else
write_intra_mode(w, mi->bmi[block].as_mode,
@@ -1733,7 +1740,7 @@
}
#if CONFIG_EC_MULTISYMBOL
aom_write_symbol(w, av1_intra_mode_ind[mbmi->uv_mode],
- cm->fc->uv_mode_cdf[mbmi->mode], INTRA_MODES);
+ ec_ctx->uv_mode_cdf[mbmi->mode], INTRA_MODES);
#else
write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mbmi->mode]);
#endif
@@ -4461,7 +4468,7 @@
if (frame_is_intra_only(cm)) {
av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);
#if CONFIG_EC_MULTISYMBOL
- av1_copy(cm->kf_y_cdf, av1_kf_y_mode_cdf);
+ av1_copy(cm->fc->kf_y_cdf, av1_kf_y_mode_cdf);
#endif
#if !CONFIG_EC_ADAPT