package org.jcodec.codecs.common.biari;
import java.io.IOException;
/**
* This class is part of JCodec ( www.jcodec.org )
* This software is distributed under FreeBSD License
*
* Binarization and context modeling using binary search tree
*
* @author The JCodec project
*
*/
public class TreeBinarizer {
private Context[] models;
// private int nZeros[];
// private int nOnes[];
public TreeBinarizer() {
initContextModels();
}
private void initContextModels() {
// nZeros = new int[255];
// nOnes = new int[255];
models = new Context[255];
for (int i = 0; i < 255; i++) {
models[i] = new Context(0, 0);
// nZeros[i] = 1;
// nOnes[i] = 1;
}
}
public void binarize(int symbol, MQEncoder encoder) throws IOException {
int inverted = 0;
int nextModel = 0;
int levelOffset = 0;
for (int i = 0; i < 8; ++i) {
int bin = (symbol >> (7 - i)) & 0x1;
encoder.encode(bin, models[nextModel]);
// updateModel(nextModel, bin);
inverted |= bin << i;
levelOffset += (1 << i);
nextModel = levelOffset + inverted;
}
}
public int debinarize(MQDecoder decoder) throws IOException {
int symbol = 0;
int inverted = 0;
int nextModel = 0;
int levelOffset = 0;
for (int i = 0; i < 8; ++i) {
int bin = decoder.decode(models[nextModel]);
symbol |= (bin << (7 - i));
// updateModel(nextModel, bin);
inverted |= bin << i;
levelOffset += (1 << i);
nextModel = levelOffset + inverted;
}
return symbol;
}
// private void updateModel(int mId, int bin) {
// if (bin == 0)
// ++nZeros[mId];
// else
// ++nOnes[mId];
//
// ContextModel cm = models[mId];
// if (nZeros[mId] > nOnes[mId]) {
// cm.setMps(0);
// cm.setState((double) nOnes[mId] / (nZeros[mId] + nOnes[mId]));
// } else {
// cm.setMps(1);
// cm.setState((double) nZeros[mId] / (nZeros[mId] + nOnes[mId]));
// }
// }
}