/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.container.mp4;
import java.nio.ByteBuffer;
import com.ttProject.container.Container;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.unit.extra.BitConnector;
import com.ttProject.unit.extra.bit.Bit32;
/**
* mp4Atomのベースになるクラス
* @author taktod
*
* stsc stco等の順番に読み込む系のデータはすぐに必要ないので、partialContentで読み込み続きを実施できるようにでもしようかな・・・
* mp4Atomは、mkvとちがって、sizeとtagNameの部分も含むサイズがsizeにはいっています。
* mp4では、versionとflagsは、minimumLoadで読み込みさせておいて、
* その他のデータはloadで読み込むことにしておこうとおもいます。
*
* どうせ、readerの方しかつかわないしね・・・
*/
public abstract class Mp4Atom extends Container {
private final Bit32 size;
private final Bit32 name;
private Mp4AtomReader reader = null;
/**
* コンストラクタ
* @param length
* @param name
*/
public Mp4Atom(Bit32 size, Bit32 name) {
this.size = size;
this.name = name;
super.setSize(size.get());
}
/**
* {@inheritDoc}
*/
@Override
public void minimumLoad(IReadChannel channel) throws Exception {
setPosition(channel.position() - 8);
}
/**
* {@inheritDoc}
*/
@Override
public void load(IReadChannel channel) throws Exception {
channel.position(getPosition() + getSize());
}
/**
* mp4解析用のreaderを外部から設定します。
* @param reader
*/
public void setMp4AtomReader(Mp4AtomReader reader) {
this.reader = reader;
}
/**
* mp4解析用のreaderを参照します
* @return
*/
protected Mp4AtomReader getMp4AtomReader() {
return reader;
}
/**
* 先頭のbufferを応答します。
* @return
*/
protected ByteBuffer getHeaderBuffer() {
BitConnector connector = new BitConnector();
return connector.connect(size, name);
}
@Override
public String toString() {
StringBuilder data = new StringBuilder();
data.append(getClass().getSimpleName());
data.append(" pos:").append(Integer.toHexString(getPosition()));
data.append(" size:").append(Integer.toHexString(getSize()));
return data.toString();
}
}