Store pre_fc in AV1_COMMON rather than computing it on the spot.
Prep work for changing how frame contexts are signaled.
Change-Id: I0db8ec631fc2d616d16fabaf72eac5663ffe3630
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index b88ff3a..e29bf27 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -6139,7 +6139,7 @@
static void adapt_coef_probs(AV1_COMMON *cm, TX_SIZE tx_size,
unsigned int count_sat,
unsigned int update_factor) {
- const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
+ const FRAME_CONTEXT *pre_fc = cm->pre_fc;
av1_coeff_probs_model *const probs = cm->fc->coef_probs[tx_size];
const av1_coeff_probs_model *const pre_probs = pre_fc->coef_probs[tx_size];
const av1_coeff_count_model *const counts =
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 0fcf762..ac1a418 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -3455,7 +3455,7 @@
void av1_adapt_inter_frame_probs(AV1_COMMON *cm) {
int i, j;
FRAME_CONTEXT *fc = cm->fc;
- const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
+ const FRAME_CONTEXT *pre_fc = cm->pre_fc;
const FRAME_COUNTS *counts = &cm->counts;
for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
@@ -3586,7 +3586,7 @@
void av1_adapt_intra_frame_probs(AV1_COMMON *cm) {
int i, j;
FRAME_CONTEXT *fc = cm->fc;
- const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
+ const FRAME_CONTEXT *pre_fc = cm->pre_fc;
const FRAME_COUNTS *counts = &cm->counts;
if (cm->tx_mode == TX_MODE_SELECT) {
diff --git a/av1/common/entropymv.c b/av1/common/entropymv.c
index 9c162d2..ddca80a 100644
--- a/av1/common/entropymv.c
+++ b/av1/common/entropymv.c
@@ -235,20 +235,19 @@
#if CONFIG_REF_MV
int idx;
for (idx = 0; idx < NMV_CONTEXTS; ++idx) {
- nmv_context *fc = &cm->fc->nmvc[idx];
- const nmv_context *pre_fc =
- &cm->frame_contexts[cm->frame_context_idx].nmvc[idx];
+ nmv_context *nmvc = &cm->fc->nmvc[idx];
+ const nmv_context *pre_nmvc = &cm->pre_fc->nmvc[idx];
const nmv_context_counts *counts = &cm->counts.mv[idx];
#else
- nmv_context *fc = &cm->fc->nmvc;
- const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
+ nmv_context *nmvc = &cm->fc->nmvc;
+ const nmv_context *pre_nmvc = &cm->pre_fc.nmvc;
const nmv_context_counts *counts = &cm->counts.mv;
#endif // CONFIG_REF_MV
- aom_tree_merge_probs(av1_mv_joint_tree, pre_fc->joints, counts->joints,
- fc->joints);
+ aom_tree_merge_probs(av1_mv_joint_tree, pre_nmvc->joints, counts->joints,
+ nmvc->joints);
for (i = 0; i < 2; ++i) {
- nmv_component *comp = &fc->comps[i];
- const nmv_component *pre_comp = &pre_fc->comps[i];
+ nmv_component *comp = &nmvc->comps[i];
+ const nmv_component *pre_comp = &pre_nmvc->comps[i];
const nmv_component_counts *c = &counts->comps[i];
comp->sign = av1_mode_mv_merge_probs(pre_comp->sign, c->sign);
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index b60112e..aa6f212 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -331,6 +331,7 @@
FRAME_CONTEXT *fc; /* this frame entropy */
FRAME_CONTEXT *frame_contexts; // FRAME_CONTEXTS
+ FRAME_CONTEXT *pre_fc; // Context referenced in this frame
unsigned int frame_context_idx; /* Context to use/update */
FRAME_COUNTS counts;
diff --git a/av1/common/scan.c b/av1/common/scan.c
index 9ad6c0b..293acf6 100644
--- a/av1/common/scan.c
+++ b/av1/common/scan.c
@@ -6606,7 +6606,7 @@
static void update_scan_prob(AV1_COMMON *cm, TX_SIZE tx_size, TX_TYPE tx_type,
int rate_16) {
- FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
+ FRAME_CONTEXT *pre_fc = cm->pre_fc;
uint32_t *prev_non_zero_prob = get_non_zero_prob(pre_fc, tx_size, tx_type);
uint32_t *non_zero_prob = get_non_zero_prob(cm->fc, tx_size, tx_type);
uint32_t *non_zero_count = get_non_zero_counts(&cm->counts, tx_size, tx_type);
diff --git a/av1/common/txb_common.c b/av1/common/txb_common.c
index 08a685b..33eea81 100644
--- a/av1/common/txb_common.c
+++ b/av1/common/txb_common.c
@@ -98,7 +98,7 @@
void av1_adapt_txb_probs(AV1_COMMON *cm, unsigned int count_sat,
unsigned int update_factor) {
FRAME_CONTEXT *fc = cm->fc;
- const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
+ const FRAME_CONTEXT *pre_fc = cm->pre_fc;
const FRAME_COUNTS *counts = &cm->counts;
TX_SIZE tx_size;
int plane, ctx, level;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index ea2ff71..1ceae84 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -5007,6 +5007,7 @@
av1_setup_block_planes(xd, cm->subsampling_x, cm->subsampling_y);
*cm->fc = cm->frame_contexts[cm->frame_context_idx];
+ cm->pre_fc = &cm->frame_contexts[cm->frame_context_idx];
if (!cm->fc->initialized)
aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
"Uninitialized entropy context.");
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 90fc1c7..8579b90 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -341,6 +341,7 @@
}
#endif
#endif
+ cm->pre_fc = &cm->frame_contexts[cm->frame_context_idx];
cpi->vaq_refresh = 0;