Message ID | 20210616151152.3856595-7-kieran.bingham@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Kieran, I cannot compile this series with this patch, due to missing src/libcamera-helpers/meson.build src/meson.build:34:0: ERROR: Non-existent build file 'src/libcamera-helpers/meson.build' On 6/16/21 8:41 PM, Kieran Bingham wrote: > Provide a library which build support on top of the libcamera API. > > This currently implements the MappedBuffer and MappedFrameBuffer classes > which help with lifetime management of mmapping libcamera buffers. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > Documentation/Doxyfile.in | 2 + > .../buffer.h => helpers/mapped_buffer.h} | 10 +- > include/libcamera/helpers/meson.build | 10 + > include/libcamera/internal/meson.build | 1 - > include/libcamera/meson.build | 1 + > src/android/camera_device.h | 2 +- > src/android/camera_stream.h | 2 +- > src/android/jpeg/encoder_libjpeg.h | 3 +- > src/android/jpeg/post_processor_jpeg.h | 2 +- > src/android/jpeg/thumbnailer.h | 3 +- > src/android/meson.build | 1 + > src/android/mm/generic_camera_buffer.cpp | 2 +- > src/android/post_processor.h | 2 +- > src/ipa/ipu3/ipu3.cpp | 2 +- > src/ipa/ipu3/meson.build | 2 +- > src/ipa/raspberrypi/meson.build | 1 + > src/ipa/raspberrypi/raspberrypi.cpp | 2 +- > src/libcamera-helpers/mapped_buffer.cpp | 171 ++++++++++++++++++ > src/libcamera/buffer.cpp | 149 --------------- > .../pipeline/raspberrypi/raspberrypi.cpp | 3 +- > src/meson.build | 1 + > test/mapped-buffer.cpp | 3 +- > test/meson.build | 14 +- > 23 files changed, 220 insertions(+), 169 deletions(-) > rename include/libcamera/{internal/buffer.h => helpers/mapped_buffer.h} (81%) > create mode 100644 include/libcamera/helpers/meson.build > create mode 100644 src/libcamera-helpers/mapped_buffer.cpp > diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in > index c1b395bf0b83..e67775b99d26 100644 > --- a/Documentation/Doxyfile.in > +++ b/Documentation/Doxyfile.in > @@ -791,9 +791,11 @@ WARN_LOGFILE = > INPUT = "@TOP_SRCDIR@/include/libcamera" \ > "@TOP_SRCDIR@/src/ipa/libipa" \ > "@TOP_SRCDIR@/src/libcamera" \ > + "@TOP_SRCDIR@/src/libcamera-helpers" \ > "@TOP_SRCDIR@/src/libcamera-platform" \ > "@TOP_BUILDDIR@/include/libcamera" \ > "@TOP_BUILDDIR@/src/libcamera" \ > + "@TOP_BUILDDIR@/src/libcamera-helpers" \ > "@TOP_BUILDDIR@/src/libcamera-platform" > > # This tag can be used to specify the character encoding of the source files > diff --git a/include/libcamera/internal/buffer.h b/include/libcamera/helpers/mapped_buffer.h > similarity index 81% > rename from include/libcamera/internal/buffer.h > rename to include/libcamera/helpers/mapped_buffer.h > index 9da1fbd12c27..ece24f2ddd2c 100644 > --- a/include/libcamera/internal/buffer.h > +++ b/include/libcamera/helpers/mapped_buffer.h > @@ -2,16 +2,16 @@ > /* > * Copyright (C) 2020, Google Inc. > * > - * buffer.h - Internal buffer handling > + * mapped_buffer.h - Mapped Buffer handling > */ > -#ifndef __LIBCAMERA_INTERNAL_BUFFER_H__ > -#define __LIBCAMERA_INTERNAL_BUFFER_H__ > +#ifndef __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ > +#define __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ > > #include <sys/mman.h> > #include <vector> > > -#include <libcamera/class.h> > #include <libcamera/buffer.h> > +#include <libcamera/class.h> > #include <libcamera/span.h> > > namespace libcamera { > @@ -48,4 +48,4 @@ public: > > } /* namespace libcamera */ > > -#endif /* __LIBCAMERA_INTERNAL_BUFFER_H__ */ > +#endif /* __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ */ > diff --git a/include/libcamera/helpers/meson.build b/include/libcamera/helpers/meson.build > new file mode 100644 > index 000000000000..c025eb930600 > --- /dev/null > +++ b/include/libcamera/helpers/meson.build > @@ -0,0 +1,10 @@ > +# SPDX-License-Identifier: CC0-1.0 > + > +libcamera_helpers_include_dir = libcamera_include_dir / 'helpers' > + > +libcamera_helpers_headers = files([ > + 'mapped_buffer.h', > +]) > + > +install_headers(libcamera_helpers_headers, > + subdir: libcamera_helpers_include_dir) > diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build > index 1187cc1f63e4..ecd0c8ba183e 100644 > --- a/include/libcamera/internal/meson.build > +++ b/include/libcamera/internal/meson.build > @@ -11,7 +11,6 @@ libcamera_tracepoint_header = custom_target( > > libcamera_internal_headers = files([ > 'bayer_format.h', > - 'buffer.h', > 'byte_stream_buffer.h', > 'camera_controls.h', > 'camera_sensor.h', > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build > index 7bfcebc79c86..7c98d8744ec2 100644 > --- a/include/libcamera/meson.build > +++ b/include/libcamera/meson.build > @@ -20,6 +20,7 @@ libcamera_public_headers = files([ > > include_dir = libcamera_include_dir / 'libcamera' > > +subdir('helpers') > subdir('internal') > subdir('ipa') > subdir('platform') > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > index b9be3df58084..26e5bbc0c26c 100644 > --- a/src/android/camera_device.h > +++ b/src/android/camera_device.h > @@ -25,7 +25,7 @@ > #include <libcamera/platform/message.h> > #include <libcamera/platform/thread.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > #include "camera_metadata.h" > #include "camera_stream.h" > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h > index 3401672233ca..12484cb607ed 100644 > --- a/src/android/camera_stream.h > +++ b/src/android/camera_stream.h > @@ -19,7 +19,7 @@ > #include <libcamera/geometry.h> > #include <libcamera/pixel_format.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > class CameraDevice; > class CameraMetadata; > diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h > index 838da7728382..ca7c1958e20e 100644 > --- a/src/android/jpeg/encoder_libjpeg.h > +++ b/src/android/jpeg/encoder_libjpeg.h > @@ -9,7 +9,8 @@ > > #include "encoder.h" > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > + > #include "libcamera/internal/formats.h" > > #include <jpeglib.h> > diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h > index 5d2d4ab224b1..4700a7f562a2 100644 > --- a/src/android/jpeg/post_processor_jpeg.h > +++ b/src/android/jpeg/post_processor_jpeg.h > @@ -13,7 +13,7 @@ > > #include <libcamera/geometry.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > class CameraDevice; > > diff --git a/src/android/jpeg/thumbnailer.h b/src/android/jpeg/thumbnailer.h > index 4e9226c34104..483b41dfe47d 100644 > --- a/src/android/jpeg/thumbnailer.h > +++ b/src/android/jpeg/thumbnailer.h > @@ -9,7 +9,8 @@ > > #include <libcamera/geometry.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > + > #include "libcamera/internal/formats.h" > > class Thumbnailer > diff --git a/src/android/meson.build b/src/android/meson.build > index 6edaa1185905..abde9fd2def0 100644 > --- a/src/android/meson.build > +++ b/src/android/meson.build > @@ -5,6 +5,7 @@ android_deps = [ > dependency('libjpeg', required : get_option('android')), > dependency('yaml-0.1', required : get_option('android')), > libcamera_dep, > + libcamera_helpers, > ] > > android_enabled = true > diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp > index f138ada14964..64c73c5716ad 100644 > --- a/src/android/mm/generic_camera_buffer.cpp > +++ b/src/android/mm/generic_camera_buffer.cpp > @@ -11,7 +11,7 @@ > > #include <libcamera/platform/log.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > using namespace libcamera; > > diff --git a/src/android/post_processor.h b/src/android/post_processor.h > index 547fda379ed8..53220edaf24d 100644 > --- a/src/android/post_processor.h > +++ b/src/android/post_processor.h > @@ -10,7 +10,7 @@ > #include <libcamera/buffer.h> > #include <libcamera/stream.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > #include "camera_buffer.h" > > diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp > index ca1ce4dc96d0..158eb3bc49e5 100644 > --- a/src/ipa/ipu3/ipu3.cpp > +++ b/src/ipa/ipu3/ipu3.cpp > @@ -20,7 +20,7 @@ > > #include <libcamera/platform/log.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > #include "ipu3_agc.h" > #include "ipu3_awb.h" > diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build > index 0d843846acde..34620024def7 100644 > --- a/src/ipa/ipu3/meson.build > +++ b/src/ipa/ipu3/meson.build > @@ -12,7 +12,7 @@ mod = shared_module(ipa_name, > [ipu3_ipa_sources, libcamera_generated_ipa_headers], > name_prefix : '', > include_directories : [ipa_includes, libipa_includes], > - dependencies : libcamera_dep, > + dependencies : [libcamera_dep, libcamera_helpers], > link_with : libipa, > install : true, > install_dir : ipa_install_dir) > diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build > index 230356d3ce3a..b2ce6f3e8618 100644 > --- a/src/ipa/raspberrypi/meson.build > +++ b/src/ipa/raspberrypi/meson.build > @@ -4,6 +4,7 @@ ipa_name = 'ipa_rpi' > > rpi_ipa_deps = [ > libcamera_dep, > + libcamera_helpers, > dependency('boost'), > libatomic, > ] > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp > index 90f35d970fd0..b85a1e51d757 100644 > --- a/src/ipa/raspberrypi/raspberrypi.cpp > +++ b/src/ipa/raspberrypi/raspberrypi.cpp > @@ -26,7 +26,7 @@ > > #include <libcamera/platform/log.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > #include <linux/bcm2835-isp.h> > > diff --git a/src/libcamera-helpers/mapped_buffer.cpp b/src/libcamera-helpers/mapped_buffer.cpp > new file mode 100644 > index 000000000000..0d4517b62f65 > --- /dev/null > +++ b/src/libcamera-helpers/mapped_buffer.cpp > @@ -0,0 +1,171 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* > + * Copyright (C) 2021, Google Inc. > + * > + * mapped_buffer.cpp - Mapped Buffer handling > + */ > + > +#include <libcamera/helpers/mapped_buffer.h> > + > +#include <errno.h> > +#include <string.h> > +#include <sys/mman.h> > +#include <unistd.h> > + > +#include <libcamera/platform/log.h> > + > +/** > + * \file libcamera/helpers/mapped_buffer.h > + * \brief Mapped Buffer handling > + */ > + > +namespace libcamera { > + > +LOG_DEFINE_CATEGORY(MappedBuffer) > + > +/** > + * \class MappedBuffer > + * \brief Provide an interface to support managing memory mapped buffers > + * > + * The MappedBuffer interface provides access to a set of MappedPlanes which > + * are available for access by the CPU. > + * > + * This class is not meant to be constructed directly, but instead derived > + * classes should be used to implement the correct mapping of a source buffer. > + * > + * This allows treating CPU accessible memory through a generic interface > + * regardless of whether it originates from a libcamera FrameBuffer or other > + * source. > + */ > + > +/** > + * \typedef MappedBuffer::Plane > + * \brief A mapped region of memory accessible to the CPU > + * > + * The MappedBuffer::Plane uses the Span interface to describe the mapped memory > + * region. > + */ > + > +/** > + * \brief Construct an empty MappedBuffer > + */ > +MappedBuffer::MappedBuffer() > + : error_(0) > +{ > +} > + > +/** > + * \brief Move constructor, construct the MappedBuffer with the contents of \a > + * other using move semantics > + * \param[in] other The other MappedBuffer > + * > + * Moving a MappedBuffer moves the mappings contained in the \a other to the new > + * MappedBuffer and invalidates the \a other. > + * > + * No mappings are unmapped or destroyed in this process. > + */ > +MappedBuffer::MappedBuffer(MappedBuffer &&other) > +{ > + *this = std::move(other); > +} > + > +/** > + * \brief Move assignment operator, replace the mappings with those of \a other > +* \param[in] other The other MappedBuffer > + * > + * Moving a MappedBuffer moves the mappings contained in the \a other to the new > + * MappedBuffer and invalidates the \a other. > + * > + * No mappings are unmapped or destroyed in this process. > + */ > +MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) > +{ > + error_ = other.error_; > + maps_ = std::move(other.maps_); > + other.error_ = -ENOENT; > + > + return *this; > +} > + > +MappedBuffer::~MappedBuffer() > +{ > + for (Plane &map : maps_) > + munmap(map.data(), map.size()); > +} > + > +/** > + * \fn MappedBuffer::isValid() > + * \brief Check if the MappedBuffer instance is valid > + * \return True if the MappedBuffer has valid mappings, false otherwise > + */ > + > +/** > + * \fn MappedBuffer::error() > + * \brief Retrieve the map error status > + * > + * This function retrieves the error status from the MappedBuffer. > + * The error status is a negative number as defined by errno.h. If > + * no error occurred, this function returns 0. > + * > + * \return The map error code > + */ > + > +/** > + * \fn MappedBuffer::maps() > + * \brief Retrieve the mapped planes > + * > + * This function retrieves the successfully mapped planes stored as a vector > + * of Span<uint8_t> to provide access to the mapped memory. > + * > + * \return A vector of the mapped planes > + */ > + > +/** > + * \var MappedBuffer::error_ > + * \brief Stores the error value if present > + * > + * MappedBuffer derived classes shall set this to a negative value as defined > + * by errno.h if an error occured during the mapping process. > + */ > + > +/** > + * \var MappedBuffer::maps_ > + * \brief Stores the internal mapped planes > + * > + * MappedBuffer derived classes shall store the mappings they create in this > + * vector which is parsed during destruct to unmap any memory mappings which > + * completed successfully. > + */ > + > +/** > + * \class MappedFrameBuffer > + * \brief Map a FrameBuffer using the MappedBuffer interface > + */ > + > +/** > + * \brief Map all planes of a FrameBuffer > + * \param[in] buffer FrameBuffer to be mapped > + * \param[in] flags Protection flags to apply to map > + * > + * Construct an object to map a frame buffer for CPU access. > + * The flags are passed directly to mmap and should be either PROT_READ, > + * PROT_WRITE, or a bitwise-or combination of both. > + */ > +MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags) > +{ > + maps_.reserve(buffer->planes().size()); > + > + 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(MappedBuffer, Error) << "Failed to mmap plane"; > + break; > + } > + > + maps_.emplace_back(static_cast<uint8_t *>(address), plane.length); > + } > +} > + > +} /* namespace libcamera */ > diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp > index 3c862820e6e1..0a232d791fcd 100644 > --- a/src/libcamera/buffer.cpp > +++ b/src/libcamera/buffer.cpp > @@ -6,7 +6,6 @@ > */ > > #include <libcamera/buffer.h> > -#include "libcamera/internal/buffer.h" > > #include <errno.h> > #include <string.h> > @@ -18,9 +17,6 @@ > /** > * \file libcamera/buffer.h > * \brief Buffer handling > - * > - * \file libcamera/internal/buffer.h > - * \brief Internal buffer handling support > */ > > namespace libcamera { > @@ -235,149 +231,4 @@ FrameBuffer::FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie) > * indicate that the metadata is invalid. > */ > > -/** > - * \class MappedBuffer > - * \brief Provide an interface to support managing memory mapped buffers > - * > - * The MappedBuffer interface provides access to a set of MappedPlanes which > - * are available for access by the CPU. > - * > - * This class is not meant to be constructed directly, but instead derived > - * classes should be used to implement the correct mapping of a source buffer. > - * > - * This allows treating CPU accessible memory through a generic interface > - * regardless of whether it originates from a libcamera FrameBuffer or other > - * source. > - */ > - > -/** > - * \typedef MappedBuffer::Plane > - * \brief A mapped region of memory accessible to the CPU > - * > - * The MappedBuffer::Plane uses the Span interface to describe the mapped memory > - * region. > - */ > - > -/** > - * \brief Construct an empty MappedBuffer > - */ > -MappedBuffer::MappedBuffer() > - : error_(0) > -{ > -} > - > -/** > - * \brief Move constructor, construct the MappedBuffer with the contents of \a > - * other using move semantics > - * \param[in] other The other MappedBuffer > - * > - * Moving a MappedBuffer moves the mappings contained in the \a other to the new > - * MappedBuffer and invalidates the \a other. > - * > - * No mappings are unmapped or destroyed in this process. > - */ > -MappedBuffer::MappedBuffer(MappedBuffer &&other) > -{ > - *this = std::move(other); > -} > - > -/** > - * \brief Move assignment operator, replace the mappings with those of \a other > -* \param[in] other The other MappedBuffer > - * > - * Moving a MappedBuffer moves the mappings contained in the \a other to the new > - * MappedBuffer and invalidates the \a other. > - * > - * No mappings are unmapped or destroyed in this process. > - */ > -MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) > -{ > - error_ = other.error_; > - maps_ = std::move(other.maps_); > - other.error_ = -ENOENT; > - > - return *this; > -} > - > -MappedBuffer::~MappedBuffer() > -{ > - for (Plane &map : maps_) > - munmap(map.data(), map.size()); > -} > - > -/** > - * \fn MappedBuffer::isValid() > - * \brief Check if the MappedBuffer instance is valid > - * \return True if the MappedBuffer has valid mappings, false otherwise > - */ > - > -/** > - * \fn MappedBuffer::error() > - * \brief Retrieve the map error status > - * > - * This function retrieves the error status from the MappedBuffer. > - * The error status is a negative number as defined by errno.h. If > - * no error occurred, this function returns 0. > - * > - * \return The map error code > - */ > - > -/** > - * \fn MappedBuffer::maps() > - * \brief Retrieve the mapped planes > - * > - * This function retrieves the successfully mapped planes stored as a vector > - * of Span<uint8_t> to provide access to the mapped memory. > - * > - * \return A vector of the mapped planes > - */ > - > -/** > - * \var MappedBuffer::error_ > - * \brief Stores the error value if present > - * > - * MappedBuffer derived classes shall set this to a negative value as defined > - * by errno.h if an error occured during the mapping process. > - */ > - > -/** > - * \var MappedBuffer::maps_ > - * \brief Stores the internal mapped planes > - * > - * MappedBuffer derived classes shall store the mappings they create in this > - * vector which is parsed during destruct to unmap any memory mappings which > - * completed successfully. > - */ > - > -/** > - * \class MappedFrameBuffer > - * \brief Map a FrameBuffer using the MappedBuffer interface > - */ > - > -/** > - * \brief Map all planes of a FrameBuffer > - * \param[in] buffer FrameBuffer to be mapped > - * \param[in] flags Protection flags to apply to map > - * > - * Construct an object to map a frame buffer for CPU access. > - * The flags are passed directly to mmap and should be either PROT_READ, > - * PROT_WRITE, or a bitwise-or combination of both. > - */ > -MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags) > -{ > - maps_.reserve(buffer->planes().size()); > - > - 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); > - } > -} > - > } /* namespace libcamera */ > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > index dc3fe63112d4..e6849733f979 100644 > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > @@ -29,8 +29,9 @@ > #include <linux/bcm2835-isp.h> > #include <linux/videodev2.h> > > +#include <libcamera/helpers/mapped_buffer.h> > + > #include "libcamera/internal/bayer_format.h" > -#include "libcamera/internal/buffer.h" > #include "libcamera/internal/camera_sensor.h" > #include "libcamera/internal/delayed_controls.h" > #include "libcamera/internal/device_enumerator.h" > diff --git a/src/meson.build b/src/meson.build > index 70e1a4618a0f..380de28d0f7a 100644 > --- a/src/meson.build > +++ b/src/meson.build > @@ -31,6 +31,7 @@ libcamera_objects = [] > # libcamera must be built first as a dependency to the other components. > subdir('libcamera-platform') > subdir('libcamera') > +subdir('libcamera-helpers') > > subdir('android') > subdir('ipa') > diff --git a/test/mapped-buffer.cpp b/test/mapped-buffer.cpp > index 5de8201e45f6..218d700f40da 100644 > --- a/test/mapped-buffer.cpp > +++ b/test/mapped-buffer.cpp > @@ -4,12 +4,11 @@ > * > * libcamera internal MappedBuffer tests > */ > - > #include <iostream> > > #include <libcamera/framebuffer_allocator.h> > > -#include "libcamera/internal/buffer.h" > +#include <libcamera/helpers/mapped_buffer.h> > > #include "camera_test.h" > #include "test.h" > diff --git a/test/meson.build b/test/meson.build > index 045ad2a2d7c9..ee0d127cf1ec 100644 > --- a/test/meson.build > +++ b/test/meson.build > @@ -40,7 +40,6 @@ internal_tests = [ > ['file', 'file.cpp'], > ['file-descriptor', 'file-descriptor.cpp'], > ['hotplug-cameras', 'hotplug-cameras.cpp'], > - ['mapped-buffer', 'mapped-buffer.cpp'], > ['message', 'message.cpp'], > ['object', 'object.cpp'], > ['object-delete', 'object-delete.cpp'], > @@ -53,6 +52,10 @@ internal_tests = [ > ['utils', 'utils.cpp'], > ] > > +helpers_tests = [ > + ['mapped-buffer', 'mapped-buffer.cpp'], > +] > + > foreach t : public_tests > exe = executable(t[0], t[1], > dependencies : libcamera_dep, > @@ -70,3 +73,12 @@ foreach t : internal_tests > > test(t[0], exe) > endforeach > + > +foreach t : helpers_tests > + exe = executable(t[0], t[1], > + dependencies : [libcamera_dep, libcamera_helpers], > + link_with : test_libraries, > + include_directories : test_includes_internal) > + > + test(t[0], exe) > +endforeach
Hi Umang, Oh dear - I'm sorry I slipped on this. Here is the diff which introduces the meson.build diff --git a/src/libcamera-helpers/meson.build b/src/libcamera-helpers/meson.build new file mode 100644 index 000000000000..53e6d91554f7 --- /dev/null +++ b/src/libcamera-helpers/meson.build @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: CC0-1.0 + +libcamera_helpers_sources = files([ + 'mapped_buffer.cpp', +]) + +libcamera_helpers_deps = [ + libcamera_dep, +] + +libcamera_helpers_lib = shared_library('libcamera-helpers', + [libcamera_helpers_sources, libcamera_helpers_headers], + name_prefix : '', + install : true, + cpp_args : libcamera_cpp_args, + include_directories : libcamera_includes, + dependencies : libcamera_helpers_deps) + +libcamera_helpers = declare_dependency(sources: libcamera_helpers_headers, + include_directories : libcamera_includes, + link_with : libcamera_helpers_lib) + +pkg_mod = import('pkgconfig') +pkg_mod.generate(libraries : libcamera_helpers_lib, + version : '1.0', + name : 'libcamera-helpers', + filebase : 'camera-helpers', + description : 'Complex Camera Support Library helpers', + subdirs : 'libcamera') which will of course be in any v2 ;-) -- Kieran On 17/06/2021 08:24, Umang Jain wrote: > Hi Kieran, > > I cannot compile this series with this patch, due to missing > src/libcamera-helpers/meson.build > > src/meson.build:34:0: ERROR: Non-existent build file > 'src/libcamera-helpers/meson.build' > > On 6/16/21 8:41 PM, Kieran Bingham wrote: >> Provide a library which build support on top of the libcamera API. >> >> This currently implements the MappedBuffer and MappedFrameBuffer classes >> which help with lifetime management of mmapping libcamera buffers. >> >> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> >> --- >> Documentation/Doxyfile.in | 2 + >> .../buffer.h => helpers/mapped_buffer.h} | 10 +- >> include/libcamera/helpers/meson.build | 10 + >> include/libcamera/internal/meson.build | 1 - >> include/libcamera/meson.build | 1 + >> src/android/camera_device.h | 2 +- >> src/android/camera_stream.h | 2 +- >> src/android/jpeg/encoder_libjpeg.h | 3 +- >> src/android/jpeg/post_processor_jpeg.h | 2 +- >> src/android/jpeg/thumbnailer.h | 3 +- >> src/android/meson.build | 1 + >> src/android/mm/generic_camera_buffer.cpp | 2 +- >> src/android/post_processor.h | 2 +- >> src/ipa/ipu3/ipu3.cpp | 2 +- >> src/ipa/ipu3/meson.build | 2 +- >> src/ipa/raspberrypi/meson.build | 1 + >> src/ipa/raspberrypi/raspberrypi.cpp | 2 +- >> src/libcamera-helpers/mapped_buffer.cpp | 171 ++++++++++++++++++ >> src/libcamera/buffer.cpp | 149 --------------- >> .../pipeline/raspberrypi/raspberrypi.cpp | 3 +- >> src/meson.build | 1 + >> test/mapped-buffer.cpp | 3 +- >> test/meson.build | 14 +- >> 23 files changed, 220 insertions(+), 169 deletions(-) >> rename include/libcamera/{internal/buffer.h => >> helpers/mapped_buffer.h} (81%) >> create mode 100644 include/libcamera/helpers/meson.build >> create mode 100644 src/libcamera-helpers/mapped_buffer.cpp >> diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in >> index c1b395bf0b83..e67775b99d26 100644 >> --- a/Documentation/Doxyfile.in >> +++ b/Documentation/Doxyfile.in >> @@ -791,9 +791,11 @@ WARN_LOGFILE = >> INPUT = "@TOP_SRCDIR@/include/libcamera" \ >> "@TOP_SRCDIR@/src/ipa/libipa" \ >> "@TOP_SRCDIR@/src/libcamera" \ >> + "@TOP_SRCDIR@/src/libcamera-helpers" \ >> "@TOP_SRCDIR@/src/libcamera-platform" \ >> "@TOP_BUILDDIR@/include/libcamera" \ >> "@TOP_BUILDDIR@/src/libcamera" \ >> + "@TOP_BUILDDIR@/src/libcamera-helpers" \ >> "@TOP_BUILDDIR@/src/libcamera-platform" >> # This tag can be used to specify the character encoding of the >> source files >> diff --git a/include/libcamera/internal/buffer.h >> b/include/libcamera/helpers/mapped_buffer.h >> similarity index 81% >> rename from include/libcamera/internal/buffer.h >> rename to include/libcamera/helpers/mapped_buffer.h >> index 9da1fbd12c27..ece24f2ddd2c 100644 >> --- a/include/libcamera/internal/buffer.h >> +++ b/include/libcamera/helpers/mapped_buffer.h >> @@ -2,16 +2,16 @@ >> /* >> * Copyright (C) 2020, Google Inc. >> * >> - * buffer.h - Internal buffer handling >> + * mapped_buffer.h - Mapped Buffer handling >> */ >> -#ifndef __LIBCAMERA_INTERNAL_BUFFER_H__ >> -#define __LIBCAMERA_INTERNAL_BUFFER_H__ >> +#ifndef __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ >> +#define __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ >> #include <sys/mman.h> >> #include <vector> >> -#include <libcamera/class.h> >> #include <libcamera/buffer.h> >> +#include <libcamera/class.h> >> #include <libcamera/span.h> >> namespace libcamera { >> @@ -48,4 +48,4 @@ public: >> } /* namespace libcamera */ >> -#endif /* __LIBCAMERA_INTERNAL_BUFFER_H__ */ >> +#endif /* __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ */ >> diff --git a/include/libcamera/helpers/meson.build >> b/include/libcamera/helpers/meson.build >> new file mode 100644 >> index 000000000000..c025eb930600 >> --- /dev/null >> +++ b/include/libcamera/helpers/meson.build >> @@ -0,0 +1,10 @@ >> +# SPDX-License-Identifier: CC0-1.0 >> + >> +libcamera_helpers_include_dir = libcamera_include_dir / 'helpers' >> + >> +libcamera_helpers_headers = files([ >> + 'mapped_buffer.h', >> +]) >> + >> +install_headers(libcamera_helpers_headers, >> + subdir: libcamera_helpers_include_dir) >> diff --git a/include/libcamera/internal/meson.build >> b/include/libcamera/internal/meson.build >> index 1187cc1f63e4..ecd0c8ba183e 100644 >> --- a/include/libcamera/internal/meson.build >> +++ b/include/libcamera/internal/meson.build >> @@ -11,7 +11,6 @@ libcamera_tracepoint_header = custom_target( >> libcamera_internal_headers = files([ >> 'bayer_format.h', >> - 'buffer.h', >> 'byte_stream_buffer.h', >> 'camera_controls.h', >> 'camera_sensor.h', >> diff --git a/include/libcamera/meson.build >> b/include/libcamera/meson.build >> index 7bfcebc79c86..7c98d8744ec2 100644 >> --- a/include/libcamera/meson.build >> +++ b/include/libcamera/meson.build >> @@ -20,6 +20,7 @@ libcamera_public_headers = files([ >> include_dir = libcamera_include_dir / 'libcamera' >> +subdir('helpers') >> subdir('internal') >> subdir('ipa') >> subdir('platform') >> diff --git a/src/android/camera_device.h b/src/android/camera_device.h >> index b9be3df58084..26e5bbc0c26c 100644 >> --- a/src/android/camera_device.h >> +++ b/src/android/camera_device.h >> @@ -25,7 +25,7 @@ >> #include <libcamera/platform/message.h> >> #include <libcamera/platform/thread.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> #include "camera_metadata.h" >> #include "camera_stream.h" >> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h >> index 3401672233ca..12484cb607ed 100644 >> --- a/src/android/camera_stream.h >> +++ b/src/android/camera_stream.h >> @@ -19,7 +19,7 @@ >> #include <libcamera/geometry.h> >> #include <libcamera/pixel_format.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> class CameraDevice; >> class CameraMetadata; >> diff --git a/src/android/jpeg/encoder_libjpeg.h >> b/src/android/jpeg/encoder_libjpeg.h >> index 838da7728382..ca7c1958e20e 100644 >> --- a/src/android/jpeg/encoder_libjpeg.h >> +++ b/src/android/jpeg/encoder_libjpeg.h >> @@ -9,7 +9,8 @@ >> #include "encoder.h" >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> + >> #include "libcamera/internal/formats.h" >> #include <jpeglib.h> >> diff --git a/src/android/jpeg/post_processor_jpeg.h >> b/src/android/jpeg/post_processor_jpeg.h >> index 5d2d4ab224b1..4700a7f562a2 100644 >> --- a/src/android/jpeg/post_processor_jpeg.h >> +++ b/src/android/jpeg/post_processor_jpeg.h >> @@ -13,7 +13,7 @@ >> #include <libcamera/geometry.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> class CameraDevice; >> diff --git a/src/android/jpeg/thumbnailer.h >> b/src/android/jpeg/thumbnailer.h >> index 4e9226c34104..483b41dfe47d 100644 >> --- a/src/android/jpeg/thumbnailer.h >> +++ b/src/android/jpeg/thumbnailer.h >> @@ -9,7 +9,8 @@ >> #include <libcamera/geometry.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> + >> #include "libcamera/internal/formats.h" >> class Thumbnailer >> diff --git a/src/android/meson.build b/src/android/meson.build >> index 6edaa1185905..abde9fd2def0 100644 >> --- a/src/android/meson.build >> +++ b/src/android/meson.build >> @@ -5,6 +5,7 @@ android_deps = [ >> dependency('libjpeg', required : get_option('android')), >> dependency('yaml-0.1', required : get_option('android')), >> libcamera_dep, >> + libcamera_helpers, >> ] >> android_enabled = true >> diff --git a/src/android/mm/generic_camera_buffer.cpp >> b/src/android/mm/generic_camera_buffer.cpp >> index f138ada14964..64c73c5716ad 100644 >> --- a/src/android/mm/generic_camera_buffer.cpp >> +++ b/src/android/mm/generic_camera_buffer.cpp >> @@ -11,7 +11,7 @@ >> #include <libcamera/platform/log.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> using namespace libcamera; >> diff --git a/src/android/post_processor.h >> b/src/android/post_processor.h >> index 547fda379ed8..53220edaf24d 100644 >> --- a/src/android/post_processor.h >> +++ b/src/android/post_processor.h >> @@ -10,7 +10,7 @@ >> #include <libcamera/buffer.h> >> #include <libcamera/stream.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> #include "camera_buffer.h" >> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp >> index ca1ce4dc96d0..158eb3bc49e5 100644 >> --- a/src/ipa/ipu3/ipu3.cpp >> +++ b/src/ipa/ipu3/ipu3.cpp >> @@ -20,7 +20,7 @@ >> #include <libcamera/platform/log.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> #include "ipu3_agc.h" >> #include "ipu3_awb.h" >> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build >> index 0d843846acde..34620024def7 100644 >> --- a/src/ipa/ipu3/meson.build >> +++ b/src/ipa/ipu3/meson.build >> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name, >> [ipu3_ipa_sources, >> libcamera_generated_ipa_headers], >> name_prefix : '', >> include_directories : [ipa_includes, >> libipa_includes], >> - dependencies : libcamera_dep, >> + dependencies : [libcamera_dep, libcamera_helpers], >> link_with : libipa, >> install : true, >> install_dir : ipa_install_dir) >> diff --git a/src/ipa/raspberrypi/meson.build >> b/src/ipa/raspberrypi/meson.build >> index 230356d3ce3a..b2ce6f3e8618 100644 >> --- a/src/ipa/raspberrypi/meson.build >> +++ b/src/ipa/raspberrypi/meson.build >> @@ -4,6 +4,7 @@ ipa_name = 'ipa_rpi' >> rpi_ipa_deps = [ >> libcamera_dep, >> + libcamera_helpers, >> dependency('boost'), >> libatomic, >> ] >> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp >> b/src/ipa/raspberrypi/raspberrypi.cpp >> index 90f35d970fd0..b85a1e51d757 100644 >> --- a/src/ipa/raspberrypi/raspberrypi.cpp >> +++ b/src/ipa/raspberrypi/raspberrypi.cpp >> @@ -26,7 +26,7 @@ >> #include <libcamera/platform/log.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> #include <linux/bcm2835-isp.h> >> diff --git a/src/libcamera-helpers/mapped_buffer.cpp >> b/src/libcamera-helpers/mapped_buffer.cpp >> new file mode 100644 >> index 000000000000..0d4517b62f65 >> --- /dev/null >> +++ b/src/libcamera-helpers/mapped_buffer.cpp >> @@ -0,0 +1,171 @@ >> +/* SPDX-License-Identifier: LGPL-2.1-or-later */ >> +/* >> + * Copyright (C) 2021, Google Inc. >> + * >> + * mapped_buffer.cpp - Mapped Buffer handling >> + */ >> + >> +#include <libcamera/helpers/mapped_buffer.h> >> + >> +#include <errno.h> >> +#include <string.h> >> +#include <sys/mman.h> >> +#include <unistd.h> >> + >> +#include <libcamera/platform/log.h> >> + >> +/** >> + * \file libcamera/helpers/mapped_buffer.h >> + * \brief Mapped Buffer handling >> + */ >> + >> +namespace libcamera { >> + >> +LOG_DEFINE_CATEGORY(MappedBuffer) >> + >> +/** >> + * \class MappedBuffer >> + * \brief Provide an interface to support managing memory mapped buffers >> + * >> + * The MappedBuffer interface provides access to a set of >> MappedPlanes which >> + * are available for access by the CPU. >> + * >> + * This class is not meant to be constructed directly, but instead >> derived >> + * classes should be used to implement the correct mapping of a >> source buffer. >> + * >> + * This allows treating CPU accessible memory through a generic >> interface >> + * regardless of whether it originates from a libcamera FrameBuffer >> or other >> + * source. >> + */ >> + >> +/** >> + * \typedef MappedBuffer::Plane >> + * \brief A mapped region of memory accessible to the CPU >> + * >> + * The MappedBuffer::Plane uses the Span interface to describe the >> mapped memory >> + * region. >> + */ >> + >> +/** >> + * \brief Construct an empty MappedBuffer >> + */ >> +MappedBuffer::MappedBuffer() >> + : error_(0) >> +{ >> +} >> + >> +/** >> + * \brief Move constructor, construct the MappedBuffer with the >> contents of \a >> + * other using move semantics >> + * \param[in] other The other MappedBuffer >> + * >> + * Moving a MappedBuffer moves the mappings contained in the \a other >> to the new >> + * MappedBuffer and invalidates the \a other. >> + * >> + * No mappings are unmapped or destroyed in this process. >> + */ >> +MappedBuffer::MappedBuffer(MappedBuffer &&other) >> +{ >> + *this = std::move(other); >> +} >> + >> +/** >> + * \brief Move assignment operator, replace the mappings with those >> of \a other >> +* \param[in] other The other MappedBuffer >> + * >> + * Moving a MappedBuffer moves the mappings contained in the \a other >> to the new >> + * MappedBuffer and invalidates the \a other. >> + * >> + * No mappings are unmapped or destroyed in this process. >> + */ >> +MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) >> +{ >> + error_ = other.error_; >> + maps_ = std::move(other.maps_); >> + other.error_ = -ENOENT; >> + >> + return *this; >> +} >> + >> +MappedBuffer::~MappedBuffer() >> +{ >> + for (Plane &map : maps_) >> + munmap(map.data(), map.size()); >> +} >> + >> +/** >> + * \fn MappedBuffer::isValid() >> + * \brief Check if the MappedBuffer instance is valid >> + * \return True if the MappedBuffer has valid mappings, false otherwise >> + */ >> + >> +/** >> + * \fn MappedBuffer::error() >> + * \brief Retrieve the map error status >> + * >> + * This function retrieves the error status from the MappedBuffer. >> + * The error status is a negative number as defined by errno.h. If >> + * no error occurred, this function returns 0. >> + * >> + * \return The map error code >> + */ >> + >> +/** >> + * \fn MappedBuffer::maps() >> + * \brief Retrieve the mapped planes >> + * >> + * This function retrieves the successfully mapped planes stored as a >> vector >> + * of Span<uint8_t> to provide access to the mapped memory. >> + * >> + * \return A vector of the mapped planes >> + */ >> + >> +/** >> + * \var MappedBuffer::error_ >> + * \brief Stores the error value if present >> + * >> + * MappedBuffer derived classes shall set this to a negative value as >> defined >> + * by errno.h if an error occured during the mapping process. >> + */ >> + >> +/** >> + * \var MappedBuffer::maps_ >> + * \brief Stores the internal mapped planes >> + * >> + * MappedBuffer derived classes shall store the mappings they create >> in this >> + * vector which is parsed during destruct to unmap any memory >> mappings which >> + * completed successfully. >> + */ >> + >> +/** >> + * \class MappedFrameBuffer >> + * \brief Map a FrameBuffer using the MappedBuffer interface >> + */ >> + >> +/** >> + * \brief Map all planes of a FrameBuffer >> + * \param[in] buffer FrameBuffer to be mapped >> + * \param[in] flags Protection flags to apply to map >> + * >> + * Construct an object to map a frame buffer for CPU access. >> + * The flags are passed directly to mmap and should be either PROT_READ, >> + * PROT_WRITE, or a bitwise-or combination of both. >> + */ >> +MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int >> flags) >> +{ >> + maps_.reserve(buffer->planes().size()); >> + >> + 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(MappedBuffer, Error) << "Failed to mmap plane"; >> + break; >> + } >> + >> + maps_.emplace_back(static_cast<uint8_t *>(address), >> plane.length); >> + } >> +} >> + >> +} /* namespace libcamera */ >> diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp >> index 3c862820e6e1..0a232d791fcd 100644 >> --- a/src/libcamera/buffer.cpp >> +++ b/src/libcamera/buffer.cpp >> @@ -6,7 +6,6 @@ >> */ >> #include <libcamera/buffer.h> >> -#include "libcamera/internal/buffer.h" >> #include <errno.h> >> #include <string.h> >> @@ -18,9 +17,6 @@ >> /** >> * \file libcamera/buffer.h >> * \brief Buffer handling >> - * >> - * \file libcamera/internal/buffer.h >> - * \brief Internal buffer handling support >> */ >> namespace libcamera { >> @@ -235,149 +231,4 @@ FrameBuffer::FrameBuffer(const >> std::vector<Plane> &planes, unsigned int cookie) >> * indicate that the metadata is invalid. >> */ >> -/** >> - * \class MappedBuffer >> - * \brief Provide an interface to support managing memory mapped buffers >> - * >> - * The MappedBuffer interface provides access to a set of >> MappedPlanes which >> - * are available for access by the CPU. >> - * >> - * This class is not meant to be constructed directly, but instead >> derived >> - * classes should be used to implement the correct mapping of a >> source buffer. >> - * >> - * This allows treating CPU accessible memory through a generic >> interface >> - * regardless of whether it originates from a libcamera FrameBuffer >> or other >> - * source. >> - */ >> - >> -/** >> - * \typedef MappedBuffer::Plane >> - * \brief A mapped region of memory accessible to the CPU >> - * >> - * The MappedBuffer::Plane uses the Span interface to describe the >> mapped memory >> - * region. >> - */ >> - >> -/** >> - * \brief Construct an empty MappedBuffer >> - */ >> -MappedBuffer::MappedBuffer() >> - : error_(0) >> -{ >> -} >> - >> -/** >> - * \brief Move constructor, construct the MappedBuffer with the >> contents of \a >> - * other using move semantics >> - * \param[in] other The other MappedBuffer >> - * >> - * Moving a MappedBuffer moves the mappings contained in the \a other >> to the new >> - * MappedBuffer and invalidates the \a other. >> - * >> - * No mappings are unmapped or destroyed in this process. >> - */ >> -MappedBuffer::MappedBuffer(MappedBuffer &&other) >> -{ >> - *this = std::move(other); >> -} >> - >> -/** >> - * \brief Move assignment operator, replace the mappings with those >> of \a other >> -* \param[in] other The other MappedBuffer >> - * >> - * Moving a MappedBuffer moves the mappings contained in the \a other >> to the new >> - * MappedBuffer and invalidates the \a other. >> - * >> - * No mappings are unmapped or destroyed in this process. >> - */ >> -MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) >> -{ >> - error_ = other.error_; >> - maps_ = std::move(other.maps_); >> - other.error_ = -ENOENT; >> - >> - return *this; >> -} >> - >> -MappedBuffer::~MappedBuffer() >> -{ >> - for (Plane &map : maps_) >> - munmap(map.data(), map.size()); >> -} >> - >> -/** >> - * \fn MappedBuffer::isValid() >> - * \brief Check if the MappedBuffer instance is valid >> - * \return True if the MappedBuffer has valid mappings, false otherwise >> - */ >> - >> -/** >> - * \fn MappedBuffer::error() >> - * \brief Retrieve the map error status >> - * >> - * This function retrieves the error status from the MappedBuffer. >> - * The error status is a negative number as defined by errno.h. If >> - * no error occurred, this function returns 0. >> - * >> - * \return The map error code >> - */ >> - >> -/** >> - * \fn MappedBuffer::maps() >> - * \brief Retrieve the mapped planes >> - * >> - * This function retrieves the successfully mapped planes stored as a >> vector >> - * of Span<uint8_t> to provide access to the mapped memory. >> - * >> - * \return A vector of the mapped planes >> - */ >> - >> -/** >> - * \var MappedBuffer::error_ >> - * \brief Stores the error value if present >> - * >> - * MappedBuffer derived classes shall set this to a negative value as >> defined >> - * by errno.h if an error occured during the mapping process. >> - */ >> - >> -/** >> - * \var MappedBuffer::maps_ >> - * \brief Stores the internal mapped planes >> - * >> - * MappedBuffer derived classes shall store the mappings they create >> in this >> - * vector which is parsed during destruct to unmap any memory >> mappings which >> - * completed successfully. >> - */ >> - >> -/** >> - * \class MappedFrameBuffer >> - * \brief Map a FrameBuffer using the MappedBuffer interface >> - */ >> - >> -/** >> - * \brief Map all planes of a FrameBuffer >> - * \param[in] buffer FrameBuffer to be mapped >> - * \param[in] flags Protection flags to apply to map >> - * >> - * Construct an object to map a frame buffer for CPU access. >> - * The flags are passed directly to mmap and should be either PROT_READ, >> - * PROT_WRITE, or a bitwise-or combination of both. >> - */ >> -MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int >> flags) >> -{ >> - maps_.reserve(buffer->planes().size()); >> - >> - 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); >> - } >> -} >> - >> } /* namespace libcamera */ >> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp >> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp >> index dc3fe63112d4..e6849733f979 100644 >> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp >> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp >> @@ -29,8 +29,9 @@ >> #include <linux/bcm2835-isp.h> >> #include <linux/videodev2.h> >> +#include <libcamera/helpers/mapped_buffer.h> >> + >> #include "libcamera/internal/bayer_format.h" >> -#include "libcamera/internal/buffer.h" >> #include "libcamera/internal/camera_sensor.h" >> #include "libcamera/internal/delayed_controls.h" >> #include "libcamera/internal/device_enumerator.h" >> diff --git a/src/meson.build b/src/meson.build >> index 70e1a4618a0f..380de28d0f7a 100644 >> --- a/src/meson.build >> +++ b/src/meson.build >> @@ -31,6 +31,7 @@ libcamera_objects = [] >> # libcamera must be built first as a dependency to the other >> components. >> subdir('libcamera-platform') >> subdir('libcamera') >> +subdir('libcamera-helpers') >> subdir('android') >> subdir('ipa') >> diff --git a/test/mapped-buffer.cpp b/test/mapped-buffer.cpp >> index 5de8201e45f6..218d700f40da 100644 >> --- a/test/mapped-buffer.cpp >> +++ b/test/mapped-buffer.cpp >> @@ -4,12 +4,11 @@ >> * >> * libcamera internal MappedBuffer tests >> */ >> - >> #include <iostream> >> #include <libcamera/framebuffer_allocator.h> >> -#include "libcamera/internal/buffer.h" >> +#include <libcamera/helpers/mapped_buffer.h> >> #include "camera_test.h" >> #include "test.h" >> diff --git a/test/meson.build b/test/meson.build >> index 045ad2a2d7c9..ee0d127cf1ec 100644 >> --- a/test/meson.build >> +++ b/test/meson.build >> @@ -40,7 +40,6 @@ internal_tests = [ >> ['file', 'file.cpp'], >> ['file-descriptor', 'file-descriptor.cpp'], >> ['hotplug-cameras', 'hotplug-cameras.cpp'], >> - ['mapped-buffer', 'mapped-buffer.cpp'], >> ['message', 'message.cpp'], >> ['object', 'object.cpp'], >> ['object-delete', 'object-delete.cpp'], >> @@ -53,6 +52,10 @@ internal_tests = [ >> ['utils', 'utils.cpp'], >> ] >> +helpers_tests = [ >> + ['mapped-buffer', 'mapped-buffer.cpp'], >> +] >> + >> foreach t : public_tests >> exe = executable(t[0], t[1], >> dependencies : libcamera_dep, >> @@ -70,3 +73,12 @@ foreach t : internal_tests >> test(t[0], exe) >> endforeach >> + >> +foreach t : helpers_tests >> + exe = executable(t[0], t[1], >> + dependencies : [libcamera_dep, libcamera_helpers], >> + link_with : test_libraries, >> + include_directories : test_includes_internal) >> + >> + test(t[0], exe) >> +endforeach
diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in index c1b395bf0b83..e67775b99d26 100644 --- a/Documentation/Doxyfile.in +++ b/Documentation/Doxyfile.in @@ -791,9 +791,11 @@ WARN_LOGFILE = INPUT = "@TOP_SRCDIR@/include/libcamera" \ "@TOP_SRCDIR@/src/ipa/libipa" \ "@TOP_SRCDIR@/src/libcamera" \ + "@TOP_SRCDIR@/src/libcamera-helpers" \ "@TOP_SRCDIR@/src/libcamera-platform" \ "@TOP_BUILDDIR@/include/libcamera" \ "@TOP_BUILDDIR@/src/libcamera" \ + "@TOP_BUILDDIR@/src/libcamera-helpers" \ "@TOP_BUILDDIR@/src/libcamera-platform" # This tag can be used to specify the character encoding of the source files diff --git a/include/libcamera/internal/buffer.h b/include/libcamera/helpers/mapped_buffer.h similarity index 81% rename from include/libcamera/internal/buffer.h rename to include/libcamera/helpers/mapped_buffer.h index 9da1fbd12c27..ece24f2ddd2c 100644 --- a/include/libcamera/internal/buffer.h +++ b/include/libcamera/helpers/mapped_buffer.h @@ -2,16 +2,16 @@ /* * Copyright (C) 2020, Google Inc. * - * buffer.h - Internal buffer handling + * mapped_buffer.h - Mapped Buffer handling */ -#ifndef __LIBCAMERA_INTERNAL_BUFFER_H__ -#define __LIBCAMERA_INTERNAL_BUFFER_H__ +#ifndef __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ +#define __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ #include <sys/mman.h> #include <vector> -#include <libcamera/class.h> #include <libcamera/buffer.h> +#include <libcamera/class.h> #include <libcamera/span.h> namespace libcamera { @@ -48,4 +48,4 @@ public: } /* namespace libcamera */ -#endif /* __LIBCAMERA_INTERNAL_BUFFER_H__ */ +#endif /* __LIBCAMERA_HELPERS_MAPPED_BUFFER_H__ */ diff --git a/include/libcamera/helpers/meson.build b/include/libcamera/helpers/meson.build new file mode 100644 index 000000000000..c025eb930600 --- /dev/null +++ b/include/libcamera/helpers/meson.build @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: CC0-1.0 + +libcamera_helpers_include_dir = libcamera_include_dir / 'helpers' + +libcamera_helpers_headers = files([ + 'mapped_buffer.h', +]) + +install_headers(libcamera_helpers_headers, + subdir: libcamera_helpers_include_dir) diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index 1187cc1f63e4..ecd0c8ba183e 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -11,7 +11,6 @@ libcamera_tracepoint_header = custom_target( libcamera_internal_headers = files([ 'bayer_format.h', - 'buffer.h', 'byte_stream_buffer.h', 'camera_controls.h', 'camera_sensor.h', diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build index 7bfcebc79c86..7c98d8744ec2 100644 --- a/include/libcamera/meson.build +++ b/include/libcamera/meson.build @@ -20,6 +20,7 @@ libcamera_public_headers = files([ include_dir = libcamera_include_dir / 'libcamera' +subdir('helpers') subdir('internal') subdir('ipa') subdir('platform') diff --git a/src/android/camera_device.h b/src/android/camera_device.h index b9be3df58084..26e5bbc0c26c 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -25,7 +25,7 @@ #include <libcamera/platform/message.h> #include <libcamera/platform/thread.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> #include "camera_metadata.h" #include "camera_stream.h" diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h index 3401672233ca..12484cb607ed 100644 --- a/src/android/camera_stream.h +++ b/src/android/camera_stream.h @@ -19,7 +19,7 @@ #include <libcamera/geometry.h> #include <libcamera/pixel_format.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> class CameraDevice; class CameraMetadata; diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h index 838da7728382..ca7c1958e20e 100644 --- a/src/android/jpeg/encoder_libjpeg.h +++ b/src/android/jpeg/encoder_libjpeg.h @@ -9,7 +9,8 @@ #include "encoder.h" -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> + #include "libcamera/internal/formats.h" #include <jpeglib.h> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h index 5d2d4ab224b1..4700a7f562a2 100644 --- a/src/android/jpeg/post_processor_jpeg.h +++ b/src/android/jpeg/post_processor_jpeg.h @@ -13,7 +13,7 @@ #include <libcamera/geometry.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> class CameraDevice; diff --git a/src/android/jpeg/thumbnailer.h b/src/android/jpeg/thumbnailer.h index 4e9226c34104..483b41dfe47d 100644 --- a/src/android/jpeg/thumbnailer.h +++ b/src/android/jpeg/thumbnailer.h @@ -9,7 +9,8 @@ #include <libcamera/geometry.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> + #include "libcamera/internal/formats.h" class Thumbnailer diff --git a/src/android/meson.build b/src/android/meson.build index 6edaa1185905..abde9fd2def0 100644 --- a/src/android/meson.build +++ b/src/android/meson.build @@ -5,6 +5,7 @@ android_deps = [ dependency('libjpeg', required : get_option('android')), dependency('yaml-0.1', required : get_option('android')), libcamera_dep, + libcamera_helpers, ] android_enabled = true diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp index f138ada14964..64c73c5716ad 100644 --- a/src/android/mm/generic_camera_buffer.cpp +++ b/src/android/mm/generic_camera_buffer.cpp @@ -11,7 +11,7 @@ #include <libcamera/platform/log.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> using namespace libcamera; diff --git a/src/android/post_processor.h b/src/android/post_processor.h index 547fda379ed8..53220edaf24d 100644 --- a/src/android/post_processor.h +++ b/src/android/post_processor.h @@ -10,7 +10,7 @@ #include <libcamera/buffer.h> #include <libcamera/stream.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> #include "camera_buffer.h" diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index ca1ce4dc96d0..158eb3bc49e5 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -20,7 +20,7 @@ #include <libcamera/platform/log.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> #include "ipu3_agc.h" #include "ipu3_awb.h" diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build index 0d843846acde..34620024def7 100644 --- a/src/ipa/ipu3/meson.build +++ b/src/ipa/ipu3/meson.build @@ -12,7 +12,7 @@ mod = shared_module(ipa_name, [ipu3_ipa_sources, libcamera_generated_ipa_headers], name_prefix : '', include_directories : [ipa_includes, libipa_includes], - dependencies : libcamera_dep, + dependencies : [libcamera_dep, libcamera_helpers], link_with : libipa, install : true, install_dir : ipa_install_dir) diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build index 230356d3ce3a..b2ce6f3e8618 100644 --- a/src/ipa/raspberrypi/meson.build +++ b/src/ipa/raspberrypi/meson.build @@ -4,6 +4,7 @@ ipa_name = 'ipa_rpi' rpi_ipa_deps = [ libcamera_dep, + libcamera_helpers, dependency('boost'), libatomic, ] diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 90f35d970fd0..b85a1e51d757 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -26,7 +26,7 @@ #include <libcamera/platform/log.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> #include <linux/bcm2835-isp.h> diff --git a/src/libcamera-helpers/mapped_buffer.cpp b/src/libcamera-helpers/mapped_buffer.cpp new file mode 100644 index 000000000000..0d4517b62f65 --- /dev/null +++ b/src/libcamera-helpers/mapped_buffer.cpp @@ -0,0 +1,171 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * mapped_buffer.cpp - Mapped Buffer handling + */ + +#include <libcamera/helpers/mapped_buffer.h> + +#include <errno.h> +#include <string.h> +#include <sys/mman.h> +#include <unistd.h> + +#include <libcamera/platform/log.h> + +/** + * \file libcamera/helpers/mapped_buffer.h + * \brief Mapped Buffer handling + */ + +namespace libcamera { + +LOG_DEFINE_CATEGORY(MappedBuffer) + +/** + * \class MappedBuffer + * \brief Provide an interface to support managing memory mapped buffers + * + * The MappedBuffer interface provides access to a set of MappedPlanes which + * are available for access by the CPU. + * + * This class is not meant to be constructed directly, but instead derived + * classes should be used to implement the correct mapping of a source buffer. + * + * This allows treating CPU accessible memory through a generic interface + * regardless of whether it originates from a libcamera FrameBuffer or other + * source. + */ + +/** + * \typedef MappedBuffer::Plane + * \brief A mapped region of memory accessible to the CPU + * + * The MappedBuffer::Plane uses the Span interface to describe the mapped memory + * region. + */ + +/** + * \brief Construct an empty MappedBuffer + */ +MappedBuffer::MappedBuffer() + : error_(0) +{ +} + +/** + * \brief Move constructor, construct the MappedBuffer with the contents of \a + * other using move semantics + * \param[in] other The other MappedBuffer + * + * Moving a MappedBuffer moves the mappings contained in the \a other to the new + * MappedBuffer and invalidates the \a other. + * + * No mappings are unmapped or destroyed in this process. + */ +MappedBuffer::MappedBuffer(MappedBuffer &&other) +{ + *this = std::move(other); +} + +/** + * \brief Move assignment operator, replace the mappings with those of \a other +* \param[in] other The other MappedBuffer + * + * Moving a MappedBuffer moves the mappings contained in the \a other to the new + * MappedBuffer and invalidates the \a other. + * + * No mappings are unmapped or destroyed in this process. + */ +MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) +{ + error_ = other.error_; + maps_ = std::move(other.maps_); + other.error_ = -ENOENT; + + return *this; +} + +MappedBuffer::~MappedBuffer() +{ + for (Plane &map : maps_) + munmap(map.data(), map.size()); +} + +/** + * \fn MappedBuffer::isValid() + * \brief Check if the MappedBuffer instance is valid + * \return True if the MappedBuffer has valid mappings, false otherwise + */ + +/** + * \fn MappedBuffer::error() + * \brief Retrieve the map error status + * + * This function retrieves the error status from the MappedBuffer. + * The error status is a negative number as defined by errno.h. If + * no error occurred, this function returns 0. + * + * \return The map error code + */ + +/** + * \fn MappedBuffer::maps() + * \brief Retrieve the mapped planes + * + * This function retrieves the successfully mapped planes stored as a vector + * of Span<uint8_t> to provide access to the mapped memory. + * + * \return A vector of the mapped planes + */ + +/** + * \var MappedBuffer::error_ + * \brief Stores the error value if present + * + * MappedBuffer derived classes shall set this to a negative value as defined + * by errno.h if an error occured during the mapping process. + */ + +/** + * \var MappedBuffer::maps_ + * \brief Stores the internal mapped planes + * + * MappedBuffer derived classes shall store the mappings they create in this + * vector which is parsed during destruct to unmap any memory mappings which + * completed successfully. + */ + +/** + * \class MappedFrameBuffer + * \brief Map a FrameBuffer using the MappedBuffer interface + */ + +/** + * \brief Map all planes of a FrameBuffer + * \param[in] buffer FrameBuffer to be mapped + * \param[in] flags Protection flags to apply to map + * + * Construct an object to map a frame buffer for CPU access. + * The flags are passed directly to mmap and should be either PROT_READ, + * PROT_WRITE, or a bitwise-or combination of both. + */ +MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags) +{ + maps_.reserve(buffer->planes().size()); + + 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(MappedBuffer, Error) << "Failed to mmap plane"; + break; + } + + maps_.emplace_back(static_cast<uint8_t *>(address), plane.length); + } +} + +} /* namespace libcamera */ diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp index 3c862820e6e1..0a232d791fcd 100644 --- a/src/libcamera/buffer.cpp +++ b/src/libcamera/buffer.cpp @@ -6,7 +6,6 @@ */ #include <libcamera/buffer.h> -#include "libcamera/internal/buffer.h" #include <errno.h> #include <string.h> @@ -18,9 +17,6 @@ /** * \file libcamera/buffer.h * \brief Buffer handling - * - * \file libcamera/internal/buffer.h - * \brief Internal buffer handling support */ namespace libcamera { @@ -235,149 +231,4 @@ FrameBuffer::FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie) * indicate that the metadata is invalid. */ -/** - * \class MappedBuffer - * \brief Provide an interface to support managing memory mapped buffers - * - * The MappedBuffer interface provides access to a set of MappedPlanes which - * are available for access by the CPU. - * - * This class is not meant to be constructed directly, but instead derived - * classes should be used to implement the correct mapping of a source buffer. - * - * This allows treating CPU accessible memory through a generic interface - * regardless of whether it originates from a libcamera FrameBuffer or other - * source. - */ - -/** - * \typedef MappedBuffer::Plane - * \brief A mapped region of memory accessible to the CPU - * - * The MappedBuffer::Plane uses the Span interface to describe the mapped memory - * region. - */ - -/** - * \brief Construct an empty MappedBuffer - */ -MappedBuffer::MappedBuffer() - : error_(0) -{ -} - -/** - * \brief Move constructor, construct the MappedBuffer with the contents of \a - * other using move semantics - * \param[in] other The other MappedBuffer - * - * Moving a MappedBuffer moves the mappings contained in the \a other to the new - * MappedBuffer and invalidates the \a other. - * - * No mappings are unmapped or destroyed in this process. - */ -MappedBuffer::MappedBuffer(MappedBuffer &&other) -{ - *this = std::move(other); -} - -/** - * \brief Move assignment operator, replace the mappings with those of \a other -* \param[in] other The other MappedBuffer - * - * Moving a MappedBuffer moves the mappings contained in the \a other to the new - * MappedBuffer and invalidates the \a other. - * - * No mappings are unmapped or destroyed in this process. - */ -MappedBuffer &MappedBuffer::operator=(MappedBuffer &&other) -{ - error_ = other.error_; - maps_ = std::move(other.maps_); - other.error_ = -ENOENT; - - return *this; -} - -MappedBuffer::~MappedBuffer() -{ - for (Plane &map : maps_) - munmap(map.data(), map.size()); -} - -/** - * \fn MappedBuffer::isValid() - * \brief Check if the MappedBuffer instance is valid - * \return True if the MappedBuffer has valid mappings, false otherwise - */ - -/** - * \fn MappedBuffer::error() - * \brief Retrieve the map error status - * - * This function retrieves the error status from the MappedBuffer. - * The error status is a negative number as defined by errno.h. If - * no error occurred, this function returns 0. - * - * \return The map error code - */ - -/** - * \fn MappedBuffer::maps() - * \brief Retrieve the mapped planes - * - * This function retrieves the successfully mapped planes stored as a vector - * of Span<uint8_t> to provide access to the mapped memory. - * - * \return A vector of the mapped planes - */ - -/** - * \var MappedBuffer::error_ - * \brief Stores the error value if present - * - * MappedBuffer derived classes shall set this to a negative value as defined - * by errno.h if an error occured during the mapping process. - */ - -/** - * \var MappedBuffer::maps_ - * \brief Stores the internal mapped planes - * - * MappedBuffer derived classes shall store the mappings they create in this - * vector which is parsed during destruct to unmap any memory mappings which - * completed successfully. - */ - -/** - * \class MappedFrameBuffer - * \brief Map a FrameBuffer using the MappedBuffer interface - */ - -/** - * \brief Map all planes of a FrameBuffer - * \param[in] buffer FrameBuffer to be mapped - * \param[in] flags Protection flags to apply to map - * - * Construct an object to map a frame buffer for CPU access. - * The flags are passed directly to mmap and should be either PROT_READ, - * PROT_WRITE, or a bitwise-or combination of both. - */ -MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, int flags) -{ - maps_.reserve(buffer->planes().size()); - - 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); - } -} - } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index dc3fe63112d4..e6849733f979 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -29,8 +29,9 @@ #include <linux/bcm2835-isp.h> #include <linux/videodev2.h> +#include <libcamera/helpers/mapped_buffer.h> + #include "libcamera/internal/bayer_format.h" -#include "libcamera/internal/buffer.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" diff --git a/src/meson.build b/src/meson.build index 70e1a4618a0f..380de28d0f7a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -31,6 +31,7 @@ libcamera_objects = [] # libcamera must be built first as a dependency to the other components. subdir('libcamera-platform') subdir('libcamera') +subdir('libcamera-helpers') subdir('android') subdir('ipa') diff --git a/test/mapped-buffer.cpp b/test/mapped-buffer.cpp index 5de8201e45f6..218d700f40da 100644 --- a/test/mapped-buffer.cpp +++ b/test/mapped-buffer.cpp @@ -4,12 +4,11 @@ * * libcamera internal MappedBuffer tests */ - #include <iostream> #include <libcamera/framebuffer_allocator.h> -#include "libcamera/internal/buffer.h" +#include <libcamera/helpers/mapped_buffer.h> #include "camera_test.h" #include "test.h" diff --git a/test/meson.build b/test/meson.build index 045ad2a2d7c9..ee0d127cf1ec 100644 --- a/test/meson.build +++ b/test/meson.build @@ -40,7 +40,6 @@ internal_tests = [ ['file', 'file.cpp'], ['file-descriptor', 'file-descriptor.cpp'], ['hotplug-cameras', 'hotplug-cameras.cpp'], - ['mapped-buffer', 'mapped-buffer.cpp'], ['message', 'message.cpp'], ['object', 'object.cpp'], ['object-delete', 'object-delete.cpp'], @@ -53,6 +52,10 @@ internal_tests = [ ['utils', 'utils.cpp'], ] +helpers_tests = [ + ['mapped-buffer', 'mapped-buffer.cpp'], +] + foreach t : public_tests exe = executable(t[0], t[1], dependencies : libcamera_dep, @@ -70,3 +73,12 @@ foreach t : internal_tests test(t[0], exe) endforeach + +foreach t : helpers_tests + exe = executable(t[0], t[1], + dependencies : [libcamera_dep, libcamera_helpers], + link_with : test_libraries, + include_directories : test_includes_internal) + + test(t[0], exe) +endforeach
Provide a library which build support on top of the libcamera API. This currently implements the MappedBuffer and MappedFrameBuffer classes which help with lifetime management of mmapping libcamera buffers. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> --- Documentation/Doxyfile.in | 2 + .../buffer.h => helpers/mapped_buffer.h} | 10 +- include/libcamera/helpers/meson.build | 10 + include/libcamera/internal/meson.build | 1 - include/libcamera/meson.build | 1 + src/android/camera_device.h | 2 +- src/android/camera_stream.h | 2 +- src/android/jpeg/encoder_libjpeg.h | 3 +- src/android/jpeg/post_processor_jpeg.h | 2 +- src/android/jpeg/thumbnailer.h | 3 +- src/android/meson.build | 1 + src/android/mm/generic_camera_buffer.cpp | 2 +- src/android/post_processor.h | 2 +- src/ipa/ipu3/ipu3.cpp | 2 +- src/ipa/ipu3/meson.build | 2 +- src/ipa/raspberrypi/meson.build | 1 + src/ipa/raspberrypi/raspberrypi.cpp | 2 +- src/libcamera-helpers/mapped_buffer.cpp | 171 ++++++++++++++++++ src/libcamera/buffer.cpp | 149 --------------- .../pipeline/raspberrypi/raspberrypi.cpp | 3 +- src/meson.build | 1 + test/mapped-buffer.cpp | 3 +- test/meson.build | 14 +- 23 files changed, 220 insertions(+), 169 deletions(-) rename include/libcamera/{internal/buffer.h => helpers/mapped_buffer.h} (81%) create mode 100644 include/libcamera/helpers/meson.build create mode 100644 src/libcamera-helpers/mapped_buffer.cpp