annotate src/flac/libflac/bitwriter.c @ 1212:36cc5e56246e trunk

Added title changes event for songchange plugin
author Giacomo Lozito <james@develia.org>
date Fri, 06 Jul 2007 17:37:21 +0200
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 #if 0 /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
46 #include "private/bitmath.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
47 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
48 #include "private/bitwriter.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
49 #include "private/crc.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
50 #include "FLAC/assert.h"
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
51
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
52 /* Things should be fastest when this matches the machine word size */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
53 /* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
54 /* WATCHOUT: there are a few places where the code will not work unless bwword is >= 32 bits wide */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
55 typedef FLAC__uint32 bwword;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
56 #define FLAC__BYTES_PER_WORD 4
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
57 #define FLAC__BITS_PER_WORD 32
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
58 #define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
59 /* SWAP_BE_WORD_TO_HOST swaps bytes in a bwword (which is always big-endian) if necessary to match host byte order */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
60 #if WORDS_BIGENDIAN
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
61 #define SWAP_BE_WORD_TO_HOST(x) (x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
62 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
63 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
64 #define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
65 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
66 #define SWAP_BE_WORD_TO_HOST(x) ntohl(x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
67 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
68 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
69
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
70 /*
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
71 * The default capacity here doesn't matter too much. The buffer always grows
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
72 * to hold whatever is written to it. Usually the encoder will stop adding at
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
73 * a frame or metadata block, then write that out and clear the buffer for the
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
74 * next one.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
75 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
76 static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(bwword); /* size in words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
77 /* When growing, increment 4K at a time */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
78 static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(bwword); /* size in words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
79
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
80 #define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
81 #define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
82
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
83 #ifdef min
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
84 #undef min
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
85 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
86 #define min(x,y) ((x)<(y)?(x):(y))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
87
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
88 /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
89 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
90 #define FLAC__U64L(x) x
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
91 #else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
92 #define FLAC__U64L(x) x##LLU
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
93 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
94
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
95 #ifndef FLaC__INLINE
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
96 #define FLaC__INLINE
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
97 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
98
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
99 struct FLAC__BitWriter {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
100 bwword *buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
101 bwword accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
102 unsigned capacity; /* capacity of buffer in words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
103 unsigned words; /* # of complete words in buffer */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
104 unsigned bits; /* # of used bits in accum */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
105 };
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
106
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
107 #ifdef _MSC_VER
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
108 /* OPT: an MSVC built-in would be better */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
109 static _inline FLAC__uint32 local_swap32_(FLAC__uint32 x)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
110 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
111 x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
112 return (x>>16) | (x<<16);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
113 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
114 #endif
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
115
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
116 /* * WATCHOUT: The current implementation only grows the buffer. */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
117 static FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
118 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
119 unsigned new_capacity;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
120 bwword *new_buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
121
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
122 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
123 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
124
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
125 /* calculate total words needed to store 'bits_to_add' additional bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
126 new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
127
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
128 /* it's possible (due to pessimism in the growth estimation that
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
129 * leads to this call) that we don't actually need to grow
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
130 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
131 if(bw->capacity >= new_capacity)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
132 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
133
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
134 /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
135 if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
136 new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
137 /* make sure we got everything right */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
138 FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
139 FLAC__ASSERT(new_capacity > bw->capacity);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
140 FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
141
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
142 new_buffer = (bwword*)realloc(bw->buffer, sizeof(bwword)*new_capacity);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
143 if(new_buffer == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
144 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
145 bw->buffer = new_buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
146 bw->capacity = new_capacity;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
147 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
148 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
149
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
150
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
151 /***********************************************************************
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
152 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
153 * Class constructor/destructor
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
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
157 FLAC__BitWriter *FLAC__bitwriter_new(void)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
158 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
159 FLAC__BitWriter *bw = (FLAC__BitWriter*)calloc(1, sizeof(FLAC__BitWriter));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
160 /* note that calloc() sets all members to 0 for us */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
161 return bw;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
162 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
163
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
164 void FLAC__bitwriter_delete(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
165 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
166 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
167
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
168 FLAC__bitwriter_free(bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
169 free(bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
170 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
171
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
172 /***********************************************************************
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
173 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
174 * Public class methods
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
175 *
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
176 ***********************************************************************/
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
177
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
178 FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
179 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
180 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
181
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
182 bw->words = bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
183 bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
184 bw->buffer = (bwword*)malloc(sizeof(bwword) * bw->capacity);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
185 if(bw->buffer == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
186 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
187
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
188 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
189 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
190
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
191 void FLAC__bitwriter_free(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
192 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
193 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
194
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
195 if(0 != bw->buffer)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
196 free(bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
197 bw->buffer = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
198 bw->capacity = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
199 bw->words = bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
200 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
201
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
202 void FLAC__bitwriter_clear(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
203 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
204 bw->words = bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
205 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
206
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
207 void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
208 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
209 unsigned i, j;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
210 if(bw == 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
211 fprintf(out, "bitwriter is NULL\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
212 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
213 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
214 fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
215
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
216 for(i = 0; i < bw->words; i++) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
217 fprintf(out, "%08X: ", i);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
218 for(j = 0; j < FLAC__BITS_PER_WORD; j++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
219 fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
220 fprintf(out, "\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
221 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
222 if(bw->bits > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
223 fprintf(out, "%08X: ", i);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
224 for(j = 0; j < bw->bits; j++)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
225 fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
226 fprintf(out, "\n");
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
227 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
228 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
229 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
230
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
231 FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
232 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
233 const FLAC__byte *buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
234 size_t bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
235
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
236 FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
237
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
238 if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
239 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
240
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
241 *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
242 FLAC__bitwriter_release_buffer(bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
243 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
244 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
245
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
246 FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
247 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
248 const FLAC__byte *buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
249 size_t bytes;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
250
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
251 FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
252
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
253 if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
254 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
255
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
256 *crc = FLAC__crc8(buffer, bytes);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
257 FLAC__bitwriter_release_buffer(bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
258 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
259 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
260
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
261 FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
262 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
263 return ((bw->bits & 7) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
264 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
265
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
266 unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
267 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
268 return FLAC__TOTAL_BITS(bw);
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 FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
272 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
273 FLAC__ASSERT((bw->bits & 7) == 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
274 /* double protection */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
275 if(bw->bits & 7)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
276 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
277 /* if we have bits in the accumulator we have to flush those to the buffer first */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
278 if(bw->bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
279 FLAC__ASSERT(bw->words <= bw->capacity);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
280 if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
281 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
282 /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
283 bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
284 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
285 /* now we can just return what we have */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
286 *buffer = (FLAC__byte*)bw->buffer;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
287 *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
288 return true;
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__bitwriter_release_buffer(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
292 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
293 /* nothing to do. in the future, strict checking of a 'writer-is-in-
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
294 * get-mode' flag could be added everywhere and then cleared here
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
295 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
296 (void)bw;
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 FLaC__INLINE FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
300 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
301 unsigned n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
302
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
303 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
304 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
305
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
306 if(bits == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
307 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
308 /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
309 if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
310 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
311 /* first part gets to word alignment */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
312 if(bw->bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
313 n = min(FLAC__BITS_PER_WORD - bw->bits, bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
314 bw->accum <<= n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
315 bits -= n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
316 bw->bits += n;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
317 if(bw->bits == FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
318 bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
319 bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
320 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
321 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
322 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
323 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
324 /* do whole words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
325 while(bits >= FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
326 bw->buffer[bw->words++] = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
327 bits -= FLAC__BITS_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
328 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
329 /* do any leftovers */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
330 if(bits > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
331 bw->accum = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
332 bw->bits = bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
333 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
334 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
335 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
336
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
337 FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
338 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
339 register unsigned left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
340
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
341 /* 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
342 FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
343
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
344 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
345 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
346
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
347 FLAC__ASSERT(bits <= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
348 if(bits == 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
349 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
350
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
351 /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
352 if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
353 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
354
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
355 left = FLAC__BITS_PER_WORD - bw->bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
356 if(bits < left) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
357 bw->accum <<= bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
358 bw->accum |= val;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
359 bw->bits += bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
360 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
361 else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
362 bw->accum <<= left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
363 bw->accum |= val >> (bw->bits = bits - left);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
364 bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
365 bw->accum = val;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
366 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
367 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
368 bw->accum = val;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
369 bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
370 bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
371 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
372
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
373 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
374 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
375
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
376 FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
377 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
378 /* zero-out unused bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
379 if(bits < 32)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
380 val &= (~(0xffffffff << bits));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
381
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
382 return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
383 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
384
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
385 FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
386 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
387 /* this could be a little faster but it's not used for much */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
388 if(bits > 32) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
389 return
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
390 FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) &&
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
391 FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
392 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
393 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
394 return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
395 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
396
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
397 FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
398 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
399 /* 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
400
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
401 if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
402 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
403 if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
404 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
405 if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
406 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
407 if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
408 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
409
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
410 return true;
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__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
414 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
415 unsigned i;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
416
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
417 /* this could be faster but currently we don't need it to be since it's only used for writing metadata */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
418 for(i = 0; i < nvals; i++) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
419 if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
420 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
421 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
422
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
423 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
424 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
425
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
426 FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
427 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
428 if(val < 32)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
429 return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
430 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
431 return
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
432 FLAC__bitwriter_write_zeroes(bw, val) &&
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
433 FLAC__bitwriter_write_raw_uint32(bw, 1, 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
434 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
435
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
436 unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
437 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
438 FLAC__uint32 uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
439
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
440 FLAC__ASSERT(parameter < sizeof(unsigned)*8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
441
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
442 /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
443 uval = (val<<1) ^ (val>>31);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
444
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
445 return 1 + parameter + (uval >> parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
446 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
447
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
448 #if 0 /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
449 unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
450 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
451 unsigned bits, msbs, uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
452 unsigned k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
453
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
454 FLAC__ASSERT(parameter > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
455
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
456 /* fold signed to unsigned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
457 if(val < 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
458 uval = (unsigned)(((-(++val)) << 1) + 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
459 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
460 uval = (unsigned)(val << 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
461
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
462 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
463 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
464 FLAC__ASSERT(k <= 30);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
465
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
466 msbs = uval >> k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
467 bits = 1 + k + msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
468 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
469 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
470 unsigned q, r, d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
471
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
472 d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
473 q = uval / parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
474 r = uval - (q * parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
475
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
476 bits = 1 + q + k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
477 if(r >= d)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
478 bits++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
479 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
480 return bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
481 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
482
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
483 unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
484 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
485 unsigned bits, msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
486 unsigned k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
487
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
488 FLAC__ASSERT(parameter > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
489
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
490 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
491 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
492 FLAC__ASSERT(k <= 30);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
493
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
494 msbs = uval >> k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
495 bits = 1 + k + msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
496 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
497 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
498 unsigned q, r, d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
499
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
500 d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
501 q = uval / parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
502 r = uval - (q * parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
503
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
504 bits = 1 + q + k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
505 if(r >= d)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
506 bits++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
507 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
508 return bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
509 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
510 #endif /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
511
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
512 FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
513 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
514 unsigned total_bits, interesting_bits, msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
515 FLAC__uint32 uval, pattern;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
516
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
517 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
518 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
519 FLAC__ASSERT(parameter < 8*sizeof(uval));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
520
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
521 /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
522 uval = (val<<1) ^ (val>>31);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
523
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
524 msbs = uval >> parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
525 interesting_bits = 1 + parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
526 total_bits = interesting_bits + msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
527 pattern = 1 << parameter; /* the unary end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
528 pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
529
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
530 if(total_bits <= 32)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
531 return FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
532 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
533 return
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
534 FLAC__bitwriter_write_zeroes(bw, msbs) && /* write the unary MSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
535 FLAC__bitwriter_write_raw_uint32(bw, pattern, interesting_bits); /* write the unary end bit and binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
536 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
537
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
538 FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
539 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
540 const FLAC__uint32 mask1 = FLAC__WORD_ALL_ONES << parameter; /* we val|=mask1 to set the stop bit above it... */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
541 const FLAC__uint32 mask2 = FLAC__WORD_ALL_ONES >> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
542 FLAC__uint32 uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
543 register unsigned left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
544 const unsigned lsbits = 1 + parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
545 unsigned msbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
546
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
547 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
548 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
549 FLAC__ASSERT(parameter < 8*sizeof(bwword)-1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
550 /* 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
551 FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
552
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
553 while(nvals) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
554 /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
555 uval = (*vals<<1) ^ (*vals>>31);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
556
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
557 msbits = uval >> parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
558
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
559 /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
560 /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
561 if(bw->capacity <= bw->words + bw->bits + msbits + lsbits && !bitwriter_grow_(bw, msbits+lsbits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
562 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
563
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
564 if(msbits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
565 /* first part gets to word alignment */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
566 if(bw->bits) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
567 left = min(FLAC__BITS_PER_WORD - bw->bits, msbits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
568 bw->accum <<= left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
569 msbits -= left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
570 bw->bits += left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
571 if(bw->bits == FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
572 bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
573 bw->bits = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
574 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
575 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
576 goto break1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
577 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
578 /* do whole words */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
579 while(msbits >= FLAC__BITS_PER_WORD) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
580 bw->buffer[bw->words++] = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
581 msbits -= FLAC__BITS_PER_WORD;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
582 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
583 /* do any leftovers */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
584 if(msbits > 0) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
585 bw->accum = 0;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
586 bw->bits = msbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
587 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
588 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
589 break1:
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
590 uval |= mask1; /* set stop bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
591 uval &= mask2; /* mask off unused top bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
592
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
593 left = FLAC__BITS_PER_WORD - bw->bits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
594 if(lsbits < left) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
595 bw->accum <<= lsbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
596 bw->accum |= uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
597 bw->bits += lsbits;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
598 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
599 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
600 /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
601 * be > lsbits (because of previous assertions) so it would have
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
602 * triggered the (lsbits<left) case above.
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
603 */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
604 FLAC__ASSERT(bw->bits);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
605 FLAC__ASSERT(left < FLAC__BITS_PER_WORD);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
606 bw->accum <<= left;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
607 bw->accum |= uval >> (bw->bits = lsbits - left);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
608 bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
609 bw->accum = uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
610 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
611 vals++;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
612 nvals--;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
613 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
614 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
615 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
616
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
617 #if 0 /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
618 FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
619 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
620 unsigned total_bits, msbs, uval;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
621 unsigned k;
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 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
624 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
625 FLAC__ASSERT(parameter > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
626
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
627 /* fold signed to unsigned */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
628 if(val < 0)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
629 uval = (unsigned)(((-(++val)) << 1) + 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
630 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
631 uval = (unsigned)(val << 1);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
632
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
633 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
634 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
635 unsigned pattern;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
636
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
637 FLAC__ASSERT(k <= 30);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
638
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
639 msbs = uval >> k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
640 total_bits = 1 + k + msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
641 pattern = 1 << k; /* the unary end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
642 pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
643
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
644 if(total_bits <= 32) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
645 if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
646 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
647 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
648 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
649 /* write the unary MSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
650 if(!FLAC__bitwriter_write_zeroes(bw, msbs))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
651 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
652 /* write the unary end bit and binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
653 if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, k+1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
654 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
655 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
656 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
657 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
658 unsigned q, r, d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
659
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
660 d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
661 q = uval / parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
662 r = uval - (q * parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
663 /* write the unary MSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
664 if(!FLAC__bitwriter_write_zeroes(bw, q))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
665 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
666 /* write the unary end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
667 if(!FLAC__bitwriter_write_raw_uint32(bw, 1, 1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
668 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
669 /* write the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
670 if(r >= d) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
671 if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
672 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
673 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
674 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
675 if(!FLAC__bitwriter_write_raw_uint32(bw, r, k))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
676 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
677 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
678 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
679 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
680 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
681
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
682 FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
683 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
684 unsigned total_bits, msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
685 unsigned k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
686
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
687 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
688 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
689 FLAC__ASSERT(parameter > 0);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
690
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
691 k = FLAC__bitmath_ilog2(parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
692 if(parameter == 1u<<k) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
693 unsigned pattern;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
694
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
695 FLAC__ASSERT(k <= 30);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
696
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
697 msbs = uval >> k;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
698 total_bits = 1 + k + msbs;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
699 pattern = 1 << k; /* the unary end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
700 pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
701
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
702 if(total_bits <= 32) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
703 if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
704 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
705 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
706 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
707 /* write the unary MSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
708 if(!FLAC__bitwriter_write_zeroes(bw, msbs))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
709 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
710 /* write the unary end bit and binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
711 if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, k+1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
712 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
713 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
714 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
715 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
716 unsigned q, r, d;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
717
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
718 d = (1 << (k+1)) - parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
719 q = uval / parameter;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
720 r = uval - (q * parameter);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
721 /* write the unary MSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
722 if(!FLAC__bitwriter_write_zeroes(bw, q))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
723 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
724 /* write the unary end bit */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
725 if(!FLAC__bitwriter_write_raw_uint32(bw, 1, 1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
726 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
727 /* write the binary LSBs */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
728 if(r >= d) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
729 if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
730 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
731 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
732 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
733 if(!FLAC__bitwriter_write_raw_uint32(bw, r, k))
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
734 return false;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
735 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
736 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
737 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
738 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
739 #endif /* UNUSED */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
740
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
741 FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
742 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
743 FLAC__bool ok = 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
744
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
745 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
746 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
747
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
748 FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
749
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
750 if(val < 0x80) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
751 return FLAC__bitwriter_write_raw_uint32(bw, val, 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
752 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
753 else if(val < 0x800) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
754 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
755 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
756 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
757 else if(val < 0x10000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
758 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
759 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
760 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
761 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
762 else if(val < 0x200000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
763 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
764 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
765 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
766 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
767 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
768 else if(val < 0x4000000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
769 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
770 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
771 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
772 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
773 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
774 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
775 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
776 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
777 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
778 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
779 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
780 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
781 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
782 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
783
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
784 return ok;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
785 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
786
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
787 FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
788 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
789 FLAC__bool ok = 1;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
790
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
791 FLAC__ASSERT(0 != bw);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
792 FLAC__ASSERT(0 != bw->buffer);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
793
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
794 FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
795
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
796 if(val < 0x80) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
797 return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
798 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
799 else if(val < 0x800) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
800 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
801 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
802 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
803 else if(val < 0x10000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
804 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
805 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
806 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
807 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
808 else if(val < 0x200000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
809 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
810 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
811 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
812 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
813 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
814 else if(val < 0x4000000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
815 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
816 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
817 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
818 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
819 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
820 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
821 else if(val < 0x80000000) {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
822 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
823 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
824 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
825 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
826 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
827 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
828 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
829 else {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
830 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
831 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
832 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
833 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
834 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
835 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
836 ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8);
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
837 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
838
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
839 return ok;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
840 }
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
841
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
842 FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
843 {
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
844 /* 0-pad to byte boundary */
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
845 if(bw->bits & 7u)
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
846 return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u));
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
847 else
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
848 return true;
a9b178bc4ae4 [svn] Import flac. Please test.
js
parents:
diff changeset
849 }