[libcamera-devel] [PATCH 20/20] libcamera: pipeline: simple: Enable multiple streams for compatible devices

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Mar 2 12:11:12 CET 2021


On 31/01/2021 22:47, Laurent Pinchart wrote:
> Allow support for multiple streams on a per-device basis. The decision
> should be made based on the ability of the converter to run multiple
> times within the duration of one frame.

Well, that's not only hardware specific depending on how fast the
hardware can run, but also dependant upon the stream configurations - so
that's going to be complex to determine ;-)

Still we don't care here:

> Hardcode it in SimplePipelineInfo for now.

Because of that ;-)

> 
> We may later compute the number of supported streams dynamically based
> on the requested configuration, using converter bandwidth information
> instead of a hardcoded fixed value.
> 
> All platforms are currently limited to a single stream until they get
> successfully tested with multiple streams.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/libcamera/pipeline/simple/simple.cpp | 39 +++++++++++++-----------
>  1 file changed, 21 insertions(+), 18 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 55a5528611c8..4a8a7ed24960 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -126,14 +126,15 @@ class SimplePipelineHandler;
>  struct SimplePipelineInfo {
>  	const char *driver;
>  	const char *converter;
> +	unsigned int numStreams;
>  };
>  
>  namespace {
>  
>  static const SimplePipelineInfo supportedDevices[] = {
> -	{ "imx7-csi", "pxp" },
> -	{ "qcom-camss", nullptr },
> -	{ "sun6i-csi", nullptr },
> +	{ "imx7-csi", "pxp", 1 },
> +	{ "qcom-camss", nullptr, 1 },
> +	{ "sun6i-csi", nullptr, 1 },
>  };
>  
>  } /* namespace */
> @@ -141,7 +142,9 @@ static const SimplePipelineInfo supportedDevices[] = {
>  class SimpleCameraData : public CameraData
>  {
>  public:
> -	SimpleCameraData(SimplePipelineHandler *pipe, MediaEntity *sensor);
> +	SimpleCameraData(SimplePipelineHandler *pipe,
> +			 const SimplePipelineInfo *info,
> +			 MediaEntity *sensor);
>  
>  	bool isValid() const { return sensor_ != nullptr; }
>  
> @@ -254,13 +257,12 @@ private:
>   */
>  
>  SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
> +				   const SimplePipelineInfo *info,
>  				   MediaEntity *sensor)
> -	: CameraData(pipe)
> +	: CameraData(pipe), streams_(info->numStreams)
>  {
>  	int ret;
>  
> -	streams_.resize(1);

I'm guessing that we already check at validate() or configure() that the
number of streams requested is less than streams_->size...

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> -
>  	/*
>  	 * Walk the pipeline towards the video node and store all entities
>  	 * along the way.
> @@ -864,25 +866,26 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
>  
>  bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
>  {
> +	const SimplePipelineInfo *info = nullptr;
>  	MediaDevice *converter = nullptr;
>  
> -	for (const SimplePipelineInfo &info : supportedDevices) {
> -		DeviceMatch dm(info.driver);
> +	for (const SimplePipelineInfo &inf : supportedDevices) {
> +		DeviceMatch dm(inf.driver);
>  		media_ = acquireMediaDevice(enumerator, dm);
> -		if (!media_)
> -			continue;
> -
> -		if (!info.converter)
> +		if (media_) {
> +			info = &inf;
>  			break;
> -
> -		DeviceMatch converterMatch(info.converter);
> -		converter = acquireMediaDevice(enumerator, converterMatch);
> -		break;
> +		}
>  	}
>  
>  	if (!media_)
>  		return false;
>  
> +	if (info->converter) {
> +		DeviceMatch converterMatch(info->converter);
> +		converter = acquireMediaDevice(enumerator, converterMatch);
> +	}
> +
>  	/* Locate the sensors. */
>  	std::vector<MediaEntity *> sensors;
>  
> @@ -926,7 +929,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
>  
>  	for (MediaEntity *sensor : sensors) {
>  		std::unique_ptr<SimpleCameraData> data =
> -			std::make_unique<SimpleCameraData>(this, sensor);
> +			std::make_unique<SimpleCameraData>(this, info, sensor);
>  		if (!data->isValid()) {
>  			LOG(SimplePipeline, Error)
>  				<< "No valid pipeline for sensor '"
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list