From aba783aae27663bb79a93a10e630fc4ee900bdb5 Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Fri, 24 Apr 2020 13:20:00 +0100 Subject: Defer extractor init until after sniff Instead of doing it immediately after sniff success. This prevents some extractor implementations from outputting formats during the "sniffing" advance. Bug: 154120292 Test: atest CtsMediaParserTestCases Change-Id: I4f3349a8053d371cd06beaf24bd9745da0a4a093 --- apex/media/framework/java/android/media/MediaParser.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 50f4ddd5e2e3..2746cba76887 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -856,6 +856,7 @@ public final class MediaParser { private String mParserName; private Extractor mExtractor; private ExtractorInput mExtractorInput; + private boolean mPendingExtractorInit; private long mPendingSeekPosition; private long mPendingSeekTimeMicros; private boolean mLoggedSchemeInitDataCreationException; @@ -972,7 +973,7 @@ public final class MediaParser { if (extractor.sniff(mExtractorInput)) { mParserName = parserName; mExtractor = extractor; - mExtractor.init(new ExtractorOutputAdapter()); + mPendingExtractorInit = true; break; } } catch (EOFException e) { @@ -988,13 +989,17 @@ public final class MediaParser { } } + if (mPendingExtractorInit) { + mExtractor.init(new ExtractorOutputAdapter()); + mPendingExtractorInit = false; + } if (isPendingSeek()) { mExtractor.seek(mPendingSeekPosition, mPendingSeekTimeMicros); removePendingSeek(); } mPositionHolder.position = seekableInputReader.getPosition(); - int result = 0; + int result; try { result = mExtractor.read(mExtractorInput, mPositionHolder); } catch (ParserException e) { -- cgit v1.2.3-59-g8ed1b