[PATCH v7 1/7] libcamera: add DmaBufAllocation::exportFrameBuffers()
Cheng-Hao Yang
chenghaoyang at chromium.org
Mon Aug 5 16:00:25 CEST 2024
Hi Laurent,
Thanks for the review. Updated in v8.
On Sat, Aug 3, 2024 at 10:21 PM Laurent Pinchart <
laurent.pinchart at ideasonboard.com> wrote:
> Hi Chenghao,
>
> Thank you for the patch.
>
> On Thu, Aug 01, 2024 at 07:30:57AM +0000, Harvey Yang wrote:
> > Add a helper function exportFrameBuffers in DmaBufAllocator to make it
> > easier to use.
> >
> > It'll be used in Virtual Pipeline Handler specifically.
> >
> > Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
> > ---
> > .../libcamera/internal/dma_buf_allocator.h | 10 +++
> > src/libcamera/dma_buf_allocator.cpp | 68 ++++++++++++++++++-
> > 2 files changed, 76 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/libcamera/internal/dma_buf_allocator.h
> b/include/libcamera/internal/dma_buf_allocator.h
> > index 36ec1696..dd2cc237 100644
> > --- a/include/libcamera/internal/dma_buf_allocator.h
> > +++ b/include/libcamera/internal/dma_buf_allocator.h
> > @@ -8,12 +8,16 @@
> > #pragma once
> >
> > #include <stddef.h>
> > +#include <vector>
> >
> > #include <libcamera/base/flags.h>
> > #include <libcamera/base/unique_fd.h>
> >
> > namespace libcamera {
> >
> > +class FrameBuffer;
> > +struct StreamConfiguration;
> > +
> > class DmaBufAllocator
> > {
> > public:
> > @@ -30,7 +34,13 @@ public:
> > bool isValid() const { return providerHandle_.isValid(); }
> > UniqueFD alloc(const char *name, std::size_t size);
> >
> > + int exportFrameBuffers(
> > + const StreamConfiguration &config,
> > + std::vector<std::unique_ptr<FrameBuffer>> *buffers);
>
> I wonder if the DmaBufAllocator class is really the best place to
> implement this. It would help reviewing how generic the implementation
> is if we had two users as part of this series. Maybe converting the soft
> ISP to the new function could be such a second user.
>
>
Right, it's a good idea that we add the helper functions in a way that works
for soft ISP as well.
> The part that bothers me the most is, I think, usage of
> StreamConfiguration in this function. Maybe the createBuffer() function
> could be kept, and be passed a pixel format and a size, whie the
> exportFrameBuffers() could be moved to the pipeline handler.
>
>
Hmm, as |SoftwareIsp::exportFrames| only uses `debayer_->frameSize()`,
I updated the DmaBufAllocator's helper function with `count` and a list of
`frameSize`s. Please check if it's better.
> > +
> > private:
> > + std::unique_ptr<FrameBuffer> createBuffer(const
> StreamConfiguration &config);
> > +
> > UniqueFD allocFromHeap(const char *name, std::size_t size);
> > UniqueFD allocFromUDmaBuf(const char *name, std::size_t size);
> > UniqueFD providerHandle_;
> > diff --git a/src/libcamera/dma_buf_allocator.cpp
> b/src/libcamera/dma_buf_allocator.cpp
> > index c06eca7d..6b406880 100644
> > --- a/src/libcamera/dma_buf_allocator.cpp
> > +++ b/src/libcamera/dma_buf_allocator.cpp
> > @@ -23,6 +23,11 @@
> >
> > #include <libcamera/base/log.h>
> >
> > +#include <libcamera/framebuffer.h>
> > +#include <libcamera/stream.h>
> > +
> > +#include "libcamera/internal/formats.h"
> > +
> > /**
> > * \file dma_buf_allocator.cpp
> > * \brief dma-buf allocator
> > @@ -130,8 +135,8 @@ DmaBufAllocator::~DmaBufAllocator() = default;
> > /* uClibc doesn't provide the file sealing API. */
> > #ifndef __DOXYGEN__
> > #if not HAVE_FILE_SEALS
> > -#define F_ADD_SEALS 1033
> > -#define F_SEAL_SHRINK 0x0002
> > +#define F_ADD_SEALS 1033
> > +#define F_SEAL_SHRINK 0x0002
>
> Unrelated change.
>
>
Sorry, my linter auto-corrected it. Removed.
> > #endif
> > #endif
> >
> > @@ -243,4 +248,63 @@ UniqueFD DmaBufAllocator::alloc(const char *name,
> std::size_t size)
> > return allocFromHeap(name, size);
> > }
> >
> > +/**
> > + * \brief Allocate and export buffers for \a stream from the
> DmaBufAllocator
> > + * \param[in] config The config of the stream to allocate buffers for
> > + * \param[out] buffers Array of buffers successfully allocated
> > + *
> > + * Allocates buffers for a stream from the DmaBufAllocator. It's a
> helper
> > + * function that'll be used in PipelineHandler::exportFrameBuffers().
> > + *
> > + * \return The number of allocated buffers on success or a negative
> error code
> > + * otherwise
> > + */
> > +int DmaBufAllocator::exportFrameBuffers(
> > + const StreamConfiguration &config,
> > + std::vector<std::unique_ptr<FrameBuffer>> *buffers)
> > +{
> > + unsigned int count = config.bufferCount;
> > +
> > + for (unsigned i = 0; i < count; ++i) {
> > + std::unique_ptr<FrameBuffer> buffer = createBuffer(config);
> > + 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(
> > + const StreamConfiguration &config)
> > +{
> > + std::vector<FrameBuffer::Plane> planes;
> > +
> > + auto info = PixelFormatInfo::info(config.pixelFormat);
> > + for (size_t i = 0; i < info.planes.size(); ++i) {
> > + unsigned int planeSize = info.planeSize(config.size, i);
> > + if (planeSize == 0)
> > + continue;
> > +
> > + UniqueFD fd = alloc("FrameBuffer", planeSize);
> > + if (!fd.isValid())
> > + return nullptr;
> > +
> > + SharedFD sharedFd(std::move(fd));
> > +
> > + FrameBuffer::Plane plane;
> > + plane.fd = sharedFd;
>
> plane.fd = SharedFD(std::move(fd));
>
> and drop the sharedFd variable.
>
>
Done.
> > + plane.offset = 0;
> > + plane.length = planeSize;
> > + planes.push_back(std::move(plane));
> > + }
> > +
> > + return std::make_unique<FrameBuffer>(planes);
> > +}
> > +
> > } /* namespace libcamera */
>
> --
> Regards,
>
> Laurent Pinchart
>
Thanks!
Harvey
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20240805/d0e22b55/attachment.htm>
More information about the libcamera-devel
mailing list