diff options
author | Ezequiel Garcia <ezequiel@collabora.com> | 2020-08-25 05:52:43 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2020-09-01 14:13:29 +0200 |
commit | fd902918e3e6c70e771e14e611950f361a78cfc5 (patch) | |
tree | 1d9cd91a6ff0e4d945832466bd4532ae8e30c17b /drivers/staging/media/rkvdec/rkvdec-h264.c | |
parent | media: rkvdec: Drop unneeded per_request driver-specific control flag (diff) | |
download | linux-dev-fd902918e3e6c70e771e14e611950f361a78cfc5.tar.xz linux-dev-fd902918e3e6c70e771e14e611950f361a78cfc5.zip |
media: rkvdec: Use H264_SCALING_MATRIX only when required
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>
Diffstat (limited to 'drivers/staging/media/rkvdec/rkvdec-h264.c')
-rw-r--r-- | drivers/staging/media/rkvdec/rkvdec-h264.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index c45cd1617b3b..7cc3b478a5f4 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -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) != |