package org.jcodec.containers.mps;
import static org.jcodec.containers.mps.MPSUtils.mediaStream;
import static org.jcodec.containers.mps.MPSUtils.readPESHeader;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.jcodec.common.NIOUtils;
import org.jcodec.containers.mps.MPSDemuxer.PESPacket;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Indexes MPEG PS file for the purpose of quick random access in the future
*
* @author The JCodec project
*
*/
public class MPSIndexer extends BaseIndexer {
private long predFileStart;
public void index(File source, NIOUtils.FileReaderListener listener) throws IOException {
new NIOUtils.FileReader() {
protected void data(ByteBuffer data, long filePos) {
analyseBuffer(data, filePos);
}
}.readFile(source, 0x10000, listener);
}
protected void pes(ByteBuffer pesBuffer, long start, int pesLen, int stream) {
if (!mediaStream(stream))
return;
PESPacket pesHeader = readPESHeader(pesBuffer, start);
int leading = 0;
if (predFileStart != start) {
leading += (int) (start - predFileStart);
}
predFileStart = start + pesLen;
savePesMeta(stream, leading, pesLen, pesBuffer.remaining());
getAnalyser(stream).pkt(pesBuffer, pesHeader);
}
public ByteBuffer serialize() {
ByteBuffer buf = ByteBuffer.allocate(estimateSize());
serializeTo(buf);
buf.flip();
return buf;
}
public static void main(String[] args) throws IOException {
MPSIndexer indexer = new MPSIndexer();
indexer.index(new File(args[0]), new NIOUtils.FileReaderListener() {
public void progress(int percentDone) {
System.out.println(percentDone);
}
});
NIOUtils.writeTo(indexer.serialize(), new File(args[1]));
}
}