[libcamera-devel] [PATCH v5 3/9] libcamera: media_device: Handle ancillary links in populateLinks()
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Wed Mar 9 16:12:39 CET 2022
Hi !
Thanks for the patch !
On 04/03/2022 00:49, Daniel Scally wrote:
> The populateLinks() function can't currently handle ancillary links
> which causes an error to be thrown in process() when the MediaObject
> cannot be cast to a MediaPad.
>
> Add explicit handling for the different link types, creating either
> pad-2-pad links or else storing the pointer to the ancillary device
> MediaEntity in the ancillaryEntities_ member of the primary.
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Daniel Scally <djrscally at gmail.com>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> Changes in v5:
> - Fix some formatting and comments (Laurent)
>
> Changes in v4:
>
> - Added some error checking to confirm that the casts to pad or entity
> return valid pointers (Laurent)
>
> Changes in v3:
>
> - Split out the new macro
> - Fixed some style errors and comments
> - Added a default case
>
> src/libcamera/media_device.cpp | 64 +++++++++++++++++++++++++---------
> 1 file changed, 48 insertions(+), 16 deletions(-)
>
> diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> index 941f86c2..7c94da9e 100644
> --- a/src/libcamera/media_device.cpp
> +++ b/src/libcamera/media_device.cpp
> @@ -683,40 +683,72 @@ bool MediaDevice::populateLinks(const struct media_v2_topology &topology)
> (topology.ptr_links);
>
> for (unsigned int i = 0; i < topology.num_links; ++i) {
> - /* We only care about pad-2-pad links here. */
> - if ((mediaLinks[i].flags & MEDIA_LNK_FL_LINK_TYPE) !=
> - MEDIA_LNK_FL_DATA_LINK)
> + if ((mediaLinks[i].flags & MEDIA_LNK_FL_LINK_TYPE) ==
> + MEDIA_LNK_FL_INTERFACE_LINK)
> continue;
>
> - /* Store references to source and sink pads in the link. */
> + /* Look up the source and sink objects. */
> unsigned int source_id = mediaLinks[i].source_id;
> - MediaPad *source = dynamic_cast<MediaPad *>
> - (object(source_id));
> + MediaObject *source = object(source_id);
> if (!source) {
> LOG(MediaDevice, Error)
> - << "Failed to find pad with id: "
> + << "Failed to find MediaObject with id "
> << source_id;
> return false;
> }
>
> unsigned int sink_id = mediaLinks[i].sink_id;
> - MediaPad *sink = dynamic_cast<MediaPad *>
> - (object(sink_id));
> + MediaObject *sink = object(sink_id);
> if (!sink) {
> LOG(MediaDevice, Error)
> - << "Failed to find pad with id: "
> + << "Failed to find MediaObject with id "
> << sink_id;
> return false;
> }
>
> - MediaLink *link = new MediaLink(&mediaLinks[i], source, sink);
> - if (!addObject(link)) {
> - delete link;
> - return false;
> + switch (mediaLinks[i].flags & MEDIA_LNK_FL_LINK_TYPE) {
> + case MEDIA_LNK_FL_DATA_LINK: {
> + MediaPad *sourcePad = dynamic_cast<MediaPad *>(source);
> + MediaPad *sinkPad = dynamic_cast<MediaPad *>(sink);
> + if (!source || !sink) {
> + LOG(MediaDevice, Error)
> + << "Source or sink is not a pad";
> + return false;
> + }
> +
> + MediaLink *link = new MediaLink(&mediaLinks[i],
> + sourcePad, sinkPad);
> + if (!addObject(link)) {
> + delete link;
> + return false;
> + }
> +
> + link->source()->addLink(link);
> + link->sink()->addLink(link);
> +
> + break;
> }
>
> - source->addLink(link);
> - sink->addLink(link);
> + case MEDIA_LNK_FL_ANCILLARY_LINK: {
> + MediaEntity *primary = dynamic_cast<MediaEntity *>(source);
> + MediaEntity *ancillary = dynamic_cast<MediaEntity *>(sink);
> + if (!primary || !ancillary) {
> + LOG(MediaDevice, Error)
> + << "Source or sink is not an entity";
> + return false;
> + }
> +
> + primary->addAncillaryEntity(ancillary);
> +
> + break;
> + }
> +
> + default:
> + LOG(MediaDevice, Warning)
> + << "Unknown media link type";
> +
> + break;
> + }
> }
>
> return true;
More information about the libcamera-devel
mailing list