[libcamera-devel] [PATCH 3/4] libcamera: camera_manager: Register cameras with the camera manager
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sun Jan 20 14:50:37 CET 2019
Hi Laurent,
On 2019-01-19 00:57:50 +0200, Laurent Pinchart wrote:
> Hi Niklas,
>
> On Fri, Jan 18, 2019 at 05:47:31PM +0100, Niklas Söderlund wrote:
> > On 2019-01-18 18:30:10 +0200, Laurent Pinchart wrote:
> > > On Fri, Jan 18, 2019 at 05:06:04PM +0100, Niklas Söderlund wrote:
> > >> On 2019-01-18 01:59:15 +0200, Laurent Pinchart wrote:
> > >>> Cameras are listed through a double indirection, first iterating over
> > >>> all available pipeline handlers, and then listing the cameras they each
> > >>> support. To simplify the API make the pipeline handlers register the
> > >>> cameras with the camera manager directly, which lets the camera manager
> > >>> easily expose the list of all available cameras.
> > >>>
> > >>> The PipelineHandler API gets simplified as the handlers don't need to
> > >>> expose the list of cameras they have created.
> > >>>
> > >>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > >>> ---
> > >>> include/libcamera/camera_manager.h | 5 ++-
> > >>> src/libcamera/camera_manager.cpp | 44 +++++++++++-------------
> > >>> src/libcamera/include/pipeline_handler.h | 6 ++--
> > >>> src/libcamera/pipeline/vimc.cpp | 30 ++++------------
> > >>> src/libcamera/pipeline_handler.cpp | 21 +++--------
> > >>> test/list-cameras.cpp | 5 +--
> > >>> 6 files changed, 40 insertions(+), 71 deletions(-)
> > >
> > > [snip]
> > >
> > >>> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> > >>> index 9806e399f92b..852e5ed70fe3 100644
> > >>> --- a/src/libcamera/camera_manager.cpp
> > >>> +++ b/src/libcamera/camera_manager.cpp
> > >
> > > [snip]
> > >
> > >>> +/**
> > >>> + * \brief Add a camera to the camera manager
> > >>> + * \param[in] camera The camera to be added
> > >>> + *
> > >>> + * This function is called by pipeline handlers to register the cameras they
> > >>> + * handle with the camera manager. Registered cameras are immediately made
> > >>> + * available to the system.
> > >>> + */
> > >>> +void CameraManager::addCamera(Camera *camera)
> > >>> +{
> > >>> + cameras_.push_back(camera);
> > >>
> > >> I wonder if we should not add a runtime check here to make sure the
> > >> camera name is unique before adding it to the vector here? The get()
> > >> function retrieves a Camera object by name there might be odd
> > >> consequences otherwise :-)
> > >
> > > Good point. I'll add
> > >
> > > for (Camera *c : cameras_) {
> > > if (c->name() == camera->name()) {
> > > LOG(Warning) << "Registering camera with duplicate name '"
> > > << camera->name() << "'";
> > > break;
> > > }
> > > }
> > >
> > > Or should it be LOG(Error) ? I don't think it should be a fatal error in
> > > any case (so no ASSERT) as it doesn't prevent from using the other
> > > cameras, or even the one with a duplicate name when retrieved directly
> > > from the vector of cameras (introduced in patch 3/4).
> >
> > I think this should be LOG(Error) and that we should not add the Camera
> > object to the list but instead return after LOG().
> >
> > I don't think it's a good idea to try and function in a state which have
> > a possibility of unknown behavior when we can in a safe way inform the
> > user that something is wrong and keep the fully functional previous
> > state. That being said, I'm not totally against your solution here and
> > if you can think of a good use-case where it's more desirable to do so I
> > would be OK with that.
>
> This would require returning an error to the pipeline handler and
> propagating (until where ?), while we can still function normally when
> multiple cameras have the same name. Only the CameraManager::get()
> function will be affected, and will return the first camera with the
> requested name. That's why I think it would be simpler for pipeline
> managers if the addCamera() call didn't fail. We should certainly log a
> warning or error as the problem should be fixed, but it won't cause us
> to fail (which is why I went for a warning originally, to denote an
> issue that is recoverable but still needs to be fixed).
>
> I expect the camera lookup API offered by the CameraManager to still
> evolve, so I think this will be revisited anyway. If you strongly think
> it needs to be addressed now then I'll see what can be done.
I'm fine with moving forward with the current solution until we get the
CameraManager API in a more stable state.
>
> > >
> > >> With this addressed,
> > >>
> > >> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > >>
> > >>> +}
> > >
> > > [snip]
>
> --
> Regards,
>
> Laurent Pinchart
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list