54 lines
1.1 KiB
Java
54 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];
|
|
}
|
|
}
|