[libcamera-devel] [PATCH v6 4/7] android: post_processor: Consolidate contextual information

Umang Jain umang.jain at ideasonboard.com
Sat Oct 23 12:32:59 CEST 2021


Save and provide the context for post-processor of a camera stream
via Camera3RequestDescriptor::StreamBuffer. We extend the structure
to include source and destination buffers for the post processor, along
with CameraStream::Type::Internal buffer pointer (if any). In addition
to that, a back pointer to Camera3RequestDescriptor is convienient to
get access to overall descriptor (status, metadata settings etc.)

Also, migrate PostProcessor::process() signature to use
Camera3RequestDescriptor::StreamBuffer only. This will be helpful
when we move to async post-processing in subsequent commits.

Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
---
 src/android/camera_device.cpp            | 11 ++++++-----
 src/android/camera_request.cpp           |  3 ++-
 src/android/camera_request.h             |  5 +++++
 src/android/camera_stream.cpp            | 14 ++++++++------
 src/android/camera_stream.h              |  3 +--
 src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
 src/android/jpeg/post_processor_jpeg.h   |  4 +---
 src/android/post_processor.h             |  7 ++-----
 src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
 src/android/yuv/post_processor_yuv.h     |  4 +---
 10 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index f4d4fb09..2a98a2e6 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 			 * once it has been processed.
 			 */
 			frameBuffer = cameraStream->getBuffer();
+			buffer.internalBuffer = frameBuffer;
 			LOG(HAL, Debug) << ss.str() << " (internal)";
 			break;
 		}
@@ -1134,14 +1135,14 @@ void CameraDevice::requestComplete(Request *request)
 			continue;
 		}
 
-		int ret = stream->process(*src, buffer, descriptor);
+		int ret = stream->process(*src, buffer);
 
 		/*
-		 * Return the FrameBuffer to the CameraStream now that we're
-		 * done processing it.
+		 * If the framebuffer is internal to CameraStream return it back
+		 * now that we're done processing it.
 		 */
-		if (stream->type() == CameraStream::Type::Internal)
-			stream->putBuffer(src);
+		if (buffer.internalBuffer)
+			stream->putBuffer(buffer.internalBuffer);
 
 		if (ret) {
 			buffer.status = Camera3RequestDescriptor::Status::Error;
diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
index 16cf266f..fd927167 100644
--- a/src/android/camera_request.cpp
+++ b/src/android/camera_request.cpp
@@ -36,7 +36,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
 			static_cast<CameraStream *>(buffer.stream->priv);
 
 		buffers_.push_back({ stream, buffer.buffer, nullptr,
-				     buffer.acquire_fence, Status::Success });
+				     buffer.acquire_fence, Status::Success,
+				     nullptr, nullptr, nullptr, this });
 	}
 
 	/* Clone the controls associated with the camera3 request. */
diff --git a/src/android/camera_request.h b/src/android/camera_request.h
index 904886da..c4bc5d6e 100644
--- a/src/android/camera_request.h
+++ b/src/android/camera_request.h
@@ -17,6 +17,7 @@
 
 #include <hardware/camera3.h>
 
+#include "camera_buffer.h"
 #include "camera_metadata.h"
 #include "camera_worker.h"
 
@@ -36,6 +37,10 @@ public:
 		std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
 		int fence;
 		Status status;
+		libcamera::FrameBuffer *internalBuffer;
+		std::unique_ptr<CameraBuffer> destBuffer;
+		const libcamera::FrameBuffer *srcBuffer;
+		Camera3RequestDescriptor *request;
 	};
 
 	Camera3RequestDescriptor(libcamera::Camera *camera,
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index ca25c4db..0e268cdf 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -147,8 +147,7 @@ int CameraStream::waitFence(int fence)
 }
 
 int CameraStream::process(const FrameBuffer &source,
-			  Camera3RequestDescriptor::StreamBuffer &dest,
-			  Camera3RequestDescriptor *request)
+			  Camera3RequestDescriptor::StreamBuffer &dest)
 {
 	/* Handle waiting on fences on the destination buffer. */
 	if (dest.fence != -1) {
@@ -170,14 +169,17 @@ int CameraStream::process(const FrameBuffer &source,
 	 * separate thread.
 	 */
 	const StreamConfiguration &output = configuration();
-	CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
-				output.size, PROT_READ | PROT_WRITE);
-	if (!destBuffer.isValid()) {
+	dest.destBuffer = std::make_unique<CameraBuffer>(
+		*dest.camera3Buffer, output.pixelFormat, output.size,
+		PROT_READ | PROT_WRITE);
+	if (!dest.destBuffer->isValid()) {
 		LOG(HAL, Error) << "Failed to create destination buffer";
 		return -EINVAL;
 	}
 
-	return postProcessor_->process(source, &destBuffer, request);
+	dest.srcBuffer = &source;
+
+	return postProcessor_->process(&dest);
 }
 
 FrameBuffer *CameraStream::getBuffer()
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index f242336e..e9c320b1 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -122,8 +122,7 @@ public:
 
 	int configure();
 	int process(const libcamera::FrameBuffer &source,
-		    Camera3RequestDescriptor::StreamBuffer &dest,
-		    Camera3RequestDescriptor *request);
+		    Camera3RequestDescriptor::StreamBuffer &dest);
 	libcamera::FrameBuffer *getBuffer();
 	void putBuffer(libcamera::FrameBuffer *buffer);
 
diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
index 49483836..da71f113 100644
--- a/src/android/jpeg/post_processor_jpeg.cpp
+++ b/src/android/jpeg/post_processor_jpeg.cpp
@@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
 	}
 }
 
