[PATCH v1 1/3] libcamera: virtual: Avoid some copies

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Dec 17 17:54:40 CET 2024


Hi Barnabás,

On Wed, Dec 11, 2024 at 05:10:23PM +0000, Barnabás Pőcze wrote:
> 2024. december 11., szerda 17:40 keltezéssel, Laurent Pinchart írta:
> > On Wed, Dec 11, 2024 at 03:25:45PM +0000, Barnabás Pőcze wrote:
> > > There is no reason make copies, these functions return
> > > const lvalue references, access the data through those.
> > >
> > > Signed-off-by: Barnabás Pőcze <pobrn at protonmail.com>
> > 
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > 
> > with one comment below.
> > 
> > > ---
> > >  src/libcamera/pipeline/virtual/image_frame_generator.cpp  | 2 +-
> > >  src/libcamera/pipeline/virtual/test_pattern_generator.cpp | 2 +-
> > >  src/libcamera/pipeline/virtual/virtual.cpp                | 3 +--
> > >  3 files changed, 3 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/virtual/image_frame_generator.cpp b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> > > index 277efbb09..d1545b5d9 100644
> > > --- a/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> > > +++ b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
> > > @@ -129,7 +129,7 @@ int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
> > >
> > >  	MappedFrameBuffer mappedFrameBuffer(buffer, MappedFrameBuffer::MapFlag::Write);
> > >
> > > -	auto planes = mappedFrameBuffer.planes();
> > > +	const auto &planes = mappedFrameBuffer.planes();
> > >
> > >  	/* Loop only around the number of images available */
> > >  	frameIndex_ %= imageFrameDatas_.size();
> > > diff --git a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> > > index 7bc2b338c..47d341919 100644
> > > --- a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> > > +++ b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
> > > @@ -25,7 +25,7 @@ int TestPatternGenerator::generateFrame(const Size &size,
> > >  	MappedFrameBuffer mappedFrameBuffer(buffer,
> > >  					    MappedFrameBuffer::MapFlag::Write);
> > >
> > > -	auto planes = mappedFrameBuffer.planes();
> > > +	const auto &planes = mappedFrameBuffer.planes();
> > >
> > >  	shiftLeft(size);
> > >
> > > diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp
> > > index 1b7cd5cb3..3126bdd7d 100644
> > > --- a/src/libcamera/pipeline/virtual/virtual.cpp
> > > +++ b/src/libcamera/pipeline/virtual/virtual.cpp
> > > @@ -275,8 +275,7 @@ int PipelineHandlerVirtual::exportFrameBuffers([[maybe_unused]] Camera *camera,
> > >  		return -ENOBUFS;
> > >
> > >  	const StreamConfiguration &config = stream->configuration();
> > > -
> > > -	auto info = PixelFormatInfo::info(config.pixelFormat);
> > > +	const PixelFormatInfo &info = PixelFormatInfo::info(config.pixelFormat);
> > 
> > There's also a similar issue in src/libcamera/pipeline/imx8-isi/imx8-isi.cpp:
> > 
> > 	const PixelFormatInfo info = PixelFormatInfo::info(config_[0].pixelFormat);
> > 
> > It would be nice to disable the PixelFormatInfo copy constructor (using
> > LIBCAMERA_DISABLE_COPY() or even LIBCAMERA_DISABLE_COPY_AND_MOVE()), but
> > that interferes with the designated initializer syntax we use in
> > formats.cpp to populate the pixelFormatInfo array as aggregate
> > initialization is disabled for types that have user-declared
> > constructors (even if deleted). One option would be to define a
> > constructor for the class, but we then lose the ability to use
> > designated initializers. Maybe that's not a big issue ?
> > 
> > Could you have a look at this ?
> > [...]
> 
> That map is initialized from an `std::initializer_list` and that provides a `const`
> view of the data, so the map copy constructs the elements from the list. Deleting
> the copy constructor would make that not work. I think using an array and `std::move_iterator`
> could maybe work around that.
> 
> Returning a pointer from `PixelFormatInfo::info()` would also eliminate this kind of issue.
> 
> Also, there is the "performance-unnecessary-copy-initialization" clang-tidy check,
> but it seems it does not want to diagnose this situation. (Seemingly because
> the reference is returned by a static member function.)

OK, let's ignore this for the time being then.

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list