[libcamera-devel] [PATCH v3 03/10] android: camera_stream: Pass FrameBuffer pointer instead of reference
Hirokazu Honda
hiroh at chromium.org
Mon Sep 27 08:01:21 CEST 2021
Hi Umang, thank you for the patch.
On Tue, Sep 21, 2021 at 8:07 PM Jacopo Mondi <jacopo at jmondi.org> wrote:
>
> Hi Umang,
>
> On Mon, Sep 20, 2021 at 11:07:45PM +0530, Umang Jain wrote:
> > Pass the libcamera::FrameBuffer pointer to the post-processor instead
> > of passing it by reference. Passing by reference is fine as long as
> > the post processing is done synchronously.
> >
> > However in subsequent commits, the post processing is planned to be
> > moved to a separate thread. The reference argument (in current case
> > 'source') is copied when we will try to invoke a method on separate
> > thread (which will run the post-processor) using Object::invokeMethod().
> > As the 'source' is an instance of FrameBuffer class, which is
> > restricted by LIBCAMERA_DISABLE_COPY_AND_MOVE, passing the reference
> > to Object::invokeMethod() will try to copy it. Hence to avoid this copy,
> > pass in the FrameBuffer pointer instead of reference.
> >
> > This requires changes to the existing PostProcessor interface and all
> > its implemented classes.
> >
> > Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>
Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> Thanks
> j
>
> > ---
> > src/android/camera_device.cpp | 2 +-
> > src/android/camera_stream.cpp | 2 +-
> > src/android/camera_stream.h | 2 +-
> > src/android/jpeg/encoder.h | 2 +-
> > src/android/jpeg/encoder_libjpeg.cpp | 4 ++--
> > src/android/jpeg/encoder_libjpeg.h | 2 +-
> > src/android/jpeg/post_processor_jpeg.cpp | 4 ++--
> > src/android/jpeg/post_processor_jpeg.h | 4 ++--
> > src/android/jpeg/thumbnailer.cpp | 4 ++--
> > src/android/jpeg/thumbnailer.h | 2 +-
> > src/android/post_processor.h | 2 +-
> > src/android/yuv/post_processor_yuv.cpp | 18 +++++++++---------
> > src/android/yuv/post_processor_yuv.h | 4 ++--
> > 13 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index 0562c225..cc078fe4 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -1148,7 +1148,7 @@ void CameraDevice::requestComplete(Request *request)
> > continue;
> > }
> >
> > - int ret = cameraStream->process(*src, *buffer.buffer,
> > + int ret = cameraStream->process(src, *buffer.buffer,
> > descriptor->settings_,
> > resultMetadata.get());
> > /*
> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> > index 0f5ae947..0fed5382 100644
> > --- a/src/android/camera_stream.cpp
> > +++ b/src/android/camera_stream.cpp
> > @@ -98,7 +98,7 @@ int CameraStream::configure()
> > return 0;
> > }
> >
> > -int CameraStream::process(const FrameBuffer &source,
> > +int CameraStream::process(const FrameBuffer *source,
> > buffer_handle_t camera3Dest,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *resultMetadata)
> > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> > index 2dab6c3a..5c232cb6 100644
> > --- a/src/android/camera_stream.h
> > +++ b/src/android/camera_stream.h
> > @@ -118,7 +118,7 @@ public:
> > libcamera::Stream *stream() const;
> >
> > int configure();
> > - int process(const libcamera::FrameBuffer &source,
> > + int process(const libcamera::FrameBuffer *source,
> > buffer_handle_t camera3Dest,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *resultMetadata);
> > diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
> > index a28522f4..7b6140e7 100644
> > --- a/src/android/jpeg/encoder.h
> > +++ b/src/android/jpeg/encoder.h
> > @@ -18,7 +18,7 @@ public:
> > virtual ~Encoder() = default;
> >
> > virtual int configure(const libcamera::StreamConfiguration &cfg) = 0;
> > - virtual int encode(const libcamera::FrameBuffer &source,
> > + virtual int encode(const libcamera::FrameBuffer *source,
> > libcamera::Span<uint8_t> destination,
> > libcamera::Span<const uint8_t> exifData,
> > unsigned int quality) = 0;
> > diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
> > index 21a3b33d..3114ed4b 100644
> > --- a/src/android/jpeg/encoder_libjpeg.cpp
> > +++ b/src/android/jpeg/encoder_libjpeg.cpp
> > @@ -178,10 +178,10 @@ void EncoderLibJpeg::compressNV(const std::vector<Span<uint8_t>> &planes)
> > }
> > }
> >
> > -int EncoderLibJpeg::encode(const FrameBuffer &source, Span<uint8_t> dest,
> > +int EncoderLibJpeg::encode(const FrameBuffer *source, Span<uint8_t> dest,
> > Span<const uint8_t> exifData, unsigned int quality)
> > {
> > - MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);
> > + MappedFrameBuffer frame(source, MappedFrameBuffer::MapFlag::Read);
> > if (!frame.isValid()) {
> > LOG(JPEG, Error) << "Failed to map FrameBuffer : "
> > << strerror(frame.error());
> > diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
> > index 45ffbd7f..ae4e1e32 100644
> > --- a/src/android/jpeg/encoder_libjpeg.h
> > +++ b/src/android/jpeg/encoder_libjpeg.h
> > @@ -22,7 +22,7 @@ public:
> > ~EncoderLibJpeg();
> >
> > int configure(const libcamera::StreamConfiguration &cfg) override;
> > - int encode(const libcamera::FrameBuffer &source,
> > + int encode(const libcamera::FrameBuffer *source,
> > libcamera::Span<uint8_t> destination,
> > libcamera::Span<const uint8_t> exifData,
> > unsigned int quality) override;
> > diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
> > index ef2d98cc..cb45f86b 100644
> > --- a/src/android/jpeg/post_processor_jpeg.cpp
> > +++ b/src/android/jpeg/post_processor_jpeg.cpp
> > @@ -50,7 +50,7 @@ int PostProcessorJpeg::configure(const StreamConfiguration &inCfg,
> > return encoder_->configure(inCfg);
> > }
> >
> > -void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
> > +void PostProcessorJpeg::generateThumbnail(const FrameBuffer *source,
> > const Size &targetSize,
> > unsigned int quality,
> > std::vector<unsigned char> *thumbnail)
> > @@ -97,7 +97,7 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
> > }
> > }
> >
> > -int PostProcessorJpeg::process(const FrameBuffer &source,
> > +int PostProcessorJpeg::process(const FrameBuffer *source,
> > CameraBuffer *destination,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *resultMetadata)
> > diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h
> > index 6fd31022..c4b2e9ef 100644
> > --- a/src/android/jpeg/post_processor_jpeg.h
> > +++ b/src/android/jpeg/post_processor_jpeg.h
> > @@ -22,13 +22,13 @@ public:
> >
> > int configure(const libcamera::StreamConfiguration &incfg,
> > const libcamera::StreamConfiguration &outcfg) override;
> > - int process(const libcamera::FrameBuffer &source,
> > + int process(const libcamera::FrameBuffer *source,
> > CameraBuffer *destination,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *resultMetadata) override;
> >
> > private:
> > - void generateThumbnail(const libcamera::FrameBuffer &source,
> > + void generateThumbnail(const libcamera::FrameBuffer *source,
> > const libcamera::Size &targetSize,
> > unsigned int quality,
> > std::vector<unsigned char> *thumbnail);
> > diff --git a/src/android/jpeg/thumbnailer.cpp b/src/android/jpeg/thumbnailer.cpp
> > index 1fab8072..ffac6a15 100644
> > --- a/src/android/jpeg/thumbnailer.cpp
> > +++ b/src/android/jpeg/thumbnailer.cpp
> > @@ -37,11 +37,11 @@ void Thumbnailer::configure(const Size &sourceSize, PixelFormat pixelFormat)
> > valid_ = true;
> > }
> >
> > -void Thumbnailer::createThumbnail(const FrameBuffer &source,
> > +void Thumbnailer::createThumbnail(const FrameBuffer *source,
> > const Size &targetSize,
> > std::vector<unsigned char> *destination)
> > {
> > - MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);
> > + MappedFrameBuffer frame(source, MappedFrameBuffer::MapFlag::Read);
> > if (!frame.isValid()) {
> > LOG(Thumbnailer, Error)
> > << "Failed to map FrameBuffer : "
> > diff --git a/src/android/jpeg/thumbnailer.h b/src/android/jpeg/thumbnailer.h
> > index 4d086c49..0f3caf40 100644
> > --- a/src/android/jpeg/thumbnailer.h
> > +++ b/src/android/jpeg/thumbnailer.h
> > @@ -19,7 +19,7 @@ public:
> >
> > void configure(const libcamera::Size &sourceSize,
> > libcamera::PixelFormat pixelFormat);
> > - void createThumbnail(const libcamera::FrameBuffer &source,
> > + void createThumbnail(const libcamera::FrameBuffer *source,
> > const libcamera::Size &targetSize,
> > std::vector<unsigned char> *dest);
> > const libcamera::PixelFormat &pixelFormat() const { return pixelFormat_; }
> > diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> > index ab2b2c60..61dfb6d4 100644
> > --- a/src/android/post_processor.h
> > +++ b/src/android/post_processor.h
> > @@ -21,7 +21,7 @@ public:
> >
> > virtual int configure(const libcamera::StreamConfiguration &inCfg,
> > const libcamera::StreamConfiguration &outCfg) = 0;
> > - virtual int process(const libcamera::FrameBuffer &source,
> > + virtual int process(const libcamera::FrameBuffer *source,
> > CameraBuffer *destination,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *resultMetadata) = 0;
> > diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
> > index 7b3b4960..0a874886 100644
> > --- a/src/android/yuv/post_processor_yuv.cpp
> > +++ b/src/android/yuv/post_processor_yuv.cpp
> > @@ -49,7 +49,7 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
> > return 0;
> > }
> >
> > -int PostProcessorYuv::process(const FrameBuffer &source,
> > +int PostProcessorYuv::process(const FrameBuffer *source,
> > CameraBuffer *destination,
> > [[maybe_unused]] const CameraMetadata &requestMetadata,
> > [[maybe_unused]] CameraMetadata *metadata)
> > @@ -57,7 +57,7 @@ int PostProcessorYuv::process(const FrameBuffer &source,
> > if (!isValidBuffers(source, *destination))
> > return -EINVAL;
> >
> > - const MappedFrameBuffer sourceMapped(&source, MappedFrameBuffer::MapFlag::Read);
> > + const MappedFrameBuffer sourceMapped(source, MappedFrameBuffer::MapFlag::Read);
> > if (!sourceMapped.isValid()) {
> > LOG(YUV, Error) << "Failed to mmap camera frame buffer";
> > return -EINVAL;
> > @@ -83,12 +83,12 @@ int PostProcessorYuv::process(const FrameBuffer &source,
> > return 0;
> > }
> >
> > -bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
> > +bool PostProcessorYuv::isValidBuffers(const FrameBuffer *source,
> > const CameraBuffer &destination) const
> > {
> > - if (source.planes().size() != 2) {
> > + if (source->planes().size() != 2) {
> > LOG(YUV, Error) << "Invalid number of source planes: "
> > - << source.planes().size();
> > + << source->planes().size();
> > return false;
> > }
> > if (destination.numPlanes() != 2) {
> > @@ -97,12 +97,12 @@ bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
> > return false;
> > }
> >
> > - if (source.planes()[0].length < sourceLength_[0] ||
> > - source.planes()[1].length < sourceLength_[1]) {
> > + if (source->planes()[0].length < sourceLength_[0] ||
> > + source->planes()[1].length < sourceLength_[1]) {
> > LOG(YUV, Error)
> > << "The source planes lengths are too small, actual size: {"
> > - << source.planes()[0].length << ", "
> > - << source.planes()[1].length
> > + << source->planes()[0].length << ", "
> > + << source->planes()[1].length
> > << "}, expected size: {"
> > << sourceLength_[0] << ", "
> > << sourceLength_[1] << "}";
> > diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h
> > index f8b1ba23..44a04113 100644
> > --- a/src/android/yuv/post_processor_yuv.h
> > +++ b/src/android/yuv/post_processor_yuv.h
> > @@ -20,13 +20,13 @@ public:
> >
> > int configure(const libcamera::StreamConfiguration &incfg,
> > const libcamera::StreamConfiguration &outcfg) override;
> > - int process(const libcamera::FrameBuffer &source,
> > + int process(const libcamera::FrameBuffer *source,
> > CameraBuffer *destination,
> > const CameraMetadata &requestMetadata,
> > CameraMetadata *metadata) override;
> >
> > private:
> > - bool isValidBuffers(const libcamera::FrameBuffer &source,
> > + bool isValidBuffers(const libcamera::FrameBuffer *source,
> > const CameraBuffer &destination) const;
> > void calculateLengths(const libcamera::StreamConfiguration &inCfg,
> > const libcamera::StreamConfiguration &outCfg);
> > --
> > 2.31.1
> >
More information about the libcamera-devel
mailing list