Remove BOM check in Webvtt header checks
Reverts the BOM check changes in [] ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=211826731
This commit is contained in:
parent
67a2bb3d28
commit
f47f1b9f4b
@ -28,8 +28,6 @@ public final class WebvttParserUtil {
|
|||||||
|
|
||||||
private static final Pattern COMMENT = Pattern.compile("^NOTE((\u0020|\u0009).*)?$");
|
private static final Pattern COMMENT = Pattern.compile("^NOTE((\u0020|\u0009).*)?$");
|
||||||
private static final String WEBVTT_HEADER = "WEBVTT";
|
private static final String WEBVTT_HEADER = "WEBVTT";
|
||||||
private static final int WEBVTT_BOM_BE = 0xfeff;
|
|
||||||
private static final int WEBVTT_BOM_LE = 0xfffe;
|
|
||||||
|
|
||||||
private WebvttParserUtil() {}
|
private WebvttParserUtil() {}
|
||||||
|
|
||||||
@ -53,15 +51,6 @@ public final class WebvttParserUtil {
|
|||||||
* @param input The input from which the line should be read.
|
* @param input The input from which the line should be read.
|
||||||
*/
|
*/
|
||||||
public static boolean isWebvttHeaderLine(ParsableByteArray input) {
|
public static boolean isWebvttHeaderLine(ParsableByteArray input) {
|
||||||
if (input.bytesLeft() < 2) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int startPosition = input.getPosition();
|
|
||||||
int firstTwoBytes = input.readUnsignedShort();
|
|
||||||
if (firstTwoBytes != WEBVTT_BOM_BE && firstTwoBytes != WEBVTT_BOM_LE) {
|
|
||||||
// Not the BOM, should not be discarded.
|
|
||||||
input.setPosition(startPosition);
|
|
||||||
}
|
|
||||||
String line = input.readLine();
|
String line = input.readLine();
|
||||||
return line != null && line.startsWith(WEBVTT_HEADER);
|
return line != null && line.startsWith(WEBVTT_HEADER);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
坅䉖呔‣⁔桩猠捯浭敮琠楳汬潷敤
|
WEBVTT # This comment is allowed
|
||||||
|
|
||||||
00:00.000 --> 00:01.234
|
00:00.000 --> 00:01.234
|
||||||
This is the first subtitle.
|
This is the first subtitle.
|
||||||
|
@ -46,7 +46,8 @@ public final class WebvttExtractor implements Extractor {
|
|||||||
|
|
||||||
private static final Pattern LOCAL_TIMESTAMP = Pattern.compile("LOCAL:([^,]+)");
|
private static final Pattern LOCAL_TIMESTAMP = Pattern.compile("LOCAL:([^,]+)");
|
||||||
private static final Pattern MEDIA_TIMESTAMP = Pattern.compile("MPEGTS:(\\d+)");
|
private static final Pattern MEDIA_TIMESTAMP = Pattern.compile("MPEGTS:(\\d+)");
|
||||||
private static final int HEADER_MAX_LENGTH = 2 /* optional Byte Order Mark */ + 6 /* "WEBVTT" */;
|
private static final int HEADER_MIN_LENGTH = 6 /* "WEBVTT" */;
|
||||||
|
private static final int HEADER_MAX_LENGTH = 3 /* optional Byte Order Mark */ + HEADER_MIN_LENGTH;
|
||||||
|
|
||||||
private final String language;
|
private final String language;
|
||||||
private final TimestampAdjuster timestampAdjuster;
|
private final TimestampAdjuster timestampAdjuster;
|
||||||
@ -68,8 +69,19 @@ public final class WebvttExtractor implements Extractor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean sniff(ExtractorInput input) throws IOException, InterruptedException {
|
public boolean sniff(ExtractorInput input) throws IOException, InterruptedException {
|
||||||
|
// Check whether there is a header without BOM.
|
||||||
input.peekFully(
|
input.peekFully(
|
||||||
sampleData, /* offset= */ 0, /* length= */ HEADER_MAX_LENGTH, /* allowEndOfInput= */ false);
|
sampleData, /* offset= */ 0, /* length= */ HEADER_MIN_LENGTH, /* allowEndOfInput= */ false);
|
||||||
|
sampleDataWrapper.reset(sampleData, HEADER_MIN_LENGTH);
|
||||||
|
if (WebvttParserUtil.isWebvttHeaderLine(sampleDataWrapper)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// The header did not match, try including the BOM.
|
||||||
|
input.peekFully(
|
||||||
|
sampleData,
|
||||||
|
/* offset= */ HEADER_MIN_LENGTH,
|
||||||
|
HEADER_MAX_LENGTH - HEADER_MIN_LENGTH,
|
||||||
|
/* allowEndOfInput= */ false);
|
||||||
sampleDataWrapper.reset(sampleData, HEADER_MAX_LENGTH);
|
sampleDataWrapper.reset(sampleData, HEADER_MAX_LENGTH);
|
||||||
return WebvttParserUtil.isWebvttHeaderLine(sampleDataWrapper);
|
return WebvttParserUtil.isWebvttHeaderLine(sampleDataWrapper);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import com.google.android.exoplayer2.extractor.ExtractorInput;
|
import com.google.android.exoplayer2.extractor.ExtractorInput;
|
||||||
import com.google.android.exoplayer2.testutil.FakeExtractorInput;
|
import com.google.android.exoplayer2.testutil.FakeExtractorInput;
|
||||||
import com.google.android.exoplayer2.util.TimestampAdjuster;
|
import com.google.android.exoplayer2.util.TimestampAdjuster;
|
||||||
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@ -37,30 +38,37 @@ public class WebvttExtractorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sniff_discardsByteOrderMark() throws IOException, InterruptedException {
|
public void sniff_discardsByteOrderMark() throws IOException, InterruptedException {
|
||||||
byte[] data = new byte[] {(byte) 0xFE, (byte) 0xFF, 'W', 'E', 'B', 'V', 'T', 'T', '\n', ' '};
|
byte[] data =
|
||||||
|
new byte[] {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, 'W', 'E', 'B', 'V', 'T', 'T', '\n', ' '};
|
||||||
assertThat(sniffData(data)).isTrue();
|
assertThat(sniffData(data)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sniff_failsForIncorrectBom() throws IOException, InterruptedException {
|
public void sniff_failsForIncorrectBom() throws IOException, InterruptedException {
|
||||||
byte[] data = new byte[] {(byte) 0xFE, (byte) 0xFE, 'W', 'E', 'B', 'V', 'T', 'T', '\n'};
|
byte[] data =
|
||||||
|
new byte[] {(byte) 0xEF, (byte) 0xBB, (byte) 0xBB, 'W', 'E', 'B', 'V', 'T', 'T', '\n'};
|
||||||
assertThat(sniffData(data)).isFalse();
|
assertThat(sniffData(data)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sniff_failsForIncompleteHeader() throws IOException, InterruptedException {
|
public void sniff_failsForIncompleteHeader() throws IOException, InterruptedException {
|
||||||
byte[] data = new byte[] {(byte) 0xFE, (byte) 0xFE, 'W', 'E', 'B', 'V', 'T', '\n'};
|
byte[] data = new byte[] {'W', 'E', 'B', 'V', 'T', '\n'};
|
||||||
assertThat(sniffData(data)).isFalse();
|
assertThat(sniffData(data)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sniff_failsForIncorrectHeader() throws IOException, InterruptedException {
|
public void sniff_failsForIncorrectHeader() throws IOException, InterruptedException {
|
||||||
byte[] data = new byte[] {(byte) 0xFE, (byte) 0xFE, 'W', 'e', 'B', 'V', 'T', 'T', '\n'};
|
byte[] data =
|
||||||
|
new byte[] {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, 'W', 'e', 'B', 'V', 'T', 'T', '\n'};
|
||||||
assertThat(sniffData(data)).isFalse();
|
assertThat(sniffData(data)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean sniffData(byte[] data) throws IOException, InterruptedException {
|
private static boolean sniffData(byte[] data) throws IOException, InterruptedException {
|
||||||
ExtractorInput input = new FakeExtractorInput.Builder().setData(data).build();
|
ExtractorInput input = new FakeExtractorInput.Builder().setData(data).build();
|
||||||
return new WebvttExtractor(/* language= */ null, new TimestampAdjuster(0)).sniff(input);
|
try {
|
||||||
|
return new WebvttExtractor(/* language= */ null, new TimestampAdjuster(0)).sniff(input);
|
||||||
|
} catch (EOFException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user