[libcamera-devel] [PATCH] libcamera: framebuffer: Return plane begin address by MappedBuffer::maps()

Hirokazu Honda hiroh at chromium.org
Fri Aug 6 07:54:21 CEST 2021


While I remove a manual address computation in Thumbnail
https://git.linuxtv.org/libcamera.git/tree/src/android/jpeg/thumbnailer.cpp#n64,
I noticed there might be a misunderstanding of
FrameBuffer::Plane::length meaning.
Not only to clarify the meaning but also discuss a better approach, I
filed https://bugs.libcamera.org/show_bug.cgi?id=72.

Regards,
-Hiro

On Fri, Aug 6, 2021 at 2:50 AM Hirokazu Honda <hiroh at chromium.org> wrote:
>
> MappedBuffer::maps() returns std::vector<MappedBuffer::Plane>.
> Plane has the address, but the address points the beginning of the
> buffer containing the plane.
> This makes the Plane point the beginning of the plane. So
> MappedBuffer::maps()[i].data() returns the address of i-th plane.
>
> Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> ---
>  include/libcamera/internal/framebuffer.h |  1 +
>  src/libcamera/framebuffer.cpp            | 41 +++++++++++++++++-------
>  2 files changed, 31 insertions(+), 11 deletions(-)
>
> diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h
> index 8c187adf..2eb3b7c9 100644
> --- a/include/libcamera/internal/framebuffer.h
> +++ b/include/libcamera/internal/framebuffer.h
> @@ -36,6 +36,7 @@ protected:
>
>         int error_;
>         std::vector<Plane> maps_;
> +       std::vector<Plane> chunks_;
>
>  private:
>         LIBCAMERA_DISABLE_COPY(MappedBuffer)
> diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
> index a59e93fb..8231c1df 100644
> --- a/src/libcamera/framebuffer.cpp
> +++ b/src/libcamera/framebuffer.cpp
> @@ -310,6 +310,7 @@ MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other)
>  {
>         error_ = other.error_;
>         maps_ = std::move(other.maps_);
> +       chunks_ = std::move(other.chunks_);
>         other.error_ = -ENOENT;
>
>         return *this;
> @@ -317,8 +318,8 @@ MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other)
>
>  MappedBuffer::~MappedBuffer()
>  {
> -       for (Plane &map : maps_)
> -               munmap(map.data(), map.size());
> +       for (Plane &chunk : chunks_)
> +               munmap(chunk.data(), chunk.size());
>  }
>
>  /**
> @@ -381,18 +382,36 @@ MappedBuffer::~MappedBuffer()
>   */
>  MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags)
>  {
> +       if (buffer->planes().empty())
> +               return;
>         maps_.reserve(buffer->planes().size());
>
> +       /*
> +        * Below assumes planes are in the same buffer and planes are
> +        * consecutive.
> +        * \todo remove this assumption.
> +        */
> +       const int fd = buffer->planes()[0].fd.fd();
> +       const off_t length = lseek(fd, 0, SEEK_END);
> +       if (length < 0) {
> +               error_ = -errno;
> +               LOG(Buffer, Error) << "Failed to lseek buffer";
> +               return;
> +       }
> +
> +       void *address = mmap(nullptr, length, flags, MAP_SHARED, fd, 0);
> +       if (address == MAP_FAILED) {
> +               error_ = -errno;
> +               LOG(Buffer, Error) << "Failed to mmap plane";
> +               return;
> +       }
> +       chunks_ = { MappedBuffer::Plane(static_cast<uint8_t *>(address),
> +                                       static_cast<size_t>(length)) };
> +       size_t offset = 0;
>         for (const FrameBuffer::Plane &plane : buffer->planes()) {
> -               void *address = mmap(nullptr, plane.length, flags,
> -                                    MAP_SHARED, plane.fd.fd(), 0);
> -               if (address == MAP_FAILED) {
> -                       error_ = -errno;
> -                       LOG(Buffer, Error) << "Failed to mmap plane";
> -                       break;
> -               }
> -
> -               maps_.emplace_back(static_cast<uint8_t *>(address), plane.length);
> +               maps_.emplace_back(static_cast<uint8_t *>(address) + offset,
> +                                  plane.length);
> +               offset += plane.length;
>         }
>  }
>
> --
> 2.32.0.554.ge1b32706d8-goog
>


More information about the libcamera-devel mailing list