Make ext-intra/intra-interp work with ec-multisymbol Use cdf to signal intra filter type. Skip forward update when ec-adapt is on. Change-Id: Idd446e081b8e9ea33356e60423b372bfd85a80db
diff --git a/av1/common/entropy.c b/av1/common/entropy.c index ad68d3a..d6294bd 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c
@@ -5699,13 +5699,10 @@ #if CONFIG_DELTA_Q AVERAGE_TILE_CDFS(delta_q_cdf) #endif -#if CONFIG_EXT_INTRA -#if CONFIG_INTRA_INTERP -// FIXME: intra_filter probs -#endif // CONFIG_INTRA_INTERP -#endif // CONFIG_EXT_INTRA +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP + AVERAGE_TILE_CDFS(intra_filter_cdf) +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP #if CONFIG_FILTER_INTRA -// FIXME: intra_filter probs #endif // CONFIG_FILTER_INTRA }
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 4bc470a..7541a4c 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -1531,8 +1531,7 @@ }; #endif // CONFIG_EXT_TX -#if CONFIG_EXT_INTRA -#if CONFIG_INTRA_INTERP +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP static const aom_prob default_intra_filter_probs[INTRA_FILTERS + 1][INTRA_FILTERS - 1] = { { 98, 63, 60 }, { 98, 82, 80 }, { 94, 65, 103 }, @@ -1542,8 +1541,11 @@ -INTRA_FILTER_LINEAR, 2, -INTRA_FILTER_8TAP, 4, -INTRA_FILTER_8TAP_SHARP, -INTRA_FILTER_8TAP_SMOOTH, }; -#endif // CONFIG_INTRA_INTERP -#endif // CONFIG_EXT_INTRA +#if CONFIG_EC_MULTISYMBOL +int av1_intra_filter_ind[INTRA_FILTERS]; +int av1_intra_filter_inv[INTRA_FILTERS]; +#endif // CONFIG_EC_MULTISYMBOL +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP #if CONFIG_FILTER_INTRA static const aom_prob default_filter_intra_probs[2] = { 230, 230 }; @@ -1742,7 +1744,16 @@ { 22528, 25928, 29348, 32768, 0 }, { 24576, 27296, 30032, 32768, 0 }, }; -#endif +#endif // !CONFIG_EXT_TX + +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP +static const aom_cdf_prob + default_intra_filter_cdf[INTRA_FILTERS + 1][CDF_SIZE(INTRA_FILTERS)] = { + { 12544, 17521, 21095, 32768, 0 }, { 12544, 19022, 23318, 32768, 0 }, + { 12032, 17297, 23522, 32768, 0 }, { 6272, 8860, 11101, 32768, 0 }, + { 9216, 12712, 16629, 32768, 0 }, + }; +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP // CDF version of 'av1_kf_y_mode_prob'. const aom_cdf_prob @@ -2284,16 +2295,19 @@ #if !CONFIG_EXT_TX av1_copy(fc->intra_ext_tx_cdf, default_intra_ext_tx_cdf); av1_copy(fc->inter_ext_tx_cdf, default_inter_ext_tx_cdf); -#endif +#endif // !CONFIG_EXT_TX +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP + av1_copy(fc->intra_filter_cdf, default_intra_filter_cdf); +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP av1_copy(fc->seg.tree_cdf, default_seg_tree_cdf); av1_copy(fc->tx_size_cdf, default_tx_size_cdf); -#endif +#endif // CONFIG_EC_MULTISYMBOL #if CONFIG_DELTA_Q av1_copy(fc->delta_q_prob, default_delta_q_probs); #if CONFIG_EC_MULTISYMBOL av1_copy(fc->delta_q_cdf, default_delta_q_cdf); -#endif -#endif +#endif // CONFIG_EC_MULTISYMBOL +#endif // CONFIG_DELTA_Q } #if CONFIG_EC_MULTISYMBOL @@ -2374,9 +2388,15 @@ fc->tx_size_cdf[i][j]); } } +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP + for (i = 0; i < INTRA_FILTERS + 1; ++i) { + av1_tree_to_cdf(av1_intra_filter_tree, fc->intra_filter_probs[i], + fc->intra_filter_cdf[i]); + } +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP } #endif // !CONFIG_EC_ADAPT -#endif +#endif // CONFIG_EC_MULTISYMBOL #if CONFIG_DUAL_FILTER const aom_tree_index av1_switchable_interp_tree[TREE_SIZE(SWITCHABLE_FILTERS)] =
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index 902b5fb..a91d8ce 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -260,12 +260,15 @@ [CDF_SIZE(MAX_TX_DEPTH + 1)]; #if CONFIG_DELTA_Q aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)]; -#endif +#endif // CONFIG_DELTA_Q #if !CONFIG_EXT_TX aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][CDF_SIZE(TX_TYPES)]; aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SIZES][CDF_SIZE(TX_TYPES)]; -#endif -#endif +#endif // !CONFIG_EXT_TX +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP + aom_cdf_prob intra_filter_cdf[INTRA_FILTERS + 1][CDF_SIZE(INTRA_FILTERS)]; +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP +#endif // CONFIG_EC_MULTISYMBOL #if CONFIG_DELTA_Q aom_prob delta_q_prob[DELTA_Q_PROBS]; #endif @@ -450,11 +453,9 @@ av1_palette_color_index_tree[PALETTE_SIZES][TREE_SIZE(PALETTE_COLORS)]; #endif // CONFIG_PALETTE extern const aom_tree_index av1_tx_size_tree[MAX_TX_DEPTH][TREE_SIZE(TX_SIZES)]; -#if CONFIG_EXT_INTRA -#if CONFIG_INTRA_INTERP +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP extern const aom_tree_index av1_intra_filter_tree[TREE_SIZE(INTRA_FILTERS)]; -#endif // CONFIG_INTRA_INTERP -#endif // CONFIG_EXT_INTRA +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP #if CONFIG_EXT_TX extern const aom_tree_index av1_ext_tx_inter_tree[EXT_TX_SETS_INTER] [TREE_SIZE(TX_TYPES)];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index f040bb1..6b224c7 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -4471,7 +4471,7 @@ FRAME_CONTEXT *const fc = cm->fc; aom_reader r; int k, i; -#if !CONFIG_EC_ADAPT || CONFIG_EXT_INTRA +#if !CONFIG_EC_ADAPT int j; #endif @@ -4548,13 +4548,13 @@ for (; j < PARTITION_CONTEXTS_PRIMARY + 2 * PARTITION_BLOCK_SIZES; ++j) av1_diff_update_prob(&r, &fc->partition_prob[j][PARTITION_HORZ], ACCT_STR); #endif // CONFIG_UNPOISON_PARTITION_CTX -#endif // !CONFIG_EC_ADAPT #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP for (i = 0; i < INTRA_FILTERS + 1; ++i) for (j = 0; j < INTRA_FILTERS - 1; ++j) av1_diff_update_prob(&r, &fc->intra_filter_probs[i][j], ACCT_STR); #endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP +#endif // !CONFIG_EC_ADAPT if (frame_is_intra_only(cm)) { av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index afd2654..2f3c3a3 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -709,6 +709,11 @@ MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; const BLOCK_SIZE bsize = mbmi->sb_type; #if CONFIG_INTRA_INTERP +#if CONFIG_EC_ADAPT + FRAME_CONTEXT *const ec_ctx = xd->tile_ctx; +#else + FRAME_CONTEXT *const ec_ctx = cm->fc; +#endif // CONFIG_EC_ADAPT const int ctx = av1_get_pred_context_intra_interp(xd); int p_angle; #endif // CONFIG_INTRA_INTERP @@ -725,8 +730,13 @@ mbmi->angle_delta[0] * av1_get_angle_step(mbmi->sb_type, 0); if (av1_is_intra_filter_switchable(p_angle)) { FRAME_COUNTS *counts = xd->counts; +#if CONFIG_EC_MULTISYMBOL + mbmi->intra_filter = aom_read_symbol(r, ec_ctx->intra_filter_cdf[ctx], + INTRA_FILTERS, ACCT_STR); +#else mbmi->intra_filter = aom_read_tree( - r, av1_intra_filter_tree, cm->fc->intra_filter_probs[ctx], ACCT_STR); + r, av1_intra_filter_tree, ec_ctx->intra_filter_probs[ctx], ACCT_STR); +#endif // CONFIG_EC_MULTISYMBOL if (counts) ++counts->intra_filter[ctx][mbmi->intra_filter]; } else { mbmi->intra_filter = INTRA_FILTER_LINEAR;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index d9eaf23..af94487 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -168,11 +168,9 @@ } #endif // CONFIG_PALETTE -#if CONFIG_EXT_INTRA -#if CONFIG_INTRA_INTERP +#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP av1_tokens_from_tree(intra_filter_encodings, av1_intra_filter_tree); -#endif // CONFIG_INTRA_INTERP -#endif // CONFIG_EXT_INTRA +#endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP #if CONFIG_EXT_INTER av1_tokens_from_tree(interintra_mode_encodings, av1_interintra_mode_tree); av1_tokens_from_tree(compound_type_encodings, av1_compound_type_tree); @@ -1263,8 +1261,8 @@ #endif // CONFIG_FILTER_INTRA #if CONFIG_EXT_INTRA -static void write_intra_angle_info(const AV1_COMMON *cm, const MACROBLOCKD *xd, - aom_writer *w) { +static void write_intra_angle_info(const MACROBLOCKD *xd, + FRAME_CONTEXT *const ec_ctx, aom_writer *w) { const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; const BLOCK_SIZE bsize = mbmi->sb_type; #if CONFIG_INTRA_INTERP @@ -1272,7 +1270,7 @@ int p_angle; #endif // CONFIG_INTRA_INTERP - (void)cm; + (void)ec_ctx; if (bsize < BLOCK_8X8) return; if (av1_is_directional_mode(mbmi->mode, bsize)) { @@ -1283,9 +1281,15 @@ p_angle = mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * av1_get_angle_step(mbmi->sb_type, 0); if (av1_is_intra_filter_switchable(p_angle)) { +#if CONFIG_EC_MULTISYMBOL + aom_write_symbol(w, mbmi->intra_filter, + ec_ctx->intra_filter_cdf[intra_filter_ctx], + INTRA_FILTERS); +#else av1_write_token(w, av1_intra_filter_tree, - cm->fc->intra_filter_probs[intra_filter_ctx], + ec_ctx->intra_filter_probs[intra_filter_ctx], &intra_filter_encodings[mbmi->intra_filter]); +#endif // CONFIG_EC_MULTISYMBOL } #endif // CONFIG_INTRA_INTERP } @@ -1653,7 +1657,7 @@ #endif // CONFIG_CB4X4 #if CONFIG_EXT_INTRA - write_intra_angle_info(cm, xd, w); + write_intra_angle_info(xd, ec_ctx, w); #endif // CONFIG_EXT_INTRA #if CONFIG_PALETTE if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) @@ -1994,7 +1998,7 @@ #endif // CONFIG_CB4X4 #if CONFIG_EXT_INTRA - write_intra_angle_info(cm, xd, w); + write_intra_angle_info(xd, ec_ctx, w); #endif // CONFIG_EXT_INTRA #if CONFIG_PALETTE if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) @@ -4623,13 +4627,12 @@ ct, probwt); } #endif -#endif // !CONFIG_EC_ADAPT - #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP for (i = 0; i < INTRA_FILTERS + 1; ++i) prob_diff_update(av1_intra_filter_tree, fc->intra_filter_probs[i], counts->intra_filter[i], INTRA_FILTERS, probwt, header_bc); #endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP +#endif // !CONFIG_EC_ADAPT if (frame_is_intra_only(cm)) { av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);