[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