fix[vdpu383]: Fix av1 global params issue

Change-Id: Ic0438d59202e538f227afe8d6a98e2eefe952e06
Signed-off-by: Hongjin Li <vic.hong@rock-chips.com>
This commit is contained in:
Hongjin Li
2024-03-01 16:49:50 +08:00
parent 0753f99ac6
commit 7c206495e7
5 changed files with 73 additions and 47 deletions

View File

@@ -206,9 +206,11 @@ static void read_global_param(AV1Context *s, RK_S32 type, RK_S32 ref, RK_S32 idx
mx = 1 << abs_bits;
r = (prev_gm_param >> prec_diff) - sub;
s->cur_frame.gm_params[ref].wmmat_val[idx] =
decode_signed_subexp_with_ref(s->raw_frame_header->gm_params[ref][idx],
-mx, mx + 1, r);
s->cur_frame.gm_params[ref].wmmat[idx] =
(decode_signed_subexp_with_ref(s->raw_frame_header->gm_params[ref][idx],
-mx, mx + 1, r) << prec_diff) + round;
(s->cur_frame.gm_params[ref].wmmat_val[idx] << prec_diff) + round;
}
static RK_U16 round_two(RK_U64 x, RK_U16 n)

View File

@@ -61,6 +61,7 @@ typedef struct RefInfo {
typedef struct GlobalMtionParams {
RK_U32 wmtype;
RK_S32 wmmat[6];
RK_S32 wmmat_val[6];
RK_S32 alpha, beta, gamma, delta;
} GlobalMtionParams;

View File

@@ -131,6 +131,7 @@ static int av1d_fill_picparams(Av1CodecContext *ctx, DXVA_PicParams_AV1 *pp)
pp->frame_refs[i].wmtype = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i].wmtype;
for (j = 0; j < 6; ++j) {
pp->frame_refs[i].wmmat[j] = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i].wmmat[j];
pp->frame_refs[i].wmmat_val[j] = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i].wmmat_val[j];
}
pp->frame_refs[i].alpha = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i].alpha;
pp->frame_refs[i].beta = h->cur_frame.gm_params[AV1_REF_FRAME_LAST + i].beta;

View File

@@ -221,6 +221,7 @@ typedef struct _DXVA_PicParams_AV1 {
UCHAR wminvalid;
UCHAR wmtype;
RK_S32 wmmat[6];
RK_S32 wmmat_val[6];
USHORT alpha, beta, gamma, delta;
} frame_refs[8];

View File

