[libcamera-devel] [PATCH v2 02/10] libcamera: pipeline: uvcvideo: Report control errors

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Aug 17 13:58:25 CEST 2022


Quoting Jacopo Mondi via libcamera-devel (2022-08-17 10:18:18)
> Hi Laurent
> 
> On Tue, Aug 16, 2022 at 06:23:35AM +0300, Laurent Pinchart wrote:
> > Hi Jacopo and Kieran,
> >
> > Thank you for the patch.
> >
> > On Fri, Aug 05, 2022 at 03:53:04PM +0200, Jacopo Mondi via libcamera-devel wrote:
> > > From: Kieran Bingham via libcamera-devel <libcamera-devel at lists.libcamera.org>
> >
> > This isn't right.
> 
> I -hate- this, it makes applying patches from email more painful than
> necessary. How can we fix this ?
> 
> >
> > > Report an error when failing to process controls, but still allow the
> > > request to process and complete where possible.
> > >
> > > The Request ControlError flag is raised on the request.
> > >
> > > Bug: https://bugs.libcamera.org/show_bug.cgi?id=135
> > > Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > > Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> > > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> > > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > > ---
> > >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 7 +++++--
> > >  1 file changed, 5 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > index fbe02cdcd520..8ffa27b1337b 100644
> > > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > @@ -26,6 +26,7 @@
> > >  #include "libcamera/internal/device_enumerator.h"
> > >  #include "libcamera/internal/media_device.h"
> > >  #include "libcamera/internal/pipeline_handler.h"
> > > +#include "libcamera/internal/request.h"
> > >  #include "libcamera/internal/sysfs.h"
> > >  #include "libcamera/internal/v4l2_videodevice.h"
> > >
> > > @@ -373,8 +374,10 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)
> > >     }
> > >
> > >     int ret = processControls(data, request);
> > > -   if (ret < 0)
> > > -           return ret;
> > > +   if (ret < 0) {
> > > +           LOG(UVC, Error) << "Failed to process controls";
> >
> > Have you ever noticed this ? I'm wondering if we would need to
> > rate-limit this message.
> >
> 
> I didn't, but we have a bug for that, so I assume it happens..

Yes, it can quite easily be caused to happen (demonstrated by Utkarsh's
control settings window implementation).

It will occur once per request that contains a control that fails ...
Does it need to be rate limited more than that?

The catch is that if the request fails, in Utkarsh's implementation -
the control is still in the list - so it gets resubmitted.

We might have to make sure applications are checking that they don't
continuously queue invalid controls... But perhaps that's up to the app.

 
> > > +           request->_d()->setError(Request::ControlError);
> >
> > There's a bit of a mismatch between this and the definition of
> > ControlError in patch 01/10, as it recommends checking the metadata to
> > see what happened, and the UVC pipeline handler doesn't generate any
> > metadata. Generally speaking, checking metadata seems cumbersome (at

That's a separate issue in the UVC pipeline handler right ?

> > best) for any camera that would have a non-zero max sync latency. This
> 
> And comparing the metadata with the requested controls is indeed
> expensive and error-prone

Agreed, I did already start looking into getting the control lists to
return 'which' control fails ... but that's a WIP, and changes the
underlying error handling of setting control lists.


> > should be considered to figure out how an application would handle
> > errors in that case.
> >
> 
> If they have max-latency > 0 it means they don't support per-frame
> control so indeed the returned metadata can possibily not match the
> requested controls and finding out which ones will converge in the
> next requests and which one have failed won't be possible.
> 
> Is the Request's control list still populated in a completed Request ?

It still exists there yes ...

> If that's the case we can add a flag to the Control<> instances
> themselves ? (not excited by that tbh)

Me neither. Do we need to return a control list which contains a list of
any controls that failed ? (separately to the metadata, and the incoming
controls ?)

--
Kieran


> 
> > > +   }
> > >
> > >     ret = data->video_->queueBuffer(buffer);
> > >     if (ret < 0)
> >
> > --
> > Regards,
> >
> > Laurent Pinchart


More information about the libcamera-devel mailing list