[libcamera-devel] [PATCH v2 2/2] android: CameraDevice: Implement HAL3 API flush
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Apr 26 05:00:28 CEST 2021
Hi Hiro,
On Mon, Apr 26, 2021 at 11:51:40AM +0900, Hirokazu Honda wrote:
> On Mon, Apr 26, 2021 at 9:37 AM Laurent Pinchart wrote:
> > On Fri, Apr 23, 2021 at 01:07:38PM +0900, Hirokazu Honda wrote:
> > > This implements flush(). It is mostly the same as close()
> > > though the canceled events are reported with error messages.
> > >
> > > Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> > > ---
> > > src/android/camera_device.cpp | 41 +++++++++++++++++++++++++++++------
> > > src/android/camera_device.h | 1 +
> > > src/android/camera_ops.cpp | 6 ++++-
> > > 3 files changed, 40 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > > index c74dc0e7..22a2e13c 100644
> > > --- a/src/android/camera_device.cpp
> > > +++ b/src/android/camera_device.cpp
> > > @@ -753,6 +753,15 @@ void CameraDevice::close()
> > > stop(/*releaseCamera=*/true);
> > > }
> > >
> > > +int CameraDevice::flush()
> > > +{
> > > + std::scoped_lock<std::mutex> lock(mutex_);
> > > +
> > > + stop();
> > > +
> > > + return 0;
> > > +}
> > > +
> > > void CameraDevice::stop(bool releaseCamera)
> > > {
> > > streams_.clear();
> > > @@ -770,6 +779,23 @@ void CameraDevice::stop(bool releaseCamera)
> > > worker_.stop();
> > > camera_->stop();
> > >
> > > + for (auto &[cookie, descriptor] : descriptors_) {
> > > + LOG(HAL, Debug) << "request is canceled: " << cookie;
> >
> > LOG(HAL, Debug) << "request " << cookie << " is canceled";
> >
> > > +
> > > + 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 = CAMERA3_BUFFER_STATUS_ERROR;
> > > + }
> > > + captureResult.output_buffers = descriptor.buffers_.data();
> > > +
> > > + notifyError(descriptor.frameNumber_,
> > > + descriptor.buffers_[0].stream);
> > > + callbacks_->process_capture_result(callbacks_, &captureResult);
> >
> > This looks very similar to the code in CameraDevice::requestComplete(),
> > would it make sense to move it to a separate function (including the
> > call to notifyError) ?
>
> Sure, I will factorize in the next patch.
> My first thought is to reduce the number of patches in the series and
> factorize them after the patches are merged to not complicate this
> patch series any more.
I actually makes review easier if you factor out the code in a separate
function in a patch of its own, before this patch.
> > > + }
> > > descriptors_.clear();
> > >
> > > running_ = false;
> > > @@ -2128,6 +2154,14 @@ void CameraDevice::requestComplete(Request *request)
> > > }
> > >
> > > if (status == CAMERA3_BUFFER_STATUS_ERROR || !captureResult.result) {
> > > + /*
> > > + * \todo Report and identify the stream number or configuration
> > > + * to clarify the stream that failed.
> > > + */
> > > + LOG(HAL, Error)
> > > + << "Error occurred on frame " << descriptor.frameNumber_ << " ("
> > > + << toPixelFormat(descriptor.buffers_[0].stream->format).toString() << ")";
> > > +
> > > /* \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
> > > @@ -2161,13 +2195,6 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)
> > > {
> > > camera3_notify_msg_t notify = {};
> > >
> > > - /*
> > > - * \todo Report and identify the stream number or configuration to
> > > - * clarify the stream that failed.
> > > - */
> > > - LOG(HAL, Error) << "Error occurred on frame " << frameNumber << " ("
> > > - << toPixelFormat(stream->format).toString() << ")";
> > > -
> > > notify.type = CAMERA3_MSG_ERROR;
> > > notify.message.error.error_stream = stream;
> > > notify.message.error.frame_number = frameNumber;
> > > diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> > > index 08553584..7004c89a 100644
> > > --- a/src/android/camera_device.h
> > > +++ b/src/android/camera_device.h
> > > @@ -41,6 +41,7 @@ public:
> > >
> > > int open(const hw_module_t *hardwareModule);
> > > void close();
> > > + int flush();
> > >
> > > unsigned int id() const { return id_; }
> > > camera3_device_t *camera3Device() { return &camera3Device_; }
> > > diff --git a/src/android/camera_ops.cpp b/src/android/camera_ops.cpp
> > > index 696e8043..981a3d30 100644
> > > --- a/src/android/camera_ops.cpp
> > > +++ b/src/android/camera_ops.cpp
> > > @@ -68,7 +68,11 @@ static void hal_dev_dump([[maybe_unused]] const struct camera3_device *dev,
> > >
> > > static int hal_dev_flush([[maybe_unused]] const struct camera3_device *dev)
> >
> > You can drop [[maybe_unused]].
> >
> > It would be nice to have an [[unused]] that causes a warning when the
> > variable is used.
> >
> > > {
> > > - return 0;
> > > + if (!dev)
> > > + return -EINVAL;
> > > +
> > > + CameraDevice *camera = reinterpret_cast<CameraDevice *>(dev->priv);
> > > + return camera->flush();
> > > }
> > >
> > > int hal_dev_close(hw_device_t *hw_device)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list