[libcamera-devel] [PATCH 1/3] libcamera: ipu3: Move link disabling at configure time

Jacopo Mondi jacopo at jmondi.org
Tue Jul 16 08:23:30 CEST 2019


Hi Laurent,

On Mon, Jul 15, 2019 at 09:41:35AM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Mon, Jul 15, 2019 at 07:59:33AM +0200, Jacopo Mondi wrote:
> > With the current IPU3 kernel driver implementation, if links are enabled on
> > an ImgU pipe buffers should be queued on its output devices in order not to
> > block the other pipe.
> >
> > Currently all links on the ImgU device are disabled at match() time,
> > implying that once an ImgU pipe gets linked, it should be used until the
> > whole pipeline handler is not re-matched and links disabled again. This is a
> > severe limitation for applications that wants to switch between cameras
> > using different pipes without going through a full library tear-down and
> > re-initialization.
> >
> > Move the link disabling at configure() time, so that a camera
> > configuration operation always unlock the usage of the assigned pipe,
> > regardless of the status of the one previously in use.
> >
> > Unfortunately this requires a camera start/stop sequence to always go
> > through a configure step, a requirement that is not enforced by the
> > Camera state machine.
>
> How about disabling links in both match() and stop() then ?

Fine with match() as starting with a clean media device is desirable
(I'll move the comment here anyway).

If we move this at stop() time though, a start->stop->start sequence
would always fail, so I would avoid that.

Thanks
  j

>
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 55 +++++++++++++++-------------
> >  1 file changed, 29 insertions(+), 26 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 22987dbf1460..5204487684c2 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -496,6 +496,35 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> >  	ImgUDevice *imgu = data->imgu_;
> >  	int ret;
> >
> > +	/*
> > +	 * FIXME: enabled links in one ImgU pipe interfere with capture
> > +	 * operations on the other one. This can be easily triggered by
> > +	 * capturing from one camera and then trying to capture from the other
> > +	 * one right after, without disabling media links on the first  pipe.
> > +	 *
> > +	 * The tricky part here is where to disable links on the ImgU instance
> > +	 * which is currently not in use:
> > +	 * 1) Link enable/disable cannot be done at start()/stop() time as video
> > +	 * devices needs to be linked first before format can be configured on
> > +	 * them.
> > +	 * 2) As link enable has to be done at the least in configure(),
> > +	 * before configuring formats, the only place where to disable links
> > +	 * would be 'stop()', but the Camera class state machine allows
> > +	 * start()<->stop() sequences without any configure() in between.
> > +	 *
> > +	 * As of now, disable all links in the ImgU media graph before
> > +	 * configuring the device, to allow alternate usage of two pipes.
> > +	 *
> > +	 * As a consequence, a Camera using an ImgU shall be configured before
> > +	 * any start()/stop() sequence. An application that wants to
> > +	 * pre-configure all the camera and then start/stop them alternatively
> > +	 * without going through any re-configuration (a sequence that is
> > +	 * allowed by the Camera state machine) would now fail on the IPU3.
> > +	 */
> > +	ret = imguMediaDev_->disableLinks();
> > +	if (ret)
> > +		return ret;
> > +
> >  	/*
> >  	 * \todo: Enable links selectively based on the requested streams.
> >  	 * As of now, enable all links unconditionally.
> > @@ -778,32 +807,6 @@ bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
> >  	if (cio2MediaDev_->disableLinks())
> >  		return false;
> >
> > -	/*
> > -	 * FIXME: enabled links in one ImgU instance interfere with capture
> > -	 * operations on the other one. This can be easily triggered by
> > -	 * capturing from one camera and then trying to capture from the other
> > -	 * one right after, without disabling media links in the media graph
> > -	 * first.
> > -	 *
> > -	 * The tricky part here is where to disable links on the ImgU instance
> > -	 * which is currently not in use:
> > -	 * 1) Link enable/disable cannot be done at start/stop time as video
> > -	 * devices needs to be linked first before format can be configured on
> > -	 * them.
> > -	 * 2) As link enable has to be done at the least in configure(),
> > -	 * before configuring formats, the only place where to disable links
> > -	 * would be 'stop()', but the Camera class state machine allows
> > -	 * start()<->stop() sequences without any configure() in between.
> > -	 *
> > -	 * As of now, disable all links in the media graph at 'match()' time,
> > -	 * to allow testing different cameras in different test applications
> > -	 * runs. A test application that would use two distinct cameras without
> > -	 * going through a library teardown->match() sequence would fail
> > -	 * at the moment.
> > -	 */
> > -	ret = imguMediaDev_->disableLinks();
> > -	if (ret)
> > -		return ret;
> >
> >  	ret = registerCameras();
> >
>
> --
> Regards,
>
> Laurent Pinchart
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190716/76db2ab2/attachment-0001.sig>


More information about the libcamera-devel mailing list