/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.mp4.atom; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import com.ttProject.util.BufferUtil; import com.ttProject.media.IAnalyzer; import com.ttProject.media.mp4.Atom; import com.ttProject.media.mp4.IAtomAnalyzer; import com.ttProject.media.mp4.atom.stsd.IRecordAnalyzer; import com.ttProject.media.mp4.atom.stsd.Record; import com.ttProject.nio.channels.IReadChannel; /** * 各トラックのメディア詳細データを保持しているみたいです。 * コーデック情報やflv化するときのmediaSequenceHeader等もここにはいっています。 * @author taktod */ public class Stsd extends Atom { private int trackCount; private List<Record> records = new ArrayList<Record>(); public Stsd(int position, int size) { super(Stsd.class.getSimpleName().toLowerCase(), position, size); } @Override public void analyze(IReadChannel ch, IAtomAnalyzer analyzer) throws Exception { throw new Exception("stsdの解析では、IAtomAnalyzerは使いません。"); } @Override public void analyze(IReadChannel ch, IAnalyzer<?> analyzer) throws Exception { ch.position(getPosition() + 8); ByteBuffer buffer = BufferUtil.safeRead(ch, 8); analyzeFirstInt(buffer.getInt()); trackCount = buffer.getInt(); // trackCountは1であることを望んでおきます。(マルチトラックはやらない。) if(trackCount != 1) { throw new Exception("stsdのtrack数が1ではありませんでした。作者の知らない形なので必要であれば解析を依頼してください。"); } if(analyzer instanceof IRecordAnalyzer) { IRecordAnalyzer recordAnalyzer = (IRecordAnalyzer)analyzer; for(int i = 0;i < trackCount;i ++) { records.add(recordAnalyzer.analyze(ch)); } } } public List<Record> getRecords() { return records; } @Override public String toString() { return super.toString(" "); } }