Set stream offset on video sink

PiperOrigin-RevId: 628084729
This commit is contained in:
kimvde 2024-04-25 08:30:03 -07:00 committed by Copybara-Service
parent a6eef7b8d8
commit bf266c96a9
5 changed files with 29 additions and 35 deletions

View File

@ -273,11 +273,6 @@ public final class CompositingVideoSinkProvider
return videoSinkImpl; return videoSinkImpl;
} }
@Override
public void setStreamOffsetUs(long streamOffsetUs) {
videoSinkImpl.setStreamOffsetUs(streamOffsetUs);
}
@Override @Override
public void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution) { public void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution) {
if (currentSurfaceAndSize != null if (currentSurfaceAndSize != null
@ -673,6 +668,23 @@ public final class CompositingVideoSinkProvider
return checkStateNotNull(videoFrameProcessor).getInputSurface(); 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 @Override
public long registerInputFrame(long framePresentationTimeUs, boolean isLastFrame) { public long registerInputFrame(long framePresentationTimeUs, boolean isLastFrame) {
checkState(isInitialized()); 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 // Other methods
/** Sets the {@linkplain Effect video effects}. */ /** Sets the {@linkplain Effect video effects}. */
@ -780,12 +781,6 @@ public final class CompositingVideoSinkProvider
this.videoEffects.addAll(videoEffects); 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) { private void maybeSetStreamOffsetChange(long bufferPresentationTimeUs) {
if (pendingInputStreamOffsetChange) { if (pendingInputStreamOffsetChange) {
CompositingVideoSinkProvider.this.onStreamOffsetChange( CompositingVideoSinkProvider.this.onStreamOffsetChange(

View File

@ -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. // We always use the video sink if the video sink provider is passed to the renderer.
boolean useVideoSink = enableEffectsForOwnSinkProvider || !ownsVideoSinkProvider; boolean useVideoSink = enableEffectsForOwnSinkProvider || !ownsVideoSinkProvider;
if (useVideoSink) { if (useVideoSink) {
videoSinkProvider.setStreamOffsetUs(getOutputStreamOffsetUs());
videoSink = videoSinkProvider.getSink(); videoSink = videoSinkProvider.getSink();
if (!videoSink.isInitialized()) { if (!videoSink.isInitialized()) {
try { try {
@ -1113,6 +1112,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
if (frameMetadataListener != null) { if (frameMetadataListener != null) {
videoSink.setVideoFrameMetadataListener(frameMetadataListener); videoSink.setVideoFrameMetadataListener(frameMetadataListener);
} }
videoSink.setStreamOffsetUs(getOutputStreamOffsetUs());
if (enableEffectsForOwnSinkProvider) { if (enableEffectsForOwnSinkProvider) {
if (displaySurface != null && outputResolution != null) { if (displaySurface != null && outputResolution != null) {
videoSinkProvider.setOutputSurfaceInfo(displaySurface, outputResolution); videoSinkProvider.setOutputSurfaceInfo(displaySurface, outputResolution);
@ -1472,7 +1472,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
videoFrameReleaseControl.onProcessedStreamChange(); videoFrameReleaseControl.onProcessedStreamChange();
maybeSetupTunnelingForFirstFrame(); maybeSetupTunnelingForFirstFrame();
if (videoSink != null) { if (videoSink != null) {
videoSinkProvider.setStreamOffsetUs(getOutputStreamOffsetUs()); videoSink.setStreamOffsetUs(getOutputStreamOffsetUs());
} }
} }

View File

@ -158,6 +158,12 @@ public interface VideoSink {
/** Sets the playback speed. */ /** Sets the playback speed. */
void setPlaybackSpeed(@FloatRange(from = 0, fromInclusive = false) float 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. * Informs the video sink that a new input stream will be queued.
* *

View File

@ -59,12 +59,6 @@ public interface VideoSinkProvider {
/** Returns a {@link VideoSink} to forward video frames for processing. */ /** Returns a {@link VideoSink} to forward video frames for processing. */
VideoSink getSink(); 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. */ /** Sets the output surface info. */
void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution); void setOutputSurfaceInfo(Surface outputSurface, Size outputResolution);

View File

@ -78,19 +78,18 @@ public final class CompositingVideoSinkProviderTest {
} }
@Test @Test
public void setOutputStreamOffsetUs_frameReleaseTimesAreAdjusted() public void setSinkStreamOffsetUs_frameReleaseTimesAreAdjusted()
throws VideoSink.VideoSinkException { throws VideoSink.VideoSinkException {
CompositingVideoSinkProvider provider = createCompositingVideoSinkProvider(); VideoSink videoSink = createCompositingVideoSinkProvider().getSink();
VideoSink videoSink = provider.getSink();
videoSink.initialize(new Format.Builder().build(), Clock.DEFAULT); videoSink.initialize(new Format.Builder().build(), Clock.DEFAULT);
videoSink.registerInputStream( videoSink.registerInputStream(
VideoSink.INPUT_TYPE_SURFACE, new Format.Builder().setWidth(640).setHeight(480).build()); VideoSink.INPUT_TYPE_SURFACE, new Format.Builder().setWidth(640).setHeight(480).build());
assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)).isEqualTo(0); assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)).isEqualTo(0);
provider.setStreamOffsetUs(1_000); videoSink.setStreamOffsetUs(1_000);
assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)) assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false))
.isEqualTo(1_000_000); .isEqualTo(1_000_000);
provider.setStreamOffsetUs(2_000); videoSink.setStreamOffsetUs(2_000);
assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false)) assertThat(videoSink.registerInputFrame(/* framePresentationTimeUs= */ 0, false))
.isEqualTo(2_000_000); .isEqualTo(2_000_000);
} }