瀏覽代碼

decklink: Reset video capture on format change

Fixes black screen when toggling between 4K SDR and HDR on PS5.
jpark37 2 年之前
父節點
當前提交
4fd595efe9
共有 1 個文件被更改,包括 16 次插入9 次删除
  1. 16 9
      plugins/decklink/decklink-device-instance.cpp

+ 16 - 9
plugins/decklink/decklink-device-instance.cpp

@@ -794,25 +794,32 @@ HRESULT STDMETHODCALLTYPE DeckLinkDeviceInstance::VideoInputFormatChanged(
 	BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode *newMode,
 	BMDDetectedVideoInputFormatFlags detectedSignalFlags)
 {
+	bool formatChanged = false;
 	if (events & bmdVideoInputColorspaceChanged) {
 		constexpr BMDDetectedVideoInputFormatFlags highBitFlags =
 			(bmdDetectedVideoInput12BitDepth |
 			 bmdDetectedVideoInput10BitDepth);
 		if (detectedSignalFlags & bmdDetectedVideoInputRGB444) {
-			pixelFormat = ((detectedSignalFlags & highBitFlags) &&
-				       allow10Bit)
-					      ? bmdFormat10BitRGBXLE
-					      : bmdFormat8BitBGRA;
+			const BMDPixelFormat nextFormat =
+				((detectedSignalFlags & highBitFlags) &&
+				 allow10Bit)
+					? bmdFormat10BitRGBXLE
+					: bmdFormat8BitBGRA;
+			formatChanged = pixelFormat != nextFormat;
+			pixelFormat = nextFormat;
 		}
 		if (detectedSignalFlags & bmdDetectedVideoInputYCbCr422) {
-			pixelFormat = ((detectedSignalFlags & highBitFlags) &&
-				       allow10Bit)
-					      ? bmdFormat10BitYUV
-					      : bmdFormat8BitYUV;
+			const BMDPixelFormat nextFormat =
+				((detectedSignalFlags & highBitFlags) &&
+				 allow10Bit)
+					? bmdFormat10BitYUV
+					: bmdFormat8BitYUV;
+			formatChanged = pixelFormat != nextFormat;
+			pixelFormat = nextFormat;
 		}
 	}
 
-	if (events & bmdVideoInputDisplayModeChanged) {
+	if (formatChanged || (events & bmdVideoInputDisplayModeChanged)) {
 		input->PauseStreams();
 		mode->SetMode(newMode);
 		displayMode = mode->GetDisplayMode();