NEW_MULTISYMBOL: Adapt intra_inter binary symbol. Adapt the intra_inter binary syntax element symbol-by-symbol and remove updates from the compressed header. Change-Id: I9abfd91d4521202f27854ce3e01b670ce15846e9
diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 38ba284..abd5f9b 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c
@@ -5710,6 +5710,9 @@ if (cm->interp_filter == SWITCHABLE) { AVERAGE_TILE_CDFS(switchable_interp_cdf) } +#if CONFIG_NEW_MULTISYMBOL + AVERAGE_TILE_CDFS(intra_inter_cdf) +#endif } #if CONFIG_PVQ
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index c5aca1d..7bebddc 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -1340,6 +1340,16 @@ 9, 102, 187, 225 }; +#if CONFIG_NEW_MULTISYMBOL +static const aom_cdf_prob + default_intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)] = { + { AOM_ICDF(1152), AOM_ICDF(32768), 0 }, + { AOM_ICDF(13056), AOM_ICDF(32768), 0 }, + { AOM_ICDF(23936), AOM_ICDF(32768), 0 }, + { AOM_ICDF(28800), AOM_ICDF(32768), 0 } + }; +#endif + static const aom_prob default_comp_inter_p[COMP_INTER_CONTEXTS] = { 239, 183, 119, 96, 41 }; @@ -4556,6 +4566,7 @@ av1_copy(fc->inter_ext_tx_cdf, default_inter_ext_tx_cdf); #if CONFIG_NEW_MULTISYMBOL av1_copy(fc->skip_cdfs, default_skip_cdfs); + av1_copy(fc->intra_inter_cdf, default_intra_inter_cdf); #endif #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP av1_copy(fc->intra_filter_cdf, default_intra_filter_cdf);
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index ef5b5d7..e547e13 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -228,6 +228,7 @@ aom_prob skip_probs[SKIP_CONTEXTS]; #if CONFIG_NEW_MULTISYMBOL aom_cdf_prob skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)]; + aom_cdf_prob intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)]; #endif nmv_context nmvc[NMV_CONTEXTS]; #if CONFIG_INTRABC
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index b230f84..052aac7 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -2303,11 +2303,7 @@ } else { const int ctx = av1_get_skip_context(xd); #if CONFIG_NEW_MULTISYMBOL -#if CONFIG_EC_ADAPT FRAME_CONTEXT *ec_ctx = xd->tile_ctx; -#else - FRAME_CONTEXT *ec_ctx = cm->fc; -#endif const int skip = aom_read_symbol(r, ec_ctx->skip_cdfs[ctx], 2, ACCT_STR); #else const int skip = aom_read(r, cm->fc->skip_probs[ctx], ACCT_STR); @@ -5118,9 +5114,10 @@ #if !CONFIG_EC_ADAPT if (cm->interp_filter == SWITCHABLE) read_switchable_interp_probs(fc, &r); #endif - +#if !CONFIG_NEW_MULTISYMBOL for (i = 0; i < INTRA_INTER_CONTEXTS; i++) av1_diff_update_prob(&r, &fc->intra_inter_prob[i], ACCT_STR); +#endif if (cm->reference_mode != SINGLE_REFERENCE) setup_compound_reference_mode(cm);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index a9ac223..273c567 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -1876,7 +1876,17 @@ return get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME; } else { const int ctx = av1_get_intra_inter_context(xd); +#if CONFIG_NEW_MULTISYMBOL +#if CONFIG_EC_ADAPT + FRAME_CONTEXT *ec_ctx = xd->tile_ctx; +#else + FRAME_CONTEXT *ec_ctx = cm->fc; +#endif + const int is_inter = + aom_read_symbol(r, ec_ctx->intra_inter_cdf[ctx], 2, ACCT_STR); +#else const int is_inter = aom_read(r, cm->fc->intra_inter_prob[ctx], ACCT_STR); +#endif FRAME_COUNTS *counts = xd->counts; if (counts) ++counts->intra_inter[ctx][is_inter]; return is_inter;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index d51e783..5bc6be6 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -559,6 +559,19 @@ } } +static void write_is_inter(const AV1_COMMON *cm, const MACROBLOCKD *xd, + int segment_id, aom_writer *w, const int is_inter) { + if (!segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) { +#if CONFIG_NEW_MULTISYMBOL + FRAME_CONTEXT *ec_ctx = xd->tile_ctx; + const int ctx = av1_get_intra_inter_context(xd); + aom_write_symbol(w, is_inter, ec_ctx->intra_inter_cdf[ctx], 2); +#else + aom_write(w, is_inter, av1_get_intra_inter_prob(cm, xd)); +#endif + } +} + #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION static void write_motion_mode(const AV1_COMMON *cm, const MODE_INFO *mi, aom_writer *w) { @@ -1862,8 +1875,7 @@ #if CONFIG_SUPERTX if (!supertx_enabled) #endif // CONFIG_SUPERTX - if (!segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) - aom_write(w, is_inter, av1_get_intra_inter_prob(cm, xd)); + write_is_inter(cm, xd, mbmi->segment_id, w, is_inter); if (cm->tx_mode == TX_MODE_SELECT && #if CONFIG_CB4X4 && (CONFIG_VAR_TX || CONFIG_RECT_TX) @@ -4984,9 +4996,11 @@ update_switchable_interp_probs(cm, header_bc, counts); #endif +#if !CONFIG_NEW_MULTISYMBOL for (i = 0; i < INTRA_INTER_CONTEXTS; i++) av1_cond_prob_diff_update(header_bc, &fc->intra_inter_prob[i], counts->intra_inter[i], probwt); +#endif if (cpi->allow_comp_inter_inter) { const int use_hybrid_pred = cm->reference_mode == REFERENCE_MODE_SELECT;