Fixed large (>ts packet) PMT parsing

This commit is contained in:
alex3d 2015-11-30 19:26:20 +03:00
parent daaebd7d72
commit f752a023c8

View File

@ -235,9 +235,11 @@ public final class TsExtractor implements Extractor {
*/ */
private class PmtReader extends TsPayloadReader { private class PmtReader extends TsPayloadReader {
private final ParsableByteArray data;
private final ParsableBitArray pmtScratch; private final ParsableBitArray pmtScratch;
public PmtReader() { public PmtReader() {
data = new ParsableByteArray();
pmtScratch = new ParsableBitArray(new byte[5]); pmtScratch = new ParsableBitArray(new byte[5]);
} }
@ -247,20 +249,36 @@ public final class TsExtractor implements Extractor {
} }
@Override @Override
public void consume(ParsableByteArray data, boolean payloadUnitStartIndicator, public void consume(ParsableByteArray dataPart, boolean payloadUnitStartIndicator,
ExtractorOutput output) { ExtractorOutput output) {
// Skip pointer.
if (payloadUnitStartIndicator) { if (payloadUnitStartIndicator) {
int pointerField = data.readUnsignedByte(); // Skip pointer.
data.skipBytes(pointerField); int pointerField = dataPart.readUnsignedByte();
} dataPart.skipBytes(pointerField);
// Note: see ISO/IEC 13818-1, section 2.4.4.8 for detailed information on the format of // Note: see ISO/IEC 13818-1, section 2.4.4.8 for detailed information on the format of
// the header. // the header.
data.readBytes(pmtScratch, 3); dataPart.readBytes(pmtScratch, 3);
pmtScratch.skipBits(12); // table_id (8), section_syntax_indicator (1), '0' (1), reserved (2) pmtScratch.skipBits(12); // table_id (8), section_syntax_indicator (1), '0' (1), reserved (2)
int sectionLength = pmtScratch.readBits(12); int sectionLength = pmtScratch.readBits(12);
if (data.capacity() == sectionLength) {
data.reset();
} else {
data.reset(new byte[sectionLength], 0);
}
}
// read part of the section from single TS packet (dataPart)
int partLength = Math.min(dataPart.bytesLeft(), data.capacity()-data.limit());
dataPart.readBytes(data.data, data.limit(), partLength);
data.setLimit(data.limit()+partLength);
if (data.limit() != data.capacity()) { // section is not complete yet
return;
}
int sectionLength = data.capacity();
// program_number (16), reserved (2), version_number (5), current_next_indicator (1), // program_number (16), reserved (2), version_number (5), current_next_indicator (1),
// section_number (8), last_section_number (8), reserved (3), PCR_PID (13) // section_number (8), last_section_number (8), reserved (3), PCR_PID (13)
// Skip the rest of the PMT header. // Skip the rest of the PMT header.