package org.geogebra.desktop.sound.mp3transform;
public class BitReservoir2 extends BitReservoir {
private static final int BUFFER_SIZE = 4096;
private static final int BUFFER_SIZE_MASK = BUFFER_SIZE - 1;
private int writeIndex, bitCount;
private final byte[] buffer = new byte[BUFFER_SIZE];
@Override
int getBitCount() {
return bitCount;
}
@Override
int getBits(int n) {
int x = 0;
for (int i = 0; i < n; i++) {
x = (x << 1) | (getOneBit() == 0 ? 0 : 1);
}
return x;
}
@Override
int getOneBit() {
// byte
int x = buffer[bitCount >>> 3] & (1 << (7 - (bitCount++ & 7)));
bitCount = (bitCount + 1) & (BUFFER_SIZE * 8 - 1);
return x;
// int
// return buffer[bitCount >>> 5] & (1 << (31 - (bitCount++ & 31)));
// if(bitCount > 31) {
// readByte();
// }
// return r;
}
// private void readByte() {
// readIndex = (readIndex + 1) & BUFFER_SIZE_MASK;
// current = buffer[readIndex];
// bitCount = 0;
// }
@Override
void putByte(int val) {
int wi = writeIndex;
buffer[wi] |= val << (8 * (wi & 3));
writeIndex = (wi + 1) & BUFFER_SIZE_MASK;
}
@Override
void rewindBits(int n) {
bitCount -= n;
}
@Override
void rewindBytes(int n) {
bitCount -= n * 8;
}
}