From b8bb68066047d1a3a451deeeeba143676ea6eb3e Mon Sep 17 00:00:00 2001 From: Shrek Date: Thu, 9 Jul 2020 10:49:07 +0800 Subject: [PATCH] Modify the header to conform to ogg format, but can not play Ogg if the file is partially incomplete --- .../exoplayer2/extractor/ogg/OggPacket.java | 11 ++++++-- .../extractor/ogg/OggPageHeader.java | 4 +++ .../extractor/ogg/OggReadCheckUtil.java | 28 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggReadCheckUtil.java diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java index 07724cc33c0..390732ed2c2 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java @@ -75,14 +75,14 @@ public boolean populate(ExtractorInput input) throws IOException { if ((pageHeader.type & 0x01) == 0x01 && packetArray.limit() == 0) { // After seeking, the first packet may be the remainder // part of a continued packet which has to be discarded. - bytesToSkip += calculatePacketSize(segmentIndex); + bytesToSkip += calculatePacketSize(segmentIndex, input); segmentIndex += segmentCount; } input.skipFully(bytesToSkip); currentSegmentIndex = segmentIndex; } - int size = calculatePacketSize(currentSegmentIndex); + int size = calculatePacketSize(currentSegmentIndex, input); int segmentIndex = currentSegmentIndex + segmentCount; if (size > 0) { if (packetArray.capacity() < packetArray.limit() + size) { @@ -137,7 +137,7 @@ public void trimPayload() { * @param startSegmentIndex the index of the first segment of the packet. * @return Size of the packet. */ - private int calculatePacketSize(int startSegmentIndex) { + private int calculatePacketSize(int startSegmentIndex, ExtractorInput input) { segmentCount = 0; int size = 0; while (startSegmentIndex + segmentCount < pageHeader.pageSegmentCount) { @@ -148,6 +148,11 @@ private int calculatePacketSize(int startSegmentIndex) { break; } } + + if (OggReadCheckUtil.checkReadLengthValidity(input, size)) { + size = OggReadCheckUtil.fixFileReadLength(input); + } + return size; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeader.java index 853347ee181..a179ab20bf0 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeader.java @@ -163,6 +163,10 @@ public boolean populate(ExtractorInput input, boolean quiet) throws IOException bodySize += laces[i]; } + if (OggReadCheckUtil.checkReadLengthValidity(input, bodySize)) { + bodySize = OggReadCheckUtil.fixFileReadLength(input); + } + return true; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggReadCheckUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggReadCheckUtil.java new file mode 100644 index 00000000000..7ef2af279d3 --- /dev/null +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggReadCheckUtil.java @@ -0,0 +1,28 @@ +package com.google.android.exoplayer2.extractor.ogg; + +import com.google.android.exoplayer2.extractor.ExtractorInput; + +/** + * Ogg File read verification tool + */ +class OggReadCheckUtil { + + /** + * Verify that the length of the read exceeds the file length + * @param input {@link ExtractorInput} + * @param readLength read length + * @return true The read length is greater than the file length + */ + public static boolean checkReadLengthValidity(ExtractorInput input, int readLength) { + return input.getPeekPosition() + readLength > input.getLength() ; + } + + /** + * Fix read length + * @param input {@link ExtractorInput} + * @return Length of read after fixed + */ + public static int fixFileReadLength(ExtractorInput input) { + return (int) (input.getLength() - input.getPeekPosition()); + } +}