/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.unit.extra; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.ttProject.unit.extra.bit.Bit1; import com.ttProject.unit.extra.bit.Bit2; import com.ttProject.unit.extra.bit.Bit3; import com.ttProject.unit.extra.bit.Bit4; import com.ttProject.unit.extra.bit.Bit5; import com.ttProject.unit.extra.bit.Bit6; import com.ttProject.unit.extra.bit.Bit7; import com.ttProject.unit.extra.bit.Bit8; /** * to handle expGolomb * @see http://en.wikipedia.org/wiki/Exponential-Golomb_coding * @author taktod */ public abstract class ExpGolomb extends Bit { /** logger */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(ExpGolomb.class); /** value */ private int value = 0; /** zeroCount */ private int zeroCount = 0; /** flag for found on bit1 */ private boolean find1Flg = false; /** holding bit list */ protected final List<Bit> bits = new ArrayList<Bit>(); /** * constructor */ public ExpGolomb() { super(0); bitCount = 1; bits.add(new Bit1(1)); } /** * ref the value * @return */ protected int getData() { return value; } /** * set the value * @param value */ protected void setData(int value) { this.value = value; bits.clear(); int data = value; bitCount = 0; int i; for(i = 0;data != 0; data >>= 1, i ++) { bits.add(0, new Bit1(data & 0x01)); bitCount ++; } int zeroCount = i - 1; for(;zeroCount >= 8;zeroCount -= 8) { bits.add(0, new Bit8()); bitCount += 8; } bitCount += zeroCount; switch(zeroCount) { case 1: bits.add(0, new Bit1()); break; case 2: bits.add(0, new Bit2()); break; case 3: bits.add(0, new Bit3()); break; case 4: bits.add(0, new Bit4()); break; case 5: bits.add(0, new Bit5()); break; case 6: bits.add(0, new Bit6()); break; case 7: bits.add(0, new Bit7()); break; default: break; } } /** * add bit1 * @param bit append bit1 * @return false:no more true:need more */ public boolean addBit1(Bit1 bit) { if(!find1Flg) { // first zero part/ if(bit.get() == 0) { zeroCount ++; } else { // found find1Flg = true; // bitCount = zeroCount * 2 + 1; value = 1; // after this data body. } } else { value = (value << 1) | bit.get(); zeroCount --; } boolean end = zeroCount == 0; if(end) { setData(value); } return !end; } /** * {@inheritDoc} */ @Override public String toString() { StringBuilder data = new StringBuilder(); for(Bit b : bits) { data.append(b.toString()); } return data.toString(); } }