/src/mozilla-central/media/libopus/celt/entcode.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | # 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 | 0 | # define EC_UINT_BITS (8) |
54 | | |
55 | | /*The resolution of fractional-precision bit usage measurements, i.e., |
56 | | 3 => 1/8th bits.*/ |
57 | 0 | # 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 | 0 | static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ |
94 | 0 | return _this->offs; |
95 | 0 | } Unexecuted instantiation: celt.c:ec_range_bytes Unexecuted instantiation: celt_decoder.c:ec_range_bytes Unexecuted instantiation: celt_encoder.c:ec_range_bytes Unexecuted instantiation: celt_lpc_sse4_1.c:ec_range_bytes Unexecuted instantiation: pitch_sse.c:ec_range_bytes Unexecuted instantiation: pitch_sse2.c:ec_range_bytes Unexecuted instantiation: pitch_sse4_1.c:ec_range_bytes Unexecuted instantiation: vq_sse2.c:ec_range_bytes Unexecuted instantiation: x86_celt_map.c:ec_range_bytes Unexecuted instantiation: x86cpu.c:ec_range_bytes Unexecuted instantiation: NLSF2A.c:ec_range_bytes Unexecuted instantiation: NSQ_del_dec_sse4_1.c:ec_range_bytes Unexecuted instantiation: NSQ_sse4_1.c:ec_range_bytes Unexecuted instantiation: VAD_sse4_1.c:ec_range_bytes Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus0.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus1.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus2.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus3.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus4.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus5.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus6.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus7.c:ec_range_bytes Unexecuted instantiation: Unified_c_media_libopus8.c:ec_range_bytes |
96 | | |
97 | 0 | static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ |
98 | 0 | return _this->buf; |
99 | 0 | } Unexecuted instantiation: celt.c:ec_get_buffer Unexecuted instantiation: celt_decoder.c:ec_get_buffer Unexecuted instantiation: celt_encoder.c:ec_get_buffer Unexecuted instantiation: celt_lpc_sse4_1.c:ec_get_buffer Unexecuted instantiation: pitch_sse.c:ec_get_buffer Unexecuted instantiation: pitch_sse2.c:ec_get_buffer Unexecuted instantiation: pitch_sse4_1.c:ec_get_buffer Unexecuted instantiation: vq_sse2.c:ec_get_buffer Unexecuted instantiation: x86_celt_map.c:ec_get_buffer Unexecuted instantiation: x86cpu.c:ec_get_buffer Unexecuted instantiation: NLSF2A.c:ec_get_buffer Unexecuted instantiation: NSQ_del_dec_sse4_1.c:ec_get_buffer Unexecuted instantiation: NSQ_sse4_1.c:ec_get_buffer Unexecuted instantiation: VAD_sse4_1.c:ec_get_buffer Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus0.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus1.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus2.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus3.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus4.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus5.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus6.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus7.c:ec_get_buffer Unexecuted instantiation: Unified_c_media_libopus8.c:ec_get_buffer |
100 | | |
101 | 0 | static OPUS_INLINE int ec_get_error(ec_ctx *_this){ |
102 | 0 | return _this->error; |
103 | 0 | } Unexecuted instantiation: celt.c:ec_get_error Unexecuted instantiation: celt_decoder.c:ec_get_error Unexecuted instantiation: celt_encoder.c:ec_get_error Unexecuted instantiation: celt_lpc_sse4_1.c:ec_get_error Unexecuted instantiation: pitch_sse.c:ec_get_error Unexecuted instantiation: pitch_sse2.c:ec_get_error Unexecuted instantiation: pitch_sse4_1.c:ec_get_error Unexecuted instantiation: vq_sse2.c:ec_get_error Unexecuted instantiation: x86_celt_map.c:ec_get_error Unexecuted instantiation: x86cpu.c:ec_get_error Unexecuted instantiation: NLSF2A.c:ec_get_error Unexecuted instantiation: NSQ_del_dec_sse4_1.c:ec_get_error Unexecuted instantiation: NSQ_sse4_1.c:ec_get_error Unexecuted instantiation: VAD_sse4_1.c:ec_get_error Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus0.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus1.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus2.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus3.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus4.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus5.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus6.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus7.c:ec_get_error Unexecuted instantiation: Unified_c_media_libopus8.c:ec_get_error |
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 | 0 | static OPUS_INLINE int ec_tell(ec_ctx *_this){ |
112 | 0 | return _this->nbits_total-EC_ILOG(_this->rng); |
113 | 0 | } Unexecuted instantiation: celt.c:ec_tell Unexecuted instantiation: celt_decoder.c:ec_tell Unexecuted instantiation: celt_encoder.c:ec_tell Unexecuted instantiation: celt_lpc_sse4_1.c:ec_tell Unexecuted instantiation: pitch_sse.c:ec_tell Unexecuted instantiation: pitch_sse2.c:ec_tell Unexecuted instantiation: pitch_sse4_1.c:ec_tell Unexecuted instantiation: vq_sse2.c:ec_tell Unexecuted instantiation: x86_celt_map.c:ec_tell Unexecuted instantiation: x86cpu.c:ec_tell Unexecuted instantiation: NLSF2A.c:ec_tell Unexecuted instantiation: NSQ_del_dec_sse4_1.c:ec_tell Unexecuted instantiation: NSQ_sse4_1.c:ec_tell Unexecuted instantiation: VAD_sse4_1.c:ec_tell Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus0.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus1.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus2.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus3.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus4.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus5.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus6.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus7.c:ec_tell Unexecuted instantiation: Unified_c_media_libopus8.c:ec_tell |
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 | 0 | static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { |
125 | 0 | 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 | 0 | #endif |
138 | 0 | } Unexecuted instantiation: celt.c:celt_udiv Unexecuted instantiation: celt_decoder.c:celt_udiv Unexecuted instantiation: celt_encoder.c:celt_udiv Unexecuted instantiation: celt_lpc_sse4_1.c:celt_udiv Unexecuted instantiation: pitch_sse.c:celt_udiv Unexecuted instantiation: pitch_sse2.c:celt_udiv Unexecuted instantiation: pitch_sse4_1.c:celt_udiv Unexecuted instantiation: vq_sse2.c:celt_udiv Unexecuted instantiation: x86_celt_map.c:celt_udiv Unexecuted instantiation: x86cpu.c:celt_udiv Unexecuted instantiation: NLSF2A.c:celt_udiv Unexecuted instantiation: NSQ_del_dec_sse4_1.c:celt_udiv Unexecuted instantiation: NSQ_sse4_1.c:celt_udiv Unexecuted instantiation: VAD_sse4_1.c:celt_udiv Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus0.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus1.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus2.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus3.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus4.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus5.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus6.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus7.c:celt_udiv Unexecuted instantiation: Unified_c_media_libopus8.c:celt_udiv |
139 | | |
140 | 0 | static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { |
141 | 0 | 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 | 0 | #endif |
150 | 0 | } Unexecuted instantiation: celt.c:celt_sudiv Unexecuted instantiation: celt_decoder.c:celt_sudiv Unexecuted instantiation: celt_encoder.c:celt_sudiv Unexecuted instantiation: celt_lpc_sse4_1.c:celt_sudiv Unexecuted instantiation: pitch_sse.c:celt_sudiv Unexecuted instantiation: pitch_sse2.c:celt_sudiv Unexecuted instantiation: pitch_sse4_1.c:celt_sudiv Unexecuted instantiation: vq_sse2.c:celt_sudiv Unexecuted instantiation: x86_celt_map.c:celt_sudiv Unexecuted instantiation: x86cpu.c:celt_sudiv Unexecuted instantiation: NLSF2A.c:celt_sudiv Unexecuted instantiation: NSQ_del_dec_sse4_1.c:celt_sudiv Unexecuted instantiation: NSQ_sse4_1.c:celt_sudiv Unexecuted instantiation: VAD_sse4_1.c:celt_sudiv Unexecuted instantiation: VQ_WMat_EC_sse4_1.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus0.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus1.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus2.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus3.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus4.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus5.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus6.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus7.c:celt_sudiv Unexecuted instantiation: Unified_c_media_libopus8.c:celt_sudiv |
151 | | |
152 | | #endif |