mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-20 20:46:02 +08:00
camera: Reenabled macOS/iOS support, with rewritten CoreMedia implementation.
This commit is contained in:
@@ -66,8 +66,8 @@ typedef struct SDL_CameraSpec
|
||||
Uint32 format; /**< Frame SDL_PixelFormatEnum format */
|
||||
int width; /**< Frame width */
|
||||
int height; /**< Frame height */
|
||||
int interval_numerator; /**< Frame rate numerator ((dom / num) == fps) */
|
||||
int interval_denominator; /**< Frame rate demoninator ((dom / num) == fps)*/
|
||||
int interval_numerator; /**< Frame rate numerator ((dom / num) == fps, (num / dom) == duration) */
|
||||
int interval_denominator; /**< Frame rate demoninator ((dom / num) == fps, (num / dom) == duration) */
|
||||
} SDL_CameraSpec;
|
||||
|
||||
/**
|
||||
|
||||
@@ -246,8 +246,6 @@
|
||||
|
||||
#cmakedefine USE_POSIX_SPAWN @USE_POSIX_SPAWN@
|
||||
|
||||
#cmakedefine HAVE_COREMEDIA
|
||||
|
||||
/* SDL internal assertion support */
|
||||
#if @SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED@
|
||||
#cmakedefine SDL_DEFAULT_ASSERT_LEVEL @SDL_DEFAULT_ASSERT_LEVEL@
|
||||
|
||||
@@ -198,8 +198,6 @@
|
||||
#define SDL_VIDEO_METAL 1
|
||||
#endif
|
||||
|
||||
#define HAVE_COREMEDIA 1
|
||||
|
||||
/* Enable system power support */
|
||||
#define SDL_POWER_UIKIT 1
|
||||
|
||||
@@ -213,6 +211,10 @@
|
||||
#define SDL_FILESYSTEM_COCOA 1
|
||||
|
||||
/* enable camera support */
|
||||
#ifndef SDL_PLATFORM_TVOS
|
||||
#define SDL_CAMERA_DRIVER_COREMEDIA 1
|
||||
#endif
|
||||
|
||||
#define SDL_CAMERA_DRIVER_DUMMY 1
|
||||
|
||||
#endif /* SDL_build_config_ios_h_ */
|
||||
|
||||
@@ -261,8 +261,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define HAVE_COREMEDIA 1
|
||||
|
||||
/* Enable system power support */
|
||||
#define SDL_POWER_MACOSX 1
|
||||
|
||||
|
||||
@@ -73,6 +73,12 @@ const char *SDL_GetCurrentCameraDriver(void)
|
||||
return camera_driver.name;
|
||||
}
|
||||
|
||||
char *SDL_GetCameraThreadName(SDL_CameraDevice *device, char *buf, size_t buflen)
|
||||
{
|
||||
(void)SDL_snprintf(buf, buflen, "SDLCamera%d", (int) device->instance_id);
|
||||
return buf;
|
||||
}
|
||||
|
||||
int SDL_AddCameraFormat(CameraFormatAddData *data, Uint32 fmt, int w, int h, int interval_numerator, int interval_denominator)
|
||||
{
|
||||
SDL_assert(data != NULL);
|
||||
@@ -683,7 +689,7 @@ SDL_bool SDL_CameraThreadIterate(SDL_CameraDevice *device)
|
||||
failed = SDL_TRUE;
|
||||
}
|
||||
|
||||
// we can let go of the lock once we've tried to grab a frame of video and maybe moved the output frame from the empty to the filled list.
|
||||
// we can let go of the lock once we've tried to grab a frame of video and maybe moved the output frame off the empty list.
|
||||
// this lets us chew up the CPU for conversion and scaling without blocking other threads.
|
||||
SDL_UnlockMutex(device->lock);
|
||||
|
||||
@@ -988,7 +994,7 @@ SDL_Camera *SDL_OpenCameraDevice(SDL_CameraDeviceID instance_id, const SDL_Camer
|
||||
// Start the camera thread if necessary
|
||||
if (!camera_driver.impl.ProvidesOwnCallbackThread) {
|
||||
char threadname[64];
|
||||
SDL_snprintf(threadname, sizeof (threadname), "SDLCamera%d", (int) instance_id);
|
||||
SDL_GetCameraThreadName(device, threadname, sizeof (threadname));
|
||||
device->thread = SDL_CreateThreadInternal(CameraThread, threadname, 0, device);
|
||||
if (!device->thread) {
|
||||
ClosePhysicalCameraDevice(device);
|
||||
|
||||
@@ -28,10 +28,7 @@
|
||||
#define DEBUG_CAMERA 0
|
||||
|
||||
|
||||
// !!! FIXME: update these drivers!
|
||||
#ifdef SDL_CAMERA_DRIVER_COREMEDIA
|
||||
#undef SDL_CAMERA_DRIVER_COREMEDIA
|
||||
#endif
|
||||
// !!! FIXME: update this driver!
|
||||
#ifdef SDL_CAMERA_DRIVER_ANDROID
|
||||
#undef SDL_CAMERA_DRIVER_ANDROID
|
||||
#endif
|
||||
@@ -53,6 +50,9 @@ extern SDL_CameraDevice *SDL_FindPhysicalCameraDeviceByCallback(SDL_bool (*callb
|
||||
// Backends should call this when the user has approved/denied access to a camera.
|
||||
extern void SDL_CameraDevicePermissionOutcome(SDL_CameraDevice *device, SDL_bool approved);
|
||||
|
||||
// Backends can call this to get a standardized name for a thread to power a specific camera device.
|
||||
extern char *SDL_GetCameraThreadName(SDL_CameraDevice *device, char *buf, size_t buflen);
|
||||
|
||||
// These functions are the heart of the camera threads. Backends can call them directly if they aren't using the SDL-provided thread.
|
||||
extern void SDL_CameraThreadSetup(SDL_CameraDevice *device);
|
||||
extern SDL_bool SDL_CameraThreadIterate(SDL_CameraDevice *device);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -501,8 +501,6 @@ static int MEDIAFOUNDATION_OpenDevice(SDL_CameraDevice *device, const SDL_Camera
|
||||
//PROPVARIANT var;
|
||||
HRESULT ret;
|
||||
|
||||
SDL_Log("MEDIAFOUNDATION spec format: %s", SDL_GetPixelFormatName(spec->format));
|
||||
|
||||
#if 0
|
||||
IMFStreamDescriptor *streamdesc = NULL;
|
||||
IMFPresentationDescriptor *presentdesc = NULL;
|
||||
|
||||
Reference in New Issue
Block a user