annotate src/flac/libflac/bitmath.c @ 997:e46b98155d5d trunk

[svn] - fix a bug which counts number of frames twice in handling xing header. - now fileinfo dialog calculates play length even though TLEN tag exists so that it can overwrite wrong TLEN tag.
author yaz
date Tue, 01 May 2007 12:49:27 -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) 2001,2002,2003,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 "private/bitmath.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
37 #include "FLAC/assert.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
38
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
39 /* An example of what FLAC__bitmath_ilog2() computes:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
40 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
41 * ilog2( 0) = assertion failure
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
42 * ilog2( 1) = 0
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
43 * ilog2( 2) = 1
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
44 * ilog2( 3) = 1
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
45 * ilog2( 4) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
46 * ilog2( 5) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
47 * ilog2( 6) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
48 * ilog2( 7) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
49 * ilog2( 8) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
50 * ilog2( 9) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
51 * ilog2(10) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
52 * ilog2(11) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
53 * ilog2(12) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
54 * ilog2(13) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
55 * ilog2(14) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
56 * ilog2(15) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
57 * ilog2(16) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
58 * ilog2(17) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
59 * ilog2(18) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
60 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
61 unsigned FLAC__bitmath_ilog2(FLAC__uint32 v)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
62 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
63 unsigned l = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
64 FLAC__ASSERT(v > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
65 while(v >>= 1)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
66 l++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
67 return l;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
68 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
69
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
70 unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
71 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
72 unsigned l = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
73 FLAC__ASSERT(v > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
74 while(v >>= 1)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
75 l++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
76 return l;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
77 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
78
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
79 /* An example of what FLAC__bitmath_silog2() computes:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
80 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
81 * silog2(-10) = 5
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
82 * silog2(- 9) = 5
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
83 * silog2(- 8) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
84 * silog2(- 7) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
85 * silog2(- 6) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
86 * silog2(- 5) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
87 * silog2(- 4) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
88 * silog2(- 3) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
89 * silog2(- 2) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
90 * silog2(- 1) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
91 * silog2( 0) = 0
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
92 * silog2( 1) = 2
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
93 * silog2( 2) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
94 * silog2( 3) = 3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
95 * silog2( 4) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
96 * silog2( 5) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
97 * silog2( 6) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
98 * silog2( 7) = 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
99 * silog2( 8) = 5
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
100 * silog2( 9) = 5
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
101 * silog2( 10) = 5
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
102 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
103 unsigned FLAC__bitmath_silog2(int v)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
104 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
105 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
106 if(v == 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
107 return 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
108 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
109 else if(v > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
110 unsigned l = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
111 while(v) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
112 l++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
113 v >>= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
114 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
115 return l+1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
116 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
117 else if(v == -1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
118 return 2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
119 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
120 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
121 v++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
122 v = -v;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
123 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
124 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
125 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
126
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
127 unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
128 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
129 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
130 if(v == 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
131 return 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
132 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
133 else if(v > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
134 unsigned l = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
135 while(v) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
136 l++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
137 v >>= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
138 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
139 return l+1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
140 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
141 else if(v == -1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
142 return 2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
143 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
144 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
145 v++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
146 v = -v;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
147 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
148 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
149 }