[libcamera-devel] [RFC 0/2] Add support for pipeline specific data to Cameras

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Jan 23 11:09:22 CET 2019


Hi Niklas,

On Wed, Jan 23, 2019 at 01:07:58AM +0100, Niklas Söderlund wrote:
> On 2019-01-22 19:12:23 +0100, Jacopo Mondi wrote:
> > RFC as I'm not sure about the idea of delegating ownership of platform data
> > to Cameras, as that requires the pipeline handler to dynamically allocate the
> > resources (if they go away at pipeline handler destruction time, is pointless
> > to store them in Camera).
> > 
> > The other way around is the idea of borrowing pipeline handler data to Cameras,
> > but as Cameras are shared objects, they might stay around longer that pipeline
> > handlers, and thus I felt it is safer to tie the CameraData lifetime to the one
> > of the Camera instance they're associated to.
> 
> While working with the Camera API and it's interaction with the pipeline 
> handler I felt a need for something similar you have here. My initial 
> idea to avoid lifetime management issues which you deal with in this 
> series was for the PipelineHandler to be able to set a unsigned int as a 
> cookie on the Camera at creation time, which it could retrieve with it's 
> later interaction with a Camera object.
> 
> In the end I went a different way, as it became clear we would need an 
> two way association between the Camera and the PipelineHandler anyhow.  
> That is the PipelineHandler would need to keep a reference to the 
> Camera, so I ended up using the pointer to the Camera object as the 
> cookie as this like a numerical cookie avoids all lifetime issues. That 
> way whenever a PipelineHandler is handed a Camera object it can use the 
> pointer to
> 
> 1. Validate that the Camera object in question really is its 
>    responsibility to handle.

Given that all calls to the pipeline handler will go through the Camera
object, I think any such validation should be done there to avoid
duplicating code in pipeline handlers. Furthermore, as the Camera object
will need to store a pointer to the pipeline handler in order to
firmward the calls, I don't see how we could get it wrong :-)

> 2. Use the pointer as a cookie to look-up any camera specific data in 
>    its private data structures.

This would require all pipeline handlers to implement the equivalent of
a std::map<Camera *, PrivateData *>. Isn't Jacopo's approach simpler as
it moves this to a pointer in the Camera object itself, avoiding lookup
code duplication in the pipeline handlers.

> I think that is quiet neat as it uses infrastructure we need anyhow to 
> properly manage the interactions between the two objects.
> 
> > Jacopo Mondi (2):
> >   libcamera: camera: Add CameraData
> >   libcamera: ipu3: Create CIO2 V4L2 devices
> > 
> >  include/libcamera/camera.h           | 13 ++++++++
> >  src/libcamera/camera.cpp             | 50 ++++++++++++++++++++++++++++
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 42 +++++++++++++++++++++++
> >  3 files changed, 105 insertions(+)
> > 

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list