libcamera: dynamically add new configurations
device: add `buffer_type_t`
This commit is contained in:
parent
21ce78a277
commit
23491cef49
@ -7,10 +7,19 @@ typedef struct buffer_s buffer_t;
|
|||||||
typedef struct device_s device_t;
|
typedef struct device_s device_t;
|
||||||
struct pollfd;
|
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 {
|
typedef struct buffer_format_s {
|
||||||
unsigned width, height, format, bytesperline, sizeimage;
|
unsigned width, height, format, bytesperline, sizeimage;
|
||||||
unsigned nbufs;
|
unsigned nbufs;
|
||||||
unsigned interval_us;
|
unsigned interval_us;
|
||||||
|
buffer_type_t type;
|
||||||
} buffer_format_t;
|
} buffer_format_t;
|
||||||
|
|
||||||
typedef struct buffer_list_s {
|
typedef struct buffer_list_s {
|
||||||
|
@ -61,7 +61,8 @@ static int camera_configure_input_libcamera(camera_t *camera)
|
|||||||
buffer_format_t raw_fmt = {
|
buffer_format_t raw_fmt = {
|
||||||
.width = camera->options.width,
|
.width = camera->options.width,
|
||||||
.height = camera->options.height,
|
.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);
|
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,
|
.width = target_width,
|
||||||
.height = target_height,
|
.height = target_height,
|
||||||
.format = camera->options.format,
|
.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);
|
buffer_list_t *camera_capture = device_open_buffer_list(camera->camera, true, capture_fmt, true);
|
||||||
|
@ -56,12 +56,35 @@ int libcamera_buffer_list_open(buffer_list_t *buf_list)
|
|||||||
return -1;
|
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.");
|
LOG_INFO(buf_list, "Not enough configurations.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &configurations = buf_list->dev->libcamera->configuration;
|
|
||||||
auto &configuration = configurations->at(buf_list->index);
|
auto &configuration = configurations->at(buf_list->index);
|
||||||
configuration.size = libcamera::Size(buf_list->fmt.width, buf_list->fmt.height);
|
configuration.size = libcamera::Size(buf_list->fmt.width, buf_list->fmt.height);
|
||||||
if (buf_list->fmt.format) {
|
if (buf_list->fmt.format) {
|
||||||
|
@ -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());
|
LOG_ERROR(dev, "Failed to acquire `%s` camera.", dev->libcamera->camera->id().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->libcamera->configuration = dev->libcamera->camera->generateConfiguration(
|
dev->libcamera->configuration = dev->libcamera->camera->generateConfiguration();
|
||||||
{ libcamera::StreamRole::Raw, libcamera::StreamRole::StillCapture });
|
|
||||||
|
|
||||||
dev->libcamera->allocator = std::make_shared<libcamera::FrameBufferAllocator>(
|
dev->libcamera->allocator = std::make_shared<libcamera::FrameBufferAllocator>(
|
||||||
dev->libcamera->camera);
|
dev->libcamera->camera);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user