media: rkvdec: Extract decoded format enumeration into helper

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>
This commit is contained in:
Jonas Karlman
2025-02-25 10:40:28 +01:00
committed by Hans Verkuil
parent 98a0aa1b69
commit e3f9e3a6a0
+35 -14
View File
@@ -27,6 +27,32 @@
#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))
fourcc = rkvdec_enum_decoded_fmt(ctx, f->index);
if (!fourcc)
return -EINVAL;
if (f->index >= ctx->coded_fmt_desc->num_decoded_fmts)
return -EINVAL;
f->pixelformat = ctx->coded_fmt_desc->decoded_fmts[f->index];
f->pixelformat = fourcc;
return 0;
}