summaryrefslogtreecommitdiff
path: root/drivers/opus/celt/entcode.h
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2016-05-03 19:14:24 +0200
committerRémi Verschelde <remi@verschelde.fr>2016-05-03 19:14:24 +0200
commitc90bc695447b5d74227ed7c0d0bc19b7141dc835 (patch)
tree808af09d82e51698b9b7ba18795ba3a210a1d8f0 /drivers/opus/celt/entcode.h
parent4e23ba5f37e21021c47e3aecf544afc9485e311b (diff)
parent7c59d819a7ebb936d51ca032e66a2489e4080d08 (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.h35
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