return bits;
}
+bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
+{
+ unsigned total_bits, interesting_bits, msbs;
+ uint32 pattern;
+
+ assert(bb != 0);
+ assert(bb->buffer != 0);
+ assert(parameter <= 31);
+
+ /* init pattern with the unary end bit and the sign bit */
+ if(val < 0) {
+ pattern = 3;
+ val = -val;
+ }
+ else
+ pattern = 2;
+
+ msbs = val >> parameter;
+ interesting_bits = 2 + parameter;
+ total_bits = interesting_bits + msbs;
+ pattern <<= parameter;
+ pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
+
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
+ return false;
+ }
+ else {
+ /* write the unary MSBs */
+ if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
+ return false;
+ /* write the unary end bit, the sign bit, and binary LSBs */
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
+ return false;
+ }
+ return true;
+}
+
+bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow)
+{
+ unsigned total_bits, interesting_bits, msbs;
+ uint32 pattern;
+
+ assert(bb != 0);
+ assert(bb->buffer != 0);
+ assert(parameter <= 31);
+
+ *overflow = false;
+
+ /* init pattern with the unary end bit and the sign bit */
+ if(val < 0) {
+ pattern = 3;
+ val = -val;
+ }
+ else
+ pattern = 2;
+
+ msbs = val >> parameter;
+ interesting_bits = 2 + parameter;
+ total_bits = interesting_bits + msbs;
+ pattern <<= parameter;
+ pattern |= (val & ((1<<parameter)-1)); /* the binary LSBs */
+
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
+ return false;
+ }
+ else if(total_bits > max_bits) {
+ *overflow = true;
+ return true;
+ }
+ else {
+ /* write the unary MSBs */
+ if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
+ return false;
+ /* write the unary end bit, the sign bit, and binary LSBs */
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
+ return false;
+ }
+ return true;
+}
+
bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
{
- unsigned bits, msbs, uval;
+ unsigned total_bits, interesting_bits, msbs, uval;
uint32 pattern;
assert(bb != 0);
uval = (unsigned)(val << 1);
msbs = uval >> parameter;
- bits = 1 + parameter + msbs;
+ interesting_bits = 1 + parameter;
+ total_bits = interesting_bits + msbs;
pattern = 1 << parameter; /* the unary end bit */
pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
- if(bits <= 32) {
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, bits))
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
return false;
}
else {
if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
return false;
/* write the unary end bit and binary LSBs */
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, parameter+1))
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
return false;
}
return true;
bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow)
{
- unsigned bits, msbs, uval;
+ unsigned total_bits, interesting_bits, msbs, uval;
uint32 pattern;
assert(bb != 0);
uval = (unsigned)(val << 1);
msbs = uval >> parameter;
- bits = 1 + parameter + msbs;
+ interesting_bits = 1 + parameter;
+ total_bits = interesting_bits + msbs;
pattern = 1 << parameter; /* the unary end bit */
pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */
- if(bits <= 32) {
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, bits))
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
return false;
}
- else if(bits > max_bits) {
+ else if(total_bits > max_bits) {
*overflow = true;
return true;
}
if(!FLAC__bitbuffer_write_zeroes(bb, msbs))
return false;
/* write the unary end bit and binary LSBs */
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, parameter+1))
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits))
return false;
}
return true;
bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter)
{
- unsigned bits, msbs, uval;
+ unsigned total_bits, msbs, uval;
unsigned k;
assert(bb != 0);
assert(k <= 30);
msbs = uval >> k;
- bits = 1 + k + msbs;
+ total_bits = 1 + k + msbs;
pattern = 1 << k; /* the unary end bit */
pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
- if(bits <= 32) {
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, bits))
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
return false;
}
else {
bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned uval, unsigned parameter)
{
- unsigned bits, msbs;
+ unsigned total_bits, msbs;
unsigned k;
assert(bb != 0);
assert(k <= 30);
msbs = uval >> k;
- bits = 1 + k + msbs;
+ total_bits = 1 + k + msbs;
pattern = 1 << k; /* the unary end bit */
pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */
- if(bits <= 32) {
- if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, bits))
+ if(total_bits <= 32) {
+ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits))
return false;
}
else {
return true;
}
+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)
+{
+ uint32 sign = 0, lsbs = 0, msbs = 0;
+ unsigned bit;
+
+ assert(bb != 0);
+ assert(bb->buffer != 0);
+ assert(parameter <= 31);
+
+ /* read the unary MSBs and end bit */
+ while(1) {
+ if(!FLAC__bitbuffer_read_bit(bb, &bit, read_callback, client_data))
+ return false;
+ if(bit)
+ break;
+ else
+ msbs++;
+ }
+ /* read the sign bit */
+ if(!FLAC__bitbuffer_read_bit_to_uint32(bb, &sign, read_callback, client_data))
+ return false;
+ /* read the binary LSBs */
+ if(!FLAC__bitbuffer_read_raw_uint32(bb, &lsbs, parameter, read_callback, client_data))
+ return false;
+
+ /* compose the value */
+ *val = (msbs << parameter) | lsbs;
+ if(sign)
+ *val = -(*val);
+
+ return true;
+}
+
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)
{
uint32 lsbs = 0, msbs = 0;
assert(bb != 0);
assert(bb->buffer != 0);
- assert(parameter <= 32);
+ assert(parameter <= 31);
/* read the unary MSBs and end bit */
while(1) {
unsigned FLAC__bitbuffer_rice_bits(int val, unsigned parameter);
unsigned FLAC__bitbuffer_golomb_bits_signed(int val, unsigned parameter);
unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned val, unsigned parameter);
+bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
+bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow);
bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, bool *overflow);
bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
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);
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);
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);
+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);
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);
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);
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);