# SDL: camera: FIXME removal: internal callback where userdata wasn't first parameter.

**URL:** <https://discourse.libsdl.org/t/sdl-camera-fixme-removal-internal-callback-where-userdata-wasnt-first-parameter/69527>\
**Category:** SDL Commits\
**Created:** [October 11, 2026, 2:22pm UTC](https://discourse.libsdl.org/t/sdl-camera-fixme-removal-internal-callback-where-userdata-wasnt-first-parameter/69527 "2026-10-11T14:22:26Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![SDLPushPostBot](https://discourse.libsdl.org/user_avatar/discourse.libsdl.org/sdlpushpostbot/32/4370_2.png) [@SDLPushPostBot](https://discourse.libsdl.org/u/SDLPushPostBot)\
**Post date:** [October 11, 2026, 2:22pm UTC](https://discourse.libsdl.org/t/sdl-camera-fixme-removal-internal-callback-where-userdata-wasnt-first-parameter/69527/1 "2026-10-11T14:22:26Z")

</div>

> <https://github.com/libsdl-org/SDL/commit/c409c327f98d1707018b385a134e167570a6f244>

```diff
From c409c327f98d1707018b385a134e167570a6f244 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sat, 10 Oct 2026 16:28:38 -0400
Subject: [PATCH] camera: FIXME removal: internal callback where userdata
 wasn't first parameter.

---
 src/camera/SDL_camera.c | 8 +++-----
 src/camera/SDL_syscamera.h | 2 +-
 src/camera/android/SDL_camera_android.c | 2 +-
 src/camera/coremedia/SDL_camera_coremedia.m | 2 +-
 src/camera/mediafoundation/SDL_camera_mediafoundation.c | 2 +-
 src/camera/openharmony/SDL_camera_openharmony.c | 6 +++---
 src/camera/v4l2/SDL_camera_v4l2.c | 4 ++--
 src/camera/vita/SDL_camera_vita.c | 2 +-
 8 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/camera/SDL_camera.c b/src/camera/SDL_camera.c
index a0cd468fe23cd..b39339c215a0b 100644
--- a/src/camera/SDL_camera.c
+++ b/src/camera/SDL_camera.c
@@ -626,7 +626,7 @@ void SDL_CameraPermissionOutcome(SDL_Camera *device, bool approved)
 
 typedef struct FindOnePhysicalCameraByCallbackData
 {
- bool (*callback)(SDL_Camera *device, void *userdata);
+ bool (*callback)(void *userdata, SDL_Camera *device);
     void *userdata;
     SDL_Camera *device;
 } FindOnePhysicalCameraByCallbackData;
@@ -635,22 +635,20 @@ static bool SDLCALL FindOnePhysicalCameraByCallback(void *userdata, const SDL_Ha
 {
     FindOnePhysicalCameraByCallbackData *data = (FindOnePhysicalCameraByCallbackData *) userdata;
     SDL_Camera *device = (SDL_Camera *) value;
- if (data->callback(device, data->userdata)) {
+ if (data->callback(data->userdata, device)) {
         data->device = device;
         return false; // stop iterating.
     }
     return true; // keep iterating.
 }
 
-// !!! FIXME: this doesn't follow SDL convention of `userdata` being the first param of the callback.
-SDL_Camera *SDL_FindPhysicalCameraByCallback(bool (*callback)(SDL_Camera *device, void *userdata), void *userdata)
+SDL_Camera *SDL_FindPhysicalCameraByCallback(bool (*callback)(void *userdata, SDL_Camera *device), void *userdata)
 {
     if (!SDL_GetCurrentCameraDriver()) {
         SDL_SetError("Camera subsystem is not initialized");
         return NULL;
     }
 
-
     FindOnePhysicalCameraByCallbackData data = { callback, userdata, NULL };
     SDL_LockRWLockForReading(camera_driver.device_hash_lock);
     SDL_IterateHashTable(camera_driver.device_hash, FindOnePhysicalCameraByCallback, &data);
diff --git a/src/camera/SDL_syscamera.h b/src/camera/SDL_syscamera.h
index 4b4c5be45c51b..eca8d1e3cecfa 100644
--- a/src/camera/SDL_syscamera.h
+++ b/src/camera/SDL_syscamera.h
@@ -37,7 +37,7 @@ extern SDL_Camera *SDL_AddCamera(const char *name, SDL_CameraPosition position,
 extern void SDL_CameraDisconnected(SDL_Camera *device);
 
 // Find an SDL_Camera, selected by a callback. NULL if not found. DOES NOT LOCK THE DEVICE.
-extern SDL_Camera *SDL_FindPhysicalCameraByCallback(bool (*callback)(SDL_Camera *device, void *userdata), void *userdata);
+extern SDL_Camera *SDL_FindPhysicalCameraByCallback(bool (*callback)(void *userdata, SDL_Camera *device), void *userdata);
 
 // Backends should call this when the user has approved/denied access to a camera.
 extern void SDL_CameraPermissionOutcome(SDL_Camera *device, bool approved);
diff --git a/src/camera/android/SDL_camera_android.c b/src/camera/android/SDL_camera_android.c
index ab6fb9dacbc78..b55ba8b0de38f 100644
--- a/src/camera/android/SDL_camera_android.c
+++ b/src/camera/android/SDL_camera_android.c
@@ -706,7 +706,7 @@ static void GatherCameraSpecs(const char *devid, CameraFormatAddData *add_data,
     pACameraMetadata_free(metadata);
 }
 
-static bool FindAndroidCameraByID(SDL_Camera *device, void *userdata)
+static bool FindAndroidCameraByID(void *userdata, SDL_Camera *device)
 {
     const char *devid = (const char *) userdata;
     return (SDL_strcmp(devid, (const char *) device->handle) == 0);
diff --git a/src/camera/coremedia/SDL_camera_coremedia.m b/src/camera/coremedia/SDL_camera_coremedia.m
index a780a067a8e2e..36f84e7be29fb 100644
--- a/src/camera/coremedia/SDL_camera_coremedia.m
+++ b/src/camera/coremedia/SDL_camera_coremedia.m
@@ -530,7 +530,7 @@ static void GatherCameraSpecs(AVCaptureDevice *device, CameraFormatAddData *add_
     }
 }
 
-static bool FindCoreMediaCameraByUniqueID(SDL_Camera *device, void *userdata)
+static bool FindCoreMediaCameraByUniqueID(void *userdata, SDL_Camera *device)
 {
     NSString *uniqueid = (__bridge NSString *) userdata;
     AVCaptureDevice *avdev = (__bridge AVCaptureDevice *) device->handle;
diff --git a/src/camera/mediafoundation/SDL_camera_mediafoundation.c b/src/camera/mediafoundation/SDL_camera_mediafoundation.c
index f04b77b595a63..0bd1bf8397fca 100644
--- a/src/camera/mediafoundation/SDL_camera_mediafoundation.c
+++ b/src/camera/mediafoundation/SDL_camera_mediafoundation.c
@@ -983,7 +983,7 @@ static void GatherCameraSpecs(IMFMediaSource *source, CameraFormatAddData *add_d
     IMFPresentationDescriptor_Release(presentdesc);
 }
 
-static bool FindMediaFoundationCameraBySymlink(SDL_Camera *device, void *userdata)
+static bool FindMediaFoundationCameraBySymlink(void *userdata, SDL_Camera *device)
 {
     return (SDL_strcmp((const char *) device->handle, (const char *) userdata) == 0);
 }
diff --git a/src/camera/openharmony/SDL_camera_openharmony.c b/src/camera/openharmony/SDL_camera_openharmony.c
index 12fe3cdd5b968..943d8614e7b06 100644
--- a/src/camera/openharmony/SDL_camera_openharmony.c
+++ b/src/camera/openharmony/SDL_camera_openharmony.c
@@ -209,20 +209,20 @@ static Camera_Format ConvertSDLFormatToOpenHarmony(SDL_PixelFormat fmt)
     }
 }
 
-static bool FindOpenHarmonyCameraByDevicePtr(SDL_Camera *device, void *userdata)
+static bool FindOpenHarmonyCameraByDevicePtr(void *userdata, SDL_Camera *device)
 {
     const Camera_Device *ohdevice = (const Camera_Device *) userdata;
     return (SDL_strcmp(ohdevice->cameraId, ((const Camera_Device *) device->handle)->cameraId) == 0);
 }
 
-static bool FindOpenHarmonyCameraByImageReceiver(SDL_Camera *device, void *userdata)
+static bool FindOpenHarmonyCameraByImageReceiver(void *userdata, SDL_Camera *device)
 {
     OH_ImageReceiverNative *receiver = (OH_ImageReceiverNative *) userdata;
     struct SDL_PrivateCameraData *hidden = device->hidden;
     return (hidden && (hidden->image_receiver == receiver));
 }
 
-static bool FindOpenHarmonyCameraByInput(SDL_Camera *device, void *userdata)
+static bool FindOpenHarmonyCameraByInput(void *userdata, SDL_Camera *device)
 {
     Camera_Input *input = (Camera_Input *) userdata;
     struct SDL_PrivateCameraData *hidden = device->hidden;
diff --git a/src/camera/v4l2/SDL_camera_v4l2.c b/src/camera/v4l2/SDL_camera_v4l2.c
index 938f5a3b86ed7..42c0c2c5ab8c0 100644
--- a/src/camera/v4l2/SDL_camera_v4l2.c
+++ b/src/camera/v4l2/SDL_camera_v4l2.c
@@ -672,7 +672,7 @@ static bool V4L2_OpenDevice(SDL_Camera *device, const SDL_CameraSpec *spec)
     return true;
 }
 
-static bool FindV4L2CameraByBusInfoCallback(SDL_Camera *device, void *userdata)
+static bool FindV4L2CameraByBusInfoCallback(void *userdata, SDL_Camera *device)
 {
     const V4L2DeviceHandle *handle = (const V4L2DeviceHandle *) device->handle;
     return (SDL_strcmp(handle->bus_info, (const char *) userdata) == 0);
@@ -897,7 +897,7 @@ static void V4L2_FreeDeviceHandle(SDL_Camera *device)
 }
 
 #ifdef SDL_USE_LIBUDEV
-static bool FindV4L2CameraByPathCallback(SDL_Camera *device, void *userdata)
+static bool FindV4L2CameraByPathCallback(void *userdata, SDL_Camera *device)
 {
     const V4L2DeviceHandle *handle = (const V4L2DeviceHandle *) device->handle;
     return (SDL_strcmp(handle->path, (const char *) userdata) == 0);
diff --git a/src/camera/vita/SDL_camera_vita.c b/src/camera/vita/SDL_camera_vita.c
index 36b75b522b1c2..86b2198b1f5e9 100644
--- a/src/camera/vita/SDL_camera_vita.c
+++ b/src/camera/vita/SDL_camera_vita.c
@@ -71,7 +71,7 @@ static void GatherCameraSpecs(Sint32 devid, CameraFormatAddData *add_data, char
     }
 }
 
-static bool FindVitaCameraByID(SDL_Camera *device, void *userdata)
+static bool FindVitaCameraByID(void *userdata, SDL_Camera *device)
 {
     Sint32 devid = (Sint32) userdata;
     return (devid == (Sint32)device->handle);

```
