package org.jcodec.samples.streaming;
import static org.jcodec.common.NIOUtils.readableFileChannel;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jcodec.common.SeekableByteChannel;
import org.jcodec.containers.mps.MPSDemuxer;
import org.jcodec.containers.mps.MPSDemuxer.MPEGPacket;
import org.jcodec.containers.mps.MPSDemuxer.PESPacket;
import org.jcodec.containers.mps.MPSDemuxer.Track;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Creates an index of an MPEG PS file
*
* @author The JCodec project
*
*/
public class MPSIndexer {
private File mtsFile;
private MTSIndex index;
private volatile boolean done;
public MPSIndexer(File mtsFile, MTSIndex index) {
this.mtsFile = mtsFile;
this.index = index;
}
public void index() throws IOException {
SeekableByteChannel channel = null;
try {
channel = readableFileChannel(mtsFile);
MPSDemuxer demuxer = new MPSDemuxer(channel);
while (true) {
for (Track track : demuxer.getVideoTracks()) {
MPEGPacket frame = track.getFrame(null);
if (frame == null)
break;
index.addVideo(track.getSid(), frame.getOffset(), frame.getPts(), (int) frame.getDuration(),
frame.getSeq(), frame.getGOP(), frame.getTimecode(), (short)frame.getDisplayOrder(),
(byte)(frame.isKeyFrame() ? 0 : 1));
}
for (Track track : demuxer.getAudioTracks()) {
List<PESPacket> pending = track.getPending();
for (PESPacket pesPacket : pending) {
index.addAudio(track.getSid(), pesPacket.pos, pesPacket.pts, 0);
}
}
}
} finally {
channel.close();
done = true;
}
}
public boolean isDone() {
return done;
}
}