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

View File

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