From ce59680d0fdd2b832481e11c9c6d54d59aef59c7 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 10 Mar 2025 10:56:45 -0700 Subject: [PATCH] Always call onProcessedStreamChanged for first stream for effects Before this CL: - MediaCodecVideoRenderer.onProcessedStreamChanged was called for the first stream in CompositionPlayer. - MediaCodecVideoRenderer.onProcessedStreamChanged was NOT called for the first stream in ExoPlayer.setVideoEffects. This discrepancy was adding some complexity to the code, making it less robust. PiperOrigin-RevId: 735439320 --- .../exoplayer/video/MediaCodecVideoRenderer.java | 12 ++++-------- .../media3/transformer/SequenceRenderersFactory.java | 1 - 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index f12a60966a..3c9baa8ac4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -935,6 +935,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer if (wakeupListener != null) { videoSink.setWakeupListener(wakeupListener); } + experimentalEnableProcessedStreamChangedAtStart(); } else { videoFrameReleaseControl.setClock(getClock()); int firstFrameReleaseInstruction = @@ -962,13 +963,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer MediaSource.MediaPeriodId mediaPeriodId) throws ExoPlaybackException { super.onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId); - if (this.startPositionUs == C.TIME_UNSET) { - this.startPositionUs = startPositionUs; - if (videoSink != null) { - videoSink.setStreamStartPositionUs(getOutputStreamStartPositionUs()); - videoSink.setBufferTimestampAdjustmentUs(getBufferTimestampAdjustmentUs()); - } - } updatePeriodDurationUs(mediaPeriodId); } @@ -992,7 +986,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer // MediaCodec once the codec is flushed. videoSink.flush(/* resetPosition= */ true); } - pendingVideoSinkInputStreamChange = true; } super.onPositionReset(positionUs, joining); if (videoSink == null) { @@ -1869,6 +1862,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer // Signaling end of the previous stream. videoSink.signalEndOfCurrentInputStream(); videoSink.setStreamStartPositionUs(getOutputStreamStartPositionUs()); + if (this.startPositionUs == C.TIME_UNSET) { + this.startPositionUs = getOutputStreamStartPositionUs(); + } videoSink.setBufferTimestampAdjustmentUs(getBufferTimestampAdjustmentUs()); } else { videoFrameReleaseControl.onStreamChanged(RELEASE_FIRST_FRAME_WHEN_PREVIOUS_STREAM_PROCESSED); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceRenderersFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceRenderersFactory.java index 9d64dfadae..80654a6bd4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceRenderersFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceRenderersFactory.java @@ -329,7 +329,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; this.bufferingVideoSink = bufferingVideoSink; this.requestToneMapping = requestToneMapping; this.pendingEffects = ImmutableList.of(); - experimentalEnableProcessedStreamChangedAtStart(); } @Override