[libcamera-devel] [PATCH 1/5] libcamera: Add support for ancillary links to MediaLink

Daniel Scally djrscally at gmail.com
Mon Nov 29 09:38:49 CET 2021


Morning Laurent

On 28/11/2021 22:02, Laurent Pinchart wrote:
> Hi Daniel,
>
> Thank you for the patch.
>
> On Fri, Nov 26, 2021 at 12:31:14AM +0000, Daniel Scally wrote:
>> Update the MediaLink class to include members suitable for the new
>> type of media_v2_link, connecting two instances of MediaEntity
>> rather than MediaPads
>>
>> Signed-off-by: Daniel Scally <djrscally at gmail.com>
>> ---
>>
>> Adding new members and a new constructor here seemed in the end like the least
>> impactful and probably cleanest method of doing this, as otherwise the source
>> and sink would need to become MediaObjects and be cast everywhere.
> I'm not really thrilled by this. Given that the purpose of ancillary
> links is to expose the relationship between a primary device and its
> ancillary devices, and given that those relationships don't carry any
> other property than their existence, I think adding a
>
> 	const std::vector<MediaEntity *> ancillaryEntities() const;
>
> (naming bikeshedding accepted) function to the MediaEntity class should
> be enough, without a need to extend the MediaLink API.


Fair enough...that would simplify patch two quite a lot too I suppose.
I'll switch to doing it that way for the v2.

>
>>  include/libcamera/internal/media_object.h | 10 ++++++++++
>>  src/libcamera/media_object.cpp            | 24 ++++++++++++++++++++++-
>>  2 files changed, 33 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/libcamera/internal/media_object.h b/include/libcamera/internal/media_object.h
>> index 6ae22c67..79c71325 100644
>> --- a/include/libcamera/internal/media_object.h
>> +++ b/include/libcamera/internal/media_object.h
>> @@ -45,6 +45,8 @@ class MediaLink : public MediaObject
>>  public:
>>  	MediaPad *source() const { return source_; }
>>  	MediaPad *sink() const { return sink_; }
>> +	MediaEntity *primary() const { return primary_; };
>> +	MediaEntity *ancillary() const { return ancillary_; };
>>  	unsigned int flags() const { return flags_; }
>>  	int setEnabled(bool enable);
>>  
>> @@ -55,9 +57,13 @@ private:
>>  
>>  	MediaLink(const struct media_v2_link *link,
>>  		  MediaPad *source, MediaPad *sink);
>> +	MediaLink(const struct media_v2_link *link,
>> +		  MediaEntity *primary, MediaEntity *ancillary);
>>  
>>  	MediaPad *source_;
>>  	MediaPad *sink_;
>> +	MediaEntity *primary_;
>> +	MediaEntity *ancillary_;
>>  	unsigned int flags_;
>>  };
>>  
>> @@ -104,12 +110,15 @@ public:
>>  	unsigned int deviceMinor() const { return minor_; }
>>  
>>  	const std::vector<MediaPad *> &pads() const { return pads_; }
>> +	const std::vector<MediaLink *> &ancillary_links() const { return ancillary_links_; }
>>  
>>  	const MediaPad *getPadByIndex(unsigned int index) const;
>>  	const MediaPad *getPadById(unsigned int id) const;
>>  
>>  	int setDeviceNode(const std::string &deviceNode);
>>  
>> +	void addLink(MediaLink *link);
>> +
>>  private:
>>  	LIBCAMERA_DISABLE_COPY_AND_MOVE(MediaEntity)
>>  
>> @@ -129,6 +138,7 @@ private:
>>  	unsigned int minor_;
>>  
>>  	std::vector<MediaPad *> pads_;
>> +	std::vector<MediaLink *> ancillary_links_;
>>  };
>>  
>>  } /* namespace libcamera */
>> diff --git a/src/libcamera/media_object.cpp b/src/libcamera/media_object.cpp
>> index f425d044..e903d5ef 100644
>> --- a/src/libcamera/media_object.cpp
>> +++ b/src/libcamera/media_object.cpp
>> @@ -134,7 +134,7 @@ int MediaLink::setEnabled(bool enable)
>>  }
>>  
>>  /**
>> - * \brief Construct a MediaLink
>> + * \brief Construct a MediaLink between two pads
>>   * \param[in] link The media link kernel data
>>   * \param[in] source The source pad at the origin of the link
>>   * \param[in] sink The sink pad at the destination of the link
>> @@ -146,6 +146,19 @@ MediaLink::MediaLink(const struct media_v2_link *link, MediaPad *source,
>>  {
>>  }
>>  
>> +/**
>> + * \brief Construct a MediaLink between two entities
>> + * \param[in] link The media link kernel data
>> + * \param[in] primary The primary entity at the origin of the link
>> + * \param[in] ancillary The ancillary entity at the destination of the link
>> + */
>> +MediaLink::MediaLink(const struct media_v2_link *link, MediaEntity *primary,
>> +		     MediaEntity *ancillary)
>> +	: MediaObject(primary->device(), link->id), primary_(primary),
>> +	  ancillary_(ancillary), flags_(link->flags)
>> +{
>> +}
>> +
>>  /**
>>   * \fn MediaLink::source()
>>   * \brief Retrieve the link's source pad
>> @@ -378,6 +391,15 @@ int MediaEntity::setDeviceNode(const std::string &deviceNode)
>>  	return 0;
>>  }
>>  
>> +/**
>> + * \brief Add an ancillary link to the MediaEntity
>> + * \param[in] link Pointer to the MediaLink class
>> + */
>> +void MediaEntity::addLink(MediaLink *link)
>> +{
>> +	ancillary_links_.push_back(link);
>> +}
>> +
>>  /**
>>   * \brief Construct a MediaEntity
>>   * \param[in] dev The media device this entity belongs to


More information about the libcamera-devel mailing list