@@ -121,29 +121,6 @@
default: break;}\
}while(0)
#define SET_REF_COLMV_BASE(regs, ref_index, value)\
do{ \
switch(ref_index){\
case 0: regs.reg217_colmv_ref0_base = value; break; \
case 1: regs.reg218_colmv_ref1_base = value; break; \
case 2: regs.reg219_colmv_ref2_base = value; break; \
case 3: regs.reg220_colmv_ref3_base = value; break; \
case 4: regs.reg221_colmv_ref4_base = value; break; \
case 5: regs.reg222_colmv_ref5_base = value; break; \
case 6: regs.reg223_colmv_ref6_base = value; break; \
case 7: regs.reg224_colmv_ref7_base = value; break; \
case 8: regs.reg225_colmv_ref8_base = value; break; \
case 9: regs.reg226_colmv_ref9_base = value; break; \
case 10: regs.reg227_colmv_ref10_base = value; break; \
case 11: regs.reg228_colmv_ref11_base = value; break; \
case 12: regs.reg229_colmv_ref12_base = value; break; \
case 13: regs.reg230_colmv_ref13_base = value; break; \
case 14: regs.reg231_colmv_ref14_base = value; break; \
case 15: regs.reg232_colmv_ref15_base = value; break; \
default: break;}\
}while(0)
#define VDPU_FAST_REG_SET_CNT 3
#define OFFSET_CTRL_REGS (8 * sizeof(RK_U32))
@@ -264,7 +241,8 @@ static MPP_RET flip_string(char *str)
return MPP_OK;
}
static MPP_RET dump_data(char *fname_path, void *data, RK_U32 data_bit_size, RK_U32 line_bits, RK_U32 big_end)
static MPP_RET dump_data(char *fname_path, void *data, RK_U32 data_bit_size,
RK_U32 line_bits, RK_U32 big_end, RK_U32 append)
{
RK_U8 *buf_p = (RK_U8 *)data;
RK_U8 cur_data;
@@ -274,12 +252,16 @@ static MPP_RET dump_data(char *fname_path, void *data, RK_U32 data_bit_size, RK_
char line_tmp[256];
RK_U32 str_idx = 0;
dump_fp = fopen(fname_path, "w+");
if (append)
dump_fp = fopen(fname_path, "aw+");
else
dump_fp = fopen(fname_path, "w+");
if (!dump_fp) {
mpp_err_f("open file: %s error!\n", fname_path);
return MPP_NOK;
}
fseek(dump_fp, 0, SEEK_END);
if (append)
fseek(dump_fp, 0, SEEK_END);
if ((data_bit_size % 4 != 0) || (line_bits % 8 != 0)) {
mpp_err_f("line bits not align to 4!\n");
@@ -331,6 +313,7 @@ static MPP_RET dump_data(char *fname_path, void *data, RK_U32 data_bit_size, RK_
fprintf(dump_fp, "%s\n", line_tmp);
}
fflush(dump_fp);
fclose(dump_fp);
return MPP_OK;
@@ -1659,13 +1642,9 @@ static MPP_RET prepare_uncompress_header(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *
for (i = 0; i < ALLOWED_REFS_PER_FRAME_EX; ++i)
mpp_put_bits(&bp, dxva->frame_refs[i].wmtype, 2);
for (i = 0; i < ALLOWED_REFS_PER_FRAME_EX; ++i) {
for (j = 0; j < 6; j++) {
UINT32 wmmat_val = 0;
// TODO: fix here
mpp_put_bits(&bp, wmmat_val, 17);
}
}
for (i = 0; i < ALLOWED_REFS_PER_FRAME_EX; ++i)
for (j = 0; j < 6; j++)
mpp_put_bits(&bp, dxva->frame_refs[i].wmmat_val[j], 17);
/* film_grain_params */
{
@@ -1942,7 +1921,7 @@ static MPP_RET vdpu383_av1d_colmv_setup(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *d
size_t mv_size;
/* the worst case is the frame is error with whole frame */
mv_size = MPP_ALIGN(dxva->width, 64) / 64 * MPP_ALIGN(dxva->height, 64) / 64 * 8192;
mv_size = MPP_ALIGN(dxva->width, 64) / 64 * MPP_ALIGN(dxva->height, 64) / 64 * 1024;
if (reg_ctx->colmv_bufs == NULL || reg_ctx->colmv_size < mv_size) {
if (reg_ctx->colmv_bufs) {
hal_bufs_deinit(reg_ctx->colmv_bufs);
@@ -2030,9 +2009,10 @@ static void vdpu383_av1d_set_cdf(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
#ifdef DUMP_DATA
{
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(reg_ctx->cdf_rd_def_base),
434 * 128, 128, 0);
8 * NON_COEF_CDF_SIZE, 128, 0, 0);
dump_data(dump_cur_fname_path, (RK_U8 *)mpp_buffer_get_ptr(reg_ctx->cdf_rd_def_base)
+ NON_COEF_CDF_SIZE + COEF_CDF_SIZE * coeff_cdf_idx, 354 * 128, 128, 0);
+ NON_COEF_CDF_SIZE + COEF_CDF_SIZE * coeff_cdf_idx,
8 * COEF_CDF_SIZE, 128, 0, 1);
}
#endif
} else {
@@ -2045,9 +2025,10 @@ static void vdpu383_av1d_set_cdf(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
#ifdef DUMP_DATA
{
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(cdf_buf->buf[0]),
434 * 128, 128, 0);
8 * NON_COEF_CDF_SIZE, 128, 0, 0);
dump_data(dump_cur_fname_path, (RK_U8 *)mpp_buffer_get_ptr(cdf_buf->buf[0])
+ NON_COEF_CDF_SIZE + COEF_CDF_SIZE * coeff_cdf_idx, 354 * 128, 128, 0);
+ NON_COEF_CDF_SIZE + COEF_CDF_SIZE * coeff_cdf_idx,
8 * COEF_CDF_SIZE, 128, 0, 1);
}
#endif
}
@@ -2095,7 +2076,7 @@ static void vdpu383_av1d_set_cdf(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(reg_ctx->cdf_rd_def_base),
8 * mpp_buffer_get_size(reg_ctx->cdf_rd_def_base), 128, 0);
(NON_COEF_CDF_SIZE + COEF_CDF_SIZE * 4) * 8, 128, 0, 0);
}
#endif
@@ -2206,8 +2187,8 @@ MPP_RET vdpu383_av1d_gen_regs(void *hal, HalTaskInfo *task)
char *cur_fname = "global_cfg.dat";
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
// dump_data(dump_cur_fname_path, ctx->bufs_ptr,
// 8 * regs->av1d_paras.reg67_global_len * 16, 64, 0);
dump_data(dump_cur_fname_path, ctx->bufs_ptr,
8 * regs->av1d_paras.reg67_global_len * 16, 64, 0, 0);
}
#endif
// input strm
@@ -2224,9 +2205,16 @@ MPP_RET vdpu383_av1d_gen_regs(void *hal, HalTaskInfo *task)
char *cur_fname = "stream_in.dat";
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
// dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mbuffer)
// + ctx->offset_uncomps,
// 8 * p_hal->strm_len, 128, 0);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mbuffer)
+ ctx->offset_uncomps,
8 * p_hal->strm_len, 128, 0, 0);
}
{
char *cur_fname = "stream_in_no_offset.dat";
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mbuffer),
8 * p_hal->strm_len, 128, 0, 0);
}
#endif
}
@@ -2345,10 +2333,22 @@ MPP_RET vdpu383_av1d_gen_regs(void *hal, HalTaskInfo *task)
vdpu383_av1d_colmv_setup(p_hal, dxva);
mv_buf = hal_bufs_get_buf(ctx->colmv_bufs, dxva->CurrPic.Index7Bits);
regs->av1d_addrs.reg216_colmv_cur_base = mpp_buffer_get_fd(mv_buf->buf[0]);
#ifdef DUMP_DATA
memset(mpp_buffer_get_ptr(mv_buf->buf[0]), 0, mpp_buffer_get_size(mv_buf->buf[0]));
#endif
for (i = 0; i < NUM_REF_FRAMES; i++) {
if (dxva->frame_refs[i].Index != (CHAR)0xff && dxva->frame_refs[i].Index != 0x7f) {
mv_buf = hal_bufs_get_buf(ctx->colmv_bufs, dxva->frame_refs[i].Index);
regs->av1d_addrs.reg217_232_colmv_ref_base[i] = mpp_buffer_get_fd(mv_buf->buf[0]);
#ifdef DUMP_DATA
{
char *cur_fname = "colmv_ref_frame";
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s%d.dat", dump_cur_dir, cur_fname, i);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mv_buf->buf[0]),
8 * 5120 * 8, 64, 0, 0);
}
#endif
}
}
}
@@ -2475,6 +2475,27 @@ MPP_RET vdpu383_av1d_wait(void *hal, HalTaskInfo *task)
reg_ctx->reg_buf[task->dec.reg_index].regs :
reg_ctx->regs;
(void) p_regs;
#ifdef DUMP_DATA
{
char *cur_fname = "colmv_cur_frame.dat";
DXVA_PicParams_AV1 *dxva = (DXVA_PicParams_AV1*)task->dec.syntax.data;
HalBuf *mv_buf = NULL;
mv_buf = hal_bufs_get_buf(reg_ctx->colmv_bufs, dxva->CurrPic.Index7Bits);
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mv_buf->buf[0]),
8 * 5120 * 8, 64, 0, 0);
}
{
char *cur_fname = "decout.dat";
MppBuffer mbuffer = NULL;
mpp_buf_slot_get_prop(p_hal->slots, task->dec.output, SLOT_BUFFER, &mbuffer);
memset(dump_cur_fname_path, 0, sizeof(dump_cur_fname_path));
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(mbuffer),
8 * mpp_buffer_get_size(mbuffer), 64, 0, 0);
}
#endif
if (task->dec.flags.parse_err ||
task->dec.flags.ref_err) {
@@ -2500,7 +2521,7 @@ MPP_RET vdpu383_av1d_wait(void *hal, HalTaskInfo *task)
sprintf(dump_cur_fname_path, "%s/%s", dump_cur_dir, cur_fname);
cdf_buf = hal_bufs_get_buf(reg_ctx->cdf_bufs, dxva->CurrPic.Index7Bits);
dump_data(dump_cur_fname_path, (void *)mpp_buffer_get_ptr(cdf_buf->buf[0]),
(NON_COEF_CDF_SIZE + COEF_CDF_SIZE * 4) * 8, 128, 0);
(NON_COEF_CDF_SIZE + COEF_CDF_SIZE) * 8, 128, 0, 0);
}
#endif
#if DUMP_AV1_DATAS