[lv_map_multi] simplify update_cdf remove tmp0 in update_cdf due to the use of EC_MIN_PROB introduced by Thomas Davies. further changes to update_cdf include: 1. Start the rate at 3+get_msb(nsymbs) and increase the rate by one at counts 16 and 32. 2. Check if tmp is less than cdf[i] to avoid shifting a negative number. Change-Id: I5088ebd450d6e57ec6c3e92bb2f47a078489b947
diff --git a/aom_dsp/prob.h b/aom_dsp/prob.h index fc732a5..f355f09 100644 --- a/aom_dsp/prob.h +++ b/aom_dsp/prob.h
@@ -13,6 +13,7 @@ #define AOM_DSP_PROB_H_ #include <assert.h> +#include <stdio.h> #include "./aom_config.h" #include "./aom_dsp_common.h" @@ -221,10 +222,33 @@ const int rate2 = 5; int i, tmp; int diff; + #if 1 +#if CONFIG_LV_MAP_MULTI + rate = 3 + (cdf[nsymbs] > 15) + (cdf[nsymbs] > 31) + get_msb(nsymbs); + tmp = AOM_ICDF(0); + (void)rate2; + (void)diff; + + // Single loop (faster) + for (i = 0; i < nsymbs - 1; ++i) { + tmp = (i == val) ? 0 : tmp; +#if 1 + if (tmp < cdf[i]) { + cdf[i] -= ((cdf[i] - tmp) >> rate); + } else { + cdf[i] += ((tmp - cdf[i]) >> rate); + } +#else + cdf[i] += ((tmp - cdf[i]) >> rate); +#endif + } + +#else const int tmp0 = 1 << rate2; tmp = AOM_ICDF(tmp0); diff = ((CDF_PROB_TOP - (nsymbs << rate2)) >> rate) << rate; + // Single loop (faster) #if !CONFIG_ANS for (i = 0; i < nsymbs - 1; ++i, tmp -= tmp0) { @@ -237,6 +261,9 @@ cdf[i] -= ((cdf[i] - tmp) >> rate); } #endif + +#endif + #else for (i = 0; i < nsymbs; ++i) { tmp = (i + 1) << rate2;
diff --git a/av1/encoder/cost.c b/av1/encoder/cost.c index 240a16c..a983105 100644 --- a/av1/encoder/cost.c +++ b/av1/encoder/cost.c
@@ -71,7 +71,12 @@ int i; aom_cdf_prob prev_cdf = 0; for (i = 0;; ++i) { +#if CONFIG_LV_MAP_MULTI aom_cdf_prob p15 = AOM_ICDF(cdf[i]) - prev_cdf; + p15 = (p15 < EC_MIN_PROB) ? EC_MIN_PROB : p15; +#else + aom_cdf_prob p15 = AOM_ICDF(cdf[i]) - prev_cdf; +#endif prev_cdf = AOM_ICDF(cdf[i]); if (inv_map)