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 a480e479fb..ce56c115f9 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 @@ -401,7 +401,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { private long lastBufferInStreamPresentationTimeUs; private boolean inputStreamEnded; private boolean outputStreamEnded; - private boolean waitingForFirstSyncSample; private boolean waitingForFirstSampleInFormat; private boolean pendingOutputEndOfStream; @MediaCodecOperationMode private int mediaCodecOperationMode; @@ -893,7 +892,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecHotswapDeadlineMs = C.TIME_UNSET; codecReceivedEos = false; codecReceivedBuffers = false; - waitingForFirstSyncSample = true; codecNeedsAdaptationWorkaroundBuffer = false; shouldSkipAdaptationWorkaroundOutputBuffer = false; isDecodeOnlyOutputBuffer = false; @@ -1320,19 +1318,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return false; } - // TODO: This code block may be unnecessary, because it's probably the case that the buffer will - // always be a keyframe if waitingForFirstSyncSample is true. Check this, and remove if so. - if (waitingForFirstSyncSample && !buffer.isKeyFrame()) { - buffer.clear(); - if (codecReconfigurationState == RECONFIGURATION_STATE_QUEUE_PENDING) { - // The buffer we just cleared contained reconfiguration data. We need to re-write this - // data into a subsequent buffer (if there is one). - codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING; - } - return true; - } - waitingForFirstSyncSample = false; - boolean bufferEncrypted = buffer.isEncrypted(); if (bufferEncrypted) { buffer.cryptoInfo.increaseClearDataFirstSubSampleBy(adaptiveReconfigurationBytes); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index 3c08012cb8..f2c9a11246 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -503,13 +503,23 @@ public class SampleQueue implements TrackOutput { if (upstreamFormatAdjustmentRequired) { format(Assertions.checkStateNotNull(unadjustedUpstreamFormat)); } + + boolean isKeyframe = (flags & C.BUFFER_FLAG_KEY_FRAME) != 0; + if (upstreamKeyframeRequired) { + if (!isKeyframe) { + return; + } + upstreamKeyframeRequired = false; + } + timeUs += sampleOffsetUs; if (pendingSplice) { - if ((flags & C.BUFFER_FLAG_KEY_FRAME) == 0 || !attemptSplice(timeUs)) { + if (!isKeyframe || !attemptSplice(timeUs)) { return; } pendingSplice = false; } + long absoluteOffset = sampleDataQueue.getTotalBytesWritten() - size - offset; commitSample(timeUs, flags, absoluteOffset, size, cryptoData); } @@ -676,14 +686,6 @@ public class SampleQueue implements TrackOutput { long offset, int size, @Nullable CryptoData cryptoData) { - if (upstreamKeyframeRequired) { - if ((sampleFlags & C.BUFFER_FLAG_KEY_FRAME) == 0) { - return; - } - upstreamKeyframeRequired = false; - } - Assertions.checkState(!upstreamFormatRequired); - isLastSampleQueued = (sampleFlags & C.BUFFER_FLAG_LAST_SAMPLE) != 0; largestQueuedTimestampUs = Math.max(largestQueuedTimestampUs, timeUs);