package org.jcodec.containers.mps.index;
import static org.jcodec.containers.mps.MPSUtils.mediaStream;
import static org.jcodec.containers.mps.MPSUtils.readPESHeader;
import org.jcodec.common.io.NIOUtils;
import org.jcodec.common.io.NIOUtils.FileReader;
import org.jcodec.common.io.SeekableByteChannel;
import org.jcodec.containers.mps.PESPacket;
import java.io.File;
import java.io.IOException;
import java.lang.System;
import java.nio.ByteBuffer;
/**
* 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 {
newReader().readFile(source, 0x10000, listener);
}
public void indexChannel(SeekableByteChannel source, NIOUtils.FileReaderListener listener) throws IOException {
newReader().readChannel(source, 0x10000, listener);
}
private FileReader newReader() {
return new NIOUtils.FileReader() {
@Override
protected void data(ByteBuffer data, long filePos) {
analyseBuffer(data, filePos);
}
@Override
protected void done() {
finishAnalyse();
}
};
}
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, MPSIndex.makePESToken(leading, pesLen, pesBuffer.remaining()));
getAnalyser(stream).pkt(pesBuffer, pesHeader);
}
public static void main1(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);
}
});
ByteBuffer index = ByteBuffer.allocate(0x10000);
indexer.serialize().serializeTo(index);
NIOUtils.writeTo(index, new File(args[1]));
}
}