Trim zero padding from EBML string values

Issue #4010

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=190442962
This commit is contained in:
olly 2018-03-26 04:05:13 -07:00 committed by Oliver Woodman
parent 40947d52f0
commit dfe4bfba03
3 changed files with 19 additions and 3 deletions

View file

@ -34,6 +34,8 @@
* Prevent multiple instances of SimpleCache in the same folder.
Previous instance must be released.
* DRM: Allow multiple listeners for `DefaultDrmSessionManager`.
* Fix handling of zero padded strings when parsing Matroska streams
([#4010](https://github.com/google/ExoPlayer/issues/4010)).
* Fix ANR issue on Redmi 4X and Redmi Note 4
([#4006](https://github.com/google/ExoPlayer/issues/4006)).
* Removed default renderer time offset of 60000000 from internal player. The

View file

@ -209,10 +209,11 @@ import java.util.Stack;
}
/**
* Reads and returns a string of length {@code byteLength} from the {@link ExtractorInput}.
* Reads a string of length {@code byteLength} from the {@link ExtractorInput}. Zero padding is
* removed, so the returned string may be shorter than {@code byteLength}.
*
* @param input The {@link ExtractorInput} from which to read.
* @param byteLength The length of the float being read.
* @param byteLength The length of the string being read, including zero padding.
* @return The read string value.
* @throws IOException If an error occurs reading from the input.
* @throws InterruptedException If the thread is interrupted.
@ -224,7 +225,12 @@ import java.util.Stack;
}
byte[] stringBytes = new byte[byteLength];
input.readFully(stringBytes, 0, byteLength);
return new String(stringBytes);
// Remove zero padding.
int trimmedLength = byteLength;
while (trimmedLength > 0 && stringBytes[trimmedLength - 1] == 0) {
trimmedLength--;
}
return new String(stringBytes, 0, trimmedLength);
}
/**

View file

@ -89,6 +89,14 @@ public class DefaultEbmlReaderTest {
assertEvents(input, expected.events);
}
@Test
public void testStringElementWithZeroPadding() throws IOException, InterruptedException {
ExtractorInput input = createTestInput(0x42, 0x82, 0x86, 0x41, 0x62, 0x63, 0x00, 0x00, 0x00);
TestOutput expected = new TestOutput();
expected.stringElement(TestOutput.ID_DOC_TYPE, "Abc");
assertEvents(input, expected.events);
}
@Test
public void testStringElementEmpty() throws IOException, InterruptedException {
ExtractorInput input = createTestInput(0x42, 0x82, 0x80);