mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Benjamin Gaignard <benjamin.gaignard@collabora.com>,
	mchehab@kernel.org, hverkuil+cisco@kernel.org
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	 kernel@collabora.com
Subject: Re: [PATCH v1] media: codecs: vp9: Add tile_info control
Date: Wed, 11 Nov 2026 11:20:45 -0500	[thread overview]
Message-ID: <749a3f00696551f4738c70aef2241b96e57f221a.camel@collabora.com> (raw)
In-Reply-To: <20261110152826.128259-1-benjamin.gaignard@collabora.com>

[-- Attachment #1: Type: text/plain, Size: 10618 bytes --]

Hi,

Le mardi 10 novembre 2026 à 16:28 +0100, Benjamin Gaignard a écrit :
> Some hardware accelerators needs to know tiles location and size
> in the bitstream.
> Tiles size are coded inside the bitstream so it is up to the
> userland to provide theses information by calling
> V4L2_CID_STATELESS_VP9_TILE_INFO_ENTRY control.

I'm missing both a driver and userspace implementation to process this one.

cheers,
Nicolas

> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> ---
>  .../media/v4l/ext-ctrls-codec-stateless.rst   | 42 +++++++++++++++++++
>  .../media/v4l/vidioc-g-ext-ctrls.rst          |  4 ++
>  drivers/media/v4l2-core/v4l2-ctrls-core.c     |  8 ++++
>  drivers/media/v4l2-core/v4l2-ctrls-defs.c     |  5 +++
>  include/media/v4l2-ctrls.h                    |  2 +
>  include/uapi/linux/v4l2-controls.h            | 27 ++++++++++++
>  include/uapi/linux/videodev2.h                |  2 +
>  7 files changed, 90 insertions(+)
> 
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> index d7a3b8ef03a7..effd3eb47e29 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> @@ -2050,6 +2050,48 @@ This structure contains all loop filter related parameters. See sections
>        - When set, the bitstream contains additional syntax elements that
>          specify which mode and reference frame deltas are to be updated.
>  
> +``V4L2_CID_STATELESS_VP9_TILE_INFO_ENTRY (struct)``
> +    Specifies VP9 Tile Info entry as describe in section 6.4 "Decode tile syntax"
> +    of :ref:`vp9`.
> +    MiRowStart, MiRowEnd, MiColStart and MiColEnd can be retrieved from struct
> +    v4l2_ctrl_vp9_frame using tile_row and tile_col.
> +
> +.. c:type:: v4l2_ctrl_vp9_tile_info_entry
> +
> +.. raw:: latex
> +
> +    \small
> +
> +.. tabularcolumns:: |p{1.2cm}|p{9.2cm}|p{6.9cm}|
> +
> +.. cssclass:: longtable
> +
> +.. flat-table:: struct v4l2_ctrl_vp9_tile_info_entry
> +    :header-rows:  0
> +    :stub-columns: 0
> +    :widths:       1 1 2
> +
> +    * - __u32
> +      - ``tile_offset``
> +      - Specifies the offset from the tile data after frame header,
> +        i.e. where the coded tile data actually starts.
> +    * - __u32
> +      - ``tile_size``
> +      - Specifies the size in bytes of the coded tile.
> +        Equivalent to "tile_size" in :ref:`vp9`
> +    * - __u32
> +      - ``tile_row``
> +      - Specifies the row of the current tile.
> +        Equivalent to "tileRow" in :ref:`vp9`
> +    * - __u32
> +      - ``tile_col``
> +      - Specifies the col of the current tile.
> +        Equivalent to "tileCol" in :ref:`vp9`
> +
> +.. raw:: latex
> +
> +    \normalsize
> +
>  .. _v4l2-codec-stateless-hevc:
>  
>  ``V4L2_CID_STATELESS_HEVC_SPS (struct)``
> diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
> index d78328152b75..836b227c10c9 100644
> --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
> +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
> @@ -258,6 +258,10 @@ still cause this situation.
>        - ``p_vp9_frame``
>        - A pointer to a struct :c:type:`v4l2_ctrl_vp9_frame`. Valid if this
>          control is of type ``V4L2_CTRL_TYPE_VP9_FRAME``.
> +    * - struct :c:type:`v4l2_ctrl_vp9_tile_info_entry` *
> +      - ``p_vp9_tile_info_entry``
> +      - A pointer to a struct :c:type:`v4l2_ctrl_vp9_tile_info_entry`. Valid if this
> +        control is of type ``V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY``.
>      * - struct :c:type:`v4l2_ctrl_hdr10_cll_info` *
>        - ``p_hdr10_cll``
>        - A pointer to a struct :c:type:`v4l2_ctrl_hdr10_cll_info`. Valid if this control is
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> index 6e751a043a21..a426a716f3d4 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> @@ -425,6 +425,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
>  	case V4L2_CTRL_TYPE_VP9_FRAME:
>  		pr_cont("VP9_FRAME");
>  		break;
> +	case V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY:
> +		pr_cont("VP9_TILE_INFO_ENTRY");
> +		break;
>  	case V4L2_CTRL_TYPE_HEVC_SPS:
>  		pr_cont("HEVC_SPS");
>  		break;
> @@ -1415,6 +1418,8 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
>  
>  	case V4L2_CTRL_TYPE_VP9_FRAME:
>  		return validate_vp9_frame(p);
> +	case V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY:
> +		break;
>  	case V4L2_CTRL_TYPE_AV1_FRAME:
>  		return validate_av1_frame(p);
>  	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
> @@ -2135,6 +2140,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
>  	case V4L2_CTRL_TYPE_VP9_FRAME:
>  		elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
>  		break;
> +	case V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY:
> +		elem_size = sizeof(struct v4l2_ctrl_vp9_tile_info_entry);
> +		break;
>  	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
>  		elem_size = sizeof(struct v4l2_ctrl_av1_sequence);
>  		break;
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> index e062f2088490..f7a98925027b 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> @@ -1228,6 +1228,7 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_STATELESS_MPEG2_QUANTISATION:		return "MPEG-2 Quantisation Matrices";
>  	case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR:	return "VP9 Probabilities Updates";
>  	case V4L2_CID_STATELESS_VP9_FRAME:			return "VP9 Frame Decode Parameters";
> +	case V4L2_CID_STATELESS_VP9_TILE_INFO_ENTRY:		return "VP9 Tile Info Entry";
>  	case V4L2_CID_STATELESS_HEVC_SPS:			return "HEVC Sequence Parameter Set";
>  	case V4L2_CID_STATELESS_HEVC_PPS:			return "HEVC Picture Parameter Set";
>  	case V4L2_CID_STATELESS_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
> @@ -1602,6 +1603,10 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
>  	case V4L2_CID_STATELESS_AV1_SEQUENCE:
>  		*type = V4L2_CTRL_TYPE_AV1_SEQUENCE;
>  		break;
> +	case V4L2_CID_STATELESS_VP9_TILE_INFO_ENTRY:
> +		*type = V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY;
> +		*flags |= V4L2_CTRL_FLAG_DYNAMIC_ARRAY;
> +		break;
>  	case V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY:
>  		*type = V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY;
>  		*flags |= V4L2_CTRL_FLAG_DYNAMIC_ARRAY;
> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
> index cec9217d97ac..286e72a00a9d 100644
> --- a/include/media/v4l2-ctrls.h
> +++ b/include/media/v4l2-ctrls.h
> @@ -45,6 +45,7 @@ struct video_device;
>   * @p_h264_pred_weights:	Pointer to a struct v4l2_ctrl_h264_pred_weights.
>   * @p_vp8_frame:		Pointer to a VP8 frame params structure.
>   * @p_vp9_compressed_hdr_probs:	Pointer to a VP9 frame compressed header probs structure.
> + * @p_vp9_tile_info_entry:	Pointer to a VP9 tile info structure.
>   * @p_vp9_frame:		Pointer to a VP9 frame params structure.
>   * @p_hevc_sps:			Pointer to an HEVC sequence parameter set structure.
>   * @p_hevc_pps:			Pointer to an HEVC picture parameter set structure.
> @@ -83,6 +84,7 @@ union v4l2_ctrl_ptr {
>  	struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params;
>  	struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs;
>  	struct v4l2_ctrl_vp9_frame *p_vp9_frame;
> +	struct v4l2_ctrl_vp9_tile_info_entry *p_vp9_tile_info_entry;
>  	struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll;
>  	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
>  	struct v4l2_area *p_area;
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index d17e41d51d2e..8eb8da0073cd 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -2642,6 +2642,8 @@ struct v4l2_ctrl_hevc_ext_sps_lt_rps {
>  
>  /* Stateless VP9 controls */
>  
> +#define V4L2_VP9_MAX_TILE_COUNT			512
> +
>  #define V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED	0x1
>  #define V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE	0x2
>  
> @@ -2924,6 +2926,31 @@ struct v4l2_ctrl_vp9_compressed_hdr {
>  	struct v4l2_vp9_mv_probs mv;
>  };
>  
> +#define V4L2_CID_STATELESS_VP9_TILE_INFO_ENTRY (V4L2_CID_CODEC_STATELESS_BASE + 302)
> +/**
> + * struct v4l2_ctrl_vp9_tile_info_entry - VP9 Tile Info entry
> + *
> + * Represents a single VP9 tile inside. Note that MiRowStart,
> + * MiRowEnd, MiColStart and MiColEnd can be retrieved from struct
> + * v4l2_ctrl_vp9_frame using tile_row and tile_col.
> + * See section 6.4 "Decode tile syntax" for more details.
> + *
> + * @tile_offset: offset from the tile data after frame header,
> + * i.e. where the coded tile data actually starts.
> + * @tile_size: specifies the size in bytes of the coded tile. Equivalent to
> + * "tile_size" in the VP9 Specification.
> + * @tile_row: specifies the row of the current tile. Equivalent to "tileRow" in
> + * the VP9 Specification.
> + * @tile_col: specifies the col of the current tile. Equivalent to "tileCol" in
> + * the VP9 Specification.
> + */
> +struct v4l2_ctrl_vp9_tile_info_entry {
> +	__u32 tile_offset;
> +	__u32 tile_size;
> +	__u32 tile_row;
> +	__u32 tile_col;
> +};
> +
>  /* Stateless AV1 controls */
>  
>  #define V4L2_AV1_TOTAL_REFS_PER_FRAME	8
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index 5373dba640fa..b4338af93a39 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -1903,6 +1903,7 @@ struct v4l2_ext_control {
>  		struct v4l2_ctrl_mpeg2_quantisation __user *p_mpeg2_quantisation;
>  		struct v4l2_ctrl_vp9_compressed_hdr __user *p_vp9_compressed_hdr_probs;
>  		struct v4l2_ctrl_vp9_frame __user *p_vp9_frame;
> +		struct v4l2_ctrl_vp9_tile_info_entry *p_vp9_tile_info_entry;
>  		struct v4l2_ctrl_hevc_sps __user *p_hevc_sps;
>  		struct v4l2_ctrl_hevc_pps __user *p_hevc_pps;
>  		struct v4l2_ctrl_hevc_slice_params __user *p_hevc_slice_params;
> @@ -1984,6 +1985,7 @@ enum v4l2_ctrl_type {
>  
>  	V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR	= 0x0260,
>  	V4L2_CTRL_TYPE_VP9_FRAME		= 0x0261,
> +	V4L2_CTRL_TYPE_VP9_TILE_INFO_ENTRY	= 0x0262,
>  
>  	V4L2_CTRL_TYPE_HEVC_SPS			= 0x0270,
>  	V4L2_CTRL_TYPE_HEVC_PPS			= 0x0271,

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

      reply	other threads:[~2026-11-11 16:20 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-10 15:28 Benjamin Gaignard
2026-11-11 16:20 ` Nicolas Dufresne [this message]

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=749a3f00696551f4738c70aef2241b96e57f221a.camel@collabora.com \
    --to=nicolas.dufresne@collabora.com \
    --cc=benjamin.gaignard@collabora.com \
    --cc=hverkuil+cisco@kernel.org \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®