[libcamera-devel] [PATCH v2 2/2] android: CameraDevice: Implement HAL3 API flush

Hirokazu Honda hiroh at chromium.org
Fri Apr 23 06:07:38 CEST 2021


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;
+
+		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);
+	}
 	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)
 {
-	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)
-- 
2.31.1.498.g6c1eba8ee3d-goog



More information about the libcamera-devel mailing list