/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.mp4.atom.stsd; import java.nio.ByteBuffer; import com.ttProject.util.BufferUtil; import com.ttProject.media.mp4.IAtomAnalyzer; import com.ttProject.media.mp4.atom.stsd.data.Avcc; import com.ttProject.nio.channels.IReadChannel; @SuppressWarnings("unused") public abstract class VideoRecord extends Record { private byte[] unknown1 = new byte[6]; private short dataReferenceIndex; private short unknown2; private short unknown3; private int unknown4; private int unknown5; private int unknown6; private short width; private short height; private int horizontalResolution; private int verticalResolution; private int unknown7; private short frameCount; private byte nameSize; private byte[] name = new byte[31]; private short depth; private short unknown8; private Avcc avcc = null; // private * boxes; public VideoRecord(String name, int position, int size) { super(name, position, size); } public Avcc getAvcc() { return avcc; } @Override public void analyze(IReadChannel ch, IAtomAnalyzer analyzer) throws Exception { // ぶっちゃげここのデータはどうでもいい、ほしいのは、mediaSequenceHeader ByteBuffer buffer = BufferUtil.safeRead(ch, 78); buffer.get(unknown1); dataReferenceIndex = buffer.getShort(); unknown2 = buffer.getShort(); unknown3 = buffer.getShort(); unknown4 = buffer.getInt(); unknown5 = buffer.getInt(); unknown6 = buffer.getInt(); width = buffer.getShort(); height = buffer.getShort(); horizontalResolution = buffer.getInt(); verticalResolution = buffer.getInt(); unknown7 = buffer.getInt(); frameCount = buffer.getShort(); nameSize = buffer.get(); buffer.get(name); depth = buffer.getShort(); unknown8 = buffer.getShort(); // 以下サブタグ(size:4byte tag:4byte data:xbyte) // サブタグのavcCがmediaSequenceHeaderになります。(自身がh.264の場合) // この部分の読み込みは別プログラムにした方がいいと思う。 while(ch.position() < (getSize() + getPosition())) { int position = ch.position(); buffer = BufferUtil.safeRead(ch, 8); byte[] name = new byte[4]; int size = buffer.getInt(); buffer.get(name); String tag = (new String(name)).toLowerCase(); if("avcc".equals(tag)) { avcc = new Avcc(position, size); avcc.analyze(ch); } // tagがavccなら読み込んでおきたいところ。 // avccだったら中身すべてがmediaSequenceHeaderなので保持しておく必要あり(flvにするため) // とりあえずavccだけ解析するふりをしておく。(解析もなにも中身すべてが対象のデータ) ch.position(position + size); } } }