[libcamera-devel] [RFC PATCH 2/5] libcamera: MappedFrameBuffer: Use stored plane offset

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Aug 16 23:09:17 CEST 2023


Quoting Gabby George (2023-08-14 12:28:46)
> When calling mmap, the mapped frame buffer class hard-codes the offset value to 0. TODO: EDIT ME WHEN YOU HAVE MORE VERBAL REASONING SKILLS

Interesting TODO item ;-)



> 
> Signed-off-by: Gabby George <gabbymg94 at gmail.com>
> ---
>  include/libcamera/internal/mapped_framebuffer.h |  2 +-
>  src/libcamera/mapped_framebuffer.cpp            | 16 ++++++++++++----
>  2 files changed, 13 insertions(+), 5 deletions(-)
> 
> diff --git a/include/libcamera/internal/mapped_framebuffer.h b/include/libcamera/internal/mapped_framebuffer.h
> index fb39adbf..fac86344 100644
> --- a/include/libcamera/internal/mapped_framebuffer.h
> +++ b/include/libcamera/internal/mapped_framebuffer.h
> @@ -54,7 +54,7 @@ public:
>  
>         using MapFlags = Flags<MapFlag>;
>  
> -       MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags);
> +       MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags, bool usePlaneOffset = false);
>  };
>  
>  LIBCAMERA_FLAGS_ENABLE_OPERATORS(MappedFrameBuffer::MapFlag)
> diff --git a/src/libcamera/mapped_framebuffer.cpp b/src/libcamera/mapped_framebuffer.cpp
> index 6860069b..fcbb38ec 100644
> --- a/src/libcamera/mapped_framebuffer.cpp
> +++ b/src/libcamera/mapped_framebuffer.cpp
> @@ -172,12 +172,13 @@ MappedBuffer::~MappedBuffer()
>   * \brief Map all planes of a FrameBuffer
>   * \param[in] buffer FrameBuffer to be mapped
>   * \param[in] flags Protection flags to apply to map
> + * \param[in] usePlaneOffset Use offset stored in buffer's plane; default false
>   *
>   * Construct an object to map a frame buffer for CPU access. The mapping can be
>   * made as Read only, Write only or support Read and Write operations by setting
>   * the MapFlag flags accordingly.
>   */
> -MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags)
> +MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags, bool usePlaneOffset)
>  {
>         ASSERT(!buffer->planes().empty());
>         planes_.reserve(buffer->planes().size());
> @@ -223,8 +224,14 @@ MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags)
>                 const int fd = plane.fd.get();
>                 auto &info = mappedBuffers[fd];
>                 if (!info.address) {
> -                       void *address = mmap(nullptr, info.mapLength, mmapFlags,
> -                                            MAP_SHARED, fd, 0);
> +                       void *address;
> +                       if (usePlaneOffset) {

I don't think we should hide this behind a flag. We should trust the
offset in the FrameBuffer. If the offset is not to be set, or rather is
truely 0, it should be correctly initialised to 0 whenever a FrameBuffer
is constructed.

Hrm ... seeing the storedAddress calculation below worries me that what
I've written above might not be true - but I hope we can work through
and find what uses the offsets either way and make sure they're all
consistent. I still hope we don't need to hide behind a flag here.

> +                               address = mmap(nullptr, plane.length, mmapFlags,
> +                                              MAP_SHARED, fd, plane.offset);
> +                       } else {
> +                               address = mmap(nullptr, info.mapLength, mmapFlags,
> +                                              MAP_SHARED, fd, 0);
> +                       }
>                         if (address == MAP_FAILED) {
>                                 error_ = -errno;
>                                 LOG(Buffer, Error) << "Failed to mmap plane: "
> @@ -236,7 +243,8 @@ MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags)
>                         maps_.emplace_back(info.address, info.mapLength);
>                 }
>  
> -               planes_.emplace_back(info.address + plane.offset, plane.length);
> +               uint8_t *storedAddress = usePlaneOffset ? info.address : info.address + plane.offset;

Hrm ... what's going on here though.

I suspect if we are always mapping with the plane.offset, then here we
should no longer 'add' the offset at all...

Did this trigger anything in the unit tests ?

Have you run the unit tests yet? - if not - please run ...

 sudo modprobe vimc
 sudo modprobe vivid
 sudo modprobe vim2m

and then from your build directory:
 ninja -C build test

Though now I check, you might need to make sure your libcamera
configuration has testing enabled: 

perhaps (if you need it)
 meson --reconfigure build -Dtest=true


> +               planes_.emplace_back(storedAddress, plane.length);
>         }
>  }
>  
> -- 
> 2.34.1
>


More information about the libcamera-devel mailing list