[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