media: hantro: h264: Move reference picture number to a helper
authorEzequiel Garcia <ezequiel@collabora.com>
Mon, 19 Jul 2021 20:52:37 +0000 (22:52 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 22 Jul 2021 06:43:53 +0000 (08:43 +0200)
Add a hantro_h264_get_ref_nbr() helper function to get the reference
picture numbers. This will be used by the Rockchip VDPU2 H.264 driver.

This idea was originally proposed by Jonas Karlman in
"[RFC 09/12] media: hantro: Refactor G1 H264 code"
posted a while ago.

Link: https://lore.kernel.org/linux-media/HE1PR06MB401165F2BA0AD8A634FDFAF2ACBF0@HE1PR06MB4011.eurprd06.prod.outlook.com/
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Tested-by: Alex Bee <knaerzche@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/hantro/hantro_g1_h264_dec.c
drivers/staging/media/hantro/hantro_h264.c
drivers/staging/media/hantro/hantro_hw.h

index 6faacfc44c7c1f39a8b3fcb92886251619ec5199..236ce24ca00c88b50f5aa0079ef43066a3155f9b 100644 (file)
@@ -126,7 +126,6 @@ static void set_params(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *src_buf)
 
 static void set_ref(struct hantro_ctx *ctx)
 {
-       struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb;
        const u8 *b0_reflist, *b1_reflist, *p_reflist;
        struct hantro_dev *vpu = ctx->dev;
        int reg_num;
@@ -143,17 +142,8 @@ static void set_ref(struct hantro_ctx *ctx)
         * subsequential reference pictures.
         */
        for (i = 0; i < HANTRO_H264_DPB_SIZE; i += 2) {
-               reg = 0;
-               if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
-                       reg |= G1_REG_REF_PIC_REFER0_NBR(dpb[i].pic_num);
-               else
-                       reg |= G1_REG_REF_PIC_REFER0_NBR(dpb[i].frame_num);
-
-               if (dpb[i + 1].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
-                       reg |= G1_REG_REF_PIC_REFER1_NBR(dpb[i + 1].pic_num);
-               else
-                       reg |= G1_REG_REF_PIC_REFER1_NBR(dpb[i + 1].frame_num);
-
+               reg = G1_REG_REF_PIC_REFER0_NBR(hantro_h264_get_ref_nbr(ctx, i)) |
+                     G1_REG_REF_PIC_REFER1_NBR(hantro_h264_get_ref_nbr(ctx, i + 1));
                vdpu_write_relaxed(vpu, reg, G1_REG_REF_PIC(i / 2));
        }
 
index 6d72136760e7ed2b73c08a98f62059cd6f32e9ea..0b4d2491be3b831783cdaa37f9297c3f3cdb88f9 100644 (file)
@@ -348,6 +348,17 @@ dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx,
        return dma_addr;
 }
 
+u16 hantro_h264_get_ref_nbr(struct hantro_ctx *ctx, unsigned int dpb_idx)
+{
+       const struct v4l2_h264_dpb_entry *dpb = &ctx->h264_dec.dpb[dpb_idx];
+
+       if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE))
+               return 0;
+       if (dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
+               return dpb->pic_num;
+       return dpb->frame_num;
+}
+
 int hantro_h264_dec_prepare_run(struct hantro_ctx *ctx)
 {
        struct hantro_h264_dec_hw_ctx *h264_ctx = &ctx->h264_dec;
index ce678fedaad60b72c0207d4139d87bf6e6d35bbe..7a8048afe357245c733c520fb252dcca5d6361a5 100644 (file)
@@ -238,6 +238,8 @@ void hantro_jpeg_enc_done(struct hantro_ctx *ctx);
 
 dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx,
                                   unsigned int dpb_idx);
+u16 hantro_h264_get_ref_nbr(struct hantro_ctx *ctx,
+                           unsigned int dpb_idx);
 int hantro_h264_dec_prepare_run(struct hantro_ctx *ctx);
 int hantro_g1_h264_dec_run(struct hantro_ctx *ctx);
 int hantro_h264_dec_init(struct hantro_ctx *ctx);