summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libcamera/internal/framebuffer.h34
-rw-r--r--include/libcamera/internal/mapped_framebuffer.h52
-rw-r--r--include/libcamera/internal/meson.build1
-rw-r--r--src/android/camera_device.h2
-rw-r--r--src/android/camera_stream.cpp2
-rw-r--r--src/android/camera_stream.h2
-rw-r--r--src/android/jpeg/encoder_libjpeg.cpp1
-rw-r--r--src/android/jpeg/encoder_libjpeg.h1
-rw-r--r--src/android/jpeg/post_processor_jpeg.h2
-rw-r--r--src/android/jpeg/thumbnailer.cpp2
-rw-r--r--src/android/jpeg/thumbnailer.h2
-rw-r--r--src/android/mm/generic_camera_buffer.cpp3
-rw-r--r--src/android/post_processor.h2
-rw-r--r--src/android/yuv/post_processor_yuv.cpp1
-rw-r--r--src/ipa/ipu3/ipu3.cpp2
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp2
-rw-r--r--src/libcamera/framebuffer.cpp150
-rw-r--r--src/libcamera/mapped_framebuffer.cpp169
-rw-r--r--src/libcamera/meson.build1
-rw-r--r--test/mapped-buffer.cpp2
20 files changed, 235 insertions, 198 deletions
diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h
index 8c187adf..606aed2b 100644
--- a/include/libcamera/internal/framebuffer.h
+++ b/include/libcamera/internal/framebuffer.h
@@ -7,46 +7,12 @@
#ifndef __LIBCAMERA_INTERNAL_FRAMEBUFFER_H__
#define __LIBCAMERA_INTERNAL_FRAMEBUFFER_H__
-#include <sys/mman.h>
-#include <vector>
-
#include <libcamera/base/class.h>
-#include <libcamera/base/span.h>
#include <libcamera/framebuffer.h>
namespace libcamera {
-class MappedBuffer
-{
-public:
- using Plane = Span<uint8_t>;
-
- ~MappedBuffer();
-
- MappedBuffer(MappedBuffer &&other);
- MappedBuffer &operator=(MappedBuffer &&other);
-
- bool isValid() const { return error_ == 0; }
- int error() const { return error_; }
- const std::vector<Plane> &maps() const { return maps_; }
-
-protected:
- MappedBuffer();
-
- int error_;
- std::vector<Plane> maps_;
-
-private:
- LIBCAMERA_DISABLE_COPY(MappedBuffer)
-};
-
-class MappedFrameBuffer : public MappedBuffer
-{
-public:
- MappedFrameBuffer(const FrameBuffer *buffer, int flags);
-};
-
class FrameBuffer::Private : public Extensible::Private
{
LIBCAMERA_DECLARE_PUBLIC(FrameBuffer)
diff --git a/include/libcamera/internal/mapped_framebuffer.h b/include/libcamera/internal/mapped_framebuffer.h
new file mode 100644
index 00000000..41e58736
--- /dev/null
+++ b/include/libcamera/internal/mapped_framebuffer.h
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * mapped_framebuffer.h - Frame buffer memory mapping support
+ */
+#ifndef __LIBCAMERA_INTERNAL_MAPPED_FRAMEBUFFER_H__
+#define __LIBCAMERA_INTERNAL_MAPPED_FRAMEBUFFER_H__
+
+#include <sys/mman.h>
+#include <vector>
+
+#include <libcamera/base/class.h>
+#include <libcamera/base/span.h>
+
+#include <libcamera/framebuffer.h>
+
+namespace libcamera {
+
+class MappedBuffer
+{
+public:
+ using Plane = Span<uint8_t>;
+
+ ~MappedBuffer();
+
+ MappedBuffer(MappedBuffer &&other);
+ MappedBuffer &operator=(MappedBuffer &&other);
+
+ bool isValid() const { return error_ == 0; }
+ int error() const { return error_; }
+ const std::vector<Plane> &maps() const { return maps_; }
+
+protected:
+ MappedBuffer();
+
+ int error_;
+ std::vector<Plane> maps_;
+
+private:
+ LIBCAMERA_DISABLE_COPY(MappedBuffer)
+};
+
+class MappedFrameBuffer : public MappedBuffer
+{
+public:
+ MappedFrameBuffer(const FrameBuffer *buffer, int flags);
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_INTERNAL_MAPPED_FRAMEBUFFER_H__ */
diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
index dac1a2d3..665fd6de 100644
--- a/include/libcamera/internal/meson.build
+++ b/include/libcamera/internal/meson.build
@@ -28,6 +28,7 @@ libcamera_internal_headers = files([
'ipa_module.h',
'ipa_proxy.h',
'ipc_unixsocket.h',
+ 'mapped_framebuffer.h',
'media_device.h',
'media_object.h',
'pipeline_handler.h',
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 089a6204..dd9aebba 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -24,8 +24,6 @@
#include <libcamera/request.h>
#include <libcamera/stream.h>
-#include "libcamera/internal/framebuffer.h"
-
#include "camera_capabilities.h"
#include "camera_metadata.h"
#include "camera_stream.h"
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index bf4a7b41..61b44183 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -7,6 +7,8 @@
#include "camera_stream.h"
+#include <sys/mman.h>
+
#include "camera_buffer.h"
#include "camera_device.h"
#include "camera_metadata.h"
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index 629d9e00..2dab6c3a 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -19,8 +19,6 @@
#include <libcamera/geometry.h>
#include <libcamera/pixel_format.h>
-#include "libcamera/internal/framebuffer.h"
-
class CameraDevice;
class CameraMetadata;
class PostProcessor;
diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
index e6358ca9..372018d2 100644
--- a/src/android/jpeg/encoder_libjpeg.cpp
+++ b/src/android/jpeg/encoder_libjpeg.cpp
@@ -23,6 +23,7 @@
#include <libcamera/pixel_format.h>
#include "libcamera/internal/formats.h"
+#include "libcamera/internal/mapped_framebuffer.h"
using namespace libcamera;
diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
index 14bf8922..61fbd1a6 100644
--- a/src/android/jpeg/encoder_libjpeg.h
+++ b/src/android/jpeg/encoder_libjpeg.h
@@ -10,7 +10,6 @@
#include "encoder.h"
#include "libcamera/internal/formats.h"
-#include "libcamera/internal/framebuffer.h"
#include <jpeglib.h>
diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h
index 5c399be9..6fd31022 100644
--- a/src/android/jpeg/post_processor_jpeg.h
+++ b/src/android/jpeg/post_processor_jpeg.h
@@ -13,8 +13,6 @@
#include <libcamera/geometry.h>
-#include "libcamera/internal/framebuffer.h"
-
class CameraDevice;
class PostProcessorJpeg : public PostProcessor
diff --git a/src/android/jpeg/thumbnailer.cpp b/src/android/jpeg/thumbnailer.cpp
index 5cb00744..535e2cec 100644
--- a/src/android/jpeg/thumbnailer.cpp
+++ b/src/android/jpeg/thumbnailer.cpp
@@ -11,6 +11,8 @@
#include <libcamera/formats.h>
+#include "libcamera/internal/mapped_framebuffer.h"
+
using namespace libcamera;
LOG_DEFINE_CATEGORY(Thumbnailer)
diff --git a/src/android/jpeg/thumbnailer.h b/src/android/jpeg/thumbnailer.h
index 68cbf743..4d086c49 100644
--- a/src/android/jpeg/thumbnailer.h
+++ b/src/android/jpeg/thumbnailer.h
@@ -7,10 +7,10 @@
#ifndef __ANDROID_JPEG_THUMBNAILER_H__
#define __ANDROID_JPEG_THUMBNAILER_H__
+#include <libcamera/framebuffer.h>
#include <libcamera/geometry.h>
#include "libcamera/internal/formats.h"
-#include "libcamera/internal/framebuffer.h"
class Thumbnailer
{
diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp
index 2a4b77ea..b3af194c 100644
--- a/src/android/mm/generic_camera_buffer.cpp
+++ b/src/android/mm/generic_camera_buffer.cpp
@@ -7,11 +7,12 @@
#include "../camera_buffer.h"
+#include <sys/mman.h>
#include <unistd.h>
#include <libcamera/base/log.h>
-#include "libcamera/internal/framebuffer.h"
+#include "libcamera/internal/mapped_framebuffer.h"
using namespace libcamera;
diff --git a/src/android/post_processor.h b/src/android/post_processor.h
index 689f85d9..ab2b2c60 100644
--- a/src/android/post_processor.h
+++ b/src/android/post_processor.h
@@ -10,8 +10,6 @@
#include <libcamera/framebuffer.h>
#include <libcamera/stream.h>
-#include "libcamera/internal/framebuffer.h"
-
#include "camera_buffer.h"
class CameraMetadata;
diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
index 772e805b..509d4244 100644
--- a/src/android/yuv/post_processor_yuv.cpp
+++ b/src/android/yuv/post_processor_yuv.cpp
@@ -16,6 +16,7 @@
#include <libcamera/pixel_format.h>
#include "libcamera/internal/formats.h"
+#include "libcamera/internal/mapped_framebuffer.h"
using namespace libcamera;
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 9f6694ed..38992a98 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -20,7 +20,7 @@
#include <libcamera/ipa/ipu3_ipa_interface.h>
#include <libcamera/request.h>
-#include "libcamera/internal/framebuffer.h"
+#include "libcamera/internal/mapped_framebuffer.h"
#include "ipu3_agc.h"
#include "ipu3_awb.h"
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 69d36b7d..e74bd8c7 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -28,7 +28,7 @@
#include <libcamera/ipa/raspberrypi_ipa_interface.h>
#include <libcamera/request.h>
-#include "libcamera/internal/framebuffer.h"
+#include "libcamera/internal/mapped_framebuffer.h"
#include "agc_algorithm.hpp"
#include "agc_status.h"
diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
index 41e6e68f..42c73134 100644
--- a/src/libcamera/framebuffer.cpp
+++ b/src/libcamera/framebuffer.cpp
@@ -8,11 +8,6 @@
#include <libcamera/framebuffer.h>
#include "libcamera/internal/framebuffer.h"
-#include <errno.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
#include <libcamera/base/log.h>
/**
@@ -251,149 +246,4 @@ Request *FrameBuffer::request() const
* 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/mapped_framebuffer.cpp b/src/libcamera/mapped_framebuffer.cpp
new file mode 100644
index 00000000..4ace400c
--- /dev/null
+++ b/src/libcamera/mapped_framebuffer.cpp
@@ -0,0 +1,169 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * mapped_framebuffer.cpp - Mapped Framebuffer support
+ */
+
+#include "libcamera/internal/mapped_framebuffer.h"
+
+#include <errno.h>
+#include <sys/mman.h>
+
+#include <libcamera/base/log.h>
+
+/**
+ * \file libcamera/internal/mapped_framebuffer.h
+ * \brief Frame buffer memory mapping support
+ */
+
+namespace libcamera {
+
+LOG_DECLARE_CATEGORY(Buffer)
+
+/**
+ * \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/meson.build b/src/libcamera/meson.build
index 4f085801..e9230b98 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -28,6 +28,7 @@ libcamera_sources = files([
'ipc_pipe.cpp',
'ipc_pipe_unixsocket.cpp',
'ipc_unixsocket.cpp',
+ 'mapped_framebuffer.cpp',
'media_device.cpp',
'media_object.cpp',
'pipeline_handler.cpp',
diff --git a/test/mapped-buffer.cpp b/test/mapped-buffer.cpp
index c9479194..a3d1511b 100644
--- a/test/mapped-buffer.cpp
+++ b/test/mapped-buffer.cpp
@@ -9,7 +9,7 @@
#include <libcamera/framebuffer_allocator.h>
-#include "libcamera/internal/framebuffer.h"
+#include "libcamera/internal/mapped_framebuffer.h"
#include "camera_test.h"
#include "test.h"