media: verisilicon: Check AV1 bitstreams bit depth
The driver supports 8 and 10 bits bitstreams, make sure to discard other cases. It could happens that userland test if V4L2_CID_STATELESS_AV1_SEQUENCE exists without setting bit_depth field in this case use HANTRO_DEFAULT_BIT_DEPTH value. Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
53421e73b6
commit
7040ed4ee6
|
@ -275,7 +275,13 @@ static int hantro_try_ctrl(struct v4l2_ctrl *ctrl)
|
|||
/* We only support profile 0 */
|
||||
if (dec_params->profile != 0)
|
||||
return -EINVAL;
|
||||
} else if (ctrl->id == V4L2_CID_STATELESS_AV1_SEQUENCE) {
|
||||
const struct v4l2_ctrl_av1_sequence *sequence = ctrl->p_new.p_av1_sequence;
|
||||
|
||||
if (sequence->bit_depth != 8 && sequence->bit_depth != 10)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -346,6 +352,30 @@ static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hantro_av1_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct hantro_ctx *ctx;
|
||||
|
||||
ctx = container_of(ctrl->handler,
|
||||
struct hantro_ctx, ctrl_handler);
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_STATELESS_AV1_SEQUENCE:
|
||||
{
|
||||
int bit_depth = ctrl->p_new.p_av1_sequence->bit_depth;
|
||||
|
||||
if (ctx->bit_depth == bit_depth)
|
||||
return 0;
|
||||
|
||||
return hantro_reset_raw_fmt(ctx, bit_depth);
|
||||
}
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_ctrl_ops hantro_ctrl_ops = {
|
||||
.try_ctrl = hantro_try_ctrl,
|
||||
};
|
||||
|
@ -363,6 +393,11 @@ static const struct v4l2_ctrl_ops hantro_hevc_ctrl_ops = {
|
|||
.s_ctrl = hantro_hevc_s_ctrl,
|
||||
};
|
||||
|
||||
static const struct v4l2_ctrl_ops hantro_av1_ctrl_ops = {
|
||||
.try_ctrl = hantro_try_ctrl,
|
||||
.s_ctrl = hantro_av1_s_ctrl,
|
||||
};
|
||||
|
||||
#define HANTRO_JPEG_ACTIVE_MARKERS (V4L2_JPEG_ACTIVE_MARKER_APP0 | \
|
||||
V4L2_JPEG_ACTIVE_MARKER_COM | \
|
||||
V4L2_JPEG_ACTIVE_MARKER_DQT | \
|
||||
|
@ -540,6 +575,7 @@ static const struct hantro_ctrl controls[] = {
|
|||
.codec = HANTRO_AV1_DECODER,
|
||||
.cfg = {
|
||||
.id = V4L2_CID_STATELESS_AV1_SEQUENCE,
|
||||
.ops = &hantro_av1_ctrl_ops,
|
||||
},
|
||||
}, {
|
||||
.codec = HANTRO_AV1_DECODER,
|
||||
|
|
|
@ -86,6 +86,10 @@ hantro_check_depth_match(const struct hantro_fmt *fmt, int bit_depth)
|
|||
if (!fmt->match_depth && !fmt->postprocessed)
|
||||
return true;
|
||||
|
||||
/* 0 means default depth, which is 8 */
|
||||
if (!bit_depth)
|
||||
bit_depth = HANTRO_DEFAULT_BIT_DEPTH;
|
||||
|
||||
fmt_depth = hantro_get_format_depth(fmt->fourcc);
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue