2021-04-26 03:37:44

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 00/10] MPEG-2 stateless API cleanup and destaging

Hi everyone,

Here's another round addressing Hans' feedback. More details
about this can be found in the previous cover letter [1]:

[1] https://lore.kernel.org/linux-media/[email protected]/T/

The documentation looks good, and so does pahole,
but it's really easy to miss some detail in this series,
so we'd appreciate if more people could take a look.

v6:
* Reorder patch "media: controls: Log MPEG-2 stateless control in .std_log"
to avoid a new compile warning.
* Remove "reserved" field in mpeg2 sequence control, noted by Hans.
* Reorder "flags" field in mpeg2 picture control, noted by Hans.
* Typos and comments fixes, noted by Hans.

v5:
* Rename "quantization" to "quantisation", so the terminology
matches the MPEG-2 specification.
This is the only change in v5, compared to v4.

v4:
* Rework and clarify quantization matrices control semantics.
* Move reference buffer fields to the picture parameter control.
* Remove slice parameters control. This can be added back in the
future if needed, but for now it's not used.
See patch 6/9 for details.
* Destage the API.

v3:
* No API changes, just minor boilerplate fixes for the new
controls to be properly exposed, initialized and validated.

v2:
* Fixed bad use of boolean negation in a flag, which
was fortunately reported by 0day bot.

Ezequiel Garcia (10):
media: uapi: mpeg2: Rename "quantization" to "quantisation"
media: uapi: mpeg2: rework quantisation matrices semantics
media: uapi: mpeg2: Cleanup flags
media: uapi: mpeg2: Split sequence and picture parameters
media: uapi: mpeg2: Move reference buffer fields
media: hantro/cedrus: Remove unneeded slice size and slice offset
media: uapi: mpeg2: Remove V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS
media: uapi: Move the MPEG-2 stateless control type out of staging
media: controls: Log MPEG-2 stateless control in .std_log
media: uapi: move MPEG-2 stateless controls out of staging

.../media/v4l/ext-ctrls-codec-stateless.rst | 214 +++++++++++++++++
.../media/v4l/ext-ctrls-codec.rst | 217 ------------------
.../media/v4l/pixfmt-compressed.rst | 11 +-
.../media/v4l/vidioc-g-ext-ctrls.rst | 12 +
.../media/v4l/vidioc-queryctrl.rst | 18 +-
.../media/videodev2.h.rst.exceptions | 5 +-
drivers/media/v4l2-core/v4l2-ctrls.c | 122 +++++++---
drivers/staging/media/hantro/hantro_drv.c | 9 +-
.../media/hantro/hantro_g1_mpeg2_dec.c | 110 ++++-----
drivers/staging/media/hantro/hantro_hw.h | 2 +-
drivers/staging/media/hantro/hantro_mpeg2.c | 2 +-
.../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 106 ++++-----
drivers/staging/media/sunxi/cedrus/cedrus.c | 10 +-
drivers/staging/media/sunxi/cedrus/cedrus.h | 5 +-
.../staging/media/sunxi/cedrus/cedrus_dec.c | 10 +-
.../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 97 +++-----
include/media/mpeg2-ctrls.h | 82 -------
include/media/v4l2-ctrls.h | 11 +-
include/uapi/linux/v4l2-controls.h | 112 +++++++++
include/uapi/linux/videodev2.h | 7 +
20 files changed, 610 insertions(+), 552 deletions(-)
delete mode 100644 include/media/mpeg2-ctrls.h

--
2.30.0


2021-04-26 03:38:00

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 04/10] media: uapi: mpeg2: Split sequence and picture parameters

Typically, bitstreams are composed of a sequence header,
followed by a number of picture header and picture coding extension
headers. Each picture can be composed of a number of slices.

Let's split the MPEG-2 uAPI to follow these semantics more closely,
allowing more usage flexibility. Having these controls split up
allows applications to set a sequence control at the beginning
of a sequence, and then set a picture control for each frame.

While here add padding fields where needed, and document
the uAPI header thoroughly.

Note that the V4L2_CTRL_TYPE_{} defines had to be moved because
it clashes with existing ones. This is not really an issue
since they will be re-defined when the controls are moved
out of staging.

Signed-off-by: Ezequiel Garcia <[email protected]>
Tested-by: Jonas Karlman <[email protected]>
---
.../media/v4l/ext-ctrls-codec.rst | 62 +++++++----
.../media/v4l/pixfmt-compressed.rst | 5 +-
.../media/v4l/vidioc-queryctrl.rst | 12 ++
.../media/videodev2.h.rst.exceptions | 2 +
drivers/media/v4l2-core/v4l2-ctrls.c | 56 ++++++++--
drivers/staging/media/hantro/hantro_drv.c | 10 ++
.../media/hantro/hantro_g1_mpeg2_dec.c | 14 ++-
.../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 14 ++-
drivers/staging/media/sunxi/cedrus/cedrus.c | 12 ++
drivers/staging/media/sunxi/cedrus/cedrus.h | 2 +
.../staging/media/sunxi/cedrus/cedrus_dec.c | 4 +
.../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 8 +-
include/media/mpeg2-ctrls.h | 103 ++++++++++++++----
include/media/v4l2-ctrls.h | 4 +
14 files changed, 235 insertions(+), 73 deletions(-)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index c9d1cf3c94a5..84a8d45b7cc9 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1636,14 +1636,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
* - __u32
- ``data_bit_offset``
- Offset (in bits) to the video data in the current slice data.
- * - struct :c:type:`v4l2_mpeg2_sequence`
- - ``sequence``
- - Structure with MPEG-2 sequence metadata, merging relevant fields from
- the sequence header and sequence extension parts of the bitstream.
- * - struct :c:type:`v4l2_mpeg2_picture`
- - ``picture``
- - Structure with MPEG-2 picture metadata, merging relevant fields from
- the picture header and picture coding extension parts of the bitstream.
* - __u64
- ``backward_ref_ts``
- Timestamp of the V4L2 capture buffer to use as backward reference, used
@@ -1661,14 +1653,28 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
* - __u32
- ``quantiser_scale_code``
- Code used to determine the quantization scale to use for the IDCT.
+ * - __u8
+ - ``reserved``
+ - Applications and drivers must set this to zero.

-.. c:type:: v4l2_mpeg2_sequence
+``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (struct)``
+ Specifies the sequence parameters (as extracted from the bitstream) for the
+ associated MPEG-2 slice data. This includes fields matching the syntax
+ elements from the sequence header and sequence extension parts of the
+ bitstream as specified by :ref:`mpeg2part2`.
+
+ .. note::
+
+ This compound control is not yet part of the public kernel API and
+ it is expected to change.
+
+.. c:type:: v4l2_ctrl_mpeg2_sequence

.. cssclass:: longtable

.. tabularcolumns:: |p{1.4cm}|p{6.5cm}|p{9.4cm}|

-.. flat-table:: struct v4l2_mpeg2_sequence
+.. flat-table:: struct v4l2_ctrl_mpeg2_sequence
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
@@ -1690,7 +1696,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
* - __u8
- ``chroma_format``
- The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
- * - __u32
+ * - __u8
- ``flags``
- See :ref:`MPEG-2 Sequence Flags <mpeg2_sequence_flags>`.

@@ -1710,7 +1716,18 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
- Indication that all the frames for the sequence are progressive instead
of interlaced.

-.. c:type:: v4l2_mpeg2_picture
+``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (struct)``
+ Specifies the picture parameters (as extracted from the bitstream) for the
+ associated MPEG-2 slice data. This includes fields matching the syntax
+ elements from the picture header and picture coding extension parts of the
+ bitstream as specified by :ref:`mpeg2part2`.
+
+ .. note::
+
+ This compound control is not yet part of the public kernel API and
+ it is expected to change.
+
+.. c:type:: v4l2_ctrl_mpeg2_picture

.. raw:: latex

@@ -1720,30 +1737,33 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -

.. tabularcolumns:: |p{1.0cm}|p{5.6cm}|p{10.7cm}|

-.. flat-table:: struct v4l2_mpeg2_picture
+.. flat-table:: struct v4l2_ctrl_mpeg2_picture
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2

+ * - __u32
+ - ``flags``
+ - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
+ * - __u8
+ - ``f_code[2][2]``
+ - Motion vector codes.
* - __u8
- ``picture_coding_type``
- Picture coding type for the frame covered by the current slice
(V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
V4L2_MPEG2_PICTURE_CODING_TYPE_B).
* - __u8
- - ``f_code[2][2]``
- - Motion vector codes.
+ - ``picture_structure``
+ - Picture structure (1: interlaced top field, 2: interlaced bottom field,
+ 3: progressive frame).
* - __u8
- ``intra_dc_precision``
- Precision of Discrete Cosine transform (0: 8 bits precision,
1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
* - __u8
- - ``picture_structure``
- - Picture structure (1: interlaced top field, 2: interlaced bottom field,
- 3: progressive frame).
- * - __u32
- - ``flags``
- - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
+ - ``reserved``
+ - Applications and drivers must set this to zero.


.. _mpeg2_picture_flags:
diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
index cba607f789f0..bbbacbd65d6f 100644
--- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
+++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
@@ -114,8 +114,9 @@ Compressed Formats
This format is adapted for stateless video decoders that implement a
MPEG-2 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
Metadata associated with the frame to decode is required to be passed
- through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS`` control and
- quantisation matrices can optionally be specified through the
+ through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE``,
+ ``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE``, and ``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS``
+ controls. Quantisation matrices can optionally be specified through the
``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION`` control.
See the :ref:`associated Codec Control IDs <v4l2-mpeg-mpeg2>`.
Exactly one output and one capture buffer must be provided for use with
diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
index 4362945fd39b..afc1505a3a7e 100644
--- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
+++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
@@ -429,6 +429,18 @@ See also the examples in :ref:`control`.
- n/a
- A struct :c:type:`v4l2_ctrl_mpeg2_quantisation`, containing MPEG-2
quantisation matrices for stateless video decoders.
+ * - ``V4L2_CTRL_TYPE_MPEG2_SEQUENCE``
+ - n/a
+ - n/a
+ - n/a
+ - A struct :c:type:`v4l2_ctrl_mpeg2_sequence`, containing MPEG-2
+ sequence parameters for stateless video decoders.
+ * - ``V4L2_CTRL_TYPE_MPEG2_PICTURE``
+ - n/a
+ - n/a
+ - n/a
+ - A struct :c:type:`v4l2_ctrl_mpeg2_picture`, containing MPEG-2
+ picture parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AREA``
- n/a
- n/a
diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
index 5b2ebaa35d24..928fdc419ee3 100644
--- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions
+++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
@@ -134,6 +134,8 @@ replace symbol V4L2_CTRL_TYPE_STRING :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U16 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type`
+replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`v4l2_ctrl_type`
+replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type`
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 37531302dd3a..59b16f70b093 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -977,6 +977,8 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_MPEG_VIDEO_LTR_COUNT: return "LTR Count";
case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: return "Frame LTR Index";
case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: return "Use LTR Frames";
+ case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
+ case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE: return "MPEG-2 Picture Header";
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS: return "MPEG-2 Slice Parameters";
case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value";
@@ -1499,6 +1501,12 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_RDS_TX_ALT_FREQS:
*type = V4L2_CTRL_TYPE_U32;
break;
+ case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE:
+ *type = V4L2_CTRL_TYPE_MPEG2_SEQUENCE;
+ break;
+ case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE:
+ *type = V4L2_CTRL_TYPE_MPEG2_PICTURE;
+ break;
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
*type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
break;
@@ -1703,7 +1711,8 @@ static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
union v4l2_ctrl_ptr ptr)
{
- struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
+ struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
+ struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant;
struct v4l2_ctrl_vp8_frame *p_vp8_frame;
struct v4l2_ctrl_fwht_params *p_fwht_params;
@@ -1720,13 +1729,18 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
* v4l2_ctrl_type enum.
*/
switch ((u32)ctrl->type) {
- case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
- p_mpeg2_slice_params = p;
+ case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
+ p_mpeg2_sequence = p;
+
/* 4:2:0 */
- p_mpeg2_slice_params->sequence.chroma_format = 1;
+ p_mpeg2_sequence->chroma_format = 1;
+ break;
+ case V4L2_CTRL_TYPE_MPEG2_PICTURE:
+ p_mpeg2_picture = p;
+
/* interlaced top field */
- p_mpeg2_slice_params->picture.picture_structure = 1;
- p_mpeg2_slice_params->picture.picture_coding_type =
+ p_mpeg2_picture->picture_structure = V4L2_MPEG2_PIC_TOP_FIELD;
+ p_mpeg2_picture->picture_coding_type =
V4L2_MPEG2_PIC_CODING_TYPE_I;
break;
case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
@@ -1909,6 +1923,8 @@ static void std_log(const struct v4l2_ctrl *ctrl)
static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
union v4l2_ctrl_ptr ptr)
{
+ struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
+ struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
struct v4l2_ctrl_vp8_frame *p_vp8_frame;
struct v4l2_ctrl_fwht_params *p_fwht_params;
@@ -1926,10 +1942,10 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
unsigned int i;

switch ((u32)ctrl->type) {
- case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
- p_mpeg2_slice_params = p;
+ case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
+ p_mpeg2_sequence = p;

- switch (p_mpeg2_slice_params->sequence.chroma_format) {
+ switch (p_mpeg2_sequence->chroma_format) {
case 1: /* 4:2:0 */
case 2: /* 4:2:2 */
case 3: /* 4:4:4 */
@@ -1937,8 +1953,12 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
default:
return -EINVAL;
}
+ break;
+
+ case V4L2_CTRL_TYPE_MPEG2_PICTURE:
+ p_mpeg2_picture = p;

- switch (p_mpeg2_slice_params->picture.intra_dc_precision) {
+ switch (p_mpeg2_picture->intra_dc_precision) {
case 0: /* 8 bits */
case 1: /* 9 bits */
case 2: /* 10 bits */
@@ -1948,7 +1968,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
return -EINVAL;
}

- switch (p_mpeg2_slice_params->picture.picture_structure) {
+ switch (p_mpeg2_picture->picture_structure) {
case V4L2_MPEG2_PIC_TOP_FIELD:
case V4L2_MPEG2_PIC_BOTTOM_FIELD:
case V4L2_MPEG2_PIC_FRAME:
@@ -1957,7 +1977,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
return -EINVAL;
}

- switch (p_mpeg2_slice_params->picture.picture_coding_type) {
+ switch (p_mpeg2_picture->picture_coding_type) {
case V4L2_MPEG2_PIC_CODING_TYPE_I:
case V4L2_MPEG2_PIC_CODING_TYPE_P:
case V4L2_MPEG2_PIC_CODING_TYPE_B:
@@ -1965,7 +1985,13 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
default:
return -EINVAL;
}
+ zero_reserved(*p_mpeg2_picture);
+ break;

+ case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
+ p_mpeg2_slice_params = p;
+
+ zero_reserved(*p_mpeg2_slice_params);
break;

case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
@@ -2934,6 +2960,12 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
case V4L2_CTRL_TYPE_U32:
elem_size = sizeof(u32);
break;
+ case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
+ elem_size = sizeof(struct v4l2_ctrl_mpeg2_sequence);
+ break;
+ case V4L2_CTRL_TYPE_MPEG2_PICTURE:
+ elem_size = sizeof(struct v4l2_ctrl_mpeg2_picture);
+ break;
case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
break;
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
index 9e3552cd5cf8..067205fb89f6 100644
--- a/drivers/staging/media/hantro/hantro_drv.c
+++ b/drivers/staging/media/hantro/hantro_drv.c
@@ -286,6 +286,16 @@ static const struct hantro_ctrl controls[] = {
.def = 50,
.ops = &hantro_jpeg_ctrl_ops,
},
+ }, {
+ .codec = HANTRO_MPEG2_DECODER,
+ .cfg = {
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
+ },
+ }, {
+ .codec = HANTRO_MPEG2_DECODER,
+ .cfg = {
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
+ },
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
index 6ef7ded863b2..f3494a70aa12 100644
--- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
@@ -92,8 +92,8 @@ static void
hantro_g1_mpeg2_dec_set_buffers(struct hantro_dev *vpu, struct hantro_ctx *ctx,
struct vb2_buffer *src_buf,
struct vb2_buffer *dst_buf,
- const struct v4l2_mpeg2_sequence *seq,
- const struct v4l2_mpeg2_picture *pic,
+ const struct v4l2_ctrl_mpeg2_sequence *seq,
+ const struct v4l2_ctrl_mpeg2_picture *pic,
const struct v4l2_ctrl_mpeg2_slice_params *slice_params)
{
dma_addr_t forward_addr = 0, backward_addr = 0;
@@ -153,8 +153,8 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
struct hantro_dev *vpu = ctx->dev;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
- const struct v4l2_mpeg2_sequence *seq;
- const struct v4l2_mpeg2_picture *pic;
+ const struct v4l2_ctrl_mpeg2_sequence *seq;
+ const struct v4l2_ctrl_mpeg2_picture *pic;
u32 reg;

src_buf = hantro_get_src_buf(ctx);
@@ -165,8 +165,10 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)

slice_params = hantro_get_ctrl(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
- seq = &slice_params->sequence;
- pic = &slice_params->picture;
+ seq = hantro_get_ctrl(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ pic = hantro_get_ctrl(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);

reg = G1_REG_DEC_AXI_RD_ID(0) |
G1_REG_DEC_TIMEOUT_E(1) |
diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
index ff54398f6643..5b383906af59 100644
--- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
@@ -95,8 +95,8 @@ rk3399_vpu_mpeg2_dec_set_buffers(struct hantro_dev *vpu,
struct hantro_ctx *ctx,
struct vb2_buffer *src_buf,
struct vb2_buffer *dst_buf,
- const struct v4l2_mpeg2_sequence *seq,
- const struct v4l2_mpeg2_picture *pic,
+ const struct v4l2_ctrl_mpeg2_sequence *seq,
+ const struct v4l2_ctrl_mpeg2_picture *pic,
const struct v4l2_ctrl_mpeg2_slice_params *slice_params)
{
dma_addr_t forward_addr = 0, backward_addr = 0;
@@ -156,8 +156,8 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
struct hantro_dev *vpu = ctx->dev;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
- const struct v4l2_mpeg2_sequence *seq;
- const struct v4l2_mpeg2_picture *pic;
+ const struct v4l2_ctrl_mpeg2_sequence *seq;
+ const struct v4l2_ctrl_mpeg2_picture *pic;
u32 reg;

src_buf = hantro_get_src_buf(ctx);
@@ -167,8 +167,10 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)

slice_params = hantro_get_ctrl(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
- seq = &slice_params->sequence;
- pic = &slice_params->picture;
+ seq = hantro_get_ctrl(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ pic = hantro_get_ctrl(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);

reg = VDPU_REG_DEC_ADV_PRE_DIS(0) |
VDPU_REG_DEC_SCMD_DIS(0) |
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
index 62a5407664ae..878752b30c10 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
@@ -29,6 +29,18 @@
#include "cedrus_hw.h"

static const struct cedrus_control cedrus_controls[] = {
+ {
+ .cfg = {
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
+ },
+ .codec = CEDRUS_CODEC_MPEG2,
+ },
+ {
+ .cfg = {
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
+ },
+ .codec = CEDRUS_CODEC_MPEG2,
+ },
{
.cfg = {
.id = V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS,
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
index 6516bff3d319..989873ccb98c 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
@@ -68,6 +68,8 @@ struct cedrus_h264_run {
};

struct cedrus_mpeg2_run {
+ const struct v4l2_ctrl_mpeg2_sequence *sequence;
+ const struct v4l2_ctrl_mpeg2_picture *picture;
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
};
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
index 238f779d2ba4..f4cc6aebfac9 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
@@ -40,6 +40,10 @@ void cedrus_device_run(void *priv)

switch (ctx->src_fmt.pixelformat) {
case V4L2_PIX_FMT_MPEG2_SLICE:
+ run.mpeg2.sequence = cedrus_find_control_data(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ run.mpeg2.picture = cedrus_find_control_data(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
run.mpeg2.slice_params = cedrus_find_control_data(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
run.mpeg2.quantisation = cedrus_find_control_data(ctx,
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
index e39a17d28c7d..65a175c6a5c2 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
@@ -51,8 +51,8 @@ static void cedrus_mpeg2_irq_disable(struct cedrus_ctx *ctx)
static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
{
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
- const struct v4l2_mpeg2_sequence *seq;
- const struct v4l2_mpeg2_picture *pic;
+ const struct v4l2_ctrl_mpeg2_sequence *seq;
+ const struct v4l2_ctrl_mpeg2_picture *pic;
const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
dma_addr_t src_buf_addr, dst_luma_addr, dst_chroma_addr;
dma_addr_t fwd_luma_addr, fwd_chroma_addr;
@@ -66,8 +66,8 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
u32 reg;

slice_params = run->mpeg2.slice_params;
- seq = &slice_params->sequence;
- pic = &slice_params->picture;
+ seq = run->mpeg2.sequence;
+ pic = run->mpeg2.picture;

quantisation = run->mpeg2.quantisation;

diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
index d3190979d574..e3a741a7130e 100644
--- a/include/media/mpeg2-ctrls.h
+++ b/include/media/mpeg2-ctrls.h
@@ -13,24 +13,44 @@

#define V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (V4L2_CID_CODEC_BASE+250)
#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (V4L2_CID_CODEC_BASE+251)
+#define V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (V4L2_CID_CODEC_BASE+252)
+#define V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (V4L2_CID_CODEC_BASE+253)

/* enum v4l2_ctrl_type type values */
-#define V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS 0x0103
-#define V4L2_CTRL_TYPE_MPEG2_QUANTISATION 0x0104
+#define V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS 0x0130
+#define V4L2_CTRL_TYPE_MPEG2_QUANTISATION 0x0131
+#define V4L2_CTRL_TYPE_MPEG2_SEQUENCE 0x0132
+#define V4L2_CTRL_TYPE_MPEG2_PICTURE 0x0133

#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001

-struct v4l2_mpeg2_sequence {
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Sequence header */
+/**
+ * struct v4l2_ctrl_mpeg2_sequence - MPEG-2 sequence header
+ *
+ * All the members on this structure match the sequence header and sequence
+ * extension syntaxes as specified by the MPEG-2 specification.
+ *
+ * Fields horizontal_size, vertical_size and vbv_buffer_size are a
+ * combination of respective _value and extension syntax elements,
+ * as described in section 6.3.3 "Sequence header".
+ *
+ * @horizontal_size: combination of elements horizontal_size_value and
+ * horizontal_size_extension.
+ * @vertical_size: combination of elements vertical_size_value and
+ * vertical_size_extension.
+ * @vbv_buffer_size: combination of elements vbv_buffer_size_value and
+ * vbv_buffer_size_extension.
+ * @profile_and_level_indication: see MPEG-2 specification.
+ * @chroma_format: see MPEG-2 specification.
+ * @flags: see V4L2_MPEG2_SEQ_FLAG_{}.
+ */
+struct v4l2_ctrl_mpeg2_sequence {
__u16 horizontal_size;
__u16 vertical_size;
__u32 vbv_buffer_size;
-
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Sequence extension */
__u16 profile_and_level_indication;
__u8 chroma_format;
-
- __u32 flags;
+ __u8 flags;
};

#define V4L2_MPEG2_PIC_CODING_TYPE_I 1
@@ -51,33 +71,72 @@ struct v4l2_mpeg2_sequence {
#define V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST 0x0040
#define V4L2_MPEG2_PIC_FLAG_PROGRESSIVE 0x0080

-struct v4l2_mpeg2_picture {
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Picture header */
- __u8 picture_coding_type;
-
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Picture coding extension */
+/**
+ * struct v4l2_ctrl_mpeg2_picture - MPEG-2 picture header
+ *
+ * All the members on this structure match the picture header and picture
+ * coding extension syntaxes as specified by the MPEG-2 specification.
+ *
+ * @flags: see V4L2_MPEG2_PIC_FLAG_{}.
+ * @f_code[2][2]: see MPEG-2 specification.
+ * @picture_coding_type: see MPEG-2 specification.
+ * @picture_structure: see V4L2_MPEG2_PIC_{}_FIELD.
+ * @intra_dc_precision: see MPEG-2 specification.
+ * @reserved: padding field. Should be zeroed by applications.
+ */
+struct v4l2_ctrl_mpeg2_picture {
+ __u32 flags;
__u8 f_code[2][2];
- __u8 intra_dc_precision;
+ __u8 picture_coding_type;
__u8 picture_structure;
-
- __u32 flags;
+ __u8 intra_dc_precision;
+ __u8 reserved;
};

+/**
+ * struct v4l2_ctrl_mpeg2_slice_params - MPEG-2 slice header
+ *
+ * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as
+ * reference for backward prediction.
+ * @forward_ref_ts: timestamp of the V4L2 capture buffer to use as
+ * reference for forward prediction. These timestamp refers to the
+ * timestamp field in struct v4l2_buffer. Use v4l2_timeval_to_ns()
+ * to convert the struct timeval to a __u64.
+ * @quantiser_scale_code: quantiser scale integer matching an
+ * homonymous syntax element.
+ * @reserved: padding field. Should be zeroed by applications.
+ */
struct v4l2_ctrl_mpeg2_slice_params {
__u32 bit_size;
__u32 data_bit_offset;
__u64 backward_ref_ts;
__u64 forward_ref_ts;
-
- struct v4l2_mpeg2_sequence sequence;
- struct v4l2_mpeg2_picture picture;
-
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Slice */
__u32 quantiser_scale_code;
+ __u32 reserved;
};

+/**
+ * struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
+ *
+ * Quantization matrices as specified by section 6.3.7
+ * "Quant matrix extension".
+ *
+ * @intra_quantiser_matrix: The quantisation matrix coefficients
+ * for intra-coded frames, in zigzag scanning order. It is relevant
+ * for both luma and chroma components, although it can be superseded
+ * by the chroma-specific matrix for non-4:2:0 YUV formats.
+ * @non_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for non-intra-coded frames, in zigzag scanning order. It is relevant
+ * for both luma and chroma components, although it can be superseded
+ * by the chroma-specific matrix for non-4:2:0 YUV formats.
+ * @chroma_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for the chominance component of intra-coded frames, in zigzag scanning
+ * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
+ * @chroma_non_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for the chrominance component of non-intra-coded frames, in zigzag scanning
+ * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
+ */
struct v4l2_ctrl_mpeg2_quantisation {
- /* ISO/IEC 13818-2, ITU-T Rec. H.262: Quant matrix extension */
__u8 intra_quantiser_matrix[64];
__u8 non_intra_quantiser_matrix[64];
__u8 chroma_intra_quantiser_matrix[64];
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index a38e6bd02a6a..572ff7eb7be1 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -40,6 +40,8 @@ struct video_device;
* @p_u16: Pointer to a 16-bit unsigned value.
* @p_u32: Pointer to a 32-bit unsigned value.
* @p_char: Pointer to a string.
+ * @p_mpeg2_sequence: Pointer to a MPEG2 sequence structure.
+ * @p_mpeg2_picture: Pointer to a MPEG2 picture structure.
* @p_mpeg2_slice_params: Pointer to a MPEG2 slice parameters structure.
* @p_mpeg2_quantisation: Pointer to a MPEG2 quantisation data structure.
* @p_fwht_params: Pointer to a FWHT stateless parameters structure.
@@ -66,6 +68,8 @@ union v4l2_ctrl_ptr {
u16 *p_u16;
u32 *p_u32;
char *p_char;
+ struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
+ struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
struct v4l2_ctrl_fwht_params *p_fwht_params;
--
2.30.0

2021-04-26 03:38:42

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 01/10] media: uapi: mpeg2: Rename "quantization" to "quantisation"

The MPEG-2 specification refers to the quantisation matrices
using the word "quantisation". Make the V4L2 interface more
ergonomic by matching the MPEG-2 spec.

Signed-off-by: Ezequiel Garcia <[email protected]>
---
.../media/v4l/ext-ctrls-codec.rst | 16 ++++++------
.../media/v4l/pixfmt-compressed.rst | 4 +--
.../media/v4l/vidioc-queryctrl.rst | 6 ++---
.../media/videodev2.h.rst.exceptions | 2 +-
drivers/media/v4l2-core/v4l2-ctrls.c | 12 ++++-----
drivers/staging/media/hantro/hantro_drv.c | 2 +-
.../media/hantro/hantro_g1_mpeg2_dec.c | 17 +++++-------
drivers/staging/media/hantro/hantro_hw.h | 2 +-
drivers/staging/media/hantro/hantro_mpeg2.c | 2 +-
.../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 14 +++++-----
drivers/staging/media/sunxi/cedrus/cedrus.c | 2 +-
drivers/staging/media/sunxi/cedrus/cedrus.h | 2 +-
.../staging/media/sunxi/cedrus/cedrus_dec.c | 4 +--
.../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 26 +++++++++----------
include/media/mpeg2-ctrls.h | 6 ++---
include/media/v4l2-ctrls.h | 4 +--
16 files changed, 58 insertions(+), 63 deletions(-)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index b0de4e6e7ebd..e40c81146a31 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1755,8 +1755,8 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -

\normalsize

-``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION (struct)``
- Specifies quantization matrices (as extracted from the bitstream) for the
+``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (struct)``
+ Specifies quantisation matrices (as extracted from the bitstream) for the
associated MPEG-2 slice data.

.. note::
@@ -1764,7 +1764,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
This compound control is not yet part of the public kernel API and
it is expected to change.

-.. c:type:: v4l2_ctrl_mpeg2_quantization
+.. c:type:: v4l2_ctrl_mpeg2_quantisation

.. tabularcolumns:: |p{0.8cm}|p{8.0cm}|p{8.5cm}|

@@ -1774,7 +1774,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -

\small

-.. flat-table:: struct v4l2_ctrl_mpeg2_quantization
+.. flat-table:: struct v4l2_ctrl_mpeg2_quantisation
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
@@ -1798,24 +1798,24 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
YUV formats.
* - __u8
- ``intra_quantiser_matrix[64]``
- - The quantization matrix coefficients for intra-coded frames, in zigzag
+ - The quantisation matrix coefficients for intra-coded frames, in zigzag
scanning order. It is relevant for both luma and chroma components,
although it can be superseded by the chroma-specific matrix for
non-4:2:0 YUV formats.
* - __u8
- ``non_intra_quantiser_matrix[64]``
- - The quantization matrix coefficients for non-intra-coded frames, in
+ - The quantisation matrix coefficients for non-intra-coded frames, in
zigzag scanning order. It is relevant for both luma and chroma
components, although it can be superseded by the chroma-specific matrix
for non-4:2:0 YUV formats.
* - __u8
- ``chroma_intra_quantiser_matrix[64]``
- - The quantization matrix coefficients for the chominance component of
+ - The quantisation matrix coefficients for the chominance component of
intra-coded frames, in zigzag scanning order. Only relevant for
non-4:2:0 YUV formats.
* - __u8
- ``chroma_non_intra_quantiser_matrix[64]``
- - The quantization matrix coefficients for the chrominance component of
+ - The quantisation matrix coefficients for the chrominance component of
non-intra-coded frames, in zigzag scanning order. Only relevant for
non-4:2:0 YUV formats.

diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
index 6dba70da822b..cba607f789f0 100644
--- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
+++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
@@ -115,8 +115,8 @@ Compressed Formats
MPEG-2 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
Metadata associated with the frame to decode is required to be passed
through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS`` control and
- quantization matrices can optionally be specified through the
- ``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION`` control.
+ quantisation matrices can optionally be specified through the
+ ``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION`` control.
See the :ref:`associated Codec Control IDs <v4l2-mpeg-mpeg2>`.
Exactly one output and one capture buffer must be provided for use with
this pixel format. The output buffer must contain the appropriate number
diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
index 8a285daedc6a..4362945fd39b 100644
--- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
+++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
@@ -423,12 +423,12 @@ See also the examples in :ref:`control`.
- n/a
- A struct :c:type:`v4l2_ctrl_mpeg2_slice_params`, containing MPEG-2
slice parameters for stateless video decoders.
- * - ``V4L2_CTRL_TYPE_MPEG2_QUANTIZATION``
+ * - ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``
- n/a
- n/a
- n/a
- - A struct :c:type:`v4l2_ctrl_mpeg2_quantization`, containing MPEG-2
- quantization matrices for stateless video decoders.
+ - A struct :c:type:`v4l2_ctrl_mpeg2_quantisation`, containing MPEG-2
+ quantisation matrices for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AREA``
- n/a
- n/a
diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
index f59940352faa..5b2ebaa35d24 100644
--- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions
+++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
@@ -135,7 +135,7 @@ replace symbol V4L2_CTRL_TYPE_U16 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
-replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTIZATION :c:type:`v4l2_ctrl_type`
+replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type`
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 0d7fe1bd975a..1ed62f0ed66f 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -966,7 +966,7 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: return "Frame LTR Index";
case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: return "Use LTR Frames";
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS: return "MPEG-2 Slice Parameters";
- case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION: return "MPEG-2 Quantization Matrices";
+ case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value";
case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value";

@@ -1490,8 +1490,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
*type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
break;
- case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:
- *type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION;
+ case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION:
+ *type = V4L2_CTRL_TYPE_MPEG2_QUANTISATION;
break;
case V4L2_CID_STATELESS_FWHT_PARAMS:
*type = V4L2_CTRL_TYPE_FWHT_PARAMS;
@@ -1942,7 +1942,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,

break;

- case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
+ case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
break;

case V4L2_CTRL_TYPE_FWHT_PARAMS:
@@ -2911,8 +2911,8 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
break;
- case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
- elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization);
+ case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
+ elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantisation);
break;
case V4L2_CTRL_TYPE_FWHT_PARAMS:
elem_size = sizeof(struct v4l2_ctrl_fwht_params);
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
index 595e82a82728..9e3552cd5cf8 100644
--- a/drivers/staging/media/hantro/hantro_drv.c
+++ b/drivers/staging/media/hantro/hantro_drv.c
@@ -294,7 +294,7 @@ static const struct hantro_ctrl controls[] = {
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION,
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
},
}, {
.codec = HANTRO_VP8_DECODER,
diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
index 6386a3989bfe..dedb5c502ae0 100644
--- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
@@ -82,17 +82,14 @@
#define PICT_FRAME 3

static void
-hantro_g1_mpeg2_dec_set_quantization(struct hantro_dev *vpu,
+hantro_g1_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
struct hantro_ctx *ctx)
{
- struct v4l2_ctrl_mpeg2_quantization *quantization;
-
- quantization = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION);
- hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu,
- quantization);
- vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma,
- G1_REG_QTABLE_BASE);
+ struct v4l2_ctrl_mpeg2_quantisation *q;
+
+ q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
+ hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
+ vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, G1_REG_QTABLE_BASE);
}

static void
@@ -238,7 +235,7 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
reg = G1_REG_APF_THRESHOLD(8);
vdpu_write_relaxed(vpu, reg, G1_SWREG(55));

- hantro_g1_mpeg2_dec_set_quantization(vpu, ctx);
+ hantro_g1_mpeg2_dec_set_quantisation(vpu, ctx);

hantro_g1_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf,
&dst_buf->vb2_buf,
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
index 83b3e42b63a3..062ed19ca0ab 100644
--- a/drivers/staging/media/hantro/hantro_hw.h
+++ b/drivers/staging/media/hantro/hantro_hw.h
@@ -219,7 +219,7 @@ hantro_h264_mv_size(unsigned int width, unsigned int height)
void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx);
void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx);
void hantro_mpeg2_dec_copy_qtable(u8 *qtable,
- const struct v4l2_ctrl_mpeg2_quantization *ctrl);
+ const struct v4l2_ctrl_mpeg2_quantisation *ctrl);
int hantro_mpeg2_dec_init(struct hantro_ctx *ctx);
void hantro_mpeg2_dec_exit(struct hantro_ctx *ctx);

diff --git a/drivers/staging/media/hantro/hantro_mpeg2.c b/drivers/staging/media/hantro/hantro_mpeg2.c
index 1d334e6fcd06..bc77401b02a5 100644
--- a/drivers/staging/media/hantro/hantro_mpeg2.c
+++ b/drivers/staging/media/hantro/hantro_mpeg2.c
@@ -19,7 +19,7 @@ static const u8 zigzag[64] = {
};

void hantro_mpeg2_dec_copy_qtable(u8 *qtable,
- const struct v4l2_ctrl_mpeg2_quantization *ctrl)
+ const struct v4l2_ctrl_mpeg2_quantisation *ctrl)
{
int i, n;

diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
index f610fa5b4335..61a54549774d 100644
--- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
@@ -84,16 +84,14 @@
#define PICT_FRAME 3

static void
-rk3399_vpu_mpeg2_dec_set_quantization(struct hantro_dev *vpu,
+rk3399_vpu_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
struct hantro_ctx *ctx)
{
- struct v4l2_ctrl_mpeg2_quantization *quantization;
+ struct v4l2_ctrl_mpeg2_quantisation *q;

- quantization = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION);
- hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, quantization);
- vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma,
- VDPU_REG_QTABLE_BASE);
+ q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
+ hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
+ vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, VDPU_REG_QTABLE_BASE);
}

static void
@@ -243,7 +241,7 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
VDPU_REG_MV_ACCURACY_BWD(1);
vdpu_write_relaxed(vpu, reg, VDPU_SWREG(136));

- rk3399_vpu_mpeg2_dec_set_quantization(vpu, ctx);
+ rk3399_vpu_mpeg2_dec_set_quantisation(vpu, ctx);

rk3399_vpu_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf,
&dst_buf->vb2_buf,
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
index 92812d1a39d4..62a5407664ae 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
@@ -37,7 +37,7 @@ static const struct cedrus_control cedrus_controls[] = {
},
{
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION,
+ .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
},
.codec = CEDRUS_CODEC_MPEG2,
},
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
index 15f147dad4cb..6516bff3d319 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
@@ -69,7 +69,7 @@ struct cedrus_h264_run {

struct cedrus_mpeg2_run {
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
- const struct v4l2_ctrl_mpeg2_quantization *quantization;
+ const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
};

struct cedrus_h265_run {
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
index d696b3ec70c0..238f779d2ba4 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
@@ -42,8 +42,8 @@ void cedrus_device_run(void *priv)
case V4L2_PIX_FMT_MPEG2_SLICE:
run.mpeg2.slice_params = cedrus_find_control_data(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
- run.mpeg2.quantization = cedrus_find_control_data(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION);
+ run.mpeg2.quantisation = cedrus_find_control_data(ctx,
+ V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
break;

case V4L2_PIX_FMT_H264_SLICE:
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
index 8bcd6b8f9e2d..459f71679a4f 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
@@ -13,9 +13,9 @@
#include "cedrus_hw.h"
#include "cedrus_regs.h"

-/* Default MPEG-2 quantization coefficients, from the specification. */
+/* Default MPEG-2 quantisation coefficients, from the specification. */

-static const u8 intra_quantization_matrix_default[64] = {
+static const u8 intra_quantisation_matrix_default[64] = {
8, 16, 16, 19, 16, 19, 22, 22,
22, 22, 22, 22, 26, 24, 26, 27,
27, 27, 26, 26, 26, 26, 27, 27,
@@ -26,7 +26,7 @@ static const u8 intra_quantization_matrix_default[64] = {
46, 46, 56, 56, 58, 69, 69, 83
};

-static const u8 non_intra_quantization_matrix_default[64] = {
+static const u8 non_intra_quantisation_matrix_default[64] = {
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16,
@@ -77,7 +77,7 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_mpeg2_sequence *sequence;
const struct v4l2_mpeg2_picture *picture;
- const struct v4l2_ctrl_mpeg2_quantization *quantization;
+ const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
dma_addr_t src_buf_addr, dst_luma_addr, dst_chroma_addr;
dma_addr_t fwd_luma_addr, fwd_chroma_addr;
dma_addr_t bwd_luma_addr, bwd_chroma_addr;
@@ -93,17 +93,17 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
sequence = &slice_params->sequence;
picture = &slice_params->picture;

- quantization = run->mpeg2.quantization;
+ quantisation = run->mpeg2.quantisation;

/* Activate MPEG engine. */
cedrus_engine_enable(ctx, CEDRUS_CODEC_MPEG2);

- /* Set intra quantization matrix. */
+ /* Set intra quantisation matrix. */

- if (quantization && quantization->load_intra_quantiser_matrix)
- matrix = quantization->intra_quantiser_matrix;
+ if (quantisation && quantisation->load_intra_quantiser_matrix)
+ matrix = quantisation->intra_quantiser_matrix;
else
- matrix = intra_quantization_matrix_default;
+ matrix = intra_quantisation_matrix_default;

for (i = 0; i < 64; i++) {
reg = VE_DEC_MPEG_IQMINPUT_WEIGHT(i, matrix[i]);
@@ -112,12 +112,12 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
cedrus_write(dev, VE_DEC_MPEG_IQMINPUT, reg);
}

- /* Set non-intra quantization matrix. */
+ /* Set non-intra quantisation matrix. */

- if (quantization && quantization->load_non_intra_quantiser_matrix)
- matrix = quantization->non_intra_quantiser_matrix;
+ if (quantisation && quantisation->load_non_intra_quantiser_matrix)
+ matrix = quantisation->non_intra_quantiser_matrix;
else
- matrix = non_intra_quantization_matrix_default;
+ matrix = non_intra_quantisation_matrix_default;

for (i = 0; i < 64; i++) {
reg = VE_DEC_MPEG_IQMINPUT_WEIGHT(i, matrix[i]);
diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
index 2a4ae6701166..b8adf3ac2c1d 100644
--- a/include/media/mpeg2-ctrls.h
+++ b/include/media/mpeg2-ctrls.h
@@ -12,11 +12,11 @@
#define _MPEG2_CTRLS_H_

#define V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (V4L2_CID_CODEC_BASE+250)
-#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION (V4L2_CID_CODEC_BASE+251)
+#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (V4L2_CID_CODEC_BASE+251)

/* enum v4l2_ctrl_type type values */
#define V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS 0x0103
-#define V4L2_CTRL_TYPE_MPEG2_QUANTIZATION 0x0104
+#define V4L2_CTRL_TYPE_MPEG2_QUANTISATION 0x0104

#define V4L2_MPEG2_PICTURE_CODING_TYPE_I 1
#define V4L2_MPEG2_PICTURE_CODING_TYPE_P 2
@@ -66,7 +66,7 @@ struct v4l2_ctrl_mpeg2_slice_params {
__u32 quantiser_scale_code;
};

-struct v4l2_ctrl_mpeg2_quantization {
+struct v4l2_ctrl_mpeg2_quantisation {
/* ISO/IEC 13818-2, ITU-T Rec. H.262: Quant matrix extension */
__u8 load_intra_quantiser_matrix;
__u8 load_non_intra_quantiser_matrix;
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index a5953b812878..a38e6bd02a6a 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -41,7 +41,7 @@ struct video_device;
* @p_u32: Pointer to a 32-bit unsigned value.
* @p_char: Pointer to a string.
* @p_mpeg2_slice_params: Pointer to a MPEG2 slice parameters structure.
- * @p_mpeg2_quantization: Pointer to a MPEG2 quantization data structure.
+ * @p_mpeg2_quantisation: Pointer to a MPEG2 quantisation data structure.
* @p_fwht_params: Pointer to a FWHT stateless parameters structure.
* @p_h264_sps: Pointer to a struct v4l2_ctrl_h264_sps.
* @p_h264_pps: Pointer to a struct v4l2_ctrl_h264_pps.
@@ -67,7 +67,7 @@ union v4l2_ctrl_ptr {
u32 *p_u32;
char *p_char;
struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
- struct v4l2_ctrl_mpeg2_quantization *p_mpeg2_quantization;
+ struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
struct v4l2_ctrl_fwht_params *p_fwht_params;
struct v4l2_ctrl_h264_sps *p_h264_sps;
struct v4l2_ctrl_h264_pps *p_h264_pps;
--
2.30.0

2021-04-26 03:38:57

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 08/10] media: uapi: Move the MPEG-2 stateless control type out of staging

Move the MPEG-2 stateless control types out of staging,
and re-number it to avoid any confusion.

Signed-off-by: Ezequiel Garcia <[email protected]>
---
include/media/mpeg2-ctrls.h | 4 ----
include/uapi/linux/videodev2.h | 4 ++++
2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
index 388a796cf75d..c4cf1af5b73b 100644
--- a/include/media/mpeg2-ctrls.h
+++ b/include/media/mpeg2-ctrls.h
@@ -16,10 +16,6 @@
#define V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (V4L2_CID_CODEC_BASE+253)

/* enum v4l2_ctrl_type type values */
-#define V4L2_CTRL_TYPE_MPEG2_QUANTISATION 0x0131
-#define V4L2_CTRL_TYPE_MPEG2_SEQUENCE 0x0132
-#define V4L2_CTRL_TYPE_MPEG2_PICTURE 0x0133
-
#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001

/**
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 311a01cc5775..d3bb18a3a51b 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1807,6 +1807,10 @@ enum v4l2_ctrl_type {
V4L2_CTRL_TYPE_FWHT_PARAMS = 0x0220,

V4L2_CTRL_TYPE_VP8_FRAME = 0x0240,
+
+ V4L2_CTRL_TYPE_MPEG2_QUANTISATION = 0x0250,
+ V4L2_CTRL_TYPE_MPEG2_SEQUENCE = 0x0251,
+ V4L2_CTRL_TYPE_MPEG2_PICTURE = 0x0252,
};

/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
--
2.30.0

2021-04-26 03:39:06

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 09/10] media: controls: Log MPEG-2 stateless control in .std_log

Simply print the type of the control.

Signed-off-by: Ezequiel Garcia <[email protected]>
---
drivers/media/v4l2-core/v4l2-ctrls.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 6a033102d31b..a693ff8dc3dc 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1873,6 +1873,15 @@ static void std_log(const struct v4l2_ctrl *ctrl)
case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
pr_cont("HDR10_MASTERING_DISPLAY");
break;
+ case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
+ pr_cont("MPEG2_QUANTISATION");
+ break;
+ case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
+ pr_cont("MPEG2_SEQUENCE");
+ break;
+ case V4L2_CTRL_TYPE_MPEG2_PICTURE:
+ pr_cont("MPEG2_PICTURE");
+ break;
default:
pr_cont("unknown type %d", ctrl->type);
break;
--
2.30.0

2021-04-26 03:39:45

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 10/10] media: uapi: move MPEG-2 stateless controls out of staging

Until now, the MPEG-2 V4L2 API was not exported as a public API,
and only defined in a private media header (media/mpeg2-ctrls.h).

After reviewing the MPEG-2 specification in detail, and reworking
the controls so they match the MPEG-2 semantics properly,
we can consider it ready.

Signed-off-by: Ezequiel Garcia <[email protected]>
---
.../media/v4l/ext-ctrls-codec-stateless.rst | 214 +++++++++++++++++
.../media/v4l/ext-ctrls-codec.rst | 216 ------------------
.../media/v4l/pixfmt-compressed.rst | 10 +-
.../media/v4l/vidioc-g-ext-ctrls.rst | 12 +
drivers/media/v4l2-core/v4l2-ctrls.c | 12 +-
drivers/staging/media/hantro/hantro_drv.c | 6 +-
.../media/hantro/hantro_g1_mpeg2_dec.c | 6 +-
.../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 6 +-
drivers/staging/media/sunxi/cedrus/cedrus.c | 6 +-
.../staging/media/sunxi/cedrus/cedrus_dec.c | 6 +-
include/media/mpeg2-ctrls.h | 126 ----------
include/media/v4l2-ctrls.h | 1 -
include/uapi/linux/v4l2-controls.h | 112 +++++++++
include/uapi/linux/videodev2.h | 3 +
14 files changed, 367 insertions(+), 369 deletions(-)
delete mode 100644 include/media/mpeg2-ctrls.h

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 3fc04daa9ffb..eaaf96f5dde6 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
@@ -1244,3 +1244,217 @@ FWHT Flags
* - __u8
- ``padding[3]``
- Applications and drivers must set this to zero.
+
+.. _v4l2-codec-stateless-mpeg2:
+
+``V4L2_CID_STATELESS_MPEG2_SEQUENCE (struct)``
+ Specifies the sequence parameters (as extracted from the bitstream) for the
+ associated MPEG-2 slice data. This includes fields matching the syntax
+ elements from the sequence header and sequence extension parts of the
+ bitstream as specified by :ref:`mpeg2part2`.
+
+.. c:type:: v4l2_ctrl_mpeg2_sequence
+
+.. raw:: latex
+
+ \small
+
+.. cssclass:: longtable
+
+.. tabularcolumns:: |p{1.4cm}|p{6.5cm}|p{9.4cm}|
+
+.. flat-table:: struct v4l2_ctrl_mpeg2_sequence
+ :header-rows: 0
+ :stub-columns: 0
+ :widths: 1 1 2
+
+ * - __u16
+ - ``horizontal_size``
+ - The width of the displayable part of the frame's luminance component.
+ * - __u16
+ - ``vertical_size``
+ - The height of the displayable part of the frame's luminance component.
+ * - __u32
+ - ``vbv_buffer_size``
+ - Used to calculate the required size of the video buffering verifier,
+ defined (in bits) as: 16 * 1024 * vbv_buffer_size.
+ * - __u16
+ - ``profile_and_level_indication``
+ - The current profile and level indication as extracted from the
+ bitstream.
+ * - __u8
+ - ``chroma_format``
+ - The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
+ * - __u8
+ - ``flags``
+ - See :ref:`MPEG-2 Sequence Flags <mpeg2_sequence_flags>`.
+
+.. _mpeg2_sequence_flags:
+
+``MPEG-2 Sequence Flags``
+
+.. cssclass:: longtable
+
+.. flat-table::
+ :header-rows: 0
+ :stub-columns: 0
+ :widths: 1 1 2
+
+ * - ``V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE``
+ - 0x00000001
+ - Indication that all the frames for the sequence are progressive instead
+ of interlaced.
+
+.. raw:: latex
+
+ \normalsize
+
+``V4L2_CID_STATELESS_MPEG2_PICTURE (struct)``
+ Specifies the picture parameters (as extracted from the bitstream) for the
+ associated MPEG-2 slice data. This includes fields matching the syntax
+ elements from the picture header and picture coding extension parts of the
+ bitstream as specified by :ref:`mpeg2part2`.
+
+.. c:type:: v4l2_ctrl_mpeg2_picture
+
+.. raw:: latex
+
+ \small
+
+.. cssclass:: longtable
+
+.. tabularcolumns:: |p{1.0cm}|p{5.6cm}|p{10.7cm}|
+
+.. flat-table:: struct v4l2_ctrl_mpeg2_picture
+ :header-rows: 0
+ :stub-columns: 0
+ :widths: 1 1 2
+
+ * - __u64
+ - ``backward_ref_ts``
+ - Timestamp of the V4L2 capture buffer to use as backward reference, used
+ with B-coded and P-coded frames. The timestamp refers to the
+ ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
+ :c:func:`v4l2_timeval_to_ns()` function to convert the struct
+ :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
+ * - __u64
+ - ``forward_ref_ts``
+ - Timestamp for the V4L2 capture buffer to use as forward reference, used
+ with B-coded frames. The timestamp refers to the ``timestamp`` field in
+ struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()`
+ function to convert the struct :c:type:`timeval` in struct
+ :c:type:`v4l2_buffer` to a __u64.
+ * - __u32
+ - ``flags``
+ - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
+ * - __u8
+ - ``f_code[2][2]``
+ - Motion vector codes.
+ * - __u8
+ - ``picture_coding_type``
+ - Picture coding type for the frame covered by the current slice
+ (V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
+ V4L2_MPEG2_PICTURE_CODING_TYPE_B).
+ * - __u8
+ - ``picture_structure``
+ - Picture structure (1: interlaced top field, 2: interlaced bottom field,
+ 3: progressive frame).
+ * - __u8
+ - ``intra_dc_precision``
+ - Precision of Discrete Cosine transform (0: 8 bits precision,
+ 1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
+ * - __u8
+ - ``reserved``
+ - Applications and drivers must set this to zero.
+
+.. _mpeg2_picture_flags:
+
+``MPEG-2 Picture Flags``
+
+.. cssclass:: longtable
+
+.. flat-table::
+ :header-rows: 0
+ :stub-columns: 0
+ :widths: 1 1 2
+
+ * - ``V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST``
+ - 0x00000001
+ - If set and it's an interlaced stream, top field is output first.
+ * - ``V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT``
+ - 0x00000002
+ - If set only frame-DCT and frame prediction are used.
+ * - ``V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV``
+ - 0x00000004
+ - If set motion vectors are coded for intra macroblocks.
+ * - ``V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE``
+ - 0x00000008
+ - This flag affects the inverse quantization process.
+ * - ``V4L2_MPEG2_PIC_FLAG_INTRA_VLC``
+ - 0x00000010
+ - This flag affects the decoding of transform coefficient data.
+ * - ``V4L2_MPEG2_PIC_FLAG_ALT_SCAN``
+ - 0x00000020
+ - This flag affects the decoding of transform coefficient data.
+ * - ``V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST``
+ - 0x00000040
+ - This flag affects the decoding process of progressive frames.
+ * - ``V4L2_MPEG2_PIC_FLAG_PROGRESSIVE``
+ - 0x00000080
+ - Indicates whether the current frame is progressive.
+
+.. raw:: latex
+
+ \normalsize
+
+``V4L2_CID_STATELESS_MPEG2_QUANTISATION (struct)``
+ Specifies quantisation matrices, in zigzag scanning order, for the
+ associated MPEG-2 slice data. This control is initialized by the kernel
+ to the matrices default values. If a bitstream transmits a user-defined
+ quantisation matrices load, applications are expected to use this control.
+ Applications are also expected to set the control loading the default
+ values, if the quantisation matrices need to be reset, for instance on a
+ sequence header. This process is specified by section 6.3.7.
+ "Quant matrix extension" of the specification.
+
+.. c:type:: v4l2_ctrl_mpeg2_quantisation
+
+.. tabularcolumns:: |p{0.8cm}|p{8.0cm}|p{8.5cm}|
+
+.. cssclass:: longtable
+
+.. raw:: latex
+
+ \small
+
+.. flat-table:: struct v4l2_ctrl_mpeg2_quantisation
+ :header-rows: 0
+ :stub-columns: 0
+ :widths: 1 1 2
+
+ * - __u8
+ - ``intra_quantiser_matrix[64]``
+ - The quantisation matrix coefficients for intra-coded frames, in zigzag
+ scanning order. It is relevant for both luma and chroma components,
+ although it can be superseded by the chroma-specific matrix for
+ non-4:2:0 YUV formats.
+ * - __u8
+ - ``non_intra_quantiser_matrix[64]``
+ - The quantisation matrix coefficients for non-intra-coded frames, in
+ zigzag scanning order. It is relevant for both luma and chroma
+ components, although it can be superseded by the chroma-specific matrix
+ for non-4:2:0 YUV formats.
+ * - __u8
+ - ``chroma_intra_quantiser_matrix[64]``
+ - The quantisation matrix coefficients for the chominance component of
+ intra-coded frames, in zigzag scanning order. Only relevant for
+ non-4:2:0 YUV formats.
+ * - __u8
+ - ``chroma_non_intra_quantiser_matrix[64]``
+ - The quantisation matrix coefficients for the chrominance component of
+ non-intra-coded frames, in zigzag scanning order. Only relevant for
+ non-4:2:0 YUV formats.
+
+.. raw:: latex
+
+ \normalsize
diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index af12c869e304..a580ea953c4e 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1606,222 +1606,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR (integer)``
Indicates bit rate (bps) for hierarchical coding layer 6 for H264 encoder.

-.. _v4l2-mpeg-mpeg2:
-
-``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (struct)``
- Specifies the sequence parameters (as extracted from the bitstream) for the
- associated MPEG-2 slice data. This includes fields matching the syntax
- elements from the sequence header and sequence extension parts of the
- bitstream as specified by :ref:`mpeg2part2`.
-
- .. note::
-
- This compound control is not yet part of the public kernel API and
- it is expected to change.
-
-.. c:type:: v4l2_ctrl_mpeg2_sequence
-
-.. cssclass:: longtable
-
-.. tabularcolumns:: |p{1.4cm}|p{6.5cm}|p{9.4cm}|
-
-.. flat-table:: struct v4l2_ctrl_mpeg2_sequence
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - __u16
- - ``horizontal_size``
- - The width of the displayable part of the frame's luminance component.
- * - __u16
- - ``vertical_size``
- - The height of the displayable part of the frame's luminance component.
- * - __u32
- - ``vbv_buffer_size``
- - Used to calculate the required size of the video buffering verifier,
- defined (in bits) as: 16 * 1024 * vbv_buffer_size.
- * - __u16
- - ``profile_and_level_indication``
- - The current profile and level indication as extracted from the
- bitstream.
- * - __u8
- - ``chroma_format``
- - The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
- * - __u8
- - ``flags``
- - See :ref:`MPEG-2 Sequence Flags <mpeg2_sequence_flags>`.
-
-.. _mpeg2_sequence_flags:
-
-``MPEG-2 Sequence Flags``
-
-.. cssclass:: longtable
-
-.. flat-table::
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - ``V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE``
- - 0x00000001
- - Indication that all the frames for the sequence are progressive instead
- of interlaced.
-
-``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (struct)``
- Specifies the picture parameters (as extracted from the bitstream) for the
- associated MPEG-2 slice data. This includes fields matching the syntax
- elements from the picture header and picture coding extension parts of the
- bitstream as specified by :ref:`mpeg2part2`.
-
- .. note::
-
- This compound control is not yet part of the public kernel API and
- it is expected to change.
-
-.. c:type:: v4l2_ctrl_mpeg2_picture
-
-.. raw:: latex
-
- \small
-
-.. cssclass:: longtable
-
-.. tabularcolumns:: |p{1.0cm}|p{5.6cm}|p{10.7cm}|
-
-.. flat-table:: struct v4l2_ctrl_mpeg2_picture
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - __u64
- - ``backward_ref_ts``
- - Timestamp of the V4L2 capture buffer to use as backward reference, used
- with B-coded and P-coded frames. The timestamp refers to the
- ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
- :c:func:`v4l2_timeval_to_ns()` function to convert the struct
- :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
- * - __u64
- - ``forward_ref_ts``
- - Timestamp for the V4L2 capture buffer to use as forward reference, used
- with B-coded frames. The timestamp refers to the ``timestamp`` field in
- struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()`
- function to convert the struct :c:type:`timeval` in struct
- :c:type:`v4l2_buffer` to a __u64.
- * - __u32
- - ``flags``
- - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
- * - __u8
- - ``f_code[2][2]``
- - Motion vector codes.
- * - __u8
- - ``picture_coding_type``
- - Picture coding type for the frame covered by the current slice
- (V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
- V4L2_MPEG2_PICTURE_CODING_TYPE_B).
- * - __u8
- - ``picture_structure``
- - Picture structure (1: interlaced top field, 2: interlaced bottom field,
- 3: progressive frame).
- * - __u8
- - ``intra_dc_precision``
- - Precision of Discrete Cosine transform (0: 8 bits precision,
- 1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
- * - __u8
- - ``reserved``
- - Applications and drivers must set this to zero.
-
-
-.. _mpeg2_picture_flags:
-
-``MPEG-2 Picture Flags``
-
-.. cssclass:: longtable
-
-.. flat-table::
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - ``V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST``
- - 0x00000001
- - If set and it's an interlaced stream, top field is output first.
- * - ``V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT``
- - 0x00000002
- - If set only frame-DCT and frame prediction are used.
- * - ``V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV``
- - 0x00000004
- - If set motion vectors are coded for intra macroblocks.
- * - ``V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE``
- - 0x00000008
- - This flag affects the inverse quantization process.
- * - ``V4L2_MPEG2_PIC_FLAG_INTRA_VLC``
- - 0x00000010
- - This flag affects the decoding of transform coefficient data.
- * - ``V4L2_MPEG2_PIC_FLAG_ALT_SCAN``
- - 0x00000020
- - This flag affects the decoding of transform coefficient data.
- * - ``V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST``
- - 0x00000040
- - This flag affects the decoding process of progressive frames.
- * - ``V4L2_MPEG2_PIC_FLAG_PROGRESSIVE``
- - 0x00000080
- - Indicates whether the current frame is progressive.
-
-.. raw:: latex
-
- \normalsize
-
-``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (struct)``
- Specifies quantisation matrices (as extracted from the bitstream) for the
- associated MPEG-2 slice data.
-
- .. note::
-
- This compound control is not yet part of the public kernel API and
- it is expected to change.
-
-.. c:type:: v4l2_ctrl_mpeg2_quantisation
-
-.. tabularcolumns:: |p{0.8cm}|p{8.0cm}|p{8.5cm}|
-
-.. cssclass:: longtable
-
-.. raw:: latex
-
- \small
-
-.. flat-table:: struct v4l2_ctrl_mpeg2_quantisation
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - __u8
- - ``intra_quantiser_matrix[64]``
- - The quantisation matrix coefficients for intra-coded frames, in zigzag
- scanning order. It is relevant for both luma and chroma components,
- although it can be superseded by the chroma-specific matrix for
- non-4:2:0 YUV formats.
- * - __u8
- - ``non_intra_quantiser_matrix[64]``
- - The quantisation matrix coefficients for non-intra-coded frames, in
- zigzag scanning order. It is relevant for both luma and chroma
- components, although it can be superseded by the chroma-specific matrix
- for non-4:2:0 YUV formats.
- * - __u8
- - ``chroma_intra_quantiser_matrix[64]``
- - The quantisation matrix coefficients for the chominance component of
- intra-coded frames, in zigzag scanning order. Only relevant for
- non-4:2:0 YUV formats.
- * - __u8
- - ``chroma_non_intra_quantiser_matrix[64]``
- - The quantisation matrix coefficients for the chrominance component of
- non-intra-coded frames, in zigzag scanning order. Only relevant for
- non-4:2:0 YUV formats.
-
-.. raw:: latex
-
- \normalsize
-
``V4L2_CID_FWHT_I_FRAME_QP (integer)``
Quantization parameter for an I frame for FWHT. Valid range: from 1
to 31.
diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
index 6c10a062adac..0ede39907ee2 100644
--- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
+++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
@@ -112,13 +112,13 @@ Compressed Formats
- 'MG2S'
- MPEG-2 parsed slice data, as extracted from the MPEG-2 bitstream.
This format is adapted for stateless video decoders that implement a
- MPEG-2 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
+ MPEG-2 pipeline with the :ref:`stateless_decoder`.
Metadata associated with the frame to decode is required to be passed
- through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE`` and
- ``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE`` controls.
+ through the ``V4L2_CID_STATELESS_MPEG2_SEQUENCE`` and
+ ``V4L2_CID_STATELESS_MPEG2_PICTURE`` controls.
Quantisation matrices can optionally be specified through the
- ``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION`` control.
- See the :ref:`associated Codec Control IDs <v4l2-mpeg-mpeg2>`.
+ ``V4L2_CID_STATELESS_MPEG2_QUANTISATION`` control.
+ See the :ref:`associated Codec Control IDs <v4l2-codec-stateless-mpeg2>`.
Exactly one output and one capture buffer must be provided for use with
this pixel format. The output buffer must contain the appropriate number
of macroblocks to decode a full corresponding frame to the matching
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 3ba22983d21f..2d6bc8d94380 100644
--- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
+++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
@@ -221,6 +221,18 @@ still cause this situation.
- ``p_vp8_frame``
- A pointer to a struct :c:type:`v4l2_ctrl_vp8_frame`. Valid if this control is
of type ``V4L2_CTRL_TYPE_VP8_FRAME``.
+ * - struct :c:type:`v4l2_ctrl_mpeg2_sequence` *
+ - ``p_mpeg2_sequence``
+ - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_sequence`. Valid if this control is
+ of type ``V4L2_CTRL_TYPE_MPEG2_SEQUENCE``.
+ * - struct :c:type:`v4l2_ctrl_mpeg2_picture` *
+ - ``p_mpeg2_picture``
+ - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_picture`. Valid if this control is
+ of type ``V4L2_CTRL_TYPE_MPEG2_PICTURE``.
+ * - struct :c:type:`v4l2_ctrl_mpeg2_quantisation` *
+ - ``p_mpeg2_quantisation``
+ - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_quantisation`. Valid if this control is
+ of type ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``.
* - 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.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index a693ff8dc3dc..d4e2c7318ee6 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -977,9 +977,6 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_MPEG_VIDEO_LTR_COUNT: return "LTR Count";
case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: return "Frame LTR Index";
case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: return "Use LTR Frames";
- case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
- case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE: return "MPEG-2 Picture Header";
- case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value";
case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value";

@@ -1228,6 +1225,9 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_STATELESS_H264_DECODE_PARAMS: return "H264 Decode Parameters";
case V4L2_CID_STATELESS_FWHT_PARAMS: return "FWHT Stateless Parameters";
case V4L2_CID_STATELESS_VP8_FRAME: return "VP8 Frame Parameters";
+ case V4L2_CID_STATELESS_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
+ case V4L2_CID_STATELESS_MPEG2_PICTURE: return "MPEG-2 Picture Header";
+ case V4L2_CID_STATELESS_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";

/* Colorimetry controls */
/* Keep the order of the 'case's the same as in v4l2-controls.h! */
@@ -1500,13 +1500,13 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_RDS_TX_ALT_FREQS:
*type = V4L2_CTRL_TYPE_U32;
break;
- case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE:
+ case V4L2_CID_STATELESS_MPEG2_SEQUENCE:
*type = V4L2_CTRL_TYPE_MPEG2_SEQUENCE;
break;
- case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE:
+ case V4L2_CID_STATELESS_MPEG2_PICTURE:
*type = V4L2_CTRL_TYPE_MPEG2_PICTURE;
break;
- case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION:
+ case V4L2_CID_STATELESS_MPEG2_QUANTISATION:
*type = V4L2_CTRL_TYPE_MPEG2_QUANTISATION;
break;
case V4L2_CID_STATELESS_FWHT_PARAMS:
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
index f5fa7e0940c4..b48552bddb3a 100644
--- a/drivers/staging/media/hantro/hantro_drv.c
+++ b/drivers/staging/media/hantro/hantro_drv.c
@@ -289,17 +289,17 @@ static const struct hantro_ctrl controls[] = {
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
+ .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE,
},
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
+ .id = V4L2_CID_STATELESS_MPEG2_PICTURE,
},
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
+ .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION,
},
}, {
.codec = HANTRO_VP8_DECODER,
diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
index 6d89cae7df45..f565e37e397a 100644
--- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
@@ -83,7 +83,7 @@ hantro_g1_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
{
struct v4l2_ctrl_mpeg2_quantisation *q;

- q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
+ q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION);
hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, G1_REG_QTABLE_BASE);
}
@@ -160,9 +160,9 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
hantro_start_prepare_run(ctx);

seq = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ V4L2_CID_STATELESS_MPEG2_SEQUENCE);
pic = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
+ V4L2_CID_STATELESS_MPEG2_PICTURE);

reg = G1_REG_DEC_AXI_RD_ID(0) |
G1_REG_DEC_TIMEOUT_E(1) |
diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
index d16d76760278..2527dce7eb18 100644
--- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
@@ -85,7 +85,7 @@ rk3399_vpu_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
{
struct v4l2_ctrl_mpeg2_quantisation *q;

- q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
+ q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION);
hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, VDPU_REG_QTABLE_BASE);
}
@@ -162,9 +162,9 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
hantro_start_prepare_run(ctx);

seq = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ V4L2_CID_STATELESS_MPEG2_SEQUENCE);
pic = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
+ V4L2_CID_STATELESS_MPEG2_PICTURE);

reg = VDPU_REG_DEC_ADV_PRE_DIS(0) |
VDPU_REG_DEC_SCMD_DIS(0) |
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
index 4430c8fa2cc7..fa348c09f844 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
@@ -31,19 +31,19 @@
static const struct cedrus_control cedrus_controls[] = {
{
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
+ .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE,
},
.codec = CEDRUS_CODEC_MPEG2,
},
{
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
+ .id = V4L2_CID_STATELESS_MPEG2_PICTURE,
},
.codec = CEDRUS_CODEC_MPEG2,
},
{
.cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
+ .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION,
},
.codec = CEDRUS_CODEC_MPEG2,
},
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
index e98185c1f5a7..97e410d92506 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
@@ -41,11 +41,11 @@ void cedrus_device_run(void *priv)
switch (ctx->src_fmt.pixelformat) {
case V4L2_PIX_FMT_MPEG2_SLICE:
run.mpeg2.sequence = cedrus_find_control_data(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
+ V4L2_CID_STATELESS_MPEG2_SEQUENCE);
run.mpeg2.picture = cedrus_find_control_data(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
+ V4L2_CID_STATELESS_MPEG2_PICTURE);
run.mpeg2.quantisation = cedrus_find_control_data(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
+ V4L2_CID_STATELESS_MPEG2_QUANTISATION);
break;

case V4L2_PIX_FMT_H264_SLICE:
diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
deleted file mode 100644
index c4cf1af5b73b..000000000000
--- a/include/media/mpeg2-ctrls.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * These are the MPEG2 state controls for use with stateless MPEG-2
- * codec drivers.
- *
- * It turns out that these structs are not stable yet and will undergo
- * more changes. So keep them private until they are stable and ready to
- * become part of the official public API.
- */
-
-#ifndef _MPEG2_CTRLS_H_
-#define _MPEG2_CTRLS_H_
-
-#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (V4L2_CID_CODEC_BASE+251)
-#define V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (V4L2_CID_CODEC_BASE+252)
-#define V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (V4L2_CID_CODEC_BASE+253)
-
-/* enum v4l2_ctrl_type type values */
-#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001
-
-/**
- * struct v4l2_ctrl_mpeg2_sequence - MPEG-2 sequence header
- *
- * All the members on this structure match the sequence header and sequence
- * extension syntaxes as specified by the MPEG-2 specification.
- *
- * Fields horizontal_size, vertical_size and vbv_buffer_size are a
- * combination of respective _value and extension syntax elements,
- * as described in section 6.3.3 "Sequence header".
- *
- * @horizontal_size: combination of elements horizontal_size_value and
- * horizontal_size_extension.
- * @vertical_size: combination of elements vertical_size_value and
- * vertical_size_extension.
- * @vbv_buffer_size: combination of elements vbv_buffer_size_value and
- * vbv_buffer_size_extension.
- * @profile_and_level_indication: see MPEG-2 specification.
- * @chroma_format: see MPEG-2 specification.
- * @flags: see V4L2_MPEG2_SEQ_FLAG_{}.
- */
-struct v4l2_ctrl_mpeg2_sequence {
- __u16 horizontal_size;
- __u16 vertical_size;
- __u32 vbv_buffer_size;
- __u16 profile_and_level_indication;
- __u8 chroma_format;
- __u8 flags;
-};
-
-#define V4L2_MPEG2_PIC_CODING_TYPE_I 1
-#define V4L2_MPEG2_PIC_CODING_TYPE_P 2
-#define V4L2_MPEG2_PIC_CODING_TYPE_B 3
-#define V4L2_MPEG2_PIC_CODING_TYPE_D 4
-
-#define V4L2_MPEG2_PIC_TOP_FIELD 0x1
-#define V4L2_MPEG2_PIC_BOTTOM_FIELD 0x2
-#define V4L2_MPEG2_PIC_FRAME 0x3
-
-#define V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST 0x0001
-#define V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT 0x0002
-#define V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV 0x0004
-#define V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE 0x0008
-#define V4L2_MPEG2_PIC_FLAG_INTRA_VLC 0x0010
-#define V4L2_MPEG2_PIC_FLAG_ALT_SCAN 0x0020
-#define V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST 0x0040
-#define V4L2_MPEG2_PIC_FLAG_PROGRESSIVE 0x0080
-
-/**
- * struct v4l2_ctrl_mpeg2_picture - MPEG-2 picture header
- *
- * All the members on this structure match the picture header and picture
- * coding extension syntaxes as specified by the MPEG-2 specification.
- *
- * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as
- * reference for backward prediction.
- * @forward_ref_ts: timestamp of the V4L2 capture buffer to use as
- * reference for forward prediction. These timestamp refers to the
- * timestamp field in struct v4l2_buffer. Use v4l2_timeval_to_ns()
- * to convert the struct timeval to a __u64.
- * @flags: see V4L2_MPEG2_PIC_FLAG_{}.
- * @f_code[2][2]: see MPEG-2 specification.
- * @picture_coding_type: see MPEG-2 specification.
- * @picture_structure: see V4L2_MPEG2_PIC_{}_FIELD.
- * @intra_dc_precision: see MPEG-2 specification.
- * @reserved: padding field. Should be zeroed by applications.
- */
-struct v4l2_ctrl_mpeg2_picture {
- __u64 backward_ref_ts;
- __u64 forward_ref_ts;
- __u32 flags;
- __u8 f_code[2][2];
- __u8 picture_coding_type;
- __u8 picture_structure;
- __u8 intra_dc_precision;
- __u8 reserved;
-};
-
-/**
- * struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
- *
- * Quantization matrices as specified by section 6.3.7
- * "Quant matrix extension".
- *
- * @intra_quantiser_matrix: The quantisation matrix coefficients
- * for intra-coded frames, in zigzag scanning order. It is relevant
- * for both luma and chroma components, although it can be superseded
- * by the chroma-specific matrix for non-4:2:0 YUV formats.
- * @non_intra_quantiser_matrix: The quantisation matrix coefficients
- * for non-intra-coded frames, in zigzag scanning order. It is relevant
- * for both luma and chroma components, although it can be superseded
- * by the chroma-specific matrix for non-4:2:0 YUV formats.
- * @chroma_intra_quantiser_matrix: The quantisation matrix coefficients
- * for the chominance component of intra-coded frames, in zigzag scanning
- * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
- * @chroma_non_intra_quantiser_matrix: The quantisation matrix coefficients
- * for the chrominance component of non-intra-coded frames, in zigzag scanning
- * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
- */
-struct v4l2_ctrl_mpeg2_quantisation {
- __u8 intra_quantiser_matrix[64];
- __u8 non_intra_quantiser_matrix[64];
- __u8 chroma_intra_quantiser_matrix[64];
- __u8 chroma_non_intra_quantiser_matrix[64];
-};
-
-#endif
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index 215e44172c66..575b59fbac77 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -17,7 +17,6 @@
* Include the stateless codec compound control definitions.
* This will move to the public headers once this API is fully stable.
*/
-#include <media/mpeg2-ctrls.h>
#include <media/hevc-ctrls.h>

/* forward references */
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index d43bec5f1afd..7c0cf9121669 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1862,6 +1862,118 @@ struct v4l2_ctrl_vp8_frame {
__u64 flags;
};

+/* Stateless MPEG-2 controls */
+
+#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001
+
+#define V4L2_CID_STATELESS_MPEG2_SEQUENCE (V4L2_CID_CODEC_STATELESS_BASE+220)
+/**
+ * struct v4l2_ctrl_mpeg2_sequence - MPEG-2 sequence header
+ *
+ * All the members on this structure match the sequence header and sequence
+ * extension syntaxes as specified by the MPEG-2 specification.
+ *
+ * Fields horizontal_size, vertical_size and vbv_buffer_size are a
+ * combination of respective _value and extension syntax elements,
+ * as described in section 6.3.3 "Sequence header".
+ *
+ * @horizontal_size: combination of elements horizontal_size_value and
+ * horizontal_size_extension.
+ * @vertical_size: combination of elements vertical_size_value and
+ * vertical_size_extension.
+ * @vbv_buffer_size: combination of elements vbv_buffer_size_value and
+ * vbv_buffer_size_extension.
+ * @profile_and_level_indication: see MPEG-2 specification.
+ * @chroma_format: see MPEG-2 specification.
+ * @flags: see V4L2_MPEG2_SEQ_FLAG_{}.
+ */
+struct v4l2_ctrl_mpeg2_sequence {
+ __u16 horizontal_size;
+ __u16 vertical_size;
+ __u32 vbv_buffer_size;
+ __u16 profile_and_level_indication;
+ __u8 chroma_format;
+ __u8 flags;
+};
+
+#define V4L2_MPEG2_PIC_CODING_TYPE_I 1
+#define V4L2_MPEG2_PIC_CODING_TYPE_P 2
+#define V4L2_MPEG2_PIC_CODING_TYPE_B 3
+#define V4L2_MPEG2_PIC_CODING_TYPE_D 4
+
+#define V4L2_MPEG2_PIC_TOP_FIELD 0x1
+#define V4L2_MPEG2_PIC_BOTTOM_FIELD 0x2
+#define V4L2_MPEG2_PIC_FRAME 0x3
+
+#define V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST 0x0001
+#define V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT 0x0002
+#define V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV 0x0004
+#define V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE 0x0008
+#define V4L2_MPEG2_PIC_FLAG_INTRA_VLC 0x0010
+#define V4L2_MPEG2_PIC_FLAG_ALT_SCAN 0x0020
+#define V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST 0x0040
+#define V4L2_MPEG2_PIC_FLAG_PROGRESSIVE 0x0080
+
+#define V4L2_CID_STATELESS_MPEG2_PICTURE (V4L2_CID_CODEC_STATELESS_BASE+221)
+/**
+ * struct v4l2_ctrl_mpeg2_picture - MPEG-2 picture header
+ *
+ * All the members on this structure match the picture header and picture
+ * coding extension syntaxes as specified by the MPEG-2 specification.
+ *
+ * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as
+ * reference for backward prediction.
+ * @forward_ref_ts: timestamp of the V4L2 capture buffer to use as
+ * reference for forward prediction. These timestamp refers to the
+ * timestamp field in struct v4l2_buffer. Use v4l2_timeval_to_ns()
+ * to convert the struct timeval to a __u64.
+ * @flags: see V4L2_MPEG2_PIC_FLAG_{}.
+ * @f_code: see MPEG-2 specification.
+ * @picture_coding_type: see MPEG-2 specification.
+ * @picture_structure: see V4L2_MPEG2_PIC_{}_FIELD.
+ * @intra_dc_precision: see MPEG-2 specification.
+ * @reserved: padding field. Should be zeroed by applications.
+ */
+struct v4l2_ctrl_mpeg2_picture {
+ __u64 backward_ref_ts;
+ __u64 forward_ref_ts;
+ __u32 flags;
+ __u8 f_code[2][2];
+ __u8 picture_coding_type;
+ __u8 picture_structure;
+ __u8 intra_dc_precision;
+ __u8 reserved;
+};
+
+#define V4L2_CID_STATELESS_MPEG2_QUANTISATION (V4L2_CID_CODEC_STATELESS_BASE+222)
+/**
+ * struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
+ *
+ * Quantisation matrices as specified by section 6.3.7
+ * "Quant matrix extension".
+ *
+ * @intra_quantiser_matrix: The quantisation matrix coefficients
+ * for intra-coded frames, in zigzag scanning order. It is relevant
+ * for both luma and chroma components, although it can be superseded
+ * by the chroma-specific matrix for non-4:2:0 YUV formats.
+ * @non_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for non-intra-coded frames, in zigzag scanning order. It is relevant
+ * for both luma and chroma components, although it can be superseded
+ * by the chroma-specific matrix for non-4:2:0 YUV formats.
+ * @chroma_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for the chominance component of intra-coded frames, in zigzag scanning
+ * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
+ * @chroma_non_intra_quantiser_matrix: The quantisation matrix coefficients
+ * for the chrominance component of non-intra-coded frames, in zigzag scanning
+ * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
+ */
+struct v4l2_ctrl_mpeg2_quantisation {
+ __u8 intra_quantiser_matrix[64];
+ __u8 non_intra_quantiser_matrix[64];
+ __u8 chroma_intra_quantiser_matrix[64];
+ __u8 chroma_non_intra_quantiser_matrix[64];
+};
+
#define V4L2_CID_COLORIMETRY_CLASS_BASE (V4L2_CTRL_CLASS_COLORIMETRY | 0x900)
#define V4L2_CID_COLORIMETRY_CLASS (V4L2_CTRL_CLASS_COLORIMETRY | 1)

diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index d3bb18a3a51b..9260791b8438 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1747,6 +1747,9 @@ struct v4l2_ext_control {
struct v4l2_ctrl_h264_decode_params __user *p_h264_decode_params;
struct v4l2_ctrl_fwht_params __user *p_fwht_params;
struct v4l2_ctrl_vp8_frame __user *p_vp8_frame;
+ struct v4l2_ctrl_mpeg2_sequence __user *p_mpeg2_sequence;
+ struct v4l2_ctrl_mpeg2_picture __user *p_mpeg2_picture;
+ struct v4l2_ctrl_mpeg2_quantisation __user *p_mpeg2_quantisation;
void __user *ptr;
};
} __attribute__ ((packed));
--
2.30.0

2021-04-26 03:39:58

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 06/10] media: hantro/cedrus: Remove unneeded slice size and slice offset

The MPEG2_SLICE_PARAMS control is designed to refer to a
single slice. However, the Hantro and Cedrus drivers operate
in per-frame mode, and so does the current Ffmpeg and GStreamer
implementations that are tested with these two drivers.

In other words, the drivers are expecting all the slices in a picture
(with either frame or field structure) to be contained in
the OUTPUT buffer, which means the slice size and offset shouldn't be used.

Signed-off-by: Ezequiel Garcia <[email protected]>
---
drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c | 4 ++--
drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 4 ++--
drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c | 7 +++----
3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
index d35071e88116..c4040fba7c80 100644
--- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
@@ -203,7 +203,7 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
G1_REG_TOPFIELDFIRST_E(pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST);
vdpu_write_relaxed(vpu, reg, G1_SWREG(4));

- reg = G1_REG_STRM_START_BIT(slice_params->data_bit_offset) |
+ reg = G1_REG_STRM_START_BIT(0) |
G1_REG_QSCALE_TYPE(pic->flags & V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE) |
G1_REG_CON_MV_E(pic->flags & V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV) |
G1_REG_INTRA_DC_PREC(pic->intra_dc_precision) |
@@ -212,7 +212,7 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
vdpu_write_relaxed(vpu, reg, G1_SWREG(5));

reg = G1_REG_INIT_QP(1) |
- G1_REG_STREAM_LEN(slice_params->bit_size >> 3);
+ G1_REG_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0));
vdpu_write_relaxed(vpu, reg, G1_SWREG(6));

reg = G1_REG_ALT_SCAN_FLAG_E(pic->flags & V4L2_MPEG2_PIC_FLAG_ALT_SCAN) |
diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
index 18bd14704ebf..314269811244 100644
--- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
@@ -177,7 +177,7 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
vdpu_write_relaxed(vpu, reg, VDPU_SWREG(50));

reg = VDPU_REG_INIT_QP(1) |
- VDPU_REG_STREAM_LEN(slice_params->bit_size >> 3);
+ VDPU_REG_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0));
vdpu_write_relaxed(vpu, reg, VDPU_SWREG(51));

reg = VDPU_REG_APF_THRESHOLD(8) |
@@ -220,7 +220,7 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
VDPU_REG_TOPFIELDFIRST_E(pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST);
vdpu_write_relaxed(vpu, reg, VDPU_SWREG(120));

- reg = VDPU_REG_STRM_START_BIT(slice_params->data_bit_offset) |
+ reg = VDPU_REG_STRM_START_BIT(0) |
VDPU_REG_QSCALE_TYPE(pic->flags & V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE) |
VDPU_REG_CON_MV_E(pic->flags & V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV) |
VDPU_REG_INTRA_DC_PREC(pic->intra_dc_precision) |
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
index 16e99792cf42..fd71cb175318 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
@@ -152,10 +152,9 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)

/* Source offset and length in bits. */

- cedrus_write(dev, VE_DEC_MPEG_VLD_OFFSET,
- slice_params->data_bit_offset);
+ cedrus_write(dev, VE_DEC_MPEG_VLD_OFFSET, 0);

- reg = slice_params->bit_size - slice_params->data_bit_offset;
+ reg = vb2_get_plane_payload(&run->src->vb2_buf, 0) * 8;
cedrus_write(dev, VE_DEC_MPEG_VLD_LEN, reg);

/* Source beginning and end addresses. */
@@ -169,7 +168,7 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)

cedrus_write(dev, VE_DEC_MPEG_VLD_ADDR, reg);

- reg = src_buf_addr + DIV_ROUND_UP(slice_params->bit_size, 8);
+ reg = src_buf_addr + vb2_get_plane_payload(&run->src->vb2_buf, 0);
cedrus_write(dev, VE_DEC_MPEG_VLD_END_ADDR, reg);

/* Macroblock address: start at the beginning. */
--
2.30.0

2021-04-26 03:40:21

by Ezequiel Garcia

[permalink] [raw]
Subject: [PATCH v6 07/10] media: uapi: mpeg2: Remove V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS

The Hantro and Cedrus drivers work in frame-mode,
meaning they expect all the slices in a picture (either frame
or field structure) to be passed in each OUTPUT buffer.

These two are the only V4L2 MPEG-2 stateless decoders currently
supported. Given the VA-API drivers also work per-frame,
coalescing all the MPEG-2 slices in a buffer before the decoding
operation, it makes sense to not expect slice-mode drivers and
therefore remove V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS.

This is done to avoid carrying an unused interface. If needed,
this control can be added without breaking backwards compatibility.
Note that this would mean introducing a enumerator control to
specify the decoding mode (see V4L2_CID_STATELESS_H264_DECODE_MODE).

Signed-off-by: Ezequiel Garcia <[email protected]>
Co-developed-by: Nicolas Dufresne <[email protected]>
Signed-off-by: Nicolas Dufresne <[email protected]>
---
.../media/v4l/ext-ctrls-codec.rst | 35 -------------------
.../media/v4l/pixfmt-compressed.rst | 6 ++--
.../media/v4l/vidioc-queryctrl.rst | 6 ----
.../media/videodev2.h.rst.exceptions | 1 -
drivers/media/v4l2-core/v4l2-ctrls.c | 19 ----------
drivers/staging/media/hantro/hantro_drv.c | 5 ---
.../media/hantro/hantro_g1_mpeg2_dec.c | 9 ++---
.../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 8 ++---
drivers/staging/media/sunxi/cedrus/cedrus.c | 6 ----
drivers/staging/media/sunxi/cedrus/cedrus.h | 1 -
.../staging/media/sunxi/cedrus/cedrus_dec.c | 2 --
.../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 2 --
include/media/mpeg2-ctrls.h | 16 ---------
include/media/v4l2-ctrls.h | 2 --
14 files changed, 7 insertions(+), 111 deletions(-)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index 6628ead96b8b..af12c869e304 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1608,41 +1608,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -

.. _v4l2-mpeg-mpeg2:

-``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (struct)``
- Specifies the slice parameters (as extracted from the bitstream) for the
- associated MPEG-2 slice data. This includes the necessary parameters for
- configuring a stateless hardware decoding pipeline for MPEG-2.
- The bitstream parameters are defined according to :ref:`mpeg2part2`.
-
- .. note::
-
- This compound control is not yet part of the public kernel API and
- it is expected to change.
-
-.. c:type:: v4l2_ctrl_mpeg2_slice_params
-
-.. tabularcolumns:: |p{5.6cm}|p{4.6cm}|p{7.1cm}|
-
-.. cssclass:: longtable
-
-.. flat-table:: struct v4l2_ctrl_mpeg2_slice_params
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
-
- * - __u32
- - ``bit_size``
- - Size (in bits) of the current slice data.
- * - __u32
- - ``data_bit_offset``
- - Offset (in bits) to the video data in the current slice data.
- * - __u32
- - ``quantiser_scale_code``
- - Code used to determine the quantization scale to use for the IDCT.
- * - __u8
- - ``reserved``
- - Applications and drivers must set this to zero.
-
``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (struct)``
Specifies the sequence parameters (as extracted from the bitstream) for the
associated MPEG-2 slice data. This includes fields matching the syntax
diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
index bbbacbd65d6f..6c10a062adac 100644
--- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
+++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
@@ -114,9 +114,9 @@ Compressed Formats
This format is adapted for stateless video decoders that implement a
MPEG-2 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
Metadata associated with the frame to decode is required to be passed
- through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE``,
- ``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE``, and ``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS``
- controls. Quantisation matrices can optionally be specified through the
+ through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE`` and
+ ``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE`` controls.
+ Quantisation matrices can optionally be specified through the
``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION`` control.
See the :ref:`associated Codec Control IDs <v4l2-mpeg-mpeg2>`.
Exactly one output and one capture buffer must be provided for use with
diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
index afc1505a3a7e..07e54029e1e9 100644
--- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
+++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
@@ -417,12 +417,6 @@ See also the examples in :ref:`control`.
- any
- An unsigned 32-bit valued control ranging from minimum to maximum
inclusive. The step value indicates the increment between values.
- * - ``V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS``
- - n/a
- - n/a
- - n/a
- - A struct :c:type:`v4l2_ctrl_mpeg2_slice_params`, containing MPEG-2
- slice parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``
- n/a
- n/a
diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
index 928fdc419ee3..2217b56c2686 100644
--- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions
+++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions
@@ -136,7 +136,6 @@ replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`v4l2_ctrl_type`
-replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type`
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 59b16f70b093..6a033102d31b 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -979,7 +979,6 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: return "Use LTR Frames";
case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE: return "MPEG-2 Picture Header";
- case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS: return "MPEG-2 Slice Parameters";
case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value";
case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value";
@@ -1507,9 +1506,6 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE:
*type = V4L2_CTRL_TYPE_MPEG2_PICTURE;
break;
- case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
- *type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
- break;
case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION:
*type = V4L2_CTRL_TYPE_MPEG2_QUANTISATION;
break;
@@ -1723,11 +1719,6 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
else
memset(p, 0, ctrl->elem_size);

- /*
- * The cast is needed to get rid of a gcc warning complaining that
- * V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS is not part of the
- * v4l2_ctrl_type enum.
- */
switch ((u32)ctrl->type) {
case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
p_mpeg2_sequence = p;
@@ -1925,7 +1916,6 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
{
struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
- struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
struct v4l2_ctrl_vp8_frame *p_vp8_frame;
struct v4l2_ctrl_fwht_params *p_fwht_params;
struct v4l2_ctrl_h264_sps *p_h264_sps;
@@ -1988,12 +1978,6 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
zero_reserved(*p_mpeg2_picture);
break;

- case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
- p_mpeg2_slice_params = p;
-
- zero_reserved(*p_mpeg2_slice_params);
- break;
-
case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
break;

@@ -2966,9 +2950,6 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
case V4L2_CTRL_TYPE_MPEG2_PICTURE:
elem_size = sizeof(struct v4l2_ctrl_mpeg2_picture);
break;
- case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
- elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
- break;
case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantisation);
break;
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
index 067205fb89f6..f5fa7e0940c4 100644
--- a/drivers/staging/media/hantro/hantro_drv.c
+++ b/drivers/staging/media/hantro/hantro_drv.c
@@ -296,11 +296,6 @@ static const struct hantro_ctrl controls[] = {
.cfg = {
.id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
},
- }, {
- .codec = HANTRO_MPEG2_DECODER,
- .cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS,
- },
}, {
.codec = HANTRO_MPEG2_DECODER,
.cfg = {
diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
index c4040fba7c80..6d89cae7df45 100644
--- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
@@ -93,8 +93,7 @@ hantro_g1_mpeg2_dec_set_buffers(struct hantro_dev *vpu, struct hantro_ctx *ctx,
struct vb2_buffer *src_buf,
struct vb2_buffer *dst_buf,
const struct v4l2_ctrl_mpeg2_sequence *seq,
- const struct v4l2_ctrl_mpeg2_picture *pic,
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params)
+ const struct v4l2_ctrl_mpeg2_picture *pic)
{
dma_addr_t forward_addr = 0, backward_addr = 0;
dma_addr_t current_addr, addr;
@@ -150,7 +149,6 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
{
struct hantro_dev *vpu = ctx->dev;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_ctrl_mpeg2_sequence *seq;
const struct v4l2_ctrl_mpeg2_picture *pic;
u32 reg;
@@ -161,8 +159,6 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
/* Apply request controls if any */
hantro_start_prepare_run(ctx);

- slice_params = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
seq = hantro_get_ctrl(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
pic = hantro_get_ctrl(ctx,
@@ -232,10 +228,9 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
vdpu_write_relaxed(vpu, reg, G1_SWREG(55));

hantro_g1_mpeg2_dec_set_quantisation(vpu, ctx);
-
hantro_g1_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf,
&dst_buf->vb2_buf,
- seq, pic, slice_params);
+ seq, pic);

hantro_end_prepare_run(ctx);

diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
index 314269811244..d16d76760278 100644
--- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
@@ -96,8 +96,7 @@ rk3399_vpu_mpeg2_dec_set_buffers(struct hantro_dev *vpu,
struct vb2_buffer *src_buf,
struct vb2_buffer *dst_buf,
const struct v4l2_ctrl_mpeg2_sequence *seq,
- const struct v4l2_ctrl_mpeg2_picture *pic,
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params)
+ const struct v4l2_ctrl_mpeg2_picture *pic)
{
dma_addr_t forward_addr = 0, backward_addr = 0;
dma_addr_t current_addr, addr;
@@ -153,7 +152,6 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
{
struct hantro_dev *vpu = ctx->dev;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_ctrl_mpeg2_sequence *seq;
const struct v4l2_ctrl_mpeg2_picture *pic;
u32 reg;
@@ -163,8 +161,6 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)

hantro_start_prepare_run(ctx);

- slice_params = hantro_get_ctrl(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
seq = hantro_get_ctrl(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
pic = hantro_get_ctrl(ctx,
@@ -241,7 +237,7 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)

rk3399_vpu_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf,
&dst_buf->vb2_buf,
- seq, pic, slice_params);
+ seq, pic);

/* Kick the watchdog and start decoding */
hantro_end_prepare_run(ctx);
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
index 878752b30c10..4430c8fa2cc7 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
@@ -41,12 +41,6 @@ static const struct cedrus_control cedrus_controls[] = {
},
.codec = CEDRUS_CODEC_MPEG2,
},
- {
- .cfg = {
- .id = V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS,
- },
- .codec = CEDRUS_CODEC_MPEG2,
- },
{
.cfg = {
.id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
index 989873ccb98c..bbcdcd0787cf 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
@@ -70,7 +70,6 @@ struct cedrus_h264_run {
struct cedrus_mpeg2_run {
const struct v4l2_ctrl_mpeg2_sequence *sequence;
const struct v4l2_ctrl_mpeg2_picture *picture;
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
};

diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
index f4cc6aebfac9..e98185c1f5a7 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
@@ -44,8 +44,6 @@ void cedrus_device_run(void *priv)
V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
run.mpeg2.picture = cedrus_find_control_data(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
- run.mpeg2.slice_params = cedrus_find_control_data(ctx,
- V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
run.mpeg2.quantisation = cedrus_find_control_data(ctx,
V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
break;
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
index fd71cb175318..5dad2f296c6d 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
@@ -50,7 +50,6 @@ static void cedrus_mpeg2_irq_disable(struct cedrus_ctx *ctx)

static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
{
- const struct v4l2_ctrl_mpeg2_slice_params *slice_params;
const struct v4l2_ctrl_mpeg2_sequence *seq;
const struct v4l2_ctrl_mpeg2_picture *pic;
const struct v4l2_ctrl_mpeg2_quantisation *quantisation;
@@ -65,7 +64,6 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
unsigned int i;
u32 reg;

- slice_params = run->mpeg2.slice_params;
seq = run->mpeg2.sequence;
pic = run->mpeg2.picture;

diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
index 13178022e30a..388a796cf75d 100644
--- a/include/media/mpeg2-ctrls.h
+++ b/include/media/mpeg2-ctrls.h
@@ -11,13 +11,11 @@
#ifndef _MPEG2_CTRLS_H_
#define _MPEG2_CTRLS_H_

-#define V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (V4L2_CID_CODEC_BASE+250)
#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (V4L2_CID_CODEC_BASE+251)
#define V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (V4L2_CID_CODEC_BASE+252)
#define V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (V4L2_CID_CODEC_BASE+253)

/* enum v4l2_ctrl_type type values */
-#define V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS 0x0130
#define V4L2_CTRL_TYPE_MPEG2_QUANTISATION 0x0131
#define V4L2_CTRL_TYPE_MPEG2_SEQUENCE 0x0132
#define V4L2_CTRL_TYPE_MPEG2_PICTURE 0x0133
@@ -101,20 +99,6 @@ struct v4l2_ctrl_mpeg2_picture {
__u8 reserved;
};

-/**
- * struct v4l2_ctrl_mpeg2_slice_params - MPEG-2 slice header
- *
- * @quantiser_scale_code: quantiser scale integer matching an
- * homonymous syntax element.
- * @reserved: padding field. Should be zeroed by applications.
- */
-struct v4l2_ctrl_mpeg2_slice_params {
- __u32 bit_size;
- __u32 data_bit_offset;
- __u32 quantiser_scale_code;
- __u32 reserved;
-};
-
/**
* struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
*
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index 572ff7eb7be1..215e44172c66 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -42,7 +42,6 @@ struct video_device;
* @p_char: Pointer to a string.
* @p_mpeg2_sequence: Pointer to a MPEG2 sequence structure.
* @p_mpeg2_picture: Pointer to a MPEG2 picture structure.
- * @p_mpeg2_slice_params: Pointer to a MPEG2 slice parameters structure.
* @p_mpeg2_quantisation: Pointer to a MPEG2 quantisation data structure.
* @p_fwht_params: Pointer to a FWHT stateless parameters structure.
* @p_h264_sps: Pointer to a struct v4l2_ctrl_h264_sps.
@@ -70,7 +69,6 @@ union v4l2_ctrl_ptr {
char *p_char;
struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
- struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
struct v4l2_ctrl_fwht_params *p_fwht_params;
struct v4l2_ctrl_h264_sps *p_h264_sps;
--
2.30.0

2021-04-26 19:42:04

by Jernej Skrabec

[permalink] [raw]
Subject: Re: [PATCH v6 00/10] MPEG-2 stateless API cleanup and destaging

Hi!

Dne ponedeljek, 26. april 2021 ob 05:35:12 CEST je Ezequiel Garcia napisal(a):
> Hi everyone,
>
> Here's another round addressing Hans' feedback. More details
> about this can be found in the previous cover letter [1]:
>
> [1] https://lore.kernel.org/linux-media/[email protected]/T/
>
> The documentation looks good, and so does pahole,
> but it's really easy to miss some detail in this series,
> so we'd appreciate if more people could take a look.
>
> v6:
> * Reorder patch "media: controls: Log MPEG-2 stateless control in .std_log"
> to avoid a new compile warning.
> * Remove "reserved" field in mpeg2 sequence control, noted by Hans.
> * Reorder "flags" field in mpeg2 picture control, noted by Hans.
> * Typos and comments fixes, noted by Hans.

Thanks for working on this! I tested everything with Cedrus and FFmpeg and it
works without a problem. So, whole series is:

Tested-by: Jernej Skrabec <[email protected]>
Reviewed-by: Jernej Skrabec <[email protected]>

Best regards,
Jernej


2021-04-26 23:34:42

by Daniel Almeida

[permalink] [raw]
Subject: Re: [PATCH v6 00/10] MPEG-2 stateless API cleanup and destaging

Hi Ezequiel, thanks for all your hard work on this!

On 26/04/2021 00:35, Ezequiel Garcia wrote:
> Hi everyone,
>
> Here's another round addressing Hans' feedback. More details
> about this can be found in the previous cover letter [1]:
>
> [1]
https://lore.kernel.org/linux-media/[email protected]/T/
>
> The documentation looks good, and so does pahole,
> but it's really easy to miss some detail in this series,
> so we'd appreciate if more people could take a look.
>
> v6:
> * Reorder patch "media: controls: Log MPEG-2 stateless control in
.std_log"
> to avoid a new compile warning.
> * Remove "reserved" field in mpeg2 sequence control, noted by Hans.
> * Reorder "flags" field in mpeg2 picture control, noted by Hans.
> * Typos and comments fixes, noted by Hans.
>

I tested this series on rk3399 (rockpi4) + upcoming gstreamer v4l2
stateless mpeg2 decoder and it works just fine.

Tested-by: Daniel Almeida <[email protected]>


-- thanks
-- Daniel

2021-04-29 08:51:19

by Hans Verkuil

[permalink] [raw]
Subject: Re: [PATCH v6 10/10] media: uapi: move MPEG-2 stateless controls out of staging

On 26/04/2021 05:35, Ezequiel Garcia wrote:
> Until now, the MPEG-2 V4L2 API was not exported as a public API,
> and only defined in a private media header (media/mpeg2-ctrls.h).
>
> After reviewing the MPEG-2 specification in detail, and reworking
> the controls so they match the MPEG-2 semantics properly,
> we can consider it ready.
>
> Signed-off-by: Ezequiel Garcia <[email protected]>
> ---
> .../media/v4l/ext-ctrls-codec-stateless.rst | 214 +++++++++++++++++
> .../media/v4l/ext-ctrls-codec.rst | 216 ------------------
> .../media/v4l/pixfmt-compressed.rst | 10 +-
> .../media/v4l/vidioc-g-ext-ctrls.rst | 12 +
> drivers/media/v4l2-core/v4l2-ctrls.c | 12 +-
> drivers/staging/media/hantro/hantro_drv.c | 6 +-
> .../media/hantro/hantro_g1_mpeg2_dec.c | 6 +-
> .../media/hantro/rk3399_vpu_hw_mpeg2_dec.c | 6 +-
> drivers/staging/media/sunxi/cedrus/cedrus.c | 6 +-
> .../staging/media/sunxi/cedrus/cedrus_dec.c | 6 +-
> include/media/mpeg2-ctrls.h | 126 ----------
> include/media/v4l2-ctrls.h | 1 -
> include/uapi/linux/v4l2-controls.h | 112 +++++++++
> include/uapi/linux/videodev2.h | 3 +
> 14 files changed, 367 insertions(+), 369 deletions(-)
> delete mode 100644 include/media/mpeg2-ctrls.h
>
> 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 3fc04daa9ffb..eaaf96f5dde6 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> @@ -1244,3 +1244,217 @@ FWHT Flags
> * - __u8
> - ``padding[3]``
> - Applications and drivers must set this to zero.
> +
> +.. _v4l2-codec-stateless-mpeg2:
> +
> +``V4L2_CID_STATELESS_MPEG2_SEQUENCE (struct)``
> + Specifies the sequence parameters (as extracted from the bitstream) for the
> + associated MPEG-2 slice data. This includes fields matching the syntax
> + elements from the sequence header and sequence extension parts of the
> + bitstream as specified by :ref:`mpeg2part2`.
> +
> +.. c:type:: v4l2_ctrl_mpeg2_sequence
> +
> +.. raw:: latex
> +
> + \small
> +
> +.. cssclass:: longtable
> +
> +.. tabularcolumns:: |p{1.4cm}|p{6.5cm}|p{9.4cm}|
> +
> +.. flat-table:: struct v4l2_ctrl_mpeg2_sequence
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - __u16
> + - ``horizontal_size``
> + - The width of the displayable part of the frame's luminance component.
> + * - __u16
> + - ``vertical_size``
> + - The height of the displayable part of the frame's luminance component.
> + * - __u32
> + - ``vbv_buffer_size``
> + - Used to calculate the required size of the video buffering verifier,
> + defined (in bits) as: 16 * 1024 * vbv_buffer_size.
> + * - __u16
> + - ``profile_and_level_indication``
> + - The current profile and level indication as extracted from the
> + bitstream.
> + * - __u8
> + - ``chroma_format``
> + - The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
> + * - __u8
> + - ``flags``
> + - See :ref:`MPEG-2 Sequence Flags <mpeg2_sequence_flags>`.
> +
> +.. _mpeg2_sequence_flags:
> +
> +``MPEG-2 Sequence Flags``
> +
> +.. cssclass:: longtable
> +
> +.. flat-table::
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - ``V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE``
> + - 0x00000001
> + - Indication that all the frames for the sequence are progressive instead
> + of interlaced.
> +
> +.. raw:: latex
> +
> + \normalsize
> +
> +``V4L2_CID_STATELESS_MPEG2_PICTURE (struct)``
> + Specifies the picture parameters (as extracted from the bitstream) for the
> + associated MPEG-2 slice data. This includes fields matching the syntax
> + elements from the picture header and picture coding extension parts of the
> + bitstream as specified by :ref:`mpeg2part2`.
> +
> +.. c:type:: v4l2_ctrl_mpeg2_picture
> +
> +.. raw:: latex
> +
> + \small
> +
> +.. cssclass:: longtable
> +
> +.. tabularcolumns:: |p{1.0cm}|p{5.6cm}|p{10.7cm}|
> +
> +.. flat-table:: struct v4l2_ctrl_mpeg2_picture
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - __u64
> + - ``backward_ref_ts``
> + - Timestamp of the V4L2 capture buffer to use as backward reference, used
> + with B-coded and P-coded frames. The timestamp refers to the
> + ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
> + :c:func:`v4l2_timeval_to_ns()` function to convert the struct
> + :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
> + * - __u64
> + - ``forward_ref_ts``
> + - Timestamp for the V4L2 capture buffer to use as forward reference, used
> + with B-coded frames. The timestamp refers to the ``timestamp`` field in
> + struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()`
> + function to convert the struct :c:type:`timeval` in struct
> + :c:type:`v4l2_buffer` to a __u64.
> + * - __u32
> + - ``flags``
> + - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
> + * - __u8
> + - ``f_code[2][2]``
> + - Motion vector codes.
> + * - __u8
> + - ``picture_coding_type``
> + - Picture coding type for the frame covered by the current slice
> + (V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
> + V4L2_MPEG2_PICTURE_CODING_TYPE_B).
> + * - __u8
> + - ``picture_structure``
> + - Picture structure (1: interlaced top field, 2: interlaced bottom field,
> + 3: progressive frame).
> + * - __u8
> + - ``intra_dc_precision``
> + - Precision of Discrete Cosine transform (0: 8 bits precision,
> + 1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
> + * - __u8
> + - ``reserved``
> + - Applications and drivers must set this to zero.
> +
> +.. _mpeg2_picture_flags:
> +
> +``MPEG-2 Picture Flags``
> +
> +.. cssclass:: longtable
> +
> +.. flat-table::
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - ``V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST``
> + - 0x00000001
> + - If set and it's an interlaced stream, top field is output first.
> + * - ``V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT``
> + - 0x00000002
> + - If set only frame-DCT and frame prediction are used.
> + * - ``V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV``
> + - 0x00000004
> + - If set motion vectors are coded for intra macroblocks.
> + * - ``V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE``
> + - 0x00000008
> + - This flag affects the inverse quantization process.
> + * - ``V4L2_MPEG2_PIC_FLAG_INTRA_VLC``
> + - 0x00000010
> + - This flag affects the decoding of transform coefficient data.
> + * - ``V4L2_MPEG2_PIC_FLAG_ALT_SCAN``
> + - 0x00000020
> + - This flag affects the decoding of transform coefficient data.
> + * - ``V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST``
> + - 0x00000040
> + - This flag affects the decoding process of progressive frames.
> + * - ``V4L2_MPEG2_PIC_FLAG_PROGRESSIVE``
> + - 0x00000080
> + - Indicates whether the current frame is progressive.
> +
> +.. raw:: latex
> +
> + \normalsize
> +
> +``V4L2_CID_STATELESS_MPEG2_QUANTISATION (struct)``
> + Specifies quantisation matrices, in zigzag scanning order, for the
> + associated MPEG-2 slice data. This control is initialized by the kernel
> + to the matrices default values. If a bitstream transmits a user-defined
> + quantisation matrices load, applications are expected to use this control.
> + Applications are also expected to set the control loading the default
> + values, if the quantisation matrices need to be reset, for instance on a
> + sequence header. This process is specified by section 6.3.7.
> + "Quant matrix extension" of the specification.
> +
> +.. c:type:: v4l2_ctrl_mpeg2_quantisation
> +
> +.. tabularcolumns:: |p{0.8cm}|p{8.0cm}|p{8.5cm}|
> +
> +.. cssclass:: longtable
> +
> +.. raw:: latex
> +
> + \small
> +
> +.. flat-table:: struct v4l2_ctrl_mpeg2_quantisation
> + :header-rows: 0
> + :stub-columns: 0
> + :widths: 1 1 2
> +
> + * - __u8
> + - ``intra_quantiser_matrix[64]``
> + - The quantisation matrix coefficients for intra-coded frames, in zigzag
> + scanning order. It is relevant for both luma and chroma components,
> + although it can be superseded by the chroma-specific matrix for
> + non-4:2:0 YUV formats.
> + * - __u8
> + - ``non_intra_quantiser_matrix[64]``
> + - The quantisation matrix coefficients for non-intra-coded frames, in
> + zigzag scanning order. It is relevant for both luma and chroma
> + components, although it can be superseded by the chroma-specific matrix
> + for non-4:2:0 YUV formats.
> + * - __u8
> + - ``chroma_intra_quantiser_matrix[64]``
> + - The quantisation matrix coefficients for the chominance component of
> + intra-coded frames, in zigzag scanning order. Only relevant for
> + non-4:2:0 YUV formats.
> + * - __u8
> + - ``chroma_non_intra_quantiser_matrix[64]``
> + - The quantisation matrix coefficients for the chrominance component of
> + non-intra-coded frames, in zigzag scanning order. Only relevant for
> + non-4:2:0 YUV formats.
> +
> +.. raw:: latex
> +
> + \normalsize
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> index af12c869e304..a580ea953c4e 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> @@ -1606,222 +1606,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
> ``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR (integer)``
> Indicates bit rate (bps) for hierarchical coding layer 6 for H264 encoder.
>
> -.. _v4l2-mpeg-mpeg2:
> -
> -``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (struct)``
> - Specifies the sequence parameters (as extracted from the bitstream) for the
> - associated MPEG-2 slice data. This includes fields matching the syntax
> - elements from the sequence header and sequence extension parts of the
> - bitstream as specified by :ref:`mpeg2part2`.
> -
> - .. note::
> -
> - This compound control is not yet part of the public kernel API and
> - it is expected to change.
> -
> -.. c:type:: v4l2_ctrl_mpeg2_sequence
> -
> -.. cssclass:: longtable
> -
> -.. tabularcolumns:: |p{1.4cm}|p{6.5cm}|p{9.4cm}|
> -
> -.. flat-table:: struct v4l2_ctrl_mpeg2_sequence
> - :header-rows: 0
> - :stub-columns: 0
> - :widths: 1 1 2
> -
> - * - __u16
> - - ``horizontal_size``
> - - The width of the displayable part of the frame's luminance component.
> - * - __u16
> - - ``vertical_size``
> - - The height of the displayable part of the frame's luminance component.
> - * - __u32
> - - ``vbv_buffer_size``
> - - Used to calculate the required size of the video buffering verifier,
> - defined (in bits) as: 16 * 1024 * vbv_buffer_size.
> - * - __u16
> - - ``profile_and_level_indication``
> - - The current profile and level indication as extracted from the
> - bitstream.
> - * - __u8
> - - ``chroma_format``
> - - The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
> - * - __u8
> - - ``flags``
> - - See :ref:`MPEG-2 Sequence Flags <mpeg2_sequence_flags>`.
> -
> -.. _mpeg2_sequence_flags:
> -
> -``MPEG-2 Sequence Flags``
> -
> -.. cssclass:: longtable
> -
> -.. flat-table::
> - :header-rows: 0
> - :stub-columns: 0
> - :widths: 1 1 2
> -
> - * - ``V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE``
> - - 0x00000001
> - - Indication that all the frames for the sequence are progressive instead
> - of interlaced.
> -
> -``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (struct)``
> - Specifies the picture parameters (as extracted from the bitstream) for the
> - associated MPEG-2 slice data. This includes fields matching the syntax
> - elements from the picture header and picture coding extension parts of the
> - bitstream as specified by :ref:`mpeg2part2`.
> -
> - .. note::
> -
> - This compound control is not yet part of the public kernel API and
> - it is expected to change.
> -
> -.. c:type:: v4l2_ctrl_mpeg2_picture
> -
> -.. raw:: latex
> -
> - \small
> -
> -.. cssclass:: longtable
> -
> -.. tabularcolumns:: |p{1.0cm}|p{5.6cm}|p{10.7cm}|
> -
> -.. flat-table:: struct v4l2_ctrl_mpeg2_picture
> - :header-rows: 0
> - :stub-columns: 0
> - :widths: 1 1 2
> -
> - * - __u64
> - - ``backward_ref_ts``
> - - Timestamp of the V4L2 capture buffer to use as backward reference, used
> - with B-coded and P-coded frames. The timestamp refers to the
> - ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
> - :c:func:`v4l2_timeval_to_ns()` function to convert the struct
> - :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
> - * - __u64
> - - ``forward_ref_ts``
> - - Timestamp for the V4L2 capture buffer to use as forward reference, used
> - with B-coded frames. The timestamp refers to the ``timestamp`` field in
> - struct :c:type:`v4l2_buffer`. Use the :c:func:`v4l2_timeval_to_ns()`
> - function to convert the struct :c:type:`timeval` in struct
> - :c:type:`v4l2_buffer` to a __u64.
> - * - __u32
> - - ``flags``
> - - See :ref:`MPEG-2 Picture Flags <mpeg2_picture_flags>`.
> - * - __u8
> - - ``f_code[2][2]``
> - - Motion vector codes.
> - * - __u8
> - - ``picture_coding_type``
> - - Picture coding type for the frame covered by the current slice
> - (V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
> - V4L2_MPEG2_PICTURE_CODING_TYPE_B).
> - * - __u8
> - - ``picture_structure``
> - - Picture structure (1: interlaced top field, 2: interlaced bottom field,
> - 3: progressive frame).
> - * - __u8
> - - ``intra_dc_precision``
> - - Precision of Discrete Cosine transform (0: 8 bits precision,
> - 1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
> - * - __u8
> - - ``reserved``
> - - Applications and drivers must set this to zero.
> -
> -
> -.. _mpeg2_picture_flags:
> -
> -``MPEG-2 Picture Flags``
> -
> -.. cssclass:: longtable
> -
> -.. flat-table::
> - :header-rows: 0
> - :stub-columns: 0
> - :widths: 1 1 2
> -
> - * - ``V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST``
> - - 0x00000001
> - - If set and it's an interlaced stream, top field is output first.
> - * - ``V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT``
> - - 0x00000002
> - - If set only frame-DCT and frame prediction are used.
> - * - ``V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV``
> - - 0x00000004
> - - If set motion vectors are coded for intra macroblocks.
> - * - ``V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE``
> - - 0x00000008
> - - This flag affects the inverse quantization process.
> - * - ``V4L2_MPEG2_PIC_FLAG_INTRA_VLC``
> - - 0x00000010
> - - This flag affects the decoding of transform coefficient data.
> - * - ``V4L2_MPEG2_PIC_FLAG_ALT_SCAN``
> - - 0x00000020
> - - This flag affects the decoding of transform coefficient data.
> - * - ``V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST``
> - - 0x00000040
> - - This flag affects the decoding process of progressive frames.
> - * - ``V4L2_MPEG2_PIC_FLAG_PROGRESSIVE``
> - - 0x00000080
> - - Indicates whether the current frame is progressive.
> -
> -.. raw:: latex
> -
> - \normalsize
> -
> -``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (struct)``
> - Specifies quantisation matrices (as extracted from the bitstream) for the
> - associated MPEG-2 slice data.
> -
> - .. note::
> -
> - This compound control is not yet part of the public kernel API and
> - it is expected to change.
> -
> -.. c:type:: v4l2_ctrl_mpeg2_quantisation
> -
> -.. tabularcolumns:: |p{0.8cm}|p{8.0cm}|p{8.5cm}|
> -
> -.. cssclass:: longtable
> -
> -.. raw:: latex
> -
> - \small
> -
> -.. flat-table:: struct v4l2_ctrl_mpeg2_quantisation
> - :header-rows: 0
> - :stub-columns: 0
> - :widths: 1 1 2
> -
> - * - __u8
> - - ``intra_quantiser_matrix[64]``
> - - The quantisation matrix coefficients for intra-coded frames, in zigzag
> - scanning order. It is relevant for both luma and chroma components,
> - although it can be superseded by the chroma-specific matrix for
> - non-4:2:0 YUV formats.
> - * - __u8
> - - ``non_intra_quantiser_matrix[64]``
> - - The quantisation matrix coefficients for non-intra-coded frames, in
> - zigzag scanning order. It is relevant for both luma and chroma
> - components, although it can be superseded by the chroma-specific matrix
> - for non-4:2:0 YUV formats.
> - * - __u8
> - - ``chroma_intra_quantiser_matrix[64]``
> - - The quantisation matrix coefficients for the chominance component of
> - intra-coded frames, in zigzag scanning order. Only relevant for
> - non-4:2:0 YUV formats.
> - * - __u8
> - - ``chroma_non_intra_quantiser_matrix[64]``
> - - The quantisation matrix coefficients for the chrominance component of
> - non-intra-coded frames, in zigzag scanning order. Only relevant for
> - non-4:2:0 YUV formats.
> -
> -.. raw:: latex
> -
> - \normalsize
> -
> ``V4L2_CID_FWHT_I_FRAME_QP (integer)``
> Quantization parameter for an I frame for FWHT. Valid range: from 1
> to 31.
> diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
> index 6c10a062adac..0ede39907ee2 100644
> --- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
> +++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
> @@ -112,13 +112,13 @@ Compressed Formats
> - 'MG2S'
> - MPEG-2 parsed slice data, as extracted from the MPEG-2 bitstream.
> This format is adapted for stateless video decoders that implement a
> - MPEG-2 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
> + MPEG-2 pipeline with the :ref:`stateless_decoder`.
> Metadata associated with the frame to decode is required to be passed
> - through the ``V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE`` and
> - ``V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE`` controls.
> + through the ``V4L2_CID_STATELESS_MPEG2_SEQUENCE`` and
> + ``V4L2_CID_STATELESS_MPEG2_PICTURE`` controls.
> Quantisation matrices can optionally be specified through the
> - ``V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION`` control.
> - See the :ref:`associated Codec Control IDs <v4l2-mpeg-mpeg2>`.
> + ``V4L2_CID_STATELESS_MPEG2_QUANTISATION`` control.
> + See the :ref:`associated Codec Control IDs <v4l2-codec-stateless-mpeg2>`.
> Exactly one output and one capture buffer must be provided for use with
> this pixel format. The output buffer must contain the appropriate number
> of macroblocks to decode a full corresponding frame to the matching
> 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 3ba22983d21f..2d6bc8d94380 100644
> --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
> +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst
> @@ -221,6 +221,18 @@ still cause this situation.
> - ``p_vp8_frame``
> - A pointer to a struct :c:type:`v4l2_ctrl_vp8_frame`. Valid if this control is
> of type ``V4L2_CTRL_TYPE_VP8_FRAME``.
> + * - struct :c:type:`v4l2_ctrl_mpeg2_sequence` *
> + - ``p_mpeg2_sequence``
> + - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_sequence`. Valid if this control is
> + of type ``V4L2_CTRL_TYPE_MPEG2_SEQUENCE``.
> + * - struct :c:type:`v4l2_ctrl_mpeg2_picture` *
> + - ``p_mpeg2_picture``
> + - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_picture`. Valid if this control is
> + of type ``V4L2_CTRL_TYPE_MPEG2_PICTURE``.
> + * - struct :c:type:`v4l2_ctrl_mpeg2_quantisation` *
> + - ``p_mpeg2_quantisation``
> + - A pointer to a struct :c:type:`v4l2_ctrl_mpeg2_quantisation`. Valid if this control is
> + of type ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION``.
> * - 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.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index a693ff8dc3dc..d4e2c7318ee6 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -977,9 +977,6 @@ const char *v4l2_ctrl_get_name(u32 id)
> case V4L2_CID_MPEG_VIDEO_LTR_COUNT: return "LTR Count";
> case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: return "Frame LTR Index";
> case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: return "Use LTR Frames";
> - case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
> - case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE: return "MPEG-2 Picture Header";
> - case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
> case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value";
> case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value";
>
> @@ -1228,6 +1225,9 @@ const char *v4l2_ctrl_get_name(u32 id)
> case V4L2_CID_STATELESS_H264_DECODE_PARAMS: return "H264 Decode Parameters";
> case V4L2_CID_STATELESS_FWHT_PARAMS: return "FWHT Stateless Parameters";
> case V4L2_CID_STATELESS_VP8_FRAME: return "VP8 Frame Parameters";
> + case V4L2_CID_STATELESS_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
> + case V4L2_CID_STATELESS_MPEG2_PICTURE: return "MPEG-2 Picture Header";
> + case V4L2_CID_STATELESS_MPEG2_QUANTISATION: return "MPEG-2 Quantisation Matrices";
>
> /* Colorimetry controls */
> /* Keep the order of the 'case's the same as in v4l2-controls.h! */
> @@ -1500,13 +1500,13 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
> case V4L2_CID_RDS_TX_ALT_FREQS:
> *type = V4L2_CTRL_TYPE_U32;
> break;
> - case V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE:
> + case V4L2_CID_STATELESS_MPEG2_SEQUENCE:
> *type = V4L2_CTRL_TYPE_MPEG2_SEQUENCE;
> break;
> - case V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE:
> + case V4L2_CID_STATELESS_MPEG2_PICTURE:
> *type = V4L2_CTRL_TYPE_MPEG2_PICTURE;
> break;
> - case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION:
> + case V4L2_CID_STATELESS_MPEG2_QUANTISATION:
> *type = V4L2_CTRL_TYPE_MPEG2_QUANTISATION;
> break;
> case V4L2_CID_STATELESS_FWHT_PARAMS:
> diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
> index f5fa7e0940c4..b48552bddb3a 100644
> --- a/drivers/staging/media/hantro/hantro_drv.c
> +++ b/drivers/staging/media/hantro/hantro_drv.c
> @@ -289,17 +289,17 @@ static const struct hantro_ctrl controls[] = {
> }, {
> .codec = HANTRO_MPEG2_DECODER,
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
> + .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE,
> },
> }, {
> .codec = HANTRO_MPEG2_DECODER,
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
> + .id = V4L2_CID_STATELESS_MPEG2_PICTURE,
> },
> }, {
> .codec = HANTRO_MPEG2_DECODER,
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
> + .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION,
> },
> }, {
> .codec = HANTRO_VP8_DECODER,
> diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
> index 6d89cae7df45..f565e37e397a 100644
> --- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
> +++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c
> @@ -83,7 +83,7 @@ hantro_g1_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
> {
> struct v4l2_ctrl_mpeg2_quantisation *q;
>
> - q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
> + q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION);
> hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
> vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, G1_REG_QTABLE_BASE);
> }
> @@ -160,9 +160,9 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx)
> hantro_start_prepare_run(ctx);
>
> seq = hantro_get_ctrl(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
> + V4L2_CID_STATELESS_MPEG2_SEQUENCE);
> pic = hantro_get_ctrl(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
> + V4L2_CID_STATELESS_MPEG2_PICTURE);
>
> reg = G1_REG_DEC_AXI_RD_ID(0) |
> G1_REG_DEC_TIMEOUT_E(1) |
> diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
> index d16d76760278..2527dce7eb18 100644
> --- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
> +++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c
> @@ -85,7 +85,7 @@ rk3399_vpu_mpeg2_dec_set_quantisation(struct hantro_dev *vpu,
> {
> struct v4l2_ctrl_mpeg2_quantisation *q;
>
> - q = hantro_get_ctrl(ctx, V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
> + q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION);
> hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q);
> vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, VDPU_REG_QTABLE_BASE);
> }
> @@ -162,9 +162,9 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx)
> hantro_start_prepare_run(ctx);
>
> seq = hantro_get_ctrl(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
> + V4L2_CID_STATELESS_MPEG2_SEQUENCE);
> pic = hantro_get_ctrl(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
> + V4L2_CID_STATELESS_MPEG2_PICTURE);
>
> reg = VDPU_REG_DEC_ADV_PRE_DIS(0) |
> VDPU_REG_DEC_SCMD_DIS(0) |
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
> index 4430c8fa2cc7..fa348c09f844 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> @@ -31,19 +31,19 @@
> static const struct cedrus_control cedrus_controls[] = {
> {
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE,
> + .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE,
> },
> .codec = CEDRUS_CODEC_MPEG2,
> },
> {
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE,
> + .id = V4L2_CID_STATELESS_MPEG2_PICTURE,
> },
> .codec = CEDRUS_CODEC_MPEG2,
> },
> {
> .cfg = {
> - .id = V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION,
> + .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION,
> },
> .codec = CEDRUS_CODEC_MPEG2,
> },
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> index e98185c1f5a7..97e410d92506 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> @@ -41,11 +41,11 @@ void cedrus_device_run(void *priv)
> switch (ctx->src_fmt.pixelformat) {
> case V4L2_PIX_FMT_MPEG2_SLICE:
> run.mpeg2.sequence = cedrus_find_control_data(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE);
> + V4L2_CID_STATELESS_MPEG2_SEQUENCE);
> run.mpeg2.picture = cedrus_find_control_data(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE);
> + V4L2_CID_STATELESS_MPEG2_PICTURE);
> run.mpeg2.quantisation = cedrus_find_control_data(ctx,
> - V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION);
> + V4L2_CID_STATELESS_MPEG2_QUANTISATION);
> break;
>
> case V4L2_PIX_FMT_H264_SLICE:
> diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h
> deleted file mode 100644
> index c4cf1af5b73b..000000000000
> --- a/include/media/mpeg2-ctrls.h
> +++ /dev/null
> @@ -1,126 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * These are the MPEG2 state controls for use with stateless MPEG-2
> - * codec drivers.
> - *
> - * It turns out that these structs are not stable yet and will undergo
> - * more changes. So keep them private until they are stable and ready to
> - * become part of the official public API.
> - */
> -
> -#ifndef _MPEG2_CTRLS_H_
> -#define _MPEG2_CTRLS_H_
> -
> -#define V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION (V4L2_CID_CODEC_BASE+251)
> -#define V4L2_CID_MPEG_VIDEO_MPEG2_SEQUENCE (V4L2_CID_CODEC_BASE+252)
> -#define V4L2_CID_MPEG_VIDEO_MPEG2_PICTURE (V4L2_CID_CODEC_BASE+253)
> -
> -/* enum v4l2_ctrl_type type values */
> -#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001
> -
> -/**
> - * struct v4l2_ctrl_mpeg2_sequence - MPEG-2 sequence header
> - *
> - * All the members on this structure match the sequence header and sequence
> - * extension syntaxes as specified by the MPEG-2 specification.
> - *
> - * Fields horizontal_size, vertical_size and vbv_buffer_size are a
> - * combination of respective _value and extension syntax elements,
> - * as described in section 6.3.3 "Sequence header".
> - *
> - * @horizontal_size: combination of elements horizontal_size_value and
> - * horizontal_size_extension.
> - * @vertical_size: combination of elements vertical_size_value and
> - * vertical_size_extension.
> - * @vbv_buffer_size: combination of elements vbv_buffer_size_value and
> - * vbv_buffer_size_extension.
> - * @profile_and_level_indication: see MPEG-2 specification.
> - * @chroma_format: see MPEG-2 specification.
> - * @flags: see V4L2_MPEG2_SEQ_FLAG_{}.
> - */
> -struct v4l2_ctrl_mpeg2_sequence {
> - __u16 horizontal_size;
> - __u16 vertical_size;
> - __u32 vbv_buffer_size;
> - __u16 profile_and_level_indication;
> - __u8 chroma_format;
> - __u8 flags;
> -};
> -
> -#define V4L2_MPEG2_PIC_CODING_TYPE_I 1
> -#define V4L2_MPEG2_PIC_CODING_TYPE_P 2
> -#define V4L2_MPEG2_PIC_CODING_TYPE_B 3
> -#define V4L2_MPEG2_PIC_CODING_TYPE_D 4
> -
> -#define V4L2_MPEG2_PIC_TOP_FIELD 0x1
> -#define V4L2_MPEG2_PIC_BOTTOM_FIELD 0x2
> -#define V4L2_MPEG2_PIC_FRAME 0x3
> -
> -#define V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST 0x0001
> -#define V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT 0x0002
> -#define V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV 0x0004
> -#define V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE 0x0008
> -#define V4L2_MPEG2_PIC_FLAG_INTRA_VLC 0x0010
> -#define V4L2_MPEG2_PIC_FLAG_ALT_SCAN 0x0020
> -#define V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST 0x0040
> -#define V4L2_MPEG2_PIC_FLAG_PROGRESSIVE 0x0080
> -
> -/**
> - * struct v4l2_ctrl_mpeg2_picture - MPEG-2 picture header
> - *
> - * All the members on this structure match the picture header and picture
> - * coding extension syntaxes as specified by the MPEG-2 specification.
> - *
> - * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as
> - * reference for backward prediction.
> - * @forward_ref_ts: timestamp of the V4L2 capture buffer to use as
> - * reference for forward prediction. These timestamp refers to the
> - * timestamp field in struct v4l2_buffer. Use v4l2_timeval_to_ns()
> - * to convert the struct timeval to a __u64.
> - * @flags: see V4L2_MPEG2_PIC_FLAG_{}.
> - * @f_code[2][2]: see MPEG-2 specification.
> - * @picture_coding_type: see MPEG-2 specification.
> - * @picture_structure: see V4L2_MPEG2_PIC_{}_FIELD.
> - * @intra_dc_precision: see MPEG-2 specification.
> - * @reserved: padding field. Should be zeroed by applications.
> - */
> -struct v4l2_ctrl_mpeg2_picture {
> - __u64 backward_ref_ts;
> - __u64 forward_ref_ts;
> - __u32 flags;
> - __u8 f_code[2][2];
> - __u8 picture_coding_type;
> - __u8 picture_structure;
> - __u8 intra_dc_precision;
> - __u8 reserved;
> -};
> -
> -/**
> - * struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
> - *
> - * Quantization matrices as specified by section 6.3.7
> - * "Quant matrix extension".
> - *
> - * @intra_quantiser_matrix: The quantisation matrix coefficients
> - * for intra-coded frames, in zigzag scanning order. It is relevant
> - * for both luma and chroma components, although it can be superseded
> - * by the chroma-specific matrix for non-4:2:0 YUV formats.
> - * @non_intra_quantiser_matrix: The quantisation matrix coefficients
> - * for non-intra-coded frames, in zigzag scanning order. It is relevant
> - * for both luma and chroma components, although it can be superseded
> - * by the chroma-specific matrix for non-4:2:0 YUV formats.
> - * @chroma_intra_quantiser_matrix: The quantisation matrix coefficients
> - * for the chominance component of intra-coded frames, in zigzag scanning
> - * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
> - * @chroma_non_intra_quantiser_matrix: The quantisation matrix coefficients
> - * for the chrominance component of non-intra-coded frames, in zigzag scanning
> - * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
> - */
> -struct v4l2_ctrl_mpeg2_quantisation {
> - __u8 intra_quantiser_matrix[64];
> - __u8 non_intra_quantiser_matrix[64];
> - __u8 chroma_intra_quantiser_matrix[64];
> - __u8 chroma_non_intra_quantiser_matrix[64];
> -};
> -
> -#endif
> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
> index 215e44172c66..575b59fbac77 100644
> --- a/include/media/v4l2-ctrls.h
> +++ b/include/media/v4l2-ctrls.h
> @@ -17,7 +17,6 @@
> * Include the stateless codec compound control definitions.
> * This will move to the public headers once this API is fully stable.
> */
> -#include <media/mpeg2-ctrls.h>
> #include <media/hevc-ctrls.h>
>
> /* forward references */
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index d43bec5f1afd..7c0cf9121669 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -1862,6 +1862,118 @@ struct v4l2_ctrl_vp8_frame {
> __u64 flags;
> };
>
> +/* Stateless MPEG-2 controls */
> +
> +#define V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE 0x0001

