/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.mp4; import org.apache.log4j.Logger; import com.ttProject.container.mp4.type.Co64; import com.ttProject.container.mp4.type.Ctts; import com.ttProject.container.mp4.type.Dinf; import com.ttProject.container.mp4.type.Dref; import com.ttProject.container.mp4.type.Edts; import com.ttProject.container.mp4.type.Elst; import com.ttProject.container.mp4.type.Free; import com.ttProject.container.mp4.type.Ftyp; import com.ttProject.container.mp4.type.Hdlr; import com.ttProject.container.mp4.type.Hmhd; import com.ttProject.container.mp4.type.Ilst; import com.ttProject.container.mp4.type.Iods; import com.ttProject.container.mp4.type.Mdat; import com.ttProject.container.mp4.type.Mdhd; import com.ttProject.container.mp4.type.Mdia; import com.ttProject.container.mp4.type.Meta; import com.ttProject.container.mp4.type.Mfhd; import com.ttProject.container.mp4.type.Mfra; import com.ttProject.container.mp4.type.Mfro; import com.ttProject.container.mp4.type.Minf; import com.ttProject.container.mp4.type.Moof; import com.ttProject.container.mp4.type.Moov; import com.ttProject.container.mp4.type.Mvex; import com.ttProject.container.mp4.type.Mvhd; import com.ttProject.container.mp4.type.Nmhd; import com.ttProject.container.mp4.type.Skip; import com.ttProject.container.mp4.type.Smhd; import com.ttProject.container.mp4.type.Stbl; import com.ttProject.container.mp4.type.Stco; import com.ttProject.container.mp4.type.Stsc; import com.ttProject.container.mp4.type.Stsd; import com.ttProject.container.mp4.type.Stss; import com.ttProject.container.mp4.type.Stsz; import com.ttProject.container.mp4.type.Stts; import com.ttProject.container.mp4.type.Tfdt; import com.ttProject.container.mp4.type.Tfhd; import com.ttProject.container.mp4.type.Tfra; import com.ttProject.container.mp4.type.Tkhd; import com.ttProject.container.mp4.type.Traf; import com.ttProject.container.mp4.type.Trak; import com.ttProject.container.mp4.type.Trex; import com.ttProject.container.mp4.type.Trun; import com.ttProject.container.mp4.type.Udta; import com.ttProject.container.mp4.type.Vmhd; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.unit.ISelector; import com.ttProject.unit.IUnit; import com.ttProject.unit.extra.BitLoader; import com.ttProject.unit.extra.bit.Bit32; import com.ttProject.util.IntUtil; /** * mp4のatomを解析していくselector * mp4Boxを取り出す動作なので、これをいくら進めてもframeは取り出せません。 * stcoとか、sttsとかとmdatを絡めてやっとframeが抜き出せるようになる感じ。 * @author taktod */ public class Mp4AtomSelector implements ISelector { /** ロガー */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(Mp4AtomSelector.class); @Override public IUnit select(IReadChannel channel) throws Exception { if(channel.position() == channel.size()) { return null; } // sourceから4byte読み込んで、長さとtagを取得する必要あり。 Bit32 size = new Bit32(); Bit32 name = new Bit32(); BitLoader loader = new BitLoader(channel); loader.load(size, name); Mp4Atom atom = null; switch(Type.getType(name.get())) { case Ftyp: atom = new Ftyp(size, name); break; case Moov: atom = new Moov(size, name); break; case Mvhd: atom = new Mvhd(size, name); break; case Iods: atom = new Iods(size, name); break; case Trak: atom = new Trak(size, name); break; case Tkhd: atom = new Tkhd(size, name); break; case Edts: atom = new Edts(size, name); break; case Elst: atom = new Elst(size, name); break; case Mdia: atom = new Mdia(size, name); break; case Mdhd: atom = new Mdhd(size, name); break; case Hdlr: atom = new Hdlr(size, name); break; case Minf: atom = new Minf(size, name); break; case Vmhd: atom = new Vmhd(size, name); break; case Smhd: atom = new Smhd(size, name); break; case Hmhd: atom = new Hmhd(size, name); break; case Nmhd: atom = new Nmhd(size, name); break; case Dinf: atom = new Dinf(size, name); break; case Dref: atom = new Dref(size, name); break; case Stbl: atom = new Stbl(size, name); break; case Stsd: atom = new Stsd(size, name); break; case Stts: atom = new Stts(size, name); break; case Ctts: atom = new Ctts(size, name); break; case Stsc: atom = new Stsc(size, name); break; case Stsz: atom = new Stsz(size, name); break; case Stco: atom = new Stco(size, name); break; case Co64: atom = new Co64(size, name); break; case Stss: atom = new Stss(size, name); break; case Udta: atom = new Udta(size, name); break; case Moof: atom = new Moof(size, name); break; case Mfhd: atom = new Mfhd(size, name); break; case Traf: atom = new Traf(size, name); break; case Tfhd: atom = new Tfhd(size, name); break; case Trun: atom = new Trun(size, name); break; case Mdat: atom = new Mdat(size, name); break; case Free: atom = new Free(size, name); break; case Skip: atom = new Skip(size, name); break; case Mfra: atom = new Mfra(size, name); break; case Tfra: atom = new Tfra(size, name); break; case Mfro: atom = new Mfro(size, name); break; case Mvex: atom = new Mvex(size, name); break; case Trex: atom = new Trex(size, name); break; case Tfdt: atom = new Tfdt(size, name); break; case Meta: atom = new Meta(size, name); break; case Ilst: atom = new Ilst(size, name); break; default: throw new Exception("undefined:" + Type.getType(name.get()) + " name:" + IntUtil.makeHexString(name.get())); } atom.minimumLoad(channel); return atom; } }