/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.extra; import org.apache.log4j.Logger; /** * h264のexpGolomb値を取得する動作 * @see http://en.wikipedia.org/wiki/Exponential-Golomb_coding * @author taktod */ public abstract class ExpGolomb extends Bit { /** ロガー */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(ExpGolomb.class); /** 保持データ */ private int value; /** 先頭の0のカウント値 */ private int zeroCount = 0; /** 先頭の1を見つけたときのフラグ */ private boolean find1Flg = false; /** 保持ビット数 */ private int bitCount; /** * bitデータ参照 * @return */ protected int getValue() { return value; } /** * コンストラクタ */ public ExpGolomb() { super(0); } /** * bitを登録していく。 * @param bit 登録bit1 * @return false:登録がおわったとき true:まだ登録が必要なとき */ public boolean addBit1(Bit1 bit) { // logger.info("addBit " + bit.toString()); if(!find1Flg) { // はじめの0をカウントアップする部分 if(bit.get() == 0) { zeroCount ++; } else { // みつけた。 find1Flg = true; bitCount = zeroCount * 2 + 1; // ここから先は実データ value = 1; } } else { value = (value << 1) | bit.get(); zeroCount --; } return zeroCount != 0; } /** * dump */ @Override public String toString() { StringBuilder data = new StringBuilder(); data.append(" zeroCount:").append(zeroCount); data.append(" find1Flg:").append(find1Flg); data.append(" bitCount:").append(bitCount); return data.toString(); } }