Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/celt/entcode.h @ 69:7aeed7906520
Add Opus sources and macOS builds
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:85d5306e114e | 69:7aeed7906520 |
---|---|
1 /* Copyright (c) 2001-2011 Timothy B. Terriberry | |
2 Copyright (c) 2008-2009 Xiph.Org Foundation */ | |
3 /* | |
4 Redistribution and use in source and binary forms, with or without | |
5 modification, are permitted provided that the following conditions | |
6 are met: | |
7 | |
8 - Redistributions of source code must retain the above copyright | |
9 notice, this list of conditions and the following disclaimer. | |
10 | |
11 - Redistributions in binary form must reproduce the above copyright | |
12 notice, this list of conditions and the following disclaimer in the | |
13 documentation and/or other materials provided with the distribution. | |
14 | |
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | |
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 #include "opus_types.h" | |
29 #include "opus_defines.h" | |
30 | |
31 #if !defined(_entcode_H) | |
32 # define _entcode_H (1) | |
33 # include <limits.h> | |
34 # include <stddef.h> | |
35 # include "ecintrin.h" | |
36 | |
37 extern const opus_uint32 SMALL_DIV_TABLE[129]; | |
38 | |
39 #ifdef OPUS_ARM_ASM | |
40 #define USE_SMALL_DIV_TABLE | |
41 #endif | |
42 | |
43 /*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a | |
44 larger type, you can speed up the decoder by using it here.*/ | |
45 typedef opus_uint32 ec_window; | |
46 typedef struct ec_ctx ec_ctx; | |
47 typedef struct ec_ctx ec_enc; | |
48 typedef struct ec_ctx ec_dec; | |
49 | |
50 # define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT) | |
51 | |
52 /*The number of bits to use for the range-coded part of unsigned integers.*/ | |
53 # define EC_UINT_BITS (8) | |
54 | |
55 /*The resolution of fractional-precision bit usage measurements, i.e., | |
56 3 => 1/8th bits.*/ | |
57 # define BITRES 3 | |
58 | |
59 /*The entropy encoder/decoder context. | |
60 We use the same structure for both, so that common functions like ec_tell() | |
61 can be used on either one.*/ | |
62 struct ec_ctx{ | |
63 /*Buffered input/output.*/ | |
64 unsigned char *buf; | |
65 /*The size of the buffer.*/ | |
66 opus_uint32 storage; | |
67 /*The offset at which the last byte containing raw bits was read/written.*/ | |
68 opus_uint32 end_offs; | |
69 /*Bits that will be read from/written at the end.*/ | |
70 ec_window end_window; | |
71 /*Number of valid bits in end_window.*/ | |
72 int nend_bits; | |
73 /*The total number of whole bits read/written. | |
74 This does not include partial bits currently in the range coder.*/ | |
75 int nbits_total; | |
76 /*The offset at which the next range coder byte will be read/written.*/ | |
77 opus_uint32 offs; | |
78 /*The number of values in the current range.*/ | |
79 opus_uint32 rng; | |
80 /*In the decoder: the difference between the top of the current range and | |
81 the input value, minus one. | |
82 In the encoder: the low end of the current range.*/ | |
83 opus_uint32 val; | |
84 /*In the decoder: the saved normalization factor from ec_decode(). | |
85 In the encoder: the number of oustanding carry propagating symbols.*/ | |
86 opus_uint32 ext; | |
87 /*A buffered input/output symbol, awaiting carry propagation.*/ | |
88 int rem; | |
89 /*Nonzero if an error occurred.*/ | |
90 int error; | |
91 }; | |
92 | |
93 static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ | |
94 return _this->offs; | |
95 } | |
96 | |
97 static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ | |
98 return _this->buf; | |
99 } | |
100 | |
101 static OPUS_INLINE int ec_get_error(ec_ctx *_this){ | |
102 return _this->error; | |
103 } | |
104 | |
105 /*Returns the number of bits "used" by the encoded or decoded symbols so far. | |
106 This same number can be computed in either the encoder or the decoder, and is | |
107 suitable for making coding decisions. | |
108 Return: The number of bits. | |
109 This will always be slightly larger than the exact value (e.g., all | |
110 rounding error is in the positive direction).*/ | |
111 static OPUS_INLINE int ec_tell(ec_ctx *_this){ | |
112 return _this->nbits_total-EC_ILOG(_this->rng); | |
113 } | |
114 | |
115 /*Returns the number of bits "used" by the encoded or decoded symbols so far. | |
116 This same number can be computed in either the encoder or the decoder, and is | |
117 suitable for making coding decisions. | |
118 Return: The number of bits scaled by 2**BITRES. | |
119 This will always be slightly larger than the exact value (e.g., all | |
120 rounding error is in the positive direction).*/ | |
121 opus_uint32 ec_tell_frac(ec_ctx *_this); | |
122 | |
123 /* Tested exhaustively for all n and for 1<=d<=256 */ | |
124 static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { | |
125 celt_sig_assert(d>0); | |
126 #ifdef USE_SMALL_DIV_TABLE | |
127 if (d>256) | |
128 return n/d; | |
129 else { | |
130 opus_uint32 t, q; | |
131 t = EC_ILOG(d&-d); | |
132 q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; | |
133 return q+(n-q*d >= d); | |
134 } | |
135 #else | |
136 return n/d; | |
137 #endif | |
138 } | |
139 | |
140 static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { | |
141 celt_sig_assert(d>0); | |
142 #ifdef USE_SMALL_DIV_TABLE | |
143 if (n<0) | |
144 return -(opus_int32)celt_udiv(-n, d); | |
145 else | |
146 return celt_udiv(n, d); | |
147 #else | |
148 return n/d; | |
149 #endif | |
150 } | |
151 | |
152 #endif |