lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 050/411] media: coda: limit frame interval enumeration to supported encoder frame sizes
    Date
    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 0adc54832657..fb469340634b 100644
    --- a/drivers/media/platform/coda/coda-common.c
    +++ b/drivers/media/platform/coda/coda-common.c
    @@ -1192,7 +1192,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;
    @@ -1201,12 +1202,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


    \
     
     \ /
      Last update: 2022-06-13 13:06    [W:2.576 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site