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.

(cherry picked from commit e2a2e2c31e)
This commit is contained in:
Qiu Qiang
2026-03-02 14:11:41 -05:00
committed by Sam Lantinga
parent 6299705584
commit ef03c66ef3

View File

@@ -368,8 +368,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:)] &&
@@ -439,8 +438,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];
}