/*
* Copyright (C) 2011 in-somnia
*
* This file is part of JAAD.
*
* JAAD is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* JAAD is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.jaad.aac.error;
import net.sourceforge.jaad.aac.AACException;
import net.sourceforge.jaad.aac.syntax.BitStream;
public class BitsBuffer {
int bufa, bufb, len;
public BitsBuffer() {
len = 0;
}
public int getLength() {
return len;
}
public int showBits(int bits) {
if(bits==0) return 0;
if(len<=32) {
//huffman_spectral_data_2 needs to read more than may be available,
//bits maybe > len, deliver 0 than
if(len>=bits) return ((bufa>>(len-bits))&(0xFFFFFFFF>>(32-bits)));
else return ((bufa<<(bits-len))&(0xFFFFFFFF>>(32-bits)));
}
else {
if((len-bits)<32) return ((bufb&(0xFFFFFFFF>>(64-len)))<<(bits-len+32))|(bufa>>(len-bits));
else return ((bufb>>(len-bits-32))&(0xFFFFFFFF>>(32-bits)));
}
}
public boolean flushBits(int bits) {
len -= bits;
boolean b;
if(len<0) {
len = 0;
b = false;
}
else b = true;
return b;
}
public int getBits(int n) {
int i = showBits(n);
if(!flushBits(n)) i = -1;
return i;
}
public int getBit() {
int i = showBits(1);
if(!flushBits(1)) i = -1;
return i;
}
public void rewindReverse() {
if(len==0) return;
final int[] i = HCR.rewindReverse64(bufb, bufa, len);
bufb = i[0];
bufa = i[1];
}
//merge bits of a to b
public void concatBits(BitsBuffer a) {
if(a.len==0) return;
int al = a.bufa;
int ah = a.bufb;
int bl, bh;
if(len>32) {
//mask off superfluous high b bits
bl = bufa;
bh = bufb&((1<<(len-32))-1);
//left shift a len bits
ah = al<<(len-32);
al = 0;
}
else {
bl = bufa&((1<<(len))-1);
bh = 0;
ah = (ah<<(len))|(al>>(32-len));
al = al<<len;
}
//merge
bufa = bl|al;
bufb = bh|ah;
len += a.len;
}
public void readSegment(int segwidth, BitStream in) throws AACException {
len = segwidth;
if(segwidth>32) {
bufb = in.readBits(segwidth-32);
bufa = in.readBits(32);
}
else {
bufa = in.readBits(segwidth);
bufb = 0;
}
}
}