mirror of
https://github.com/androidx/media.git
synced 2025-05-04 14:10:40 +08:00
Fixed large (>ts packet) PMT parsing
This commit is contained in:
parent
daaebd7d72
commit
f752a023c8
@ -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,19 +249,35 @@ 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
|
||||||
|
// the header.
|
||||||
|
dataPart.readBytes(pmtScratch, 3);
|
||||||
|
pmtScratch.skipBits(12); // table_id (8), section_syntax_indicator (1), '0' (1), reserved (2)
|
||||||
|
int sectionLength = pmtScratch.readBits(12);
|
||||||
|
|
||||||
|
if (data.capacity() == sectionLength) {
|
||||||
|
data.reset();
|
||||||
|
} else {
|
||||||
|
data.reset(new byte[sectionLength], 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: see ISO/IEC 13818-1, section 2.4.4.8 for detailed information on the format of
|
// read part of the section from single TS packet (dataPart)
|
||||||
// the header.
|
int partLength = Math.min(dataPart.bytesLeft(), data.capacity()-data.limit());
|
||||||
data.readBytes(pmtScratch, 3);
|
dataPart.readBytes(data.data, data.limit(), partLength);
|
||||||
pmtScratch.skipBits(12); // table_id (8), section_syntax_indicator (1), '0' (1), reserved (2)
|
data.setLimit(data.limit()+partLength);
|
||||||
int sectionLength = pmtScratch.readBits(12);
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user