annotate SDL3/SDL_camera.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 * # CategoryCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 * Video capture for the SDL library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 * This API lets apps read input from video sources, like webcams. Camera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * devices can be enumerated, queried, and opened. Once opened, it will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 * provide SDL_Surface objects as new frames of video come in. These surfaces
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 * can be uploaded to an SDL_Texture or processed as pixels in memory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 * Several platforms will alert the user if an app tries to access a camera,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 * and some will present a UI asking the user if your application should be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 * allowed to obtain images at all, which they can deny. A successfully opened
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 * camera will not provide images until permission is granted. Applications,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 * after opening a camera device, can see if they were granted access by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 * either polling with the SDL_GetCameraPermissionState() function, or waiting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 * for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 * event. Platforms that don't have any user approval process will report
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 * approval immediately.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 * Note that SDL cameras only provide video as individual frames; they will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 * not provide full-motion video encoded in a movie file format, although an
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 * app is free to encode the acquired frames into any format it likes. It also
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 * does not provide audio from the camera hardware through this API; not only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 * do many webcams not have microphones at all, many people--from streamers to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 * people on Zoom calls--will want to use a separate microphone regardless of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 * the camera. In any case, recorded audio will be available through SDL's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 * audio API no matter what hardware provides the microphone.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 * ## Camera gotchas
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 * Consumer-level camera hardware tends to take a little while to warm up,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 * once the device has been opened. Generally most camera apps have some sort
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 * of UI to take a picture (a button to snap a pic while a preview is showing,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 * some sort of multi-second countdown for the user to pose, like a photo
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 * booth), which puts control in the users' hands, or they are intended to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 * stay on for long times (Pokemon Go, etc).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * It's not uncommon that a newly-opened camera will provide a couple of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 * completely black frames, maybe followed by some under-exposed images. If
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 * taking a single frame automatically, or recording video from a camera's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 * input without the user initiating it from a preview, it could be wise to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 * drop the first several frames (if not the first several _seconds_ worth of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 * frames!) before using images from a camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 #ifndef SDL_camera_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 #define SDL_camera_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 #include <SDL3/SDL_error.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 #include <SDL3/SDL_pixels.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 #include <SDL3/SDL_properties.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 #include <SDL3/SDL_surface.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 #include <SDL3/SDL_begin_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 /* Set up for C function definitions, even when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 * This is a unique ID for a camera device for the time it is connected to the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 * system, and is never reused for the lifetime of the application.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 * If the device is disconnected and reconnected, it will get a new ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 * The value 0 is an invalid ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * \since This datatype is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * \sa SDL_GetCameras
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 typedef Uint32 SDL_CameraID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 * The opaque structure used to identify an opened SDL camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 typedef struct SDL_Camera SDL_Camera;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 * The details of an output format for a camera device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 * Cameras often support multiple formats; each one will be encapsulated in
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 * this struct.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 * \sa SDL_GetCameraSupportedFormats
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 * \sa SDL_GetCameraFormat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 typedef struct SDL_CameraSpec
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 SDL_PixelFormat format; /**< Frame format */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 SDL_Colorspace colorspace; /**< Frame colorspace */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 int width; /**< Frame width */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 int height; /**< Frame height */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 int framerate_denominator; /**< Frame rate denominator ((num / denom) == FPS, (denom / num) == duration in seconds) */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 } SDL_CameraSpec;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 * The position of camera in relation to system device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 * \since This enum is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 * \sa SDL_GetCameraPosition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 typedef enum SDL_CameraPosition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 SDL_CAMERA_POSITION_UNKNOWN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 SDL_CAMERA_POSITION_FRONT_FACING,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 SDL_CAMERA_POSITION_BACK_FACING
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 } SDL_CameraPosition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 * The current state of a request for camera access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 * \since This enum is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 * \sa SDL_GetCameraPermissionState
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 typedef enum SDL_CameraPermissionState
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 SDL_CAMERA_PERMISSION_STATE_DENIED = -1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 SDL_CAMERA_PERMISSION_STATE_PENDING,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 SDL_CAMERA_PERMISSION_STATE_APPROVED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 } SDL_CameraPermissionState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 * Use this function to get the number of built-in camera drivers.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 * This function returns a hardcoded number. This never returns a negative
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 * value; if there are no drivers compiled into this build of SDL, this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 * function returns zero. The presence of a driver in this list does not mean
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 * it will function, it just means SDL is capable of interacting with that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 * interface. For example, a build of SDL might have v4l2 support, but if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 * there's no kernel support available, SDL's v4l2 driver would fail if used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 * By default, SDL tries all drivers, in its preferred order, until one is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 * found to be usable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 * \returns the number of built-in camera drivers.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 * \sa SDL_GetCameraDriver
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * Use this function to get the name of a built in camera driver.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 * The list of camera drivers is given in the order that they are normally
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * initialized by default; the drivers that seem more reasonable to choose
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 * first (as far as the SDL developers believe) are earlier in the list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 * The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 * "coremedia" or "android". These never have Unicode characters, and are not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 * meant to be proper names.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 * \param index the index of the camera driver; the value ranges from 0 to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 * SDL_GetNumCameraDrivers() - 1.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 * \returns the name of the camera driver at the requested index, or NULL if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 * an invalid index was specified.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 * \sa SDL_GetNumCameraDrivers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 * Get the name of the current camera driver.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 * The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 * "coremedia" or "android". These never have Unicode characters, and are not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 * meant to be proper names.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 * \returns the name of the current camera driver or NULL if no driver has
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 * been initialized.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 * Get a list of currently connected camera devices.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 * \param count a pointer filled in with the number of cameras returned, may
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 * be NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 * \returns a 0 terminated array of camera instance IDs or NULL on failure;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 * call SDL_GetError() for more information. This should be freed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 * with SDL_free() when it is no longer needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 * Get the list of native formats/sizes a camera supports.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 * This returns a list of all formats and frame sizes that a specific camera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 * can offer. This is useful if your app can accept a variety of image formats
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 * and sizes and so want to find the optimal spec that doesn't require
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 * conversion.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 * This function isn't strictly required; if you call SDL_OpenCamera with a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 * NULL spec, SDL will choose a native format for you, and if you instead
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 * specify a desired format, it will transparently convert to the requested
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 * format on your behalf.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 * If `count` is not NULL, it will be filled with the number of elements in
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 * the returned array.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 * Note that it's legal for a camera to supply an empty list. This is what
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 * will happen on Emscripten builds, since that platform won't tell _anything_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 * about available cameras until you've opened one, and won't even tell if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 * there _is_ a camera until the user has given you permission to check
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 * through a scary warning popup.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 * \param instance_id the camera device instance ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 * \param count a pointer filled in with the number of elements in the list,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 * may be NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 * \returns a NULL terminated array of pointers to SDL_CameraSpec or NULL on
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 * failure; call SDL_GetError() for more information. This is a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 * single allocation that should be freed with SDL_free() when it is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 * no longer needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 * \sa SDL_GetCameras
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_CameraID instance_id, int *count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 * Get the human-readable device name for a camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 * \param instance_id the camera device instance ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 * \returns a human-readable device name or NULL on failure; call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 * SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 * \sa SDL_GetCameras
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 * Get the position of the camera in relation to the system.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 * Most platforms will report UNKNOWN, but mobile devices, like phones, can
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 * often make a distinction between cameras on the front of the device (that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 * points towards the user, for taking "selfies") and cameras on the back (for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 * filming in the direction the user is facing).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 * \param instance_id the camera device instance ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 * \returns the position of the camera on the system hardware.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 * \sa SDL_GetCameras
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraID instance_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 * Open a video recording device (a "camera").
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 * You can open the device with any reasonable spec, and if the hardware can't
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 * directly support it, it will convert data seamlessly to the requested
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 * format. This might incur overhead, including scaling of image data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 * If you would rather accept whatever format the device offers, you can pass
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 * a NULL spec here and it will choose one for you (and you can use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 * SDL_Surface's conversion/scaling functions directly if necessary).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 * You can call SDL_GetCameraFormat() to get the actual data format if passing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 * a NULL spec here. You can see the exact specs a device can support without
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 * conversion with SDL_GetCameraSupportedFormats().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 * SDL will not attempt to emulate framerate; it will try to set the hardware
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 * to the rate closest to the requested speed, but it won't attempt to limit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 * or duplicate frames artificially; call SDL_GetCameraFormat() to see the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 * actual framerate of the opened the device, and check your timestamps if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 * this is crucial to your app!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 * Note that the camera is not usable until the user approves its use! On some
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 * platforms, the operating system will prompt the user to permit access to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 * the camera, and they can choose Yes or No at that point. Until they do, the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 * camera will not be usable. The app should either wait for an
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 * or poll SDL_GetCameraPermissionState() occasionally until it returns
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 * non-zero. On platforms that don't require explicit user approval (and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 * perhaps in places where the user previously permitted access), the approval
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 * event might come immediately, but it might come seconds, minutes, or hours
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 * later!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 * \param instance_id the camera device instance ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 * \param spec the desired format for data the device will provide. Can be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 * NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 * \returns an SDL_Camera object or NULL on failure; call SDL_GetError() for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 * more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 * \sa SDL_GetCameras
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 * \sa SDL_GetCameraFormat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id, const SDL_CameraSpec *spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 * Query if camera access has been approved by the user.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 * Cameras will not function between when the device is opened by the app and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 * when the user permits access to the hardware. On some platforms, this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 * presents as a popup dialog where the user has to explicitly approve access;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 * on others the approval might be implicit and not alert the user at all.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 * This function can be used to check the status of that approval. It will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 * return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 * SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 * SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 * Instead of polling with this function, you can wait for a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 * in the standard SDL event loop, which is guaranteed to be sent once when
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 * permission to use the camera is decided.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 * If a camera is declined, there's nothing to be done but call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 * SDL_CloseCamera() to dispose of it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 * \param camera the opened camera device to query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 * \returns an SDL_CameraPermissionState value indicating if access is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 * granted, or `SDL_CAMERA_PERMISSION_STATE_PENDING` if the decision
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 * is still pending.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 * \sa SDL_CloseCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 extern SDL_DECLSPEC SDL_CameraPermissionState SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 * Get the instance ID of an opened camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 * \param camera an SDL_Camera to query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 * \returns the instance ID of the specified camera on success or 0 on
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 * failure; call SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 * Get the properties associated with an opened camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 * \param camera the SDL_Camera obtained from SDL_OpenCamera().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 * \returns a valid property ID on success or 0 on failure; call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 * SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 * Get the spec that a camera is using when generating images.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 * Note that this might not be the native format of the hardware, as SDL might
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 * be converting to this format behind the scenes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 * If the system is waiting for the user to approve access to the camera, as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 * some platforms require, this will return false, but this isn't necessarily
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 * a fatal error; you should either wait for an
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 * or poll SDL_GetCameraPermissionState() occasionally until it returns
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 * non-zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 * \param camera opened camera device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 * \param spec the SDL_CameraSpec to be initialized by this function.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 * Acquire a frame.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 * The frame is a memory pointer to the image data, whose size and format are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 * given by the spec requested when opening the device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 * This is a non blocking API. If there is a frame available, a non-NULL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 * surface is returned, and timestampNS will be filled with a non-zero value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 * Note that an error case can also return NULL, but a NULL by itself is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 * normal and just signifies that a new frame is not yet available. Note that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 * even if a camera device fails outright (a USB camera is unplugged while in
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 * use, etc), SDL will send an event separately to notify the app, but
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 * continue to provide blank frames at ongoing intervals until
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 * SDL_CloseCamera() is called, so real failure here is almost always an out
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 * of memory condition.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 * After use, the frame should be released with SDL_ReleaseCameraFrame(). If
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 * you don't do this, the system may stop providing more video!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 * Do not call SDL_DestroySurface() on the returned surface! It must be given
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 * back to the camera subsystem with SDL_ReleaseCameraFrame!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 * If the system is waiting for the user to approve access to the camera, as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 * some platforms require, this will return NULL (no frames available); you
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 * should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 * SDL_GetCameraPermissionState() occasionally until it returns non-zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 * \param camera opened camera device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 * \param timestampNS a pointer filled in with the frame's timestamp, or 0 on
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 * error. Can be NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 * \returns a new frame of video on success, NULL if none is currently
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 * available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 * \sa SDL_ReleaseCameraFrame
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *camera, Uint64 *timestampNS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 * Release a frame of video acquired from a camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 * Let the back-end re-use the internal buffer for camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 * This function _must_ be called only on surface objects returned by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 * SDL_AcquireCameraFrame(). This function should be called as quickly as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 * possible after acquisition, as SDL keeps a small FIFO queue of surfaces for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 * video frames; if surfaces aren't released in a timely manner, SDL may drop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 * upcoming video frames from the camera.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 * If the app needs to keep the surface for a significant time, they should
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 * make a copy of it and release the original.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 * The app should not use the surface again after calling this function;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 * assume the surface is freed and the pointer is invalid.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 * \param camera opened camera device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 * \param frame the video frame surface to release.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 * \sa SDL_AcquireCameraFrame
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_Surface *frame);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 * Use this function to shut down camera processing and close the camera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 * device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 * \param camera opened camera device.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 * \threadsafety It is safe to call this function from any thread, but no
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 * thread may reference `device` once this function is called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 * \sa SDL_OpenCamera
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 extern SDL_DECLSPEC void SDLCALL SDL_CloseCamera(SDL_Camera *camera);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 /* Ends C function definitions when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 #include <SDL3/SDL_close_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 #endif /* SDL_camera_h_ */