All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
To: Dafna Hirschfeld <dafna@fastmail.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: Wed, 12 Oct 2022 09:36:52 +0300	[thread overview]
Message-ID: <d0f39af5-41f3-1fe6-be5f-7d563888e771@ideasonboard.com> (raw)
In-Reply-To: <20221009062434.27flg66oxt6wxrc7@guri>

On 09/10/2022 09:24, Dafna Hirschfeld wrote:
> 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'

Yes, we can do with just a single variable.

I'll keep it as unsigned, as it's an index to an array. Signed doesn't 
make sense there.

  Tomi


  reply	other threads:[~2022-10-12  6:37 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
2022-10-12  6:36     ` Tomi Valkeinen [this message]
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=d0f39af5-41f3-1fe6-be5f-7d563888e771@ideasonboard.com \
    --to=tomi.valkeinen@ideasonboard.com \
    --cc=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 \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.