/*
* 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 org.apache.log4j.Logger;
import com.ttProject.container.Container;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.unit.extra.BitConnector;
import com.ttProject.unit.extra.EbmlValue;
/**
* basic for mkvTag.
* @author taktod
*/
public abstract class MkvTag extends Container {
/** logger */
@SuppressWarnings("unused")
private Logger logger = Logger.getLogger(MkvTag.class);
private final EbmlValue id;
private final EbmlValue size;
private MkvTagReader reader = null;
/**
* constructor
* @param id
* @param size
*/
public MkvTag(Type id, EbmlValue size) {
this.id = new EbmlValue();
this.id.setEbmlValue(Type.getValue(id));
this.size = size;
super.setSize((int)(size.getLong() + (this.id.getBitCount() + this.size.getBitCount()) / 8));
super.update();
}
/**
* {@inheritDoc}
*/
@Override
public void minimumLoad(IReadChannel channel) throws Exception {
setPosition(channel.position() - (id.getBitCount() + size.getBitCount()) / 8);
super.update();
}
/**
* {@inheritDoc}
*/
@Override
public void load(IReadChannel channel) throws Exception {
channel.position(getPosition() + getSize());
super.update();
}
/**
* hold the mkvTagReader
* @param reader
*/
public void setMkvTagReader(MkvTagReader reader) {
this.reader = reader;
}
/**
* ref the mkvTagReader
* @return
*/
protected MkvTagReader getMkvTagReader() {
return reader;
}
/**
* ref the headerBuffer(mkvTag + mkvSize)
* @return
*/
protected ByteBuffer getHeaderBuffer() {
BitConnector connector = new BitConnector();
return connector.connect(id, size);
}
/**
* ref the mkvSize
* @return
*/
protected int getMkvSize() {
return size.get();
}
protected EbmlValue getTagId() {
return id;
}
protected EbmlValue getTagSize() {
return size;
}
/**
* for dump.
* @param space indent space count.
* @return
*/
public String toString(String space) {
StringBuilder data = new StringBuilder(space);
data.append(getClass().getSimpleName());
data.append(" size:").append(Integer.toHexString(getMkvSize()));
return data.toString();
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return toString("");
}
}