mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
libcamera: add DmaBufAllocator::exportBuffers()
Add a helper function exportBuffers in DmaBufAllocator to make it easier to use. It'll be used in Virtual Pipeline Handler and SoftwareIsp. Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
83c5ad0fac
commit
168488275a
2 changed files with 70 additions and 0 deletions
|
@ -7,11 +7,17 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <libcamera/base/flags.h>
|
||||
#include <libcamera/base/unique_fd.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
class FrameBuffer;
|
||||
|
||||
class DmaBufAllocator
|
||||
{
|
||||
public:
|
||||
|
@ -28,7 +34,14 @@ public:
|
|||
bool isValid() const { return providerHandle_.isValid(); }
|
||||
UniqueFD alloc(const char *name, std::size_t size);
|
||||
|
||||
int exportBuffers(unsigned int count,
|
||||
const std::vector<unsigned int> &planeSizes,
|
||||
std::vector<std::unique_ptr<FrameBuffer>> *buffers);
|
||||
|
||||
private:
|
||||
std::unique_ptr<FrameBuffer> createBuffer(
|
||||
std::string name, const std::vector<unsigned int> &planeSizes);
|
||||
|
||||
UniqueFD allocFromHeap(const char *name, std::size_t size);
|
||||
UniqueFD allocFromUDmaBuf(const char *name, std::size_t size);
|
||||
UniqueFD providerHandle_;
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
|
||||
#include <libcamera/base/log.h>
|
||||
#include <libcamera/base/memfd.h>
|
||||
#include <libcamera/base/shared_fd.h>
|
||||
|
||||
#include <libcamera/framebuffer.h>
|
||||
|
||||
/**
|
||||
* \file dma_buf_allocator.cpp
|
||||
|
@ -205,4 +208,58 @@ UniqueFD DmaBufAllocator::alloc(const char *name, std::size_t size)
|
|||
return allocFromHeap(name, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Allocate and export buffers from the DmaBufAllocator
|
||||
* \param[in] count The number of requested FrameBuffers
|
||||
* \param[in] planeSizes The sizes of planes in each FrameBuffer
|
||||
* \param[out] buffers Array of buffers successfully allocated
|
||||
*
|
||||
* Planes in a FrameBuffer are allocated with a single dma buf.
|
||||
* \todo Add the option to allocate each plane with a dma buf respectively.
|
||||
*
|
||||
* \return The number of allocated buffers on success or a negative error code
|
||||
* otherwise
|
||||
*/
|
||||
int DmaBufAllocator::exportBuffers(unsigned int count,
|
||||
const std::vector<unsigned int> &planeSizes,
|
||||
std::vector<std::unique_ptr<FrameBuffer>> *buffers)
|
||||
{
|
||||
for (unsigned int i = 0; i < count; ++i) {
|
||||
std::unique_ptr<FrameBuffer> buffer =
|
||||
createBuffer("frame-" + std::to_string(i), planeSizes);
|
||||
if (!buffer) {
|
||||
LOG(DmaBufAllocator, Error) << "Unable to create buffer";
|
||||
|
||||
buffers->clear();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buffers->push_back(std::move(buffer));
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
std::unique_ptr<FrameBuffer>
|
||||
DmaBufAllocator::createBuffer(std::string name,
|
||||
const std::vector<unsigned int> &planeSizes)
|
||||
{
|
||||
std::vector<FrameBuffer::Plane> planes;
|
||||
|
||||
unsigned int frameSize = 0, offset = 0;
|
||||
for (auto planeSize : planeSizes)
|
||||
frameSize += planeSize;
|
||||
|
||||
SharedFD fd(alloc(name.c_str(), frameSize));
|
||||
if (!fd.isValid())
|
||||
return nullptr;
|
||||
|
||||
for (auto planeSize : planeSizes) {
|
||||
planes.emplace_back(FrameBuffer::Plane{ fd, offset, planeSize });
|
||||
offset += planeSize;
|
||||
}
|
||||
|
||||
return std::make_unique<FrameBuffer>(planes);
|
||||
}
|
||||
|
||||
} /* namespace libcamera */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue