Commit b3b4c9d3 authored by Michael Tretter's avatar Michael Tretter Committed by Hans Verkuil

media: verisilicon: Fix TRY_FMT on encoder OUTPUT

Commit f100ce3b ("media: verisilicon: Fix crash when probing
encoder") removed vpu_fmt from hantro_try_fmt(), since it was
initialized from vpu_dst_fmt, which may not be initialized, when TRY_FMT
is called. It was replaced by fmt, which is found using the pixelformat.

For the encoder, this changed the fmt to contain the raw format instead
of the coded format. The format constraints as of fmt->frmsize are only
valid for the coded format and are 0 for the raw formats. Therefore, the
size of a encoder OUTPUT device is constrained to 0 and the
v4l2-compliance tests for G_FMT, TRY_FMT, and SET_FMT fail.

Bring back vpu_fmt to use the coded format on an encoder OUTPUT device,
but initialize it using the currently set pixelformat on dst_fmt, which
is the coded format on an encoder.

Fixes: f100ce3b ("media: verisilicon: Fix crash when probing encoder")
Signed-off-by: default avatarMichael Tretter <m.tretter@pengutronix.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 3194d514
...@@ -297,6 +297,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx, ...@@ -297,6 +297,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
const struct hantro_fmt *fmt; const struct hantro_fmt *fmt;
const struct hantro_fmt *vpu_fmt;
bool capture = V4L2_TYPE_IS_CAPTURE(type); bool capture = V4L2_TYPE_IS_CAPTURE(type);
bool coded; bool coded;
...@@ -316,19 +317,23 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx, ...@@ -316,19 +317,23 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
if (coded) { if (coded) {
pix_mp->num_planes = 1; pix_mp->num_planes = 1;
} else if (!ctx->is_encoder) { vpu_fmt = fmt;
} else if (ctx->is_encoder) {
vpu_fmt = hantro_find_format(ctx, ctx->dst_fmt.pixelformat);
} else {
/* /*
* Width/height on the CAPTURE end of a decoder are ignored and * Width/height on the CAPTURE end of a decoder are ignored and
* replaced by the OUTPUT ones. * replaced by the OUTPUT ones.
*/ */
pix_mp->width = ctx->src_fmt.width; pix_mp->width = ctx->src_fmt.width;
pix_mp->height = ctx->src_fmt.height; pix_mp->height = ctx->src_fmt.height;
vpu_fmt = fmt;
} }
pix_mp->field = V4L2_FIELD_NONE; pix_mp->field = V4L2_FIELD_NONE;
v4l2_apply_frmsize_constraints(&pix_mp->width, &pix_mp->height, v4l2_apply_frmsize_constraints(&pix_mp->width, &pix_mp->height,
&fmt->frmsize); &vpu_fmt->frmsize);
if (!coded) { if (!coded) {
/* Fill remaining fields */ /* Fill remaining fields */
......
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