[libcamera-devel] [PATCH 02/10] libcamera: pipeline: simple: Add sink and source pads to entity data

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Aug 16 16:41:21 CEST 2021


Hi Laurent,

On 05/08/2021 23:24, Laurent Pinchart wrote:
> Record the sink and source pads through which an entity is traversed in
> the list of entities stored in the camera data. This prepares for
> implementing mutually exclusive access to entities between cameras.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++----
>  1 file changed, 32 insertions(+), 6 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index b29fff9820e5..e0695d052629 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -166,7 +166,22 @@ public:
>  	}
>  
>  	struct Entity {
> +		/* The media entity, always valid. */
>  		MediaEntity *entity;
> +		/*
> +		 * The local sink pad connected to the upstream entity, null for
> +		 * the camera sensor at the beginning of the pipeline.
> +		 */
> +		const MediaPad *sink;
> +		/*
> +		 * The local source pad connected to the downstream entity, null
> +		 * for the video node at the end of the pipeline.
> +		 */
> +		const MediaPad *source;
> +		/*
> +		 * The link to the downstream entity, null for the video node at
> +		 * the end of the pipeline.
> +		 */
>  		MediaLink *link;
>  	};
>  
> @@ -288,16 +303,18 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
>  	 * encoders and image converters, and will end in a CSI capture device.
>  	 */
>  	std::unordered_set<MediaEntity *> visited;
> -	std::queue<MediaEntity *> queue;
> +	std::queue<std::tuple<MediaEntity *, MediaPad *>> queue;
>  
>  	/* Remember at each entity where we came from. */
>  	std::unordered_map<MediaEntity *, Entity> parents;
>  	MediaEntity *entity = nullptr;
>  
> -	queue.push(sensor);
> +	queue.push({ sensor, nullptr });
>  
>  	while (!queue.empty()) {
> -		entity = queue.front();
> +		MediaPad *sinkPad;
> +
> +		std::tie(entity, sinkPad) = queue.front();
>  		queue.pop();
>  
>  		/* Found the capture device. */
> @@ -317,8 +334,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
>  			for (MediaLink *link : pad->links()) {
>  				MediaEntity *next = link->sink()->entity();
>  				if (visited.find(next) == visited.end()) {
> -					queue.push(next);
> -					parents.insert({ next, { entity, link } });
> +					queue.push({ next, link->sink() });
> +					parents.insert({ next, { entity, sinkPad, pad, link } });
>  				}
>  			}
>  		}
> @@ -349,7 +366,16 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
>  	LOG(SimplePipeline, Debug)
>  		<< "Found pipeline: "
>  		<< utils::join(entities_, " -> ",
> -			       [](const Entity &e) { return e.entity->name(); });
> +			       [](const Entity &e) {
> +				       std::string s = "[";
> +				       if (e.sink)
> +					       s += std::to_string(e.sink->index()) + "|";
> +				       s += e.entity->name();
> +				       if (e.source)
> +					       s += "|" + std::to_string(e.source->index());
> +				       s += "]";
> +				       return s;
> +			       });

An example of the changes to string formatting would be nice in the
commit message, but not essential.

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


>  }
>  
>  int SimpleCameraData::init()
> 


More information about the libcamera-devel mailing list