Adapt motion mode syntax. Remove deprecated tree coding when EC_ADAPT is on. AWCY, objective-1-fast, High Latency: PSNR (Y, Cb, Cr) : -0.10%, -0.40%, -0.37% SSIM: -0.11% PSNR-HVS: -0.07% MS-SSIM: -0.06% Change-Id: Ic2d436e037312e1af238a8586983f1288a9a95a8
diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 1978424..1052307 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c
@@ -5703,8 +5703,6 @@ AVERAGE_TILE_CDFS(drl_cdf) #endif -// FIXME: cdfs not defined for motion_mode_prob - // FIXME: cdfs not defined for super_tx #if CONFIG_EXT_INTER @@ -5732,10 +5730,13 @@ } #if CONFIG_NEW_MULTISYMBOL AVERAGE_TILE_CDFS(intra_inter_cdf) +#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION + AVERAGE_TILE_CDFS(motion_mode_cdf) #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION AVERAGE_TILE_CDFS(obmc_cdf) #endif #endif +#endif } #if CONFIG_PVQ
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 6d6bc88..266bda2 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -1310,8 +1310,8 @@ const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = { -SIMPLE_TRANSLATION, -OBMC_CAUSAL }; -static const aom_prob default_motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1] = - { +static const aom_cdf_prob + default_motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1] = { #if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8 { 255 }, { 255 }, { 255 }, #endif @@ -1343,6 +1343,34 @@ #endif // CONFIG_EXT_PARTITION }; #endif +#if CONFIG_EC_ADAPT +static const aom_cdf_prob + default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = { +#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8 + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, +#endif + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(151 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(153 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(144 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(178 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(165 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(207 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(195 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(168 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(244 * 128), AOM_ICDF(32768), 0 }, +#if CONFIG_EXT_PARTITION + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, +#endif // CONFIG_EXT_PARTITION + }; +#endif // CONFIG_EC_ADAPT #elif !CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION @@ -1362,6 +1390,35 @@ #endif // CONFIG_EXT_PARTITION }; +#if CONFIG_EC_ADAPT +static const aom_cdf_prob + default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = { +#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8 + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, +#endif + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(151 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(153 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(144 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(178 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(165 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(207 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(195 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(168 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(244 * 128), AOM_ICDF(32768), 0 }, +#if CONFIG_EXT_PARTITION + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, + { AOM_ICDF(252 * 128), AOM_ICDF(32768), 0 }, +#endif // CONFIG_EXT_PARTITION + }; +#endif // CONFIG_EC_ADAPT + #elif CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = { @@ -1380,6 +1437,35 @@ #endif // CONFIG_EXT_PARTITION }; +#if CONFIG_EC_ADAPT +static const aom_cdf_prob + default_motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)] = { +#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8 + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, +#endif + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }, + { AOM_ICDF(19328), AOM_ICDF(29828), AOM_ICDF(32768), 0 }, + { AOM_ICDF(19584), AOM_ICDF(29884), AOM_ICDF(32768), 0 }, + { AOM_ICDF(18432), AOM_ICDF(29632), AOM_ICDF(32768), 0 }, + { AOM_ICDF(22784), AOM_ICDF(30584), AOM_ICDF(32768), 0 }, + { AOM_ICDF(21120), AOM_ICDF(30220), AOM_ICDF(32768), 0 }, + { AOM_ICDF(20480), AOM_ICDF(30080), AOM_ICDF(32768), 0 }, + { AOM_ICDF(26496), AOM_ICDF(31396), AOM_ICDF(32768), 0 }, + { AOM_ICDF(24960), AOM_ICDF(31060), AOM_ICDF(32768), 0 }, + { AOM_ICDF(21504), AOM_ICDF(30304), AOM_ICDF(32768), 0 }, + { AOM_ICDF(31232), AOM_ICDF(32432), AOM_ICDF(32768), 0 }, +#if CONFIG_EXT_PARTITION + { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 }, + { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 }, +#endif + }; +#endif // !CONFIG_EC_ADAPT + // Probability for the case that only 1 additional motion mode is allowed static const aom_prob default_obmc_prob[BLOCK_SIZES] = { #if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8 @@ -4931,6 +5017,9 @@ #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR av1_copy(fc->ncobmc_mode_prob, default_ncobmc_mode_prob); #endif +#if CONFIG_EC_ADAPT + av1_copy(fc->motion_mode_cdf, default_motion_mode_cdf); +#endif #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION av1_copy(fc->obmc_prob, default_obmc_prob); #if CONFIG_NEW_MULTISYMBOL
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index eb509bf..a1451c7 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -223,11 +223,12 @@ #endif // CONFIG_EXT_INTER #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION aom_prob motion_mode_prob[BLOCK_SIZES][MOTION_MODES - 1]; - +#if CONFIG_EC_ADAPT + aom_cdf_prob motion_mode_cdf[BLOCK_SIZES][CDF_SIZE(MOTION_MODES)]; +#endif #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR aom_prob ncobmc_mode_prob[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES - 1]; #endif - #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION aom_prob obmc_prob[BLOCK_SIZES]; #if CONFIG_NEW_MULTISYMBOL
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 35116bf..9affe14 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -5004,8 +5004,7 @@ FRAME_CONTEXT *const fc = cm->fc; aom_reader r; int i; -#if !CONFIG_EC_ADAPT || \ - (CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION || CONFIG_EXT_INTER) +#if !CONFIG_EC_ADAPT int j; #endif @@ -5183,12 +5182,14 @@ #endif // !CONFIG_EC_ADAPT && (CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE) #endif // CONFIG_EXT_INTER +#if !CONFIG_EC_ADAPT #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION for (i = BLOCK_8X8; i < BLOCK_SIZES; ++i) { for (j = 0; j < MOTION_MODES - 1; ++j) av1_diff_update_prob(&r, &fc->motion_mode_prob[i][j], ACCT_STR); } #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION +#endif // !CONFIG_EC_ADAPT #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR for (i = 0; i < ADAPT_OVERLAP_BLOCKS; ++i) { @@ -5199,7 +5200,7 @@ #if !CONFIG_EC_ADAPT if (cm->interp_filter == SWITCHABLE) read_switchable_interp_probs(fc, &r); -#endif +#endif // !CONFIG_EC_ADAPT #if !CONFIG_NEW_MULTISYMBOL for (i = 0; i < INTRA_INTER_CONTEXTS; i++) av1_diff_update_prob(&r, &fc->intra_inter_prob[i], ACCT_STR);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 79dd298..9f42d06 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -322,6 +322,10 @@ static MOTION_MODE read_motion_mode(AV1_COMMON *cm, MACROBLOCKD *xd, MODE_INFO *mi, aom_reader *r) { MB_MODE_INFO *mbmi = &mi->mbmi; +#if CONFIG_NEW_MULTISYMBOL + (void)cm; +#endif + #if CONFIG_NCOBMC_ADAPT_WEIGHT const MOTION_MODE last_motion_mode_allowed = motion_mode_allowed_wrapper(0, @@ -352,9 +356,15 @@ return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode); } else { #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION +#if CONFIG_EC_ADAPT motion_mode = - aom_read_tree(r, av1_motion_mode_tree, - cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR); + aom_read_symbol(r, xd->tile_ctx->motion_mode_cdf[mbmi->sb_type], + MOTION_MODES, ACCT_STR); +#else + motion_mode = + aom_read_tree(r, av1_motion_mode_tree, + cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR); +#endif if (counts) ++counts->motion_mode[mbmi->sb_type][motion_mode]; return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode); #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index cf209f3..6e30597 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -116,7 +116,9 @@ #endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE #endif // CONFIG_EXT_INTER #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION +#if !CONFIG_EC_ADAPT static struct av1_token motion_mode_encodings[MOTION_MODES]; +#endif #if CONFIG_NCOBMC_ADAPT_WEIGHT static struct av1_token ncobmc_mode_encodings[MAX_NCOBMC_MODES]; #endif @@ -172,7 +174,9 @@ #endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE #endif // CONFIG_EXT_INTER #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION +#if !CONFIG_EC_ADAPT av1_tokens_from_tree(motion_mode_encodings, av1_motion_mode_tree); +#endif #if CONFIG_NCOBMC_ADAPT_WEIGHT av1_tokens_from_tree(ncobmc_mode_encodings, av1_ncobmc_mode_tree); #endif @@ -351,8 +355,7 @@ aom_wb_write_literal(wb, data, get_unsigned_bits(max)); } -#if !CONFIG_EC_ADAPT || \ - (CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION || CONFIG_EXT_INTER) +#if !CONFIG_EC_ADAPT || CONFIG_NCOBMC_ADAPT_WEIGHT || CONFIG_COMPOUND_SINGLEREF static void prob_diff_update(const aom_tree_index *tree, aom_prob probs[/*n - 1*/], const unsigned int counts[/* n */], int n, @@ -612,7 +615,7 @@ static void write_motion_mode(const AV1_COMMON *cm, MACROBLOCKD *xd, const MODE_INFO *mi, aom_writer *w) { const MB_MODE_INFO *mbmi = &mi->mbmi; -#if !CONFIG_NEW_MULTISYMBOL +#if !CONFIG_EC_ADAPT (void)xd; #endif @@ -642,9 +645,15 @@ #endif } else { #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION - av1_write_token(w, av1_motion_mode_tree, - cm->fc->motion_mode_prob[mbmi->sb_type], - &motion_mode_encodings[mbmi->motion_mode]); +#if CONFIG_EC_ADAPT + aom_write_symbol(w, mbmi->motion_mode, + xd->tile_ctx->motion_mode_cdf[mbmi->sb_type], + MOTION_MODES); +#else + av1_write_token(w, av1_motion_mode_tree, + cm->fc->motion_mode_prob[mbmi->sb_type], + &motion_mode_encodings[mbmi->motion_mode]); +#endif #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION } #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION @@ -5022,6 +5031,11 @@ #else const int probwt = 1; #endif +#if CONFIG_EC_ADAPT + (void)probwt; + (void)i; + (void)fc; +#endif #if CONFIG_ANS int header_size; @@ -5193,9 +5207,11 @@ #endif // CONFIG_EXT_INTER #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION +#if !CONFIG_EC_ADAPT for (i = BLOCK_8X8; i < BLOCK_SIZES; ++i) prob_diff_update(av1_motion_mode_tree, fc->motion_mode_prob[i], counts->motion_mode[i], MOTION_MODES, probwt, header_bc); +#endif #if CONFIG_NCOBMC_ADAPT_WEIGHT for (i = ADAPT_OVERLAP_BLOCK_8X8; i < ADAPT_OVERLAP_BLOCKS; ++i) { prob_diff_update(av1_ncobmc_mode_tree, fc->ncobmc_mode_prob[i], @@ -5204,10 +5220,11 @@ } #endif #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION + #if !CONFIG_EC_ADAPT if (cm->interp_filter == SWITCHABLE) update_switchable_interp_probs(cm, header_bc, counts); -#endif +#endif // !CONFIG_EC_ADAPT #if !CONFIG_NEW_MULTISYMBOL for (i = 0; i < INTRA_INTER_CONTEXTS; i++)