bitbuffer.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:77k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC - Free Lossless Audio Codec library
  2.  * Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #include <stdlib.h> /* for malloc() */
  32. #include <string.h> /* for memcpy(), memset() */
  33. #include "private/bitbuffer.h"
  34. #include "private/bitmath.h"
  35. #include "private/crc.h"
  36. #include "FLAC/assert.h"
  37. /*
  38.  * Along the way you will see two versions of some functions, selected
  39.  * by a FLAC__NO_MANUAL_INLINING macro.  One is the simplified, more
  40.  * readable, and slow version, and the other is the same function
  41.  * where crucial parts have been manually inlined and are much faster.
  42.  *
  43.  */
  44. /*
  45.  * Some optimization strategies are slower with older versions of MSVC
  46.  */
  47. #if defined _MSC_VER && _MSC_VER <= 1200
  48. #define FLAC__OLD_MSVC_FLAVOR
  49. #endif
  50. /*
  51.  * This should be at least twice as large as the largest number of blurbs
  52.  * required to represent any 'number' (in any encoding) you are going to
  53.  * read.  With FLAC this is on the order of maybe a few hundred bits.
  54.  * If the buffer is smaller than that, the decoder won't be able to read
  55.  * in a whole number that is in a variable length encoding (e.g. Rice).
  56.  *
  57.  * The number we are actually using here is based on what would be the
  58.  * approximate maximum size of a verbatim frame at the default block size,
  59.  * for CD audio (4096 sample * 4 bytes per sample), plus some wiggle room.
  60.  * 32kbytes sounds reasonable.  For kicks we subtract out 64 bytes for any
  61.  * alignment or malloc overhead.
  62.  *
  63.  * Increase this number to decrease the number of read callbacks, at the
  64.  * expense of using more memory.  Or decrease for the reverse effect,
  65.  * keeping in mind the limit from the first paragraph.
  66.  */
  67. static const unsigned FLAC__BITBUFFER_DEFAULT_CAPACITY = ((65536 - 64) * 8) / FLAC__BITS_PER_BLURB; /* blurbs */
  68. #ifndef FLAC__OLD_MSVC_FLAVOR
  69. static const unsigned char byte_to_unary_table[] = {
  70. 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
  71. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  72. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  73. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  74. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  75. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  76. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  77. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  78. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  79. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  80. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  81. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  82. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  83. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  84. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  85. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  86. };
  87. #endif
  88. #if FLAC__BITS_PER_BLURB == 8
  89. #define FLAC__BITS_PER_BLURB_LOG2 3
  90. #define FLAC__BYTES_PER_BLURB 1
  91. #define FLAC__BLURB_ALL_ONES ((FLAC__byte)0xff)
  92. #define FLAC__BLURB_TOP_BIT_ONE ((FLAC__byte)0x80)
  93. #define BLURB_BIT_TO_MASK(b) (((FLAC__blurb)'x80') >> (b))
  94. #define CRC16_UPDATE_BLURB(bb, blurb, crc) FLAC__CRC16_UPDATE((blurb), (crc));
  95. #ifndef FLAC__OLD_MSVC_FLAVOR
  96. #define FLAC__ALIGNED_BLURB_UNARY(blurb) (byte_to_unary_table[blurb])
  97. #endif
  98. #elif FLAC__BITS_PER_BLURB == 32
  99. #define FLAC__BITS_PER_BLURB_LOG2 5
  100. #define FLAC__BYTES_PER_BLURB 4
  101. #define FLAC__BLURB_ALL_ONES ((FLAC__uint32)0xffffffff)
  102. #define FLAC__BLURB_TOP_BIT_ONE ((FLAC__uint32)0x80000000)
  103. #define BLURB_BIT_TO_MASK(b) (((FLAC__blurb)0x80000000) >> (b))
  104. #define CRC16_UPDATE_BLURB(bb, blurb, crc) crc16_update_blurb((bb), (blurb));
  105. #ifndef FLAC__OLD_MSVC_FLAVOR
  106. #define FLAC__ALIGNED_BLURB_UNARY(blurb) ((blurb) <= 0xff ? byte_to_unary_table[blurb] + 24 : ((blurb) <= 0xffff ? byte_to_unary_table[(blurb) >> 8] + 16 : ((blurb) <= 0xffffff ? byte_to_unary_table[(blurb) >> 16] + 8 : byte_to_unary_table[(blurb) >> 24])))
  107. #endif
  108. #else
  109. /* ERROR, only sizes of 8 and 32 are supported */
  110. #endif
  111. #define FLAC__BLURBS_TO_BITS(blurbs) ((blurbs) << FLAC__BITS_PER_BLURB_LOG2)
  112. #ifdef min
  113. #undef min
  114. #endif
  115. #define min(x,y) ((x)<(y)?(x):(y))
  116. #ifdef max
  117. #undef max
  118. #endif
  119. #define max(x,y) ((x)>(y)?(x):(y))
  120. /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
  121. #ifdef _MSC_VER
  122. #define FLAC__U64L(x) x
  123. #else
  124. #define FLAC__U64L(x) x##LLU
  125. #endif
  126. #ifndef FLaC__INLINE
  127. #define FLaC__INLINE
  128. #endif
  129. struct FLAC__BitBuffer {
  130. FLAC__blurb *buffer;
  131. unsigned capacity; /* in blurbs */
  132. unsigned blurbs, bits;
  133. unsigned total_bits; /* must always == FLAC__BITS_PER_BLURB*blurbs+bits */
  134. unsigned consumed_blurbs, consumed_bits;
  135. unsigned total_consumed_bits; /* must always == FLAC__BITS_PER_BLURB*consumed_blurbs+consumed_bits */
  136. FLAC__uint16 read_crc16;
  137. #if FLAC__BITS_PER_BLURB == 32
  138. unsigned crc16_align;
  139. #endif
  140. FLAC__blurb save_head, save_tail;
  141. };
  142. #if FLAC__BITS_PER_BLURB == 32
  143. static void crc16_update_blurb(FLAC__BitBuffer *bb, FLAC__blurb blurb)
  144. {
  145. if(bb->crc16_align == 0) {
  146. FLAC__CRC16_UPDATE(blurb >> 24, bb->read_crc16);
  147. FLAC__CRC16_UPDATE((blurb >> 16) & 0xff, bb->read_crc16);
  148. FLAC__CRC16_UPDATE((blurb >> 8) & 0xff, bb->read_crc16);
  149. FLAC__CRC16_UPDATE(blurb & 0xff, bb->read_crc16);
  150. }
  151. else if(bb->crc16_align == 8) {
  152. FLAC__CRC16_UPDATE((blurb >> 16) & 0xff, bb->read_crc16);
  153. FLAC__CRC16_UPDATE((blurb >> 8) & 0xff, bb->read_crc16);
  154. FLAC__CRC16_UPDATE(blurb & 0xff, bb->read_crc16);
  155. }
  156. else if(bb->crc16_align == 16) {
  157. FLAC__CRC16_UPDATE((blurb >> 8) & 0xff, bb->read_crc16);
  158. FLAC__CRC16_UPDATE(blurb & 0xff, bb->read_crc16);
  159. }
  160. else if(bb->crc16_align == 24) {
  161. FLAC__CRC16_UPDATE(blurb & 0xff, bb->read_crc16);
  162. }
  163. bb->crc16_align = 0;
  164. }
  165. #endif
  166. /*
  167.  * WATCHOUT: The current implentation is not friendly to shrinking, i.e. it
  168.  * does not shift left what is consumed, it just chops off the end, whether
  169.  * there is unconsumed data there or not.  This is OK because currently we
  170.  * never shrink the buffer, but if this ever changes, we'll have to do some
  171.  * fixups here.
  172.  */
  173. static FLAC__bool bitbuffer_resize_(FLAC__BitBuffer *bb, unsigned new_capacity)
  174. {
  175. FLAC__blurb *new_buffer;
  176. FLAC__ASSERT(0 != bb);
  177. FLAC__ASSERT(0 != bb->buffer);
  178. if(bb->capacity == new_capacity)
  179. return true;
  180. new_buffer = (FLAC__blurb*)calloc(new_capacity, sizeof(FLAC__blurb));
  181. if(new_buffer == 0)
  182. return false;
  183. memcpy(new_buffer, bb->buffer, sizeof(FLAC__blurb)*min(bb->blurbs+(bb->bits?1:0), new_capacity));
  184. if(new_capacity < bb->blurbs+(bb->bits?1:0)) {
  185. bb->blurbs = new_capacity;
  186. bb->bits = 0;
  187. bb->total_bits = FLAC__BLURBS_TO_BITS(new_capacity);
  188. }
  189. if(new_capacity < bb->consumed_blurbs+(bb->consumed_bits?1:0)) {
  190. bb->consumed_blurbs = new_capacity;
  191. bb->consumed_bits = 0;
  192. bb->total_consumed_bits = FLAC__BLURBS_TO_BITS(new_capacity);
  193. }
  194. free(bb->buffer); /* we've already asserted above that (0 != bb->buffer) */
  195. bb->buffer = new_buffer;
  196. bb->capacity = new_capacity;
  197. return true;
  198. }
  199. static FLAC__bool bitbuffer_grow_(FLAC__BitBuffer *bb, unsigned min_blurbs_to_add)
  200. {
  201. unsigned new_capacity;
  202. FLAC__ASSERT(min_blurbs_to_add > 0);
  203. new_capacity = max(bb->capacity * 2, bb->capacity + min_blurbs_to_add);
  204. return bitbuffer_resize_(bb, new_capacity);
  205. }
  206. static FLAC__bool bitbuffer_ensure_size_(FLAC__BitBuffer *bb, unsigned bits_to_add)
  207. {
  208. FLAC__ASSERT(0 != bb);
  209. FLAC__ASSERT(0 != bb->buffer);
  210. if(FLAC__BLURBS_TO_BITS(bb->capacity) < bb->total_bits + bits_to_add)
  211. return bitbuffer_grow_(bb, (bits_to_add >> FLAC__BITS_PER_BLURB_LOG2) + 2);
  212. else
  213. return true;
  214. }
  215. static FLAC__bool bitbuffer_read_from_client_(FLAC__BitBuffer *bb, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  216. {
  217. unsigned bytes;
  218. FLAC__byte *target;
  219. /* first shift the unconsumed buffer data toward the front as much as possible */
  220. if(bb->total_consumed_bits >= FLAC__BITS_PER_BLURB) {
  221. #if FLAC__BITS_PER_BLURB == 8
  222. /*
  223.  * memset and memcpy are usually implemented in assembly language
  224.  * by the system libc, and they can be much faster
  225.  */
  226. const unsigned r_end = bb->blurbs + (bb->bits? 1:0);
  227. const unsigned r = bb->consumed_blurbs, l = r_end - r;
  228. memmove(&bb->buffer[0], &bb->buffer[r], l);
  229. memset(&bb->buffer[l], 0, r);
  230. #elif FLAC__BITS_PER_BLURB == 32
  231. /* still needs optimization */
  232. const unsigned r_end = bb->blurbs + (bb->bits? 1:0);
  233. unsigned l = 0, r = bb->consumed_blurbs;
  234. for( ; r < r_end; l++, r++)
  235. bb->buffer[l] = bb->buffer[r];
  236. for( ; l < r_end; l++)
  237. bb->buffer[l] = 0;
  238. #else
  239. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  240. #endif /* FLAC__BITS_PER_BLURB == 32 or 8 */
  241. bb->blurbs -= bb->consumed_blurbs;
  242. bb->total_bits -= FLAC__BLURBS_TO_BITS(bb->consumed_blurbs);
  243. bb->consumed_blurbs = 0;
  244. bb->total_consumed_bits = bb->consumed_bits;
  245. }
  246. /* grow if we need to */
  247. if(bb->capacity <= 1) {
  248. if(!bitbuffer_resize_(bb, 16))
  249. return false;
  250. }
  251. /* set the target for reading, taking into account blurb alignment */
  252. #if FLAC__BITS_PER_BLURB == 8
  253. /* blurb == byte, so no gyrations necessary: */
  254. target = bb->buffer + bb->blurbs;
  255. bytes = bb->capacity - bb->blurbs;
  256. #elif FLAC__BITS_PER_BLURB == 32
  257. /* @@@ WATCHOUT: code currently only works for big-endian: */
  258. FLAC__ASSERT((bb->bits & 7) == 0);
  259. target = (FLAC__byte*)(bb->buffer + bb->blurbs) + (bb->bits >> 3);
  260. bytes = ((bb->capacity - bb->blurbs) << 2) - (bb->bits >> 3); /* i.e. (bb->capacity - bb->blurbs) * FLAC__BYTES_PER_BLURB - (bb->bits / 8) */
  261. #else
  262. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  263. #endif
  264. /* finally, read in some data */
  265. if(!read_callback(target, &bytes, client_data))
  266. return false;
  267. /* now we have to handle partial blurb cases: */
  268. #if FLAC__BITS_PER_BLURB == 8
  269. /* blurb == byte, so no gyrations necessary: */
  270. bb->blurbs += bytes;
  271. bb->total_bits += FLAC__BLURBS_TO_BITS(bytes);
  272. #elif FLAC__BITS_PER_BLURB == 32
  273. /* @@@ WATCHOUT: code currently only works for big-endian: */
  274. {
  275. const unsigned aligned_bytes = (bb->bits >> 3) + bytes;
  276. bb->blurbs += (aligned_bytes >> 2); /* i.e. aligned_bytes / FLAC__BYTES_PER_BLURB */
  277. bb->bits = (aligned_bytes & 3u) << 3; /* i.e. (aligned_bytes % FLAC__BYTES_PER_BLURB) * 8 */
  278. bb->total_bits += (bytes << 3);
  279. }
  280. #else
  281. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  282. #endif
  283. return true;
  284. }
  285. /***********************************************************************
  286.  *
  287.  * Class constructor/destructor
  288.  *
  289.  ***********************************************************************/
  290. FLAC__BitBuffer *FLAC__bitbuffer_new()
  291. {
  292. FLAC__BitBuffer *bb = (FLAC__BitBuffer*)calloc(1, sizeof(FLAC__BitBuffer));
  293. /* calloc() implies:
  294. memset(bb, 0, sizeof(FLAC__BitBuffer));
  295. bb->buffer = 0;
  296. bb->capacity = 0;
  297. bb->blurbs = bb->bits = bb->total_bits = 0;
  298. bb->consumed_blurbs = bb->consumed_bits = bb->total_consumed_bits = 0;
  299. */
  300. return bb;
  301. }
  302. void FLAC__bitbuffer_delete(FLAC__BitBuffer *bb)
  303. {
  304. FLAC__ASSERT(0 != bb);
  305. FLAC__bitbuffer_free(bb);
  306. free(bb);
  307. }
  308. /***********************************************************************
  309.  *
  310.  * Public class methods
  311.  *
  312.  ***********************************************************************/
  313. FLAC__bool FLAC__bitbuffer_init(FLAC__BitBuffer *bb)
  314. {
  315. FLAC__ASSERT(0 != bb);
  316. bb->buffer = 0;
  317. bb->capacity = 0;
  318. bb->blurbs = bb->bits = bb->total_bits = 0;
  319. bb->consumed_blurbs = bb->consumed_bits = bb->total_consumed_bits = 0;
  320. return FLAC__bitbuffer_clear(bb);
  321. }
  322. FLAC__bool FLAC__bitbuffer_init_from(FLAC__BitBuffer *bb, const FLAC__byte buffer[], unsigned bytes)
  323. {
  324. FLAC__ASSERT(0 != bb);
  325. FLAC__ASSERT(bytes > 0);
  326. if(!FLAC__bitbuffer_init(bb))
  327. return false;
  328. if(!bitbuffer_ensure_size_(bb, bytes << 3))
  329. return false;
  330. FLAC__ASSERT(0 != buffer);
  331. /* @@@ WATCHOUT: code currently only works for 8-bits-per-blurb inclusive-or big-endian: */
  332. memcpy((FLAC__byte*)bb->buffer, buffer, sizeof(FLAC__byte)*bytes);
  333. bb->blurbs = bytes / FLAC__BYTES_PER_BLURB;
  334. bb->bits = (bytes % FLAC__BYTES_PER_BLURB) << 3;
  335. bb->total_bits = bytes << 3;
  336. return true;
  337. }
  338. FLAC__bool FLAC__bitbuffer_concatenate_aligned(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src)
  339. {
  340. unsigned bits_to_add = src->total_bits - src->total_consumed_bits;
  341. FLAC__ASSERT(0 != dest);
  342. FLAC__ASSERT(0 != src);
  343. if(bits_to_add == 0)
  344. return true;
  345. if(dest->bits != src->consumed_bits)
  346. return false;
  347. if(!bitbuffer_ensure_size_(dest, bits_to_add))
  348. return false;
  349. if(dest->bits == 0) {
  350. memcpy(dest->buffer+dest->blurbs, src->buffer+src->consumed_blurbs, sizeof(FLAC__blurb)*(src->blurbs-src->consumed_blurbs + ((src->bits)? 1:0)));
  351. }
  352. else if(dest->bits + bits_to_add > FLAC__BITS_PER_BLURB) {
  353. dest->buffer[dest->blurbs] <<= (FLAC__BITS_PER_BLURB - dest->bits);
  354. dest->buffer[dest->blurbs] |= (src->buffer[src->consumed_blurbs] & ((1u << (FLAC__BITS_PER_BLURB-dest->bits)) - 1));
  355. memcpy(dest->buffer+dest->blurbs+1, src->buffer+src->consumed_blurbs+1, sizeof(FLAC__blurb)*(src->blurbs-src->consumed_blurbs-1 + ((src->bits)? 1:0)));
  356. }
  357. else {
  358. dest->buffer[dest->blurbs] <<= bits_to_add;
  359. dest->buffer[dest->blurbs] |= (src->buffer[src->consumed_blurbs] & ((1u << bits_to_add) - 1));
  360. }
  361. dest->bits = src->bits;
  362. dest->total_bits += bits_to_add;
  363. dest->blurbs = dest->total_bits / FLAC__BITS_PER_BLURB;
  364. return true;
  365. }
  366. void FLAC__bitbuffer_free(FLAC__BitBuffer *bb)
  367. {
  368. FLAC__ASSERT(0 != bb);
  369. if(0 != bb->buffer)
  370. free(bb->buffer);
  371. bb->buffer = 0;
  372. bb->capacity = 0;
  373. bb->blurbs = bb->bits = bb->total_bits = 0;
  374. bb->consumed_blurbs = bb->consumed_bits = bb->total_consumed_bits = 0;
  375. }
  376. FLAC__bool FLAC__bitbuffer_clear(FLAC__BitBuffer *bb)
  377. {
  378. if(bb->buffer == 0) {
  379. bb->capacity = FLAC__BITBUFFER_DEFAULT_CAPACITY;
  380. bb->buffer = (FLAC__blurb*)calloc(bb->capacity, sizeof(FLAC__blurb));
  381. if(bb->buffer == 0)
  382. return false;
  383. }
  384. else {
  385. memset(bb->buffer, 0, bb->blurbs + (bb->bits?1:0));
  386. }
  387. bb->blurbs = bb->bits = bb->total_bits = 0;
  388. bb->consumed_blurbs = bb->consumed_bits = bb->total_consumed_bits = 0;
  389. return true;
  390. }
  391. FLAC__bool FLAC__bitbuffer_clone(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src)
  392. {
  393. FLAC__ASSERT(0 != dest);
  394. FLAC__ASSERT(0 != dest->buffer);
  395. FLAC__ASSERT(0 != src);
  396. FLAC__ASSERT(0 != src->buffer);
  397. if(dest->capacity < src->capacity)
  398. if(!bitbuffer_resize_(dest, src->capacity))
  399. return false;
  400. memcpy(dest->buffer, src->buffer, sizeof(FLAC__blurb)*min(src->capacity, src->blurbs+1));
  401. dest->blurbs = src->blurbs;
  402. dest->bits = src->bits;
  403. dest->total_bits = src->total_bits;
  404. dest->consumed_blurbs = src->consumed_blurbs;
  405. dest->consumed_bits = src->consumed_bits;
  406. dest->total_consumed_bits = src->total_consumed_bits;
  407. dest->read_crc16 = src->read_crc16;
  408. return true;
  409. }
  410. void FLAC__bitbuffer_reset_read_crc16(FLAC__BitBuffer *bb, FLAC__uint16 seed)
  411. {
  412. FLAC__ASSERT(0 != bb);
  413. FLAC__ASSERT(0 != bb->buffer);
  414. FLAC__ASSERT((bb->consumed_bits & 7) == 0);
  415. bb->read_crc16 = seed;
  416. #if FLAC__BITS_PER_BLURB == 8
  417. /* no need to do anything */
  418. #elif FLAC__BITS_PER_BLURB == 32
  419. bb->crc16_align = bb->consumed_bits;
  420. #else
  421. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  422. #endif
  423. }
  424. FLAC__uint16 FLAC__bitbuffer_get_read_crc16(FLAC__BitBuffer *bb)
  425. {
  426. FLAC__ASSERT(0 != bb);
  427. FLAC__ASSERT(0 != bb->buffer);
  428. FLAC__ASSERT((bb->bits & 7) == 0);
  429. FLAC__ASSERT((bb->consumed_bits & 7) == 0);
  430. #if FLAC__BITS_PER_BLURB == 8
  431. /* no need to do anything */
  432. #elif FLAC__BITS_PER_BLURB == 32
  433. /*@@@ BUG: even though this probably can't happen with FLAC, need to fix the case where we are called here for the very first blurb and crc16_align is > 0 */
  434. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) {
  435. if(bb->consumed_bits == 8) {
  436. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  437. FLAC__CRC16_UPDATE(blurb >> 24, bb->read_crc16);
  438. }
  439. else if(bb->consumed_bits == 16) {
  440. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  441. FLAC__CRC16_UPDATE(blurb >> 24, bb->read_crc16);
  442. FLAC__CRC16_UPDATE((blurb >> 16) & 0xff, bb->read_crc16);
  443. }
  444. else if(bb->consumed_bits == 24) {
  445. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  446. FLAC__CRC16_UPDATE(blurb >> 24, bb->read_crc16);
  447. FLAC__CRC16_UPDATE((blurb >> 16) & 0xff, bb->read_crc16);
  448. FLAC__CRC16_UPDATE((blurb >> 8) & 0xff, bb->read_crc16);
  449. }
  450. }
  451. else {
  452. if(bb->consumed_bits == 8) {
  453. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  454. FLAC__CRC16_UPDATE(blurb >> (bb->bits-8), bb->read_crc16);
  455. }
  456. else if(bb->consumed_bits == 16) {
  457. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  458. FLAC__CRC16_UPDATE(blurb >> (bb->bits-8), bb->read_crc16);
  459. FLAC__CRC16_UPDATE((blurb >> (bb->bits-16)) & 0xff, bb->read_crc16);
  460. }
  461. else if(bb->consumed_bits == 24) {
  462. const FLAC__blurb blurb = bb->buffer[bb->consumed_blurbs];
  463. FLAC__CRC16_UPDATE(blurb >> (bb->bits-8), bb->read_crc16);
  464. FLAC__CRC16_UPDATE((blurb >> (bb->bits-16)) & 0xff, bb->read_crc16);
  465. FLAC__CRC16_UPDATE((blurb >> (bb->bits-24)) & 0xff, bb->read_crc16);
  466. }
  467. }
  468. bb->crc16_align = bb->consumed_bits;
  469. #else
  470. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  471. #endif
  472. return bb->read_crc16;
  473. }
  474. FLAC__uint16 FLAC__bitbuffer_get_write_crc16(const FLAC__BitBuffer *bb)
  475. {
  476. FLAC__ASSERT((bb->bits & 7) == 0); /* assert that we're byte-aligned */
  477. #if FLAC__BITS_PER_BLURB == 8
  478. return FLAC__crc16(bb->buffer, bb->blurbs);
  479. #elif FLAC__BITS_PER_BLURB == 32
  480. /* @@@ WATCHOUT: code currently only works for big-endian: */
  481. return FLAC__crc16((FLAC__byte*)(bb->buffer), (bb->blurbs * FLAC__BYTES_PER_BLURB) + (bb->bits >> 3));
  482. #else
  483. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  484. #endif
  485. }
  486. FLAC__byte FLAC__bitbuffer_get_write_crc8(const FLAC__BitBuffer *bb)
  487. {
  488. FLAC__ASSERT(0 != bb);
  489. FLAC__ASSERT((bb->bits & 7) == 0); /* assert that we're byte-aligned */
  490. FLAC__ASSERT(bb->buffer[0] == 0xff); /* MAGIC NUMBER for the first byte of the sync code */
  491. #if FLAC__BITS_PER_BLURB == 8
  492. return FLAC__crc8(bb->buffer, bb->blurbs);
  493. #elif FLAC__BITS_PER_BLURB == 32
  494. /* @@@ WATCHOUT: code currently only works for big-endian: */
  495. return FLAC__crc8((FLAC__byte*)(bb->buffer), (bb->blurbs * FLAC__BYTES_PER_BLURB) + (bb->bits >> 3));
  496. #else
  497. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  498. #endif
  499. }
  500. FLAC__bool FLAC__bitbuffer_is_byte_aligned(const FLAC__BitBuffer *bb)
  501. {
  502. return ((bb->bits & 7) == 0);
  503. }
  504. FLAC__bool FLAC__bitbuffer_is_consumed_byte_aligned(const FLAC__BitBuffer *bb)
  505. {
  506. return ((bb->consumed_bits & 7) == 0);
  507. }
  508. unsigned FLAC__bitbuffer_bits_left_for_byte_alignment(const FLAC__BitBuffer *bb)
  509. {
  510. return 8 - (bb->consumed_bits & 7);
  511. }
  512. unsigned FLAC__bitbuffer_get_input_bytes_unconsumed(const FLAC__BitBuffer *bb)
  513. {
  514. FLAC__ASSERT((bb->consumed_bits & 7) == 0 && (bb->bits & 7) == 0);
  515. return (bb->total_bits - bb->total_consumed_bits) >> 3;
  516. }
  517. void FLAC__bitbuffer_get_buffer(FLAC__BitBuffer *bb, const FLAC__byte **buffer, unsigned *bytes)
  518. {
  519. FLAC__ASSERT((bb->consumed_bits & 7) == 0 && (bb->bits & 7) == 0);
  520. #if FLAC__BITS_PER_BLURB == 8
  521. *buffer = bb->buffer + bb->consumed_blurbs;
  522. *bytes = bb->blurbs - bb->consumed_blurbs;
  523. #elif FLAC__BITS_PER_BLURB == 32
  524. /* @@@ WATCHOUT: code currently only works for big-endian: */
  525. *buffer = (FLAC__byte*)(bb->buffer + bb->consumed_blurbs) + (bb->consumed_bits >> 3);
  526. *bytes = (bb->total_bits - bb->total_consumed_bits) >> 3;
  527. #else
  528. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  529. #endif
  530. }
  531. void FLAC__bitbuffer_release_buffer(FLAC__BitBuffer *bb)
  532. {
  533. #if FLAC__BITS_PER_BLURB == 8
  534. (void)bb;
  535. #elif FLAC__BITS_PER_BLURB == 32
  536. /* @@@ WATCHOUT: code currently only works for big-endian: */
  537. (void)bb;
  538. #else
  539. FLAC__ASSERT(false); /* ERROR, only sizes of 8 and 32 are supported */
  540. #endif
  541. }
  542. FLAC__bool FLAC__bitbuffer_write_zeroes(FLAC__BitBuffer *bb, unsigned bits)
  543. {
  544. unsigned n;
  545. FLAC__ASSERT(0 != bb);
  546. FLAC__ASSERT(0 != bb->buffer);
  547. if(bits == 0)
  548. return true;
  549. if(!bitbuffer_ensure_size_(bb, bits))
  550. return false;
  551. bb->total_bits += bits;
  552. while(bits > 0) {
  553. n = min(FLAC__BITS_PER_BLURB - bb->bits, bits);
  554. bb->buffer[bb->blurbs] <<= n;
  555. bits -= n;
  556. bb->bits += n;
  557. if(bb->bits == FLAC__BITS_PER_BLURB) {
  558. bb->blurbs++;
  559. bb->bits = 0;
  560. }
  561. }
  562. return true;
  563. }
  564. FLaC__INLINE FLAC__bool FLAC__bitbuffer_write_raw_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val, unsigned bits)
  565. {
  566. unsigned n, k;
  567. FLAC__ASSERT(0 != bb);
  568. FLAC__ASSERT(0 != bb->buffer);
  569. FLAC__ASSERT(bits <= 32);
  570. if(bits == 0)
  571. return true;
  572. /* inline the size check so we don't incure a function call unnecessarily */
  573. if(FLAC__BLURBS_TO_BITS(bb->capacity) < bb->total_bits + bits) {
  574. if(!bitbuffer_ensure_size_(bb, bits))
  575. return false;
  576. }
  577. /* zero-out unused bits; WATCHOUT: other code relies on this, so this needs to stay */
  578. if(bits < 32) /* @@@ gcc seems to require this because the following line causes incorrect results when bits==32; investigate */
  579. val &= (~(0xffffffff << bits)); /* zero-out unused bits */
  580. bb->total_bits += bits;
  581. while(bits > 0) {
  582. n = FLAC__BITS_PER_BLURB - bb->bits;
  583. if(n == FLAC__BITS_PER_BLURB) { /* i.e. bb->bits == 0 */
  584. if(bits < FLAC__BITS_PER_BLURB) {
  585. bb->buffer[bb->blurbs] = (FLAC__blurb)val;
  586. bb->bits = bits;
  587. break;
  588. }
  589. else if(bits == FLAC__BITS_PER_BLURB) {
  590. bb->buffer[bb->blurbs++] = (FLAC__blurb)val;
  591. break;
  592. }
  593. else {
  594. k = bits - FLAC__BITS_PER_BLURB;
  595. bb->buffer[bb->blurbs++] = (FLAC__blurb)(val >> k);
  596. /* we know k < 32 so no need to protect against the gcc bug mentioned above */
  597. val &= (~(0xffffffff << k));
  598. bits -= FLAC__BITS_PER_BLURB;
  599. }
  600. }
  601. else if(bits <= n) {
  602. bb->buffer[bb->blurbs] <<= bits;
  603. bb->buffer[bb->blurbs] |= val;
  604. if(bits == n) {
  605. bb->blurbs++;
  606. bb->bits = 0;
  607. }
  608. else
  609. bb->bits += bits;
  610. break;
  611. }
  612. else {
  613. k = bits - n;
  614. bb->buffer[bb->blurbs] <<= n;
  615. bb->buffer[bb->blurbs] |= (val >> k);
  616. /* we know n > 0 so k < 32 so no need to protect against the gcc bug mentioned above */
  617. val &= (~(0xffffffff << k));
  618. bits -= n;
  619. bb->blurbs++;
  620. bb->bits = 0;
  621. }
  622. }
  623. return true;
  624. }
  625. FLAC__bool FLAC__bitbuffer_write_raw_int32(FLAC__BitBuffer *bb, FLAC__int32 val, unsigned bits)
  626. {
  627. return FLAC__bitbuffer_write_raw_uint32(bb, (FLAC__uint32)val, bits);
  628. }
  629. FLAC__bool FLAC__bitbuffer_write_raw_uint64(FLAC__BitBuffer *bb, FLAC__uint64 val, unsigned bits)
  630. {
  631. static const FLAC__uint64 mask[] = {
  632. 0,
  633. FLAC__U64L(0x0000000000000001), FLAC__U64L(0x0000000000000003), FLAC__U64L(0x0000000000000007), FLAC__U64L(0x000000000000000F),
  634. FLAC__U64L(0x000000000000001F), FLAC__U64L(0x000000000000003F), FLAC__U64L(0x000000000000007F), FLAC__U64L(0x00000000000000FF),
  635. FLAC__U64L(0x00000000000001FF), FLAC__U64L(0x00000000000003FF), FLAC__U64L(0x00000000000007FF), FLAC__U64L(0x0000000000000FFF),
  636. FLAC__U64L(0x0000000000001FFF), FLAC__U64L(0x0000000000003FFF), FLAC__U64L(0x0000000000007FFF), FLAC__U64L(0x000000000000FFFF),
  637. FLAC__U64L(0x000000000001FFFF), FLAC__U64L(0x000000000003FFFF), FLAC__U64L(0x000000000007FFFF), FLAC__U64L(0x00000000000FFFFF),
  638. FLAC__U64L(0x00000000001FFFFF), FLAC__U64L(0x00000000003FFFFF), FLAC__U64L(0x00000000007FFFFF), FLAC__U64L(0x0000000000FFFFFF),
  639. FLAC__U64L(0x0000000001FFFFFF), FLAC__U64L(0x0000000003FFFFFF), FLAC__U64L(0x0000000007FFFFFF), FLAC__U64L(0x000000000FFFFFFF),
  640. FLAC__U64L(0x000000001FFFFFFF), FLAC__U64L(0x000000003FFFFFFF), FLAC__U64L(0x000000007FFFFFFF), FLAC__U64L(0x00000000FFFFFFFF),
  641. FLAC__U64L(0x00000001FFFFFFFF), FLAC__U64L(0x00000003FFFFFFFF), FLAC__U64L(0x00000007FFFFFFFF), FLAC__U64L(0x0000000FFFFFFFFF),
  642. FLAC__U64L(0x0000001FFFFFFFFF), FLAC__U64L(0x0000003FFFFFFFFF), FLAC__U64L(0x0000007FFFFFFFFF), FLAC__U64L(0x000000FFFFFFFFFF),
  643. FLAC__U64L(0x000001FFFFFFFFFF), FLAC__U64L(0x000003FFFFFFFFFF), FLAC__U64L(0x000007FFFFFFFFFF), FLAC__U64L(0x00000FFFFFFFFFFF),
  644. FLAC__U64L(0x00001FFFFFFFFFFF), FLAC__U64L(0x00003FFFFFFFFFFF), FLAC__U64L(0x00007FFFFFFFFFFF), FLAC__U64L(0x0000FFFFFFFFFFFF),
  645. FLAC__U64L(0x0001FFFFFFFFFFFF), FLAC__U64L(0x0003FFFFFFFFFFFF), FLAC__U64L(0x0007FFFFFFFFFFFF), FLAC__U64L(0x000FFFFFFFFFFFFF),
  646. FLAC__U64L(0x001FFFFFFFFFFFFF), FLAC__U64L(0x003FFFFFFFFFFFFF), FLAC__U64L(0x007FFFFFFFFFFFFF), FLAC__U64L(0x00FFFFFFFFFFFFFF),
  647. FLAC__U64L(0x01FFFFFFFFFFFFFF), FLAC__U64L(0x03FFFFFFFFFFFFFF), FLAC__U64L(0x07FFFFFFFFFFFFFF), FLAC__U64L(0x0FFFFFFFFFFFFFFF),
  648. FLAC__U64L(0x1FFFFFFFFFFFFFFF), FLAC__U64L(0x3FFFFFFFFFFFFFFF), FLAC__U64L(0x7FFFFFFFFFFFFFFF), FLAC__U64L(0xFFFFFFFFFFFFFFFF)
  649. };
  650. unsigned n, k;
  651. FLAC__ASSERT(0 != bb);
  652. FLAC__ASSERT(0 != bb->buffer);
  653. FLAC__ASSERT(bits <= 64);
  654. if(bits == 0)
  655. return true;
  656. if(!bitbuffer_ensure_size_(bb, bits))
  657. return false;
  658. val &= mask[bits];
  659. bb->total_bits += bits;
  660. while(bits > 0) {
  661. if(bb->bits == 0) {
  662. if(bits < FLAC__BITS_PER_BLURB) {
  663. bb->buffer[bb->blurbs] = (FLAC__blurb)val;
  664. bb->bits = bits;
  665. break;
  666. }
  667. else if(bits == FLAC__BITS_PER_BLURB) {
  668. bb->buffer[bb->blurbs++] = (FLAC__blurb)val;
  669. break;
  670. }
  671. else {
  672. k = bits - FLAC__BITS_PER_BLURB;
  673. bb->buffer[bb->blurbs++] = (FLAC__blurb)(val >> k);
  674. /* we know k < 64 so no need to protect against the gcc bug mentioned above */
  675. val &= (~(FLAC__U64L(0xffffffffffffffff) << k));
  676. bits -= FLAC__BITS_PER_BLURB;
  677. }
  678. }
  679. else {
  680. n = min(FLAC__BITS_PER_BLURB - bb->bits, bits);
  681. k = bits - n;
  682. bb->buffer[bb->blurbs] <<= n;
  683. bb->buffer[bb->blurbs] |= (val >> k);
  684. /* we know n > 0 so k < 64 so no need to protect against the gcc bug mentioned above */
  685. val &= (~(FLAC__U64L(0xffffffffffffffff) << k));
  686. bits -= n;
  687. bb->bits += n;
  688. if(bb->bits == FLAC__BITS_PER_BLURB) {
  689. bb->blurbs++;
  690. bb->bits = 0;
  691. }
  692. }
  693. }
  694. return true;
  695. }
  696. #if 0 /* UNUSED */
  697. FLAC__bool FLAC__bitbuffer_write_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 val, unsigned bits)
  698. {
  699. return FLAC__bitbuffer_write_raw_uint64(bb, (FLAC__uint64)val, bits);
  700. }
  701. #endif
  702. FLaC__INLINE FLAC__bool FLAC__bitbuffer_write_raw_uint32_little_endian(FLAC__BitBuffer *bb, FLAC__uint32 val)
  703. {
  704. /* this doesn't need to be that fast as currently it is only used for vorbis comments */
  705. /* NOTE: we rely on the fact that FLAC__bitbuffer_write_raw_uint32() masks out the unused bits */
  706. if(!FLAC__bitbuffer_write_raw_uint32(bb, val, 8))
  707. return false;
  708. if(!FLAC__bitbuffer_write_raw_uint32(bb, val>>8, 8))
  709. return false;
  710. if(!FLAC__bitbuffer_write_raw_uint32(bb, val>>16, 8))
  711. return false;
  712. if(!FLAC__bitbuffer_write_raw_uint32(bb, val>>24, 8))
  713. return false;
  714. return true;
  715. }
  716. FLaC__INLINE FLAC__bool FLAC__bitbuffer_write_byte_block(FLAC__BitBuffer *bb, const FLAC__byte vals[], unsigned nvals)
  717. {
  718. unsigned i;
  719. /* this could be faster but currently we don't need it to be */
  720. for(i = 0; i < nvals; i++) {
  721. if(!FLAC__bitbuffer_write_raw_uint32(bb, (FLAC__uint32)(vals[i]), 8))
  722. return false;
  723. }
  724. return true;
  725. }
  726. FLAC__bool FLAC__bitbuffer_write_unary_unsigned(FLAC__BitBuffer *bb, unsigned val)
  727. {
  728. if(val < 32)
  729. return FLAC__bitbuffer_write_raw_uint32(bb, 1, ++val);
  730. else if(val < 64)
  731. return FLAC__bitbuffer_write_raw_uint64(bb, 1, ++val);
  732. else {
  733. if(!FLAC__bitbuffer_write_zeroes(bb, val))
  734. return false;
  735. return FLAC__bitbuffer_write_raw_uint32(bb, 1, 1);
  736. }
  737. }
  738. unsigned FLAC__bitbuffer_rice_bits(int val, unsigned parameter)
  739. {
  740. unsigned msbs, uval;
  741. /* fold signed to unsigned */
  742. if(val < 0)
  743. /* equivalent to
  744.  *     (unsigned)(((--val) << 1) - 1);
  745.  * but without the overflow problem at MININT
  746.  */
  747. uval = (unsigned)(((-(++val)) << 1) + 1);
  748. else
  749. uval = (unsigned)(val << 1);
  750. msbs = uval >> parameter;
  751. return 1 + parameter + msbs;
  752. }
  753. #if 0 /* UNUSED */
  754. unsigned FLAC__bitbuffer_golomb_bits_signed(int val, unsigned parameter)
  755. {
  756. unsigned bits, msbs, uval;
  757. unsigned k;
  758. FLAC__ASSERT(parameter > 0);
  759. /* fold signed to unsigned */
  760. if(val < 0)
  761. /* equivalent to
  762.  *     (unsigned)(((--val) << 1) - 1);
  763.  * but without the overflow problem at MININT
  764.  */
  765. uval = (unsigned)(((-(++val)) << 1) + 1);
  766. else
  767. uval = (unsigned)(val << 1);
  768. k = FLAC__bitmath_ilog2(parameter);
  769. if(parameter == 1u<<k) {
  770. FLAC__ASSERT(k <= 30);
  771. msbs = uval >> k;
  772. bits = 1 + k + msbs;
  773. }
  774. else {
  775. unsigned q, r, d;
  776. d = (1 << (k+1)) - parameter;
  777. q = uval / parameter;
  778. r = uval - (q * parameter);
  779. bits = 1 + q + k;
  780. if(r >= d)
  781. bits++;
  782. }
  783. return bits;
  784. }
  785. unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned uval, unsigned parameter)
  786. {
  787. unsigned bits, msbs;
  788. unsigned k;
  789. FLAC__ASSERT(parameter > 0);
  790. k = FLAC__bitmath_ilog2(parameter);
  791. if(parameter == 1u<<k) {
  792. FLAC__ASSERT(k <= 30);
  793. msbs = uval >> k;
  794. bits = 1 + k + msbs;
  795. }
  796. else {
  797. unsigned q, r, d;
  798. d = (1 << (k+1)) - parameter;
  799. q = uval / parameter;
  800. r = uval - (q * parameter);
  801. bits = 1 + q + k;
  802. if(r >= d)
  803. bits++;
  804. }
  805. return bits;
  806. }
  807. #endif /* UNUSED */
  808. #ifdef FLAC__SYMMETRIC_RICE
  809. FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
  810. {
  811. unsigned total_bits, interesting_bits, msbs;
  812. FLAC__uint32 pattern;
  813. FLAC__ASSERT(0 != bb);
  814. FLAC__ASSERT(0 != bb->buffer);
  815. FLAC__ASSERT(parameter <= 31);
  816. /* init pattern with the unary end bit and the sign bit */
  817. if(val < 0) {
  818. pattern = 3;
  819. val = -val;
  820. }
  821. else
  822. pattern = 2;
  823. msbs = val >> parameter;
  824. interesting_bits = 2 + parameter;
  825. total_bits = interesting_bits + msbs;
  826. pattern <<= parameter;
  827. pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
  828. if(total_bits <= 32) {
  829. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  830. return false;
  831. }
  832. else {
  833. /* write the unary MSBs */
  834. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  835. return false;
  836. /* write the unary end bit, the sign bit, and binary LSBs */
  837. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
  838. return false;
  839. }
  840. return true;
  841. }
  842. #if 0 /* UNUSED */
  843. FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow)
  844. {
  845. unsigned total_bits, interesting_bits, msbs;
  846. FLAC__uint32 pattern;
  847. FLAC__ASSERT(0 != bb);
  848. FLAC__ASSERT(0 != bb->buffer);
  849. FLAC__ASSERT(parameter <= 31);
  850. *overflow = false;
  851. /* init pattern with the unary end bit and the sign bit */
  852. if(val < 0) {
  853. pattern = 3;
  854. val = -val;
  855. }
  856. else
  857. pattern = 2;
  858. msbs = val >> parameter;
  859. interesting_bits = 2 + parameter;
  860. total_bits = interesting_bits + msbs;
  861. pattern <<= parameter;
  862. pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
  863. if(total_bits <= 32) {
  864. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  865. return false;
  866. }
  867. else if(total_bits > max_bits) {
  868. *overflow = true;
  869. return true;
  870. }
  871. else {
  872. /* write the unary MSBs */
  873. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  874. return false;
  875. /* write the unary end bit, the sign bit, and binary LSBs */
  876. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
  877. return false;
  878. }
  879. return true;
  880. }
  881. #endif /* UNUSED */
  882. FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_escape(FLAC__BitBuffer *bb, int val, unsigned parameter)
  883. {
  884. unsigned total_bits, val_bits;
  885. FLAC__uint32 pattern;
  886. FLAC__ASSERT(0 != bb);
  887. FLAC__ASSERT(0 != bb->buffer);
  888. FLAC__ASSERT(parameter <= 31);
  889. val_bits = FLAC__bitmath_silog2(val);
  890. total_bits = 2 + parameter + 5 + val_bits;
  891. if(total_bits <= 32) {
  892. pattern = 3;
  893. pattern <<= (parameter + 5);
  894. pattern |= val_bits;
  895. pattern <<= val_bits;
  896. pattern |= (val & ((1 << val_bits) - 1));
  897. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  898. return false;
  899. }
  900. else {
  901. /* write the '-0' escape code first */
  902. if(!FLAC__bitbuffer_write_raw_uint32(bb, 3u << parameter, 2+parameter))
  903. return false;
  904. /* write the length */
  905. if(!FLAC__bitbuffer_write_raw_uint32(bb, val_bits, 5))
  906. return false;
  907. /* write the value */
  908. if(!FLAC__bitbuffer_write_raw_int32(bb, val, val_bits))
  909. return false;
  910. }
  911. return true;
  912. }
  913. #endif /* ifdef FLAC__SYMMETRIC_RICE */
  914. FLAC__bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
  915. {
  916. unsigned total_bits, interesting_bits, msbs, uval;
  917. FLAC__uint32 pattern;
  918. FLAC__ASSERT(0 != bb);
  919. FLAC__ASSERT(0 != bb->buffer);
  920. FLAC__ASSERT(parameter <= 30);
  921. /* fold signed to unsigned */
  922. if(val < 0)
  923. /* equivalent to
  924.  *     (unsigned)(((--val) << 1) - 1);
  925.  * but without the overflow problem at MININT
  926.  */
  927. uval = (unsigned)(((-(++val)) << 1) + 1);
  928. else
  929. uval = (unsigned)(val << 1);
  930. msbs = uval >> parameter;
  931. interesting_bits = 1 + parameter;
  932. total_bits = interesting_bits + msbs;
  933. pattern = 1 << parameter; /* the unary end bit */
  934. pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
  935. if(total_bits <= 32) {
  936. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  937. return false;
  938. }
  939. else {
  940. /* write the unary MSBs */
  941. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  942. return false;
  943. /* write the unary end bit and binary LSBs */
  944. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
  945. return false;
  946. }
  947. return true;
  948. }
  949. #if 0 /* UNUSED */
  950. FLAC__bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow)
  951. {
  952. unsigned total_bits, interesting_bits, msbs, uval;
  953. FLAC__uint32 pattern;
  954. FLAC__ASSERT(0 != bb);
  955. FLAC__ASSERT(0 != bb->buffer);
  956. FLAC__ASSERT(parameter <= 30);
  957. *overflow = false;
  958. /* fold signed to unsigned */
  959. if(val < 0)
  960. /* equivalent to
  961.  *     (unsigned)(((--val) << 1) - 1);
  962.  * but without the overflow problem at MININT
  963.  */
  964. uval = (unsigned)(((-(++val)) << 1) + 1);
  965. else
  966. uval = (unsigned)(val << 1);
  967. msbs = uval >> parameter;
  968. interesting_bits = 1 + parameter;
  969. total_bits = interesting_bits + msbs;
  970. pattern = 1 << parameter; /* the unary end bit */
  971. pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
  972. if(total_bits <= 32) {
  973. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  974. return false;
  975. }
  976. else if(total_bits > max_bits) {
  977. *overflow = true;
  978. return true;
  979. }
  980. else {
  981. /* write the unary MSBs */
  982. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  983. return false;
  984. /* write the unary end bit and binary LSBs */
  985. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
  986. return false;
  987. }
  988. return true;
  989. }
  990. #endif /* UNUSED */
  991. #if 0 /* UNUSED */
  992. FLAC__bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
  993. {
  994. unsigned total_bits, msbs, uval;
  995. unsigned k;
  996. FLAC__ASSERT(0 != bb);
  997. FLAC__ASSERT(0 != bb->buffer);
  998. FLAC__ASSERT(parameter > 0);
  999. /* fold signed to unsigned */
  1000. if(val < 0)
  1001. /* equivalent to
  1002.  *     (unsigned)(((--val) << 1) - 1);
  1003.  * but without the overflow problem at MININT
  1004.  */
  1005. uval = (unsigned)(((-(++val)) << 1) + 1);
  1006. else
  1007. uval = (unsigned)(val << 1);
  1008. k = FLAC__bitmath_ilog2(parameter);
  1009. if(parameter == 1u<<k) {
  1010. unsigned pattern;
  1011. FLAC__ASSERT(k <= 30);
  1012. msbs = uval >> k;
  1013. total_bits = 1 + k + msbs;
  1014. pattern = 1 << k; /* the unary end bit */
  1015. pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
  1016. if(total_bits <= 32) {
  1017. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  1018. return false;
  1019. }
  1020. else {
  1021. /* write the unary MSBs */
  1022. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  1023. return false;
  1024. /* write the unary end bit and binary LSBs */
  1025. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1))
  1026. return false;
  1027. }
  1028. }
  1029. else {
  1030. unsigned q, r, d;
  1031. d = (1 << (k+1)) - parameter;
  1032. q = uval / parameter;
  1033. r = uval - (q * parameter);
  1034. /* write the unary MSBs */
  1035. if(!FLAC__bitbuffer_write_zeroes(bb, q))
  1036. return false;
  1037. /* write the unary end bit */
  1038. if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1))
  1039. return false;
  1040. /* write the binary LSBs */
  1041. if(r >= d) {
  1042. if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1))
  1043. return false;
  1044. }
  1045. else {
  1046. if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k))
  1047. return false;
  1048. }
  1049. }
  1050. return true;
  1051. }
  1052. FLAC__bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned uval, unsigned parameter)
  1053. {
  1054. unsigned total_bits, msbs;
  1055. unsigned k;
  1056. FLAC__ASSERT(0 != bb);
  1057. FLAC__ASSERT(0 != bb->buffer);
  1058. FLAC__ASSERT(parameter > 0);
  1059. k = FLAC__bitmath_ilog2(parameter);
  1060. if(parameter == 1u<<k) {
  1061. unsigned pattern;
  1062. FLAC__ASSERT(k <= 30);
  1063. msbs = uval >> k;
  1064. total_bits = 1 + k + msbs;
  1065. pattern = 1 << k; /* the unary end bit */
  1066. pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
  1067. if(total_bits <= 32) {
  1068. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
  1069. return false;
  1070. }
  1071. else {
  1072. /* write the unary MSBs */
  1073. if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
  1074. return false;
  1075. /* write the unary end bit and binary LSBs */
  1076. if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1))
  1077. return false;
  1078. }
  1079. }
  1080. else {
  1081. unsigned q, r, d;
  1082. d = (1 << (k+1)) - parameter;
  1083. q = uval / parameter;
  1084. r = uval - (q * parameter);
  1085. /* write the unary MSBs */
  1086. if(!FLAC__bitbuffer_write_zeroes(bb, q))
  1087. return false;
  1088. /* write the unary end bit */
  1089. if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1))
  1090. return false;
  1091. /* write the binary LSBs */
  1092. if(r >= d) {
  1093. if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1))
  1094. return false;
  1095. }
  1096. else {
  1097. if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k))
  1098. return false;
  1099. }
  1100. }
  1101. return true;
  1102. }
  1103. #endif /* UNUSED */
  1104. FLAC__bool FLAC__bitbuffer_write_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val)
  1105. {
  1106. FLAC__bool ok = 1;
  1107. FLAC__ASSERT(0 != bb);
  1108. FLAC__ASSERT(0 != bb->buffer);
  1109. FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */
  1110. if(val < 0x80) {
  1111. return FLAC__bitbuffer_write_raw_uint32(bb, val, 8);
  1112. }
  1113. else if(val < 0x800) {
  1114. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xC0 | (val>>6), 8);
  1115. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
  1116. }
  1117. else if(val < 0x10000) {
  1118. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xE0 | (val>>12), 8);
  1119. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
  1120. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
  1121. }
  1122. else if(val < 0x200000) {
  1123. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF0 | (val>>18), 8);
  1124. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
  1125. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
  1126. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
  1127. }
  1128. else if(val < 0x4000000) {
  1129. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF8 | (val>>24), 8);
  1130. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8);
  1131. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
  1132. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
  1133. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
  1134. }
  1135. else {
  1136. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFC | (val>>30), 8);
  1137. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>24)&0x3F), 8);
  1138. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8);
  1139. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
  1140. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
  1141. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
  1142. }
  1143. return ok;
  1144. }
  1145. FLAC__bool FLAC__bitbuffer_write_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 val)
  1146. {
  1147. FLAC__bool ok = 1;
  1148. FLAC__ASSERT(0 != bb);
  1149. FLAC__ASSERT(0 != bb->buffer);
  1150. FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */
  1151. if(val < 0x80) {
  1152. return FLAC__bitbuffer_write_raw_uint32(bb, (FLAC__uint32)val, 8);
  1153. }
  1154. else if(val < 0x800) {
  1155. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xC0 | (FLAC__uint32)(val>>6), 8);
  1156. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1157. }
  1158. else if(val < 0x10000) {
  1159. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xE0 | (FLAC__uint32)(val>>12), 8);
  1160. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
  1161. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1162. }
  1163. else if(val < 0x200000) {
  1164. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF0 | (FLAC__uint32)(val>>18), 8);
  1165. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
  1166. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
  1167. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1168. }
  1169. else if(val < 0x4000000) {
  1170. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF8 | (FLAC__uint32)(val>>24), 8);
  1171. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
  1172. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
  1173. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
  1174. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1175. }
  1176. else if(val < 0x80000000) {
  1177. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFC | (FLAC__uint32)(val>>30), 8);
  1178. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8);
  1179. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
  1180. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
  1181. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
  1182. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1183. }
  1184. else {
  1185. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFE, 8);
  1186. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8);
  1187. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8);
  1188. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8);
  1189. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8);
  1190. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8);
  1191. ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (FLAC__uint32)(val&0x3F), 8);
  1192. }
  1193. return ok;
  1194. }
  1195. FLAC__bool FLAC__bitbuffer_zero_pad_to_byte_boundary(FLAC__BitBuffer *bb)
  1196. {
  1197. /* 0-pad to byte boundary */
  1198. if(bb->bits & 7u)
  1199. return FLAC__bitbuffer_write_zeroes(bb, 8 - (bb->bits & 7u));
  1200. else
  1201. return true;
  1202. }
  1203. FLAC__bool FLAC__bitbuffer_peek_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1204. {
  1205. /* to avoid a drastic speed penalty we don't:
  1206. FLAC__ASSERT(0 != bb);
  1207. FLAC__ASSERT(0 != bb->buffer);
  1208. FLAC__ASSERT(bb->bits == 0);
  1209. */
  1210. while(1) {
  1211. if(bb->total_consumed_bits < bb->total_bits) {
  1212. *val = (bb->buffer[bb->consumed_blurbs] & BLURB_BIT_TO_MASK(bb->consumed_bits))? 1 : 0;
  1213. return true;
  1214. }
  1215. else {
  1216. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1217. return false;
  1218. }
  1219. }
  1220. }
  1221. FLAC__bool FLAC__bitbuffer_read_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1222. {
  1223. /* to avoid a drastic speed penalty we don't:
  1224. FLAC__ASSERT(0 != bb);
  1225. FLAC__ASSERT(0 != bb->buffer);
  1226. FLAC__ASSERT(bb->bits == 0);
  1227. */
  1228. while(1) {
  1229. if(bb->total_consumed_bits < bb->total_bits) {
  1230. *val = (bb->buffer[bb->consumed_blurbs] & BLURB_BIT_TO_MASK(bb->consumed_bits))? 1 : 0;
  1231. bb->consumed_bits++;
  1232. if(bb->consumed_bits == FLAC__BITS_PER_BLURB) {
  1233. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1234. bb->consumed_blurbs++;
  1235. bb->consumed_bits = 0;
  1236. }
  1237. bb->total_consumed_bits++;
  1238. return true;
  1239. }
  1240. else {
  1241. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1242. return false;
  1243. }
  1244. }
  1245. }
  1246. FLAC__bool FLAC__bitbuffer_read_bit_to_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1247. {
  1248. /* to avoid a drastic speed penalty we don't:
  1249. FLAC__ASSERT(0 != bb);
  1250. FLAC__ASSERT(0 != bb->buffer);
  1251. FLAC__ASSERT(bb->bits == 0);
  1252. */
  1253. while(1) {
  1254. if(bb->total_consumed_bits < bb->total_bits) {
  1255. *val <<= 1;
  1256. *val |= (bb->buffer[bb->consumed_blurbs] & BLURB_BIT_TO_MASK(bb->consumed_bits))? 1 : 0;
  1257. bb->consumed_bits++;
  1258. if(bb->consumed_bits == FLAC__BITS_PER_BLURB) {
  1259. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1260. bb->consumed_blurbs++;
  1261. bb->consumed_bits = 0;
  1262. }
  1263. bb->total_consumed_bits++;
  1264. return true;
  1265. }
  1266. else {
  1267. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1268. return false;
  1269. }
  1270. }
  1271. }
  1272. FLAC__bool FLAC__bitbuffer_read_bit_to_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1273. {
  1274. /* to avoid a drastic speed penalty we don't:
  1275. FLAC__ASSERT(0 != bb);
  1276. FLAC__ASSERT(0 != bb->buffer);
  1277. FLAC__ASSERT(bb->bits == 0);
  1278. */
  1279. while(1) {
  1280. if(bb->total_consumed_bits < bb->total_bits) {
  1281. *val <<= 1;
  1282. *val |= (bb->buffer[bb->consumed_blurbs] & BLURB_BIT_TO_MASK(bb->consumed_bits))? 1 : 0;
  1283. bb->consumed_bits++;
  1284. if(bb->consumed_bits == FLAC__BITS_PER_BLURB) {
  1285. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1286. bb->consumed_blurbs++;
  1287. bb->consumed_bits = 0;
  1288. }
  1289. bb->total_consumed_bits++;
  1290. return true;
  1291. }
  1292. else {
  1293. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1294. return false;
  1295. }
  1296. }
  1297. }
  1298. FLaC__INLINE FLAC__bool FLAC__bitbuffer_read_raw_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1299. #ifdef FLAC__NO_MANUAL_INLINING
  1300. {
  1301. unsigned i;
  1302. FLAC__ASSERT(0 != bb);
  1303. FLAC__ASSERT(0 != bb->buffer);
  1304. FLAC__ASSERT(bits <= 32);
  1305. *val = 0;
  1306. for(i = 0; i < bits; i++) {
  1307. if(!FLAC__bitbuffer_read_bit_to_uint32(bb, val, read_callback, client_data))
  1308. return false;
  1309. }
  1310. return true;
  1311. }
  1312. #else
  1313. {
  1314. unsigned i, bits_ = bits;
  1315. FLAC__uint32 v = 0;
  1316. FLAC__ASSERT(0 != bb);
  1317. FLAC__ASSERT(0 != bb->buffer);
  1318. FLAC__ASSERT(bits <= 32);
  1319. FLAC__ASSERT((bb->capacity*FLAC__BITS_PER_BLURB) * 2 >= bits);
  1320. if(bits == 0) {
  1321. *val = 0;
  1322. return true;
  1323. }
  1324. while(bb->total_consumed_bits + bits > bb->total_bits) {
  1325. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1326. return false;
  1327. }
  1328. #if FLAC__BITS_PER_BLURB > 8
  1329. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) { /*@@@ comment on why this is here*/
  1330. #endif
  1331. if(bb->consumed_bits) {
  1332. i = FLAC__BITS_PER_BLURB - bb->consumed_bits;
  1333. if(i <= bits_) {
  1334. v = bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits);
  1335. bits_ -= i;
  1336. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1337. bb->consumed_blurbs++;
  1338. bb->consumed_bits = 0;
  1339. /* we hold off updating bb->total_consumed_bits until the end */
  1340. }
  1341. else {
  1342. *val = (bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits)) >> (i-bits_);
  1343. bb->consumed_bits += bits_;
  1344. bb->total_consumed_bits += bits_;
  1345. return true;
  1346. }
  1347. }
  1348. #if FLAC__BITS_PER_BLURB == 32
  1349. /* note that we know bits_ cannot be > 32 because of previous assertions */
  1350. if(bits_ == FLAC__BITS_PER_BLURB) {
  1351. v = bb->buffer[bb->consumed_blurbs];
  1352. CRC16_UPDATE_BLURB(bb, v, bb->read_crc16);
  1353. bb->consumed_blurbs++;
  1354. /* bb->consumed_bits is already 0 */
  1355. bb->total_consumed_bits += bits;
  1356. *val = v;
  1357. return true;
  1358. }
  1359. #else
  1360. while(bits_ >= FLAC__BITS_PER_BLURB) {
  1361. v <<= FLAC__BITS_PER_BLURB;
  1362. v |= bb->buffer[bb->consumed_blurbs];
  1363. bits_ -= FLAC__BITS_PER_BLURB;
  1364. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1365. bb->consumed_blurbs++;
  1366. /* bb->consumed_bits is already 0 */
  1367. /* we hold off updating bb->total_consumed_bits until the end */
  1368. }
  1369. #endif
  1370. if(bits_ > 0) {
  1371. v <<= bits_;
  1372. v |= (bb->buffer[bb->consumed_blurbs] >> (FLAC__BITS_PER_BLURB-bits_));
  1373. bb->consumed_bits = bits_;
  1374. /* we hold off updating bb->total_consumed_bits until the end */
  1375. }
  1376. bb->total_consumed_bits += bits;
  1377. *val = v;
  1378. #if FLAC__BITS_PER_BLURB > 8
  1379. }
  1380. else {
  1381. *val = 0;
  1382. for(i = 0; i < bits; i++) {
  1383. if(!FLAC__bitbuffer_read_bit_to_uint32(bb, val, read_callback, client_data))
  1384. return false;
  1385. }
  1386. }
  1387. #endif
  1388. return true;
  1389. }
  1390. #endif
  1391. FLAC__bool FLAC__bitbuffer_read_raw_int32(FLAC__BitBuffer *bb, FLAC__int32 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1392. #ifdef FLAC__NO_MANUAL_INLINING
  1393. {
  1394. unsigned i;
  1395. FLAC__uint32 v;
  1396. FLAC__ASSERT(0 != bb);
  1397. FLAC__ASSERT(0 != bb->buffer);
  1398. FLAC__ASSERT(bits <= 32);
  1399. if(bits == 0) {
  1400. *val = 0;
  1401. return true;
  1402. }
  1403. v = 0;
  1404. for(i = 0; i < bits; i++) {
  1405. if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &v, read_callback, client_data))
  1406. return false;
  1407. }
  1408. /* fix the sign */
  1409. i = 32 - bits;
  1410. if(i) {
  1411. v <<= i;
  1412. *val = (FLAC__int32)v;
  1413. *val >>= i;
  1414. }
  1415. else
  1416. *val = (FLAC__int32)v;
  1417. return true;
  1418. }
  1419. #else
  1420. {
  1421. unsigned i, bits_ = bits;
  1422. FLAC__uint32 v = 0;
  1423. FLAC__ASSERT(0 != bb);
  1424. FLAC__ASSERT(0 != bb->buffer);
  1425. FLAC__ASSERT(bits <= 32);
  1426. FLAC__ASSERT((bb->capacity*FLAC__BITS_PER_BLURB) * 2 >= bits);
  1427. if(bits == 0) {
  1428. *val = 0;
  1429. return true;
  1430. }
  1431. while(bb->total_consumed_bits + bits > bb->total_bits) {
  1432. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1433. return false;
  1434. }
  1435. #if FLAC__BITS_PER_BLURB > 8
  1436. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) { /*@@@ comment on why this is here*/
  1437. #endif
  1438. if(bb->consumed_bits) {
  1439. i = FLAC__BITS_PER_BLURB - bb->consumed_bits;
  1440. if(i <= bits_) {
  1441. v = bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits);
  1442. bits_ -= i;
  1443. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1444. bb->consumed_blurbs++;
  1445. bb->consumed_bits = 0;
  1446. /* we hold off updating bb->total_consumed_bits until the end */
  1447. }
  1448. else {
  1449. /* bits_ must be < FLAC__BITS_PER_BLURB-1 if we get to here */
  1450. v = (bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits));
  1451. v <<= (32-i);
  1452. *val = (FLAC__int32)v;
  1453. *val >>= (32-bits_);
  1454. bb->consumed_bits += bits_;
  1455. bb->total_consumed_bits += bits_;
  1456. return true;
  1457. }
  1458. }
  1459. #if FLAC__BITS_PER_BLURB == 32
  1460. /* note that we know bits_ cannot be > 32 because of previous assertions */
  1461. if(bits_ == FLAC__BITS_PER_BLURB) {
  1462. v = bb->buffer[bb->consumed_blurbs];
  1463. bits_ = 0;
  1464. CRC16_UPDATE_BLURB(bb, v, bb->read_crc16);
  1465. bb->consumed_blurbs++;
  1466. /* bb->consumed_bits is already 0 */
  1467. /* we hold off updating bb->total_consumed_bits until the end */
  1468. }
  1469. #else
  1470. while(bits_ >= FLAC__BITS_PER_BLURB) {
  1471. v <<= FLAC__BITS_PER_BLURB;
  1472. v |= bb->buffer[bb->consumed_blurbs];
  1473. bits_ -= FLAC__BITS_PER_BLURB;
  1474. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1475. bb->consumed_blurbs++;
  1476. /* bb->consumed_bits is already 0 */
  1477. /* we hold off updating bb->total_consumed_bits until the end */
  1478. }
  1479. #endif
  1480. if(bits_ > 0) {
  1481. v <<= bits_;
  1482. v |= (bb->buffer[bb->consumed_blurbs] >> (FLAC__BITS_PER_BLURB-bits_));
  1483. bb->consumed_bits = bits_;
  1484. /* we hold off updating bb->total_consumed_bits until the end */
  1485. }
  1486. bb->total_consumed_bits += bits;
  1487. #if FLAC__BITS_PER_BLURB > 8
  1488. }
  1489. else {
  1490. for(i = 0; i < bits; i++) {
  1491. if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &v, read_callback, client_data))
  1492. return false;
  1493. }
  1494. }
  1495. #endif
  1496. /* fix the sign */
  1497. i = 32 - bits;
  1498. if(i) {
  1499. v <<= i;
  1500. *val = (FLAC__int32)v;
  1501. *val >>= i;
  1502. }
  1503. else
  1504. *val = (FLAC__int32)v;
  1505. return true;
  1506. }
  1507. #endif
  1508. FLAC__bool FLAC__bitbuffer_read_raw_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1509. #ifdef FLAC__NO_MANUAL_INLINING
  1510. {
  1511. unsigned i;
  1512. FLAC__ASSERT(0 != bb);
  1513. FLAC__ASSERT(0 != bb->buffer);
  1514. FLAC__ASSERT(bits <= 64);
  1515. *val = 0;
  1516. for(i = 0; i < bits; i++) {
  1517. if(!FLAC__bitbuffer_read_bit_to_uint64(bb, val, read_callback, client_data))
  1518. return false;
  1519. }
  1520. return true;
  1521. }
  1522. #else
  1523. {
  1524. unsigned i, bits_ = bits;
  1525. FLAC__uint64 v = 0;
  1526. FLAC__ASSERT(0 != bb);
  1527. FLAC__ASSERT(0 != bb->buffer);
  1528. FLAC__ASSERT(bits <= 64);
  1529. FLAC__ASSERT((bb->capacity*FLAC__BITS_PER_BLURB) * 2 >= bits);
  1530. if(bits == 0) {
  1531. *val = 0;
  1532. return true;
  1533. }
  1534. while(bb->total_consumed_bits + bits > bb->total_bits) {
  1535. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1536. return false;
  1537. }
  1538. #if FLAC__BITS_PER_BLURB > 8
  1539. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) { /*@@@ comment on why this is here*/
  1540. #endif
  1541. if(bb->consumed_bits) {
  1542. i = FLAC__BITS_PER_BLURB - bb->consumed_bits;
  1543. if(i <= bits_) {
  1544. v = bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits);
  1545. bits_ -= i;
  1546. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1547. bb->consumed_blurbs++;
  1548. bb->consumed_bits = 0;
  1549. /* we hold off updating bb->total_consumed_bits until the end */
  1550. }
  1551. else {
  1552. *val = (bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits)) >> (i-bits_);
  1553. bb->consumed_bits += bits_;
  1554. bb->total_consumed_bits += bits_;
  1555. return true;
  1556. }
  1557. }
  1558. while(bits_ >= FLAC__BITS_PER_BLURB) {
  1559. v <<= FLAC__BITS_PER_BLURB;
  1560. v |= bb->buffer[bb->consumed_blurbs];
  1561. bits_ -= FLAC__BITS_PER_BLURB;
  1562. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1563. bb->consumed_blurbs++;
  1564. /* bb->consumed_bits is already 0 */
  1565. /* we hold off updating bb->total_consumed_bits until the end */
  1566. }
  1567. if(bits_ > 0) {
  1568. v <<= bits_;
  1569. v |= (bb->buffer[bb->consumed_blurbs] >> (FLAC__BITS_PER_BLURB-bits_));
  1570. bb->consumed_bits = bits_;
  1571. /* we hold off updating bb->total_consumed_bits until the end */
  1572. }
  1573. bb->total_consumed_bits += bits;
  1574. *val = v;
  1575. #if FLAC__BITS_PER_BLURB > 8
  1576. }
  1577. else {
  1578. *val = 0;
  1579. for(i = 0; i < bits; i++) {
  1580. if(!FLAC__bitbuffer_read_bit_to_uint64(bb, val, read_callback, client_data))
  1581. return false;
  1582. }
  1583. }
  1584. #endif
  1585. return true;
  1586. }
  1587. #endif
  1588. #if 0 /* UNUSED */
  1589. FLAC__bool FLAC__bitbuffer_read_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1590. #ifdef FLAC__NO_MANUAL_INLINING
  1591. {
  1592. unsigned i;
  1593. FLAC__uint64 v;
  1594. FLAC__ASSERT(0 != bb);
  1595. FLAC__ASSERT(0 != bb->buffer);
  1596. FLAC__ASSERT(bits <= 64);
  1597. v = 0;
  1598. for(i = 0; i < bits; i++) {
  1599. if(!FLAC__bitbuffer_read_bit_to_uint64(bb, &v, read_callback, client_data))
  1600. return false;
  1601. }
  1602. /* fix the sign */
  1603. i = 64 - bits;
  1604. if(i) {
  1605. v <<= i;
  1606. *val = (FLAC__int64)v;
  1607. *val >>= i;
  1608. }
  1609. else
  1610. *val = (FLAC__int64)v;
  1611. return true;
  1612. }
  1613. #else
  1614. {
  1615. unsigned i, bits_ = bits;
  1616. FLAC__uint64 v = 0;
  1617. FLAC__ASSERT(0 != bb);
  1618. FLAC__ASSERT(0 != bb->buffer);
  1619. FLAC__ASSERT(bits <= 64);
  1620. FLAC__ASSERT((bb->capacity*FLAC__BITS_PER_BLURB) * 2 >= bits);
  1621. if(bits == 0) {
  1622. *val = 0;
  1623. return true;
  1624. }
  1625. while(bb->total_consumed_bits + bits > bb->total_bits) {
  1626. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1627. return false;
  1628. }
  1629. #if FLAC__BITS_PER_BLURB > 8
  1630. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) { /*@@@ comment on why this is here*/
  1631. #endif
  1632. if(bb->consumed_bits) {
  1633. i = FLAC__BITS_PER_BLURB - bb->consumed_bits;
  1634. if(i <= bits_) {
  1635. v = bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits);
  1636. bits_ -= i;
  1637. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1638. bb->consumed_blurbs++;
  1639. bb->consumed_bits = 0;
  1640. /* we hold off updating bb->total_consumed_bits until the end */
  1641. }
  1642. else {
  1643. /* bits_ must be < FLAC__BITS_PER_BLURB-1 if we get to here */
  1644. v = (bb->buffer[bb->consumed_blurbs] & (FLAC__BLURB_ALL_ONES >> bb->consumed_bits));
  1645. v <<= (64-i);
  1646. *val = (FLAC__int64)v;
  1647. *val >>= (64-bits_);
  1648. bb->consumed_bits += bits_;
  1649. bb->total_consumed_bits += bits_;
  1650. return true;
  1651. }
  1652. }
  1653. while(bits_ >= FLAC__BITS_PER_BLURB) {
  1654. v <<= FLAC__BITS_PER_BLURB;
  1655. v |= bb->buffer[bb->consumed_blurbs];
  1656. bits_ -= FLAC__BITS_PER_BLURB;
  1657. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1658. bb->consumed_blurbs++;
  1659. /* bb->consumed_bits is already 0 */
  1660. /* we hold off updating bb->total_consumed_bits until the end */
  1661. }
  1662. if(bits_ > 0) {
  1663. v <<= bits_;
  1664. v |= (bb->buffer[bb->consumed_blurbs] >> (FLAC__BITS_PER_BLURB-bits_));
  1665. bb->consumed_bits = bits_;
  1666. /* we hold off updating bb->total_consumed_bits until the end */
  1667. }
  1668. bb->total_consumed_bits += bits;
  1669. #if FLAC__BITS_PER_BLURB > 8
  1670. }
  1671. else {
  1672. for(i = 0; i < bits; i++) {
  1673. if(!FLAC__bitbuffer_read_bit_to_uint64(bb, &v, read_callback, client_data))
  1674. return false;
  1675. }
  1676. }
  1677. #endif
  1678. /* fix the sign */
  1679. i = 64 - bits;
  1680. if(i) {
  1681. v <<= i;
  1682. *val = (FLAC__int64)v;
  1683. *val >>= i;
  1684. }
  1685. else
  1686. *val = (FLAC__int64)v;
  1687. return true;
  1688. }
  1689. #endif
  1690. #endif
  1691. FLaC__INLINE FLAC__bool FLAC__bitbuffer_read_raw_uint32_little_endian(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1692. {
  1693. FLAC__uint32 x8, x32 = 0;
  1694. /* this doesn't need to be that fast as currently it is only used for vorbis comments */
  1695. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x32, 8, read_callback, client_data))
  1696. return false;
  1697. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x8, 8, read_callback, client_data))
  1698. return false;
  1699. x32 |= (x8 << 8);
  1700. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x8, 8, read_callback, client_data))
  1701. return false;
  1702. x32 |= (x8 << 16);
  1703. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x8, 8, read_callback, client_data))
  1704. return false;
  1705. x32 |= (x8 << 24);
  1706. *val = x32;
  1707. return true;
  1708. }
  1709. FLAC__bool FLAC__bitbuffer_skip_bits_no_crc(FLAC__BitBuffer *bb, unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1710. {
  1711. /*
  1712.  * @@@ a slightly faster implementation is possible but
  1713.  * probably not that useful since this is only called a
  1714.  * couple of times in the metadata readers.
  1715.  */
  1716. FLAC__ASSERT(0 != bb);
  1717. FLAC__ASSERT(0 != bb->buffer);
  1718. if(bits > 0) {
  1719. const unsigned n = bb->consumed_bits & 7;
  1720.     unsigned m;
  1721. FLAC__uint32 x;
  1722. if(n != 0) {
  1723. m = min(8-n, bits);
  1724. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, m, read_callback, client_data))
  1725. return false;
  1726. bits -= m;
  1727. }
  1728. m = bits / 8;
  1729. if(m > 0) {
  1730. if(!FLAC__bitbuffer_read_byte_block_aligned_no_crc(bb, 0, m, read_callback, client_data))
  1731. return false;
  1732. bits %= 8;
  1733. }
  1734. if(bits > 0) {
  1735. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, bits, read_callback, client_data))
  1736. return false;
  1737. }
  1738. }
  1739. return true;
  1740. }
  1741. FLAC__bool FLAC__bitbuffer_read_byte_block_aligned_no_crc(FLAC__BitBuffer *bb, FLAC__byte *val, unsigned nvals, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1742. {
  1743. FLAC__ASSERT(0 != bb);
  1744. FLAC__ASSERT(0 != bb->buffer);
  1745. FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(bb));
  1746. FLAC__ASSERT(FLAC__bitbuffer_is_consumed_byte_aligned(bb));
  1747. #if FLAC__BITS_PER_BLURB == 8
  1748. while(nvals > 0) {
  1749. unsigned chunk = min(nvals, bb->blurbs - bb->consumed_blurbs);
  1750. if(chunk == 0) {
  1751. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1752. return false;
  1753. }
  1754. else {
  1755. if(0 != val) {
  1756. memcpy(val, bb->buffer + bb->consumed_blurbs, FLAC__BYTES_PER_BLURB * chunk);
  1757. val += FLAC__BYTES_PER_BLURB * chunk;
  1758. }
  1759. nvals -= chunk;
  1760. bb->consumed_blurbs += chunk;
  1761. bb->total_consumed_bits = (bb->consumed_blurbs << FLAC__BITS_PER_BLURB_LOG2);
  1762. }
  1763. }
  1764. #else
  1765. @@@ need to write this still
  1766. FLAC__ASSERT(0);
  1767. #endif
  1768. return true;
  1769. }
  1770. FLaC__INLINE FLAC__bool FLAC__bitbuffer_read_unary_unsigned(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1771. #ifdef FLAC__NO_MANUAL_INLINING
  1772. {
  1773. unsigned bit, val_ = 0;
  1774. FLAC__ASSERT(0 != bb);
  1775. FLAC__ASSERT(0 != bb->buffer);
  1776. while(1) {
  1777. if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
  1778. return false;
  1779. if(bit)
  1780. break;
  1781. else
  1782. val_++;
  1783. }
  1784. *val = val_;
  1785. return true;
  1786. }
  1787. #else
  1788. {
  1789. unsigned i, val_ = 0;
  1790. unsigned total_blurbs_ = (bb->total_bits + (FLAC__BITS_PER_BLURB-1)) / FLAC__BITS_PER_BLURB;
  1791. FLAC__blurb b;
  1792. FLAC__ASSERT(0 != bb);
  1793. FLAC__ASSERT(0 != bb->buffer);
  1794. #if FLAC__BITS_PER_BLURB > 8
  1795. if(bb->bits == 0 || bb->consumed_blurbs < bb->blurbs) { /*@@@ comment on why this is here*/
  1796. #endif
  1797. if(bb->consumed_bits) {
  1798. b = bb->buffer[bb->consumed_blurbs] << bb->consumed_bits;
  1799. if(b) {
  1800. for(i = 0; !(b & FLAC__BLURB_TOP_BIT_ONE); i++)
  1801. b <<= 1;
  1802. *val = i;
  1803. i++;
  1804. bb->consumed_bits += i;
  1805. bb->total_consumed_bits += i;
  1806. if(bb->consumed_bits == FLAC__BITS_PER_BLURB) {
  1807. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1808. bb->consumed_blurbs++;
  1809. bb->consumed_bits = 0;
  1810. }
  1811. return true;
  1812. }
  1813. else {
  1814. val_ = FLAC__BITS_PER_BLURB - bb->consumed_bits;
  1815. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1816. bb->consumed_blurbs++;
  1817. bb->consumed_bits = 0;
  1818. bb->total_consumed_bits += val_;
  1819. }
  1820. }
  1821. while(1) {
  1822. if(bb->consumed_blurbs >= total_blurbs_) {
  1823. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  1824. return false;
  1825. total_blurbs_ = (bb->total_bits + (FLAC__BITS_PER_BLURB-1)) / FLAC__BITS_PER_BLURB;
  1826. }
  1827. b = bb->buffer[bb->consumed_blurbs];
  1828. if(b) {
  1829. for(i = 0; !(b & FLAC__BLURB_TOP_BIT_ONE); i++)
  1830. b <<= 1;
  1831. val_ += i;
  1832. i++;
  1833. bb->consumed_bits = i;
  1834. *val = val_;
  1835. if(i == FLAC__BITS_PER_BLURB) {
  1836. CRC16_UPDATE_BLURB(bb, bb->buffer[bb->consumed_blurbs], bb->read_crc16);
  1837. bb->consumed_blurbs++;
  1838. bb->consumed_bits = 0;
  1839. }
  1840. bb->total_consumed_bits += i;
  1841. return true;
  1842. }
  1843. else {
  1844. val_ += FLAC__BITS_PER_BLURB;
  1845. CRC16_UPDATE_BLURB(bb, 0, bb->read_crc16);
  1846. bb->consumed_blurbs++;
  1847. /* bb->consumed_bits is already 0 */
  1848. bb->total_consumed_bits += FLAC__BITS_PER_BLURB;
  1849. }
  1850. }
  1851. #if FLAC__BITS_PER_BLURB > 8
  1852. }
  1853. else {
  1854. while(1) {
  1855. if(!FLAC__bitbuffer_read_bit(bb, &i, read_callback, client_data))
  1856. return false;
  1857. if(i)
  1858. break;
  1859. else
  1860. val_++;
  1861. }
  1862. *val = val_;
  1863. return true;
  1864. }
  1865. #endif
  1866. }
  1867. #endif
  1868. #ifdef FLAC__SYMMETRIC_RICE
  1869. FLAC__bool FLAC__bitbuffer_read_symmetric_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1870. {
  1871. FLAC__uint32 sign = 0, lsbs = 0, msbs = 0;
  1872. FLAC__ASSERT(0 != bb);
  1873. FLAC__ASSERT(0 != bb->buffer);
  1874. FLAC__ASSERT(parameter <= 31);
  1875. /* read the unary MSBs and end bit */
  1876. if(!FLAC__bitbuffer_read_unary_unsigned(bb, &msbs, read_callback, client_data))
  1877. return false;
  1878. /* read the sign bit */
  1879. if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &sign, read_callback, client_data))
  1880. return false;
  1881. /* read the binary LSBs */
  1882. if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, parameter, read_callback, client_data))
  1883. return false;
  1884. /* compose the value */
  1885. *val = (msbs << parameter) | lsbs;
  1886. if(sign)
  1887. *val = -(*val);
  1888. return true;
  1889. }
  1890. #endif /* ifdef FLAC__SYMMETRIC_RICE */
  1891. FLAC__bool FLAC__bitbuffer_read_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1892. {
  1893. FLAC__uint32 lsbs = 0, msbs = 0;
  1894. unsigned uval;
  1895. FLAC__ASSERT(0 != bb);
  1896. FLAC__ASSERT(0 != bb->buffer);
  1897. FLAC__ASSERT(parameter <= 31);
  1898. /* read the unary MSBs and end bit */
  1899. if(!FLAC__bitbuffer_read_unary_unsigned(bb, &msbs, read_callback, client_data))
  1900. return false;
  1901. /* read the binary LSBs */
  1902. if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, parameter, read_callback, client_data))
  1903. return false;
  1904. /* compose the value */
  1905. uval = (msbs << parameter) | lsbs;
  1906. if(uval & 1)
  1907. *val = -((int)(uval >> 1)) - 1;
  1908. else
  1909. *val = (int)(uval >> 1);
  1910. return true;
  1911. }
  1912. FLAC__bool FLAC__bitbuffer_read_rice_signed_block(FLAC__BitBuffer *bb, int vals[], unsigned nvals, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  1913. #ifdef FLAC__OLD_MSVC_FLAVOR
  1914. {
  1915. const FLAC__blurb *buffer = bb->buffer;
  1916. unsigned i, j, val_i = 0;
  1917. unsigned cbits = 0, uval = 0, msbs = 0, lsbs_left = 0;
  1918. FLAC__blurb blurb, save_blurb;
  1919. unsigned state = 0; /* 0 = getting unary MSBs, 1 = getting binary LSBs */
  1920. FLAC__ASSERT(0 != bb);
  1921. FLAC__ASSERT(0 != bb->buffer);
  1922. FLAC__ASSERT(parameter <= 31);
  1923. if(nvals == 0)
  1924. return true;
  1925. i = bb->consumed_blurbs;
  1926. /*
  1927.  * We unroll the main loop to take care of partially consumed blurbs here.
  1928.  */
  1929. if(bb->consumed_bits > 0) {
  1930. save_blurb = blurb = buffer[i];
  1931. cbits = bb->consumed_bits;
  1932. blurb <<= cbits;
  1933. while(1) {
  1934. if(state == 0) {
  1935. if(blurb) {
  1936. for(j = 0; !(blurb & FLAC__BLURB_TOP_BIT_ONE); j++)
  1937. blurb <<= 1;
  1938. msbs += j;
  1939. /* dispose of the unary end bit */
  1940. blurb <<= 1;
  1941. j++;
  1942. cbits += j;
  1943. uval = 0;
  1944. lsbs_left = parameter;
  1945. state++;
  1946. if(cbits == FLAC__BITS_PER_BLURB) {
  1947. cbits = 0;
  1948. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  1949. break;
  1950. }
  1951. }
  1952. else {
  1953. msbs += FLAC__BITS_PER_BLURB - cbits;
  1954. cbits = 0;
  1955. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  1956. break;
  1957. }
  1958. }
  1959. else {
  1960. const unsigned available_bits = FLAC__BITS_PER_BLURB - cbits;
  1961. if(lsbs_left >= available_bits) {
  1962. uval <<= available_bits;
  1963. uval |= (blurb >> cbits);
  1964. cbits = 0;
  1965. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  1966. if(lsbs_left == available_bits) {
  1967. /* compose the value */
  1968. uval |= (msbs << parameter);
  1969. if(uval & 1)
  1970. vals[val_i++] = -((int)(uval >> 1)) - 1;
  1971. else
  1972. vals[val_i++] = (int)(uval >> 1);
  1973. if(val_i == nvals)
  1974. break;
  1975. msbs = 0;
  1976. state = 0;
  1977. }
  1978. lsbs_left -= available_bits;
  1979. break;
  1980. }
  1981. else {
  1982. uval <<= lsbs_left;
  1983. uval |= (blurb >> (FLAC__BITS_PER_BLURB - lsbs_left));
  1984. blurb <<= lsbs_left;
  1985. cbits += lsbs_left;
  1986. /* compose the value */
  1987. uval |= (msbs << parameter);
  1988. if(uval & 1)
  1989. vals[val_i++] = -((int)(uval >> 1)) - 1;
  1990. else
  1991. vals[val_i++] = (int)(uval >> 1);
  1992. if(val_i == nvals) {
  1993. /* back up one if we exited the for loop because we read all nvals but the end came in the middle of a blurb */
  1994. i--;
  1995. break;
  1996. }
  1997. msbs = 0;
  1998. state = 0;
  1999. }
  2000. }
  2001. }
  2002. i++;
  2003. bb->consumed_blurbs = i;
  2004. bb->consumed_bits = cbits;
  2005. bb->total_consumed_bits = (i << FLAC__BITS_PER_BLURB_LOG2) | cbits;
  2006. }
  2007. /*
  2008.  * Now that we are blurb-aligned the logic is slightly simpler
  2009.  */
  2010. while(val_i < nvals) {
  2011. for( ; i < bb->blurbs && val_i < nvals; i++) {
  2012. save_blurb = blurb = buffer[i];
  2013. cbits = 0;
  2014. while(1) {
  2015. if(state == 0) {
  2016. if(blurb) {
  2017. for(j = 0; !(blurb & FLAC__BLURB_TOP_BIT_ONE); j++)
  2018. blurb <<= 1;
  2019. msbs += j;
  2020. /* dispose of the unary end bit */
  2021. blurb <<= 1;
  2022. j++;
  2023. cbits += j;
  2024. uval = 0;
  2025. lsbs_left = parameter;
  2026. state++;
  2027. if(cbits == FLAC__BITS_PER_BLURB) {
  2028. cbits = 0;
  2029. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2030. break;
  2031. }
  2032. }
  2033. else {
  2034. msbs += FLAC__BITS_PER_BLURB - cbits;
  2035. cbits = 0;
  2036. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2037. break;
  2038. }
  2039. }
  2040. else {
  2041. const unsigned available_bits = FLAC__BITS_PER_BLURB - cbits;
  2042. if(lsbs_left >= available_bits) {
  2043. uval <<= available_bits;
  2044. uval |= (blurb >> cbits);
  2045. cbits = 0;
  2046. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2047. if(lsbs_left == available_bits) {
  2048. /* compose the value */
  2049. uval |= (msbs << parameter);
  2050. if(uval & 1)
  2051. vals[val_i++] = -((int)(uval >> 1)) - 1;
  2052. else
  2053. vals[val_i++] = (int)(uval >> 1);
  2054. if(val_i == nvals)
  2055. break;
  2056. msbs = 0;
  2057. state = 0;
  2058. }
  2059. lsbs_left -= available_bits;
  2060. break;
  2061. }
  2062. else {
  2063. uval <<= lsbs_left;
  2064. uval |= (blurb >> (FLAC__BITS_PER_BLURB - lsbs_left));
  2065. blurb <<= lsbs_left;
  2066. cbits += lsbs_left;
  2067. /* compose the value */
  2068. uval |= (msbs << parameter);
  2069. if(uval & 1)
  2070. vals[val_i++] = -((int)(uval >> 1)) - 1;
  2071. else
  2072. vals[val_i++] = (int)(uval >> 1);
  2073. if(val_i == nvals) {
  2074. /* back up one if we exited the for loop because we read all nvals but the end came in the middle of a blurb */
  2075. i--;
  2076. break;
  2077. }
  2078. msbs = 0;
  2079. state = 0;
  2080. }
  2081. }
  2082. }
  2083. }
  2084. bb->consumed_blurbs = i;
  2085. bb->consumed_bits = cbits;
  2086. bb->total_consumed_bits = (i << FLAC__BITS_PER_BLURB_LOG2) | cbits;
  2087. if(val_i < nvals) {
  2088. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  2089. return false;
  2090. /* these must be zero because we can only get here if we got to the end of the buffer */
  2091. FLAC__ASSERT(bb->consumed_blurbs == 0);
  2092. FLAC__ASSERT(bb->consumed_bits == 0);
  2093. i = 0;
  2094. }
  2095. }
  2096. return true;
  2097. }
  2098. #else
  2099. {
  2100. const FLAC__blurb *buffer = bb->buffer;
  2101. unsigned i, j, val_i = nvals;
  2102. unsigned cbits = 0, uval = 0, msbs = 0, lsbs_left = 0;
  2103. FLAC__blurb blurb, save_blurb;
  2104. unsigned state = 0; /* 0 = getting unary MSBs, 1 = getting binary LSBs */
  2105. FLAC__ASSERT(0 != bb);
  2106. FLAC__ASSERT(0 != bb->buffer);
  2107. FLAC__ASSERT(parameter <= 31);
  2108. if(nvals == 0)
  2109. return true;
  2110. cbits = bb->consumed_bits;
  2111. i = bb->consumed_blurbs;
  2112. while(val_i != 0) {
  2113. for( ; i < bb->blurbs; i++) {
  2114. blurb = (save_blurb = buffer[i]) << cbits;
  2115. while(1) {
  2116. if(state == 0) {
  2117. if(blurb) {
  2118. j = FLAC__ALIGNED_BLURB_UNARY(blurb);
  2119. msbs += j;
  2120. j++;
  2121. cbits += j;
  2122. uval = 0;
  2123. lsbs_left = parameter;
  2124. state++;
  2125. if(cbits == FLAC__BITS_PER_BLURB) {
  2126. cbits = 0;
  2127. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2128. break;
  2129. }
  2130. blurb <<= j;
  2131. }
  2132. else {
  2133. msbs += FLAC__BITS_PER_BLURB - cbits;
  2134. cbits = 0;
  2135. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2136. break;
  2137. }
  2138. }
  2139. else {
  2140. const unsigned available_bits = FLAC__BITS_PER_BLURB - cbits;
  2141. if(lsbs_left >= available_bits) {
  2142. uval <<= available_bits;
  2143. uval |= (blurb >> cbits);
  2144. cbits = 0;
  2145. CRC16_UPDATE_BLURB(bb, save_blurb, bb->read_crc16);
  2146. if(lsbs_left == available_bits) {
  2147. /* compose the value */
  2148. uval |= (msbs << parameter);
  2149. *vals = (int)(uval >> 1 ^ -(int)(uval & 1));
  2150. --val_i;
  2151. if(val_i == 0) {
  2152. i++;
  2153. goto break2;
  2154. }
  2155. ++vals;
  2156. msbs = 0;
  2157. state = 0;
  2158. }
  2159. lsbs_left -= available_bits;
  2160. break;
  2161. }
  2162. else {
  2163. cbits += lsbs_left;
  2164. uval <<= lsbs_left;
  2165. uval |= (blurb >> (FLAC__BITS_PER_BLURB - lsbs_left));
  2166. blurb <<= lsbs_left;
  2167. /* compose the value */
  2168. uval |= (msbs << parameter);
  2169. *vals = (int)(uval >> 1 ^ -(int)(uval & 1));
  2170. --val_i;
  2171. if(val_i == 0)
  2172. goto break2;
  2173. ++vals;
  2174. msbs = 0;
  2175. state = 0;
  2176. }
  2177. }
  2178. }
  2179. }
  2180. break2:
  2181. bb->consumed_blurbs = i;
  2182. bb->consumed_bits = cbits;
  2183. bb->total_consumed_bits = (i << FLAC__BITS_PER_BLURB_LOG2) | cbits;
  2184. if(val_i != 0) {
  2185. if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
  2186. return false;
  2187. /* these must be zero because we can only get here if we got to the end of the buffer */
  2188. FLAC__ASSERT(bb->consumed_blurbs == 0);
  2189. FLAC__ASSERT(bb->consumed_bits == 0);
  2190. i = 0;
  2191. }
  2192. }
  2193. return true;
  2194. }
  2195. #endif
  2196. #if 0 /* UNUSED */
  2197. FLAC__bool FLAC__bitbuffer_read_golomb_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  2198. {
  2199. FLAC__uint32 lsbs = 0, msbs = 0;
  2200. unsigned bit, uval, k;
  2201. FLAC__ASSERT(0 != bb);
  2202. FLAC__ASSERT(0 != bb->buffer);
  2203. k = FLAC__bitmath_ilog2(parameter);
  2204. /* read the unary MSBs and end bit */
  2205. if(!FLAC__bitbuffer_read_unary_unsigned(bb, &msbs, read_callback, client_data))
  2206. return false;
  2207. /* read the binary LSBs */
  2208. if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, k, read_callback, client_data))
  2209. return false;
  2210. if(parameter == 1u<<k) {
  2211. /* compose the value */
  2212. uval = (msbs << k) | lsbs;
  2213. }
  2214. else {
  2215. unsigned d = (1 << (k+1)) - parameter;
  2216. if(lsbs >= d) {
  2217. if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
  2218. return false;
  2219. lsbs <<= 1;
  2220. lsbs |= bit;
  2221. lsbs -= d;
  2222. }
  2223. /* compose the value */
  2224. uval = msbs * parameter + lsbs;
  2225. }
  2226. /* unfold unsigned to signed */
  2227. if(uval & 1)
  2228. *val = -((int)(uval >> 1)) - 1;
  2229. else
  2230. *val = (int)(uval >> 1);
  2231. return true;
  2232. }
  2233. FLAC__bool FLAC__bitbuffer_read_golomb_unsigned(FLAC__BitBuffer *bb, unsigned *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data)
  2234. {
  2235. FLAC__uint32 lsbs, msbs = 0;
  2236. unsigned bit, k;
  2237. FLAC__ASSERT(0 != bb);
  2238. FLAC__ASSERT(0 != bb->buffer);
  2239. k = FLAC__bitmath_ilog2(parameter);
  2240. /* read the unary MSBs and end bit */
  2241. if(!FLAC__bitbuffer_read_unary_unsigned(bb, &msbs, read_callback, client_data))
  2242. return false;
  2243. /* read the binary LSBs */
  2244. if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, k, read_callback, client_data))
  2245. return false;
  2246. if(parameter == 1u<<k) {
  2247. /* compose the value */
  2248. *val = (msbs << k) | lsbs;
  2249. }
  2250. else {
  2251. unsigned d = (1 << (k+1)) - parameter;
  2252. if(lsbs >= d) {
  2253. if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
  2254. return false;
  2255. lsbs <<= 1;
  2256. lsbs |= bit;
  2257. lsbs -= d;
  2258. }
  2259. /* compose the value */
  2260. *val = msbs * parameter + lsbs;
  2261. }
  2262. return true;
  2263. }
  2264. #endif /* UNUSED */
  2265. /* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */
  2266. FLAC__bool FLAC__bitbuffer_read_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen)
  2267. {
  2268. FLAC__uint32 v = 0;
  2269. FLAC__uint32 x;
  2270. unsigned i;
  2271. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
  2272. return false;
  2273. if(raw)
  2274. raw[(*rawlen)++] = (FLAC__byte)x;
  2275. if(!(x & 0x80)) { /* 0xxxxxxx */
  2276. v = x;
  2277. i = 0;
  2278. }
  2279. else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
  2280. v = x & 0x1F;
  2281. i = 1;
  2282. }
  2283. else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
  2284. v = x & 0x0F;
  2285. i = 2;
  2286. }
  2287. else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
  2288. v = x & 0x07;
  2289. i = 3;
  2290. }
  2291. else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
  2292. v = x & 0x03;
  2293. i = 4;
  2294. }
  2295. else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
  2296. v = x & 0x01;
  2297. i = 5;
  2298. }
  2299. else {
  2300. *val = 0xffffffff;
  2301. return true;
  2302. }
  2303. for( ; i; i--) {
  2304. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
  2305. return false;
  2306. if(raw)
  2307. raw[(*rawlen)++] = (FLAC__byte)x;
  2308. if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */
  2309. *val = 0xffffffff;
  2310. return true;
  2311. }
  2312. v <<= 6;
  2313. v |= (x & 0x3F);
  2314. }
  2315. *val = v;
  2316. return true;
  2317. }
  2318. /* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */
  2319. FLAC__bool FLAC__bitbuffer_read_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen)
  2320. {
  2321. FLAC__uint64 v = 0;
  2322. FLAC__uint32 x;
  2323. unsigned i;
  2324. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
  2325. return false;
  2326. if(raw)
  2327. raw[(*rawlen)++] = (FLAC__byte)x;
  2328. if(!(x & 0x80)) { /* 0xxxxxxx */
  2329. v = x;
  2330. i = 0;
  2331. }
  2332. else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
  2333. v = x & 0x1F;
  2334. i = 1;
  2335. }
  2336. else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
  2337. v = x & 0x0F;
  2338. i = 2;
  2339. }
  2340. else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
  2341. v = x & 0x07;
  2342. i = 3;
  2343. }
  2344. else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
  2345. v = x & 0x03;
  2346. i = 4;
  2347. }
  2348. else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
  2349. v = x & 0x01;
  2350. i = 5;
  2351. }
  2352. else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */
  2353. v = 0;
  2354. i = 6;
  2355. }
  2356. else {
  2357. *val = FLAC__U64L(0xffffffffffffffff);
  2358. return true;
  2359. }
  2360. for( ; i; i--) {
  2361. if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
  2362. return false;
  2363. if(raw)
  2364. raw[(*rawlen)++] = (FLAC__byte)x;
  2365. if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */
  2366. *val = FLAC__U64L(0xffffffffffffffff);
  2367. return true;
  2368. }
  2369. v <<= 6;
  2370. v |= (x & 0x3F);
  2371. }
  2372. *val = v;
  2373. return true;
  2374. }
  2375. /*
  2376. void FLAC__bitbuffer_dump(const FLAC__BitBuffer *bb, FILE *out)
  2377. {
  2378. unsigned i, j;
  2379. if(bb == 0) {
  2380. fprintf(out, "bitbuffer is NULLn");
  2381. }
  2382. else {
  2383. fprintf(out, "bitbuffer: capacity=%u blurbs=%u bits=%u total_bits=%u consumed: blurbs=%u, bits=%u, total_bits=%un", bb->capacity, bb->blurbs, bb->bits, bb->total_bits, bb->consumed_blurbs, bb->consumed_bits, bb->total_consumed_bits);
  2384. for(i = 0; i < bb->blurbs; i++) {
  2385. fprintf(out, "%08X: ", i);
  2386. for(j = 0; j < FLAC__BITS_PER_BLURB; j++)
  2387. if(i*FLAC__BITS_PER_BLURB+j < bb->total_consumed_bits)
  2388. fprintf(out, ".");
  2389. else
  2390. fprintf(out, "%01u", bb->buffer[i] & (1 << (FLAC__BITS_PER_BLURB-j-1)) ? 1:0);
  2391. fprintf(out, "n");
  2392. }
  2393. if(bb->bits > 0) {
  2394. fprintf(out, "%08X: ", i);
  2395. for(j = 0; j < bb->bits; j++)
  2396. if(i*FLAC__BITS_PER_BLURB+j < bb->total_consumed_bits)
  2397. fprintf(out, ".");
  2398. else
  2399. fprintf(out, "%01u", bb->buffer[i] & (1 << (bb->bits-j-1)) ? 1:0);
  2400. fprintf(out, "n");
  2401. }
  2402. }
  2403. }
  2404. */