[libcamera-devel] [PATCH 08/10] libcamera: pipelines: Align where to call base class queueRequest()
Niklas Söderlund
niklas.soderlund at ragnatech.se
Wed Nov 20 02:47:23 CET 2019
Hi Jacopo and Laurent,
Thanks for your feedback.
On 2019-11-18 13:39:12 +0200, Laurent Pinchart wrote:
> Hi Niklas,
>
> Thank you for the patch.
>
> On Mon, Oct 28, 2019 at 03:22:22AM +0100, Niklas Söderlund wrote:
> > The PipelineHandler base class queueRequest() where called at different
>
> s/where called/is called/ ?
>
> > points in different pipeline handlers. Align where they are called to
> > make it easier to read different pipeline implementations.
>
> s/pipeline/pipeline handler/
>
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> > src/libcamera/pipeline/ipu3/ipu3.cpp | 5 +++--
> > src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 +---
> > src/libcamera/pipeline/uvcvideo.cpp | 4 +---
> > src/libcamera/pipeline/vimc.cpp | 4 +---
> > 4 files changed, 6 insertions(+), 11 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 8d3ad568d16e9f8f..06ee6ccac641eb41 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -768,9 +768,10 @@ int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request)
> > error = ret;
> > }
> >
> > - PipelineHandler::queueRequest(camera, request);
> > + if (error)
> > + return error;
>
> Should we instead return an error immediately in the above loop instead
> of continuing ?
>
> >
> > - return error;
> > + return PipelineHandler::queueRequest(camera, request);
> > }
> >
> > bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index 7a28b03b8d38c8b9..a99df4f8b846d8b7 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -814,8 +814,6 @@ int PipelineHandlerRkISP1::queueRequest(Camera *camera, Request *request)
> > RkISP1CameraData *data = cameraData(camera);
> > Stream *stream = &data->stream_;
> >
> > - PipelineHandler::queueRequest(camera, request);
> > -
> > RkISP1FrameInfo *info = data->frameInfo_.create(data->frame_, request,
> > stream);
> > if (!info)
> > @@ -833,7 +831,7 @@ int PipelineHandlerRkISP1::queueRequest(Camera *camera, Request *request)
> >
> > data->frame_++;
> >
> > - return 0;
> > + return PipelineHandler::queueRequest(camera, request);
>
> What if the request completes before PipelineHandler::queueRequest() is
> called ? This isn't really a problem today, but may become one later
> when we'll use threads in pipeline handlers. The queueRequest() method
> could be called from a thread different than the one running the
> pipeline handler event loop. I suppose there will be more issues to fix
> at that point, so maybe this change is OK for now.
Good point, will fix in next version.
>
> > }
> >
> > /* -----------------------------------------------------------------------------
> > diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> > index fae0ffc4de30e1b7..dc17b456af6987e6 100644
> > --- a/src/libcamera/pipeline/uvcvideo.cpp
> > +++ b/src/libcamera/pipeline/uvcvideo.cpp
> > @@ -281,9 +281,7 @@ int PipelineHandlerUVC::queueRequest(Camera *camera, Request *request)
> > if (ret < 0)
> > return ret;
> >
> > - PipelineHandler::queueRequest(camera, request);
> > -
> > - return 0;
> > + return PipelineHandler::queueRequest(camera, request);
>
> I'm slightly annoyed by this. It doesn't break anything, and forwards
> the error code from PipelineHandler::queueRequest(), which is good
> overall. However, PipelineHandler::queueRequest() never fails in its
> current implementation (which is why the code isn't currently broken),
> and if that were to change, we would need to handle the error here to
> undo the previous actions (which can't really be done, as a buffer
> queued to a V4L2 device can't be "unqueued"). The code is thus a bit
> fragile. I suppose this change doesn't make the situation worse, so we
> can address the issue later when it arises.
Good point will fix in v2.
>
> I'm not opposed to this patch, if other developers think it should be
> merged, in its current form, let's do it.
The points above pointed out by both Jacopo and Laurent have made me
reconsider this patch and take the issue in a new direction. I now
believe the core of the problem to be specific pipeline handler
implementations need to call it's base class equivalent in this case.
>
> > }
> >
> > bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
> > diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> > index c16ae4cb76b57e1c..5f83ae2b85997828 100644
> > --- a/src/libcamera/pipeline/vimc.cpp
> > +++ b/src/libcamera/pipeline/vimc.cpp
> > @@ -341,9 +341,7 @@ int PipelineHandlerVimc::queueRequest(Camera *camera, Request *request)
> > if (ret < 0)
> > return ret;
> >
> > - PipelineHandler::queueRequest(camera, request);
> > -
> > - return 0;
> > + return PipelineHandler::queueRequest(camera, request);
> > }
> >
> > bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
>
> --
> Regards,
>
> Laurent Pinchart
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list