mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Clear FormatHolder before and after reading from the source.
PiperOrigin-RevId: 267135256
This commit is contained in:
parent
578398c297
commit
0e7740f576
7 changed files with 25 additions and 1 deletions
|
|
@ -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
|
||||||
// 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
|
||||||
// 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
|
||||||
}
|
}
|
||||||
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 {
|
||||||
|
|
||||||
/** 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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
}
|
}
|
||||||
} 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 {
|
||||||
|
|
||||||
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 {
|
||||||
// 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 {
|
||||||
}
|
}
|
||||||
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 {
|
||||||
// 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 {
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue