From f7135e5b7b3b19c21406ba21a8cae5e5f24e13f0 Mon Sep 17 00:00:00 2001 From: ankur <82200779+therealpurplemana@users.noreply.github.com> Date: Wed, 29 Apr 2026 22:30:09 -0700 Subject: [PATCH] fix: guard unsupportedCaptureOutputClasses behind #if !targetEnvironment(simulator) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SimCam injects a DummyCaptureDeviceFormat into the iOS Simulator to fake camera input. When VisionCamera's ConstraintResolver calls supportsOutput() on startup, it reads unsupportedCaptureOutputClasses, which internally calls isStreamingDisparitySupported. That method crashes with SIGSEGV (null pointer dereference at offset 0x59) because SimCam's dummy format doesn't implement it. On simulator, skip the output class check entirely — the camera is fake anyway and all outputs can be assumed supported. Crash stack: AVCaptureDeviceFormat.isStreamingDisparitySupported <-- SIGSEGV AVCaptureDeviceFormat.unsupportedCaptureOutputClasses AVCaptureDeviceFormat.supportsOutput (this file) ConstraintResolver.filterFormats HybridCameraSession.configureConnection --- .../AVCaptureDevice.Format+supportsOutput.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/react-native-vision-camera/ios/Extensions/AVFoundation/AVCaptureDevice.Format+supportsOutput.swift b/packages/react-native-vision-camera/ios/Extensions/AVFoundation/AVCaptureDevice.Format+supportsOutput.swift index 5a496ce5a3..a55730b29c 100644 --- a/packages/react-native-vision-camera/ios/Extensions/AVFoundation/AVCaptureDevice.Format+supportsOutput.swift +++ b/packages/react-native-vision-camera/ios/Extensions/AVFoundation/AVCaptureDevice.Format+supportsOutput.swift @@ -9,7 +9,15 @@ import Foundation extension AVCaptureDevice.Format { func supportsOutput(_ output: AVCaptureOutput) -> Bool { + #if targetEnvironment(simulator) + // SimCam's DummyCaptureDeviceFormat doesn't implement isStreamingDisparitySupported, + // which is called internally by unsupportedCaptureOutputClasses, causing a SIGSEGV + // on the com.margelo.camera.session queue. On simulator all outputs are assumed + // supported since we're using a fake camera anyway. + return true + #else let targetOutputClass = type(of: output) return self.unsupportedCaptureOutputClasses.allSatisfy { $0 != targetOutputClass } + #endif } }