libcamera: improve configuration management
This commit is contained in:
parent
10545b6b7a
commit
e2e5762b2b
@ -8,13 +8,15 @@ int libcamera_buffer_open(buffer_t *buf)
|
|||||||
buf->libcamera = new buffer_libcamera_t{};
|
buf->libcamera = new buffer_libcamera_t{};
|
||||||
buf->libcamera->request = buf->buf_list->dev->libcamera->camera->createRequest(buf->index);
|
buf->libcamera->request = buf->buf_list->dev->libcamera->camera->createRequest(buf->index);
|
||||||
if (!buf->libcamera->request) {
|
if (!buf->libcamera->request) {
|
||||||
LOG_ERROR(buf, "Can't create request");
|
LOG_INFO(buf, "Can't create request");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (libcamera::StreamConfiguration &stream_cfg : *buf->buf_list->libcamera->configuration) {
|
auto &configurations = buf->buf_list->dev->libcamera->configuration;
|
||||||
auto stream = stream_cfg.stream();
|
auto &configuration = configurations->at(buf->buf_list->index);
|
||||||
|
auto stream = configuration.stream();
|
||||||
const std::vector<std::unique_ptr<libcamera::FrameBuffer>> &buffers =
|
const std::vector<std::unique_ptr<libcamera::FrameBuffer>> &buffers =
|
||||||
buf->buf_list->libcamera->allocator->buffers(stream);
|
buf->buf_list->dev->libcamera->allocator->buffers(stream);
|
||||||
auto const &buffer = buffers[buf->index];
|
auto const &buffer = buffers[buf->index];
|
||||||
|
|
||||||
if (buf->libcamera->request->addBuffer(stream, buffer.get()) < 0) {
|
if (buf->libcamera->request->addBuffer(stream, buffer.get()) < 0) {
|
||||||
@ -28,6 +30,7 @@ int libcamera_buffer_open(buffer_t *buf)
|
|||||||
LOG_ERROR(buf, "No planes allocated");
|
LOG_ERROR(buf, "No planes allocated");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
uint64_t offset = buffer->planes()[0].offset;
|
uint64_t offset = buffer->planes()[0].offset;
|
||||||
uint64_t length = 0;
|
uint64_t length = 0;
|
||||||
libcamera::SharedFD dma_fd = buffer->planes()[0].fd;
|
libcamera::SharedFD dma_fd = buffer->planes()[0].fd;
|
||||||
|
@ -61,10 +61,13 @@ int libcamera_buffer_list_open(buffer_list_t *buf_list)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_list->libcamera->configuration = buf_list->dev->libcamera->camera->generateConfiguration(
|
if (buf_list->index >= (int)buf_list->dev->libcamera->configuration->size()) {
|
||||||
{ libcamera::StreamRole::Viewfinder });
|
LOG_INFO(buf_list, "Not enough configurations.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
auto &configuration = buf_list->libcamera->configuration->at(0);
|
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);
|
configuration.size = libcamera::Size(buf_list->fmt.width, buf_list->fmt.height);
|
||||||
configuration.pixelFormat = libcamera_from_fourcc(buf_list->fmt.format);
|
configuration.pixelFormat = libcamera_from_fourcc(buf_list->fmt.format);
|
||||||
if (buf_list->fmt.bytesperline > 0) {
|
if (buf_list->fmt.bytesperline > 0) {
|
||||||
@ -73,20 +76,20 @@ int libcamera_buffer_list_open(buffer_list_t *buf_list)
|
|||||||
if (buf_list->fmt.nbufs > 0) {
|
if (buf_list->fmt.nbufs > 0) {
|
||||||
configuration.bufferCount = buf_list->fmt.nbufs;
|
configuration.bufferCount = buf_list->fmt.nbufs;
|
||||||
}
|
}
|
||||||
if (buf_list->libcamera->configuration->validate() == libcamera::CameraConfiguration::Invalid) {
|
if (configurations->validate() == libcamera::CameraConfiguration::Invalid) {
|
||||||
LOG_ERROR(buf_list, "Camera configuration invalid");
|
LOG_ERROR(buf_list, "Camera configuration invalid");
|
||||||
}
|
}
|
||||||
if (buf_list->dev->libcamera->vflip) {
|
if (buf_list->dev->libcamera->vflip) {
|
||||||
buf_list->libcamera->configuration->transform |= libcamera::Transform::VFlip;
|
configurations->transform |= libcamera::Transform::VFlip;
|
||||||
}
|
}
|
||||||
if (buf_list->dev->libcamera->hflip) {
|
if (buf_list->dev->libcamera->hflip) {
|
||||||
buf_list->libcamera->configuration->transform |= libcamera::Transform::HFlip;
|
configurations->transform |= libcamera::Transform::HFlip;
|
||||||
}
|
}
|
||||||
if (!!(buf_list->libcamera->configuration->transform & libcamera::Transform::Transpose)) {
|
if (!!(configurations->transform & libcamera::Transform::Transpose)) {
|
||||||
LOG_ERROR(buf_list, "Transformation requiring transpose not supported");
|
LOG_ERROR(buf_list, "Transformation requiring transpose not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf_list->dev->libcamera->camera->configure(buf_list->libcamera->configuration.get()) < 0) {
|
if (buf_list->dev->libcamera->camera->configure(configurations.get()) < 0) {
|
||||||
LOG_ERROR(buf_list, "Failed to configure camera");
|
LOG_ERROR(buf_list, "Failed to configure camera");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,16 +99,13 @@ int libcamera_buffer_list_open(buffer_list_t *buf_list)
|
|||||||
buf_list->fmt.bytesperline = configuration.stride;
|
buf_list->fmt.bytesperline = configuration.stride;
|
||||||
buf_list->fmt.nbufs = configuration.bufferCount;
|
buf_list->fmt.nbufs = configuration.bufferCount;
|
||||||
|
|
||||||
buf_list->libcamera->allocator = std::make_shared<libcamera::FrameBufferAllocator>(
|
if (buf_list->dev->libcamera->allocator->allocate(configuration.stream()) < 0) {
|
||||||
buf_list->dev->libcamera->camera);
|
|
||||||
|
|
||||||
for (libcamera::StreamConfiguration &stream_config : *buf_list->libcamera->configuration) {
|
|
||||||
if (buf_list->libcamera->allocator->allocate(stream_config.stream()) < 0) {
|
|
||||||
LOG_ERROR(buf_list, "Can't allocate buffers");
|
LOG_ERROR(buf_list, "Can't allocate buffers");
|
||||||
}
|
}
|
||||||
|
|
||||||
int allocated = buf_list->libcamera->allocator->buffers(
|
{
|
||||||
stream_config.stream()).size();
|
int allocated = buf_list->dev->libcamera->allocator->buffers(
|
||||||
|
configuration.stream()).size();
|
||||||
buf_list->fmt.nbufs = std::min<unsigned>(buf_list->fmt.nbufs, allocated);
|
buf_list->fmt.nbufs = std::min<unsigned>(buf_list->fmt.nbufs, allocated);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +101,12 @@ 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(
|
||||||
|
{ libcamera::StreamRole::Viewfinder });
|
||||||
|
|
||||||
|
dev->libcamera->allocator = std::make_shared<libcamera::FrameBufferAllocator>(
|
||||||
|
dev->libcamera->camera);
|
||||||
|
|
||||||
LOG_INFO(dev, "Device path=%s opened", dev->libcamera->camera->id().c_str());
|
LOG_INFO(dev, "Device path=%s opened", dev->libcamera->camera->id().c_str());
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -39,13 +39,13 @@ struct pollfd;
|
|||||||
typedef struct device_libcamera_s {
|
typedef struct device_libcamera_s {
|
||||||
std::shared_ptr<libcamera::CameraManager> camera_manager;
|
std::shared_ptr<libcamera::CameraManager> camera_manager;
|
||||||
std::shared_ptr<libcamera::Camera> camera;
|
std::shared_ptr<libcamera::Camera> camera;
|
||||||
|
std::shared_ptr<libcamera::CameraConfiguration> configuration;
|
||||||
|
std::shared_ptr<libcamera::FrameBufferAllocator> allocator;
|
||||||
libcamera::ControlList controls;
|
libcamera::ControlList controls;
|
||||||
bool vflip, hflip;
|
bool vflip, hflip;
|
||||||
} device_libcamera_t;
|
} device_libcamera_t;
|
||||||
|
|
||||||
typedef struct buffer_list_libcamera_s {
|
typedef struct buffer_list_libcamera_s {
|
||||||
std::shared_ptr<libcamera::CameraConfiguration> configuration;
|
|
||||||
std::shared_ptr<libcamera::FrameBufferAllocator> allocator;
|
|
||||||
buffer_list_t *buf_list;
|
buffer_list_t *buf_list;
|
||||||
int fds[2];
|
int fds[2];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user