summaryrefslogtreecommitdiff
path: root/camera.c
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2025-02-24 10:44:56 -0500
committerpommicket <pommicket@gmail.com>2025-02-25 15:16:08 -0500
commit1a67ba51c7a169348e9e0be5db288d8046202a17 (patch)
tree17c64ad3cdd5a22087427440fce4713c019ab63d /camera.c
parent4c18097a745ea4dceb050215cab6494c326554da (diff)
split out settings structure
Diffstat (limited to 'camera.c')
-rw-r--r--camera.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/camera.c b/camera.c
index 8b26ef0..63e1d2d 100644
--- a/camera.c
+++ b/camera.c
@@ -239,7 +239,7 @@ uint32_t *camera_get_pixfmts(Camera *camera) {
return available;
}
PictureFormat camera_closest_resolution(Camera *camera, uint32_t pixfmt, int32_t desired_width, int32_t desired_height) {
- PictureFormat best_format = {.pixfmt = pixfmt};
+ PictureFormat best_format = camera->best_format; // default if there's nothing with the desired pixfmt
int32_t best_score = INT32_MIN;
arr_foreach_ptr(camera->formats, const PictureFormat, fmt) {
if (fmt->pixfmt != pixfmt) {
@@ -780,7 +780,7 @@ bool camera_set_format(Camera *camera, PictureFormat picfmt, CameraAccessMethod
}
}
-bool camera_open(Camera *camera) {
+bool camera_open(Camera *camera, PictureFormat desired_format) {
if (!camera->access_method)
camera->access_method = CAMERA_ACCESS_MMAP;
// camera should not already be open
@@ -796,7 +796,14 @@ bool camera_open(Camera *camera) {
perror("v4l2_ioctl");
return false;
}
- camera_set_format(camera, camera->best_format, camera->access_method, true);
+ int32_t desired_width = desired_format.width;
+ int32_t desired_height = desired_format.height;
+ uint32_t desired_pixfmt = desired_format.pixfmt;
+ if (!desired_width) desired_width = camera->best_format.width;
+ if (!desired_height) desired_height = camera->best_format.height;
+ if (!desired_pixfmt) desired_pixfmt = camera->best_format.pixfmt;
+ desired_format = camera_closest_resolution(camera, desired_pixfmt, desired_width, desired_height);
+ camera_set_format(camera, desired_format, camera->access_method, true);
return true;
}