Commit 092c66fa by ibaker Committed by kim-vde

Rollback of https://github.com/google/ExoPlayer/commit/1ed5d8b5633f935d3c7f2cc52c1493616b7e0d32

*** Original commit ***

Rollback of https://github.com/google/ExoPlayer/commit/bf5e6c7862ae418895b2b6b26fae9c28aa662ee8

*** Original commit ***

Pass startPositionUs into Renderer.replaceStream

Plumb this down into BaseRenderer.onStreamChanged and use it when
deciding whether to render the first frame of a new period.

***

***

PiperOrigin-RevId: 325251261
parent 60630fe9
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.mediacodec; package com.google.android.exoplayer2.mediacodec;
import static com.google.android.exoplayer2.util.Assertions.checkState;
import static java.lang.Math.max; import static java.lang.Math.max;
import android.annotation.TargetApi; import android.annotation.TargetApi;
...@@ -352,6 +353,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -352,6 +353,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
private final TimedValueQueue<Format> formatQueue; private final TimedValueQueue<Format> formatQueue;
private final ArrayList<Long> decodeOnlyPresentationTimestamps; private final ArrayList<Long> decodeOnlyPresentationTimestamps;
private final MediaCodec.BufferInfo outputBufferInfo; private final MediaCodec.BufferInfo outputBufferInfo;
private final long[] pendingOutputStreamStartPositionsUs;
private final long[] pendingOutputStreamOffsetsUs; private final long[] pendingOutputStreamOffsetsUs;
private final long[] pendingOutputStreamSwitchTimesUs; private final long[] pendingOutputStreamSwitchTimesUs;
...@@ -409,6 +411,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -409,6 +411,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@MediaCodecOperationMode private int mediaCodecOperationMode; @MediaCodecOperationMode private int mediaCodecOperationMode;
@Nullable private ExoPlaybackException pendingPlaybackException; @Nullable private ExoPlaybackException pendingPlaybackException;
protected DecoderCounters decoderCounters; protected DecoderCounters decoderCounters;
private long outputStreamStartPositionUs;
private long outputStreamOffsetUs; private long outputStreamOffsetUs;
private int pendingOutputStreamOffsetCount; private int pendingOutputStreamOffsetCount;
...@@ -439,8 +442,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -439,8 +442,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
outputBufferInfo = new MediaCodec.BufferInfo(); outputBufferInfo = new MediaCodec.BufferInfo();
operatingRate = 1f; operatingRate = 1f;
mediaCodecOperationMode = OPERATION_MODE_SYNCHRONOUS; mediaCodecOperationMode = OPERATION_MODE_SYNCHRONOUS;
pendingOutputStreamStartPositionsUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT];
pendingOutputStreamOffsetsUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT]; pendingOutputStreamOffsetsUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT];
pendingOutputStreamSwitchTimesUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT]; pendingOutputStreamSwitchTimesUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT];
outputStreamStartPositionUs = C.TIME_UNSET;
outputStreamOffsetUs = C.TIME_UNSET; outputStreamOffsetUs = C.TIME_UNSET;
bypassBatchBuffer = new BatchBuffer(); bypassBatchBuffer = new BatchBuffer();
resetCodecStateForRelease(); resetCodecStateForRelease();
...@@ -685,8 +690,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -685,8 +690,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Override @Override
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
throws ExoPlaybackException { throws ExoPlaybackException {
if (outputStreamOffsetUs == C.TIME_UNSET) { if (this.outputStreamOffsetUs == C.TIME_UNSET) {
outputStreamOffsetUs = offsetUs; checkState(this.outputStreamStartPositionUs == C.TIME_UNSET);
this.outputStreamStartPositionUs = startPositionUs;
this.outputStreamOffsetUs = offsetUs;
} else { } else {
if (pendingOutputStreamOffsetCount == pendingOutputStreamOffsetsUs.length) { if (pendingOutputStreamOffsetCount == pendingOutputStreamOffsetsUs.length) {
Log.w( Log.w(
...@@ -696,6 +703,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -696,6 +703,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} else { } else {
pendingOutputStreamOffsetCount++; pendingOutputStreamOffsetCount++;
} }
pendingOutputStreamStartPositionsUs[pendingOutputStreamOffsetCount - 1] = startPositionUs;
pendingOutputStreamOffsetsUs[pendingOutputStreamOffsetCount - 1] = offsetUs; pendingOutputStreamOffsetsUs[pendingOutputStreamOffsetCount - 1] = offsetUs;
pendingOutputStreamSwitchTimesUs[pendingOutputStreamOffsetCount - 1] = pendingOutputStreamSwitchTimesUs[pendingOutputStreamOffsetCount - 1] =
largestQueuedPresentationTimeUs; largestQueuedPresentationTimeUs;
...@@ -721,6 +729,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -721,6 +729,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
formatQueue.clear(); formatQueue.clear();
if (pendingOutputStreamOffsetCount != 0) { if (pendingOutputStreamOffsetCount != 0) {
outputStreamOffsetUs = pendingOutputStreamOffsetsUs[pendingOutputStreamOffsetCount - 1]; outputStreamOffsetUs = pendingOutputStreamOffsetsUs[pendingOutputStreamOffsetCount - 1];
outputStreamStartPositionUs =
pendingOutputStreamStartPositionsUs[pendingOutputStreamOffsetCount - 1];
pendingOutputStreamOffsetCount = 0; pendingOutputStreamOffsetCount = 0;
} }
} }
...@@ -738,6 +748,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -738,6 +748,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Override @Override
protected void onDisabled() { protected void onDisabled() {
inputFormat = null; inputFormat = null;
outputStreamStartPositionUs = C.TIME_UNSET;
outputStreamOffsetUs = C.TIME_UNSET; outputStreamOffsetUs = C.TIME_UNSET;
pendingOutputStreamOffsetCount = 0; pendingOutputStreamOffsetCount = 0;
if (sourceDrmSession != null || codecDrmSession != null) { if (sourceDrmSession != null || codecDrmSession != null) {
...@@ -1545,9 +1556,16 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1545,9 +1556,16 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
protected void onProcessedOutputBuffer(long presentationTimeUs) { protected void onProcessedOutputBuffer(long presentationTimeUs) {
while (pendingOutputStreamOffsetCount != 0 while (pendingOutputStreamOffsetCount != 0
&& presentationTimeUs >= pendingOutputStreamSwitchTimesUs[0]) { && presentationTimeUs >= pendingOutputStreamSwitchTimesUs[0]) {
outputStreamStartPositionUs = pendingOutputStreamStartPositionsUs[0];
outputStreamOffsetUs = pendingOutputStreamOffsetsUs[0]; outputStreamOffsetUs = pendingOutputStreamOffsetsUs[0];
pendingOutputStreamOffsetCount--; pendingOutputStreamOffsetCount--;
System.arraycopy( System.arraycopy(
pendingOutputStreamStartPositionsUs,
/* srcPos= */ 1,
pendingOutputStreamStartPositionsUs,
/* destPos= */ 0,
pendingOutputStreamOffsetCount);
System.arraycopy(
pendingOutputStreamOffsetsUs, pendingOutputStreamOffsetsUs,
/* srcPos= */ 1, /* srcPos= */ 1,
pendingOutputStreamOffsetsUs, pendingOutputStreamOffsetsUs,
...@@ -1946,6 +1964,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -1946,6 +1964,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} }
/** /**
* Returns the start position of the output {@link SampleStream}, in renderer time microseconds.
*/
protected final long getOutputStreamStartPositionUs() {
return outputStreamStartPositionUs;
}
/**
* Returns the offset that should be subtracted from {@code bufferPresentationTimeUs} in {@link * Returns the offset that should be subtracted from {@code bufferPresentationTimeUs} in {@link
* #processOutputBuffer(long, long, MediaCodec, ByteBuffer, int, int, int, long, boolean, boolean, * #processOutputBuffer(long, long, MediaCodec, ByteBuffer, int, int, int, long, boolean, boolean,
* Format)} to get the playback position with respect to the media. * Format)} to get the playback position with respect to the media.
...@@ -2080,7 +2105,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -2080,7 +2105,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
BatchBuffer batchBuffer = bypassBatchBuffer; BatchBuffer batchBuffer = bypassBatchBuffer;
// Let's process the pending buffer if any. // Let's process the pending buffer if any.
Assertions.checkState(!outputStreamEnded); checkState(!outputStreamEnded);
if (!batchBuffer.isEmpty()) { // Optimisation: Do not process buffer if empty. if (!batchBuffer.isEmpty()) { // Optimisation: Do not process buffer if empty.
if (processOutputBuffer( if (processOutputBuffer(
positionUs, positionUs,
...@@ -2119,7 +2144,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -2119,7 +2144,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} }
// Now refill the empty buffer for the next iteration. // Now refill the empty buffer for the next iteration.
Assertions.checkState(!inputStreamEnded); checkState(!inputStreamEnded);
FormatHolder formatHolder = getFormatHolder(); FormatHolder formatHolder = getFormatHolder();
boolean formatChange = readBatchFromSource(formatHolder, batchBuffer); boolean formatChange = readBatchFromSource(formatHolder, batchBuffer);
......
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