[libcamera-devel] [PATCH v1 5/6] android: camera_device: Move buffer mapping for post-processing

Umang Jain umang.jain at ideasonboard.com
Tue Sep 7 21:57:03 CEST 2021


Buffer mapping currently happens in CameraStream::process() for
post-processing. However, it can be easily be moved to CameraDevice
just before the call to CameraStream::process(). The reason to do so
is that we can hold the mapped destination buffer pointer as a part
of Camera3RequestDescriptor. The Camera3RequestDescriptor already
saves other post-processing related context, to enable async post
processing.

Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
---
 src/android/camera_device.cpp | 20 +++++++++++++++++++-
 src/android/camera_device.h   |  1 +
 src/android/camera_stream.cpp | 16 ++--------------
 src/android/camera_stream.h   |  2 +-
 4 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 9d4ec02e..8741678d 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1162,6 +1162,17 @@ void CameraDevice::requestComplete(Request *request)
 		descriptor.resultMetadata_ = std::move(resultMetadata);
 		descriptor.captureResult_ = captureResult;
 
+		/* \todo Buffer mapping should be moved to a separate thread? */
+		const StreamConfiguration &output = cameraStream->configuration();
+		descriptor.destBuffer_ = std::make_unique<CameraBuffer>(*buffer.buffer,
+									formats::MJPEG,
+									output.size,
+									PROT_READ | PROT_WRITE);
+		if (!descriptor.destBuffer_->isValid()) {
+			LOG(HAL, Error) << "Failed to map android blob buffer";
+			return;
+		}
+
 		std::unique_ptr<Camera3RequestDescriptor> reqDescriptor =
 			std::make_unique<Camera3RequestDescriptor>();
 		*reqDescriptor = std::move(descriptor);
@@ -1175,7 +1186,7 @@ void CameraDevice::requestComplete(Request *request)
 							 metadata);
 			});
 
-		int ret = cameraStream->process(src, *buffer.buffer,
+		int ret = cameraStream->process(src, currentDescriptor->destBuffer_.get(),
 						currentDescriptor->settings_,
 						metadata);
 		return;
@@ -1255,6 +1266,13 @@ void CameraDevice::sendQueuedCaptureResults()
 			d->captureResult_.result = d->resultMetadata_->get();
 			callbacks_->process_capture_result(callbacks_,
 							   &(d->captureResult_));
+			/*
+			 * reset() here drops the error logs in
+			 * https://paste.debian.net/1210728/ significantly.
+			 * It still happens intermittently so comment the reset()
+			 * out to see persistantly.
+			 */
+			d->destBuffer_.reset();
 			queuedDescriptor_.pop_front();
 		} else {
 			break;
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 36425773..330c69a3 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -96,6 +96,7 @@ private:
 			FINISHED_FAILED,
 		};
 		std::unique_ptr<CameraMetadata> resultMetadata_;
+		std::unique_ptr<CameraBuffer> destBuffer_;
 		camera3_capture_result_t captureResult_;
 		libcamera::FrameBuffer *internalBuffer_;
 		completionStatus status_;
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index 81af53af..1939cb9c 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -101,26 +101,14 @@ int CameraStream::configure()
 }
 
 int CameraStream::process(const FrameBuffer *source,
-			  buffer_handle_t camera3Dest,
+			  CameraBuffer *destBuffer,
 			  const CameraMetadata &requestMetadata,
 			  CameraMetadata *resultMetadata)
 {
 	if (!postProcessor_)
 		return 0;
 
-	/*
-	 * \todo Buffer mapping and processing should be moved to a
-	 * separate thread.
-	 */
-	const StreamConfiguration &output = configuration();
-	CameraBuffer dest(camera3Dest, formats::MJPEG, output.size,
-			  PROT_READ | PROT_WRITE);
-	if (!dest.isValid()) {
-		LOG(HAL, Error) << "Failed to map android blob buffer";
-		return -EINVAL;
-	}
-
-	return postProcessor_->process(source, &dest, requestMetadata, resultMetadata);
+	return postProcessor_->process(source, destBuffer, requestMetadata, resultMetadata);
 }
 
 void CameraStream::handlePostProcessing(PostProcessor::Status status)
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index f9b11e5d..ad03e4cf 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -122,7 +122,7 @@ public:
 
 	int configure();
 	int process(const libcamera::FrameBuffer *source,
-		    buffer_handle_t camera3Dest,
+		    CameraBuffer *destBuffer,
 		    const CameraMetadata &requestMetadata,
 		    CameraMetadata *resultMetadata);
 	libcamera::FrameBuffer *getBuffer();
-- 
2.31.0



More information about the libcamera-devel mailing list