diff --git a/device/buffer_list.h b/device/buffer_list.h index 6bdabb6..4133f1a 100644 --- a/device/buffer_list.h +++ b/device/buffer_list.h @@ -7,10 +7,19 @@ typedef struct buffer_s buffer_t; typedef struct device_s device_t; struct pollfd; +typedef enum { + BUFFER_TYPE_DEFAULT = 0, + + BUFFER_TYPE_RAW = 1, + BUFFER_TYPE_IMAGE = 2, + BUFFER_TYPE_VIDEO = 3 +} buffer_type_t; + typedef struct buffer_format_s { unsigned width, height, format, bytesperline, sizeimage; unsigned nbufs; unsigned interval_us; + buffer_type_t type; } buffer_format_t; typedef struct buffer_list_s { diff --git a/device/camera/camera_input.c b/device/camera/camera_input.c index bbdc8ff..7cd808e 100644 --- a/device/camera/camera_input.c +++ b/device/camera/camera_input.c @@ -61,7 +61,8 @@ static int camera_configure_input_libcamera(camera_t *camera) buffer_format_t raw_fmt = { .width = camera->options.width, .height = camera->options.height, - .nbufs = camera->options.nbufs + .nbufs = camera->options.nbufs, + .type = BUFFER_TYPE_RAW }; buffer_list_t *raw_capture = device_open_buffer_list(camera->camera, true, raw_fmt, true); @@ -86,7 +87,8 @@ static int camera_configure_input_libcamera(camera_t *camera) .width = target_width, .height = target_height, .format = camera->options.format, - .nbufs = camera->options.nbufs + .nbufs = camera->options.nbufs, + .type = BUFFER_TYPE_IMAGE }; buffer_list_t *camera_capture = device_open_buffer_list(camera->camera, true, capture_fmt, true); diff --git a/device/libcamera/buffer_list.cc b/device/libcamera/buffer_list.cc index e7ec70f..ec0b729 100644 --- a/device/libcamera/buffer_list.cc +++ b/device/libcamera/buffer_list.cc @@ -56,12 +56,35 @@ int libcamera_buffer_list_open(buffer_list_t *buf_list) return -1; } - if (buf_list->index >= (int)buf_list->dev->libcamera->configuration->size()) { + auto &configurations = buf_list->dev->libcamera->configuration; + + // add new configuration based on a buffer + { + libcamera::StreamRole role = libcamera::StreamRole::StillCapture; + + switch(buf_list->fmt.type) { + case BUFFER_TYPE_RAW: + role = libcamera::StreamRole::Raw; + break; + + case BUFFER_TYPE_VIDEO: + role = libcamera::StreamRole::VideoRecording; + break; + + default: + role = libcamera::StreamRole::StillCapture; + break; + } + + auto newConfigurations = buf_list->dev->libcamera->camera->generateConfiguration({ role }); + configurations->addConfiguration(newConfigurations->at(0)); + } + + if (buf_list->index >= (int)configurations->size()) { LOG_INFO(buf_list, "Not enough configurations."); return -1; } - auto &configurations = buf_list->dev->libcamera->configuration; auto &configuration = configurations->at(buf_list->index); configuration.size = libcamera::Size(buf_list->fmt.width, buf_list->fmt.height); if (buf_list->fmt.format) { diff --git a/device/libcamera/device.cc b/device/libcamera/device.cc index dbaf061..6c405eb 100644 --- a/device/libcamera/device.cc +++ b/device/libcamera/device.cc @@ -101,8 +101,7 @@ int libcamera_device_open(device_t *dev) LOG_ERROR(dev, "Failed to acquire `%s` camera.", dev->libcamera->camera->id().c_str()); } - dev->libcamera->configuration = dev->libcamera->camera->generateConfiguration( - { libcamera::StreamRole::Raw, libcamera::StreamRole::StillCapture }); + dev->libcamera->configuration = dev->libcamera->camera->generateConfiguration(); dev->libcamera->allocator = std::make_shared( dev->libcamera->camera);