[libcamera-devel] [PATCH v1] pipeline: raspberrypi: Remove enum BuffferMask from the mojom interface

David Plowman david.plowman at raspberrypi.com
Wed Nov 23 12:42:21 CET 2022


Hi Naush

Thanks for this change.

On Tue, 22 Nov 2022 at 15:42, Naushir Patuck via libcamera-devel
<libcamera-devel at lists.libcamera.org> wrote:
>
> The BufferMask enum provides a way of identifying which stream a frame buffer
> belongs to. This enum is defined in the raspberrypi.mojom interface file.
> However, the IPA does not need these enum definitions to mmap buffers that it
> uses.
>
> Move this enum out of the raspberrypi.mojom interface file and put it into
> the RPi namespace visible only to the pipeline handler. This removes the
> need to include the auto-generated IPA interface header in the RPi::Stream
> definition.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>

Reviewed-by: David Plowman <david.plowman at raspberrypi.com>

Thanks!
David

> ---
>  include/libcamera/ipa/raspberrypi.mojom       |  8 --------
>  src/ipa/raspberrypi/raspberrypi.cpp           |  6 +++---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 20 +++++++++----------
>  .../pipeline/raspberrypi/rpi_stream.cpp       |  6 ++----
>  .../pipeline/raspberrypi/rpi_stream.h         | 13 +++++++++---
>  5 files changed, 25 insertions(+), 28 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
> index 40f78d9e3b3f..d53644fe296c 100644
> --- a/include/libcamera/ipa/raspberrypi.mojom
> +++ b/include/libcamera/ipa/raspberrypi.mojom
> @@ -8,14 +8,6 @@ module ipa.RPi;
>
>  import "include/libcamera/ipa/core.mojom";
>
> -enum BufferMask {
> -       MaskID                  = 0x00ffff,
> -       MaskStats               = 0x010000,
> -       MaskEmbeddedData        = 0x020000,
> -       MaskBayerData           = 0x040000,
> -       MaskExternalBuffer      = 0x100000,
> -};
> -
>  /* Size of the LS grid allocation. */
>  const uint32 MaxLsGridSize = 0x8000;
>
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index beb076dc4909..4e10c57d7f87 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -515,7 +515,7 @@ void IPARPi::signalStatReady(uint32_t bufferId)
>
>         reportMetadata();
>
> -       statsMetadataComplete.emit(bufferId & MaskID, libcameraMetadata_);
> +       statsMetadataComplete.emit(bufferId, libcameraMetadata_);
>  }
>
>  void IPARPi::signalQueueRequest(const ControlList &controls)
> @@ -534,7 +534,7 @@ void IPARPi::signalIspPrepare(const ISPConfig &data)
>         frameCount_++;
>
>         /* Ready to push the input buffer into the ISP. */
> -       runIsp.emit(data.bayerBufferId & MaskID);
> +       runIsp.emit(data.bayerBufferId);
>  }
>
>  void IPARPi::reportMetadata()
> @@ -1001,7 +1001,7 @@ void IPARPi::queueRequest(const ControlList &controls)
>
>  void IPARPi::returnEmbeddedBuffer(unsigned int bufferId)
>  {
> -       embeddedComplete.emit(bufferId & MaskID);
> +       embeddedComplete.emit(bufferId);
>  }
>
>  void IPARPi::prepareISP(const ISPConfig &data)
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 087c71b65700..0e0b71945640 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1484,10 +1484,10 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
>          * Pass the stats and embedded data buffers to the IPA. No other
>          * buffers need to be passed.
>          */
> -       mapBuffers(camera, data->isp_[Isp::Stats].getBuffers(), ipa::RPi::MaskStats);
> +       mapBuffers(camera, data->isp_[Isp::Stats].getBuffers(), RPi::MaskStats);
>         if (data->sensorMetadata_)
>                 mapBuffers(camera, data->unicam_[Unicam::Embedded].getBuffers(),
> -                          ipa::RPi::MaskEmbeddedData);
> +                          RPi::MaskEmbeddedData);
>
>         return 0;
>  }
> @@ -1727,7 +1727,7 @@ void RPiCameraData::statsMetadataComplete(uint32_t bufferId, const ControlList &
>         if (!isRunning())
>                 return;
>
> -       FrameBuffer *buffer = isp_[Isp::Stats].getBuffers().at(bufferId);
> +       FrameBuffer *buffer = isp_[Isp::Stats].getBuffers().at(bufferId & RPi::MaskID);
>
>         handleStreamBuffer(buffer, &isp_[Isp::Stats]);
>
> @@ -1763,9 +1763,9 @@ void RPiCameraData::runIsp(uint32_t bufferId)
>         if (!isRunning())
>                 return;
>
> -       FrameBuffer *buffer = unicam_[Unicam::Image].getBuffers().at(bufferId);
> +       FrameBuffer *buffer = unicam_[Unicam::Image].getBuffers().at(bufferId & RPi::MaskID);
>
> -       LOG(RPI, Debug) << "Input re-queue to ISP, buffer id " << bufferId
> +       LOG(RPI, Debug) << "Input re-queue to ISP, buffer id " << (bufferId & RPi::MaskID)
>                         << ", timestamp: " << buffer->metadata().timestamp;
>
>         isp_[Isp::Input].queueBuffer(buffer);
> @@ -1778,7 +1778,7 @@ void RPiCameraData::embeddedComplete(uint32_t bufferId)
>         if (!isRunning())
>                 return;
>
> -       FrameBuffer *buffer = unicam_[Unicam::Embedded].getBuffers().at(bufferId);
> +       FrameBuffer *buffer = unicam_[Unicam::Embedded].getBuffers().at(bufferId & RPi::MaskID);
>         handleStreamBuffer(buffer, &unicam_[Unicam::Embedded]);
>         handleState();
>  }
> @@ -1931,7 +1931,7 @@ void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)
>          * application until after the IPA signals so.
>          */
>         if (stream == &isp_[Isp::Stats]) {
> -               ipa_->signalStatReady(ipa::RPi::MaskStats | static_cast<unsigned int>(index));
> +               ipa_->signalStatReady(RPi::MaskStats | static_cast<unsigned int>(index));
>         } else {
>                 /* Any other ISP output can be handed back to the application now. */
>                 handleStreamBuffer(buffer, stream);
> @@ -2006,7 +2006,7 @@ void RPiCameraData::handleExternalBuffer(FrameBuffer *buffer, RPi::Stream *strea
>  {
>         unsigned int id = stream->getBufferId(buffer);
>
> -       if (!(id & ipa::RPi::MaskExternalBuffer))
> +       if (!(id & RPi::MaskExternalBuffer))
>                 return;
>
>         /* Stop the Stream object from tracking the buffer. */
> @@ -2174,13 +2174,13 @@ void RPiCameraData::tryRunPipeline()
>                         << " Bayer buffer id: " << bayerId;
>
>         ipa::RPi::ISPConfig ispPrepare;
> -       ispPrepare.bayerBufferId = ipa::RPi::MaskBayerData | bayerId;
> +       ispPrepare.bayerBufferId = RPi::MaskBayerData | bayerId;
>         ispPrepare.controls = std::move(bayerFrame.controls);
>
>         if (embeddedBuffer) {
>                 unsigned int embeddedId = unicam_[Unicam::Embedded].getBufferId(embeddedBuffer);
>
> -               ispPrepare.embeddedBufferId = ipa::RPi::MaskEmbeddedData | embeddedId;
> +               ispPrepare.embeddedBufferId = RPi::MaskEmbeddedData | embeddedId;
>                 ispPrepare.embeddedBufferPresent = true;
>
>                 LOG(RPI, Debug) << "Signalling signalIspPrepare:"
> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> index 79f7be130ed4..2bb10f25d6ca 100644
> --- a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
> @@ -8,8 +8,6 @@
>
>  #include <libcamera/base/log.h>
>
> -#include <libcamera/ipa/raspberrypi_ipa_interface.h>
> -
>  namespace libcamera {
>
>  LOG_DEFINE_CATEGORY(RPISTREAM)
> @@ -74,7 +72,7 @@ int Stream::getBufferId(FrameBuffer *buffer) const
>
>  void Stream::setExternalBuffer(FrameBuffer *buffer)
>  {
> -       bufferMap_.emplace(ipa::RPi::MaskExternalBuffer | id_.get(), buffer);
> +       bufferMap_.emplace(BufferMask::MaskExternalBuffer | id_.get(), buffer);
>  }
>
>  void Stream::removeExternalBuffer(FrameBuffer *buffer)
> @@ -82,7 +80,7 @@ void Stream::removeExternalBuffer(FrameBuffer *buffer)
>         int id = getBufferId(buffer);
>
>         /* Ensure we have this buffer in the stream, and it is marked external. */
> -       ASSERT(id != -1 && (id & ipa::RPi::MaskExternalBuffer));
> +       ASSERT(id != -1 && (id & BufferMask::MaskExternalBuffer));
>         bufferMap_.erase(id);
>  }
>
> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.h b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> index 3c0b5c8ebab4..b8bd79cf1535 100644
> --- a/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
> @@ -12,7 +12,6 @@
>  #include <unordered_map>
>  #include <vector>
>
> -#include <libcamera/ipa/raspberrypi_ipa_interface.h>
>  #include <libcamera/stream.h>
>
>  #include "libcamera/internal/v4l2_videodevice.h"
> @@ -23,6 +22,14 @@ namespace RPi {
>
>  using BufferMap = std::unordered_map<unsigned int, FrameBuffer *>;
>
> +enum BufferMask {
> +       MaskID                  = 0x00ffff,
> +       MaskStats               = 0x010000,
> +       MaskEmbeddedData        = 0x020000,
> +       MaskBayerData           = 0x040000,
> +       MaskExternalBuffer      = 0x100000,
> +};
> +
>  /*
>   * Device stream abstraction for either an internal or external stream.
>   * Used for both Unicam and the ISP.
> @@ -31,13 +38,13 @@ class Stream : public libcamera::Stream
>  {
>  public:
>         Stream()
> -               : id_(ipa::RPi::MaskID)
> +               : id_(BufferMask::MaskID)
>         {
>         }
>
>         Stream(const char *name, MediaEntity *dev, bool importOnly = false)
>                 : external_(false), importOnly_(importOnly), name_(name),
> -                 dev_(std::make_unique<V4L2VideoDevice>(dev)), id_(ipa::RPi::MaskID)
> +                 dev_(std::make_unique<V4L2VideoDevice>(dev)), id_(BufferMask::MaskID)
>         {
>         }
>
> --
> 2.25.1
>


More information about the libcamera-devel mailing list