Commit 4c146ee2 by Oliver Woodman

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.
parent b6bbf50c
...@@ -137,6 +137,14 @@ public final class BitsArray { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment