annotate src/flac/libflac/float.c @ 925:3673bbab7372 trunk

[svn] - make madplug ignore crc error. closes #884.
author yaz
date Mon, 09 Apr 2007 03:51:00 -0700
parents 454ad11020ec
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
715
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1 /* libFLAC - Free Lossless Audio Codec library
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
2 * Copyright (C) 2004,2005,2006,2007 Josh Coalson
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
3 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
4 * Redistribution and use in source and binary forms, with or without
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
5 * modification, are permitted provided that the following conditions
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
6 * are met:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
7 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
8 * - Redistributions of source code must retain the above copyright
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
10 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
11 * - Redistributions in binary form must reproduce the above copyright
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
14 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
15 * - Neither the name of the Xiph.org Foundation nor the names of its
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
16 * contributors may be used to endorse or promote products derived from
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
17 * this software without specific prior written permission.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
18 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
30 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
31
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
32 #if HAVE_CONFIG_H
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
33 # include <config.h>
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
34 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
35
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
36 #include "FLAC/assert.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
37
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
38 #include "private/float.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
39
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
40 #ifdef FLAC__INTEGER_ONLY_LIBRARY
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
41
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
42 /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
43 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
44 #define FLAC__U64L(x) x
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
45 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
46 #define FLAC__U64L(x) x##LLU
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
47 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
48
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
49 const FLAC__fixedpoint FLAC__FP_ZERO = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
50 const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
51 const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
52 const FLAC__fixedpoint FLAC__FP_LN2 = 45426;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
53 const FLAC__fixedpoint FLAC__FP_E = 178145;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
54
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
55 /* Lookup tables for Knuth's logarithm algorithm */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
56 #define LOG2_LOOKUP_PRECISION 16
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
57 static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
58 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
59 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
60 * 0 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
61 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
62 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
63 /* lg(2/1) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
64 /* lg(4/3) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
65 /* lg(8/7) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
66 /* lg(16/15) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
67 /* lg(32/31) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
68 /* lg(64/63) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
69 /* lg(128/127) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
70 /* lg(256/255) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
71 /* lg(512/511) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
72 /* lg(1024/1023) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
73 /* lg(2048/2047) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
74 /* lg(4096/4095) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
75 /* lg(8192/8191) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
76 /* lg(16384/16383) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
77 /* lg(32768/32767) = */ 0x00000000
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
78 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
79 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
80 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
81 * 4 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
82 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
83 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
84 /* lg(2/1) = */ 0x00000010,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
85 /* lg(4/3) = */ 0x00000007,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
86 /* lg(8/7) = */ 0x00000003,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
87 /* lg(16/15) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
88 /* lg(32/31) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
89 /* lg(64/63) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
90 /* lg(128/127) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
91 /* lg(256/255) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
92 /* lg(512/511) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
93 /* lg(1024/1023) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
94 /* lg(2048/2047) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
95 /* lg(4096/4095) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
96 /* lg(8192/8191) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
97 /* lg(16384/16383) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
98 /* lg(32768/32767) = */ 0x00000000
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
99 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
100 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
101 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
102 * 8 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
103 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
104 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
105 /* lg(2/1) = */ 0x00000100,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
106 /* lg(4/3) = */ 0x0000006a,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
107 /* lg(8/7) = */ 0x00000031,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
108 /* lg(16/15) = */ 0x00000018,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
109 /* lg(32/31) = */ 0x0000000c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
110 /* lg(64/63) = */ 0x00000006,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
111 /* lg(128/127) = */ 0x00000003,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
112 /* lg(256/255) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
113 /* lg(512/511) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
114 /* lg(1024/1023) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
115 /* lg(2048/2047) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
116 /* lg(4096/4095) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
117 /* lg(8192/8191) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
118 /* lg(16384/16383) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
119 /* lg(32768/32767) = */ 0x00000000
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
120 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
121 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
122 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
123 * 12 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
124 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
125 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
126 /* lg(2/1) = */ 0x00001000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
127 /* lg(4/3) = */ 0x000006a4,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
128 /* lg(8/7) = */ 0x00000315,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
129 /* lg(16/15) = */ 0x0000017d,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
130 /* lg(32/31) = */ 0x000000bc,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
131 /* lg(64/63) = */ 0x0000005d,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
132 /* lg(128/127) = */ 0x0000002e,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
133 /* lg(256/255) = */ 0x00000017,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
134 /* lg(512/511) = */ 0x0000000c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
135 /* lg(1024/1023) = */ 0x00000006,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
136 /* lg(2048/2047) = */ 0x00000003,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
137 /* lg(4096/4095) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
138 /* lg(8192/8191) = */ 0x00000001,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
139 /* lg(16384/16383) = */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
140 /* lg(32768/32767) = */ 0x00000000
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
141 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
142 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
143 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
144 * 16 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
145 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
146 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
147 /* lg(2/1) = */ 0x00010000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
148 /* lg(4/3) = */ 0x00006a40,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
149 /* lg(8/7) = */ 0x00003151,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
150 /* lg(16/15) = */ 0x000017d6,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
151 /* lg(32/31) = */ 0x00000bba,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
152 /* lg(64/63) = */ 0x000005d1,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
153 /* lg(128/127) = */ 0x000002e6,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
154 /* lg(256/255) = */ 0x00000172,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
155 /* lg(512/511) = */ 0x000000b9,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
156 /* lg(1024/1023) = */ 0x0000005c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
157 /* lg(2048/2047) = */ 0x0000002e,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
158 /* lg(4096/4095) = */ 0x00000017,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
159 /* lg(8192/8191) = */ 0x0000000c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
160 /* lg(16384/16383) = */ 0x00000006,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
161 /* lg(32768/32767) = */ 0x00000003
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
162 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
163 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
164 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
165 * 20 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
166 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
167 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
168 /* lg(2/1) = */ 0x00100000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
169 /* lg(4/3) = */ 0x0006a3fe,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
170 /* lg(8/7) = */ 0x00031513,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
171 /* lg(16/15) = */ 0x00017d60,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
172 /* lg(32/31) = */ 0x0000bb9d,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
173 /* lg(64/63) = */ 0x00005d10,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
174 /* lg(128/127) = */ 0x00002e59,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
175 /* lg(256/255) = */ 0x00001721,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
176 /* lg(512/511) = */ 0x00000b8e,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
177 /* lg(1024/1023) = */ 0x000005c6,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
178 /* lg(2048/2047) = */ 0x000002e3,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
179 /* lg(4096/4095) = */ 0x00000171,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
180 /* lg(8192/8191) = */ 0x000000b9,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
181 /* lg(16384/16383) = */ 0x0000005c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
182 /* lg(32768/32767) = */ 0x0000002e
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
183 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
184 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
185 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
186 * 24 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
187 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
188 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
189 /* lg(2/1) = */ 0x01000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
190 /* lg(4/3) = */ 0x006a3fe6,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
191 /* lg(8/7) = */ 0x00315130,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
192 /* lg(16/15) = */ 0x0017d605,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
193 /* lg(32/31) = */ 0x000bb9ca,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
194 /* lg(64/63) = */ 0x0005d0fc,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
195 /* lg(128/127) = */ 0x0002e58f,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
196 /* lg(256/255) = */ 0x0001720e,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
197 /* lg(512/511) = */ 0x0000b8d8,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
198 /* lg(1024/1023) = */ 0x00005c61,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
199 /* lg(2048/2047) = */ 0x00002e2d,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
200 /* lg(4096/4095) = */ 0x00001716,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
201 /* lg(8192/8191) = */ 0x00000b8b,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
202 /* lg(16384/16383) = */ 0x000005c5,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
203 /* lg(32768/32767) = */ 0x000002e3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
204 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
205 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
206 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
207 * 28 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
208 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
209 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
210 /* lg(2/1) = */ 0x10000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
211 /* lg(4/3) = */ 0x06a3fe5c,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
212 /* lg(8/7) = */ 0x03151301,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
213 /* lg(16/15) = */ 0x017d6049,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
214 /* lg(32/31) = */ 0x00bb9ca6,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
215 /* lg(64/63) = */ 0x005d0fba,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
216 /* lg(128/127) = */ 0x002e58f7,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
217 /* lg(256/255) = */ 0x001720da,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
218 /* lg(512/511) = */ 0x000b8d87,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
219 /* lg(1024/1023) = */ 0x0005c60b,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
220 /* lg(2048/2047) = */ 0x0002e2d7,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
221 /* lg(4096/4095) = */ 0x00017160,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
222 /* lg(8192/8191) = */ 0x0000b8ad,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
223 /* lg(16384/16383) = */ 0x00005c56,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
224 /* lg(32768/32767) = */ 0x00002e2b
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
225 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
226 };
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
227
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
228 #if 0
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
229 static const FLAC__uint64 log2_lookup_wide[] = {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
230 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
231 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
232 * 32 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
233 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
234 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
235 /* lg(2/1) = */ FLAC__U64L(0x100000000),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
236 /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
237 /* lg(8/7) = */ FLAC__U64L(0x31513015),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
238 /* lg(16/15) = */ FLAC__U64L(0x17d60497),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
239 /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
240 /* lg(64/63) = */ FLAC__U64L(0x05d0fba2),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
241 /* lg(128/127) = */ FLAC__U64L(0x02e58f74),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
242 /* lg(256/255) = */ FLAC__U64L(0x01720d9c),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
243 /* lg(512/511) = */ FLAC__U64L(0x00b8d875),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
244 /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
245 /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
246 /* lg(4096/4095) = */ FLAC__U64L(0x00171600),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
247 /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
248 /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
249 /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
250 },
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
251 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
252 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
253 * 48 fraction bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
254 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
255 /* undefined */ 0x00000000,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
256 /* lg(2/1) = */ FLAC__U64L(0x1000000000000),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
257 /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
258 /* lg(8/7) = */ FLAC__U64L(0x315130157f7a),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
259 /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
260 /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
261 /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
262 /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
263 /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
264 /* lg(512/511) = */ FLAC__U64L(0xb8d8752173),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
265 /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
266 /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
267 /* lg(4096/4095) = */ FLAC__U64L(0x1716001719),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
268 /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
269 /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d),
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
270 /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
271 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
272 };
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
273 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
274
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
275 FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
276 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
277 const FLAC__uint32 ONE = (1u << fracbits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
278 const FLAC__uint32 *table = log2_lookup[fracbits >> 2];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
279
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
280 FLAC__ASSERT(fracbits < 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
281 FLAC__ASSERT((fracbits & 0x3) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
282
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
283 if(x < ONE)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
284 return 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
285
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
286 if(precision > LOG2_LOOKUP_PRECISION)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
287 precision = LOG2_LOOKUP_PRECISION;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
288
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
289 /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
290 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
291 FLAC__uint32 y = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
292 FLAC__uint32 z = x >> 1, k = 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
293 while (x > ONE && k < precision) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
294 if (x - z >= ONE) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
295 x -= z;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
296 z = x >> k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
297 y += table[k];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
298 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
299 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
300 z >>= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
301 k++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
302 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
303 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
304 return y;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
305 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
306 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
307
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
308 #endif /* defined FLAC__INTEGER_ONLY_LIBRARY */