Fix MCVR crash when seeking in HDR10 videos

MCVR crashed because MCVR registers a new input stream to VideoSink on every
`onOutputFormatChanged()`, assuming that `onOutputFormatChanged()` is only
invoked on media item transition. However, it can be called multiple times for
one media item.

PiperOrigin-RevId: 649050576
This commit is contained in:
claincly 2024-07-03 06:20:22 -07:00 committed by Copybara-Service
parent ce8ab84b7c
commit ed3a741601
2 changed files with 5 additions and 1 deletions

View File

@ -179,6 +179,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
/* package */ @Nullable OnFrameRenderedListenerV23 tunnelingOnFrameRenderedListener;
@Nullable private VideoFrameMetadataListener frameMetadataListener;
private long startPositionUs;
private boolean videoSinkNeedsRegisterInputStream;
/**
* @param context A context.
@ -1304,7 +1305,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
decodedVideoSize =
new VideoSize(width, height, unappliedRotationDegrees, pixelWidthHeightRatio);
if (videoSink != null) {
if (videoSink != null && videoSinkNeedsRegisterInputStream) {
onReadyToRegisterVideoSinkInputStream();
videoSink.registerInputStream(
/* inputType= */ VideoSink.INPUT_TYPE_SURFACE,
@ -1318,6 +1319,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
} else {
videoFrameReleaseControl.setFrameRate(format.frameRate);
}
videoSinkNeedsRegisterInputStream = false;
}
/**
@ -1548,6 +1550,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
} else {
videoFrameReleaseControl.onProcessedStreamChange();
}
videoSinkNeedsRegisterInputStream = true;
maybeSetupTunnelingForFirstFrame();
}

View File

@ -256,6 +256,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
this.sequencePlayerRenderersWrapper = sequencePlayerRenderersWrapper;
videoSink =
checkStateNotNull(sequencePlayerRenderersWrapper.compositingVideoSinkProvider).getSink();
experimentalEnableProcessedStreamChangedAtStart();
}
@Override