From 0e7740f576dfb4379df96cd44ef3eeb862fe1c10 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 4 Sep 2019 13:44:11 +0100 Subject: [PATCH] Clear FormatHolder before and after reading from the source. PiperOrigin-RevId: 267135256 --- .../java/com/google/android/exoplayer2/FormatHolder.java | 7 +++++++ .../exoplayer2/audio/SimpleDecoderAudioRenderer.java | 4 ++++ .../android/exoplayer2/mediacodec/MediaCodecRenderer.java | 4 ++++ .../android/exoplayer2/metadata/MetadataRenderer.java | 2 ++ .../exoplayer2/video/SimpleDecoderVideoRenderer.java | 4 ++++ .../exoplayer2/video/spherical/CameraMotionRenderer.java | 2 ++ .../google/android/exoplayer2/testutil/FakeRenderer.java | 3 ++- 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java b/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java index c1b2ace9b7..7d21182de2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java @@ -33,4 +33,11 @@ public final class FormatHolder { /** The held {@link Format}. */ @Nullable public Format format; + + /** Clears the holder. */ + public void clear() { + includesDrmSession = false; + drmSession = null; + format = null; + } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java index e4691db7c0..22d34fc904 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java @@ -271,10 +271,12 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements // Try and read a format if we don't have one already. if (inputFormat == null) { // We don't have a format yet, so try and read one. + formatHolder.clear(); flagsOnlyBuffer.clear(); int result = readSource(formatHolder, flagsOnlyBuffer, true); if (result == C.RESULT_FORMAT_READ) { onInputFormatChanged(formatHolder); + formatHolder.clear(); } else if (result == C.RESULT_BUFFER_READ) { // End of stream read having not read a format. Assertions.checkState(flagsOnlyBuffer.isEndOfStream()); @@ -432,6 +434,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements // We've already read an encrypted sample into buffer, and are waiting for keys. result = C.RESULT_BUFFER_READ; } else { + formatHolder.clear(); result = readSource(formatHolder, inputBuffer, false); } @@ -440,6 +443,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements } if (result == C.RESULT_FORMAT_READ) { onInputFormatChanged(formatHolder); + formatHolder.clear(); return true; } if (inputBuffer.isEndOfStream()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index c077d8d227..45ae82d049 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -770,10 +770,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { /** Reads into {@link #flagsOnlyBuffer} and returns whether a format was read. */ private boolean readToFlagsOnlyBuffer(boolean requireFormat) throws ExoPlaybackException { + formatHolder.clear(); flagsOnlyBuffer.clear(); int result = readSource(formatHolder, flagsOnlyBuffer, requireFormat); if (result == C.RESULT_FORMAT_READ) { onInputFormatChanged(formatHolder); + formatHolder.clear(); return true; } else if (result == C.RESULT_BUFFER_READ && flagsOnlyBuffer.isEndOfStream()) { inputStreamEnded = true; @@ -1056,6 +1058,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecReconfigurationState = RECONFIGURATION_STATE_QUEUE_PENDING; } adaptiveReconfigurationBytes = buffer.data.position(); + formatHolder.clear(); result = readSource(formatHolder, buffer, false); } @@ -1075,6 +1078,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING; } onInputFormatChanged(formatHolder); + formatHolder.clear(); return true; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java index 0dc0dc6096..d162164f79 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java @@ -114,6 +114,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { if (!inputStreamEnded && pendingMetadataCount < MAX_PENDING_METADATA_COUNT) { buffer.clear(); + formatHolder.clear(); int result = readSource(formatHolder, buffer, false); if (result == C.RESULT_BUFFER_READ) { if (buffer.isEndOfStream()) { @@ -141,6 +142,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { } } else if (result == C.RESULT_FORMAT_READ) { subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; + formatHolder.clear(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java index 83f528e322..39c3aa2621 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java @@ -168,10 +168,12 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { if (format == null) { // We don't have a format yet, so try and read one. + formatHolder.clear(); flagsOnlyBuffer.clear(); int result = readSource(formatHolder, flagsOnlyBuffer, true); if (result == C.RESULT_FORMAT_READ) { onInputFormatChanged(formatHolder); + formatHolder.clear(); } else if (result == C.RESULT_BUFFER_READ) { // End of stream read having not read a format. Assertions.checkState(flagsOnlyBuffer.isEndOfStream()); @@ -701,6 +703,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { // We've already read an encrypted sample into buffer, and are waiting for keys. result = C.RESULT_BUFFER_READ; } else { + formatHolder.clear(); result = readSource(formatHolder, inputBuffer, false); } @@ -709,6 +712,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { } if (result == C.RESULT_FORMAT_READ) { onInputFormatChanged(formatHolder); + formatHolder.clear(); return true; } if (inputBuffer.isEndOfStream()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java index 7d76f43d04..9384d32a6f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java @@ -85,8 +85,10 @@ public class CameraMotionRenderer extends BaseRenderer { // Keep reading available samples as long as the sample time is not too far into the future. while (!hasReadStreamToEnd() && lastTimestampUs < positionUs + SAMPLE_WINDOW_DURATION_US) { buffer.clear(); + formatHolder.clear(); int result = readSource(formatHolder, buffer, /* formatRequired= */ false); if (result != C.RESULT_BUFFER_READ || buffer.isEndOfStream()) { + formatHolder.clear(); return; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java index 0d65d7fcc7..499aa1ec9e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java @@ -79,13 +79,14 @@ public class FakeRenderer extends BaseRenderer { } playbackPositionUs = positionUs; while (lastSamplePositionUs < positionUs + SOURCE_READAHEAD_US) { - formatHolder.format = null; + formatHolder.clear(); buffer.clear(); int result = readSource(formatHolder, buffer, false); if (result == C.RESULT_FORMAT_READ) { formatReadCount++; assertThat(expectedFormats).contains(formatHolder.format); onFormatChanged(formatHolder.format); + formatHolder.clear(); } else if (result == C.RESULT_BUFFER_READ) { if (buffer.isEndOfStream()) { isEnded = true;