/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
//package net.java.sip.communicator.impl.media.codec.audio.ilbc;
package org.red5.app.sip.codecs.ilbc;
/**
* @author Jean Lorchat
*/
public class bitstream {
int bitcount;
int pos;
public char [] buffer;
int buffer_len;
int buffer_pos;
public bitstream(int size) {
pos = 0;
buffer_len = size;
buffer_pos = 0;
buffer = new char[size];
bitcount = 0;
}
public bitstream() {
pos = 0;
buffer_len = 128;
buffer_pos = 0;
buffer = new char[128];
}
/*----------------------------------------------------------------*
* splitting an integer into first most significant bits and
* remaining least significant bits
*---------------------------------------------------------------*/
public bitpack packsplit(
int index, /* (i) the value to split */
int bitno_firstpart, /* (i) number of bits in most
significant part */
int bitno_total) /* (i) number of bits in full range
of value */
{
int bitno_rest = bitno_total - bitno_firstpart;
bitpack rval = new bitpack ();
int fp = index >>> bitno_rest;
rval.set_firstpart(fp);
// *firstpart = *index>>(bitno_rest);
rval.set_rest(index - (rval.get_firstpart() << bitno_rest));
// *rest = *index-(*firstpart<<(bitno_rest));
return rval;
}
/*----------------------------------------------------------------*
* combining a value corresponding to msb's with a value
* corresponding to lsb's
*---------------------------------------------------------------*/
int packcombine(
int index, /* (i/o) the msb value in the
combined value out */
int rest, /* (i) the lsb value */
int bitno_rest /* (i) the number of bits in the
lsb part */
){
index = index << bitno_rest;
index += rest;
return index;
}
/*----------------------------------------------------------------*
* packing of bits into bitstream, i.e., vector of bytes
*---------------------------------------------------------------*/
void dopack(
// unsigned char **bitstream, /* (i/o) on entrance pointer to
// place in bitstream to pack
// new data, on exit pointer
// to place in bitstream to
// pack future data */
int index, /* (i) the value to pack */
int bitno /* (i) the number of bits that the
value will fit within */
){
int posLeft;
// System.out.println("packing " + bitno + " bits (" + index + "), total packed : " + (bitcount+bitno) + " bits to date");
bitcount += bitno;
// System.out.println("packing tag " + index + " of length " + bitno + "bits from byte " + buffer_pos + "/" + buffer.length + " at " + pos + "th bit");
/* Clear the bits before starting in a new byte */
if (pos == 0) {
buffer[buffer_pos] = 0;
}
while (bitno > 0) {
/* Jump to the next byte if end of this byte is reached*/
if (pos == 8) {
pos = 0;
buffer_pos++;
buffer[buffer_pos] = 0;
}
posLeft = 8 - pos;
/* Insert index into the bitstream */
if (bitno <= posLeft) {
buffer[buffer_pos] |= (char) (index << (posLeft - bitno));
pos += bitno;
bitno = 0;
} else {
buffer[buffer_pos] |= (char)(index >>> (bitno - posLeft));
pos = 8;
index -= ((index >>> (bitno - posLeft)) << (bitno - posLeft));
bitno -= posLeft;
}
}
}
/*----------------------------------------------------------------*
* unpacking of bits from bitstream, i.e., vector of bytes
*---------------------------------------------------------------*/
public int unpack(
int bitno /* (i) number of bits used to
represent the value */
)
{
int BitsLeft;
int index=0;
while (bitno > 0) {
/* move forward in bitstream when the end of the
byte is reached */
if (pos == 8) {
pos = 0;
buffer_pos++;
}
BitsLeft = 8 - pos;
/* Extract bits to index */
if (BitsLeft >= bitno) {
index += ((((buffer[buffer_pos]) << (pos)) & 0xFF) >>> (8 - bitno));
pos += bitno;
bitno = 0;
} else {
if ((8 - bitno) > 0) {
index+=((((buffer[buffer_pos]) << (pos)) & 0xFF) >>> (8 - bitno));
pos=8;
} else {
index+=(((int)(((buffer[buffer_pos]) << (pos)) & 0xFF)) << (bitno - 8));
pos=8;
}
bitno -= BitsLeft;
}
}
return index;
}
}