package org.jcodec.common.io; import org.jcodec.common.IntArrayList; import org.jcodec.common.IntIntMap; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * prefix VLC reader builder * * @author The JCodec project * */ public class VLCBuilder { public static VLCBuilder createVLCBuilder(int[] codes, int[] lens, int[] vals) { VLCBuilder b = new VLCBuilder(); for (int i = 0; i < codes.length; i++) { b.setInt(codes[i], lens[i], vals[i]); } return b; } private IntIntMap forward; private IntIntMap inverse; private IntArrayList codes; private IntArrayList codesSizes; public VLCBuilder() { this.forward = new IntIntMap(); this.inverse = new IntIntMap(); this.codes = IntArrayList.createIntArrayList(); this.codesSizes = IntArrayList.createIntArrayList(); } public VLCBuilder set(int val, String code) { setInt(Integer.parseInt(code, 2), code.length(), val); return this; } public VLCBuilder setInt(int code, int len, int val) { codes.add(code << (32 - len)); codesSizes.add(len); forward.put(val, codes.size() - 1); inverse.put(codes.size() - 1, val); return this; } public VLC getVLC() { final VLCBuilder self = this; return new VLC(codes.toArray(), codesSizes.toArray()) { public int readVLC(BitReader _in) { return self.inverse.get(super.readVLC(_in)); } public int readVLC16(BitReader _in) { return self.inverse.get(super.readVLC16(_in)); } public void writeVLC(BitWriter out, int code) { super.writeVLC(out, self.forward.get(code)); } }; } }