mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
media: hantro: h264: Move reference picture number to a helper
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>
This commit is contained in:
parent
a9096c5853
commit
678ddaf3ff
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user