[libcamera-devel,02/10] libcamera: pipeline: simple: Add sink and source pads to entity data
diff mbox series

Message ID 20210805222436.6263-3-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Concurrent camera support in simple pipeline handler
Related show

Commit Message

Laurent Pinchart Aug. 5, 2021, 10:24 p.m. UTC
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@ideasonboard.com>
---
 src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++----
 1 file changed, 32 insertions(+), 6 deletions(-)

Comments

Kieran Bingham Aug. 16, 2021, 2:41 p.m. UTC | #1
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@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@ideasonboard.com>


>  }
>  
>  int SimpleCameraData::init()
>
Laurent Pinchart Aug. 17, 2021, 12:02 a.m. UTC | #2
Hi Kieran,

On Mon, Aug 16, 2021 at 03:41:21PM +0100, Kieran Bingham wrote:
> 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@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.

Note that this is just a debug message, not the main point of the patch
:-) I'll add

The debug message that displays detected pipelines now prints pads to
describe the pipeline more precisely:

[0:00:35.901275750] [260] DEBUG SimplePipeline simple.cpp:404 Found pipeline: [imx290 2-001a|0] -> [0|csis-32e40000.csi|1] -> [0|mxc_isi.0|1] -> [0|mxc_isi.0.capture]

> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> 
> >  }
> >  
> >  int SimpleCameraData::init()
Kieran Bingham Aug. 17, 2021, 8:01 a.m. UTC | #3
On 17/08/2021 01:02, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Mon, Aug 16, 2021 at 03:41:21PM +0100, Kieran Bingham wrote:
>> 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@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.
> 
> Note that this is just a debug message, not the main point of the patch
> :-) I'll add

Of course, that's why I said not essential

> 
> The debug message that displays detected pipelines now prints pads to
> describe the pipeline more precisely:
> 
> [0:00:35.901275750] [260] DEBUG SimplePipeline simple.cpp:404 Found pipeline: [imx290 2-001a|0] -> [0|csis-32e40000.csi|1] -> [0|mxc_isi.0|1] -> [0|mxc_isi.0.capture]
> 

Thanks, I just think it's a good idea to show what the expected change
is when something changes something that is user (or developer, in this
instance) visible, to show the intention of the update.


>> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>
>>>  }
>>>  
>>>  int SimpleCameraData::init()
>

Patch
diff mbox series

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;
+			       });
 }
 
 int SimpleCameraData::init()