Commit 3c32d94c authored by Benjamin Gaignard's avatar Benjamin Gaignard Committed by Mauro Carvalho Chehab

media: verisilicon: Do not change context bit depth before validating the format

It is needed to check if the proposed pixels format is valid before
updating context bit depth and other internal states.
Stop using ctx->bit_depth to check format depth match and return
result to the caller.
Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@collabora.com>
Reviewed-by: default avatarNicolas Dufresne <nicolas.dufresne@collabora.com>
Reviewed-by: default avatarEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 6aa3b9c5
...@@ -197,7 +197,7 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx) ...@@ -197,7 +197,7 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
unsigned int i, buf_size; unsigned int i, buf_size;
/* this should always pick native format */ /* this should always pick native format */
fmt = hantro_get_default_fmt(ctx, false); fmt = hantro_get_default_fmt(ctx, false, ctx->bit_depth);
if (!fmt) if (!fmt)
return -EINVAL; return -EINVAL;
v4l2_fill_pixfmt_mp(&pix_mp, fmt->fourcc, ctx->src_fmt.width, v4l2_fill_pixfmt_mp(&pix_mp, fmt->fourcc, ctx->src_fmt.width,
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include "hantro_hw.h" #include "hantro_hw.h"
#include "hantro_v4l2.h" #include "hantro_v4l2.h"
#define HANTRO_DEFAULT_BIT_DEPTH 8
static int hantro_set_fmt_out(struct hantro_ctx *ctx, static int hantro_set_fmt_out(struct hantro_ctx *ctx,
struct v4l2_pix_format_mplane *pix_mp); struct v4l2_pix_format_mplane *pix_mp);
static int hantro_set_fmt_cap(struct hantro_ctx *ctx, static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
...@@ -76,18 +78,13 @@ int hantro_get_format_depth(u32 fourcc) ...@@ -76,18 +78,13 @@ int hantro_get_format_depth(u32 fourcc)
} }
static bool static bool
hantro_check_depth_match(const struct hantro_ctx *ctx, hantro_check_depth_match(const struct hantro_fmt *fmt, int bit_depth)
const struct hantro_fmt *fmt)
{ {
int fmt_depth, ctx_depth = 8; int fmt_depth;
if (!fmt->match_depth && !fmt->postprocessed) if (!fmt->match_depth && !fmt->postprocessed)
return true; return true;
/* 0 means default depth, which is 8 */
if (ctx->bit_depth)
ctx_depth = ctx->bit_depth;
fmt_depth = hantro_get_format_depth(fmt->fourcc); fmt_depth = hantro_get_format_depth(fmt->fourcc);
/* /*
...@@ -95,9 +92,9 @@ hantro_check_depth_match(const struct hantro_ctx *ctx, ...@@ -95,9 +92,9 @@ hantro_check_depth_match(const struct hantro_ctx *ctx,
* It may be possible to relax that on some HW. * It may be possible to relax that on some HW.
*/ */
if (!fmt->match_depth) if (!fmt->match_depth)
return fmt_depth <= ctx_depth; return fmt_depth <= bit_depth;
return fmt_depth == ctx_depth; return fmt_depth == bit_depth;
} }
static const struct hantro_fmt * static const struct hantro_fmt *
...@@ -119,7 +116,7 @@ hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc) ...@@ -119,7 +116,7 @@ hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc)
} }
const struct hantro_fmt * const struct hantro_fmt *
hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream) hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream, int bit_depth)
{ {
const struct hantro_fmt *formats; const struct hantro_fmt *formats;
unsigned int i, num_fmts; unsigned int i, num_fmts;
...@@ -128,7 +125,7 @@ hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream) ...@@ -128,7 +125,7 @@ hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream)
for (i = 0; i < num_fmts; i++) { for (i = 0; i < num_fmts; i++) {
if (bitstream == (formats[i].codec_mode != if (bitstream == (formats[i].codec_mode !=
HANTRO_MODE_NONE) && HANTRO_MODE_NONE) &&
hantro_check_depth_match(ctx, &formats[i])) hantro_check_depth_match(&formats[i], bit_depth))
return &formats[i]; return &formats[i];
} }
return NULL; return NULL;
...@@ -204,7 +201,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv, ...@@ -204,7 +201,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv,
if (skip_mode_none == mode_none) if (skip_mode_none == mode_none)
continue; continue;
if (!hantro_check_depth_match(ctx, fmt)) if (!hantro_check_depth_match(fmt, ctx->bit_depth))
continue; continue;
if (j == f->index) { if (j == f->index) {
f->pixelformat = fmt->fourcc; f->pixelformat = fmt->fourcc;
...@@ -224,7 +221,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv, ...@@ -224,7 +221,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv,
for (i = 0; i < num_fmts; i++) { for (i = 0; i < num_fmts; i++) {
fmt = &formats[i]; fmt = &formats[i];
if (!hantro_check_depth_match(ctx, fmt)) if (!hantro_check_depth_match(fmt, ctx->bit_depth))
continue; continue;
if (j == f->index) { if (j == f->index) {
f->pixelformat = fmt->fourcc; f->pixelformat = fmt->fourcc;
...@@ -292,7 +289,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx, ...@@ -292,7 +289,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
fmt = hantro_find_format(ctx, pix_mp->pixelformat); fmt = hantro_find_format(ctx, pix_mp->pixelformat);
if (!fmt) { if (!fmt) {
fmt = hantro_get_default_fmt(ctx, coded); fmt = hantro_get_default_fmt(ctx, coded, HANTRO_DEFAULT_BIT_DEPTH);
pix_mp->pixelformat = fmt->fourcc; pix_mp->pixelformat = fmt->fourcc;
} }
...@@ -380,7 +377,7 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx) ...@@ -380,7 +377,7 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
const struct hantro_fmt *vpu_fmt; const struct hantro_fmt *vpu_fmt;
struct v4l2_pix_format_mplane fmt; struct v4l2_pix_format_mplane fmt;
vpu_fmt = hantro_get_default_fmt(ctx, true); vpu_fmt = hantro_get_default_fmt(ctx, true, HANTRO_DEFAULT_BIT_DEPTH);
if (!vpu_fmt) if (!vpu_fmt)
return; return;
...@@ -393,15 +390,16 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx) ...@@ -393,15 +390,16 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
hantro_set_fmt_out(ctx, &fmt); hantro_set_fmt_out(ctx, &fmt);
} }
static void int
hantro_reset_raw_fmt(struct hantro_ctx *ctx) hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth)
{ {
const struct hantro_fmt *raw_vpu_fmt; const struct hantro_fmt *raw_vpu_fmt;
struct v4l2_pix_format_mplane raw_fmt, *encoded_fmt; struct v4l2_pix_format_mplane raw_fmt, *encoded_fmt;
int ret;
raw_vpu_fmt = hantro_get_default_fmt(ctx, false); raw_vpu_fmt = hantro_get_default_fmt(ctx, false, bit_depth);
if (!raw_vpu_fmt) if (!raw_vpu_fmt)
return; return -EINVAL;
if (ctx->is_encoder) if (ctx->is_encoder)
encoded_fmt = &ctx->dst_fmt; encoded_fmt = &ctx->dst_fmt;
...@@ -412,15 +410,20 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx) ...@@ -412,15 +410,20 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx)
raw_fmt.width = encoded_fmt->width; raw_fmt.width = encoded_fmt->width;
raw_fmt.height = encoded_fmt->height; raw_fmt.height = encoded_fmt->height;
if (ctx->is_encoder) if (ctx->is_encoder)
hantro_set_fmt_out(ctx, &raw_fmt); ret = hantro_set_fmt_out(ctx, &raw_fmt);
else else
hantro_set_fmt_cap(ctx, &raw_fmt); ret = hantro_set_fmt_cap(ctx, &raw_fmt);
if (!ret)
ctx->bit_depth = bit_depth;
return ret;
} }
void hantro_reset_fmts(struct hantro_ctx *ctx) void hantro_reset_fmts(struct hantro_ctx *ctx)
{ {
hantro_reset_encoded_fmt(ctx); hantro_reset_encoded_fmt(ctx);
hantro_reset_raw_fmt(ctx); hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
} }
static void static void
...@@ -520,7 +523,7 @@ static int hantro_set_fmt_out(struct hantro_ctx *ctx, ...@@ -520,7 +523,7 @@ static int hantro_set_fmt_out(struct hantro_ctx *ctx,
* changes to the raw format. * changes to the raw format.
*/ */
if (!ctx->is_encoder) if (!ctx->is_encoder)
hantro_reset_raw_fmt(ctx); hantro_reset_raw_fmt(ctx, hantro_get_format_depth(pix_mp->pixelformat));
/* Colorimetry information are always propagated. */ /* Colorimetry information are always propagated. */
ctx->dst_fmt.colorspace = pix_mp->colorspace; ctx->dst_fmt.colorspace = pix_mp->colorspace;
...@@ -583,7 +586,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx, ...@@ -583,7 +586,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
* changes to the raw format. * changes to the raw format.
*/ */
if (ctx->is_encoder) if (ctx->is_encoder)
hantro_reset_raw_fmt(ctx); hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
/* Colorimetry information are always propagated. */ /* Colorimetry information are always propagated. */
ctx->src_fmt.colorspace = pix_mp->colorspace; ctx->src_fmt.colorspace = pix_mp->colorspace;
......
...@@ -21,9 +21,10 @@ ...@@ -21,9 +21,10 @@
extern const struct v4l2_ioctl_ops hantro_ioctl_ops; extern const struct v4l2_ioctl_ops hantro_ioctl_ops;
extern const struct vb2_ops hantro_queue_ops; extern const struct vb2_ops hantro_queue_ops;
int hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth);
void hantro_reset_fmts(struct hantro_ctx *ctx); void hantro_reset_fmts(struct hantro_ctx *ctx);
int hantro_get_format_depth(u32 fourcc); int hantro_get_format_depth(u32 fourcc);
const struct hantro_fmt * const struct hantro_fmt *
hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream); hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream, int bit_depth);
#endif /* HANTRO_V4L2_H_ */ #endif /* HANTRO_V4L2_H_ */
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