From bf266c96a97f720c8f1bc723809402b2eaed603b Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 25 Apr 2024 08:30:03 -0700 Subject: [PATCH] Set stream offset on video sink PiperOrigin-RevId: 628084729 --- .../video/CompositingVideoSinkProvider.java | 39 ++++++++----------- .../video/MediaCodecVideoRenderer.java | 4 +- .../media3/exoplayer/video/VideoSink.java | 6 +++ .../exoplayer/video/VideoSinkProvider.java | 6 --- .../CompositingVideoSinkProviderTest.java | 9 ++--- 5 files changed, 29 insertions(+), 35 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java index 1765b6931b..bfe5fbca11 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java @@ -273,11 +273,6 @@ public final class CompositingVideoSinkProvider return videoSinkImpl; } - @Override - public void setStreamOffsetUs(long streamOffsetUs) { - videoSinkImpl.setStreamOffsetUs(streamOffsetUs); - } - @Override public void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution) { if (currentSurfaceAndSize != null @@ -673,6 +668,23 @@ public final class CompositingVideoSinkProvider return checkStateNotNull(videoFrameProcessor).getInputSurface(); } + @Override + public void setVideoFrameMetadataListener( + VideoFrameMetadataListener videoFrameMetadataListener) { + CompositingVideoSinkProvider.this.setVideoFrameMetadataListener(videoFrameMetadataListener); + } + + @Override + public void setPlaybackSpeed(@FloatRange(from = 0, fromInclusive = false) float speed) { + CompositingVideoSinkProvider.this.setPlaybackSpeed(speed); + } + + @Override + public void setStreamOffsetUs(long streamOffsetUs) { + pendingInputStreamOffsetChange = inputStreamOffsetUs != streamOffsetUs; + inputStreamOffsetUs = streamOffsetUs; + } + @Override public long registerInputFrame(long framePresentationTimeUs, boolean isLastFrame) { checkState(isInitialized()); @@ -752,17 +764,6 @@ public final class CompositingVideoSinkProvider } } - @Override - public void setVideoFrameMetadataListener( - VideoFrameMetadataListener videoFrameMetadataListener) { - CompositingVideoSinkProvider.this.setVideoFrameMetadataListener(videoFrameMetadataListener); - } - - @Override - public void setPlaybackSpeed(@FloatRange(from = 0, fromInclusive = false) float speed) { - CompositingVideoSinkProvider.this.setPlaybackSpeed(speed); - } - // Other methods /** Sets the {@linkplain Effect video effects}. */ @@ -780,12 +781,6 @@ public final class CompositingVideoSinkProvider this.videoEffects.addAll(videoEffects); } - /** Sets the stream offset, in microseconds. */ - public void setStreamOffsetUs(long streamOffsetUs) { - pendingInputStreamOffsetChange = inputStreamOffsetUs != streamOffsetUs; - inputStreamOffsetUs = streamOffsetUs; - } - private void maybeSetStreamOffsetChange(long bufferPresentationTimeUs) { if (pendingInputStreamOffsetChange) { CompositingVideoSinkProvider.this.onStreamOffsetChange( 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 f9dd4a9643..4c03f5e9c2 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 @@ -1066,7 +1066,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer // We always use the video sink if the video sink provider is passed to the renderer. boolean useVideoSink = enableEffectsForOwnSinkProvider || !ownsVideoSinkProvider; if (useVideoSink) { - videoSinkProvider.setStreamOffsetUs(getOutputStreamOffsetUs()); videoSink = videoSinkProvider.getSink(); if (!videoSink.isInitialized()) { try { @@ -1113,6 +1112,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer if (frameMetadataListener != null) { videoSink.setVideoFrameMetadataListener(frameMetadataListener); } + videoSink.setStreamOffsetUs(getOutputStreamOffsetUs()); if (enableEffectsForOwnSinkProvider) { if (displaySurface != null && outputResolution != null) { videoSinkProvider.setOutputSurfaceInfo(displaySurface, outputResolution); @@ -1472,7 +1472,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer videoFrameReleaseControl.onProcessedStreamChange(); maybeSetupTunnelingForFirstFrame(); if (videoSink != null) { - videoSinkProvider.setStreamOffsetUs(getOutputStreamOffsetUs()); + videoSink.setStreamOffsetUs(getOutputStreamOffsetUs()); } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java index bb8b29bae6..64abf81a1a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java @@ -158,6 +158,12 @@ public interface VideoSink { /** Sets the playback speed. */ void setPlaybackSpeed(@FloatRange(from = 0, fromInclusive = false) float speed); + /** + * Sets the offset, in microseconds, that is added to the video frames presentation timestamps + * from the player. + */ + void setStreamOffsetUs(long streamOffsetUs); + /** * Informs the video sink that a new input stream will be queued. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSinkProvider.java index e4bcab3acb..41333959b7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSinkProvider.java @@ -59,12 +59,6 @@ public interface VideoSinkProvider { /** Returns a {@link VideoSink} to forward video frames for processing. */ VideoSink getSink(); - /** - * Sets the offset, in microseconds, that is added to the video frames presentation timestamps - * from the player. - */ - void setStreamOffsetUs(long streamOffsetUs); - /** Sets the output surface info. */ void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution); diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java index 09d7a66a9c..b1d625a98f 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java @@ -78,19 +78,18 @@ public final class CompositingVideoSinkProviderTest { } @Test - public void setOutputStreamOffsetUs_frameReleaseTimesAreAdjusted() + public void setSinkStreamOffsetUs_frameReleaseTimesAreAdjusted() throws VideoSink.VideoSinkException { - CompositingVideoSinkProvider provider = createCompositingVideoSinkProvider(); - VideoSink videoSink = provider.getSink(); + VideoSink videoSink = createCompositingVideoSinkProvider().getSink(); videoSink.initialize(new Format.Builder().build(), Clock.DEFAULT); videoSink.registerInputStream( VideoSink.INPUT_TYPE_SURFACE, new Format.Builder().setWidth(640).setHeight(480).build()); assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)).isEqualTo(0); - provider.setStreamOffsetUs(1_000); + videoSink.setStreamOffsetUs(1_000); assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)) .isEqualTo(1_000_000); - provider.setStreamOffsetUs(2_000); + videoSink.setStreamOffsetUs(2_000); assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)) .isEqualTo(2_000_000); }