media: subdev: add "opposite" stream helper funcs
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Tue, 21 Dec 2021 10:22:06 +0000 (11:22 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sun, 22 Jan 2023 08:41:02 +0000 (09:41 +0100)
Add two helper functions to make dealing with streams easier:

v4l2_subdev_routing_find_opposite_end - given a routing table and a pad
+ stream, return the pad + stream on the opposite side of the subdev.

v4l2_subdev_state_get_opposite_stream_format - return a pointer to the
format on the pad + stream on the opposite side from the given pad +
stream.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/v4l2-core/v4l2-subdev.c
include/media/v4l2-subdev.h

index 0429da0..7bb7c0d 100644 (file)
@@ -1540,6 +1540,55 @@ v4l2_subdev_state_get_stream_compose(struct v4l2_subdev_state *state,
 }
 EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_stream_compose);
 
+int v4l2_subdev_routing_find_opposite_end(const struct v4l2_subdev_krouting *routing,
+                                         u32 pad, u32 stream, u32 *other_pad,
+                                         u32 *other_stream)
+{
+       unsigned int i;
+
+       for (i = 0; i < routing->num_routes; ++i) {
+               struct v4l2_subdev_route *route = &routing->routes[i];
+
+               if (route->source_pad == pad &&
+                   route->source_stream == stream) {
+                       if (other_pad)
+                               *other_pad = route->sink_pad;
+                       if (other_stream)
+                               *other_stream = route->sink_stream;
+                       return 0;
+               }
+
+               if (route->sink_pad == pad && route->sink_stream == stream) {
+                       if (other_pad)
+                               *other_pad = route->source_pad;
+                       if (other_stream)
+                               *other_stream = route->source_stream;
+                       return 0;
+               }
+       }
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(v4l2_subdev_routing_find_opposite_end);
+
+struct v4l2_mbus_framefmt *
+v4l2_subdev_state_get_opposite_stream_format(struct v4l2_subdev_state *state,
+                                            u32 pad, u32 stream)
+{
+       u32 other_pad, other_stream;
+       int ret;
+
+       ret = v4l2_subdev_routing_find_opposite_end(&state->routing,
+                                                   pad, stream,
+                                                   &other_pad, &other_stream);
+       if (ret)
+               return NULL;
+
+       return v4l2_subdev_state_get_stream_format(state, other_pad,
+                                                  other_stream);
+}
+EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_opposite_stream_format);
+
 #endif /* CONFIG_VIDEO_V4L2_SUBDEV_API */
 
 #endif /* CONFIG_MEDIA_CONTROLLER */
index 643cdcd..cf8cbbf 100644 (file)
@@ -1532,6 +1532,42 @@ struct v4l2_rect *
 v4l2_subdev_state_get_stream_compose(struct v4l2_subdev_state *state,
                                     unsigned int pad, u32 stream);
 
+/**
+ * v4l2_subdev_routing_find_opposite_end() - Find the opposite stream
+ * @routing: routing used to find the opposite side
+ * @pad: pad id
+ * @stream: stream id
+ * @other_pad: pointer used to return the opposite pad
+ * @other_stream: pointer used to return the opposite stream
+ *
+ * This function uses the routing table to find the pad + stream which is
+ * opposite the given pad + stream.
+ *
+ * @other_pad and/or @other_stream can be NULL if the caller does not need the
+ * value.
+ *
+ * Returns 0 on success, or -EINVAL if no matching route is found.
+ */
+int v4l2_subdev_routing_find_opposite_end(const struct v4l2_subdev_krouting *routing,
+                                         u32 pad, u32 stream, u32 *other_pad,
+                                         u32 *other_stream);
+
+/**
+ * v4l2_subdev_state_get_opposite_stream_format() - Get pointer to opposite
+ *                                                  stream format
+ * @state: subdevice state
+ * @pad: pad id
+ * @stream: stream id
+ *
+ * This returns a pointer to &struct v4l2_mbus_framefmt for the pad + stream
+ * that is opposite the given pad + stream in the subdev state.
+ *
+ * If the state does not contain the given pad + stream, NULL is returned.
+ */
+struct v4l2_mbus_framefmt *
+v4l2_subdev_state_get_opposite_stream_format(struct v4l2_subdev_state *state,
+                                            u32 pad, u32 stream);
+
 #endif /* CONFIG_VIDEO_V4L2_SUBDEV_API */
 
 #endif /* CONFIG_MEDIA_CONTROLLER */