/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.h264; import com.ttProject.media.h264.frame.PictureParameterSet; import com.ttProject.media.h264.frame.SequenceParameterSet; import com.ttProject.media.h264.frame.Slice; import com.ttProject.media.h264.frame.SliceIDR; import com.ttProject.media.h264.frame.SupplementalEnhancementInformation; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.util.BufferUtil; /** * frameの内容を解析する動作 * mpegtsみたいなnalは00 00 01 フレームとなっています。 * flvやmp4みたいなやつは[4バイトサイズ] フレームとなっています。 * そのフレームの部分を読み込む動作 * @author taktod * */ public class FrameAnalyzer implements IFrameAnalyzer { private SequenceParameterSet lastSps = null; public void setLastSps(SequenceParameterSet sps) { this.lastSps = sps; } @Override public Frame analyze(IReadChannel ch) throws Exception { // 1バイト読み込んでフレームのタイプがなにであるか知る必要がある。 byte frameTypeData = BufferUtil.safeRead(ch, 1).get(); Type type = Type.getType(frameTypeData & 0x1F); Frame frame = null; switch(type) { case Slice: frame = new Slice(frameTypeData); break; case SliceIDR: frame = new SliceIDR(frameTypeData); break; case SequenceParameterSet: frame = new SequenceParameterSet(frameTypeData); lastSps = (SequenceParameterSet)frame; return frame; case PictureParameterSet: frame = new PictureParameterSet(frameTypeData); break; case SupplementalEnhancementInformation: frame = new SupplementalEnhancementInformation(frameTypeData); break; // case AccessUnitDelimiter: // break; default: throw new Exception("しらないデータタイプをうけとりました。:" + type); } frame.setSps(lastSps); return frame; } }