package org.jcodec.containers.mps; import org.jcodec.common.Assert; import org.jcodec.common.IntIntMap; import org.jcodec.common.io.NIOUtils; import org.jcodec.common.tools.MainUtils; import org.jcodec.common.tools.MainUtils.Cmd; import org.jcodec.containers.mps.psi.PATSection; 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.nio.channels.ReadableByteChannel; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * @author The JCodec project */ public class MTSPktDump { public static void main1(String[] args) throws IOException { Cmd cmd = MainUtils.parseArguments(args); if (cmd.args.length < 1) { MainUtils.printHelpNoFlags("file name"); return; } ReadableByteChannel ch = null; try { ch = NIOUtils.readableChannel(new File(cmd.args[0])); dumpTSPackets(ch); } finally { NIOUtils.closeQuietly(ch); } } private static void dumpTSPackets(ReadableByteChannel _in) throws IOException { ByteBuffer buf = ByteBuffer.allocate(188 * 1024); while (_in.read(buf) != -1) { buf.flip(); buf.limit((buf.limit() / 188) * 188); int pmtPid = -1; for (int pkt = 0; buf.hasRemaining(); ++pkt) { ByteBuffer tsBuf = NIOUtils.read(buf, 188); Assert.assertEquals(0x47, tsBuf.get() & 0xff); int guidFlags = ((tsBuf.get() & 0xff) << 8) | (tsBuf.get() & 0xff); int guid = (int) guidFlags & 0x1fff; int payloadStart = (guidFlags >> 14) & 0x1; int b0 = tsBuf.get() & 0xff; int counter = b0 & 0xf; if ((b0 & 0x20) != 0) { NIOUtils.skip(tsBuf, (tsBuf.get() & 0xff)); } System.out.print("#" + pkt + "[guid: " + guid + ", cnt: " + counter + ", start: " + (payloadStart == 1 ? "y" : "-")); if (guid == 0 || guid == pmtPid) { System.out.print(", PSI]: "); if (payloadStart == 1) { NIOUtils.skip(tsBuf, (tsBuf.get() & 0xff)); } if (guid == 0) { PATSection pat = PATSection.parsePAT(tsBuf); IntIntMap programs = pat.getPrograms(); pmtPid = programs.values()[0]; printPat(pat); } else if (guid == pmtPid) { PMTSection pmt = PMTSection.parsePMT(tsBuf); printPmt(pmt); } } else { System.out.print("]: " + tsBuf.remaining()); } System.out.println(); } buf.clear(); } } private static void printPat(PATSection pat) { IntIntMap programs = pat.getPrograms(); System.out.print("PAT: "); int[] keys = programs.keys(); for (int i : keys) { System.out.print(i + ":" + programs.get(i) + ", "); } } private static void printPmt(PMTSection pmt) { System.out.print("PMT: "); for (PMTStream pmtStream : pmt.getStreams()) { System.out.print(pmtStream.getPid() + ":" + pmtStream.getStreamTypeTag() + ", "); } } }