diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java index 83cdeef82a..b611612f33 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java @@ -1305,11 +1305,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return true; } - if (hasReadStreamToEnd() || buffer.isLastSample()) { - // Notify output queue of the last buffer's timestamp. - lastBufferInStreamPresentationTimeUs = largestQueuedPresentationTimeUs; - } - if (result == C.RESULT_NOTHING_READ) { return false; } @@ -1397,6 +1392,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer { waitingForFirstSampleInFormat = false; } largestQueuedPresentationTimeUs = max(largestQueuedPresentationTimeUs, presentationTimeUs); + if (hasReadStreamToEnd() || buffer.isLastSample()) { + // Notify output queue of the last buffer's timestamp. + lastBufferInStreamPresentationTimeUs = largestQueuedPresentationTimeUs; + } buffer.flip(); if (buffer.hasSupplementalData()) { handleInputBufferSupplementalData(buffer); @@ -1915,11 +1914,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { && outputBufferInfo.presentationTimeUs == 0 && (outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0 && largestQueuedPresentationTimeUs != C.TIME_UNSET) { - outputBufferInfo.presentationTimeUs = largestQueuedPresentationTimeUs; + outputBufferInfo.presentationTimeUs = lastBufferInStreamPresentationTimeUs; } isDecodeOnlyOutputBuffer = outputBufferInfo.presentationTimeUs < getLastResetPositionUs(); isLastOutputBuffer = - lastBufferInStreamPresentationTimeUs == outputBufferInfo.presentationTimeUs; + lastBufferInStreamPresentationTimeUs != C.TIME_UNSET + && lastBufferInStreamPresentationTimeUs <= outputBufferInfo.presentationTimeUs; updateOutputFormatForTime(outputBufferInfo.presentationTimeUs); }