/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.mkv; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.unit.extra.BitConnector; import com.ttProject.unit.extra.BitLoader; import com.ttProject.unit.extra.BitN; import com.ttProject.unit.extra.EbmlValue; import com.ttProject.unit.extra.bit.Bit16; import com.ttProject.unit.extra.bit.Bit24; import com.ttProject.unit.extra.bit.Bit32; import com.ttProject.unit.extra.bit.Bit8; /** * mkvUnsignedIntTag * @author taktod */ public abstract class MkvUnsignedIntTag extends MkvTag { /** logger */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(MkvUnsignedIntTag.class); private BitN value = null; /** * constructor * @param id * @param size */ public MkvUnsignedIntTag(Type id, EbmlValue size) { super(id, size); } /** * {@inheritDoc} */ @Override public void load(IReadChannel channel) throws Exception { List<Bit8> bit8List = new ArrayList<Bit8>(); for(int i = 0;i < getMkvSize();i ++) { bit8List.add(new Bit8()); } BitLoader loader = new BitLoader(channel); loader.load(bit8List.toArray(new Bit8[]{})); value = new BitN(bit8List.toArray(new Bit8[]{})); super.load(channel); super.update(); } @Override protected void requestUpdate() throws Exception { // 更新が要求された場合 if(value == null) { throw new Exception("value is not defined."); } // まずTagIdとsizeを書き込む必要あり。 BitConnector connector = new BitConnector(); ByteBuffer data = connector.connect(getTagId(), getTagSize(), value); setSize(data.remaining()); super.setData(data); } /** * データ応答 * @return */ public long getValue() { return value.get() & 0xFFFFFFFFL; } /** * データ設定 * @param data * @throws Exception */ public void setValue(long data) throws Exception { if(data > 0xFFFFFFFFL) { throw new Exception("data is too big.。"); } if(data >>> 8 == 0) { value = new BitN(new Bit8((int)data)); getTagSize().set(1); } else if(data >>> 16 == 0) { value = new Bit16((int)data); getTagSize().set(2); } else if(data >>> 24 == 0) { value = new Bit24((int)data); getTagSize().set(3); } else { value = new Bit32((int)data); getTagSize().set(4); } super.update(); } /** * {@inheritDoc} */ @Override public String toString(String space) { StringBuilder data = new StringBuilder(); data.append(super.toString(space)); data.append(" uint:").append(value.getLong()); return data.toString(); } }