If V4L2_FMT_FLAG_ENUM_ALL_FORMATS flag has been set when calling VIDIOC_ENUM_FMT ignore depth match and returns all the hardware supported pixels formats. In this case all set V4L2_FMT_FLAG_ALL_FORMATS when returning the pixels formats. Signed-off-by: Benjamin Gaignard <benjamin.gaignard@xxxxxxxxxxxxx> --- drivers/media/platform/verisilicon/hantro_v4l2.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c index df6f2536263b..b995ad31cddc 100644 --- a/drivers/media/platform/verisilicon/hantro_v4l2.c +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c @@ -201,7 +201,13 @@ static int vidioc_enum_fmt(struct file *file, void *priv, struct hantro_ctx *ctx = fh_to_ctx(priv); const struct hantro_fmt *fmt, *formats; unsigned int num_fmts, i, j = 0; - bool skip_mode_none; + bool skip_mode_none, ignore_depth_match; + + /* + * If V4L2_FMT_FLAG_ALL_FORMATS flag is set, we want to enumerate all + * hardware supported pixels formats + */ + ignore_depth_match = !!(f->flags & V4L2_FMT_FLAG_ENUM_ALL_FORMATS); /* * When dealing with an encoder: @@ -222,10 +228,12 @@ static int vidioc_enum_fmt(struct file *file, void *priv, if (skip_mode_none == mode_none) continue; - if (!hantro_check_depth_match(fmt, ctx->bit_depth)) + if (!hantro_check_depth_match(fmt, ctx->bit_depth) && !ignore_depth_match) continue; if (j == f->index) { f->pixelformat = fmt->fourcc; + if (ignore_depth_match) + f->flags |= V4L2_FMT_FLAG_ALL_FORMATS; return 0; } ++j; @@ -242,10 +250,12 @@ static int vidioc_enum_fmt(struct file *file, void *priv, for (i = 0; i < num_fmts; i++) { fmt = &formats[i]; - if (!hantro_check_depth_match(fmt, ctx->bit_depth)) + if (!hantro_check_depth_match(fmt, ctx->bit_depth) && !ignore_depth_match) continue; if (j == f->index) { f->pixelformat = fmt->fourcc; + if (ignore_depth_match) + f->flags |= V4L2_FMT_FLAG_ALL_FORMATS; return 0; } ++j; -- 2.43.0