Set stream offset on video sink
PiperOrigin-RevId: 628084729
This commit is contained in:
parent
a6eef7b8d8
commit
bf266c96a9
@ -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(
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user