Message ID | 20211025203833.122460-5-umang.jain@ideasonboard.com |
---|---|
State | Superseded |
Delegated to: | Umang Jain |
Headers | show |
Series |
|
Related | show |
Hi Umang, Thank you for the patch. On Tue, Oct 26, 2021 at 02:08:30AM +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 CameraStream::process() and 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@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Reviewed-by: Hirokazu Honda <hiroh@chromium.org> > --- > src/android/camera_device.cpp | 13 ++++++++----- > src/android/camera_request.cpp | 5 ++++- > src/android/camera_request.h | 5 +++++ > src/android/camera_stream.cpp | 23 +++++++++++------------ > src/android/camera_stream.h | 4 +--- > 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, 44 insertions(+), 40 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index bf9a2e69..9155728a 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; > } > @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request) > continue; > } > > - int ret = stream->process(*src, buffer, descriptor); > + buffer.srcBuffer = src; > + > + int ret = stream->process(&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..5bac1b8f 100644 > --- a/src/android/camera_request.cpp > +++ b/src/android/camera_request.cpp > @@ -9,6 +9,8 @@ > > #include <libcamera/base/span.h> > > +#include "camera_buffer.h" > + > using namespace libcamera; > > /* > @@ -36,7 +38,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 4d80ef32..c7fda00d 100644 > --- a/src/android/camera_request.h > +++ b/src/android/camera_request.h > @@ -21,6 +21,7 @@ > #include "camera_worker.h" > > class CameraStream; > +class CameraBuffer; Alphabetical order please :-) > > class Camera3RequestDescriptor > { > @@ -36,6 +37,10 @@ public: > std::unique_ptr<libcamera::FrameBuffer> frameBuffer; > int fence; > Status status; > + libcamera::FrameBuffer *internalBuffer; > + const libcamera::FrameBuffer *srcBuffer; > + std::unique_ptr<CameraBuffer> dstBuffer; > + Camera3RequestDescriptor *request; > }; > > Camera3RequestDescriptor(libcamera::Camera *camera, > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp > index 5d991fe5..282b19b0 100644 > --- a/src/android/camera_stream.cpp > +++ b/src/android/camera_stream.cpp > @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence) > return -errno; > } > > -int CameraStream::process(const FrameBuffer &source, > - Camera3RequestDescriptor::StreamBuffer &dest, > - Camera3RequestDescriptor *request) > +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) > { > ASSERT(type_ != Type::Direct); > > /* Handle waiting on fences on the destination buffer. */ > - if (dest.fence != -1) { > - int ret = waitFence(dest.fence); > + if (streamBuffer->fence != -1) { > + int ret = waitFence(streamBuffer->fence); > if (ret < 0) { > LOG(HAL, Error) << "Failed waiting for fence: " > - << dest.fence << ": " << strerror(-ret); > + << streamBuffer->fence << ": " << strerror(-ret); > return ret; > } > > - ::close(dest.fence); > - dest.fence = -1; > + ::close(streamBuffer->fence); > + streamBuffer->fence = -1; > } > > /* > @@ -170,14 +168,15 @@ 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()) { > + streamBuffer->dstBuffer = std::make_unique<CameraBuffer>( > + *streamBuffer->camera3Buffer, output.pixelFormat, output.size, > + PROT_READ | PROT_WRITE); > + if (!streamBuffer->dstBuffer->isValid()) { > LOG(HAL, Error) << "Failed to create destination buffer"; > return -EINVAL; > } > > - return postProcessor_->process(source, &destBuffer, request); > + return postProcessor_->process(streamBuffer); > } > > FrameBuffer *CameraStream::getBuffer() > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h > index f242336e..e74a9a3b 100644 > --- a/src/android/camera_stream.h > +++ b/src/android/camera_stream.h > @@ -121,9 +121,7 @@ public: > libcamera::Stream *stream() const; > > int configure(); > - int process(const libcamera::FrameBuffer &source, > - Camera3RequestDescriptor::StreamBuffer &dest, > - Camera3RequestDescriptor *request); > + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer); > 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..240e29f6 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->dstBuffer.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..70385ab3 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->dstBuffer.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,
Quoting Laurent Pinchart (2021-10-25 22:51:57) > Hi Umang, > > Thank you for the patch. > > On Tue, Oct 26, 2021 at 02:08:30AM +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 CameraStream::process() and 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@ideasonboard.com> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > Reviewed-by: Hirokazu Honda <hiroh@chromium.org> > > --- > > src/android/camera_device.cpp | 13 ++++++++----- > > src/android/camera_request.cpp | 5 ++++- > > src/android/camera_request.h | 5 +++++ > > src/android/camera_stream.cpp | 23 +++++++++++------------ > > src/android/camera_stream.h | 4 +--- > > 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, 44 insertions(+), 40 deletions(-) > > > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > > index bf9a2e69..9155728a 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; > > } > > @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request) > > continue; > > } > > > > - int ret = stream->process(*src, buffer, descriptor); > > + buffer.srcBuffer = src; > > + > > + int ret = stream->process(&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..5bac1b8f 100644 > > --- a/src/android/camera_request.cpp > > +++ b/src/android/camera_request.cpp > > @@ -9,6 +9,8 @@ > > > > #include <libcamera/base/span.h> > > > > +#include "camera_buffer.h" > > + > > using namespace libcamera; > > > > /* > > @@ -36,7 +38,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 4d80ef32..c7fda00d 100644 > > --- a/src/android/camera_request.h > > +++ b/src/android/camera_request.h > > @@ -21,6 +21,7 @@ > > #include "camera_worker.h" > > > > class CameraStream; > > +class CameraBuffer; > > Alphabetical order please :-) I can't find an option for forward declarations in clang-format ;-( I would have expected this to be something it could handle. Never mind ... -- Kieran > > > > > class Camera3RequestDescriptor > > { > > @@ -36,6 +37,10 @@ public: > > std::unique_ptr<libcamera::FrameBuffer> frameBuffer; > > int fence; > > Status status; > > + libcamera::FrameBuffer *internalBuffer; > > + const libcamera::FrameBuffer *srcBuffer; > > + std::unique_ptr<CameraBuffer> dstBuffer; > > + Camera3RequestDescriptor *request; > > }; > > > > Camera3RequestDescriptor(libcamera::Camera *camera, > > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp > > index 5d991fe5..282b19b0 100644 > > --- a/src/android/camera_stream.cpp > > +++ b/src/android/camera_stream.cpp > > @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence) > > return -errno; > > } > > > > -int CameraStream::process(const FrameBuffer &source, > > - Camera3RequestDescriptor::StreamBuffer &dest, > > - Camera3RequestDescriptor *request) > > +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) > > { > > ASSERT(type_ != Type::Direct); > > > > /* Handle waiting on fences on the destination buffer. */ > > - if (dest.fence != -1) { > > - int ret = waitFence(dest.fence); > > + if (streamBuffer->fence != -1) { > > + int ret = waitFence(streamBuffer->fence); > > if (ret < 0) { > > LOG(HAL, Error) << "Failed waiting for fence: " > > - << dest.fence << ": " << strerror(-ret); > > + << streamBuffer->fence << ": " << strerror(-ret); > > return ret; > > } > > > > - ::close(dest.fence); > > - dest.fence = -1; > > + ::close(streamBuffer->fence); > > + streamBuffer->fence = -1; > > } > > > > /* > > @@ -170,14 +168,15 @@ 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()) { > > + streamBuffer->dstBuffer = std::make_unique<CameraBuffer>( > > + *streamBuffer->camera3Buffer, output.pixelFormat, output.size, > > + PROT_READ | PROT_WRITE); > > + if (!streamBuffer->dstBuffer->isValid()) { > > LOG(HAL, Error) << "Failed to create destination buffer"; > > return -EINVAL; > > } > > > > - return postProcessor_->process(source, &destBuffer, request); > > + return postProcessor_->process(streamBuffer); > > } > > > > FrameBuffer *CameraStream::getBuffer() > > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h > > index f242336e..e74a9a3b 100644 > > --- a/src/android/camera_stream.h > > +++ b/src/android/camera_stream.h > > @@ -121,9 +121,7 @@ public: > > libcamera::Stream *stream() const; > > > > int configure(); > > - int process(const libcamera::FrameBuffer &source, > > - Camera3RequestDescriptor::StreamBuffer &dest, > > - Camera3RequestDescriptor *request); > > + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer); > > 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..240e29f6 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->dstBuffer.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..70385ab3 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->dstBuffer.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, > > -- > Regards, > > Laurent Pinchart
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index bf9a2e69..9155728a 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; } @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request) continue; } - int ret = stream->process(*src, buffer, descriptor); + buffer.srcBuffer = src; + + int ret = stream->process(&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..5bac1b8f 100644 --- a/src/android/camera_request.cpp +++ b/src/android/camera_request.cpp @@ -9,6 +9,8 @@ #include <libcamera/base/span.h> +#include "camera_buffer.h" + using namespace libcamera; /* @@ -36,7 +38,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 4d80ef32..c7fda00d 100644 --- a/src/android/camera_request.h +++ b/src/android/camera_request.h @@ -21,6 +21,7 @@ #include "camera_worker.h" class CameraStream; +class CameraBuffer; class Camera3RequestDescriptor { @@ -36,6 +37,10 @@ public: std::unique_ptr<libcamera::FrameBuffer> frameBuffer; int fence; Status status; + libcamera::FrameBuffer *internalBuffer; + const libcamera::FrameBuffer *srcBuffer; + std::unique_ptr<CameraBuffer> dstBuffer; + Camera3RequestDescriptor *request; }; Camera3RequestDescriptor(libcamera::Camera *camera, diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index 5d991fe5..282b19b0 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence) return -errno; } -int CameraStream::process(const FrameBuffer &source, - Camera3RequestDescriptor::StreamBuffer &dest, - Camera3RequestDescriptor *request) +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) { ASSERT(type_ != Type::Direct); /* Handle waiting on fences on the destination buffer. */ - if (dest.fence != -1) { - int ret = waitFence(dest.fence); + if (streamBuffer->fence != -1) { + int ret = waitFence(streamBuffer->fence); if (ret < 0) { LOG(HAL, Error) << "Failed waiting for fence: " - << dest.fence << ": " << strerror(-ret); + << streamBuffer->fence << ": " << strerror(-ret); return ret; } - ::close(dest.fence); - dest.fence = -1; + ::close(streamBuffer->fence); + streamBuffer->fence = -1; } /* @@ -170,14 +168,15 @@ 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()) { + streamBuffer->dstBuffer = std::make_unique<CameraBuffer>( + *streamBuffer->camera3Buffer, output.pixelFormat, output.size, + PROT_READ | PROT_WRITE); + if (!streamBuffer->dstBuffer->isValid()) { LOG(HAL, Error) << "Failed to create destination buffer"; return -EINVAL; } - return postProcessor_->process(source, &destBuffer, request); + return postProcessor_->process(streamBuffer); } FrameBuffer *CameraStream::getBuffer() diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h index f242336e..e74a9a3b 100644 --- a/src/android/camera_stream.h +++ b/src/android/camera_stream.h @@ -121,9 +121,7 @@ public: libcamera::Stream *stream() const; int configure(); - int process(const libcamera::FrameBuffer &source, - Camera3RequestDescriptor::StreamBuffer &dest, - Camera3RequestDescriptor *request); + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer); 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..240e29f6 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->dstBuffer.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..70385ab3 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->dstBuffer.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,