media: verisilicon: Check AV1 bitstreams bit depth
authorBenjamin Gaignard <benjamin.gaignard@collabora.com>
Wed, 3 May 2023 08:34:32 +0000 (09:34 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 15:15:38 +0000 (16:15 +0100)
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>
drivers/media/platform/verisilicon/hantro_drv.c
drivers/media/platform/verisilicon/hantro_v4l2.c

index 8f6021e3953c90b2f87a971c7a57d1d1e43782af..be1f06c2191011474d1c7f91e0d7e9d67b66490e 100644 (file)
@@ -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,
index 4a4ab0b7627a6b591ed6b6cd018dea131f4f0b15..35035b641e513e28948b52431b853b0ced73823e 100644 (file)
@@ -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);
 
        /*