-int PostProcessorJpeg::process(const FrameBuffer &source,
-			       CameraBuffer *destination,
-			       Camera3RequestDescriptor *request)
+int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
 {
 	ASSERT(encoder_);
+
+	const FrameBuffer &source = *streamBuffer->srcBuffer;
+	CameraBuffer *destination = streamBuffer->destBuffer.get();
+
 	ASSERT(destination->numPlanes() == 1);
 
-	const CameraMetadata &requestMetadata = request->settings_;
-	CameraMetadata *resultMetadata = request->resultMetadata_.get();
+	const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
+	CameraMetadata *resultMetadata = streamBuffer->request->resultMetadata_.get();
 	camera_metadata_ro_entry_t entry;
 	int ret;
 
diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h
index 0184d77e..92385548 100644
--- a/src/android/jpeg/post_processor_jpeg.h
+++ b/src/android/jpeg/post_processor_jpeg.h
@@ -22,9 +22,7 @@ public:
 
 	int configure(const libcamera::StreamConfiguration &incfg,
 		      const libcamera::StreamConfiguration &outcfg) override;
-	int process(const libcamera::FrameBuffer &source,
-		    CameraBuffer *destination,
-		    Camera3RequestDescriptor *request) override;
+	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
 
 private:
 	void generateThumbnail(const libcamera::FrameBuffer &source,
diff --git a/src/android/post_processor.h b/src/android/post_processor.h
index 27eaef88..128161c8 100644
--- a/src/android/post_processor.h
+++ b/src/android/post_processor.h
@@ -11,8 +11,7 @@
 #include <libcamera/stream.h>
 
 #include "camera_buffer.h"
-
-class Camera3RequestDescriptor;
+#include "camera_request.h"
 
 class PostProcessor
 {
@@ -21,9 +20,7 @@ public:
 
 	virtual int configure(const libcamera::StreamConfiguration &inCfg,
 			      const libcamera::StreamConfiguration &outCfg) = 0;
-	virtual int process(const libcamera::FrameBuffer &source,
-			    CameraBuffer *destination,
-			    Camera3RequestDescriptor *request) = 0;
+	virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 0;
 };
 
 #endif /* __ANDROID_POST_PROCESSOR_H__ */
diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
index 8110a1f1..eeb8f1f4 100644
--- a/src/android/yuv/post_processor_yuv.cpp
+++ b/src/android/yuv/post_processor_yuv.cpp
@@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
 	return 0;
 }
 
-int PostProcessorYuv::process(const FrameBuffer &source,
-			      CameraBuffer *destination,
-			      [[maybe_unused]] Camera3RequestDescriptor *request)
+int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
 {
+	const FrameBuffer &source = *streamBuffer->srcBuffer;
+	CameraBuffer *destination = streamBuffer->destBuffer.get();
+
 	if (!isValidBuffers(source, *destination))
 		return -EINVAL;
 
diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h
index a4e0ff5d..5954e11b 100644
--- a/src/android/yuv/post_processor_yuv.h
+++ b/src/android/yuv/post_processor_yuv.h
@@ -18,9 +18,7 @@ public:
 
 	int configure(const libcamera::StreamConfiguration &incfg,
 		      const libcamera::StreamConfiguration &outcfg) override;
-	int process(const libcamera::FrameBuffer &source,
-		    CameraBuffer *destination,
-		    Camera3RequestDescriptor *request) override;
+	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
 
 private:
 	bool isValidBuffers(const libcamera::FrameBuffer &source,
-- 
2.31.1



More information about the libcamera-devel mailing list