From 4e641dea1eb29978f1fa78a3c235250d52d1d31f Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 12 Jul 2022 21:59:02 +0200 Subject: [PATCH] Open default camera of a given type --- cmd/camera-streamer.c | 6 +++--- device/camera/camera_input.c | 8 +++++++- device/libcamera/device.cc | 39 +++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/cmd/camera-streamer.c b/cmd/camera-streamer.c index c405f13..dd82157 100644 --- a/cmd/camera-streamer.c +++ b/cmd/camera-streamer.c @@ -90,7 +90,7 @@ http_method_t http_methods[] = { }; camera_options_t camera_options = { - .path = "/dev/video0", + .path = "", .width = 1920, .height = 1080, .format = 0, @@ -154,12 +154,12 @@ option_value_t camera_type[] = { }; option_t all_options[] = { - DEFINE_OPTION_PTR(camera, path, string, "Chooses the camera to use."), + DEFINE_OPTION_PTR(camera, path, string, "Chooses the camera to use. If empty connect to default."), + DEFINE_OPTION_VALUES(camera, type, camera_type, "Select camera type."), DEFINE_OPTION(camera, width, uint, "Set the camera capture width."), DEFINE_OPTION(camera, height, uint, "Set the camera capture height."), DEFINE_OPTION_VALUES(camera, format, camera_formats, "Set the camera capture format."), DEFINE_OPTION(camera, nbufs, uint, "Set number of capture buffers. Preferred 2 or 3."), - DEFINE_OPTION_VALUES(camera, type, camera_type, "Select camera capture."), DEFINE_OPTION(camera, fps, uint, "Set the desired capture framerate."), DEFINE_OPTION_DEFAULT(camera, allow_dma, bool, "1", "Prefer to use DMA access to reduce memory copy."), DEFINE_OPTION(camera, high_res_factor, float, "Set the desired high resolution output scale factor."), diff --git a/device/camera/camera_input.c b/device/camera/camera_input.c index c4e44a3..c283048 100644 --- a/device/camera/camera_input.c +++ b/device/camera/camera_input.c @@ -9,7 +9,13 @@ static int camera_configure_input_v4l2(camera_t *camera) { - camera->camera = device_v4l2_open(camera->name, camera->options.path); + const char *path = camera->options.path; + + if (!*path) { + path = "/dev/video0"; + } + + camera->camera = device_v4l2_open(camera->name, path); if (!camera->camera) { LOG_INFO(camera, "Listing available v4l2 devices:"); system("v4l2-ctl --list-devices"); diff --git a/device/libcamera/device.cc b/device/libcamera/device.cc index 6686d86..68c279a 100644 --- a/device/libcamera/device.cc +++ b/device/libcamera/device.cc @@ -58,6 +58,19 @@ void libcamera_device_dump_options(device_t *dev, FILE *stream) fprintf(stream, "\n"); } +void libcamera_print_cameras(device_t *dev) +{ + if (dev->libcamera->camera_manager->cameras().size()) { + LOG_INFO(dev, "Available cameras (%zu)", dev->libcamera->camera_manager->cameras().size()); + + for (auto const &camera : dev->libcamera->camera_manager->cameras()) { + LOG_INFO(dev, "- %s", camera->id().c_str()); + } + } else { + LOG_INFO(dev, "No available cameras"); + } +} + int libcamera_device_open(device_t *dev) { dev->libcamera = new device_libcamera_t{}; @@ -68,25 +81,27 @@ int libcamera_device_open(device_t *dev) LOG_ERROR(dev, "Cannot start camera_manager."); } - dev->libcamera->camera = dev->libcamera->camera_manager->get(dev->path); - if (!dev->libcamera->camera) { - if (dev->libcamera->camera_manager->cameras().size()) { - LOG_INFO(dev, "Available cameras (%zu)", dev->libcamera->camera_manager->cameras().size()); - - for (auto const &camera : dev->libcamera->camera_manager->cameras()) { - LOG_INFO(dev, "- %s", camera->id().c_str()); - } - } else { - LOG_INFO(dev, "No available cameras"); + if (strlen(dev->path) == 0) { + if (dev->libcamera->camera_manager->cameras().size() != 1) { + libcamera_print_cameras(dev); + LOG_ERROR(dev, "Too many cameras was found. Cannot select default."); } + + dev->libcamera->camera = dev->libcamera->camera_manager->cameras().front(); + } else { + dev->libcamera->camera = dev->libcamera->camera_manager->get(dev->path); + } + + if (!dev->libcamera->camera) { + libcamera_print_cameras(dev); LOG_ERROR(dev, "Camera `%s` was not found.", dev->path); } if (dev->libcamera->camera->acquire()) { - LOG_ERROR(dev, "Failed to acquire `%s` camera.", dev->path); + LOG_ERROR(dev, "Failed to acquire `%s` camera.", dev->libcamera->camera->id().c_str()); } - LOG_INFO(dev, "Device path=%s opened", dev->path); + LOG_INFO(dev, "Device path=%s opened", dev->libcamera->camera->id().c_str()); return 0; error: