[libcamera-devel] [PATCH v2 1/4] libcamera: Add pointer to MediaDevice to MediaObject

Jacopo Mondi jacopo at jmondi.org
Tue Jan 8 20:33:51 CET 2019


On Tue, Jan 08, 2019 at 08:07:59PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Tuesday, 8 January 2019 19:04:04 EET Jacopo Mondi wrote:
> > Add a MediaDevice member field to the MediaObject class hierarcy.
> > Each media object now has a reference to the media device it belongs to,
> > and which it has been created by.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > v1->v2:
> > - Use the entity MediaDevice in MediaPad and MediaLink constructors
> > - Incorporate comments changes from Laurent and Niklas on v1
> >
> >  src/libcamera/include/media_object.h |  7 +++++--
> >  src/libcamera/media_device.cpp       |  4 ++--
> >  src/libcamera/media_object.cpp       | 27 +++++++++++++++++++--------
> >  3 files changed, 26 insertions(+), 12 deletions(-)
> >
> > diff --git a/src/libcamera/include/media_object.h
> > b/src/libcamera/include/media_object.h index 04b9a89..d92aab3 100644
> > --- a/src/libcamera/include/media_object.h
> > +++ b/src/libcamera/include/media_object.h
> > @@ -22,13 +22,16 @@ class MediaObject
> >  {
> >  public:
> >  	unsigned int id() const { return id_; }
> > +	MediaDevice *dev() const { return dev_; }
>
> For the reason explained in v1, I would make this either
>
> 	MediaDevice *dev() { return dev_; }
> 	const MediaDevice *dev() const { return dev_; }
>
> or just
>
> 	MediaDevice *dev() { return dev_; }

Ok, I might had missed that... a const function could be called on const
instances, and if you get a link, then you probably want to modify it,
and if you try to do so on a const MediaDevice instance, that will
fail... Is this what you're trying to protect?


>
> And I think you can spell the name of the function fully.
>

MediaDevice *device() {...}
?

> >  protected:
> >  	friend class MediaDevice;
> >
> > -	MediaObject(unsigned int id) : id_(id) { }
> > +	MediaObject(MediaDevice *dev, unsigned int id) :
> > +		dev_(dev), id_(id) { }
> >  	virtual ~MediaObject() { }
> >
> > +	MediaDevice *dev_;
> >  	unsigned int id_;
> >  };
> >
> > @@ -93,7 +96,7 @@ public:
> >  private:
> >  	friend class MediaDevice;
> >
> > -	MediaEntity(const struct media_v2_entity *entity,
> > +	MediaEntity(MediaDevice *media, const struct media_v2_entity *entity,
>
> If MediaObject is constructed with a MediaDevice *dev, should this be
> MediaDevice *dev too ?
>

Yes, I missed that

> >  		    unsigned int major = 0, unsigned int minor = 0);
> >  	MediaEntity(const MediaEntity &) = delete;
> >  	~MediaEntity();
> > diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> > index cf4ff90..b0d10ed 100644
> > --- a/src/libcamera/media_device.cpp
> > +++ b/src/libcamera/media_device.cpp
> > @@ -430,11 +430,11 @@ bool MediaDevice::populateEntities(const struct
> > media_v2_topology &topology)
> >
> >  		MediaEntity *entity;
> >  		if (iface)
> > -			entity = new MediaEntity(&mediaEntities[i],
> > +			entity = new MediaEntity(this, &mediaEntities[i],
> >  						 iface->devnode.major,
> >  						 iface->devnode.minor);
> >  		else
> > -			entity = new MediaEntity(&mediaEntities[i]);
> > +			entity = new MediaEntity(this, &mediaEntities[i]);
> >
> >  		if (!addObject(entity)) {
> >  			delete entity;
> > diff --git a/src/libcamera/media_object.cpp b/src/libcamera/media_object.cpp
> > index 06a8d64..612550d 100644
> > --- a/src/libcamera/media_object.cpp
> > +++ b/src/libcamera/media_object.cpp
> > @@ -42,16 +42,20 @@ namespace libcamera {
> >   * \class MediaObject
> >   * \brief Base class for all media objects
> >   *
> > - * MediaObject is an abstract base class for all media objects in the media
> > - * graph. Every media graph object is identified by an id unique in the
> > media - * device context, and this base class provides that.
> > + * MediaObject is an abstract base class for all media objects in the
> > + * media graph. Each object is identified by a reference to the media
> > + * device it belongs to and a unique id within that media device.
> > + * This base class provide helpers to media objects to keep track of
> > + * these identifiers.
> >   *
> >   * \sa MediaEntity, MediaPad, MediaLink
> >   */
> >
> >  /**
> >   * \fn MediaObject::MediaObject()
> > - * \brief Construct a MediaObject with \a id
> > + * \brief Construct a MediaObject part of the MediaDevice \a dev,
> > + * identified by the \a id unique in within the device
>
> s/in within/within/
>
> > + * \param dev The media device this object belongs to
> >   * \param id The media object id
> >   *
> >   * The caller shall ensure unicity of the object id in the media device
> > context. @@ -69,6 +73,11 @@ namespace libcamera {
> >   * \brief The media object id
> >   */
> >
> > +/**
> > + * \var MediaObject::dev_
> > + * \brief The media device the media object belongs to
> > + */
> > +
>
> Could you keep this in the same order as in the class definition ?
>

Yes, I have not updated this...

> >  /**
> >   * \class MediaLink
> >   * \brief The MediaLink represents a link between two pads in the media
> > graph. @@ -88,7 +97,7 @@ namespace libcamera {
> >   */
> >  MediaLink::MediaLink(const struct media_v2_link *link, MediaPad *source,
> >  		     MediaPad *sink)
> > -	: MediaObject(link->id), source_(source),
> > +	: MediaObject(source->dev(), link->id), source_(source),
> >  	  sink_(sink), flags_(link->flags)
> >  {
> >  }
> > @@ -139,7 +148,7 @@ MediaLink::MediaLink(const struct media_v2_link *link,
> > MediaPad *source, * \param entity The entity the pad belongs to
> >   */
> >  MediaPad::MediaPad(const struct media_v2_pad *pad, MediaEntity *entity)
> > -	: MediaObject(pad->id), index_(pad->index), entity_(entity),
> > +	: MediaObject(entity->dev(), pad->id), index_(pad->index),
> > entity_(entity), flags_(pad->flags)
> >  {
> >  }
> > @@ -283,13 +292,15 @@ int MediaEntity::setDeviceNode(const std::string
> > &devnode)
> >
> >  /**
> >   * \brief Construct a MediaEntity
> > + * \param dev The media device this entity belongs to
> >   * \param entity The media entity kernel data
> >   * \param major The major number of the entity associated interface
> >   * \param minor The minor number of the entity associated interface
> >   */
> > -MediaEntity::MediaEntity(const struct media_v2_entity *entity,
> > +MediaEntity::MediaEntity(MediaDevice *dev,
> > +			 const struct media_v2_entity *entity,
> >  			 unsigned int major, unsigned int minor)
> > -	: MediaObject(entity->id), name_(entity->name),
> > +	: MediaObject(dev, entity->id), name_(entity->name),
> >  	  major_(major), minor_(minor)
> >  {
> >  }
>
> With the small issues above fixed,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>

Thanks
  j

> --
> Regards,
>
> Laurent Pinchart
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190108/ac87607b/attachment-0001.sig>


More information about the libcamera-devel mailing list