From: Dafna Hirschfeld <dafna@fastmail.com>
To: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Cc: linux-media@vger.kernel.org, sakari.ailus@linux.intel.com,
Jacopo Mondi <jacopo+renesas@jmondi.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
niklas.soderlund+renesas@ragnatech.se,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
Kishon Vijay Abraham <kishon@ti.com>,
satish.nagireddy@getcruise.com, Tomasz Figa <tfiga@chromium.org>
Subject: Re: [PATCH v15 10/19] media: subdev: add stream based configuration
Date: Sun, 9 Oct 2022 09:24:34 +0300 [thread overview]
Message-ID: <20221009062434.27flg66oxt6wxrc7@guri> (raw)
In-Reply-To: <20221003121852.616745-11-tomi.valkeinen@ideasonboard.com>
On 03.10.2022 15:18, Tomi Valkeinen wrote:
>Add support to manage configurations (format, crop, compose) per stream,
>instead of per pad. This is accomplished with data structures that hold
>an array of all subdev's stream configurations.
>
>The number of streams can vary at runtime based on routing. Every time
>the routing is changed, the stream configurations need to be
>re-initialized.
>
>Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>---
> .../v4l/vidioc-subdev-enum-frame-interval.rst | 5 +-
> .../v4l/vidioc-subdev-enum-frame-size.rst | 5 +-
> .../v4l/vidioc-subdev-enum-mbus-code.rst | 5 +-
> .../media/v4l/vidioc-subdev-g-crop.rst | 5 +-
> .../media/v4l/vidioc-subdev-g-fmt.rst | 5 +-
> .../v4l/vidioc-subdev-g-frame-interval.rst | 5 +-
> .../media/v4l/vidioc-subdev-g-selection.rst | 5 +-
> drivers/media/v4l2-core/v4l2-subdev.c | 154 +++++++++++++++++-
> include/media/v4l2-subdev.h | 79 +++++++++
> include/uapi/linux/v4l2-subdev.h | 28 +++-
> 10 files changed, 275 insertions(+), 21 deletions(-)
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-interval.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-interval.rst
>index 3703943b412f..8def4c05d3da 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-interval.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-interval.rst
>@@ -92,7 +92,10 @@ multiple pads of the same sub-device is not defined.
> - Frame intervals to be enumerated, from enum
> :ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`.
> * - __u32
>- - ``reserved``\ [8]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [7]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-size.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-size.rst
>index c25a9896df0e..3ef361c0dca7 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-size.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-size.rst
>@@ -97,7 +97,10 @@ information about try formats.
> - Frame sizes to be enumerated, from enum
> :ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`.
> * - __u32
>- - ``reserved``\ [8]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [7]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst
>index 417f1a19bcc4..248f6f9ee7c5 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst
>@@ -73,7 +73,10 @@ information about the try formats.
> - ``flags``
> - See :ref:`v4l2-subdev-mbus-code-flags`
> * - __u32
>- - ``reserved``\ [7]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [6]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-crop.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-crop.rst
>index bd15c0a5a66b..1d267f7e7991 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-crop.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-crop.rst
>@@ -96,7 +96,10 @@ modified format should be as close as possible to the original request.
> - ``rect``
> - Crop rectangle boundaries, in pixels.
> * - __u32
>- - ``reserved``\ [8]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [7]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-fmt.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-fmt.rst
>index 7acdbb939d89..ed253a1e44b7 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-fmt.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-fmt.rst
>@@ -102,7 +102,10 @@ should be as close as possible to the original request.
> - Definition of an image format, see :c:type:`v4l2_mbus_framefmt` for
> details.
> * - __u32
>- - ``reserved``\ [8]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [7]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-frame-interval.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-frame-interval.rst
>index d7fe7543c506..842f962d2aea 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-frame-interval.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-frame-interval.rst
>@@ -90,7 +90,10 @@ the same sub-device is not defined.
> - ``interval``
> - Period, in seconds, between consecutive video frames.
> * - __u32
>- - ``reserved``\ [9]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [8]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-selection.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-selection.rst
>index f9172a42f036..6b629c19168c 100644
>--- a/Documentation/userspace-api/media/v4l/vidioc-subdev-g-selection.rst
>+++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-g-selection.rst
>@@ -94,7 +94,10 @@ Selection targets and flags are documented in
> - ``r``
> - Selection rectangle, in pixels.
> * - __u32
>- - ``reserved``\ [8]
>+ - ``stream``
>+ - Stream identifier.
>+ * - __u32
>+ - ``reserved``\ [7]
> - Reserved for future extensions. Applications and drivers must set
> the array to zero.
>
>diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
>index 1049c07d2e49..be778e619694 100644
>--- a/drivers/media/v4l2-core/v4l2-subdev.c
>+++ b/drivers/media/v4l2-core/v4l2-subdev.c
>@@ -159,8 +159,22 @@ static inline int check_pad(struct v4l2_subdev *sd, u32 pad)
> return 0;
> }
>
>-static int check_state_pads(u32 which, struct v4l2_subdev_state *state)
>+static int check_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
>+ u32 which, u32 pad, u32 stream)
> {
>+ if (sd->flags & V4L2_SUBDEV_FL_STREAMS) {
>+#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
>+ if (!v4l2_subdev_state_get_stream_format(state, pad, stream))
>+ return -EINVAL;
>+ return 0;
>+#else
>+ return -EINVAL;
>+#endif
>+ }
>+
>+ if (stream != 0)
>+ return -EINVAL;
>+
> if (which == V4L2_SUBDEV_FORMAT_TRY && (!state || !state->pads))
> return -EINVAL;
>
>@@ -175,7 +189,7 @@ static inline int check_format(struct v4l2_subdev *sd,
> return -EINVAL;
>
> return check_which(format->which) ? : check_pad(sd, format->pad) ? :
>- check_state_pads(format->which, state);
>+ check_state(sd, state, format->which, format->pad, format->stream);
> }
>
> static int call_get_fmt(struct v4l2_subdev *sd,
>@@ -202,7 +216,7 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd,
> return -EINVAL;
>
> return check_which(code->which) ? : check_pad(sd, code->pad) ? :
>- check_state_pads(code->which, state) ? :
>+ check_state(sd, state, code->which, code->pad, code->stream) ? :
> sd->ops->pad->enum_mbus_code(sd, state, code);
> }
>
>@@ -214,7 +228,7 @@ static int call_enum_frame_size(struct v4l2_subdev *sd,
> return -EINVAL;
>
> return check_which(fse->which) ? : check_pad(sd, fse->pad) ? :
>- check_state_pads(fse->which, state) ? :
>+ check_state(sd, state, fse->which, fse->pad, fse->stream) ? :
> sd->ops->pad->enum_frame_size(sd, state, fse);
> }
>
>@@ -249,7 +263,7 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd,
> return -EINVAL;
>
> return check_which(fie->which) ? : check_pad(sd, fie->pad) ? :
>- check_state_pads(fie->which, state) ? :
>+ check_state(sd, state, fie->which, fie->pad, fie->stream) ? :
> sd->ops->pad->enum_frame_interval(sd, state, fie);
> }
>
>@@ -261,7 +275,7 @@ static inline int check_selection(struct v4l2_subdev *sd,
> return -EINVAL;
>
> return check_which(sel->which) ? : check_pad(sd, sel->pad) ? :
>- check_state_pads(sel->which, state);
>+ check_state(sd, state, sel->which, sel->pad, sel->stream);
> }
>
> static int call_get_selection(struct v4l2_subdev *sd,
>@@ -1095,7 +1109,8 @@ __v4l2_subdev_state_alloc(struct v4l2_subdev *sd, const char *lock_name,
> else
> state->lock = &state->_lock;
>
>- if (sd->entity.num_pads) {
>+ /* Drivers that support streams do not need the legacy pad config */
>+ if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS) && sd->entity.num_pads) {
> state->pads = kvcalloc(sd->entity.num_pads,
> sizeof(*state->pads), GFP_KERNEL);
> if (!state->pads) {
>@@ -1135,6 +1150,7 @@ void __v4l2_subdev_state_free(struct v4l2_subdev_state *state)
> mutex_destroy(&state->_lock);
>
> kfree(state->routing.routes);
>+ kvfree(state->stream_configs.configs);
> kvfree(state->pads);
> kfree(state);
> }
>@@ -1164,6 +1180,59 @@ EXPORT_SYMBOL_GPL(v4l2_subdev_cleanup);
>
> #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
>
>+static int
>+v4l2_subdev_init_stream_configs(struct v4l2_subdev_stream_configs *stream_configs,
>+ const struct v4l2_subdev_krouting *routing)
>+{
>+ struct v4l2_subdev_stream_configs new_configs = { 0 };
>+ struct v4l2_subdev_route *route;
>+ u32 format_idx = 0;
I think you don't need both format_idx and idx,
also, it can be 'int'
Thanks,
Dafna
>+
>+ /* Count number of formats needed */
>+ for_each_active_route(routing, route) {
>+ /*
>+ * Each route needs a format on both ends of the route, except
>+ * for source streams which only need one format.
>+ */
>+ new_configs.num_configs +=
>+ (route->flags & V4L2_SUBDEV_ROUTE_FL_SOURCE) ? 1 : 2;
>+ }
>+
>+ if (new_configs.num_configs) {
>+ new_configs.configs = kvcalloc(new_configs.num_configs,
>+ sizeof(*new_configs.configs),
>+ GFP_KERNEL);
>+
>+ if (!new_configs.configs)
>+ return -ENOMEM;
>+ }
>+
>+ /*
>+ * Fill in the 'pad' and stream' value for each item in the array from
>+ * the routing table
>+ */
>+ for_each_active_route(routing, route) {
>+ u32 idx;
>+
>+ if (!(route->flags & V4L2_SUBDEV_ROUTE_FL_SOURCE)) {
>+ idx = format_idx++;
>+
>+ new_configs.configs[idx].pad = route->sink_pad;
>+ new_configs.configs[idx].stream = route->sink_stream;
>+ }
>+
>+ idx = format_idx++;
>+
>+ new_configs.configs[idx].pad = route->source_pad;
>+ new_configs.configs[idx].stream = route->source_stream;
>+ }
>+
>+ kvfree(stream_configs->configs);
>+ *stream_configs = new_configs;
>+
>+ return 0;
>+}
>+
> int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
> struct v4l2_subdev_format *format)
> {
>@@ -1190,6 +1259,7 @@ int v4l2_subdev_set_routing(struct v4l2_subdev *sd,
> const struct v4l2_subdev_krouting *src = routing;
> struct v4l2_subdev_krouting new_routing = { 0 };
> size_t bytes;
>+ int r;
>
> if (unlikely(check_mul_overflow(src->num_routes, sizeof(*src->routes),
> &bytes)))
>@@ -1205,6 +1275,13 @@ int v4l2_subdev_set_routing(struct v4l2_subdev *sd,
>
> new_routing.num_routes = src->num_routes;
>
>+ r = v4l2_subdev_init_stream_configs(&state->stream_configs,
>+ &new_routing);
>+ if (r) {
>+ kfree(new_routing.routes);
>+ return r;
>+ }
>+
> kfree(dst->routes);
> *dst = new_routing;
>
>@@ -1232,6 +1309,69 @@ __v4l2_subdev_next_active_route(const struct v4l2_subdev_krouting *routing,
> }
> EXPORT_SYMBOL_GPL(__v4l2_subdev_next_active_route);
>
>+struct v4l2_mbus_framefmt *
>+v4l2_subdev_state_get_stream_format(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream)
>+{
>+ struct v4l2_subdev_stream_configs *stream_configs;
>+ unsigned int i;
>+
>+ lockdep_assert_held(state->lock);
>+
>+ stream_configs = &state->stream_configs;
>+
>+ for (i = 0; i < stream_configs->num_configs; ++i) {
>+ if (stream_configs->configs[i].pad == pad &&
>+ stream_configs->configs[i].stream == stream)
>+ return &stream_configs->configs[i].fmt;
>+ }
>+
>+ return NULL;
>+}
>+EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_stream_format);
>+
>+struct v4l2_rect *
>+v4l2_subdev_state_get_stream_crop(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream)
>+{
>+ struct v4l2_subdev_stream_configs *stream_configs;
>+ unsigned int i;
>+
>+ lockdep_assert_held(state->lock);
>+
>+ stream_configs = &state->stream_configs;
>+
>+ for (i = 0; i < stream_configs->num_configs; ++i) {
>+ if (stream_configs->configs[i].pad == pad &&
>+ stream_configs->configs[i].stream == stream)
>+ return &stream_configs->configs[i].crop;
>+ }
>+
>+ return NULL;
>+}
>+EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_stream_crop);
>+
>+struct v4l2_rect *
>+v4l2_subdev_state_get_stream_compose(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream)
>+{
>+ struct v4l2_subdev_stream_configs *stream_configs;
>+ unsigned int i;
>+
>+ lockdep_assert_held(state->lock);
>+
>+ stream_configs = &state->stream_configs;
>+
>+ for (i = 0; i < stream_configs->num_configs; ++i) {
>+ if (stream_configs->configs[i].pad == pad &&
>+ stream_configs->configs[i].stream == stream)
>+ return &stream_configs->configs[i].compose;
>+ }
>+
>+ return NULL;
>+}
>+EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_stream_compose);
>+
> #endif /* CONFIG_VIDEO_V4L2_SUBDEV_API */
>
> #endif /* CONFIG_MEDIA_CONTROLLER */
>diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
>index 89e58208e330..d6273ad2eea8 100644
>--- a/include/media/v4l2-subdev.h
>+++ b/include/media/v4l2-subdev.h
>@@ -695,6 +695,37 @@ struct v4l2_subdev_pad_config {
> struct v4l2_rect try_compose;
> };
>
>+/**
>+ * struct v4l2_subdev_stream_config - Used for storing stream configuration.
>+ *
>+ * @pad: pad number
>+ * @stream: stream number
>+ * @fmt: &struct v4l2_mbus_framefmt
>+ * @crop: &struct v4l2_rect to be used for crop
>+ * @compose: &struct v4l2_rect to be used for compose
>+ *
>+ * This structure stores configuration for a stream.
>+ */
>+struct v4l2_subdev_stream_config {
>+ u32 pad;
>+ u32 stream;
>+
>+ struct v4l2_mbus_framefmt fmt;
>+ struct v4l2_rect crop;
>+ struct v4l2_rect compose;
>+};
>+
>+/**
>+ * struct v4l2_subdev_stream_configs - A collection of stream configs.
>+ *
>+ * @num_configs: number of entries in @config.
>+ * @configs: an array of &struct v4l2_subdev_stream_configs.
>+ */
>+struct v4l2_subdev_stream_configs {
>+ u32 num_configs;
>+ struct v4l2_subdev_stream_config *configs;
>+};
>+
> /**
> * struct v4l2_subdev_krouting - subdev routing table
> *
>@@ -715,6 +746,7 @@ struct v4l2_subdev_krouting {
> * @lock: mutex for the state. May be replaced by the user.
> * @pads: &struct v4l2_subdev_pad_config array
> * @routing: routing table for the subdev
>+ * @stream_configs: stream configurations (only for V4L2_SUBDEV_FL_STREAMS)
> *
> * This structure only needs to be passed to the pad op if the 'which' field
> * of the main argument is set to %V4L2_SUBDEV_FORMAT_TRY. For
>@@ -726,6 +758,7 @@ struct v4l2_subdev_state {
> struct mutex *lock;
> struct v4l2_subdev_pad_config *pads;
> struct v4l2_subdev_krouting routing;
>+ struct v4l2_subdev_stream_configs stream_configs;
> };
>
> /**
>@@ -1448,6 +1481,52 @@ __v4l2_subdev_next_active_route(const struct v4l2_subdev_krouting *routing,
> for ((route) = NULL; \
> ((route) = __v4l2_subdev_next_active_route((routing), (route)));)
>
>+/**
>+ * v4l2_subdev_state_get_stream_format() - Get pointer to a stream format
>+ * @state: subdevice state
>+ * @pad: pad id
>+ * @stream: stream id
>+ *
>+ * This returns a pointer to &struct v4l2_mbus_framefmt for 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_stream_format(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream);
>+
>+/**
>+ * v4l2_subdev_state_get_stream_crop() - Get pointer to a stream crop rectangle
>+ * @state: subdevice state
>+ * @pad: pad id
>+ * @stream: stream id
>+ *
>+ * This returns a pointer to crop rectangle for the given pad + stream in the
>+ * subdev state.
>+ *
>+ * If the state does not contain the given pad + stream, NULL is returned.
>+ */
>+struct v4l2_rect *
>+v4l2_subdev_state_get_stream_crop(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream);
>+
>+/**
>+ * v4l2_subdev_state_get_stream_compose() - Get pointer to a stream compose
>+ * rectangle
>+ * @state: subdevice state
>+ * @pad: pad id
>+ * @stream: stream id
>+ *
>+ * This returns a pointer to compose rectangle for the given pad + stream in the
>+ * subdev state.
>+ *
>+ * If the state does not contain the given pad + stream, NULL is returned.
>+ */
>+struct v4l2_rect *
>+v4l2_subdev_state_get_stream_compose(struct v4l2_subdev_state *state,
>+ unsigned int pad, u32 stream);
>+
> #endif /* CONFIG_VIDEO_V4L2_SUBDEV_API */
>
> #endif /* CONFIG_MEDIA_CONTROLLER */
>diff --git a/include/uapi/linux/v4l2-subdev.h b/include/uapi/linux/v4l2-subdev.h
>index db4af236d7ed..3ba76d0c7a50 100644
>--- a/include/uapi/linux/v4l2-subdev.h
>+++ b/include/uapi/linux/v4l2-subdev.h
>@@ -45,13 +45,15 @@ enum v4l2_subdev_format_whence {
> * @which: format type (from enum v4l2_subdev_format_whence)
> * @pad: pad number, as reported by the media API
> * @format: media bus format (format code and frame size)
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_format {
> __u32 which;
> __u32 pad;
> struct v4l2_mbus_framefmt format;
>- __u32 reserved[8];
>+ __u32 stream;
>+ __u32 reserved[7];
> };
>
> /**
>@@ -59,13 +61,15 @@ struct v4l2_subdev_format {
> * @which: format type (from enum v4l2_subdev_format_whence)
> * @pad: pad number, as reported by the media API
> * @rect: pad crop rectangle boundaries
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_crop {
> __u32 which;
> __u32 pad;
> struct v4l2_rect rect;
>- __u32 reserved[8];
>+ __u32 stream;
>+ __u32 reserved[7];
> };
>
> #define V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE 0x00000001
>@@ -81,6 +85,7 @@ struct v4l2_subdev_crop {
> * @code: format code (MEDIA_BUS_FMT_ definitions)
> * @which: format type (from enum v4l2_subdev_format_whence)
> * @flags: flags set by the driver, (V4L2_SUBDEV_MBUS_CODE_*)
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_mbus_code_enum {
>@@ -89,7 +94,8 @@ struct v4l2_subdev_mbus_code_enum {
> __u32 code;
> __u32 which;
> __u32 flags;
>- __u32 reserved[7];
>+ __u32 stream;
>+ __u32 reserved[6];
> };
>
> /**
>@@ -102,6 +108,7 @@ struct v4l2_subdev_mbus_code_enum {
> * @min_height: minimum frame height, in pixels
> * @max_height: maximum frame height, in pixels
> * @which: format type (from enum v4l2_subdev_format_whence)
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_frame_size_enum {
>@@ -113,19 +120,22 @@ struct v4l2_subdev_frame_size_enum {
> __u32 min_height;
> __u32 max_height;
> __u32 which;
>- __u32 reserved[8];
>+ __u32 stream;
>+ __u32 reserved[7];
> };
>
> /**
> * struct v4l2_subdev_frame_interval - Pad-level frame rate
> * @pad: pad number, as reported by the media API
> * @interval: frame interval in seconds
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_frame_interval {
> __u32 pad;
> struct v4l2_fract interval;
>- __u32 reserved[9];
>+ __u32 stream;
>+ __u32 reserved[8];
> };
>
> /**
>@@ -137,6 +147,7 @@ struct v4l2_subdev_frame_interval {
> * @height: frame height in pixels
> * @interval: frame interval in seconds
> * @which: format type (from enum v4l2_subdev_format_whence)
>+ * @stream: stream number, defined in subdev routing
> * @reserved: drivers and applications must zero this array
> */
> struct v4l2_subdev_frame_interval_enum {
>@@ -147,7 +158,8 @@ struct v4l2_subdev_frame_interval_enum {
> __u32 height;
> struct v4l2_fract interval;
> __u32 which;
>- __u32 reserved[8];
>+ __u32 stream;
>+ __u32 reserved[7];
> };
>
> /**
>@@ -159,6 +171,7 @@ struct v4l2_subdev_frame_interval_enum {
> * defined in v4l2-common.h; V4L2_SEL_TGT_* .
> * @flags: constraint flags, defined in v4l2-common.h; V4L2_SEL_FLAG_*.
> * @r: coordinates of the selection window
>+ * @stream: stream number, defined in subdev routing
> * @reserved: for future use, set to zero for now
> *
> * Hardware may use multiple helper windows to process a video stream.
>@@ -171,7 +184,8 @@ struct v4l2_subdev_selection {
> __u32 target;
> __u32 flags;
> struct v4l2_rect r;
>- __u32 reserved[8];
>+ __u32 stream;
>+ __u32 reserved[7];
> };
>
> /**
>--
>2.34.1
>
next prev parent reply other threads:[~2022-10-09 6:24 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-03 12:18 [PATCH v15 00/19] v4l: routing and streams support Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 01/19] media: v4l2-subdev: Sort includes Tomi Valkeinen
2022-10-03 16:53 ` Laurent Pinchart
2022-10-03 12:18 ` [PATCH v15 02/19] media: add V4L2_SUBDEV_FL_STREAMS Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 03/19] media: add V4L2_SUBDEV_CAP_STREAMS Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 04/19] media: Documentation: Add GS_ROUTING documentation Tomi Valkeinen
2022-10-03 14:31 ` Hans Verkuil
2022-10-12 10:01 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 05/19] media: subdev: Add [GS]_ROUTING subdev ioctls and operations Tomi Valkeinen
2022-10-03 14:26 ` Hans Verkuil
2022-10-03 22:01 ` Sakari Ailus
2022-10-04 8:43 ` Hans Verkuil
2022-10-04 10:05 ` Sakari Ailus
2022-10-12 8:15 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 06/19] media: subdev: add v4l2_subdev_has_pad_interdep() Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 07/19] media: subdev: add v4l2_subdev_set_routing helper() Tomi Valkeinen
2022-10-12 6:22 ` Yunke Cao
2022-10-12 6:58 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 08/19] media: subdev: Add for_each_active_route() macro Tomi Valkeinen
2022-10-09 5:38 ` Dafna Hirschfeld
2022-10-12 6:15 ` Tomi Valkeinen
2022-10-13 7:41 ` Sakari Ailus
2022-10-03 12:18 ` [PATCH v15 09/19] media: Documentation: add multiplexed streams documentation Tomi Valkeinen
2022-10-11 10:47 ` [PATCH 1/1] media: Documentation: Interaction between routes, formats and selections Sakari Ailus
2022-10-12 10:30 ` Tomi Valkeinen
2022-12-07 10:38 ` Sakari Ailus
2022-10-03 12:18 ` [PATCH v15 10/19] media: subdev: add stream based configuration Tomi Valkeinen
2022-10-09 6:24 ` Dafna Hirschfeld [this message]
2022-10-12 6:36 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 11/19] media: subdev: use streams in v4l2_subdev_link_validate() Tomi Valkeinen
2022-10-14 10:54 ` Sakari Ailus
2022-10-14 11:10 ` Tomi Valkeinen
2022-10-16 22:37 ` Sakari Ailus
2022-10-27 10:43 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 12/19] media: subdev: add "opposite" stream helper funcs Tomi Valkeinen
2022-10-09 7:06 ` Dafna Hirschfeld
2022-10-12 6:46 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 13/19] media: subdev: add streams to v4l2_subdev_get_fmt() helper function Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 14/19] media: subdev: add v4l2_subdev_set_routing_with_fmt() helper Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 15/19] media: subdev: add v4l2_subdev_routing_validate() helper Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 16/19] media: v4l2-subdev: Add v4l2_subdev_state_xlate_streams() helper Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 17/19] media: v4l2-subdev: Add subdev .(enable|disable)_streams() operations Tomi Valkeinen
2022-10-10 16:53 ` Dafna Hirschfeld
2022-10-12 5:59 ` Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 18/19] media: v4l2-subdev: Add v4l2_subdev_s_stream_helper() function Tomi Valkeinen
2022-10-03 12:18 ` [PATCH v15 19/19] media: Add stream to frame descriptor Tomi Valkeinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221009062434.27flg66oxt6wxrc7@guri \
--to=dafna@fastmail.com \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo+renesas@jmondi.org \
--cc=kishon@ti.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=niklas.soderlund+renesas@ragnatech.se \
--cc=sakari.ailus@linux.intel.com \
--cc=satish.nagireddy@getcruise.com \
--cc=tfiga@chromium.org \
--cc=tomi.valkeinen@ideasonboard.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox