On Fri, 2020-08-21 at 19:36 +0900, Alexandre Courbot wrote: > 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. > Acked-by: Tiffany Lin <tiffany.lin@xxxxxxxxxxxx> > Signed-off-by: Alexandre Courbot <acourbot@xxxxxxxxxxxx> > --- > .../platform/mtk-vcodec/mtk_vcodec_enc.c | 71 +++++++++---------- > 1 file changed, 33 insertions(+), 38 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > index f8d4fbe927f9..1b79185cf922 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > @@ -123,28 +123,44 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, > 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, > struct v4l2_frmsizeenum *fsize) > { > - const struct mtk_vcodec_enc_pdata *pdata = > - fh_to_ctx(fh)->dev->venc_pdata; > - int i = 0; > + const struct mtk_video_fmt *fmt; > > if (fsize->index != 0) > return -EINVAL; > > - for (i = 0; i < pdata->num_capture_formats; ++i) { > - const struct mtk_video_fmt *fmt = &pdata->capture_formats[i]; > + fmt = mtk_venc_find_format(fsize->pixel_format, > + fh_to_ctx(fh)->dev->venc_pdata); > + if (!fmt) > + return -EINVAL; > > - if (fsize->pixel_format != fmt->fourcc) > - continue; > + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; > + fsize->stepwise = mtk_venc_framesizes; > > - fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; > - fsize->stepwise = mtk_venc_framesizes; > - return 0; > - } > - > - return -EINVAL; > + return 0; > } > > 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, > 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 > * the dimensions is unsupported > */ > @@ -403,7 +398,7 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv, > return -EINVAL; > } > > - fmt = mtk_venc_find_format(f, pdata); > + fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata); > if (!fmt) { > fmt = &ctx->dev->venc_pdata->capture_formats[0]; > f->fmt.pix.pixelformat = fmt->fourcc; > @@ -467,7 +462,7 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv, > return -EINVAL; > } > > - fmt = mtk_venc_find_format(f, pdata); > + fmt = mtk_venc_find_format(f->fmt.pix.pixelformat, pdata); > if (!fmt) { > fmt = &ctx->dev->venc_pdata->output_formats[0]; > f->fmt.pix.pixelformat = fmt->fourcc; > @@ -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); > 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) { > fmt = &ctx->dev->venc_pdata->capture_formats[0]; > f->fmt.pix.pixelformat = fmt->fourcc; > @@ -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); > 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) { > fmt = &ctx->dev->venc_pdata->output_formats[0]; > f->fmt.pix.pixelformat = fmt->fourcc;