]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: rkvdec: Extract decoded format enumeration into helper
authorJonas Karlman <jonas@kwiboo.se>
Tue, 25 Feb 2025 09:40:28 +0000 (10:40 +0100)
committerHans Verkuil <hverkuil@xs4all.nl>
Tue, 8 Apr 2025 07:21:21 +0000 (07:21 +0000)
Add a rkvdec_is_valid_fmt() helper that check if a fourcc is a supported
CAPTURE format, and a rkvdec_enum_decoded_fmt() helper that enumerates
valid formats.

This moves current code into helper functions in preparation for adding
CAPTURE format filtering and validation in next patch.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Tested-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Tested-by: Christopher Obbard <chris.obbard@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/staging/media/rkvdec/rkvdec.c

index 1f8f98cf91dc205f4a9da2712c81e90b726a6e57..52e64b399dcc4a0c028cac908c0b1ceb49956c5f 100644 (file)
 #include "rkvdec.h"
 #include "rkvdec-regs.h"
 
+static u32 rkvdec_enum_decoded_fmt(struct rkvdec_ctx *ctx, int index)
+{
+       const struct rkvdec_coded_fmt_desc *desc = ctx->coded_fmt_desc;
+
+       if (WARN_ON(!desc))
+               return 0;
+
+       if (index >= desc->num_decoded_fmts)
+               return 0;
+
+       return desc->decoded_fmts[index];
+}
+
+static bool rkvdec_is_valid_fmt(struct rkvdec_ctx *ctx, u32 fourcc)
+{
+       const struct rkvdec_coded_fmt_desc *desc = ctx->coded_fmt_desc;
+       unsigned int i;
+
+       for (i = 0; i < desc->num_decoded_fmts; i++) {
+               if (desc->decoded_fmts[i] == fourcc)
+                       return true;
+       }
+
+       return false;
+}
+
 static void rkvdec_fill_decoded_pixfmt(struct rkvdec_ctx *ctx,
                                       struct v4l2_pix_format_mplane *pix_mp)
 {
@@ -52,8 +78,10 @@ static void rkvdec_reset_fmt(struct rkvdec_ctx *ctx, struct v4l2_format *f,
 static void rkvdec_reset_decoded_fmt(struct rkvdec_ctx *ctx)
 {
        struct v4l2_format *f = &ctx->decoded_fmt;
+       u32 fourcc;
 
-       rkvdec_reset_fmt(ctx, f, ctx->coded_fmt_desc->decoded_fmts[0]);
+       fourcc = rkvdec_enum_decoded_fmt(ctx, 0);
+       rkvdec_reset_fmt(ctx, f, fourcc);
        f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
        f->fmt.pix_mp.width = ctx->coded_fmt.fmt.pix_mp.width;
        f->fmt.pix_mp.height = ctx->coded_fmt.fmt.pix_mp.height;
@@ -244,7 +272,6 @@ static int rkvdec_try_capture_fmt(struct file *file, void *priv,
        struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
        struct rkvdec_ctx *ctx = fh_to_rkvdec_ctx(priv);
        const struct rkvdec_coded_fmt_desc *coded_desc;
-       unsigned int i;
 
        /*
         * The codec context should point to a coded format desc, if the format
@@ -255,13 +282,8 @@ static int rkvdec_try_capture_fmt(struct file *file, void *priv,
        if (WARN_ON(!coded_desc))
                return -EINVAL;
 
-       for (i = 0; i < coded_desc->num_decoded_fmts; i++) {
-               if (coded_desc->decoded_fmts[i] == pix_mp->pixelformat)
-                       break;
-       }
-
-       if (i == coded_desc->num_decoded_fmts)
-               pix_mp->pixelformat = coded_desc->decoded_fmts[0];
+       if (!rkvdec_is_valid_fmt(ctx, pix_mp->pixelformat))
+               pix_mp->pixelformat = rkvdec_enum_decoded_fmt(ctx, 0);
 
        /* Always apply the frmsize constraint of the coded end. */
        pix_mp->width = max(pix_mp->width, ctx->coded_fmt.fmt.pix_mp.width);
@@ -425,14 +447,13 @@ static int rkvdec_enum_capture_fmt(struct file *file, void *priv,
                                   struct v4l2_fmtdesc *f)
 {
        struct rkvdec_ctx *ctx = fh_to_rkvdec_ctx(priv);
+       u32 fourcc;
 
-       if (WARN_ON(!ctx->coded_fmt_desc))
-               return -EINVAL;
-
-       if (f->index >= ctx->coded_fmt_desc->num_decoded_fmts)
+       fourcc = rkvdec_enum_decoded_fmt(ctx, f->index);
+       if (!fourcc)
                return -EINVAL;
 
-       f->pixelformat = ctx->coded_fmt_desc->decoded_fmts[f->index];
+       f->pixelformat = fourcc;
        return 0;
 }