EC_ADAPT: add per tile contexts.
This will support adapting in each tile.
(https://bugs.chromium.org/p/aomedia/issues/detail?id=71)
Change-Id: I3eced47715749a48f78c4ccf151c4d0b58f36c0d
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 285adfa..ce93693 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -534,6 +534,9 @@
#if CONFIG_PVQ
daala_dec_ctx daala_dec;
#endif
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT *tile_ctx;
+#endif
#if CONFIG_AOM_HIGHBITDEPTH
/* Bit depth: 8, 10, 12 */
int bd;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 74ca45c..9668a3d 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -3408,6 +3408,11 @@
#if CONFIG_PVQ
daala_dec_init(cm, &td->xd.daala_dec, &td->bit_reader);
#endif
+#if CONFIG_EC_ADAPT
+ // Initialise the tile context from the frame context
+ td->tctx = *cm->fc;
+ td->xd.tile_ctx = &td->tctx;
+#endif
#if CONFIG_PALETTE
td->xd.plane[0].color_index_map = td->color_index_map[0];
td->xd.plane[1].color_index_map = td->color_index_map[1];
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index 9ef6493..6713537 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -47,6 +47,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 ea2adf3..2746d7b 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3836,7 +3836,7 @@
for (tile_col = 0; tile_col < tile_cols; tile_col++) {
const int tile_idx = tile_row * tile_cols + tile_col;
TileBufferEnc *const buf = &tile_buffers[tile_row][tile_col];
-#if CONFIG_PVQ
+#if CONFIG_PVQ || CONFIG_EC_ADAPT
TileDataEnc *this_tile = &cpi->tile_data[tile_idx];
#endif
const TOKENEXTRA *tok = tok_buffers[tile_row][tile_col];
@@ -3917,6 +3917,10 @@
// NOTE: This will not work with CONFIG_ANS turned on.
od_adapt_ctx_reset(&cpi->td.mb.daala_enc.state.adapt, 0);
cpi->td.mb.pvq_q = &this_tile->pvq_q;
+#elif CONFIG_EC_ADAPT
+ // Initialise tile context from the frame context
+ this_tile->tctx = *cm->fc;
+ cpi->td.mb.e_mbd.tile_ctx = &this_tile->tctx;
#endif
write_modes(cpi, &tile_info, &mode_bc, &tok, tok_end);
assert(tok == tok_end);
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index a06264d..b7d8e84 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4891,6 +4891,9 @@
#error "CONFIG_PVQ currently requires CONFIG_DAALA_EC."
#endif
od_adapt_ctx_reset(adapt, 0);
+#elif CONFIG_EC_ADAPT
+ this_tile->tctx = *cm->fc;
+ td->mb.e_mbd.tile_ctx = &this_tile->tctx;
#endif // #if CONFIG_PVQ
for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index dce432b..83ed874 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -280,6 +280,9 @@
#if CONFIG_PVQ
PVQ_QUEUE pvq_q;
#endif
+#if CONFIG_EC_ADAPT
+ FRAME_CONTEXT tctx;
+#endif
} TileDataEnc;
typedef struct RD_COUNTS {