Ignore negative payload size in TS PesReader

Issue: #8005
PiperOrigin-RevId: 335625992
This commit is contained in:
kimvde 2020-10-06 14:24:37 +01:00 committed by Oliver Woodman
parent 1cca9ffd01
commit bddaaf022c
2 changed files with 15 additions and 9 deletions

View file

@ -29,6 +29,8 @@
* Add TS extractor parameter to configure the number of bytes in which
to search for a timestamp to determine the duration and to seek.
([#7988](https://github.com/google/ExoPlayer/issues/7988)).
* Ignore negative payload size in PES packets
([#8005](https://github.com/google/ExoPlayer/issues/8005)).
* UI
* Do not require subtitleButton in custom layouts of StyledPlayerView
([#7962](https://github.com/google/ExoPlayer/issues/7962)).

View file

@ -97,11 +97,11 @@ public final class PesReader implements TsPayloadReader {
Log.w(TAG, "Unexpected start indicator reading extended header");
break;
case STATE_READING_BODY:
// If payloadSize == -1 then the length of the previous packet was unspecified, and so
// we only know that it's finished now that we've seen the start of the next one. This
// is expected. If payloadSize != -1, then the length of the previous packet was known,
// but we didn't receive that amount of data. This is not expected.
if (payloadSize != -1) {
// If payloadSize is unset then the length of the previous packet was unspecified, and so
// we only know that it's finished now that we've seen the start of the next one. This is
// expected. If payloadSize is set, then the length of the previous packet was known, but
// we didn't receive that amount of data. This is not expected.
if (payloadSize != C.LENGTH_UNSET) {
Log.w(TAG, "Unexpected start indicator: expected " + payloadSize + " more bytes");
}
// Either way, notify the reader that it has now finished.
@ -136,13 +136,13 @@ public final class PesReader implements TsPayloadReader {
break;
case STATE_READING_BODY:
readLength = data.bytesLeft();
int padding = payloadSize == -1 ? 0 : readLength - payloadSize;
int padding = payloadSize == C.LENGTH_UNSET ? 0 : readLength - payloadSize;
if (padding > 0) {
readLength -= padding;
data.setLimit(data.getPosition() + readLength);
}
reader.consume(data);
if (payloadSize != -1) {
if (payloadSize != C.LENGTH_UNSET) {
payloadSize -= readLength;
if (payloadSize == 0) {
reader.packetFinished();
@ -191,7 +191,7 @@ public final class PesReader implements TsPayloadReader {
int startCodePrefix = pesScratch.readBits(24);
if (startCodePrefix != 0x000001) {
Log.w(TAG, "Unexpected start code prefix: " + startCodePrefix);
payloadSize = -1;
payloadSize = C.LENGTH_UNSET;
return false;
}
@ -208,10 +208,14 @@ public final class PesReader implements TsPayloadReader {
extendedHeaderLength = pesScratch.readBits(8);
if (packetLength == 0) {
payloadSize = -1;
payloadSize = C.LENGTH_UNSET;
} else {
payloadSize = packetLength + 6 /* packetLength does not include the first 6 bytes */
- HEADER_SIZE - extendedHeaderLength;
if (payloadSize < 0) {
Log.w(TAG, "Found negative packet payload size: " + payloadSize);
payloadSize = C.LENGTH_UNSET;
}
}
return true;
}