[PATCH 8/9] libcamera: v4l2_subdevice: Replace Routing::toString() with operator<<()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Feb 28 11:52:23 CET 2024


On Wed, Feb 28, 2024 at 09:39:49AM +0100, Jacopo Mondi wrote:
> On Tue, Feb 27, 2024 at 04:09:52PM +0200, Laurent Pinchart wrote:
> > The main (and only at the moment) use case for the Routing::toString()
> > function is to print a representation of the routing table in a log
> > message. The function is implemented using an std::stringstream, and the
> > returned std::string is then inserted into an std::ostream. This is
> > inefficient. Replace the function with a specialization of the
> > operator<<() and use it in the caller.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  include/libcamera/internal/v4l2_subdevice.h |  7 ++---
> >  src/libcamera/pipeline/simple/simple.cpp    |  2 +-
> >  src/libcamera/v4l2_subdevice.cpp            | 29 +++++++++++----------
> >  3 files changed, 18 insertions(+), 20 deletions(-)
> >
> > diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
> > index 65003394a984..2f64b3deadfe 100644
> > --- a/include/libcamera/internal/v4l2_subdevice.h
> > +++ b/include/libcamera/internal/v4l2_subdevice.h
> > @@ -85,11 +85,7 @@ public:
> >  		unsigned int stream;
> >  	};
> >
> > -	class Routing : public std::vector<struct v4l2_subdev_route>
> > -	{
> > -	public:
> > -		std::string toString() const;
> > -	};
> > +	using Routing = std::vector<struct v4l2_subdev_route>;
> >
> >  	explicit V4L2Subdevice(const MediaEntity *entity);
> >  	~V4L2Subdevice();
> > @@ -161,5 +157,6 @@ private:
> >  };
> >
> >  std::ostream &operator<<(std::ostream &out, const V4L2Subdevice::Stream &stream);
> > +std::ostream &operator<<(std::ostream &out, const V4L2Subdevice::Routing &routing);
> >
> >  } /* namespace libcamera */
> > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> > index 1145e80847ba..1dbbd7fe91d6 100644
> > --- a/src/libcamera/pipeline/simple/simple.cpp
> > +++ b/src/libcamera/pipeline/simple/simple.cpp
> > @@ -1387,7 +1387,7 @@ int SimplePipelineHandler::resetRoutingTable(V4L2Subdevice *subdev)
> >
> >  	LOG(SimplePipeline, Debug)
> >  		<< "Routing table of " << subdev->deviceNode()
> > -		<< " reset to " << routing.toString();
> > +		<< " reset to " << routing;
> >
> >  	return 0;
> >  }
> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> > index efe8b0f793e9..1670c31a9656 100644
> > --- a/src/libcamera/v4l2_subdevice.cpp
> > +++ b/src/libcamera/v4l2_subdevice.cpp
> > @@ -844,30 +844,31 @@ std::ostream &operator<<(std::ostream &out, const V4L2Subdevice::Stream &stream)
> >  }
> >
> >  /**
> > - * \class V4L2Subdevice::Routing
> > + * \typedef V4L2Subdevice::Routing
> >   * \brief V4L2 subdevice routing table
> >   *
> >   * This class stores a subdevice routing table as a vector of routes.
> >   */
> >
> >  /**
> > - * \brief Assemble and return a string describing the routing table
> > - * \return A string describing the routing table
> > + * \brief Insert a text representation of a V4L2Subdevice::Routing into an
> > + *	output stream
> 
> Intentional ?

Let's continue the discussion on this topic in patch 7/9, I'll then adapt this one.

> This nit apart
> Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> 
> > + * \param[in] out The output stream
> > + * \param[in] routing The V4L2Subdevice::Routing
> > + * \return The output stream \a out
> >   */
> > -std::string V4L2Subdevice::Routing::toString() const
> > +std::ostream &operator<<(std::ostream &out, const V4L2Subdevice::Routing &routing)
> >  {
> > -	std::stringstream routing;
> > -
> > -	for (const auto &[i, route] : utils::enumerate(*this)) {
> > -		routing << "[" << i << "] "
> > -			<< route.sink_pad << "/" << route.sink_stream << " -> "
> > -			<< route.source_pad << "/" << route.source_stream
> > -			<< " (" << utils::hex(route.flags) << ")";
> > -		if (i != size() - 1)
> > -			routing << ", ";
> > +	for (const auto &[i, route] : utils::enumerate(routing)) {
> > +		out << "[" << i << "] "
> > +		    << route.sink_pad << "/" << route.sink_stream << " -> "
> > +		    << route.source_pad << "/" << route.source_stream
> > +		    << " (" << utils::hex(route.flags) << ")";
> > +		if (i != routing.size() - 1)
> > +			out << ", ";
> >  	}
> >
> > -	return routing.str();
> > +	return out;
> >  }
> >
> >  /**

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list