package com.wavpack.decoder;
import java.io.RandomAccessFile;
/*
** BitsUtils.java
**
** Copyright (c) 2007 - 2008 Peter McQuillan
**
** All Rights Reserved.
**
** Distributed under the BSD Software License (see license.txt)
**
*/
class BitsUtils {
static Bitstream getbit(Bitstream bs) {
int uns_buf = 0;
if (bs.bc > 0) {
bs.bc--;
} else {
bs.ptr++;
bs.buf_index++;
bs.bc = 7;
if (bs.ptr == bs.end) {
// wrap call here
bs = bs_read(bs);
}
uns_buf = (int) (bs.buf[bs.buf_index] & 0xff);
bs.sr = uns_buf;
}
if ((bs.sr & 1) > 0) {
bs.sr = bs.sr >> 1;
bs.bitval = 1;
return bs;
} else {
bs.sr = bs.sr >> 1;
bs.bitval = 0;
return bs;
}
}
static long getbits(int nbits, Bitstream bs) {
int uns_buf;
long value;
while ((nbits) > bs.bc) {
bs.ptr++;
bs.buf_index++;
if (bs.ptr == bs.end) {
bs = bs_read(bs);
}
uns_buf = (int) (bs.buf[bs.buf_index] & 0xff);
bs.sr = bs.sr | (uns_buf << bs.bc); // values in buffer must be unsigned
bs.bc += 8;
}
value = bs.sr;
if (bs.bc > 32) {
bs.bc -= (nbits);
bs.sr = (bs.ptr) >> (8 - bs.bc);
} else {
bs.bc -= (nbits);
bs.sr >>= (nbits);
}
return (value);
}
static Bitstream bs_open_read(Bitstream bs, byte[] stream, short buffer_start, short buffer_end, RandomAccessFile file,
long file_bytes, int passed) {
// CLEAR (*bs);
bs.buf = stream;
bs.buf_index = buffer_start;
bs.end = buffer_end;
bs.sr = 0;
bs.bc = 0;
if (passed != 0) {
bs.ptr = (short) (bs.end - 1);
bs.file_bytes = file_bytes;
bs.file = file;
} else {
/* Strange to set an index to -1, but the very first call to getbit will iterate this */
bs.buf_index = -1;
bs.ptr = (short) -1;
}
return bs;
}
static Bitstream bs_read(Bitstream bs) {
byte[] buf = bs.temp_buf;
if (bs.file_bytes > 0) {
long bytes_read, bytes_to_read;
bytes_to_read = 65536;
if (bytes_to_read > bs.file_bytes)
bytes_to_read = bs.file_bytes;
try {
bytes_read = bs.file.read(buf, 0, (int) bytes_to_read);
bs.buf_index = 0;
bs.buf = buf;
} catch (Exception e) {
System.err.println("Big error while reading file: " + e);
bytes_read = 0;
}
if (bytes_read > 0) {
bs.end = (short) (bytes_read);
bs.file_bytes -= bytes_read;
} else {
for (int i = 0; i < bs.end - bs.buf_index; i++) {
bs.buf[i] = -1;
}
bs.error = 1;
}
} else {
bs.error = 1;
}
if (bs.error > 0) {
for (int i = 0; i < bs.end - bs.buf_index; i++) {
bs.buf[i] = -1;
}
}
bs.ptr = 0;
bs.buf_index = 0;
return bs;
}
}