Commit 2c86bf67 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Mauro Carvalho Chehab

media: mtk-vcodec: venc: support ENUM_FRAMESIZES on OUTPUT formats

v4l2-compliance requires ENUM_FRAMESIZES to support OUTPUT formats.
Reuse mtk_venc_find_format() to make sure both queues are considered
when serving an ENUM_FRAMESIZES.

[hverkuil: fixed some checkpatch alignment warnings]
Signed-off-by: default avatarAlexandre Courbot <acourbot@chromium.org>
Acked-by: default avatarTiffany Lin <tiffany.lin@mediatek.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent cd385511
...@@ -123,28 +123,44 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, ...@@ -123,28 +123,44 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f,
return 0; return 0;
} }
static const struct mtk_video_fmt *
mtk_venc_find_format(u32 fourcc, const struct mtk_vcodec_enc_pdata *pdata)
{
const struct mtk_video_fmt *fmt;
unsigned int k;
for (k = 0; k < pdata->num_capture_formats; k++) {
fmt = &pdata->capture_formats[k];
if (fmt->fourcc == fourcc)
return fmt;
}
for (k = 0; k < pdata->num_output_formats; k++) {
fmt = &pdata->output_formats[k];
if (fmt->fourcc == fourcc)
return fmt;
}
return NULL;
}
static int vidioc_enum_framesizes(struct file *file, void *fh, static int vidioc_enum_framesizes(struct file *file, void *fh,
struct v4l2_frmsizeenum *fsize) struct v4l2_frmsizeenum *fsize)
{ {
const struct mtk_vcodec_enc_pdata *pdata = const struct mtk_video_fmt *fmt;
fh_to_ctx(fh)->dev->venc_pdata;
int i = 0;
if (fsize->index != 0) if (fsize->index != 0)
return -EINVAL; return -EINVAL;
for (i = 0; i < pdata->num_capture_formats; ++i) { fmt = mtk_venc_find_format(fsize->pixel_format,
const struct mtk_video_fmt *fmt = &pdata->capture_formats[i]; fh_to_ctx(fh)->dev->venc_pdata);
if (!fmt)
if (fsize->pixel_format != fmt->fourcc) return -EINVAL;
continue;
fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
fsize->stepwise = mtk_venc_framesizes; fsize->stepwise = mtk_venc_framesizes;
return 0;
}
return -EINVAL; return 0;
} }
static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
...@@ -222,27 +238,6 @@ static struct mtk_q_data *mtk_venc_get_q_data(struct mtk_vcodec_ctx *ctx, ...@@ -222,27 +238,6 @@ static struct mtk_q_data *mtk_venc_get_q_data(struct mtk_vcodec_ctx *ctx,
return &ctx->q_data[MTK_Q_DATA_DST]; return &ctx->q_data[MTK_Q_DATA_DST];
} }
static const struct mtk_video_fmt *
mtk_venc_find_format(struct v4l2_format *f, const struct mtk_vcodec_enc_pdata *pdata)
{
const struct mtk_video_fmt *fmt;
unsigned int k;
for (k = 0; k < pdata->num_capture_formats; k++) {
fmt = &pdata->capture_formats[k];
if (fmt->fourcc == f->fmt.pix.pixelformat)
return fmt;
}
for (k = 0; k < pdata->num_output_formats; k++) {
fmt = &pdata->output_formats[k];
if (fmt->fourcc == f->fmt.pix.pixelformat)
return fmt;
}
return NULL;
}
/* V4L2 specification suggests the driver corrects the format struct if any of /* V4L2 specification suggests the driver corrects the format struct if any of
* the dimensions is unsupported * the dimensions is unsupported
*/ */
...@@ -403,7 +398,7 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv, ...@@ -403,7 +398,7 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
} }
fmt = mtk_venc_find_format(f, pdata); fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata);
if (!fmt) { if (!fmt) {
fmt = &ctx->dev->venc_pdata->capture_formats[0]; fmt = &ctx->dev->venc_pdata->capture_formats[0];
f->fmt.pix.pixelformat = fmt->fourcc; f->fmt.pix.pixelformat = fmt->fourcc;
...@@ -467,7 +462,7 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv, ...@@ -467,7 +462,7 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
} }
fmt = mtk_venc_find_format(f, pdata); fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata);
if (!fmt) { if (!fmt) {
fmt = &ctx->dev->venc_pdata->output_formats[0]; fmt = &ctx->dev->venc_pdata->output_formats[0];
f->fmt.pix.pixelformat = fmt->fourcc; f->fmt.pix.pixelformat = fmt->fourcc;
...@@ -550,7 +545,7 @@ static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv, ...@@ -550,7 +545,7 @@ static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv,
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv); struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
const struct mtk_vcodec_enc_pdata *pdata = ctx->dev->venc_pdata; const struct mtk_vcodec_enc_pdata *pdata = ctx->dev->venc_pdata;
fmt = mtk_venc_find_format(f, pdata); fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata);
if (!fmt) { if (!fmt) {
fmt = &ctx->dev->venc_pdata->capture_formats[0]; fmt = &ctx->dev->venc_pdata->capture_formats[0];
f->fmt.pix.pixelformat = fmt->fourcc; f->fmt.pix.pixelformat = fmt->fourcc;
...@@ -570,7 +565,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv, ...@@ -570,7 +565,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv,
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv); struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
const struct mtk_vcodec_enc_pdata *pdata = ctx->dev->venc_pdata; const struct mtk_vcodec_enc_pdata *pdata = ctx->dev->venc_pdata;
fmt = mtk_venc_find_format(f, pdata); fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata);
if (!fmt) { if (!fmt) {
fmt = &ctx->dev->venc_pdata->output_formats[0]; fmt = &ctx->dev->venc_pdata->output_formats[0];
f->fmt.pix.pixelformat = fmt->fourcc; f->fmt.pix.pixelformat = fmt->fourcc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment