org.jcodec.codecs.mpeg12.MTSMediaInfo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jcodec Show documentation
Show all versions of jcodec Show documentation
Pure Java implementation of video/audio codecs and formats
package org.jcodec.codecs.mpeg12;
import org.jcodec.codecs.mpeg12.MPSMediaInfo.MPEGTrackMetadata;
import org.jcodec.codecs.mpeg12.MPSMediaInfo.MediaInfoDone;
import org.jcodec.common.io.FileChannelWrapper;
import org.jcodec.common.io.NIOUtils;
import org.jcodec.common.io.SeekableByteChannel;
import org.jcodec.containers.mps.MTSUtils;
import org.jcodec.containers.mps.psi.PMTSection;
import org.jcodec.containers.mps.psi.PMTSection.PMTStream;
import java.io.File;
import java.io.IOException;
import java.lang.System;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Gets media info from MPEG TS file
*
* @author The JCodec project
*
*/
public class MTSMediaInfo {
public List getMediaInfo(File f) throws IOException {
FileChannelWrapper ch = null;
final List pmtSections = new ArrayList();
final Map pids = new HashMap();
final List result = new ArrayList();
try {
ch = NIOUtils.readableChannel(f);
new MTSUtils.TSReader(false) {
private ByteBuffer pmtBuffer;
private int pmtPid = -1;
private boolean pmtDone;
@Override
protected boolean onPkt(int guid, boolean payloadStart, ByteBuffer tsBuf, long filePos, boolean sectionSyntax,
ByteBuffer fullPkt) {
if (guid == 0) {
pmtPid = MTSUtils.parsePAT(tsBuf);
} else if (guid == pmtPid && !pmtDone) {
if (pmtBuffer == null) {
pmtBuffer = ByteBuffer.allocate(((tsBuf.duplicate().getInt() >> 8) & 0x3ff) + 3);
} else if (pmtBuffer.hasRemaining()) {
NIOUtils.writeL(pmtBuffer, tsBuf, Math.min(pmtBuffer.remaining(), tsBuf.remaining()));
}
if (!pmtBuffer.hasRemaining()) {
pmtBuffer.flip();
PMTSection pmt = MTSUtils.parsePMT(pmtBuffer);
pmtSections.add(pmt);
PMTStream[] streams = pmt.getStreams();
for (int i = 0; i < streams.length; i++) {
PMTStream stream = streams[i];
if (!pids.containsKey(stream.getPid()))
pids.put(stream.getPid(), new MPSMediaInfo());
}
pmtDone = pmt.getSectionNumber() == pmt.getLastSectionNumber();
pmtBuffer = null;
}
} else if (pids.containsKey(guid)) {
try {
pids.get(guid).analyseBuffer(tsBuf, filePos);
} catch (MediaInfoDone e) {
result.addAll(pids.get(guid).getInfos());
pids.remove(guid);
if (pids.size() == 0)
return false;
}
}
return true;
}
}.readTsFile(ch);
} finally {
NIOUtils.closeQuietly(ch);
}
return result;
}
public static void main1(String[] args) throws IOException {
List info = new MTSMediaInfo().getMediaInfo(new File(args[0]));
for (MPEGTrackMetadata stream : info) {
System.out.println(stream.codec);
}
}
public static MTSMediaInfo extract(SeekableByteChannel input) {
// TODO Auto-generated method stub
return null;
}
public MPEGTrackMetadata getVideoTrack() {
// TODO Auto-generated method stub
return null;
}
public List getAudioTracks() {
// TODO Auto-generated method stub
return null;
}
}