Commit 0e7740f5 by olly Committed by Toni

Clear FormatHolder before and after reading from the source.

PiperOrigin-RevId: 267135256
parent 578398c2
...@@ -33,4 +33,11 @@ public final class FormatHolder { ...@@ -33,4 +33,11 @@ public final class FormatHolder {
/** The held {@link Format}. */ /** The held {@link Format}. */
@Nullable public Format format; @Nullable public Format format;
/** Clears the holder. */
public void clear() {
includesDrmSession = false;
drmSession = null;
format = null;
}
} }
...@@ -271,10 +271,12 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -271,10 +271,12 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
// Try and read a format if we don't have one already. // Try and read a format if we don't have one already.
if (inputFormat == null) { if (inputFormat == null) {
// We don't have a format yet, so try and read one. // We don't have a format yet, so try and read one.
formatHolder.clear();
flagsOnlyBuffer.clear(); flagsOnlyBuffer.clear();
int result = readSource(formatHolder, flagsOnlyBuffer, true); int result = readSource(formatHolder, flagsOnlyBuffer, true);
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
} else if (result == C.RESULT_BUFFER_READ) { } else if (result == C.RESULT_BUFFER_READ) {
// End of stream read having not read a format. // End of stream read having not read a format.
Assertions.checkState(flagsOnlyBuffer.isEndOfStream()); Assertions.checkState(flagsOnlyBuffer.isEndOfStream());
...@@ -432,6 +434,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -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. // We've already read an encrypted sample into buffer, and are waiting for keys.
result = C.RESULT_BUFFER_READ; result = C.RESULT_BUFFER_READ;
} else { } else {
formatHolder.clear();
result = readSource(formatHolder, inputBuffer, false); result = readSource(formatHolder, inputBuffer, false);
} }
...@@ -440,6 +443,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -440,6 +443,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
} }
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
return true; return true;
} }
if (inputBuffer.isEndOfStream()) { if (inputBuffer.isEndOfStream()) {
......
...@@ -770,10 +770,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -770,10 +770,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
/** Reads into {@link #flagsOnlyBuffer} and returns whether a format was read. */ /** Reads into {@link #flagsOnlyBuffer} and returns whether a format was read. */
private boolean readToFlagsOnlyBuffer(boolean requireFormat) throws ExoPlaybackException { private boolean readToFlagsOnlyBuffer(boolean requireFormat) throws ExoPlaybackException {
formatHolder.clear();
flagsOnlyBuffer.clear(); flagsOnlyBuffer.clear();
int result = readSource(formatHolder, flagsOnlyBuffer, requireFormat); int result = readSource(formatHolder, flagsOnlyBuffer, requireFormat);
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
return true; return true;
} else if (result == C.RESULT_BUFFER_READ && flagsOnlyBuffer.isEndOfStream()) { } else if (result == C.RESULT_BUFFER_READ && flagsOnlyBuffer.isEndOfStream()) {
inputStreamEnded = true; inputStreamEnded = true;
...@@ -1056,6 +1058,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1056,6 +1058,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
codecReconfigurationState = RECONFIGURATION_STATE_QUEUE_PENDING; codecReconfigurationState = RECONFIGURATION_STATE_QUEUE_PENDING;
} }
adaptiveReconfigurationBytes = buffer.data.position(); adaptiveReconfigurationBytes = buffer.data.position();
formatHolder.clear();
result = readSource(formatHolder, buffer, false); result = readSource(formatHolder, buffer, false);
} }
...@@ -1075,6 +1078,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1075,6 +1078,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING; codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING;
} }
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
return true; return true;
} }
......
...@@ -114,6 +114,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -114,6 +114,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
if (!inputStreamEnded && pendingMetadataCount < MAX_PENDING_METADATA_COUNT) { if (!inputStreamEnded && pendingMetadataCount < MAX_PENDING_METADATA_COUNT) {
buffer.clear(); buffer.clear();
formatHolder.clear();
int result = readSource(formatHolder, buffer, false); int result = readSource(formatHolder, buffer, false);
if (result == C.RESULT_BUFFER_READ) { if (result == C.RESULT_BUFFER_READ) {
if (buffer.isEndOfStream()) { if (buffer.isEndOfStream()) {
...@@ -141,6 +142,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -141,6 +142,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
} }
} else if (result == C.RESULT_FORMAT_READ) { } else if (result == C.RESULT_FORMAT_READ) {
subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; subsampleOffsetUs = formatHolder.format.subsampleOffsetUs;
formatHolder.clear();
} }
} }
......
...@@ -168,10 +168,12 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { ...@@ -168,10 +168,12 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
if (format == null) { if (format == null) {
// We don't have a format yet, so try and read one. // We don't have a format yet, so try and read one.
formatHolder.clear();
flagsOnlyBuffer.clear(); flagsOnlyBuffer.clear();
int result = readSource(formatHolder, flagsOnlyBuffer, true); int result = readSource(formatHolder, flagsOnlyBuffer, true);
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
} else if (result == C.RESULT_BUFFER_READ) { } else if (result == C.RESULT_BUFFER_READ) {
// End of stream read having not read a format. // End of stream read having not read a format.
Assertions.checkState(flagsOnlyBuffer.isEndOfStream()); Assertions.checkState(flagsOnlyBuffer.isEndOfStream());
...@@ -701,6 +703,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { ...@@ -701,6 +703,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
// We've already read an encrypted sample into buffer, and are waiting for keys. // We've already read an encrypted sample into buffer, and are waiting for keys.
result = C.RESULT_BUFFER_READ; result = C.RESULT_BUFFER_READ;
} else { } else {
formatHolder.clear();
result = readSource(formatHolder, inputBuffer, false); result = readSource(formatHolder, inputBuffer, false);
} }
...@@ -709,6 +712,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { ...@@ -709,6 +712,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
} }
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
onInputFormatChanged(formatHolder); onInputFormatChanged(formatHolder);
formatHolder.clear();
return true; return true;
} }
if (inputBuffer.isEndOfStream()) { if (inputBuffer.isEndOfStream()) {
......
...@@ -85,8 +85,10 @@ public class CameraMotionRenderer extends BaseRenderer { ...@@ -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. // 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) { while (!hasReadStreamToEnd() && lastTimestampUs < positionUs + SAMPLE_WINDOW_DURATION_US) {
buffer.clear(); buffer.clear();
formatHolder.clear();
int result = readSource(formatHolder, buffer, /* formatRequired= */ false); int result = readSource(formatHolder, buffer, /* formatRequired= */ false);
if (result != C.RESULT_BUFFER_READ || buffer.isEndOfStream()) { if (result != C.RESULT_BUFFER_READ || buffer.isEndOfStream()) {
formatHolder.clear();
return; return;
} }
......
...@@ -79,13 +79,14 @@ public class FakeRenderer extends BaseRenderer { ...@@ -79,13 +79,14 @@ public class FakeRenderer extends BaseRenderer {
} }
playbackPositionUs = positionUs; playbackPositionUs = positionUs;
while (lastSamplePositionUs < positionUs + SOURCE_READAHEAD_US) { while (lastSamplePositionUs < positionUs + SOURCE_READAHEAD_US) {
formatHolder.format = null; formatHolder.clear();
buffer.clear(); buffer.clear();
int result = readSource(formatHolder, buffer, false); int result = readSource(formatHolder, buffer, false);
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
formatReadCount++; formatReadCount++;
assertThat(expectedFormats).contains(formatHolder.format); assertThat(expectedFormats).contains(formatHolder.format);
onFormatChanged(formatHolder.format); onFormatChanged(formatHolder.format);
formatHolder.clear();
} else if (result == C.RESULT_BUFFER_READ) { } else if (result == C.RESULT_BUFFER_READ) {
if (buffer.isEndOfStream()) { if (buffer.isEndOfStream()) {
isEnded = true; isEnded = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment