| From 85acb61cd3c7dd1ff8517bf4aa2109812b83f82e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 26 Apr 2022 11:15:55 +0200 |
| Subject: media: coda: limit frame interval enumeration to supported encoder |
| frame sizes |
| |
| From: Philipp Zabel <p.zabel@pengutronix.de> |
| |
| [ Upstream commit 67e33dd957880879e785cfea83a3aa24bd5c5577 ] |
| |
| Let VIDIOC_ENUM_FRAMEINTERVALS return -EINVAL if userspace queries |
| frame intervals for frame sizes unsupported by the encoder. Fixes the |
| following v4l2-compliance failure: |
| |
| fail: v4l2-test-formats.cpp(123): found frame intervals for invalid size 47x16 |
| fail: v4l2-test-formats.cpp(282): node->codec_mask & STATEFUL_ENCODER |
| test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: FAIL |
| |
| [hverkuil: drop incorrect 'For decoder devices, return -ENOTTY.' in the commit log] |
| |
| Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/platform/coda/coda-common.c | 20 ++++++++++++++------ |
| 1 file changed, 14 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c |
| index 2333079a83c7..99f6d22e0c3c 100644 |
| --- a/drivers/media/platform/coda/coda-common.c |
| +++ b/drivers/media/platform/coda/coda-common.c |
| @@ -1318,7 +1318,8 @@ static int coda_enum_frameintervals(struct file *file, void *fh, |
| struct v4l2_frmivalenum *f) |
| { |
| struct coda_ctx *ctx = fh_to_ctx(fh); |
| - int i; |
| + struct coda_q_data *q_data; |
| + const struct coda_codec *codec; |
| |
| if (f->index) |
| return -EINVAL; |
| @@ -1327,12 +1328,19 @@ static int coda_enum_frameintervals(struct file *file, void *fh, |
| if (!ctx->vdoa && f->pixel_format == V4L2_PIX_FMT_YUYV) |
| return -EINVAL; |
| |
| - for (i = 0; i < CODA_MAX_FORMATS; i++) { |
| - if (f->pixel_format == ctx->cvd->src_formats[i] || |
| - f->pixel_format == ctx->cvd->dst_formats[i]) |
| - break; |
| + if (coda_format_normalize_yuv(f->pixel_format) == V4L2_PIX_FMT_YUV420) { |
| + q_data = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| + codec = coda_find_codec(ctx->dev, f->pixel_format, |
| + q_data->fourcc); |
| + } else { |
| + codec = coda_find_codec(ctx->dev, V4L2_PIX_FMT_YUV420, |
| + f->pixel_format); |
| } |
| - if (i == CODA_MAX_FORMATS) |
| + if (!codec) |
| + return -EINVAL; |
| + |
| + if (f->width < MIN_W || f->width > codec->max_w || |
| + f->height < MIN_H || f->height > codec->max_h) |
| return -EINVAL; |
| |
| f->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; |
| -- |
| 2.35.1 |
| |