/* Update probabilities for the nodes in the token entropy tree.
Generated file included by vp9_entropy.c */
+#define VP9_DEF_UPDATE_PROB 252
+
static const vp9_prob vp9_coef_update_prob[UNCONSTRAINED_NODES] = {
252, 252, 252,
};
}
void vp9_init_mode_contexts(VP9_COMMON *pc) {
- vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
- vpx_memcpy(pc->fc.vp9_mode_contexts,
- vp9_default_mode_contexts,
- sizeof(vp9_default_mode_contexts));
+ vpx_memset(pc->fc.inter_mode_counts, 0, sizeof(pc->fc.inter_mode_counts));
+ vpx_memcpy(pc->fc.inter_mode_probs,
+ vp9_default_inter_mode_probs,
+ sizeof(vp9_default_inter_mode_probs));
}
void vp9_accum_mv_refs(VP9_COMMON *pc,
MB_PREDICTION_MODE m,
const int context) {
- unsigned int (*mv_ref_ct)[VP9_MVREFS - 1][2] = pc->fc.mv_ref_ct;
+ unsigned int (*inter_mode_counts)[VP9_MVREFS - 1][2] =
+ pc->fc.inter_mode_counts;
if (m == ZEROMV) {
- ++mv_ref_ct[context][0][0];
+ ++inter_mode_counts[context][0][0];
} else {
- ++mv_ref_ct[context][0][1];
+ ++inter_mode_counts[context][0][1];
if (m == NEARESTMV) {
- ++mv_ref_ct[context][1][0];
+ ++inter_mode_counts[context][1][0];
} else {
- ++mv_ref_ct[context][1][1];
+ ++inter_mode_counts[context][1][1];
if (m == NEARMV) {
- ++mv_ref_ct[context][2][0];
+ ++inter_mode_counts[context][2][0];
} else {
- ++mv_ref_ct[context][2][1];
+ ++inter_mode_counts[context][2][1];
}
}
}
#define MVREF_MAX_UPDATE_FACTOR 128
void vp9_adapt_mode_context(VP9_COMMON *pc) {
int i, j;
- unsigned int (*mv_ref_ct)[VP9_MVREFS - 1][2] = pc->fc.mv_ref_ct;
- int (*mode_context)[VP9_MVREFS - 1] = pc->fc.vp9_mode_contexts;
+ unsigned int (*inter_mode_counts)[VP9_MVREFS - 1][2] =
+ pc->fc.inter_mode_counts;
+ vp9_prob (*mode_context)[VP9_MVREFS - 1] = pc->fc.inter_mode_probs;
for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
for (i = 0; i < VP9_MVREFS - 1; i++) {
- int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1], factor;
-
+ int count = inter_mode_counts[j][i][0] + inter_mode_counts[j][i][1];
+ int factor;
count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
- mode_context[j][i] = weighted_prob(pc->fc.vp9_mode_contexts[j][i],
- get_binary_prob(mv_ref_ct[j][i][0],
- mv_ref_ct[j][i][1]),
- factor);
+ mode_context[j][i] = weighted_prob(
+ pc->fc.pre_inter_mode_probs[j][i],
+ get_binary_prob(inter_mode_counts[j][i][0],
+ inter_mode_counts[j][i][1]),
+ factor);
}
}
}
update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
fc->partition_counts[i], fc->pre_partition_prob[i],
fc->partition_prob[i], 0);
+
+ if (cm->mcomp_filter_type == SWITCHABLE) {
+ for (i = 0; i <= VP9_SWITCHABLE_FILTERS; i++) {
+ update_mode_probs(VP9_SWITCHABLE_FILTERS, vp9_switchable_interp_tree,
+ fc->switchable_interp_count[i],
+ fc->pre_switchable_interp_prob[i],
+ fc->switchable_interp_prob[i], 0);
+ }
+ }
}
static void set_default_lf_deltas(MACROBLOCKD *xd) {
}
vp9_prob *vp9_mv_ref_probs(VP9_COMMON *pc, vp9_prob *p, int context) {
- p[0] = pc->fc.vp9_mode_contexts[context][0];
- p[1] = pc->fc.vp9_mode_contexts[context][1];
- p[2] = pc->fc.vp9_mode_contexts[context][2];
+ p[0] = pc->fc.inter_mode_probs[context][0];
+ p[1] = pc->fc.inter_mode_probs[context][1];
+ p[2] = pc->fc.inter_mode_probs[context][2];
return p;
}
#include "vp9/common/vp9_entropy.h"
-const int vp9_default_mode_contexts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1] = {
+const vp9_prob vp9_default_inter_mode_probs[INTER_MODE_CONTEXTS]
+ [VP9_MVREFS - 1] = {
{2, 173, 34}, // 0 = both zero mv
{7, 145, 85}, // 1 = one zero mv + one a predicted mv
{7, 166, 63}, // 2 = two predicted mvs
#include "vp9/common/vp9_entropy.h"
-extern const int vp9_default_mode_contexts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
+extern const int vp9_default_inter_mode_probs[INTER_MODE_CONTEXTS]
+ [VP9_MVREFS - 1];
#endif // VP9_COMMON_VP9_MODECONT_H_
nmv_context_counts NMVcount;
vp9_prob switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1]
[VP9_SWITCHABLE_FILTERS - 1];
-
- int vp9_mode_contexts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
- unsigned int mv_ref_ct[INTER_MODE_CONTEXTS][VP9_MVREFS - 1][2];
+ vp9_prob pre_switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1]
+ [VP9_SWITCHABLE_FILTERS - 1];
+ unsigned int switchable_interp_count[VP9_SWITCHABLE_FILTERS + 1]
+ [VP9_SWITCHABLE_FILTERS];
+
+ vp9_prob inter_mode_probs[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
+ vp9_prob pre_inter_mode_probs[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
+ unsigned int inter_mode_counts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1][2];
} FRAME_CONTEXT;
typedef enum {
#include "vp9/common/vp9_pred_common.h"
#include "vp9/common/vp9_entropy.h"
#include "vp9/decoder/vp9_decodemv.h"
+#include "vp9/decoder/vp9_decodframe.h"
#include "vp9/common/vp9_mvref_common.h"
#if CONFIG_DEBUG
#include <assert.h>
};
#endif
-static void read_switchable_interp_probs(VP9D_COMP* const pbi, vp9_reader *r) {
- VP9_COMMON *const cm = &pbi->common;
+static void read_switchable_interp_probs(VP9_COMMON* const cm, vp9_reader *r) {
int i, j;
- for (j = 0; j < VP9_SWITCHABLE_FILTERS + 1; ++j)
- for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i)
- cm->fc.switchable_interp_prob[j][i] = vp9_read_prob(r);
+ for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j)
+ for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i) {
+ if (vp9_read(r, VP9_DEF_UPDATE_PROB)) {
+ cm->fc.switchable_interp_prob[j][i] =
+ // vp9_read_prob(r);
+ vp9_read_prob_diff_update(r, cm->fc.switchable_interp_prob[j][i]);
+ }
+ }
+}
+
+static void read_inter_mode_probs(VP9_COMMON *const cm, vp9_reader *r) {
+ int i, j;
+ for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
+ for (j = 0; j < VP9_MVREFS - 1; ++j) {
+ if (vp9_read(r, VP9_DEF_UPDATE_PROB)) {
+ // cm->fc.inter_mode_probs[i][j] = vp9_read_prob(r);
+ cm->fc.inter_mode_probs[i][j] =
+ vp9_read_prob_diff_update(r, cm->fc.inter_mode_probs[i][j]);
+ }
+ }
}
static INLINE COMPPREDMODE_TYPE read_comp_pred_mode(vp9_reader *r) {
MACROBLOCKD *const xd = &pbi->mb;
int i, j;
+ read_inter_mode_probs(cm, r);
+
if (cm->mcomp_filter_type == SWITCHABLE)
- read_switchable_interp_probs(pbi, r);
+ read_switchable_interp_probs(cm, r);
// Baseline probabilities for decoding reference frame
cm->prob_intra_coded = vp9_read_prob(r);
const int index = treed_read(r, vp9_switchable_interp_tree,
vp9_get_pred_probs(&pbi->common, &pbi->mb,
PRED_SWITCHABLE_INTERP));
+ ++pbi->common.fc.switchable_interp_count
+ [vp9_get_pred_context(
+ &pbi->common, &pbi->mb, PRED_SWITCHABLE_INTERP)][index];
return vp9_switchable_interp[index];
}
}
}
-static vp9_prob read_prob_diff_update(vp9_reader *r, int oldp) {
+vp9_prob vp9_read_prob_diff_update(vp9_reader *r, int oldp) {
int delp = decode_term_subexp(r, SUBEXP_PARAM, 255);
return (vp9_prob)inv_remap_prob(delp, oldp);
}
vp9_prob *const p = coef_probs[i][j][k][l] + m;
if (vp9_read(r, vp9_coef_update_prob[m])) {
- *p = read_prob_diff_update(r, *p);
+ *p = vp9_read_prob_diff_update(r, *p);
}
}
}
vp9_copy(fc->pre_uv_mode_prob, fc->uv_mode_prob);
vp9_copy(fc->pre_partition_prob, fc->partition_prob);
fc->pre_nmvc = fc->nmvc;
+ vp9_copy(fc->pre_switchable_interp_prob,
+ fc->switchable_interp_prob);
+ vp9_copy(fc->pre_inter_mode_probs,
+ fc->inter_mode_probs);
vp9_zero(fc->coef_counts);
vp9_zero(fc->eob_branch_counts);
vp9_zero(fc->y_mode_counts);
vp9_zero(fc->uv_mode_counts);
vp9_zero(fc->NMVcount);
- vp9_zero(fc->mv_ref_ct);
+ vp9_zero(fc->inter_mode_counts);
vp9_zero(fc->partition_counts);
+ vp9_zero(fc->switchable_interp_count);
}
static void decode_tile(VP9D_COMP *pbi, vp9_reader *r) {
setup_txfm_mode(pc, xd->lossless, &header_bc);
// Read inter mode probability context updates
- if (!keyframe) {
- int i, j;
- for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
- for (j = 0; j < VP9_MVREFS - 1; ++j)
- if (vp9_read(&header_bc, 252))
- pc->fc.vp9_mode_contexts[i][j] = vp9_read_prob(&header_bc);
- }
update_frame_context(&pc->fc);
void vp9_init_dequantizer(struct VP9Common *pc);
int vp9_decode_frame(struct VP9Decompressor *cpi, const uint8_t **p_data_end);
+vp9_prob vp9_read_prob_diff_update(vp9_reader *r, int oldp);
#endif // VP9_DECODER_VP9_DECODFRAME_H_
cpi->skip_true_count[k]);
}
-static void update_switchable_interp_probs(VP9_COMP *cpi,
- vp9_writer* const bc) {
- VP9_COMMON *const pc = &cpi->common;
- unsigned int branch_ct[32][2];
- int i, j;
- for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j) {
- vp9_tree_probs_from_distribution(
- vp9_switchable_interp_tree,
- pc->fc.switchable_interp_prob[j], branch_ct,
- cpi->switchable_interp_count[j], 0);
- for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i) {
- if (pc->fc.switchable_interp_prob[j][i] < 1)
- pc->fc.switchable_interp_prob[j][i] = 1;
- vp9_write_prob(bc, pc->fc.switchable_interp_prob[j][i]);
- }
- }
-}
-
// This function updates the reference frame prediction stats
static void update_refpred_stats(VP9_COMP *cpi) {
VP9_COMMON *const cm = &cpi->common;
}
}
-// This function is called to update the mode probability context used to encode
-// inter modes. It assumes the branch counts table has already been populated
-// prior to the actual packing of the bitstream (in rd stage or dummy pack)
-//
-// The branch counts table is re-populated during the actual pack stage and in
-// the decoder to facilitate backwards update of the context.
-static void update_inter_mode_probs(VP9_COMMON *cm,
- int mode_context[INTER_MODE_CONTEXTS][VP9_MVREFS - 1]) {
- int i, j;
- unsigned int (*mv_ref_ct)[VP9_MVREFS - 1][2] = cm->fc.mv_ref_ct;
-
- vpx_memcpy(mode_context, cm->fc.vp9_mode_contexts,
- sizeof(cm->fc.vp9_mode_contexts));
-
- for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
- for (j = 0; j < VP9_MVREFS - 1; j++) {
- int new_prob, old_cost, new_cost;
-
- // Work out cost of coding branches with the old and optimal probability
- old_cost = cost_branch256(mv_ref_ct[i][j], mode_context[i][j]);
- new_prob = get_binary_prob(mv_ref_ct[i][j][0], mv_ref_ct[i][j][1]);
- new_cost = cost_branch256(mv_ref_ct[i][j], new_prob);
-
- // If cost saving is >= 14 bits then update the mode probability.
- // This is the approximate net cost of updating one probability given
- // that the no update case ismuch more common than the update case.
- if (new_cost <= (old_cost - (14 << 8))) {
- mode_context[i][j] = new_prob;
- }
- }
- }
-}
-
static void write_intra_mode(vp9_writer *bc, int m, const vp9_prob *p) {
write_token(bc, vp9_intra_mode_tree, p, vp9_intra_mode_encodings + m);
}
vp9_prob newp;
int savings;
newp = get_binary_prob(ct[0], ct[1]);
+ assert(newp >= 1);
savings = prob_update_savings(ct, *oldp, newp, upd);
if (savings > 0) {
vp9_write(bc, 1, upd);
}
}
+static void vp9_cond_prob_diff_update(vp9_writer *bc, vp9_prob *oldp,
+ vp9_prob upd,
+ unsigned int *ct) {
+ vp9_prob newp;
+ int savings;
+ newp = get_binary_prob(ct[0], ct[1]);
+ assert(newp >= 1);
+ savings = prob_diff_update_savings_search(ct, *oldp, &newp, upd);
+ if (savings > 0) {
+ vp9_write(bc, 1, upd);
+ write_prob_diff_update(bc, newp, *oldp);
+ *oldp = newp;
+ } else {
+ vp9_write(bc, 0, upd);
+ }
+}
+
+static void update_switchable_interp_probs(VP9_COMMON *const pc,
+ vp9_writer* const bc) {
+ unsigned int branch_ct[VP9_SWITCHABLE_FILTERS + 1]
+ [VP9_SWITCHABLE_FILTERS - 1][2];
+ vp9_prob new_prob[VP9_SWITCHABLE_FILTERS + 1][VP9_SWITCHABLE_FILTERS - 1];
+ int i, j;
+ for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j) {
+ vp9_tree_probs_from_distribution(
+ vp9_switchable_interp_tree,
+ new_prob[j], branch_ct[j],
+ pc->fc.switchable_interp_count[j], 0);
+ }
+ for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j) {
+ for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i) {
+ // vp9_cond_prob_update(bc, &pc->fc.switchable_interp_prob[j][i],
+ // VP9_DEF_UPDATE_PROB, branch_ct[j][i]);
+ vp9_cond_prob_diff_update(bc, &pc->fc.switchable_interp_prob[j][i],
+ VP9_DEF_UPDATE_PROB, branch_ct[j][i]);
+ }
+ }
+}
+
+static void update_inter_mode_probs(VP9_COMMON *pc, vp9_writer* const bc) {
+ int i, j;
+
+ for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
+ for (j = 0; j < VP9_MVREFS - 1; j++) {
+ vp9_cond_prob_diff_update(bc, &pc->fc.inter_mode_probs[i][j],
+ VP9_DEF_UPDATE_PROB,
+ pc->fc.inter_mode_counts[i][j]);
+ // vp9_cond_prob_update(
+ // bc, &pc->fc.inter_mode_probs[i][j],
+ // VP9_DEF_UPDATE_PROB, pc->fc.inter_mode_counts[i][j]);
+ }
+ }
+}
+
static void pack_mb_tokens(vp9_writer* const bc,
TOKENEXTRA **tp,
const TOKENEXTRA *const stop) {
for (i = 0; i < VP9_SWITCHABLE_FILTERS; ++i) {
count[i] = 0;
for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j)
- count[i] += cpi->switchable_interp_count[j][i];
+ count[i] += cpi->common.fc.switchable_interp_count[j][i];
c += (count[i] > 0);
}
if (c == 1) {
else
encode_txfm(cpi, &header_bc);
- // If appropriate update the inter mode probability context and code the
- // changes in the bitstream.
- if (pc->frame_type != KEY_FRAME) {
- int i, j;
- int new_context[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
- if (!cpi->dummy_packing) {
- update_inter_mode_probs(pc, new_context);
- } else {
- // In dummy pack assume context unchanged.
- vpx_memcpy(new_context, pc->fc.vp9_mode_contexts,
- sizeof(pc->fc.vp9_mode_contexts));
- }
-
- for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
- for (j = 0; j < VP9_MVREFS - 1; j++) {
- if (new_context[i][j] != pc->fc.vp9_mode_contexts[i][j]) {
- vp9_write(&header_bc, 1, 252);
- vp9_write_prob(&header_bc, new_context[i][j]);
-
- // Only update the persistent copy if this is the "real pack"
- if (!cpi->dummy_packing) {
- pc->fc.vp9_mode_contexts[i][j] = new_context[i][j];
- }
- } else {
- vp9_write(&header_bc, 0, 252);
- }
- }
- }
- }
-
vp9_clear_system_state(); // __asm emms;
vp9_copy(cpi->common.fc.pre_coef_probs, cpi->common.fc.coef_probs);
vp9_copy(cpi->common.fc.pre_uv_mode_prob, cpi->common.fc.uv_mode_prob);
vp9_copy(cpi->common.fc.pre_partition_prob, cpi->common.fc.partition_prob);
cpi->common.fc.pre_nmvc = cpi->common.fc.nmvc;
- vp9_zero(cpi->common.fc.mv_ref_ct);
+ vp9_copy(cpi->common.fc.pre_switchable_interp_prob,
+ cpi->common.fc.switchable_interp_prob);
+ vp9_copy(cpi->common.fc.pre_inter_mode_probs,
+ cpi->common.fc.inter_mode_probs);
update_coef_probs(cpi, &header_bc);
}
if (pc->frame_type != KEY_FRAME) {
- // Update the probabilities used to encode reference frame data
- update_ref_probs(cpi);
#ifdef ENTROPY_STATS
active_section = 1;
#endif
+ update_inter_mode_probs(pc, &header_bc);
+ vp9_zero(cpi->common.fc.inter_mode_counts);
+
if (pc->mcomp_filter_type == SWITCHABLE)
- update_switchable_interp_probs(cpi, &header_bc);
+ update_switchable_interp_probs(pc, &header_bc);
+
+ // Update the probabilities used to encode reference frame data
+ update_ref_probs(cpi);
vp9_write_prob(&header_bc, pc->prob_intra_coded);
vp9_write_prob(&header_bc, pc->prob_last_coded);
if (cpi->common.mcomp_filter_type == SWITCHABLE &&
is_inter_mode(mbmi->mode)) {
- ++cpi->switchable_interp_count
+ ++cpi->common.fc.switchable_interp_count
[vp9_get_pred_context(&cpi->common, xd, PRED_SWITCHABLE_INTERP)]
[vp9_switchable_interp_map[mbmi->interp_filter]];
}
vp9_zero(cpi->count_mb_ref_frame_usage)
vp9_zero(cpi->y_mode_count)
vp9_zero(cpi->y_uv_mode_count)
- vp9_zero(cpi->common.fc.mv_ref_ct)
+ vp9_zero(cpi->common.fc.inter_mode_counts)
vp9_zero(cpi->partition_count);
// Note: this memset assumes above_context[0], [1] and [2]
cpi->skip_true_count[0] = cpi->skip_true_count[1] = cpi->skip_true_count[2] = 0;
cpi->skip_false_count[0] = cpi->skip_false_count[1] = cpi->skip_false_count[2] = 0;
- vp9_zero(cpi->switchable_interp_count);
+ vp9_zero(cm->fc.switchable_interp_count);
vp9_zero(cpi->best_switchable_interp_count);
xd->mode_info_context = cm->mi;
void vp9_update_mode_context_stats(VP9_COMP *cpi) {
VP9_COMMON *cm = &cpi->common;
int i, j;
- unsigned int (*mv_ref_ct)[VP9_MVREFS - 1][2] = cm->fc.mv_ref_ct;
+ unsigned int (*inter_mode_counts)[VP9_MVREFS - 1][2] =
+ cm->fc.inter_mode_counts;
int64_t (*mv_ref_stats)[VP9_MVREFS - 1][2] = cpi->mv_ref_stats;
FILE *f;
// Add in the values for this frame
for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
for (j = 0; j < VP9_MVREFS - 1; j++) {
- mv_ref_stats[i][j][0] += (int64_t)mv_ref_ct[i][j][0];
- mv_ref_stats[i][j][1] += (int64_t)mv_ref_ct[i][j][1];
+ mv_ref_stats[i][j][0] += (int64_t)inter_mode_counts[i][j][0];
+ mv_ref_stats[i][j][1] += (int64_t)inter_mode_counts[i][j][1];
}
}
fprintf(f, "#include \"vp9_entropy.h\"\n");
fprintf(f,
- "const int vp9_mode_contexts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1] =");
+ "const int inter_mode_probs[INTER_MODE_CONTEXTS][VP9_MVREFS - 1] =");
fprintf(f, "{\n");
for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
fprintf(f, " {/* %d */ ", j);
vp9_prob switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1]
[VP9_SWITCHABLE_FILTERS - 1];
- int mv_ref_ct[INTER_MODE_CONTEXTS][VP9_MVREFS - 1][2];
- int vp9_mode_contexts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
+ int inter_mode_counts[INTER_MODE_CONTEXTS][VP9_MVREFS - 1][2];
+ vp9_prob inter_mode_probs[INTER_MODE_CONTEXTS][VP9_MVREFS - 1];
} CODING_CONTEXT;
vp9_copy(cc->nmvcosts, cpi->mb.nmvcosts);
vp9_copy(cc->nmvcosts_hp, cpi->mb.nmvcosts_hp);
- vp9_copy(cc->vp9_mode_contexts, cm->fc.vp9_mode_contexts);
+ vp9_copy(cc->inter_mode_probs, cm->fc.inter_mode_probs);
vp9_copy(cc->y_mode_prob, cm->fc.y_mode_prob);
vp9_copy(cc->uv_mode_prob, cm->fc.uv_mode_prob);
vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
- vp9_copy(cm->fc.vp9_mode_contexts, cc->vp9_mode_contexts);
+ vp9_copy(cm->fc.inter_mode_probs, cc->inter_mode_probs);
vp9_copy(cm->fc.y_mode_prob, cc->y_mode_prob);
vp9_copy(cm->fc.uv_mode_prob, cc->uv_mode_prob);