diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 7898d82c08089c1e5cb51c778f6b1d2f05665cee..01d5452411cf93d5eb6a862944c176bbe8faaf10 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c @@ -2255,6 +2255,7 @@ void av1_average_tile_mv_cdfs(FRAME_CONTEXT *fc, FRAME_CONTEXT *ec_ctxs[], AVERAGE_TILE_CDFS(nmvc[j].comps[k].hp_cdf) AVERAGE_TILE_CDFS(nmvc[j].comps[k].class0_hp_cdf) AVERAGE_TILE_CDFS(nmvc[j].comps[k].class0_cdf) + AVERAGE_TILE_CDFS(nmvc[j].comps[k].bits_cdf) #endif } } diff --git a/av1/common/entropymv.c b/av1/common/entropymv.c index 32e6c9104b8fcb62b7d64c514502c7f12ef48fe4..2d0191366fc2db23f0df55e70f9d341e3511c39d 100644 --- a/av1/common/entropymv.c +++ b/av1/common/entropymv.c @@ -68,6 +68,12 @@ static const nmv_context default_nmv_context = { { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 }, { AOM_ICDF(128 * 128), AOM_ICDF(32768), 0 }, { AOM_ICDF(216 * 128), AOM_ICDF(32768), 0 }, + { { AOM_ICDF(128 * 196), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 198), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 208), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 224), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 245), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 } }, // bits_cdf #endif }, { @@ -93,6 +99,12 @@ static const nmv_context default_nmv_context = { { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 }, { AOM_ICDF(128 * 128), AOM_ICDF(32768), 0 }, { AOM_ICDF(216 * 128), AOM_ICDF(32768), 0 }, + { { AOM_ICDF(128 * 196), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 198), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 208), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 224), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 245), AOM_ICDF(32768), 0 }, + { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 } }, // bits_cdf #endif } }, }; diff --git a/av1/common/entropymv.h b/av1/common/entropymv.h index 3f2c152fdfeb6f9be87d75ff7155950d5b333ded..9ce089f7da52c4bb43045ef91a5e024acf044e10 100644 --- a/av1/common/entropymv.h +++ b/av1/common/entropymv.h @@ -66,6 +66,9 @@ typedef enum { #define CLASS0_BITS 1 /* bits at integer precision for class 0 */ #define CLASS0_SIZE (1 << CLASS0_BITS) #define MV_OFFSET_BITS (MV_CLASSES + CLASS0_BITS - 2) +#if CONFIG_NEW_MULTISYMBOL +#define MV_BITS_CONTEXTS 6 +#endif #define MV_FP_SIZE 4 #define MV_MAX_BITS (MV_CLASSES + CLASS0_BITS + 2) @@ -97,6 +100,7 @@ typedef struct { aom_cdf_prob class0_hp_cdf[CDF_SIZE(2)]; aom_cdf_prob hp_cdf[CDF_SIZE(2)]; aom_cdf_prob class0_cdf[CDF_SIZE(CLASS0_SIZE)]; + aom_cdf_prob bits_cdf[MV_BITS_CONTEXTS][CDF_SIZE(2)]; #endif } nmv_component; diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 8a28bf4b0340a3a6a84236a2eb51fd1d57bbd045..1ba779531ffee8db7148ea3c1b5b25f234764f79 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c @@ -5723,7 +5723,9 @@ void av1_decode_tg_tiles_and_wrapup(AV1Decoder *pbi, const uint8_t *data, if (!frame_is_intra_only(cm)) { av1_adapt_inter_frame_probs(cm); +#if !CONFIG_NEW_MULTISYMBOL av1_adapt_mv_probs(cm, cm->allow_high_precision_mv); +#endif av1_average_tile_inter_cdfs(&pbi->common, pbi->common.fc, tile_ctxs, cdf_ptrs, cm->tile_rows * cm->tile_cols); av1_average_tile_mv_cdfs(pbi->common.fc, tile_ctxs, cdf_ptrs, diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 2a279282c9953875318fc291b3efb6d8a6e0bdb2..4591cc9399ca172b1c51ff2a45a66455ab30e5e4 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c @@ -1274,9 +1274,13 @@ static int read_mv_component(aom_reader *r, nmv_component *mvcomp, } else { int i; const int n = mv_class + CLASS0_BITS - 1; // number of bits - d = 0; +#if CONFIG_NEW_MULTISYMBOL + for (i = 0; i < n; ++i) + d |= aom_read_symbol(r, mvcomp->bits_cdf[(i + 1) / 2], 2, ACCT_STR) << i; +#else for (i = 0; i < n; ++i) d |= aom_read(r, mvcomp->bits[i], ACCT_STR) << i; +#endif mag = CLASS0_SIZE << (mv_class + 2); } diff --git a/av1/encoder/encodemv.c b/av1/encoder/encodemv.c index da3d0d548d448e01b909e2db2bb5086132e287ce..f8a546999dc7b1ca3bac9460de1ad8e6b9f01aa1 100644 --- a/av1/encoder/encodemv.c +++ b/av1/encoder/encodemv.c @@ -62,9 +62,13 @@ static void encode_mv_component(aom_writer *w, int comp, nmv_component *mvcomp, } else { int i; const int n = mv_class + CLASS0_BITS - 1; // number of bits +#if CONFIG_NEW_MULTISYMBOL + for (i = 0; i < n; ++i) + aom_write_symbol(w, (d >> i) & 1, mvcomp->bits_cdf[(i + 1) / 2], 2); +#else for (i = 0; i < n; ++i) aom_write(w, (d >> i) & 1, mvcomp->bits[i]); +#endif } - // Fractional bits #if CONFIG_INTRABC || CONFIG_AMVR if (precision > MV_SUBPEL_NONE)