annotate src/flac/libflac/bitreader.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) 2000,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 <stdlib.h> /* for malloc() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
37 #include <string.h> /* for memcpy(), memset() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
38 #if defined(_MSC_VER) && _MSC_VER <= 1200
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
39 #include <winsock.h> /* for ntohl() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
40 #elif defined FLAC__SYS_DARWIN
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
41 #include <machine/endian.h> /* for ntohl() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
42 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
43 #include <netinet/in.h> /* for ntohl() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
44 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
45 #include "private/bitmath.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
46 #include "private/bitreader.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
47 #include "private/crc.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
48 #include "FLAC/assert.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
49
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
50 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
51 * Along the way you will see two versions of some functions, selected
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
52 * by a FLAC__NO_MANUAL_INLINING macro. One is the simplified, more
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
53 * readable, and slow version, and the other is the same function
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
54 * where crucial parts have been manually inlined and are much faster.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
55 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
56 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
57
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
58 /* Things should be fastest when this matches the machine word size */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
59 /* WATCHOUT: if you change this you must also change the following #defines down to ALIGNED_UNARY_BITS below to match */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
60 /* WATCHOUT: there are a few places where the code will not work unless brword is >= 32 bits wide */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
61 /* also, some sections currently only have fast versions for 4 or 8 bytes per word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
62 typedef FLAC__uint32 brword;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
63 #define FLAC__BYTES_PER_WORD 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
64 #define FLAC__BITS_PER_WORD 32
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
65 #define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
66 #define FLAC__WORD_TOP_BIT_ONE ((FLAC__uint32)0x80000000)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
67 /* SWAP_BE_WORD_TO_HOST swaps bytes in a brword (which is always big-endian) if necessary to match host byte order */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
68 #if WORDS_BIGENDIAN
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
69 #define SWAP_BE_WORD_TO_HOST(x) (x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
70 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
71 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
72 #define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
73 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
74 #define SWAP_BE_WORD_TO_HOST(x) ntohl(x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
75 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
76 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
77 /* counts the # of zero MSBs in a word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
78 #define ALIGNED_UNARY_BITS(word) ( \
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
79 (word) <= 0xffff ? \
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
80 ( (word) <= 0xff? byte_to_unary_table[word] + 24 : byte_to_unary_table[(word) >> 8] + 16 ) : \
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
81 ( (word) <= 0xffffff? byte_to_unary_table[word >> 16] + 8 : byte_to_unary_table[(word) >> 24] ) \
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
82 )
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
83 /* this alternate might be slightly faster on some systems/compilers: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
84 #define ALIGNED_UNARY_BITS2(word) ( (word) <= 0xff ? byte_to_unary_table[word] + 24 : ((word) <= 0xffff ? byte_to_unary_table[(word) >> 8] + 16 : ((word) <= 0xffffff ? byte_to_unary_table[(word) >> 16] + 8 : byte_to_unary_table[(word) >> 24])) )
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
85
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
86
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
87 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
88 * This should be at least twice as large as the largest number of words
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
89 * required to represent any 'number' (in any encoding) you are going to
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
90 * read. With FLAC this is on the order of maybe a few hundred bits.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
91 * If the buffer is smaller than that, the decoder won't be able to read
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
92 * in a whole number that is in a variable length encoding (e.g. Rice).
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
93 * But to be practical it should be at least 1K bytes.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
94 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
95 * Increase this number to decrease the number of read callbacks, at the
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
96 * expense of using more memory. Or decrease for the reverse effect,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
97 * keeping in mind the limit from the first paragraph. The optimal size
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
98 * also depends on the CPU cache size and other factors; some twiddling
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
99 * may be necessary to squeeze out the best performance.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
100 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
101 static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
102
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
103 static const unsigned char byte_to_unary_table[] = {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
104 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
106 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
107 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
108 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
109 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
110 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
111 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
119 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
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 #ifdef min
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
123 #undef min
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
124 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
125 #define min(x,y) ((x)<(y)?(x):(y))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
126 #ifdef max
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
127 #undef max
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
128 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
129 #define max(x,y) ((x)>(y)?(x):(y))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
130
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
131 /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
132 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
133 #define FLAC__U64L(x) x
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
134 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
135 #define FLAC__U64L(x) x##LLU
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
136 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
137
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
138 #ifndef FLaC__INLINE
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
139 #define FLaC__INLINE
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
140 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
141
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
142 struct FLAC__BitReader {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
143 /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
144 /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
145 brword *buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
146 unsigned capacity; /* in words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
147 unsigned words; /* # of completed words in buffer */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
148 unsigned bytes; /* # of bytes in incomplete word at buffer[words] */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
149 unsigned consumed_words, consumed_bits; /* #words+(#bits of head word) already consumed from the front of buffer */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
150 unsigned read_crc16; /* the running frame CRC */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
151 unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
152 FLAC__BitReaderReadCallback read_callback;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
153 void *client_data;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
154 };
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
155
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
156 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
157 /* OPT: an MSVC built-in would be better */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
158 static _inline FLAC__uint32 local_swap32_(FLAC__uint32 x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
159 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
160 x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
161 return (x>>16) | (x<<16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
162 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
163 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
164
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
165 static FLaC__INLINE void crc16_update_word_(FLAC__BitReader *br, brword word)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
166 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
167 register unsigned crc = br->read_crc16;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
168 #if FLAC__BYTES_PER_WORD == 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
169 switch(br->crc16_align) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
170 case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
171 case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
172 case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
173 case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
174 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
175 #elif FLAC__BYTES_PER_WORD == 8
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
176 switch(br->crc16_align) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
177 case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
178 case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
179 case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
180 case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
181 case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
182 case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
183 case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
184 case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
185 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
186 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
187 for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
188 crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
189 br->read_crc16 = crc;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
190 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
191 br->crc16_align = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
192 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
193
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
194 static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
195 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
196 unsigned start, end;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
197 size_t bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
198 FLAC__byte *target;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
199
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
200 /* first shift the unconsumed buffer data toward the front as much as possible */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
201 if(br->consumed_words > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
202 start = br->consumed_words;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
203 end = br->words + (br->bytes? 1:0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
204 memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
205
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
206 br->words -= start;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
207 br->consumed_words = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
208 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
209
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
210 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
211 * set the target for reading, taking into account word alignment and endianness
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
212 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
213 bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
214 if(bytes == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
215 return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
216 target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
217
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
218 /* before reading, if the existing reader looks like this (say brword is 32 bits wide)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
219 * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
220 * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
221 * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
222 * ^^-------target, bytes=3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
223 * on LE machines, have to byteswap the odd tail word so nothing is
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
224 * overwritten:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
225 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
226 #if WORDS_BIGENDIAN
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
227 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
228 if(br->bytes)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
229 br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
230 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
231
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
232 /* now it looks like:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
233 * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
234 * buffer[BE]: 11 22 33 44 55 ?? ?? ??
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
235 * buffer[LE]: 44 33 22 11 55 ?? ?? ??
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
236 * ^^-------target, bytes=3
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
237 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
238
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
239 /* read in the data; note that the callback may return a smaller number of bytes */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
240 if(!br->read_callback(target, &bytes, br->client_data))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
241 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
242
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
243 /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
244 * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
245 * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ??
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
246 * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ??
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
247 * now have to byteswap on LE machines:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
248 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
249 #if WORDS_BIGENDIAN
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
250 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
251 end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
252 for(start = br->words; start < end; start++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
253 br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
254 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
255
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
256 /* now it looks like:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
257 * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
258 * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ??
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
259 * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
260 * finally we'll update the reader values:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
261 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
262 end = br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
263 br->words = end / FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
264 br->bytes = end % FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
265
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
266 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
267 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
268
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
269 /***********************************************************************
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
270 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
271 * Class constructor/destructor
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
272 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
273 ***********************************************************************/
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
274
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
275 FLAC__BitReader *FLAC__bitreader_new(void)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
276 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
277 FLAC__BitReader *br = (FLAC__BitReader*)calloc(1, sizeof(FLAC__BitReader));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
278
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
279 /* calloc() implies:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
280 memset(br, 0, sizeof(FLAC__BitReader));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
281 br->buffer = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
282 br->capacity = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
283 br->words = br->bytes = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
284 br->consumed_words = br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
285 br->read_callback = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
286 br->client_data = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
287 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
288 return br;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
289 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
290
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
291 void FLAC__bitreader_delete(FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
292 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
293 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
294
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
295 FLAC__bitreader_free(br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
296 free(br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
297 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
298
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
299 /***********************************************************************
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
300 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
301 * Public class methods
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
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
305 FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
306 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
307 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
308
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
309 br->words = br->bytes = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
310 br->consumed_words = br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
311 br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
312 br->buffer = (brword*)malloc(sizeof(brword) * br->capacity);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
313 if(br->buffer == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
314 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
315 br->read_callback = rcb;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
316 br->client_data = cd;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
317
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
318 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
319 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
320
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
321 void FLAC__bitreader_free(FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
322 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
323 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
324
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
325 if(0 != br->buffer)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
326 free(br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
327 br->buffer = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
328 br->capacity = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
329 br->words = br->bytes = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
330 br->consumed_words = br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
331 br->read_callback = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
332 br->client_data = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
333 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
334
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
335 FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
336 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
337 br->words = br->bytes = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
338 br->consumed_words = br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
339 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
340 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
341
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
342 void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
343 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
344 unsigned i, j;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
345 if(br == 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
346 fprintf(out, "bitreader is NULL\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
347 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
348 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
349 fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
350
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
351 for(i = 0; i < br->words; i++) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
352 fprintf(out, "%08X: ", i);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
353 for(j = 0; j < FLAC__BITS_PER_WORD; j++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
354 if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
355 fprintf(out, ".");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
356 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
357 fprintf(out, "%01u", br->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
358 fprintf(out, "\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
359 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
360 if(br->bytes > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
361 fprintf(out, "%08X: ", i);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
362 for(j = 0; j < br->bytes*8; j++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
363 if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
364 fprintf(out, ".");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
365 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
366 fprintf(out, "%01u", br->buffer[i] & (1 << (br->bytes*8-j-1)) ? 1:0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
367 fprintf(out, "\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
368 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
369 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
370 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
371
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
372 void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
373 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
374 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
375 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
376 FLAC__ASSERT((br->consumed_bits & 7) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
377
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
378 br->read_crc16 = (unsigned)seed;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
379 br->crc16_align = br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
380 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
381
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
382 FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
383 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
384 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
385 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
386 FLAC__ASSERT((br->consumed_bits & 7) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
387 FLAC__ASSERT(br->crc16_align <= br->consumed_bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
388
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
389 /* CRC any tail bytes in a partially-consumed word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
390 if(br->consumed_bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
391 const brword tail = br->buffer[br->consumed_words];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
392 for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
393 br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
394 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
395 return br->read_crc16;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
396 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
397
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
398 FLaC__INLINE FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
399 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
400 return ((br->consumed_bits & 7) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
401 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
402
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
403 FLaC__INLINE unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
404 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
405 return 8 - (br->consumed_bits & 7);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
406 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
407
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
408 FLaC__INLINE unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
409 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
410 return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
411 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
412
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
413 FLaC__INLINE FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
414 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
415 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
416 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
417
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
418 FLAC__ASSERT(bits <= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
419 FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
420 FLAC__ASSERT(br->consumed_words <= br->words);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
421
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
422 /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
423 FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
424
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
425 if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
426 *val = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
427 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
428 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
429
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
430 while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
431 if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
432 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
433 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
434 if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
435 /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
436 if(br->consumed_bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
437 /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
438 const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
439 const brword word = br->buffer[br->consumed_words];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
440 if(bits < n) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
441 *val = (word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
442 br->consumed_bits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
443 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
444 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
445 *val = word & (FLAC__WORD_ALL_ONES >> br->consumed_bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
446 bits -= n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
447 crc16_update_word_(br, word);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
448 br->consumed_words++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
449 br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
450 if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
451 *val <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
452 *val |= (br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
453 br->consumed_bits = bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
454 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
455 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
456 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
457 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
458 const brword word = br->buffer[br->consumed_words];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
459 if(bits < FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
460 *val = word >> (FLAC__BITS_PER_WORD-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
461 br->consumed_bits = bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
462 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
463 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
464 /* at this point 'bits' must be == FLAC__BITS_PER_WORD; because of previous assertions, it can't be larger */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
465 *val = word;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
466 crc16_update_word_(br, word);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
467 br->consumed_words++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
468 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
469 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
470 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
471 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
472 /* in this case we're starting our read at a partial tail word;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
473 * the reader has guaranteed that we have at least 'bits' bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
474 * available to read, which makes this case simpler.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
475 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
476 /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
477 if(br->consumed_bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
478 /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
479 FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
480 *val = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
481 br->consumed_bits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
482 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
483 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
484 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
485 *val = br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
486 br->consumed_bits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
487 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
488 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
489 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
490 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
491
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
492 FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
493 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
494 /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
495 if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
496 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
497 /* sign-extend: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
498 *val <<= (32-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
499 *val >>= (32-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
500 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
501 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
502
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
503 FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
504 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
505 FLAC__uint32 hi, lo;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
506
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
507 if(bits > 32) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
508 if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
509 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
510 if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
511 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
512 *val = hi;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
513 *val <<= 32;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
514 *val |= lo;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
515 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
516 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
517 if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
518 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
519 *val = lo;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
520 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
521 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
522 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
523
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
524 FLaC__INLINE FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
525 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
526 FLAC__uint32 x8, x32 = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
527
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
528 /* this doesn't need to be that fast as currently it is only used for vorbis comments */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
529
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
530 if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
531 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
532
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
533 if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
534 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
535 x32 |= (x8 << 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
536
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
537 if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
538 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
539 x32 |= (x8 << 16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
540
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
541 if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
542 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
543 x32 |= (x8 << 24);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
544
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
545 *val = x32;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
546 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
547 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
548
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
549 FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
550 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
551 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
552 * OPT: a faster implementation is possible but probably not that useful
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
553 * since this is only called a couple of times in the metadata readers.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
554 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
555 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
556 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
557
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
558 if(bits > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
559 const unsigned n = br->consumed_bits & 7;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
560 unsigned m;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
561 FLAC__uint32 x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
562
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
563 if(n != 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
564 m = min(8-n, bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
565 if(!FLAC__bitreader_read_raw_uint32(br, &x, m))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
566 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
567 bits -= m;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
568 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
569 m = bits / 8;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
570 if(m > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
571 if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
572 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
573 bits %= 8;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
574 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
575 if(bits > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
576 if(!FLAC__bitreader_read_raw_uint32(br, &x, bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
577 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
578 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
579 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
580
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
581 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
582 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
583
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
584 FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
585 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
586 FLAC__uint32 x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
587
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
588 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
589 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
590 FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
591
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
592 /* step 1: skip over partial head word to get word aligned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
593 while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
594 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
595 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
596 nvals--;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
597 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
598 if(0 == nvals)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
599 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
600 /* step 2: skip whole words in chunks */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
601 while(nvals >= FLAC__BYTES_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
602 if(br->consumed_words < br->words) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
603 br->consumed_words++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
604 nvals -= FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
605 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
606 else if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
607 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
608 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
609 /* step 3: skip any remainder from partial tail bytes */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
610 while(nvals) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
611 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
612 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
613 nvals--;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
614 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
615
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
616 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
617 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
618
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
619 FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
620 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
621 FLAC__uint32 x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
622
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
623 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
624 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
625 FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
626
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
627 /* step 1: read from partial head word to get word aligned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
628 while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
629 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
630 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
631 *val++ = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
632 nvals--;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
633 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
634 if(0 == nvals)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
635 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
636 /* step 2: read whole words in chunks */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
637 while(nvals >= FLAC__BYTES_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
638 if(br->consumed_words < br->words) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
639 const brword word = br->buffer[br->consumed_words++];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
640 #if FLAC__BYTES_PER_WORD == 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
641 val[0] = (FLAC__byte)(word >> 24);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
642 val[1] = (FLAC__byte)(word >> 16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
643 val[2] = (FLAC__byte)(word >> 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
644 val[3] = (FLAC__byte)word;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
645 #elif FLAC__BYTES_PER_WORD == 8
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
646 val[0] = (FLAC__byte)(word >> 56);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
647 val[1] = (FLAC__byte)(word >> 48);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
648 val[2] = (FLAC__byte)(word >> 40);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
649 val[3] = (FLAC__byte)(word >> 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
650 val[4] = (FLAC__byte)(word >> 24);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
651 val[5] = (FLAC__byte)(word >> 16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
652 val[6] = (FLAC__byte)(word >> 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
653 val[7] = (FLAC__byte)word;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
654 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
655 for(x = 0; x < FLAC__BYTES_PER_WORD; x++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
656 val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1)));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
657 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
658 val += FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
659 nvals -= FLAC__BYTES_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
660 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
661 else if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
662 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
663 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
664 /* step 3: read any remainder from partial tail bytes */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
665 while(nvals) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
666 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
667 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
668 *val++ = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
669 nvals--;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
670 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
671
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
672 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
673 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
674
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
675 FLaC__INLINE FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
676 #ifdef FLAC__NO_MANUAL_INLINING
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
677 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
678 unsigned bit;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
679
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
680 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
681 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
682
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
683 *val = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
684 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
685 if(!FLAC__bitreader_read_bit(br, &bit))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
686 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
687 if(bit)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
688 break;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
689 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
690 *val++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
691 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
692 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
693 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
694 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
695 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
696 unsigned i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
697
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
698 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
699 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
700
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
701 *val = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
702 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
703 while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
704 brword b = br->buffer[br->consumed_words] << br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
705 if(b) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
706 #if 0 /* too slow, but this is the idea: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
707 for(i = 0; !(b & FLAC__WORD_TOP_BIT_ONE); i++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
708 b <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
709 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
710 i = ALIGNED_UNARY_BITS(b);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
711 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
712 *val += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
713 i++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
714 br->consumed_bits += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
715 if(br->consumed_bits == FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
716 crc16_update_word_(br, br->buffer[br->consumed_words]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
717 br->consumed_words++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
718 br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
719 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
720 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
721 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
722 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
723 *val += FLAC__BITS_PER_WORD - br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
724 crc16_update_word_(br, br->buffer[br->consumed_words]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
725 br->consumed_words++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
726 br->consumed_bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
727 /* didn't find stop bit yet, have to keep going... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
728 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
729 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
730 /* at this point we've eaten up all the whole words; have to try
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
731 * reading through any tail bytes before calling the read callback.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
732 * this is a repeat of the above logic adjusted for the fact we
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
733 * don't have a whole word. note though if the client is feeding
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
734 * us data a byte at a time (unlikely), br->consumed_bits may not
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
735 * be zero.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
736 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
737 if(br->bytes) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
738 const unsigned end = br->bytes * 8;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
739 brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
740 if(b) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
741 #if 0 /* too slow, but this is the idea: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
742 for(i = 0; !(b & FLAC__WORD_TOP_BIT_ONE); i++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
743 b <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
744 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
745 i = ALIGNED_UNARY_BITS(b);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
746 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
747 *val += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
748 i++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
749 br->consumed_bits += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
750 FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
751 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
752 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
753 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
754 *val += end - br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
755 br->consumed_bits += end;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
756 FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
757 /* didn't find stop bit yet, have to keep going... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
758 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
759 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
760 if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
761 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
762 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
763 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
764 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
765
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
766 FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
767 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
768 FLAC__uint32 lsbs = 0, msbs = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
769 unsigned uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
770
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
771 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
772 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
773 FLAC__ASSERT(parameter <= 31);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
774
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
775 /* read the unary MSBs and end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
776 if(!FLAC__bitreader_read_unary_unsigned(br, &msbs))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
777 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
778
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
779 /* read the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
780 if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
781 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
782
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
783 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
784 uval = (msbs << parameter) | lsbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
785 if(uval & 1)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
786 *val = -((int)(uval >> 1)) - 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
787 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
788 *val = (int)(uval >> 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
789
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
790 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
791 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
792
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
793 /* this is by far the most heavily used reader call. it ain't pretty but it's fast */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
794 /* a lot of the logic is copied, then adapted, from FLAC__bitreader_read_unary_unsigned() and FLAC__bitreader_read_raw_uint32() */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
795 FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
796 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
797 unsigned i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
798 unsigned uval = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
799 unsigned bits; /* the # of binary LSBs left to read to finish a rice codeword */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
800
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
801 /* try and get br->consumed_words and br->consumed_bits into register;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
802 * must remember to flush them back to *br before calling other
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
803 * bitwriter functions that use them, and before returning */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
804 register unsigned cwords;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
805 register unsigned cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
806
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
807 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
808 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
809 /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
810 FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
811 FLAC__ASSERT(parameter < 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
812 /* the above two asserts also guarantee that the binary part never straddles more that 2 words, so we don't have to loop to read it */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
813
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
814 if(nvals == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
815 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
816
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
817 cbits = br->consumed_bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
818 cwords = br->consumed_words;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
819
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
820 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
821
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
822 /* read unary part */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
823 while(1) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
824 while(cwords < br->words) { /* if we've not consumed up to a partial tail word... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
825 brword b = br->buffer[cwords] << cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
826 if(b) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
827 #if 0 /* too slow, but this is the idea: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
828 for(i = 0; !(b & FLAC__WORD_TOP_BIT_ONE); i++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
829 b <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
830 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
831 i = ALIGNED_UNARY_BITS(b);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
832 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
833 uval += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
834 bits = parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
835 i++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
836 cbits += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
837 if(cbits == FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
838 crc16_update_word_(br, br->buffer[cwords]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
839 cwords++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
840 cbits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
841 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
842 goto break1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
843 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
844 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
845 uval += FLAC__BITS_PER_WORD - cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
846 crc16_update_word_(br, br->buffer[cwords]);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
847 cwords++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
848 cbits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
849 /* didn't find stop bit yet, have to keep going... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
850 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
851 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
852 /* at this point we've eaten up all the whole words; have to try
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
853 * reading through any tail bytes before calling the read callback.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
854 * this is a repeat of the above logic adjusted for the fact we
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
855 * don't have a whole word. note though if the client is feeding
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
856 * us data a byte at a time (unlikely), br->consumed_bits may not
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
857 * be zero.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
858 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
859 if(br->bytes) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
860 const unsigned end = br->bytes * 8;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
861 brword b = (br->buffer[cwords] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
862 if(b) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
863 #if 0 /* too slow, but this is the idea: */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
864 for(i = 0; !(b & FLAC__WORD_TOP_BIT_ONE); i++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
865 b <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
866 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
867 i = ALIGNED_UNARY_BITS(b);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
868 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
869 uval += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
870 bits = parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
871 i++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
872 cbits += i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
873 FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
874 goto break1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
875 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
876 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
877 uval += end - cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
878 cbits += end;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
879 FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
880 /* didn't find stop bit yet, have to keep going... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
881 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
882 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
883 /* flush registers and read; bitreader_read_from_client_() does
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
884 * not touch br->consumed_bits at all but we still need to set
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
885 * it in case it fails and we have to return false.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
886 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
887 br->consumed_bits = cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
888 br->consumed_words = cwords;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
889 if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
890 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
891 cwords = br->consumed_words;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
892 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
893 break1:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
894 /* read binary part */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
895 FLAC__ASSERT(cwords <= br->words);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
896
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
897 if(bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
898 while((br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits < bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
899 /* flush registers and read; bitreader_read_from_client_() does
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
900 * not touch br->consumed_bits at all but we still need to set
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
901 * it in case it fails and we have to return false.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
902 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
903 br->consumed_bits = cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
904 br->consumed_words = cwords;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
905 if(!bitreader_read_from_client_(br))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
906 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
907 cwords = br->consumed_words;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
908 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
909 if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
910 if(cbits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
911 /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
912 const unsigned n = FLAC__BITS_PER_WORD - cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
913 const brword word = br->buffer[cwords];
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
914 if(bits < n) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
915 uval <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
916 uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
917 cbits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
918 goto break2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
919 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
920 uval <<= n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
921 uval |= word & (FLAC__WORD_ALL_ONES >> cbits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
922 bits -= n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
923 crc16_update_word_(br, word);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
924 cwords++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
925 cbits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
926 if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
927 uval <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
928 uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
929 cbits = bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
930 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
931 goto break2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
932 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
933 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
934 FLAC__ASSERT(bits < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
935 uval <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
936 uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
937 cbits = bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
938 goto break2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
939 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
940 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
941 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
942 /* in this case we're starting our read at a partial tail word;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
943 * the reader has guaranteed that we have at least 'bits' bits
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
944 * available to read, which makes this case simpler.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
945 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
946 uval <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
947 if(cbits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
948 /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
949 FLAC__ASSERT(cbits + bits <= br->bytes*8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
950 uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
951 cbits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
952 goto break2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
953 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
954 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
955 uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
956 cbits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
957 goto break2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
958 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
959 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
960 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
961 break2:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
962 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
963 *vals = (int)(uval >> 1 ^ -(int)(uval & 1));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
964
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
965 /* are we done? */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
966 --nvals;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
967 if(nvals == 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
968 br->consumed_bits = cbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
969 br->consumed_words = cwords;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
970 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
971 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
972
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
973 uval = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
974 ++vals;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
975
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
976 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
977 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
978
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
979 #if 0 /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
980 FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
981 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
982 FLAC__uint32 lsbs = 0, msbs = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
983 unsigned bit, uval, k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
984
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
985 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
986 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
987
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
988 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
989
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
990 /* read the unary MSBs and end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
991 if(!FLAC__bitreader_read_unary_unsigned(br, &msbs))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
992 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
993
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
994 /* read the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
995 if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
996 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
997
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
998 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
999 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1000 uval = (msbs << k) | lsbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1001 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1002 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1003 unsigned d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1004 if(lsbs >= d) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1005 if(!FLAC__bitreader_read_bit(br, &bit))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1006 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1007 lsbs <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1008 lsbs |= bit;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1009 lsbs -= d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1010 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1011 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1012 uval = msbs * parameter + lsbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1013 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1014
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1015 /* unfold unsigned to signed */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1016 if(uval & 1)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1017 *val = -((int)(uval >> 1)) - 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1018 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1019 *val = (int)(uval >> 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1020
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1021 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1022 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1023
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1024 FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1025 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1026 FLAC__uint32 lsbs, msbs = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1027 unsigned bit, k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1028
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1029 FLAC__ASSERT(0 != br);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1030 FLAC__ASSERT(0 != br->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1031
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1032 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1033
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1034 /* read the unary MSBs and end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1035 if(!FLAC__bitreader_read_unary_unsigned(br, &msbs))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1036 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1037
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1038 /* read the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1039 if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1040 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1041
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1042 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1043 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1044 *val = (msbs << k) | lsbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1045 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1046 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1047 unsigned d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1048 if(lsbs >= d) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1049 if(!FLAC__bitreader_read_bit(br, &bit))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1050 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1051 lsbs <<= 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1052 lsbs |= bit;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1053 lsbs -= d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1054 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1055 /* compose the value */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1056 *val = msbs * parameter + lsbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1057 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1058
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1059 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1060 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1061 #endif /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1062
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1063 /* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1064 FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1065 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1066 FLAC__uint32 v = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1067 FLAC__uint32 x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1068 unsigned i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1069
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1070 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1071 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1072 if(raw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1073 raw[(*rawlen)++] = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1074 if(!(x & 0x80)) { /* 0xxxxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1075 v = x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1076 i = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1077 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1078 else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1079 v = x & 0x1F;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1080 i = 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1081 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1082 else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1083 v = x & 0x0F;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1084 i = 2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1085 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1086 else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1087 v = x & 0x07;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1088 i = 3;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1089 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1090 else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1091 v = x & 0x03;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1092 i = 4;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1093 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1094 else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1095 v = x & 0x01;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1096 i = 5;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1097 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1098 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1099 *val = 0xffffffff;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1100 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1101 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1102 for( ; i; i--) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1103 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1104 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1105 if(raw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1106 raw[(*rawlen)++] = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1107 if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1108 *val = 0xffffffff;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1109 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1110 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1111 v <<= 6;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1112 v |= (x & 0x3F);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1113 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1114 *val = v;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1115 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1116 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1117
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1118 /* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1119 FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1120 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1121 FLAC__uint64 v = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1122 FLAC__uint32 x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1123 unsigned i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1124
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1125 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1126 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1127 if(raw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1128 raw[(*rawlen)++] = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1129 if(!(x & 0x80)) { /* 0xxxxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1130 v = x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1131 i = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1132 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1133 else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1134 v = x & 0x1F;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1135 i = 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1136 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1137 else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1138 v = x & 0x0F;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1139 i = 2;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1140 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1141 else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1142 v = x & 0x07;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1143 i = 3;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1144 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1145 else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1146 v = x & 0x03;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1147 i = 4;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1148 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1149 else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1150 v = x & 0x01;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1151 i = 5;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1152 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1153 else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1154 v = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1155 i = 6;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1156 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1157 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1158 *val = FLAC__U64L(0xffffffffffffffff);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1159 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1160 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1161 for( ; i; i--) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1162 if(!FLAC__bitreader_read_raw_uint32(br, &x, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1163 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1164 if(raw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1165 raw[(*rawlen)++] = (FLAC__byte)x;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1166 if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1167 *val = FLAC__U64L(0xffffffffffffffff);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1168 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1169 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1170 v <<= 6;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1171 v |= (x & 0x3F);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1172 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1173 *val = v;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1174 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
1175 }