package org.jcodec.codecs.h264.io.write;
import static org.jcodec.common.tools.Debug.trace;
import org.jcodec.api.NotImplementedException;
import org.jcodec.common.io.BitWriter;
import org.jcodec.common.tools.MathUtil;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* A class responsible for outputting exp-Golomb values into binary stream
*
* @author The JCodec project
*
*/
public class CAVLCWriter {
private CAVLCWriter() {
}
public static void writeUtrace(BitWriter out, int value, int n, String message) {
out.writeNBit(value, n);
trace(message, value);
}
public static void writeUE(BitWriter out, int value) {
int bits = 0;
int cumul = 0;
for (int i = 0; i < 15; i++) {
if (value < cumul + (1 << i)) {
bits = i;
break;
}
cumul += (1 << i);
}
out.writeNBit(0, bits);
out.write1Bit(1);
out.writeNBit(value - cumul, bits);
}
public static void writeSE(BitWriter out, int value) {
writeUE(out, MathUtil.golomb(value));
}
public static void writeUEtrace(BitWriter out, int value, String message) {
writeUE(out, value);
trace(message, value);
}
public static void writeSEtrace(BitWriter out, int value, String message) {
writeUE(out, MathUtil.golomb(value));
trace(message, value);
}
public static void writeTE(BitWriter out, int value, int max) {
if (max > 1)
writeUE(out, value);
else
out.write1Bit(~value & 0x1);
}
public static void writeBool(BitWriter out, boolean value, String message) {
out.write1Bit(value ? 1 : 0);
trace(message, value ? 1 : 0);
}
public static void writeU(BitWriter out, int i, int n) {
out.writeNBit(i, n);
}
public static void writeNBit(BitWriter out, long value, int n, String message) {
for (int i = 0; i < n; i++) {
out.write1Bit((int) (value >> (n - i - 1)) & 0x1);
}
trace(message, value);
}
public static void writeTrailingBits(BitWriter out) {
out.write1Bit(1);
out.flush();
}
public static void writeSliceTrailingBits() {
throw new NotImplementedException("todo");
}
}