diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2016-05-03 19:14:24 +0200 |
---|---|---|
committer | Rémi Verschelde <remi@verschelde.fr> | 2016-05-03 19:14:24 +0200 |
commit | c90bc695447b5d74227ed7c0d0bc19b7141dc835 (patch) | |
tree | 808af09d82e51698b9b7ba18795ba3a210a1d8f0 /drivers/opus/celt/entcode.h | |
parent | 4e23ba5f37e21021c47e3aecf544afc9485e311b (diff) | |
parent | 7c59d819a7ebb936d51ca032e66a2489e4080d08 (diff) |
Merge pull request #4532 from vnen/pr-update-opus-1.1.2
Update Opus driver to 1.1.2
Diffstat (limited to 'drivers/opus/celt/entcode.h')
-rw-r--r-- | drivers/opus/celt/entcode.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/opus/celt/entcode.h b/drivers/opus/celt/entcode.h index c129f9b7d9..4d736d4dca 100644 --- a/drivers/opus/celt/entcode.h +++ b/drivers/opus/celt/entcode.h @@ -34,6 +34,12 @@ # include <stddef.h> # include "opus/celt/ecintrin.h" +extern const opus_uint32 SMALL_DIV_TABLE[129]; + +#ifdef OPUS_ARM_ASM +#define USE_SMALL_DIV_TABLE +#endif + /*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a larger type, you can speed up the decoder by using it here.*/ typedef opus_uint32 ec_window; @@ -114,4 +120,33 @@ static OPUS_INLINE int ec_tell(ec_ctx *_this){ rounding error is in the positive direction).*/ opus_uint32 ec_tell_frac(ec_ctx *_this); +/* Tested exhaustively for all n and for 1<=d<=256 */ +static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { + celt_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (d>256) + return n/d; + else { + opus_uint32 t, q; + t = EC_ILOG(d&-d); + q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; + return q+(n-q*d >= d); + } +#else + return n/d; +#endif +} + +static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { + celt_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (n<0) + return -(opus_int32)celt_udiv(-n, d); + else + return celt_udiv(n, d); +#else + return n/d; +#endif +} + #endif |