[PATCH v3 6/7] android: notify CAMERA3_MSG_ERROR_REQUEST out of order

Cheng-Hao Yang chenghaoyang at chromium.org
Tue Dec 10 06:40:14 CET 2024


Hi Jacopo,

On Fri, Dec 6, 2024 at 12:46 AM Jacopo Mondi
<jacopo.mondi at ideasonboard.com> wrote:
>
> On Wed, Dec 04, 2024 at 04:36:31PM +0000, Harvey Yang wrote:
> > When a request hasn't done any processing, CAMERA3_MSG_ERROR_REQUEST and
> > the following process_capture_result don't need to wait for the previous
> > requests' completion. This patch avoids pushing the aborted requests
> > into the request queue.
> >
> > Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
> > Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
> > Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
> > ---
> >  src/android/camera_device.cpp | 11 +++--------
> >  1 file changed, 3 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index dd2c603e0..18e974f56 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -867,6 +867,8 @@ void CameraDevice::abortRequest(Camera3RequestDescriptor *descriptor) const
> >               buffer.status = StreamBuffer::Status::Error;
> >
> >       descriptor->status_ = Camera3RequestDescriptor::Status::Error;
> > +
> > +     sendCaptureResult(descriptor);
> >  }
> >
> >  bool CameraDevice::isValidRequest(camera3_capture_request_t *camera3Request) const
> > @@ -1136,14 +1138,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
> >       MutexLocker stateLock(stateMutex_);
> >
> >       if (state_ == State::Flushing) {
> > -             Camera3RequestDescriptor *rawDescriptor = descriptor.get();
> > -             {
> > -                     MutexLocker descriptorsLock(descriptorsMutex_);
> > -                     descriptors_.push(std::move(descriptor));
> > -             }
> > -             abortRequest(rawDescriptor);
> > -             completeDescriptor(rawDescriptor);
> > -
> > +             abortRequest(descriptor.get());
>
> Right, if we don't have to complete in order this indeed seems
> correct.
>
> However, we fall in this case, right ?
>
>      * 2. For pending requests that have not done any processing, the HAL must call notify
>      *    CAMERA3_MSG_ERROR_REQUEST, and return all the output buffers with
>      *    process_capture_result in the error state (CAMERA3_BUFFER_STATUS_ERROR).
>      *    The HAL must not place the release fence into an error state, instead,
>      *    the release fences must be set to the acquire fences passed by the framework,
>      *    or -1 if they have been waited on by the HAL already. This is also the path
>      *    to follow for any captures for which the HAL already called notify() with
>      *    CAMERA3_MSG_SHUTTER but won't be producing any metadata/valid buffers for.
>      *    After CAMERA3_MSG_ERROR_REQUEST, for a given frame, only process_capture_results with
>      *    buffers in CAMERA3_BUFFER_STATUS_ERROR are allowed. No further notifys or
>      *    process_capture_result with non-null metadata is allowed.
>
> Apparently we're not handling fences here. Not your fault, seems like
> it wasn't there already. While at it could you add a \todo or, if you
> feel like it's worth fixing it, pile up a patch ?

Yes we fall into this case, while I think the original logic already
handles the fence as described?
In `CameraDevice::sendCaptureResults()` (or
`CameraDevice::sendCaptureResult()` in my patches),
`buffer.fence.release()` is put in the `release_fence` field of
`camera3_steram_buffer_t`.

Please check if I missed anything.

BR,
Harvey


>
> The patch itself seems good to me
> Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
>
> >               return 0;
> >       }
> >
> > --
> > 2.47.0.338.g60cca15819-goog
> >


More information about the libcamera-devel mailing list