daala_ec: Convert the decoder to use iCDFs This only changes the internal coding engine. We convert CDFs into iCDFs at the "bool" reader <-> daala_ec boundary. Decoder output should not change. Change-Id: I483dfe3e5588d2038c3c7ec4cd5ba62d6699b920
diff --git a/aom_dsp/daalaboolreader.h b/aom_dsp/daalaboolreader.h index c8271cd..29eae48 100644 --- a/aom_dsp/daalaboolreader.h +++ b/aom_dsp/daalaboolreader.h
@@ -57,7 +57,7 @@ }*/ #endif - bit = od_ec_decode_bool_q15(&r->ec, p); + bit = od_ec_decode_bool_q15(&r->ec, OD_ICDF(p)); #if CONFIG_BITSTREAM_DEBUG { @@ -108,7 +108,17 @@ static INLINE int daala_read_symbol(daala_reader *r, const aom_cdf_prob *cdf, int nsymbs) { - int symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs); + int symb; +#if CONFIG_EC_SMALLMUL + { + aom_cdf_prob icdf[16]; + int i; + for (i = 0; i < nsymbs; i++) icdf[i] = OD_ICDF(cdf[i]); + symb = od_ec_decode_cdf_q15(&r->ec, icdf, nsymbs); + } +#else + symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs); +#endif #if CONFIG_BITSTREAM_DEBUG {
diff --git a/aom_dsp/entdec.c b/aom_dsp/entdec.c index c539359..49b176c 100644 --- a/aom_dsp/entdec.c +++ b/aom_dsp/entdec.c
@@ -148,24 +148,25 @@ od_ec_dec_refill(dec); } -/*Decode a bit that has an fz probability of being a zero in Q15. - fz: The probability that the bit is zero, scaled by 32768. +/*Decode a single binary value. + {EC_SMALLMUL} f: The probability that the bit is one, scaled by 32768. + {else} f: The probability that the bit is zero, scaled by 32768. Return: The value decoded (0 or 1).*/ -int od_ec_decode_bool_q15(od_ec_dec *dec, unsigned fz) { +int od_ec_decode_bool_q15(od_ec_dec *dec, unsigned f) { od_ec_window dif; od_ec_window vw; unsigned r; unsigned r_new; unsigned v; int ret; - OD_ASSERT(0 < fz); - OD_ASSERT(fz < 32768U); + OD_ASSERT(0 < f); + OD_ASSERT(f < 32768U); dif = dec->dif; r = dec->rng; OD_ASSERT(dif >> (OD_EC_WINDOW_SIZE - 16) < r); OD_ASSERT(32768U <= r); #if CONFIG_EC_SMALLMUL - v = (r >> 8) * (uint32_t)(32768U - fz) >> 7; + v = (r >> 8) * (uint32_t)f >> 7; vw = (od_ec_window)v << (OD_EC_WINDOW_SIZE - 16); ret = 1; r_new = v; @@ -175,7 +176,7 @@ ret = 0; } #else - v = fz * (uint32_t)r >> 15; + v = f * (uint32_t)r >> 15; vw = (od_ec_window)v << (OD_EC_WINDOW_SIZE - 16); ret = 0; r_new = v; @@ -193,6 +194,7 @@ [s > 0 ? cdf[s - 1] : 0, cdf[s]). The values must be monotonically non-increasing, and cdf[nsyms - 1] must be 32768. + {EC_SMALLMUL}: The CDF contains 32768 minus those values. nsyms: The number of symbols in the alphabet. This should be at most 16. Return: The decoded symbol s.*/ @@ -207,7 +209,7 @@ dif = dec->dif; r = dec->rng; OD_ASSERT(dif >> (OD_EC_WINDOW_SIZE - 16) < r); - OD_ASSERT(cdf[nsyms - 1] == 32768U); + OD_ASSERT(cdf[nsyms - 1] == OD_ICDF(32768U)); OD_ASSERT(32768U <= r); #if CONFIG_EC_SMALLMUL c = (unsigned)(dif >> (OD_EC_WINDOW_SIZE - 16)); @@ -215,7 +217,7 @@ ret = -1; do { u = v; - v = (r >> 8) * (uint32_t)(32768U - cdf[++ret]) >> 7; + v = (r >> 8) * (uint32_t)cdf[++ret] >> 7; } while (c < v); OD_ASSERT(v < u); OD_ASSERT(u <= r);
diff --git a/aom_dsp/entdec.h b/aom_dsp/entdec.h index 9bab964..e1145e8 100644 --- a/aom_dsp/entdec.h +++ b/aom_dsp/entdec.h
@@ -70,7 +70,7 @@ void od_ec_dec_init(od_ec_dec *dec, const unsigned char *buf, uint32_t storage) OD_ARG_NONNULL(1) OD_ARG_NONNULL(2); -OD_WARN_UNUSED_RESULT int od_ec_decode_bool_q15(od_ec_dec *dec, unsigned fz) +OD_WARN_UNUSED_RESULT int od_ec_decode_bool_q15(od_ec_dec *dec, unsigned f) OD_ARG_NONNULL(1); OD_WARN_UNUSED_RESULT int od_ec_decode_cdf_q15(od_ec_dec *dec, const uint16_t *cdf, int nsyms)