📄 bitbuffer.c
字号:
FLAC__ASSERT(k <= 30); msbs = uval >> k; bits = 1 + k + msbs; } else { unsigned q, r, d; d = (1 << (k+1)) - parameter; q = uval / parameter; r = uval - (q * parameter); bits = 1 + q + k; if(r >= d) bits++; } return bits;}unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned uval, unsigned parameter){ unsigned bits, msbs; unsigned k; FLAC__ASSERT(parameter > 0); k = FLAC__bitmath_ilog2(parameter); if(parameter == 1u<<k) { FLAC__ASSERT(k <= 30); msbs = uval >> k; bits = 1 + k + msbs; } else { unsigned q, r, d; d = (1 << (k+1)) - parameter; q = uval / parameter; r = uval - (q * parameter); bits = 1 + q + k; if(r >= d) bits++; } return bits;}#endif /* UNUSED */#ifdef FLAC__SYMMETRIC_RICEFLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter){ unsigned total_bits, interesting_bits, msbs; FLAC__uint32 pattern; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__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;}#if 0 /* UNUSED */FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow){ unsigned total_bits, interesting_bits, msbs; FLAC__uint32 pattern; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__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;}#endif /* UNUSED */FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_escape(FLAC__BitBuffer *bb, int val, unsigned parameter){ unsigned total_bits, val_bits; FLAC__uint32 pattern; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(parameter <= 31); val_bits = FLAC__bitmath_silog2(val); total_bits = 2 + parameter + 5 + val_bits; if(total_bits <= 32) { pattern = 3; pattern <<= (parameter + 5); pattern |= val_bits; pattern <<= val_bits; pattern |= (val & ((1 << val_bits) - 1)); if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, total_bits)) return false; } else { /* write the '-0' escape code first */ if(!FLAC__bitbuffer_write_raw_uint32(bb, 3u << parameter, 2+parameter)) return false; /* write the length */ if(!FLAC__bitbuffer_write_raw_uint32(bb, val_bits, 5)) return false; /* write the value */ if(!FLAC__bitbuffer_write_raw_int32(bb, val, val_bits)) return false; } return true;}#endif /* ifdef FLAC__SYMMETRIC_RICE */FLAC__bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter){ unsigned total_bits, interesting_bits, msbs, uval; FLAC__uint32 pattern; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(parameter <= 30); /* fold signed to unsigned */ if(val < 0) /* equivalent to * (unsigned)(((--val) << 1) - 1); * but without the overflow problem at MININT */ uval = (unsigned)(((-(++val)) << 1) + 1); else uval = (unsigned)(val << 1); msbs = uval >> parameter; 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(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 and binary LSBs */ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits)) return false; } return true;}#if 0 /* UNUSED */FLAC__bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow){ unsigned total_bits, interesting_bits, msbs, uval; FLAC__uint32 pattern; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(parameter <= 30); *overflow = false; /* fold signed to unsigned */ if(val < 0) /* equivalent to * (unsigned)(((--val) << 1) - 1); * but without the overflow problem at MININT */ uval = (unsigned)(((-(++val)) << 1) + 1); else uval = (unsigned)(val << 1); msbs = uval >> parameter; 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(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 and binary LSBs */ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, interesting_bits)) return false; } return true;}#endif /* UNUSED */#if 0 /* UNUSED */FLAC__bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter){ unsigned total_bits, msbs, uval; unsigned k; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(parameter > 0); /* fold signed to unsigned */ if(val < 0) /* equivalent to * (unsigned)(((--val) << 1) - 1); * but without the overflow problem at MININT */ uval = (unsigned)(((-(++val)) << 1) + 1); else uval = (unsigned)(val << 1); k = FLAC__bitmath_ilog2(parameter); if(parameter == 1u<<k) { unsigned pattern; FLAC__ASSERT(k <= 30); msbs = uval >> k; total_bits = 1 + k + msbs; pattern = 1 << k; /* the unary end bit */ pattern |= (uval & ((1u<<k)-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 and binary LSBs */ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1)) return false; } } else { unsigned q, r, d; d = (1 << (k+1)) - parameter; q = uval / parameter; r = uval - (q * parameter); /* write the unary MSBs */ if(!FLAC__bitbuffer_write_zeroes(bb, q)) return false; /* write the unary end bit */ if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1)) return false; /* write the binary LSBs */ if(r >= d) { if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1)) return false; } else { if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k)) return false; } } return true;}FLAC__bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned uval, unsigned parameter){ unsigned total_bits, msbs; unsigned k; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(parameter > 0); k = FLAC__bitmath_ilog2(parameter); if(parameter == 1u<<k) { unsigned pattern; FLAC__ASSERT(k <= 30); msbs = uval >> k; total_bits = 1 + k + msbs; pattern = 1 << k; /* the unary end bit */ pattern |= (uval & ((1u<<k)-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 and binary LSBs */ if(!FLAC__bitbuffer_write_raw_uint32(bb, pattern, k+1)) return false; } } else { unsigned q, r, d; d = (1 << (k+1)) - parameter; q = uval / parameter; r = uval - (q * parameter); /* write the unary MSBs */ if(!FLAC__bitbuffer_write_zeroes(bb, q)) return false; /* write the unary end bit */ if(!FLAC__bitbuffer_write_raw_uint32(bb, 1, 1)) return false; /* write the binary LSBs */ if(r >= d) { if(!FLAC__bitbuffer_write_raw_uint32(bb, r+d, k+1)) return false; } else { if(!FLAC__bitbuffer_write_raw_uint32(bb, r, k)) return false; } } return true;}#endif /* UNUSED */FLAC__bool FLAC__bitbuffer_write_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val){ FLAC__bool ok = 1; FLAC__ASSERT(0 != bb); FLAC__ASSERT(0 != bb->buffer); FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ if(val < 0x80) { return FLAC__bitbuffer_write_raw_uint32(bb, val, 8); } else if(val < 0x800) { ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xC0 | (val>>6), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8); } else if(val < 0x10000) { ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xE0 | (val>>12), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8); } else if(val < 0x200000) { ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF0 | (val>>18), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8); } else if(val < 0x4000000) { ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xF8 | (val>>24), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8); } else { ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0xFC | (val>>30), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>24)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>18)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>12)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | ((val>>6)&0x3F), 8); ok &= FLAC__bitbuffer_write_raw_uint32(bb, 0x80 | (val&0x3F), 8); } return ok;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -