/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.media.mp4;
import java.lang.reflect.Constructor;
import java.nio.ByteBuffer;
import java.util.List;
import com.ttProject.media.Manager;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.util.BufferUtil;
public class Mp4Manager extends Manager<Atom> {
/**
*
*/
@Override
public List<Atom> getUnits(ByteBuffer data) throws Exception {
throw new Exception("mp4はbufferの固定していない情報読み込みには対応していません。");
}
@Override
public Atom getUnit(IReadChannel source) throws Exception {
if(source.size() - source.position() < 8) {
return null;
}
int position = source.position();
ByteBuffer buffer = BufferUtil.safeRead(source, 8);
int size = buffer.getInt();
String tag = BufferUtil.getDwordText(buffer);
// TODO あまり良くないけど、refrectionをつかって処理しておく。(コード書くのが面倒)
try {
Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(getClassName(tag));
if(cls == null) {
return null;
}
Constructor<?> construct = cls.getConstructor(new Class<?>[]{int.class, int.class});
return (Atom)construct.newInstance(new Object[]{position, size});
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* lowerCaseの文字列から、クラス名を取得する
* @param lowerTagName
* @return
*/
private String getClassName(String lowerTagName) {
return "com.ttProject.media.mp4.atom." + lowerTagName.substring(0, 1).toUpperCase() + lowerTagName.substring(1).toLowerCase();
}
}