/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.media.flv.model;
import java.nio.ByteBuffer;
import com.ttProject.media.flv.FlvManager;
import com.ttProject.media.flv.ITagAnalyzer;
import com.ttProject.media.flv.Tag;
import com.ttProject.media.flv.tag.AudioTag;
import com.ttProject.media.flv.tag.VideoTag;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.util.BufferUtil;
/**
* FLVの内容解析、ただしデータの読み込みは実行しない。
* @author taktod
*/
public class TagPositionAnalyzer implements ITagAnalyzer {
private final FlvManager manager = new FlvManager();
@Override
public Tag analyze(IReadChannel ch) throws Exception {
Tag tag = null;
do {
if(tag != null) {
ch.position(tag.getPosition() + tag.getInitSize());
}
tag = manager.getUnit(ch);
if(tag == null) {
return null;
}
}
while((tag instanceof VideoTag || tag instanceof AudioTag) && tag.getSize() <= 15);
if(tag instanceof VideoTag) {
// とりあえずmshもほしい。
// indexもほしい。
// mshについては複数はいる可能性が一応ある。
/*
* よって作成する動作は次のようにしたい。
* mshの情報位置設定
* keyFrameの位置設定
* mshについては、audioもありうるので、注意が必要
*/
VideoTag vTag = (VideoTag) tag;
ByteBuffer checkBuffer = BufferUtil.safeRead(ch, 2);
// keyframeかしっておきたいので、この方法はまずい
byte check = checkBuffer.get();
if(vTag.analyzeTagByte(check)) {
// avcなのでmshの判定が必要
vTag.setMSHFlg(checkBuffer.get() == 0x00);
}
}
else if(tag instanceof AudioTag) {
AudioTag aTag = (AudioTag) tag;
ByteBuffer checkBuffer = BufferUtil.safeRead(ch, 2);
byte check = checkBuffer.get();
if(aTag.analyzeTagByte(check)) {
aTag.setMSHFlg(checkBuffer.get() == 0x00);
}
}
// ほぼこっちで飛ばしが発生しているとみてよさそう。
// とりあえずanalyzeだけせずに動作させてみる。
// これが一番はやいっぽい。
ch.position(tag.getPosition() + tag.getInitSize());
return tag;
}
}