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;
}
@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(

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.
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());
}
}

View File

@ -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.
*

View File

@ -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);

View File

@ -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);
}