mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
media: hantro: h264: Move DPB valid and long-term bitmaps
In order to reuse these bitmaps, move this process to struct hantro_h264_dec_hw_ctx. This will be used by the Rockchip VDPU2 H.264 driver. This idea was originally proposed by Jonas Karlman in "[RFC 08/12] media: hantro: Fix H264 decoding of field encoded content" which was posted a while ago. Link: https://lore.kernel.org/linux-media/HE1PR06MB4011EA39133818A85768B91FACBF0@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
b1e60562a6
commit
a9096c5853
|
|
@ -129,25 +129,12 @@ 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;
|
||||
u32 dpb_longterm = 0;
|
||||
u32 dpb_valid = 0;
|
||||
int reg_num;
|
||||
u32 reg;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Set up bit maps of valid and long term DPBs.
|
||||
* NOTE: The bits are reversed, i.e. MSb is DPB 0.
|
||||
*/
|
||||
for (i = 0; i < HANTRO_H264_DPB_SIZE; ++i) {
|
||||
if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)
|
||||
dpb_valid |= BIT(HANTRO_H264_DPB_SIZE - 1 - i);
|
||||
|
||||
if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
|
||||
dpb_longterm |= BIT(HANTRO_H264_DPB_SIZE - 1 - i);
|
||||
}
|
||||
vdpu_write_relaxed(vpu, dpb_valid << 16, G1_REG_VALID_REF);
|
||||
vdpu_write_relaxed(vpu, dpb_longterm << 16, G1_REG_LT_REF);
|
||||
vdpu_write_relaxed(vpu, ctx->h264_dec.dpb_valid, G1_REG_VALID_REF);
|
||||
vdpu_write_relaxed(vpu, ctx->h264_dec.dpb_longterm, G1_REG_LT_REF);
|
||||
|
||||
/*
|
||||
* Set up reference frame picture numbers.
|
||||
|
|
|
|||
|
|
@ -229,12 +229,25 @@ static void prepare_table(struct hantro_ctx *ctx)
|
|||
const struct v4l2_ctrl_h264_decode_params *dec_param = ctrls->decode;
|
||||
struct hantro_h264_dec_priv_tbl *tbl = ctx->h264_dec.priv.cpu;
|
||||
const struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb;
|
||||
u32 dpb_longterm = 0;
|
||||
u32 dpb_valid = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < HANTRO_H264_DPB_SIZE; ++i) {
|
||||
tbl->poc[i * 2] = dpb[i].top_field_order_cnt;
|
||||
tbl->poc[i * 2 + 1] = dpb[i].bottom_field_order_cnt;
|
||||
|
||||
/*
|
||||
* Set up bit maps of valid and long term DPBs.
|
||||
* NOTE: The bits are reversed, i.e. MSb is DPB 0.
|
||||
*/
|
||||
if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)
|
||||
dpb_valid |= BIT(HANTRO_H264_DPB_SIZE - 1 - i);
|
||||
if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
|
||||
dpb_longterm |= BIT(HANTRO_H264_DPB_SIZE - 1 - i);
|
||||
}
|
||||
ctx->h264_dec.dpb_valid = dpb_valid << 16;
|
||||
ctx->h264_dec.dpb_longterm = dpb_longterm << 16;
|
||||
|
||||
tbl->poc[32] = dec_param->top_field_order_cnt;
|
||||
tbl->poc[33] = dec_param->bottom_field_order_cnt;
|
||||
|
|
|
|||
|
|
@ -89,12 +89,16 @@ struct hantro_h264_dec_reflists {
|
|||
* @dpb: DPB
|
||||
* @reflists: P/B0/B1 reflists
|
||||
* @ctrls: V4L2 controls attached to a run
|
||||
* @dpb_longterm: DPB long-term
|
||||
* @dpb_valid: DPB valid
|
||||
*/
|
||||
struct hantro_h264_dec_hw_ctx {
|
||||
struct hantro_aux_buf priv;
|
||||
struct v4l2_h264_dpb_entry dpb[HANTRO_H264_DPB_SIZE];
|
||||
struct hantro_h264_dec_reflists reflists;
|
||||
struct hantro_h264_dec_ctrls ctrls;
|
||||
u32 dpb_longterm;
|
||||
u32 dpb_valid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user