]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
media: rkvdec: Use H264_SCALING_MATRIX only when required
authorEzequiel Garcia <ezequiel@collabora.com>
Tue, 25 Aug 2020 03:52:43 +0000 (05:52 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 1 Sep 2020 12:13:29 +0000 (14:13 +0200)
Baseline, Main and Extended profiles are specified to
not support a scaling matrix. Also, High profiles
can optionally specify a scaling matrix, using
SPS and PPS NAL units.

To meet this expectation, applications are required to
set the V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX control
and set the V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT
flag only when a scaling matrix is specified for a picture.

Implement this on rkvdec, which has hardware support for this
case.

Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Tested-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/rkvdec/rkvdec-h264.c
drivers/staging/media/rkvdec/rkvdec.c

index c45cd1617b3b9919e7c5dc3f79e3b2eaef3e0d03..7cc3b478a5f4940419b888d9e9c82bad22f9e1ea 100644 (file)
@@ -708,9 +708,9 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx,
        WRITE_PPS(pps->second_chroma_qp_index_offset,
                  SECOND_CHROMA_QP_INDEX_OFFSET);
 
-       /* always use the matrix sent from userspace */
-       WRITE_PPS(1, SCALING_LIST_ENABLE_FLAG);
-
+       WRITE_PPS(!!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT),
+                 SCALING_LIST_ENABLE_FLAG);
+       /* To be on the safe side, program the scaling matrix address */
        scaling_distance = offsetof(struct rkvdec_h264_priv_tbl, scaling_list);
        scaling_list_address = h264_ctx->priv_tbl.dma + scaling_distance;
        WRITE_PPS(scaling_list_address, SCALING_LIST_ADDRESS);
@@ -792,9 +792,13 @@ static void assemble_hw_scaling_list(struct rkvdec_ctx *ctx,
                                     struct rkvdec_h264_run *run)
 {
        const struct v4l2_ctrl_h264_scaling_matrix *scaling = run->scaling_matrix;
+       const struct v4l2_ctrl_h264_pps *pps = run->pps;
        struct rkvdec_h264_ctx *h264_ctx = ctx->priv;
        struct rkvdec_h264_priv_tbl *tbl = h264_ctx->priv_tbl.cpu;
 
+       if (!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT))
+               return;
+
        BUILD_BUG_ON(sizeof(tbl->scaling_list.scaling_list_4x4) !=
                     sizeof(scaling->scaling_list_4x4));
        BUILD_BUG_ON(sizeof(tbl->scaling_list.scaling_list_8x8) !=
index 9f59dfb62d3f57928b2a9cff9c1367e5ab594f8b..d25c4a37e2affe40b50b4ec8fb5ccc95b88d7e27 100644 (file)
@@ -68,7 +68,6 @@ static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_descs[] = {
                .cfg.id = V4L2_CID_MPEG_VIDEO_H264_PPS,
        },
        {
-               .mandatory = true,
                .cfg.id = V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX,
        },
        {