media: verisilicon: Compute motion vectors size for AV1 frames
authorBenjamin Gaignard <benjamin.gaignard@collabora.com>
Wed, 3 May 2023 08:34:33 +0000 (09:34 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 15:16:02 +0000 (16:16 +0100)
Compute the additional space required to store motion vectors at
the end of the frames buffers.

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_hw.h
drivers/media/platform/verisilicon/hantro_postproc.c
drivers/media/platform/verisilicon/hantro_v4l2.c

index e83f0c5..bc61d4e 100644 (file)
@@ -417,6 +417,19 @@ hantro_hevc_mv_size(unsigned int width, unsigned int height)
        return width * height / 16;
 }
 
+static inline unsigned short hantro_av1_num_sbs(unsigned short dimension)
+{
+       return DIV_ROUND_UP(dimension, 64);
+}
+
+static inline size_t
+hantro_av1_mv_size(unsigned int width, unsigned int height)
+{
+       size_t num_sbs = hantro_av1_num_sbs(width) * hantro_av1_num_sbs(height);
+
+       return ALIGN(num_sbs * 384, 16) * 2 + 512;
+}
+
 int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx);
 int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx);
 void hantro_mpeg2_dec_copy_qtable(u8 *qtable,
index 6437423..bb16af5 100644 (file)
@@ -213,6 +213,9 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
        else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE)
                buf_size += hantro_hevc_mv_size(pix_mp.width,
                                                pix_mp.height);
+       else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_AV1_FRAME)
+               buf_size += hantro_av1_mv_size(pix_mp.width,
+                                              pix_mp.height);
 
        for (i = 0; i < num_buffers; ++i) {
                struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i];
index 35035b6..3367aa9 100644 (file)
@@ -333,6 +333,11 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
                        pix_mp->plane_fmt[0].sizeimage +=
                                hantro_hevc_mv_size(pix_mp->width,
                                                    pix_mp->height);
+               else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_AV1_FRAME &&
+                        !hantro_needs_postproc(ctx, fmt))
+                       pix_mp->plane_fmt[0].sizeimage +=
+                               hantro_av1_mv_size(pix_mp->width,
+                                                  pix_mp->height);
        } else if (!pix_mp->plane_fmt[0].sizeimage) {
                /*
                 * For coded formats the application can specify