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
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <libcamera/base/flags.h>
|
#include <libcamera/base/flags.h>
|
||||||
#include <libcamera/base/unique_fd.h>
|
#include <libcamera/base/unique_fd.h>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
|
class FrameBuffer;
|
||||||
|
|
||||||
class DmaBufAllocator
|
class DmaBufAllocator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -28,7 +34,14 @@ public:
|
||||||
bool isValid() const { return providerHandle_.isValid(); }
|
bool isValid() const { return providerHandle_.isValid(); }
|
||||||
UniqueFD alloc(const char *name, std::size_t size);
|
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:
|
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 allocFromHeap(const char *name, std::size_t size);
|
||||||
UniqueFD allocFromUDmaBuf(const char *name, std::size_t size);
|
UniqueFD allocFromUDmaBuf(const char *name, std::size_t size);
|
||||||
UniqueFD providerHandle_;
|
UniqueFD providerHandle_;
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
|
|
||||||
#include <libcamera/base/log.h>
|
#include <libcamera/base/log.h>
|
||||||
#include <libcamera/base/memfd.h>
|
#include <libcamera/base/memfd.h>
|
||||||
|
#include <libcamera/base/shared_fd.h>
|
||||||
|
|
||||||
|
#include <libcamera/framebuffer.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \file dma_buf_allocator.cpp
|
* \file dma_buf_allocator.cpp
|
||||||
|
@ -205,4 +208,58 @@ UniqueFD DmaBufAllocator::alloc(const char *name, std::size_t size)
|
||||||
return allocFromHeap(name, 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 */
|
} /* namespace libcamera */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue