| From 70b5a28786215c996503210abd3e44c200771640 Mon Sep 17 00:00:00 2001 |
| From: Jernej Skrabec <jernej.skrabec@siol.net> |
| Date: Fri, 13 Dec 2019 17:04:25 +0100 |
| Subject: [PATCH] media: uapi: hevc: Add scaling matrix control |
| |
| Taken from https://patchwork.linuxtv.org/patch/60728/ |
| Changes (mainly documentation) have been requested. |
| |
| HEVC has a scaling matrix concept. Add support for it. |
| |
| Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> |
| --- |
| .../media/uapi/v4l/ext-ctrls-codec.rst | 41 +++++++++++++++++++ |
| .../media/uapi/v4l/pixfmt-compressed.rst | 1 + |
| drivers/media/v4l2-core/v4l2-ctrls.c | 10 +++++ |
| include/media/hevc-ctrls.h | 11 +++++ |
| 4 files changed, 63 insertions(+) |
| |
| --- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst |
| +++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst |
| @@ -4174,6 +4174,47 @@ enum v4l2_mpeg_video_hevc_size_of_length |
| - ``padding[6]`` |
| - Applications and drivers must set this to zero. |
| |
| +``V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (struct)`` |
| + Specifies the scaling matrix (as extracted from the bitstream) for |
| + the associated HEVC slice data. The bitstream parameters are |
| + defined according to :ref:`hevc`, section 7.4.5 "Scaling list |
| + data semantics". For further documentation, refer to the above |
| + specification, unless there is an explicit comment stating |
| + otherwise. |
| + |
| + .. note:: |
| + |
| + This compound control is not yet part of the public kernel API and |
| + it is expected to change. |
| + |
| +.. c:type:: v4l2_ctrl_hevc_scaling_matrix |
| + |
| +.. cssclass:: longtable |
| + |
| +.. flat-table:: struct v4l2_ctrl_hevc_scaling_matrix |
| + :header-rows: 0 |
| + :stub-columns: 0 |
| + :widths: 1 1 2 |
| + |
| + * - __u8 |
| + - ``scaling_list_4x4[6][16]`` |
| + - |
| + * - __u8 |
| + - ``scaling_list_8x8[6][64]`` |
| + - |
| + * - __u8 |
| + - ``scaling_list_16x16[6][64]`` |
| + - |
| + * - __u8 |
| + - ``scaling_list_32x32[2][64]`` |
| + - |
| + * - __u8 |
| + - ``scaling_list_dc_coef_16x16[6]`` |
| + - |
| + * - __u8 |
| + - ``scaling_list_dc_coef_32x32[2]`` |
| + - |
| + |
| ``V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (enum)`` |
| Specifies the decoding mode to use. Currently exposes slice-based and |
| frame-based decoding but new modes might be added later on. |
| --- a/Documentation/media/uapi/v4l/pixfmt-compressed.rst |
| +++ b/Documentation/media/uapi/v4l/pixfmt-compressed.rst |
| @@ -203,6 +203,7 @@ Compressed Formats |
| * ``V4L2_CID_MPEG_VIDEO_HEVC_SPS`` |
| * ``V4L2_CID_MPEG_VIDEO_HEVC_PPS`` |
| * ``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS`` |
| + * ``V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX`` |
| See the :ref:`associated Codec Control IDs <v4l2-mpeg-hevc>`. |
| Buffers associated with this pixel format must contain the appropriate |
| number of macroblocks to decode a full corresponding frame. |
| --- a/drivers/media/v4l2-core/v4l2-ctrls.c |
| +++ b/drivers/media/v4l2-core/v4l2-ctrls.c |
| @@ -974,6 +974,7 @@ const char *v4l2_ctrl_get_name(u32 id) |
| case V4L2_CID_MPEG_VIDEO_HEVC_SPS: return "HEVC Sequence Parameter Set"; |
| case V4L2_CID_MPEG_VIDEO_HEVC_PPS: return "HEVC Picture Parameter Set"; |
| case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: return "HEVC Slice Parameters"; |
| + case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX: return "HEVC Scaling Matrix"; |
| case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE: return "HEVC Decode Mode"; |
| case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE: return "HEVC Start Code"; |
| |
| @@ -1406,6 +1407,9 @@ void v4l2_ctrl_fill(u32 id, const char * |
| case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: |
| *type = V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS; |
| break; |
| + case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX: |
| + *type = V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX; |
| + break; |
| case V4L2_CID_UNIT_CELL_SIZE: |
| *type = V4L2_CTRL_TYPE_AREA; |
| *flags |= V4L2_CTRL_FLAG_READ_ONLY; |
| @@ -1852,6 +1856,9 @@ static int std_validate_compound(const s |
| zero_padding(*p_hevc_slice_params); |
| break; |
| |
| + case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX: |
| + break; |
| + |
| case V4L2_CTRL_TYPE_AREA: |
| area = p; |
| if (!area->width || !area->height) |
| @@ -2549,6 +2556,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(s |
| case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS: |
| elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params); |
| break; |
| + case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX: |
| + elem_size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix); |
| + break; |
| case V4L2_CTRL_TYPE_AREA: |
| elem_size = sizeof(struct v4l2_area); |
| break; |
| --- a/include/media/hevc-ctrls.h |
| +++ b/include/media/hevc-ctrls.h |
| @@ -19,6 +19,7 @@ |
| #define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) |
| #define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) |
| #define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) |
| +#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 1011) |
| #define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_MPEG_BASE + 1015) |
| #define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_MPEG_BASE + 1016) |
| |
| @@ -26,6 +27,7 @@ |
| #define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 |
| #define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 |
| #define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 |
| +#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 |
| |
| enum v4l2_mpeg_video_hevc_decode_mode { |
| V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, |
| @@ -209,4 +211,13 @@ struct v4l2_ctrl_hevc_slice_params { |
| __u64 flags; |
| }; |
| |
| +struct v4l2_ctrl_hevc_scaling_matrix { |
| + __u8 scaling_list_4x4[6][16]; |
| + __u8 scaling_list_8x8[6][64]; |
| + __u8 scaling_list_16x16[6][64]; |
| + __u8 scaling_list_32x32[2][64]; |
| + __u8 scaling_list_dc_coef_16x16[6]; |
| + __u8 scaling_list_dc_coef_32x32[2]; |
| +}; |
| + |
| #endif |