mirror of
https://github.com/samsonjs/media.git
synced 2026-03-30 10:15:48 +00:00
Push formatHolder up to the BaseRenderer class
PiperOrigin-RevId: 268431514
This commit is contained in:
parent
bbe8c25832
commit
890700fa0f
7 changed files with 19 additions and 30 deletions
|
|
@ -34,6 +34,7 @@ import java.io.IOException;
|
|||
public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||
|
||||
private final int trackType;
|
||||
private final FormatHolder formatHolder;
|
||||
|
||||
private RendererConfiguration configuration;
|
||||
private int index;
|
||||
|
|
@ -50,6 +51,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||
*/
|
||||
public BaseRenderer(int trackType) {
|
||||
this.trackType = trackType;
|
||||
formatHolder = new FormatHolder();
|
||||
readingPositionUs = C.TIME_END_OF_SOURCE;
|
||||
}
|
||||
|
||||
|
|
@ -157,6 +159,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||
@Override
|
||||
public final void disable() {
|
||||
Assertions.checkState(state == STATE_ENABLED);
|
||||
formatHolder.clear();
|
||||
state = STATE_DISABLED;
|
||||
stream = null;
|
||||
streamFormats = null;
|
||||
|
|
@ -167,6 +170,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||
@Override
|
||||
public final void reset() {
|
||||
Assertions.checkState(state == STATE_DISABLED);
|
||||
formatHolder.clear();
|
||||
onReset();
|
||||
}
|
||||
|
||||
|
|
@ -275,6 +279,12 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||
|
||||
// Methods to be called by subclasses.
|
||||
|
||||
/** Returns a clear {@link FormatHolder}. */
|
||||
protected final FormatHolder getFormatHolder() {
|
||||
formatHolder.clear();
|
||||
return formatHolder;
|
||||
}
|
||||
|
||||
/** Returns the formats of the currently enabled stream. */
|
||||
protected final Format[] getStreamFormats() {
|
||||
return streamFormats;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||
private final boolean playClearSamplesWithoutKeys;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final AudioSink audioSink;
|
||||
private final FormatHolder formatHolder;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
|
||||
private DecoderCounters decoderCounters;
|
||||
|
|
@ -212,7 +211,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||
eventDispatcher = new EventDispatcher(eventHandler, eventListener);
|
||||
this.audioSink = audioSink;
|
||||
audioSink.setListener(new AudioSinkListener());
|
||||
formatHolder = new FormatHolder();
|
||||
flagsOnlyBuffer = DecoderInputBuffer.newFlagsOnlyInstance();
|
||||
decoderReinitializationState = REINITIALIZATION_STATE_NONE;
|
||||
audioTrackNeedsConfigure = true;
|
||||
|
|
@ -270,12 +268,11 @@ 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();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
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());
|
||||
|
|
@ -440,11 +437,11 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||
}
|
||||
|
||||
int result;
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
if (waitingForKeys) {
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
|
@ -453,7 +450,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||
}
|
||||
if (result == C.RESULT_FORMAT_READ) {
|
||||
onInputFormatChanged(formatHolder);
|
||||
formatHolder.clear();
|
||||
return true;
|
||||
}
|
||||
if (inputBuffer.isEndOfStream()) {
|
||||
|
|
|
|||
|
|
@ -319,7 +319,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||
private final float assumedMinimumCodecOperatingRate;
|
||||
private final DecoderInputBuffer buffer;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
private final FormatHolder formatHolder;
|
||||
private final TimedValueQueue<Format> formatQueue;
|
||||
private final ArrayList<Long> decodeOnlyPresentationTimestamps;
|
||||
private final MediaCodec.BufferInfo outputBufferInfo;
|
||||
|
|
@ -405,7 +404,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||
this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate;
|
||||
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED);
|
||||
flagsOnlyBuffer = DecoderInputBuffer.newFlagsOnlyInstance();
|
||||
formatHolder = new FormatHolder();
|
||||
formatQueue = new TimedValueQueue<>();
|
||||
decodeOnlyPresentationTimestamps = new ArrayList<>();
|
||||
outputBufferInfo = new MediaCodec.BufferInfo();
|
||||
|
|
@ -769,12 +767,11 @@ 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();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
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;
|
||||
|
|
@ -1042,6 +1039,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||
}
|
||||
|
||||
int result;
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
int adaptiveReconfigurationBytes = 0;
|
||||
if (waitingForKeys) {
|
||||
// We've already read an encrypted sample into buffer, and are waiting for keys.
|
||||
|
|
@ -1057,7 +1055,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||
codecReconfigurationState = RECONFIGURATION_STATE_QUEUE_PENDING;
|
||||
}
|
||||
adaptiveReconfigurationBytes = buffer.data.position();
|
||||
formatHolder.clear();
|
||||
result = readSource(formatHolder, buffer, false);
|
||||
}
|
||||
|
||||
|
|
@ -1077,7 +1074,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||
codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING;
|
||||
}
|
||||
onInputFormatChanged(formatHolder);
|
||||
formatHolder.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
|||
private final MetadataDecoderFactory decoderFactory;
|
||||
private final MetadataOutput output;
|
||||
@Nullable private final Handler outputHandler;
|
||||
private final FormatHolder formatHolder;
|
||||
private final MetadataInputBuffer buffer;
|
||||
private final Metadata[] pendingMetadata;
|
||||
private final long[] pendingMetadataTimestamps;
|
||||
|
|
@ -84,7 +83,6 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
|||
this.outputHandler =
|
||||
outputLooper == null ? null : Util.createHandler(outputLooper, /* callback= */ this);
|
||||
this.decoderFactory = Assertions.checkNotNull(decoderFactory);
|
||||
formatHolder = new FormatHolder();
|
||||
buffer = new MetadataInputBuffer();
|
||||
pendingMetadata = new Metadata[MAX_PENDING_METADATA_COUNT];
|
||||
pendingMetadataTimestamps = new long[MAX_PENDING_METADATA_COUNT];
|
||||
|
|
@ -114,7 +112,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();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
int result = readSource(formatHolder, buffer, false);
|
||||
if (result == C.RESULT_BUFFER_READ) {
|
||||
if (buffer.isEndOfStream()) {
|
||||
|
|
@ -142,7 +140,6 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
|||
}
|
||||
} else if (result == C.RESULT_FORMAT_READ) {
|
||||
subsampleOffsetUs = formatHolder.format.subsampleOffsetUs;
|
||||
formatHolder.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||
private final int maxDroppedFramesToNotify;
|
||||
private final boolean playClearSamplesWithoutKeys;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final FormatHolder formatHolder;
|
||||
private final TimedValueQueue<Format> formatQueue;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
||||
|
|
@ -144,7 +143,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
||||
joiningDeadlineMs = C.TIME_UNSET;
|
||||
clearReportedVideoSize();
|
||||
formatHolder = new FormatHolder();
|
||||
formatQueue = new TimedValueQueue<>();
|
||||
flagsOnlyBuffer = DecoderInputBuffer.newFlagsOnlyInstance();
|
||||
eventDispatcher = new EventDispatcher(eventHandler, eventListener);
|
||||
|
|
@ -166,12 +164,11 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||
|
||||
if (inputFormat == null) {
|
||||
// We don't have a format yet, so try and read one.
|
||||
formatHolder.clear();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
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());
|
||||
|
|
@ -680,11 +677,11 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||
}
|
||||
|
||||
int result;
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
if (waitingForKeys) {
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
|
@ -693,7 +690,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||
}
|
||||
if (result == C.RESULT_FORMAT_READ) {
|
||||
onInputFormatChanged(formatHolder);
|
||||
formatHolder.clear();
|
||||
return true;
|
||||
}
|
||||
if (inputBuffer.isEndOfStream()) {
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ public class CameraMotionRenderer extends BaseRenderer {
|
|||
// The amount of time to read samples ahead of the current time.
|
||||
private static final int SAMPLE_WINDOW_DURATION_US = 100000;
|
||||
|
||||
private final FormatHolder formatHolder;
|
||||
private final DecoderInputBuffer buffer;
|
||||
private final ParsableByteArray scratch;
|
||||
|
||||
|
|
@ -44,7 +43,6 @@ public class CameraMotionRenderer extends BaseRenderer {
|
|||
|
||||
public CameraMotionRenderer() {
|
||||
super(C.TRACK_TYPE_CAMERA_MOTION);
|
||||
formatHolder = new FormatHolder();
|
||||
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
|
||||
scratch = new ParsableByteArray();
|
||||
}
|
||||
|
|
@ -85,10 +83,9 @@ 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();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
int result = readSource(formatHolder, buffer, /* formatRequired= */ false);
|
||||
if (result != C.RESULT_BUFFER_READ || buffer.isEndOfStream()) {
|
||||
formatHolder.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ public class FakeRenderer extends BaseRenderer {
|
|||
|
||||
private final List<Format> expectedFormats;
|
||||
private final DecoderInputBuffer buffer;
|
||||
private final FormatHolder formatHolder;
|
||||
|
||||
private long playbackPositionUs;
|
||||
private long lastSamplePositionUs;
|
||||
|
|
@ -60,7 +59,6 @@ public class FakeRenderer extends BaseRenderer {
|
|||
: MimeTypes.getTrackType(expectedFormats[0].sampleMimeType));
|
||||
this.expectedFormats = Collections.unmodifiableList(Arrays.asList(expectedFormats));
|
||||
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
|
||||
formatHolder = new FormatHolder();
|
||||
lastSamplePositionUs = Long.MIN_VALUE;
|
||||
}
|
||||
|
||||
|
|
@ -79,14 +77,13 @@ public class FakeRenderer extends BaseRenderer {
|
|||
}
|
||||
playbackPositionUs = positionUs;
|
||||
while (lastSamplePositionUs < positionUs + SOURCE_READAHEAD_US) {
|
||||
formatHolder.clear();
|
||||
FormatHolder formatHolder = getFormatHolder();
|
||||
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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue