From e2a2e2c31e71d9a5a478918ce5fddfb14f814dbb Mon Sep 17 00:00:00 2001 From: Qiu Qiang Date: Mon, 2 Mar 2026 14:11:41 -0500 Subject: [PATCH] camera: Fix crash when setting frame rate and improve FPS precision - Use exact numerator/denominator from spec for CMTime to avoid rounding errors. - Wrap frame rate setting in @try-catch to prevent crashes on strict drivers. --- src/camera/coremedia/SDL_camera_coremedia.m | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/camera/coremedia/SDL_camera_coremedia.m b/src/camera/coremedia/SDL_camera_coremedia.m index e1e3e3c4a9..3af7c2b3f5 100644 --- a/src/camera/coremedia/SDL_camera_coremedia.m +++ b/src/camera/coremedia/SDL_camera_coremedia.m @@ -371,8 +371,7 @@ static bool COREMEDIA_OpenDevice(SDL_Camera *device, const SDL_CameraSpec *spec) avdevice.activeFormat = spec_format; // Try to set the frame duration to enforce the requested frame rate - const float frameRate = (float)spec->framerate_numerator / spec->framerate_denominator; - const CMTime frameDuration = CMTimeMake(1, (int32_t)frameRate); + const CMTime frameDuration = CMTimeMake(spec->framerate_denominator, spec->framerate_numerator); // Check if the device supports setting frame duration if ([avdevice respondsToSelector:@selector(setActiveVideoMinFrameDuration:)] && @@ -442,8 +441,12 @@ static bool COREMEDIA_OpenDevice(SDL_Camera *device, const SDL_CameraSpec *spec) // Try to set the frame rate on the device (preferred modern approach) if ([avdevice lockForConfiguration:nil]) { - avdevice.activeVideoMinFrameDuration = frameDuration; - avdevice.activeVideoMaxFrameDuration = frameDuration; + @try { + avdevice.activeVideoMinFrameDuration = frameDuration; + avdevice.activeVideoMaxFrameDuration = frameDuration; + } @catch (NSException *exception) { + // Some devices don't support setting frame duration, that's okay + } [avdevice unlockForConfiguration]; }