[libcamera-devel] [PATCH 02/13] libcamera: pipeline: Move IPA from pipeline to camera data
Niklas Söderlund
niklas.soderlund at ragnatech.se
Thu Aug 29 19:49:53 CEST 2019
Hi Kieran,
Thanks for your feedback.
On 2019-08-29 14:52:28 +0100, Kieran Bingham wrote:
> Hi Niklas,
>
> On 28/08/2019 02:16, Niklas Söderlund wrote:
> > The IPA acts on a camera and not on a pipeline which can expose more
> > then once camera. Move the IPA reference to the CameraData and move the
>
> s/once/one/
>
>
> > loading of an IPA from the specific pipeline handler implementation to
> > base PipelineHandler.
>
> This sounds like a good thing, and removes the code duplication for
> loading IPAs.
>
> > It's still possible to expose a camera without an IPA but if an IPA is
> > request the camera is not valid and will not be registered in the system
> > if a suiting IPA module can't be found.
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> > src/libcamera/include/pipeline_handler.h | 12 ++++++--
> > src/libcamera/pipeline/vimc.cpp | 10 +-----
> > src/libcamera/pipeline_handler.cpp | 39 +++++++++++++++++++++++-
> > 3 files changed, 49 insertions(+), 12 deletions(-)
> >
> > diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
> > index 1fdef9cea40f1f0a..ffc7adb802215313 100644
> > --- a/src/libcamera/include/pipeline_handler.h
> > +++ b/src/libcamera/include/pipeline_handler.h
> > @@ -15,6 +15,7 @@
> > #include <vector>
> >
> > #include <libcamera/controls.h>
> > +#include <libcamera/ipa/ipa_interface.h>
> > #include <libcamera/stream.h>
> >
> > namespace libcamera {
> > @@ -33,8 +34,11 @@ class Request;
> > class CameraData
> > {
> > public:
> > - explicit CameraData(PipelineHandler *pipe)
> > - : pipe_(pipe)
> > + explicit CameraData(PipelineHandler *pipe,
> > + uint32_t minIPAVersion = 0,
> > + uint32_t maxIPAVersion = 0)
> > + : pipe_(pipe), ipa_(nullptr), minIPAVersion_(minIPAVersion),
> > + maxIPAVersion_(maxIPAVersion)
> > {
> > }
> > virtual ~CameraData() {}
> > @@ -44,6 +48,10 @@ public:
> > std::list<Request *> queuedRequests_;
> > ControlInfoMap controlInfo_;
> >
> > + std::unique_ptr<IPAInterface> ipa_;
>
> Is this ok to be public? Or should it be more restricted?
>
> > + const uint32_t minIPAVersion_;
> > + const uint32_t maxIPAVersion_;
>
> And these?
>
> Hrm ... looking at CameraData - we treat it as an internal 'public'
> object anyway, so I guess it's matching the existing precedence on that
> class.
Yes I think in the future we might strict up the access around
CameraData, but for now I think this is sane. It follows what we already
do and it's not visible to the application.
>
>
> > +
> > private:
> > CameraData(const CameraData &) = delete;
> > CameraData &operator=(const CameraData &) = delete;
> > diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> > index e5c4890501db71c8..be6507cd4bc0d1b9 100644
> > --- a/src/libcamera/pipeline/vimc.cpp
> > +++ b/src/libcamera/pipeline/vimc.cpp
> > @@ -38,7 +38,7 @@ class VimcCameraData : public CameraData
> > {
> > public:
> > VimcCameraData(PipelineHandler *pipe)
> > - : CameraData(pipe), sensor_(nullptr), debayer_(nullptr),
> > + : CameraData(pipe, 1, 1), sensor_(nullptr), debayer_(nullptr),
> > scaler_(nullptr), video_(nullptr), raw_(nullptr)
> > {
> > }
> > @@ -100,8 +100,6 @@ private:
> > return static_cast<VimcCameraData *>(
> > PipelineHandler::cameraData(camera));
> > }
> > -
> > - std::unique_ptr<IPAInterface> ipa_;
> > };
> >
> > VimcCameraConfiguration::VimcCameraConfiguration()
> > @@ -361,12 +359,6 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
> > if (!media)
> > return false;
> >
> > - ipa_ = IPAManager::instance()->createIPA(this, 1, 1);
> > - if (ipa_ == nullptr)
> > - LOG(VIMC, Warning) << "no matching IPA found";
> > - else
> > - ipa_->init();
> > -
> > std::unique_ptr<VimcCameraData> data = utils::make_unique<VimcCameraData>(this);
> >
> > /* Locate and open the capture video node. */
> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > index 3e54aa23d92b9a36..89b67806597728f9 100644
> > --- a/src/libcamera/pipeline_handler.cpp
> > +++ b/src/libcamera/pipeline_handler.cpp
> > @@ -12,6 +12,7 @@
> > #include <libcamera/camera_manager.h>
> >
> > #include "device_enumerator.h"
> > +#include "ipa_manager.h"
> > #include "log.h"
> > #include "media_device.h"
> > #include "utils.h"
> > @@ -49,13 +50,20 @@ LOG_DEFINE_CATEGORY(Pipeline)
> > */
> >
> > /**
> > - * \fn CameraData::CameraData(PipelineHandler *pipe)
> > + * \fn CameraData::CameraData(PipelineHandler *pipe, uint32_t minIPAVersion,
> > + * uint32_t maxIPAVersion)
> > * \brief Construct a CameraData instance for the given pipeline handler
> > * \param[in] pipe The pipeline handler
> > + * \param[in] minIPAVersion Minimum acceptable version of IPA module
> > + * \param[in] maxIPAVersion Maximum acceptable version of IPA module
> > *
> > * The reference to the pipeline handler is stored internally, the caller shall
> > * guarantee that the pointer remains valid as long as the CameraData instance
> > * exists.
> > + *
> > + * The IPA maximum and minimum version numbers are used to match with an IPA
> > + * interface that would be compatible with the Camera. If no IPA interface
> > + * is needed for the camera both parameters should be set to 0.
> > */
> >
> > /**
> > @@ -96,6 +104,24 @@ LOG_DEFINE_CATEGORY(Pipeline)
> > * creating the camera, and shall not be modified afterwards.
> > */
> >
> > +/**
> > + * \var CameraData::ipa_
> > + * \brief The IPA module used by the camera
> > + *
> > + * Reference to the Image Processing Algorithms (IPA) operating on the camera's
> > + * stream(s). If no IPA are in operation this should be set to nullptr.
>
> I'm not sure how to handle the pluralism there. I interpret "IPA" as
> singular, which would mean this should read "If no IPA is in operation..."
>
> But you do define IPA as "...Algorithms" ... but I'm not sure the
> acronym can convey the pluralism, so it would have to be "If no IPAs are
> in operation..."
>
> A bit of googling makes me believe we should pluralise the acronym,
> making it the "If no IPAs are in operation..." option.
Good point.
Do you still think the definition, 'Image Processing Algorithms (IPA)'
is OK?
>
> > + */
> > +
> > +/**
> > + * \var CameraData::minIPAVersion_
> > + * \brief Minimum acceptable version of IPA module
> > + */
> > +
> > +/**
> > + * \var CameraData::maxIPAVersion_
> > + * \brief Maximum acceptable version of IPA module
> > + */
> > +
> > /**
> > * \class PipelineHandler
> > * \brief Create and manage cameras based on a set of media devices
> > @@ -424,6 +450,17 @@ void PipelineHandler::completeRequest(Camera *camera, Request *request)
> > void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera,
> > std::unique_ptr<CameraData> data)
> > {
> > + if (data->minIPAVersion_ || data->maxIPAVersion_) {
> > + data->ipa_ = IPAManager::instance()->createIPA(this,
> > + data->minIPAVersion_,
> > + data->maxIPAVersion_);
> > + if (!data->ipa_) {
> > + LOG(Pipeline, Warning) << "Skipping " << camera->name()
> > + << " no IPA found";
> > + return;
> > + }
> > + }
> > +
>
> The code removed from VIMC calls:
>
> > - ipa_->init();
>
> Shouldn't that be added here somewhere?
> Or is that going to happen somewhere else?
>
>
> Do we need to manually init() an ipa? Can't that happen as part of
> createIPA() ?
>
>
> With the correct resolution for the missing data->ipa_->init() call,
> which perhaps is handled elsewhere, or can be added if required:
The IPAInterface::init() function is removed in patch 10/13. As it never
preformed anything useful (other then printing hello world) it was not
noticed when testing. I will create a separate patch where it's removed
before this patch in the series to make things clear, thanks for
spotting this!
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>
> > data->camera_ = camera.get();
> > cameraData_[camera.get()] = std::move(data);
> > cameras_.push_back(camera);
> >
>
> --
> Regards
> --
> Kieran
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list