mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Neaten TsExtractor a little.
- Add a readBit method to BitsArray for reading a boolean flag. - Make things accessed from inner classes package visibility to avoid the compiler generating thunk methods.
This commit is contained in:
parent
b6bbf50c0e
commit
4c146ee28d
2 changed files with 35 additions and 34 deletions
|
|
@ -137,6 +137,14 @@ public final class BitsArray {
|
||||||
return b & 0xFF;
|
return b & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a single bit.
|
||||||
|
*
|
||||||
|
* @return True if the bit is set. False otherwise.
|
||||||
|
*/
|
||||||
|
public boolean readBit() {
|
||||||
|
return readBits(1) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads up to 32 bits.
|
* Reads up to 32 bits.
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,10 @@ public final class TsExtractor {
|
||||||
|
|
||||||
private boolean prepared;
|
private boolean prepared;
|
||||||
|
|
||||||
private boolean pendingTimestampOffsetUpdate;
|
/* package */ boolean pendingTimestampOffsetUpdate;
|
||||||
private long pendingTimestampOffsetUs;
|
/* package */ long pendingTimestampOffsetUs;
|
||||||
private long sampleTimestampOffsetUs;
|
/* package */ long sampleTimestampOffsetUs;
|
||||||
private long largestParsedTimestampUs;
|
/* package */ long largestParsedTimestampUs;
|
||||||
|
|
||||||
public TsExtractor() {
|
public TsExtractor() {
|
||||||
tsPacketBuffer = new BitsArray();
|
tsPacketBuffer = new BitsArray();
|
||||||
|
|
@ -201,11 +201,7 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
tsPacketBuffer.reset();
|
tsPacketBuffer.reset();
|
||||||
|
tsPacketBuffer.append(inputStream, TS_PACKET_SIZE);
|
||||||
int bytesRead = tsPacketBuffer.append(inputStream, TS_PACKET_SIZE);
|
|
||||||
if (bytesRead != TS_PACKET_SIZE) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse TS header.
|
// Parse TS header.
|
||||||
// Check sync byte.
|
// Check sync byte.
|
||||||
|
|
@ -215,25 +211,25 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
// Skip transportErrorIndicator.
|
// Skip transportErrorIndicator.
|
||||||
tsPacketBuffer.skipBits(1);
|
tsPacketBuffer.skipBits(1);
|
||||||
int payloadUnitStartIndicator = tsPacketBuffer.readBits(1);
|
boolean payloadUnitStartIndicator = tsPacketBuffer.readBit();
|
||||||
// Skip transportPriority.
|
// Skip transportPriority.
|
||||||
tsPacketBuffer.skipBits(1);
|
tsPacketBuffer.skipBits(1);
|
||||||
int pid = tsPacketBuffer.readBits(13);
|
int pid = tsPacketBuffer.readBits(13);
|
||||||
// Skip transport_scrambling_control.
|
// Skip transport_scrambling_control.
|
||||||
tsPacketBuffer.skipBits(2);
|
tsPacketBuffer.skipBits(2);
|
||||||
int adaptationFieldExist = tsPacketBuffer.readBits(1);
|
boolean adaptationFieldExists = tsPacketBuffer.readBit();
|
||||||
int payloadExist = tsPacketBuffer.readBits(1);
|
boolean payloadExists = tsPacketBuffer.readBit();
|
||||||
// Skip continuityCounter.
|
// Skip continuityCounter.
|
||||||
tsPacketBuffer.skipBits(4);
|
tsPacketBuffer.skipBits(4);
|
||||||
|
|
||||||
// Read Adaptation Field.
|
// Read the adaptation field.
|
||||||
if (adaptationFieldExist == 1) {
|
if (adaptationFieldExists) {
|
||||||
int afLength = tsPacketBuffer.readBits(8);
|
int adaptationFieldLength = tsPacketBuffer.readBits(8);
|
||||||
tsPacketBuffer.skipBytes(afLength);
|
tsPacketBuffer.skipBytes(adaptationFieldLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Payload.
|
// Read Payload.
|
||||||
if (payloadExist == 1) {
|
if (payloadExists) {
|
||||||
TsPayloadReader payloadReader = tsPayloadReaders.get(pid);
|
TsPayloadReader payloadReader = tsPayloadReaders.get(pid);
|
||||||
if (payloadReader == null) {
|
if (payloadReader == null) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -255,14 +251,14 @@ public final class TsExtractor {
|
||||||
out.timeUs = in.timeUs;
|
out.timeUs = in.timeUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Sample getSample() {
|
/* package */ Sample getSample() {
|
||||||
if (samplesPool.isEmpty()) {
|
if (samplesPool.isEmpty()) {
|
||||||
return new Sample(DEFAULT_BUFFER_SEGMENT_SIZE);
|
return new Sample(DEFAULT_BUFFER_SEGMENT_SIZE);
|
||||||
}
|
}
|
||||||
return samplesPool.remove();
|
return samplesPool.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void recycleSample(Sample sample) {
|
/* package */ void recycleSample(Sample sample) {
|
||||||
sample.reset();
|
sample.reset();
|
||||||
samplesPool.add(sample);
|
samplesPool.add(sample);
|
||||||
}
|
}
|
||||||
|
|
@ -271,7 +267,7 @@ public final class TsExtractor {
|
||||||
* Parses payload data.
|
* Parses payload data.
|
||||||
*/
|
*/
|
||||||
private abstract static class TsPayloadReader {
|
private abstract static class TsPayloadReader {
|
||||||
public abstract void read(BitsArray tsBuffer, int payloadUnitStartIndicator);
|
public abstract void read(BitsArray tsBuffer, boolean payloadUnitStartIndicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -280,9 +276,9 @@ public final class TsExtractor {
|
||||||
private class PatReader extends TsPayloadReader {
|
private class PatReader extends TsPayloadReader {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(BitsArray tsBuffer, int payloadUnitStartIndicator) {
|
public void read(BitsArray tsBuffer, boolean payloadUnitStartIndicator) {
|
||||||
// Skip pointer.
|
// Skip pointer.
|
||||||
if (payloadUnitStartIndicator == 1) {
|
if (payloadUnitStartIndicator) {
|
||||||
int pointerField = tsBuffer.readBits(8);
|
int pointerField = tsBuffer.readBits(8);
|
||||||
tsBuffer.skipBytes(pointerField);
|
tsBuffer.skipBytes(pointerField);
|
||||||
}
|
}
|
||||||
|
|
@ -313,9 +309,9 @@ public final class TsExtractor {
|
||||||
private class PmtReader extends TsPayloadReader {
|
private class PmtReader extends TsPayloadReader {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(BitsArray tsBuffer, int payloadUnitStartIndicator) {
|
public void read(BitsArray tsBuffer, boolean payloadUnitStartIndicator) {
|
||||||
// Skip pointer.
|
// Skip pointer.
|
||||||
if (payloadUnitStartIndicator == 1) {
|
if (payloadUnitStartIndicator) {
|
||||||
int pointerField = tsBuffer.readBits(8);
|
int pointerField = tsBuffer.readBits(8);
|
||||||
tsBuffer.skipBytes(pointerField);
|
tsBuffer.skipBytes(pointerField);
|
||||||
}
|
}
|
||||||
|
|
@ -399,8 +395,8 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(BitsArray tsBuffer, int payloadUnitStartIndicator) {
|
public void read(BitsArray tsBuffer, boolean payloadUnitStartIndicator) {
|
||||||
if (payloadUnitStartIndicator == 1 && !pesBuffer.isEmpty()) {
|
if (payloadUnitStartIndicator && !pesBuffer.isEmpty()) {
|
||||||
readPES();
|
readPES();
|
||||||
}
|
}
|
||||||
pesBuffer.append(tsBuffer, tsBuffer.bytesLeft());
|
pesBuffer.append(tsBuffer, tsBuffer.bytesLeft());
|
||||||
|
|
@ -414,6 +410,7 @@ public final class TsExtractor {
|
||||||
if (packetStartCodePrefix != 0x000001) {
|
if (packetStartCodePrefix != 0x000001) {
|
||||||
// Error.
|
// Error.
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Read and use stream_id.
|
// TODO: Read and use stream_id.
|
||||||
// Skip stream_id.
|
// Skip stream_id.
|
||||||
pesBuffer.skipBits(8);
|
pesBuffer.skipBits(8);
|
||||||
|
|
@ -422,7 +419,7 @@ public final class TsExtractor {
|
||||||
// Skip some fields/flags.
|
// Skip some fields/flags.
|
||||||
// TODO: might need to use data_alignment_indicator.
|
// TODO: might need to use data_alignment_indicator.
|
||||||
pesBuffer.skipBits(8); // 2+2+1+1+1+1
|
pesBuffer.skipBits(8); // 2+2+1+1+1+1
|
||||||
int ptsFlag = pesBuffer.readBits(1);
|
boolean ptsFlag = pesBuffer.readBit();
|
||||||
// Skip DTS flag.
|
// Skip DTS flag.
|
||||||
pesBuffer.skipBits(1);
|
pesBuffer.skipBits(1);
|
||||||
// Skip some fields/flags.
|
// Skip some fields/flags.
|
||||||
|
|
@ -434,8 +431,7 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
long timeUs = 0;
|
long timeUs = 0;
|
||||||
|
if (ptsFlag) {
|
||||||
if (ptsFlag == 1) {
|
|
||||||
// Skip prefix.
|
// Skip prefix.
|
||||||
pesBuffer.skipBits(4);
|
pesBuffer.skipBits(4);
|
||||||
long pts = pesBuffer.readBitsLong(3) << 30;
|
long pts = pesBuffer.readBitsLong(3) << 30;
|
||||||
|
|
@ -444,9 +440,7 @@ public final class TsExtractor {
|
||||||
pesBuffer.skipBits(1);
|
pesBuffer.skipBits(1);
|
||||||
pts |= pesBuffer.readBitsLong(15);
|
pts |= pesBuffer.readBitsLong(15);
|
||||||
pesBuffer.skipBits(1);
|
pesBuffer.skipBits(1);
|
||||||
|
|
||||||
timeUs = pts * 1000000 / 90000;
|
timeUs = pts * 1000000 / 90000;
|
||||||
|
|
||||||
// Skip the rest of the header.
|
// Skip the rest of the header.
|
||||||
pesBuffer.skipBytes(pesHeaderDataLength - 5);
|
pesBuffer.skipBytes(pesHeaderDataLength - 5);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -463,7 +457,6 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
pesPayloadReader.read(pesBuffer, payloadSize, timeUs);
|
pesPayloadReader.read(pesBuffer, payloadSize, timeUs);
|
||||||
|
|
||||||
pesBuffer.reset();
|
pesBuffer.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -662,7 +655,7 @@ public final class TsExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
adtsBuffer.skipBits(15);
|
adtsBuffer.skipBits(15);
|
||||||
int hasCRC = adtsBuffer.readBits(1);
|
boolean hasCRC = !adtsBuffer.readBit();
|
||||||
|
|
||||||
if (!hasMediaFormat()) {
|
if (!hasMediaFormat()) {
|
||||||
int audioObjectType = adtsBuffer.readBits(2) + 1;
|
int audioObjectType = adtsBuffer.readBits(2) + 1;
|
||||||
|
|
@ -688,7 +681,7 @@ public final class TsExtractor {
|
||||||
adtsBuffer.skipBits(13);
|
adtsBuffer.skipBits(13);
|
||||||
|
|
||||||
// Decrement frame size by ADTS header size and CRC.
|
// Decrement frame size by ADTS header size and CRC.
|
||||||
if (hasCRC == 0) {
|
if (hasCRC) {
|
||||||
// Skip CRC.
|
// Skip CRC.
|
||||||
adtsBuffer.skipBytes(2);
|
adtsBuffer.skipBytes(2);
|
||||||
frameSize -= 9;
|
frameSize -= 9;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue