1 /* libFLAC - Free Lossless Audio Codec library
2 * Copyright (C) 2000,2001 Josh Coalson
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include <stdlib.h> /* for malloc() */
22 #include <string.h> /* for memcpy(), memset() */
23 #include "private/bitbuffer.h"
25 static const unsigned FLAC__BITBUFFER_DEFAULT_CAPACITY = 65536; /* bytes */
30 #define min(x,y) ((x)<(y)?(x):(y))
34 #define max(x,y) ((x)>(y)?(x):(y))
36 static unsigned ilog2_(unsigned v)
45 static bool bitbuffer_resize_(FLAC__BitBuffer *bb, unsigned new_capacity)
50 assert(bb->buffer != 0);
52 if(bb->capacity == new_capacity)
55 new_buffer = (byte*)malloc(sizeof(byte) * new_capacity);
58 memset(new_buffer, 0, new_capacity);
59 memcpy(new_buffer, bb->buffer, sizeof(byte)*min(bb->bytes+(bb->bits?1:0), new_capacity));
60 if(new_capacity < bb->bytes+(bb->bits?1:0)) {
61 bb->bytes = new_capacity;
63 bb->total_bits = (new_capacity<<3);
65 if(new_capacity < bb->consumed_bytes+(bb->consumed_bits?1:0)) {
66 bb->consumed_bytes = new_capacity;
67 bb->consumed_bits = 0;
68 bb->total_consumed_bits = (new_capacity<<3);
70 bb->buffer = new_buffer;
71 bb->capacity = new_capacity;
75 static bool bitbuffer_grow_(FLAC__BitBuffer *bb, unsigned min_bytes_to_add)
77 unsigned new_capacity;
79 assert(min_bytes_to_add > 0);
81 new_capacity = max(bb->capacity * 4, bb->capacity + min_bytes_to_add);
82 return bitbuffer_resize_(bb, new_capacity);
85 static bool bitbuffer_ensure_size_(FLAC__BitBuffer *bb, unsigned bits_to_add)
88 assert(bb->buffer != 0);
89 if((bb->capacity<<3) < bb->total_bits + bits_to_add)
90 return bitbuffer_grow_(bb, (bits_to_add>>3)+2);
95 static bool bitbuffer_read_from_client_(FLAC__BitBuffer *bb, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
99 /* first shift the unconsumed buffer data toward the front as much as possible */
100 if(bb->total_consumed_bits >= 8) {
101 unsigned l = 0, r = bb->consumed_bytes, r_end = bb->bytes;
102 for( ; r < r_end; l++, r++)
103 bb->buffer[l] = bb->buffer[r];
104 for( ; l < r_end; l++)
106 bb->bytes -= bb->consumed_bytes;
107 bb->total_bits -= (bb->consumed_bytes<<3);
108 bb->consumed_bytes = 0;
109 bb->total_consumed_bits = bb->consumed_bits;
111 /* grow if we need to */
112 if(bb->capacity <= 1) {
113 if(!bitbuffer_resize_(bb, 16))
116 /* finally, read in some data; if OK, go back to read_bit_, else fail */
117 bytes = bb->capacity - bb->bytes;
118 if(!read_callback(bb->buffer+bb->bytes, &bytes, client_data))
121 bb->total_bits += (bytes<<3);
125 void FLAC__bitbuffer_init(FLAC__BitBuffer *bb)
130 bb->bytes = bb->bits = bb->total_bits = 0;
131 bb->consumed_bytes = bb->consumed_bits = bb->total_consumed_bits = 0;
134 bool FLAC__bitbuffer_init_from(FLAC__BitBuffer *bb, const byte buffer[], unsigned bytes)
137 FLAC__bitbuffer_init(bb);
142 bb->buffer = (byte*)malloc(sizeof(byte)*bytes);
145 memcpy(bb->buffer, buffer, sizeof(byte)*bytes);
146 bb->capacity = bb->bytes = bytes;
148 bb->total_bits = (bytes<<3);
149 bb->consumed_bytes = bb->consumed_bits = bb->total_consumed_bits = 0;
154 bool FLAC__bitbuffer_concatenate_aligned(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src)
156 static byte mask_[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
157 unsigned bits_to_add = src->total_bits - src->total_consumed_bits;
163 if(dest->bits != src->consumed_bits)
165 if(!bitbuffer_ensure_size_(dest, bits_to_add))
167 if(dest->bits == 0) {
168 memcpy(dest->buffer+dest->bytes, src->buffer+src->consumed_bytes, src->bytes-src->consumed_bytes + ((src->bits)? 1:0));
170 else if(dest->bits + bits_to_add > 8) {
171 dest->buffer[dest->bytes] <<= (8 - dest->bits);
172 dest->buffer[dest->bytes] |= (src->buffer[src->consumed_bytes] & mask_[8-dest->bits]);
173 memcpy(dest->buffer+dest->bytes+1, src->buffer+src->consumed_bytes+1, src->bytes-src->consumed_bytes-1 + ((src->bits)? 1:0));
176 dest->buffer[dest->bytes] <<= bits_to_add;
177 dest->buffer[dest->bytes] |= (src->buffer[src->consumed_bytes] & mask_[bits_to_add]);
179 dest->bits = src->bits;
180 dest->total_bits += bits_to_add;
181 dest->bytes = dest->total_bits / 8;
186 void FLAC__bitbuffer_free(FLAC__BitBuffer *bb)
193 bb->bytes = bb->bits = bb->total_bits = 0;
194 bb->consumed_bytes = bb->consumed_bits = bb->total_consumed_bits = 0;
197 bool FLAC__bitbuffer_clear(FLAC__BitBuffer *bb)
199 if(bb->buffer == 0) {
200 bb->capacity = FLAC__BITBUFFER_DEFAULT_CAPACITY;
201 bb->buffer = (byte*)malloc(sizeof(byte) * bb->capacity);
204 memset(bb->buffer, 0, bb->capacity);
207 memset(bb->buffer, 0, bb->bytes + (bb->bits?1:0));
209 bb->bytes = bb->bits = bb->total_bits = 0;
210 bb->consumed_bytes = bb->consumed_bits = bb->total_consumed_bits = 0;
214 bool FLAC__bitbuffer_clone(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src)
216 if(dest->capacity < src->capacity)
217 if(!bitbuffer_resize_(dest, src->capacity))
219 memcpy(dest->buffer, src->buffer, sizeof(byte)*min(src->capacity, src->bytes+1));
220 dest->bytes = src->bytes;
221 dest->bits = src->bits;
222 dest->total_bits = src->total_bits;
223 dest->consumed_bytes = src->consumed_bytes;
224 dest->consumed_bits = src->consumed_bits;
225 dest->total_consumed_bits = src->total_consumed_bits;
229 bool FLAC__bitbuffer_write_zeroes(FLAC__BitBuffer *bb, unsigned bits)
234 assert(bb->buffer != 0);
238 if(!bitbuffer_ensure_size_(bb, bits))
240 bb->total_bits += bits;
242 n = min(8 - bb->bits, bits);
244 bb->buffer[bb->bytes] <<= n;
255 bool FLAC__bitbuffer_write_raw_uint32(FLAC__BitBuffer *bb, uint32 val, unsigned bits)
257 static uint32 mask[] = {
259 0x00000001, 0x00000003, 0x00000007, 0x0000000F,
260 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
261 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
262 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
263 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
264 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
265 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
266 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
271 assert(bb->buffer != 0);
276 if(!bitbuffer_ensure_size_(bb, bits))
279 bb->total_bits += bits;
282 if(n == 8) { /* i.e. bb->bits == 0 */
284 bb->buffer[bb->bytes] = val;
289 bb->buffer[bb->bytes++] = val;
294 bb->buffer[bb->bytes++] = val >> k;
295 val &= (~(0xffffffff << k));
300 bb->buffer[bb->bytes] <<= bits;
301 bb->buffer[bb->bytes] |= val;
312 bb->buffer[bb->bytes] <<= n;
313 bb->buffer[bb->bytes] |= (val>>k);
314 val &= (~(0xffffffff << k));
324 bool FLAC__bitbuffer_write_raw_int32(FLAC__BitBuffer *bb, int32 val, unsigned bits)
326 return FLAC__bitbuffer_write_raw_uint32(bb, (uint32)val, bits);
329 bool FLAC__bitbuffer_write_raw_uint64(FLAC__BitBuffer *bb, uint64 val, unsigned bits)
331 static uint64 mask[] = {
333 0x0000000000000001, 0x0000000000000003, 0x0000000000000007, 0x000000000000000F,
334 0x000000000000001F, 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF,
335 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, 0x0000000000000FFF,
336 0x0000000000001FFF, 0x0000000000003FFF, 0x0000000000007FFF, 0x000000000000FFFF,
337 0x000000000001FFFF, 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF,
338 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, 0x0000000000FFFFFF,
339 0x0000000001FFFFFF, 0x0000000003FFFFFF, 0x0000000007FFFFFF, 0x000000000FFFFFFF,
340 0x000000001FFFFFFF, 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF,
341 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, 0x0000000FFFFFFFFF,
342 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF,
343 0x000001FFFFFFFFFF, 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF,
344 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, 0x0000FFFFFFFFFFFF,
345 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF,
346 0x001FFFFFFFFFFFFF, 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
347 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, 0x0FFFFFFFFFFFFFFF,
348 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF
353 assert(bb->buffer != 0);
358 if(!bitbuffer_ensure_size_(bb, bits))
361 bb->total_bits += bits;
365 bb->buffer[bb->bytes] = val;
370 bb->buffer[bb->bytes++] = val;
375 bb->buffer[bb->bytes++] = val >> k;
376 val &= (~(0xffffffffffffffff << k));
381 n = min(8 - bb->bits, bits);
383 bb->buffer[bb->bytes] <<= n;
384 bb->buffer[bb->bytes] |= (val>>k);
385 val &= (~(0xffffffffffffffff << k));
398 bool FLAC__bitbuffer_write_raw_int64(FLAC__BitBuffer *bb, int64 val, unsigned bits)
400 return FLAC__bitbuffer_write_raw_uint64(bb, (uint64)val, bits);
403 unsigned FLAC__bitbuffer_rice_bits(int val, unsigned parameter)
407 /* convert signed to unsigned */
410 * (unsigned)(((--val) << 1) - 1);
411 * but without the overflow problem at -MAXINT
413 uval = (unsigned)(((-(++val)) << 1) + 1);
415 uval = (unsigned)(val << 1);
417 msbs = uval >> parameter;
419 return 1 + parameter + msbs;
422 unsigned FLAC__bitbuffer_golomb_bits_signed(int val, unsigned parameter)
424 unsigned bits, msbs, uval;
427 assert(parameter > 0);
429 /* convert signed to unsigned */
432 * (unsigned)(((--val) << 1) - 1);
433 * but without the overflow problem at -MAXINT
435 uval = (unsigned)(((-(++val)) << 1) + 1);
437 uval = (unsigned)(val << 1);
439 k = ilog2_(parameter);
440 if(parameter == 1u<<k) {
449 d = (1 << (k+1)) - parameter;
450 q = uval / parameter;
451 r = uval - (q * parameter);
460 unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned uval, unsigned parameter)
465 assert(parameter > 0);
467 k = ilog2_(parameter);
468 if(parameter == 1u<<k) {
477 d = (1 << (k+1)) - parameter;
478 q = uval / parameter;
479 r = uval - (q * parameter);
488 bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
490 unsigned total_bits, interesting_bits, msbs;
494 assert(bb->buffer != 0);
495 assert(parameter <= 31);
497 /* init pattern with the unary end bit and the sign bit */
505 msbs = val >> parameter;
506 interesting_bits = 2 + parameter;
507 total_bits = interesting_bits + msbs;
508 pattern <<= parameter;
509 pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
511 if(total_bits <= 32) {
512 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
516 /* write the unary MSBs */
517 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
519 /* write the unary end bit, the sign bit, and binary LSBs */
520 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
526 bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow)
528 unsigned total_bits, interesting_bits, msbs;
532 assert(bb->buffer != 0);
533 assert(parameter <= 31);
537 /* init pattern with the unary end bit and the sign bit */
545 msbs = val >> parameter;
546 interesting_bits = 2 + parameter;
547 total_bits = interesting_bits + msbs;
548 pattern <<= parameter;
549 pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
551 if(total_bits <= 32) {
552 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
555 else if(total_bits > max_bits) {
560 /* write the unary MSBs */
561 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
563 /* write the unary end bit, the sign bit, and binary LSBs */
564 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
570 static unsigned silog21_(int v)
593 bool FLAC__bitbuffer_write_symmetric_rice_signed_escape(FLAC__BitBuffer *bb, int val, unsigned parameter)
595 unsigned total_bits, val_bits;
600 assert(bb->buffer != 0);
601 assert(parameter <= 31);
603 val_bits = silog21_(val);
604 total_bits = 2 + parameter + 5 + val_bits;
607 if(total_bits <= 32) {
609 pattern <<= (parameter + 5);
611 pattern <<= val_bits;
612 pattern |= (val & ((1 << val_bits) - 1));
613 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
617 /* write the '-0' escape code first */
618 if(!FLAC__bitbuffer_write_raw_uint32(bb, 3u << parameter, 2+parameter))
620 /* write the length */
621 if(!FLAC__bitbuffer_write_raw_uint32(bb, val_bits, 5))
623 /* write the value */
624 if(!FLAC__bitbuffer_write_raw_int32(bb, val, val_bits))
627 fprintf(stderr,"wrote %u bits\n",bb->total_bits-x);
631 bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
633 unsigned total_bits, interesting_bits, msbs, uval;
637 assert(bb->buffer != 0);
638 assert(parameter <= 30);
640 /* convert signed to unsigned */
643 * (unsigned)(((--val) << 1) - 1);
644 * but without the overflow problem at -MAXINT
646 uval = (unsigned)(((-(++val)) << 1) + 1);
648 uval = (unsigned)(val << 1);
650 msbs = uval >> parameter;
651 interesting_bits = 1 + parameter;
652 total_bits = interesting_bits + msbs;
653 pattern = 1 << parameter; /* the unary end bit */
654 pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
656 if(total_bits <= 32) {
657 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
661 /* write the unary MSBs */
662 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
664 /* write the unary end bit and binary LSBs */
665 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
671 bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow)
673 unsigned total_bits, interesting_bits, msbs, uval;
677 assert(bb->buffer != 0);
678 assert(parameter <= 30);
682 /* convert signed to unsigned */
685 * (unsigned)(((--val) << 1) - 1);
686 * but without the overflow problem at -MAXINT
688 uval = (unsigned)(((-(++val)) << 1) + 1);
690 uval = (unsigned)(val << 1);
692 msbs = uval >> parameter;
693 interesting_bits = 1 + parameter;
694 total_bits = interesting_bits + msbs;
695 pattern = 1 << parameter; /* the unary end bit */
696 pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
698 if(total_bits <= 32) {
699 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
702 else if(total_bits > max_bits) {
707 /* write the unary MSBs */
708 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
710 /* write the unary end bit and binary LSBs */
711 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
717 bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
719 unsigned total_bits, msbs, uval;
723 assert(bb->buffer != 0);
724 assert(parameter > 0);
726 /* convert signed to unsigned */
729 * (unsigned)(((--val) << 1) - 1);
730 * but without the overflow problem at -MAXINT
732 uval = (unsigned)(((-(++val)) << 1) + 1);
734 uval = (unsigned)(val << 1);
736 k = ilog2_(parameter);
737 if(parameter == 1u<<k) {
743 total_bits = 1 + k + msbs;
744 pattern = 1 << k; /* the unary end bit */
745 pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
747 if(total_bits <= 32) {
748 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
752 /* write the unary MSBs */
753 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
755 /* write the unary end bit and binary LSBs */
756 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1))
763 d = (1 << (k+1)) - parameter;
764 q = uval / parameter;
765 r = uval - (q * parameter);
766 /* write the unary MSBs */
767 if(!FLAC__bitbuffer_write_zeroes(bb, q))
769 /* write the unary end bit */
770 if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1))
772 /* write the binary LSBs */
774 if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1))
778 if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k))
785 bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned uval, unsigned parameter)
787 unsigned total_bits, msbs;
791 assert(bb->buffer != 0);
792 assert(parameter > 0);
794 k = ilog2_(parameter);
795 if(parameter == 1u<<k) {
801 total_bits = 1 + k + msbs;
802 pattern = 1 << k; /* the unary end bit */
803 pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
805 if(total_bits <= 32) {
806 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
810 /* write the unary MSBs */
811 if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
813 /* write the unary end bit and binary LSBs */
814 if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1))
821 d = (1 << (k+1)) - parameter;
822 q = uval / parameter;
823 r = uval - (q * parameter);
824 /* write the unary MSBs */
825 if(!FLAC__bitbuffer_write_zeroes(bb, q))
827 /* write the unary end bit */
828 if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1))
830 /* write the binary LSBs */
832 if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1))
836 if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k))
843 bool FLAC__bitbuffer_write_utf8_uint32(FLAC__BitBuffer *bb, uint32 val)
848 assert(bb->buffer != 0);
850 assert(!(val & 0x80000000)); /* this version only handles 31 bits */
853 return FLAC__bitbuffer_write_raw_uint32(bb, val, 8);
855 else if(val < 0x800) {
856 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xC0 | (val>>6), 8);
857 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
859 else if(val < 0x10000) {
860 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xE0 | (val>>12), 8);
861 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
862 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
864 else if(val < 0x200000) {
865 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF0 | (val>>18), 8);
866 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
867 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
868 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
870 else if(val < 0x4000000) {
871 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF8 | (val>>24), 8);
872 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8);
873 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
874 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
875 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
878 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFC | (val>>30), 8);
879 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>24)&0x3F), 8);
880 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8);
881 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8);
882 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8);
883 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8);
889 bool FLAC__bitbuffer_write_utf8_uint64(FLAC__BitBuffer *bb, uint64 val)
894 assert(bb->buffer != 0);
896 assert(!(val & 0xFFFFFFF000000000)); /* this version only handles 36 bits */
899 return FLAC__bitbuffer_write_raw_uint32(bb, (uint32)val, 8);
901 else if(val < 0x800) {
902 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xC0 | (uint32)(val>>6), 8);
903 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
905 else if(val < 0x10000) {
906 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xE0 | (uint32)(val>>12), 8);
907 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>6)&0x3F), 8);
908 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
910 else if(val < 0x200000) {
911 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF0 | (uint32)(val>>18), 8);
912 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>12)&0x3F), 8);
913 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>6)&0x3F), 8);
914 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
916 else if(val < 0x4000000) {
917 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF8 | (uint32)(val>>24), 8);
918 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>18)&0x3F), 8);
919 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>12)&0x3F), 8);
920 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>6)&0x3F), 8);
921 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
923 else if(val < 0x80000000) {
924 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFC | (uint32)(val>>30), 8);
925 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>24)&0x3F), 8);
926 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>18)&0x3F), 8);
927 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>12)&0x3F), 8);
928 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>6)&0x3F), 8);
929 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
932 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFE, 8);
933 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>30)&0x3F), 8);
934 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>24)&0x3F), 8);
935 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>18)&0x3F), 8);
936 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>12)&0x3F), 8);
937 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)((val>>6)&0x3F), 8);
938 ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (uint32)(val&0x3F), 8);
944 bool FLAC__bitbuffer_zero_pad_to_byte_boundary(FLAC__BitBuffer *bb)
946 /* 0-pad to byte boundary */
948 return FLAC__bitbuffer_write_zeroes(bb, 8 - bb->bits);
953 bool FLAC__bitbuffer_peek_bit(FLAC__BitBuffer *bb, unsigned *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
955 static byte mask[] = { 128, 64, 32, 16, 8, 4, 2, 1 };
957 /* to avoid a drastic speed penalty we don't:
959 assert(bb->buffer != 0);
960 assert(bb->bits == 0);
964 if(bb->total_consumed_bits < bb->total_bits) {
965 *val = (bb->buffer[bb->consumed_bytes] & mask[bb->consumed_bits])? 1 : 0;
969 if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
975 bool FLAC__bitbuffer_read_bit(FLAC__BitBuffer *bb, unsigned *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
977 static byte mask[] = { 128, 64, 32, 16, 8, 4, 2, 1 };
979 /* to avoid a drastic speed penalty we don't:
981 assert(bb->buffer != 0);
982 assert(bb->bits == 0);
986 if(bb->total_consumed_bits < bb->total_bits) {
987 *val = (bb->buffer[bb->consumed_bytes] & mask[bb->consumed_bits])? 1 : 0;
989 if(bb->consumed_bits == 8) {
990 bb->consumed_bytes++;
991 bb->consumed_bits = 0;
993 bb->total_consumed_bits++;
997 if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
1003 bool FLAC__bitbuffer_read_bit_to_uint32(FLAC__BitBuffer *bb, uint32 *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1005 static byte mask[] = { 128, 64, 32, 16, 8, 4, 2, 1 };
1007 /* to avoid a drastic speed penalty we don't:
1009 assert(bb->buffer != 0);
1010 assert(bb->bits == 0);
1014 if(bb->total_consumed_bits < bb->total_bits) {
1016 *val |= (bb->buffer[bb->consumed_bytes] & mask[bb->consumed_bits])? 1 : 0;
1017 bb->consumed_bits++;
1018 if(bb->consumed_bits == 8) {
1019 bb->consumed_bytes++;
1020 bb->consumed_bits = 0;
1022 bb->total_consumed_bits++;
1026 if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
1032 bool FLAC__bitbuffer_read_bit_to_uint64(FLAC__BitBuffer *bb, uint64 *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1034 static byte mask[] = { 128, 64, 32, 16, 8, 4, 2, 1 };
1036 /* to avoid a drastic speed penalty we don't:
1038 assert(bb->buffer != 0);
1039 assert(bb->bits == 0);
1043 if(bb->total_consumed_bits < bb->total_bits) {
1045 *val |= (bb->buffer[bb->consumed_bytes] & mask[bb->consumed_bits])? 1 : 0;
1046 bb->consumed_bits++;
1047 if(bb->consumed_bits == 8) {
1048 bb->consumed_bytes++;
1049 bb->consumed_bits = 0;
1051 bb->total_consumed_bits++;
1055 if(!bitbuffer_read_from_client_(bb, read_callback, client_data))
1061 bool FLAC__bitbuffer_read_raw_uint32(FLAC__BitBuffer *bb, uint32 *val, unsigned bits, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1066 assert(bb->buffer != 0);
1071 for(i = 0; i < bits; i++) {
1072 if(!FLAC__bitbuffer_read_bit_to_uint32(bb, val, read_callback, client_data))
1078 bool FLAC__bitbuffer_read_raw_int32(FLAC__BitBuffer *bb, int32 *val, unsigned bits, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1084 assert(bb->buffer != 0);
1089 for(i = 0; i < bits; i++) {
1090 if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &x, read_callback, client_data))
1106 bool FLAC__bitbuffer_read_raw_uint64(FLAC__BitBuffer *bb, uint64 *val, unsigned bits, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1111 assert(bb->buffer != 0);
1116 for(i = 0; i < bits; i++) {
1117 if(!FLAC__bitbuffer_read_bit_to_uint64(bb, val, read_callback, client_data))
1123 bool FLAC__bitbuffer_read_raw_int64(FLAC__BitBuffer *bb, int64 *val, unsigned bits, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1129 assert(bb->buffer != 0);
1134 for(i = 0; i < bits; i++) {
1135 if(!FLAC__bitbuffer_read_bit_to_uint64(bb, &x, read_callback, client_data))
1151 bool FLAC__bitbuffer_read_symmetric_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1153 uint32 sign = 0, lsbs = 0, msbs = 0;
1157 assert(bb->buffer != 0);
1158 assert(parameter <= 31);
1160 /* read the unary MSBs and end bit */
1162 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1169 /* read the sign bit */
1170 if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &sign, read_callback, client_data))
1172 /* read the binary LSBs */
1173 if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, parameter, read_callback, client_data))
1176 /* compose the value */
1177 *val = (msbs << parameter) | lsbs;
1184 bool FLAC__bitbuffer_read_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1186 uint32 lsbs = 0, msbs = 0;
1190 assert(bb->buffer != 0);
1191 assert(parameter <= 31);
1193 /* read the unary MSBs and end bit */
1195 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1202 /* read the binary LSBs */
1203 if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, parameter, read_callback, client_data))
1205 /* compose the value */
1206 uval = (msbs << parameter) | lsbs;
1208 *val = -((int)(uval >> 1)) - 1;
1210 *val = (int)(uval >> 1);
1215 bool FLAC__bitbuffer_read_golomb_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1217 uint32 lsbs = 0, msbs = 0;
1218 unsigned bit, uval, k;
1221 assert(bb->buffer != 0);
1223 k = ilog2_(parameter);
1225 /* read the unary MSBs and end bit */
1227 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1234 /* read the binary LSBs */
1235 if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, k, read_callback, client_data))
1238 if(parameter == 1u<<k) {
1239 /* compose the value */
1240 uval = (msbs << k) | lsbs;
1243 unsigned d = (1 << (k+1)) - parameter;
1245 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1251 /* compose the value */
1252 uval = msbs * parameter + lsbs;
1255 /* unfold unsigned to signed */
1257 *val = -((int)(uval >> 1)) - 1;
1259 *val = (int)(uval >> 1);
1264 bool FLAC__bitbuffer_read_golomb_unsigned(FLAC__BitBuffer *bb, unsigned *val, unsigned parameter, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data)
1266 uint32 lsbs, msbs = 0;
1270 assert(bb->buffer != 0);
1272 k = ilog2_(parameter);
1274 /* read the unary MSBs and end bit */
1276 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1283 /* read the binary LSBs */
1284 if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, k, read_callback, client_data))
1287 if(parameter == 1u<<k) {
1288 /* compose the value */
1289 *val = (msbs << k) | lsbs;
1292 unsigned d = (1 << (k+1)) - parameter;
1294 if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
1300 /* compose the value */
1301 *val = msbs * parameter + lsbs;
1307 /* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */
1308 bool FLAC__bitbuffer_read_utf8_uint32(FLAC__BitBuffer *bb, uint32 *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data, byte *raw, unsigned *rawlen)
1314 if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
1317 raw[(*rawlen)++] = (byte)x;
1318 if(!(x & 0x80)) { /* 0xxxxxxx */
1322 else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
1326 else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
1330 else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
1334 else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
1338 else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
1345 if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
1348 raw[(*rawlen)++] = (byte)x;
1349 if(!(x & 0x80) || (x & 0x40)) /* 10xxxxxx */
1361 /* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */
1362 bool FLAC__bitbuffer_read_utf8_uint64(FLAC__BitBuffer *bb, uint64 *val, bool (*read_callback)(byte buffer[], unsigned *bytes, void *client_data), void *client_data, byte *raw, unsigned *rawlen)
1368 if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
1371 raw[(*rawlen)++] = (byte)x;
1372 if(!(x & 0x80)) { /* 0xxxxxxx */
1376 else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */
1380 else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */
1384 else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */
1388 else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */
1392 else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */
1396 else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */
1403 if(!FLAC__bitbuffer_read_raw_uint32(bb, &x, 8, read_callback, client_data))
1406 raw[(*rawlen)++] = (byte)x;
1407 if(!(x & 0x80) || (x & 0x40)) /* 10xxxxxx */
1419 void FLAC__bitbuffer_dump(const FLAC__BitBuffer *bb, FILE *out)
1423 fprintf(out, "bitbuffer is NULL\n");
1426 fprintf(out, "bitbuffer: capacity=%u bytes=%u bits=%u total_bits=%u consumed: bytes=%u, bits=%u, total_bits=%u\n", bb->capacity, bb->bytes, bb->bits, bb->total_bits, bb->consumed_bytes, bb->consumed_bits, bb->total_consumed_bits);
1427 for(i = 0; i < bb->bytes; i++) {
1428 fprintf(out, "%08X: ", i);
1429 for(j = 0; j < 8; j++)
1430 if(i*8+j < bb->total_consumed_bits)
1433 fprintf(out, "%01u", bb->buffer[i] & (1 << (8-j-1)) ? 1:0);
1437 fprintf(out, "%08X: ", i);
1438 for(j = 0; j < bb->bits; j++)
1439 if(i*8+j < bb->total_consumed_bits)
1442 fprintf(out, "%01u", bb->buffer[i] & (1 << (bb->bits-j-1)) ? 1:0);