[libcamera-devel] [PATCH v6 4/7] android: post_processor: Consolidate contextual information
Umang Jain
umang.jain at ideasonboard.com
Mon Oct 25 15:00:41 CEST 2021
Hi Laurent,
On 10/25/21 10:53 AM, Laurent Pinchart wrote:
> Hi Umang,
>
> Thank you for the patch.
>
> On Sat, Oct 23, 2021 at 04:02:59PM +0530, Umang Jain wrote:
>> 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;
>> }
>>
> Should we store src in buffer here instead of in
> CameraStream::process(), to make the signature of all process()
> functions the same ?
That's a good point.
I'll try to address it in this series, but see if it's easy enough
changeset for a fixup! patch? If I see major conflicts, would it be OK
on top?
>
>> - 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 });
> A constructor will be nice at some point :-)
>
>> }
>>
>> /* 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"
> Can you forward-declare CameraBuffer instead of including the header
> here ?
>
>> #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;
> Maybe dstBuffer to match srcBuffer ? I'd also place srcBuffer first to
> match the usual source -> destination logical order, but that's a
> detail.
Yes, renaming that should be fine.
>
>> + 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);
> You're passing a reference here, and a pointer in
> PostProcessor::process(). Could you pick one of the two and use it
> consistently ?
Ah right, I see that now. I will probably make use of pointers.
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
>> 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,
More information about the libcamera-devel
mailing list