pub fn bitsVbr(value: anytype, comptime vbr_bits: usize) u16 valuevbr_bits: usize113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 pub fn bitsVbr(value: anytype, comptime vbr_bits: usize) u16 {
comptime {
std.debug.assert(vbr_bits > 1);
if (@bitSizeOf(@TypeOf(value)) > 64) @compileError("Unsupported VBR block type: " ++ @typeName(@TypeOf(value)));
}
var bits: u16 = 0;
var in_buffer = bufValue(value, vbr_bits);
const continue_bit = @as(@TypeOf(in_buffer), 1) << @intCast(vbr_bits - 1);
const mask = continue_bit - 1;
// If input is larger than one VBR block can store
// then store vbr_bits - 1 bits and a continue bit
while (in_buffer > mask) {
bits += @intCast(vbr_bits);
in_buffer >>= @intCast(vbr_bits - 1);
}
// Store remaining bits
bits += @intCast(vbr_bits);
return bits;
}