Transcoder: MediaSampleReader sometimes drops last sample.
A bug caused MSR to drop the last sample in the file if that
was the only sample left to read and another track advanced past
it to make the extractor reach EOS. When the extractor reached EOS
MSR did not update it's position so when the first track came to read
the last sample it looked like the extractor was already positioned
on top of it.
Fixes: 180051221
Test: MediaSampleReaderNDKTests.TestLastSampleBeforeEOS + all unit tests
Change-Id: I7298dc8dcdafb93830cec2a446f68f7a8c878e19
diff --git a/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp b/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
index 11af0b1..3a499e5 100644
--- a/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
+++ b/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
@@ -272,6 +272,38 @@
compareSamples(tester.getSamples());
}
+/** Reads all samples except the last in each track, before finishing. */
+TEST_F(MediaSampleReaderNDKTests, TestLastSampleBeforeEOS) {
+ LOG(DEBUG) << "TestLastSampleBeforeEOS Starts";
+ initExtractorSamples();
+
+ { // Natural track order
+ SampleAccessTester tester{mSourceFd, mFileSize};
+ for (int trackIndex = 0; trackIndex < mTrackCount; ++trackIndex) {
+ tester.readSamplesAsync(trackIndex, mExtractorSamples[trackIndex].size() - 1);
+ }
+ tester.waitForTracks();
+ for (int trackIndex = 0; trackIndex < mTrackCount; ++trackIndex) {
+ tester.readSamplesAsync(trackIndex, SAMPLE_COUNT_ALL);
+ tester.waitForTrack(trackIndex);
+ }
+ compareSamples(tester.getSamples());
+ }
+
+ { // Reverse track order
+ SampleAccessTester tester{mSourceFd, mFileSize};
+ for (int trackIndex = mTrackCount - 1; trackIndex >= 0; --trackIndex) {
+ tester.readSamplesAsync(trackIndex, mExtractorSamples[trackIndex].size() - 1);
+ }
+ tester.waitForTracks();
+ for (int trackIndex = mTrackCount - 1; trackIndex >= 0; --trackIndex) {
+ tester.readSamplesAsync(trackIndex, SAMPLE_COUNT_ALL);
+ tester.waitForTrack(trackIndex);
+ }
+ compareSamples(tester.getSamples());
+ }
+}
+
/** Reads all samples from all tracks sequentially. */
TEST_F(MediaSampleReaderNDKTests, TestSequentialSampleAccess) {
LOG(DEBUG) << "TestSequentialSampleAccess Starts";