63 lines
1.1 KiB
Java
63 lines
1.1 KiB
Java
package btools.codec;
|
|
|
|
/**
|
|
* Special integer fifo suitable for 3-pass encoding
|
|
*/
|
|
public class IntegerFifo3Pass
|
|
{
|
|
private int[] a;
|
|
private int size;
|
|
private int pos;
|
|
|
|
private int pass;
|
|
|
|
public IntegerFifo3Pass( int capacity )
|
|
{
|
|
a = capacity < 4 ? new int[4] : new int[capacity];
|
|
}
|
|
|
|
/**
|
|
* Starts a new encoding pass and resets the reading pointer
|
|
* from the stats collected in pass2 and writes that to the given context
|
|
*/
|
|
public void init()
|
|
{
|
|
pass++;
|
|
pos = 0;
|
|
}
|
|
|
|
/**
|
|
* writes to the fifo in pass2
|
|
*/
|
|
public void add( int value )
|
|
{
|
|
if ( pass == 2 )
|
|
{
|
|
if ( size == a.length )
|
|
{
|
|
int[] aa = new int[2 * size];
|
|
System.arraycopy( a, 0, aa, 0, size );
|
|
a = aa;
|
|
}
|
|
a[size++] = value;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* reads from the fifo in pass3 (in pass1/2 returns just 1)
|
|
*/
|
|
public int getNext()
|
|
{
|
|
return pass == 3 ? get( pos++ ) : 1;
|
|
}
|
|
|
|
private int get( int idx )
|
|
{
|
|
if ( idx >= size )
|
|
{
|
|
throw new IndexOutOfBoundsException( "list size=" + size + " idx=" + idx );
|
|
}
|
|
return a[idx];
|
|
}
|
|
}
|