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

Hirokazu Honda hiroh at chromium.org
Mon Apr 26 05:45:02 CEST 2021


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.

---
 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();
--
2.31.1.498.g6c1eba8ee3d-goog


More information about the libcamera-devel mailing list