[libcamera-devel] [PATCH v2] android: CameraDevice: factorize reporting a capture result
Hirokazu Honda
hiroh at chromium.org
Mon Apr 26 13:01:54 CEST 2021
With this implementation, stop() can be as follows.
$ git diff
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 70174a2b..c5091e4f 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -773,19 +773,8 @@ void CameraDevice::stop()
for (auto &[cookie, descriptor] : descriptors_) {
LOG(HAL, Debug) << "request is canceled: " << cookie;
- 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);
+ reportDescriptor(descriptor,
+ CAMERA3_BUFFER_STATUS_ERROR);
}
descriptors_.clear();
On Mon, Apr 26, 2021 at 7:57 PM Hirokazu Honda <hiroh at chromium.org> wrote:
>
> This factorizes a code of reporting a capture result including
> notifying either shutter or error. It will be useful to report
> capture results in other places than
> CameraDevice::reqeustComplete().
>
> Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> ---
> src/android/camera_device.cpp | 22 +++++++++++++++-------
> src/android/camera_device.h | 4 ++++
> 2 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index fb89195e..70174a2b 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -2132,7 +2132,20 @@ void CameraDevice::requestComplete(Request *request)
> cameraStream->putBuffer(src);
> }
>
> - /* Prepare to call back the Android camera stack. */
> + reportDescriptor(descriptor, status, timestamp,
> + resultMetadata ? resultMetadata->get() : nullptr);
> +}
> +
> +std::string CameraDevice::logPrefix() const
> +{
> + return "'" + camera_->id() + "'";
> +}
> +
> +void CameraDevice::reportDescriptor(Camera3RequestDescriptor &descriptor,
> + camera3_buffer_status status,
> + uint64_t timestamp,
> + camera_metadata_t *metadata)
> +{
> camera3_capture_result_t captureResult = {};
> captureResult.frame_number = descriptor.frameNumber_;
> captureResult.num_output_buffers = descriptor.buffers_.size();
> @@ -2147,7 +2160,7 @@ void CameraDevice::requestComplete(Request *request)
> notifyShutter(descriptor.frameNumber_, timestamp);
>
> captureResult.partial_result = 1;
> - captureResult.result = resultMetadata->get();
> + captureResult.result = metadata;
> }
>
> if (status == CAMERA3_BUFFER_STATUS_ERROR || !captureResult.result) {
> @@ -2164,11 +2177,6 @@ void CameraDevice::requestComplete(Request *request)
> callbacks_->process_capture_result(callbacks_, &captureResult);
> }
>
> -std::string CameraDevice::logPrefix() const
> -{
> - return "'" + camera_->id() + "'";
> -}
> -
> 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 fa652c3c..a42b8dc0 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -101,6 +101,10 @@ private:
>
> std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();
> libcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);
> + void reportDescriptor(Camera3RequestDescriptor &descriptor,
> + camera3_buffer_status status,
> + uint64_t timestamp = 0,
> + camera_metadata_t *metadata = nullptr);
> void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
> void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
> std::unique_ptr<CameraMetadata> requestTemplatePreview();
> --
> 2.31.1.498.g6c1eba8ee3d-goog
>
More information about the libcamera-devel
mailing list