[libcamera-devel] [PATCH] android: CameraDevice: factorize generating a capture result

Hirokazu Honda hiroh at chromium.org
Mon Apr 26 11:08:10 CEST 2021


Hi Laurent,

On Mon, Apr 26, 2021 at 2:28 PM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> Hi Hiro,
>
> Thank you for the patch.
>
> On Mon, Apr 26, 2021 at 12:45:02PM +0900, Hirokazu Honda wrote:
> > This factorizes a code of generating camera3_capture_result. It
> > will be useful to report capture result in other places than
> > CameraDevice::reqeustComplete().
> >
> > Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> >
> > ---
> > I was going to implement
> > reportShutter() - createCaptureResult() + notifyShutter(), and
> > reportError() - createCaptureResult() + notifyError().
> >
> > But reportError() can be called after reportShutter(). It is a
> > bit less efficient to create capture result twice in the case.
> > So I only factorize a code of generating a capture result.
>
> Can't we have a single function to do all that ? Right now we have
>
>         /* Prepare to call back the Android camera stack. */
>         camera3_capture_result_t captureResult = {};
>         captureResult.frame_number = descriptor.frameNumber_;
>         captureResult.num_output_buffers = descriptor.buffers_.size();
>         for (camera3_stream_buffer_t &buffer : descriptor.buffers_) {
>                 buffer.acquire_fence = -1;
>                 buffer.release_fence = -1;
>                 buffer.status = status;
>         }
>         captureResult.output_buffers = descriptor.buffers_.data();
>
>         if (status == CAMERA3_BUFFER_STATUS_OK) {
>                 notifyShutter(descriptor.frameNumber_, timestamp);
>
>                 captureResult.partial_result = 1;
>                 captureResult.result = resultMetadata->get();
>         }
>
>         if (status == CAMERA3_BUFFER_STATUS_ERROR || !captureResult.result) {
>                 /* \todo Improve error handling. In case we notify an error
>                  * because the metadata generation fails, a shutter event has
>                  * already been notified for this frame number before the error
>                  * is here signalled. Make sure the error path plays well with
>                  * the camera stack state machine.
>                  */
>                 notifyError(descriptor.frameNumber_,
>                             descriptor.buffers_[0].stream);
>         }
>
>         callbacks_->process_capture_result(callbacks_, &captureResult);
>
> Could we move all that to a function that takes descriptor, status,
> timestamp and resultMedadata as arguments ? In stop(), to implement
> flush(), it would be called with status == CAMERA3_BUFFER_STATUS_ERROR,
> so notifyShutter() would be skipped.
>
> If you think that would cause issues, this patch is already an
> improvement, so we could proceed with it.
>

I did so some times ago when I worked with Jacopo for Flush().
Jacopo suggested to not not contain a code for shutter and error in
the same function, as either of them are not executed.
Jacopo, how do you think?

-Hiro

> > ---
> >  src/android/camera_device.cpp | 29 ++++++++++++++++++++---------
> >  src/android/camera_device.h   |  3 +++
> >  2 files changed, 23 insertions(+), 9 deletions(-)
> >
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index a71aee2f..ced8efcc 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -2094,15 +2094,8 @@ void CameraDevice::requestComplete(Request *request)
> >       }
> >
> >       /* Prepare to call back the Android camera stack. */
> > -     camera3_capture_result_t captureResult = {};
> > -     captureResult.frame_number = descriptor.frameNumber_;
> > -     captureResult.num_output_buffers = descriptor.buffers_.size();
> > -     for (camera3_stream_buffer_t &buffer : descriptor.buffers_) {
> > -             buffer.acquire_fence = -1;
> > -             buffer.release_fence = -1;
> > -             buffer.status = status;
> > -     }
> > -     captureResult.output_buffers = descriptor.buffers_.data();
> > +     camera3_capture_result_t captureResult =
> > +             createCaptureResult(descriptor, status);
> >
> >       if (status == CAMERA3_BUFFER_STATUS_OK) {
> >               notifyShutter(descriptor.frameNumber_, timestamp);
> > @@ -2130,6 +2123,24 @@ std::string CameraDevice::logPrefix() const
> >       return "'" + camera_->id() + "'";
> >  }
> >
> > +
> > +camera3_capture_result_t CameraDevice::createCaptureResult(
> > +     Camera3RequestDescriptor &descriptor,
> > +     camera3_buffer_status status) const
> > +{
> > +     camera3_capture_result_t captureResult = {};
> > +     captureResult.frame_number = descriptor.frameNumber_;
> > +     captureResult.num_output_buffers = descriptor.buffers_.size();
> > +     for (camera3_stream_buffer_t &buffer : descriptor.buffers_) {
> > +             buffer.acquire_fence = -1;
> > +             buffer.release_fence = -1;
> > +             buffer.status = status;
> > +     }
> > +     captureResult.output_buffers = descriptor.buffers_.data();
> > +
> > +     return captureResult;
> > +}
> > +
> >  void CameraDevice::notifyShutter(uint32_t frameNumber, uint64_t timestamp)
> >  {
> >       camera3_notify_msg_t notify = {};
> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> > index c63e8e21..a1abcead 100644
> > --- a/src/android/camera_device.h
> > +++ b/src/android/camera_device.h
> > @@ -100,6 +100,9 @@ private:
> >
> >       std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();
> >       libcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);
> > +     camera3_capture_result_t createCaptureResult(
> > +             Camera3RequestDescriptor &descriptor,
> > +             camera3_buffer_status status) const;
> >       void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
> >       void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
> >       std::unique_ptr<CameraMetadata> requestTemplatePreview();
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list