/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.media.mp4;
import com.ttProject.media.IAnalyzer;
import com.ttProject.media.Unit;
import com.ttProject.nio.channels.IReadChannel;
public abstract class Atom extends Unit {
/** atom名 */
private final String name;
/** 先頭の1バイトに入っているversion */
private byte version;
/** 続く3バイトのフラグ情報 */
private int flags;
/**
* コンストラクタ
* @param name
* @param position
* @param size
*/
public Atom(String name, int position, int size) {
super(position, size);
this.name = name;
}
/**
* atom名参照
* @return
*/
public String getName() {
return name;
}
/**
* tagのあとに大抵あるversionとflagの解析
* @param data
*/
protected void analyzeFirstInt(int data) {
version = (byte)((data >>> 24) & 0xFF);
flags = (data & 0x00FFFFFF);
}
/**
* version値
* @return
*/
public byte getVersion() {
return version;
}
/**
* flags値
* @return
*/
public int getFlags() {
return flags;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return toString("");
}
/**
* {@inheritDoc}
*/
@Override
public void analyze(IReadChannel ch, IAnalyzer<?> analyzer)
throws Exception {
if(analyzer != null && !(analyzer instanceof IAtomAnalyzer)) {
throw new Exception("Atomの解析用のanalyzerではないです。");
}
this.analyze(ch, (IAtomAnalyzer)analyzer);
}
/**
* atomの解析動作
* @param ch
* @param analyzer
*/
public abstract void analyze(IReadChannel ch, IAtomAnalyzer analyzer) throws Exception;
/**
* 情報表示
* @param space
* @return
*/
public String toString(String space) {
StringBuilder data = new StringBuilder(space);
data.append(name);
data.append("[size:0x").append(Integer.toHexString(getSize())).append("]");
data.append("[pos:0x").append(Integer.toHexString(getPosition())).append("]");
return data.toString();
}
}