Since the flags field is a single byte, I would recommend that you write this
as 0x01 instead of 0x0001 to reflect that there are just 8 bits available.

> +
> +#define V4L2_CID_STATELESS_MPEG2_SEQUENCE (V4L2_CID_CODEC_STATELESS_BASE+220)
> +/**
> + * struct v4l2_ctrl_mpeg2_sequence - MPEG-2 sequence header
> + *
> + * All the members on this structure match the sequence header and sequence
> + * extension syntaxes as specified by the MPEG-2 specification.
> + *
> + * Fields horizontal_size, vertical_size and vbv_buffer_size are a
> + * combination of respective _value and extension syntax elements,
> + * as described in section 6.3.3 "Sequence header".
> + *
> + * @horizontal_size: combination of elements horizontal_size_value and
> + * horizontal_size_extension.
> + * @vertical_size: combination of elements vertical_size_value and
> + * vertical_size_extension.
> + * @vbv_buffer_size: combination of elements vbv_buffer_size_value and
> + * vbv_buffer_size_extension.
> + * @profile_and_level_indication: see MPEG-2 specification.
> + * @chroma_format: see MPEG-2 specification.
> + * @flags: see V4L2_MPEG2_SEQ_FLAG_{}.
> + */
> +struct v4l2_ctrl_mpeg2_sequence {
> + __u16 horizontal_size;
> + __u16 vertical_size;
> + __u32 vbv_buffer_size;
> + __u16 profile_and_level_indication;
> + __u8 chroma_format;
> + __u8 flags;
> +};
> +
> +#define V4L2_MPEG2_PIC_CODING_TYPE_I 1
> +#define V4L2_MPEG2_PIC_CODING_TYPE_P 2
> +#define V4L2_MPEG2_PIC_CODING_TYPE_B 3
> +#define V4L2_MPEG2_PIC_CODING_TYPE_D 4
> +
> +#define V4L2_MPEG2_PIC_TOP_FIELD 0x1
> +#define V4L2_MPEG2_PIC_BOTTOM_FIELD 0x2
> +#define V4L2_MPEG2_PIC_FRAME 0x3
> +
> +#define V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST 0x0001
> +#define V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT 0x0002
> +#define V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV 0x0004
> +#define V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE 0x0008
> +#define V4L2_MPEG2_PIC_FLAG_INTRA_VLC 0x0010
> +#define V4L2_MPEG2_PIC_FLAG_ALT_SCAN 0x0020
> +#define V4L2_MPEG2_PIC_FLAG_REPEAT_FIRST 0x0040
> +#define V4L2_MPEG2_PIC_FLAG_PROGRESSIVE 0x0080
> +
> +#define V4L2_CID_STATELESS_MPEG2_PICTURE (V4L2_CID_CODEC_STATELESS_BASE+221)
> +/**
> + * struct v4l2_ctrl_mpeg2_picture - MPEG-2 picture header
> + *
> + * All the members on this structure match the picture header and picture
> + * coding extension syntaxes as specified by the MPEG-2 specification.
> + *
> + * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as
> + * reference for backward prediction.
> + * @forward_ref_ts: timestamp of the V4L2 capture buffer to use as
> + * reference for forward prediction. These timestamp refers to the
> + * timestamp field in struct v4l2_buffer. Use v4l2_timeval_to_ns()
> + * to convert the struct timeval to a __u64.
> + * @flags: see V4L2_MPEG2_PIC_FLAG_{}.
> + * @f_code: see MPEG-2 specification.
> + * @picture_coding_type: see MPEG-2 specification.
> + * @picture_structure: see V4L2_MPEG2_PIC_{}_FIELD.
> + * @intra_dc_precision: see MPEG-2 specification.
> + * @reserved: padding field. Should be zeroed by applications.
> + */
> +struct v4l2_ctrl_mpeg2_picture {
> + __u64 backward_ref_ts;
> + __u64 forward_ref_ts;
> + __u32 flags;
> + __u8 f_code[2][2];
> + __u8 picture_coding_type;
> + __u8 picture_structure;
> + __u8 intra_dc_precision;
> + __u8 reserved;

pahole reports that the struct size is different between 32 and 64 bit
x86 architectures. The initial u64 fields will force the total struct size
to be a multiple of 8 bytes on x86_64, so it has to be padded with reserved[5].

While the 32 and 64 arm architectures have the same size, there too
4 bytes padding is applied, which you don't want.

Regards,

Hans

> +};
> +
> +#define V4L2_CID_STATELESS_MPEG2_QUANTISATION (V4L2_CID_CODEC_STATELESS_BASE+222)
> +/**
> + * struct v4l2_ctrl_mpeg2_quantisation - MPEG-2 quantisation
> + *
> + * Quantisation matrices as specified by section 6.3.7
> + * "Quant matrix extension".
> + *
> + * @intra_quantiser_matrix: The quantisation matrix coefficients
> + * for intra-coded frames, in zigzag scanning order. It is relevant
> + * for both luma and chroma components, although it can be superseded
> + * by the chroma-specific matrix for non-4:2:0 YUV formats.
> + * @non_intra_quantiser_matrix: The quantisation matrix coefficients
> + * for non-intra-coded frames, in zigzag scanning order. It is relevant
> + * for both luma and chroma components, although it can be superseded
> + * by the chroma-specific matrix for non-4:2:0 YUV formats.
> + * @chroma_intra_quantiser_matrix: The quantisation matrix coefficients
> + * for the chominance component of intra-coded frames, in zigzag scanning
> + * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
> + * @chroma_non_intra_quantiser_matrix: The quantisation matrix coefficients
> + * for the chrominance component of non-intra-coded frames, in zigzag scanning
> + * order. Only relevant for 4:2:2 and 4:4:4 YUV formats.
> + */
> +struct v4l2_ctrl_mpeg2_quantisation {
> + __u8 intra_quantiser_matrix[64];
> + __u8 non_intra_quantiser_matrix[64];
> + __u8 chroma_intra_quantiser_matrix[64];
> + __u8 chroma_non_intra_quantiser_matrix[64];
> +};
> +
> #define V4L2_CID_COLORIMETRY_CLASS_BASE (V4L2_CTRL_CLASS_COLORIMETRY | 0x900)
> #define V4L2_CID_COLORIMETRY_CLASS (V4L2_CTRL_CLASS_COLORIMETRY | 1)
>
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index d3bb18a3a51b..9260791b8438 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -1747,6 +1747,9 @@ struct v4l2_ext_control {
> struct v4l2_ctrl_h264_decode_params __user *p_h264_decode_params;
> struct v4l2_ctrl_fwht_params __user *p_fwht_params;
> struct v4l2_ctrl_vp8_frame __user *p_vp8_frame;
> + struct v4l2_ctrl_mpeg2_sequence __user *p_mpeg2_sequence;
> + struct v4l2_ctrl_mpeg2_picture __user *p_mpeg2_picture;
> + struct v4l2_ctrl_mpeg2_quantisation __user *p_mpeg2_quantisation;
> void __user *ptr;
> };
> } __attribute__ ((packed));
>