feat[jpege]: Allow rk3588 jpege 4 tasks async

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I25a5a30038b6f7fccd6ba3951d7b847a63caeff7
This commit is contained in:
Herman Chen
2023-11-03 16:31:46 +08:00
parent cc20dd3efe
commit 3a2196fc41
3 changed files with 50 additions and 23 deletions

View File

@@ -44,6 +44,8 @@ typedef struct hal_jpege_ctx_s {
void *regs; void *regs;
void *regs_out; void *regs_out;
RK_U32 reg_size; RK_U32 reg_size;
RK_S32 task_cnt;
RK_S32 task_idx;
MppEncCfgSet *cfg; MppEncCfgSet *cfg;
JpegeSyntax syntax; JpegeSyntax syntax;

View File

@@ -80,6 +80,7 @@ MPP_RET hal_jpege_vepu2_init(void *hal, MppEncHalCfg *cfg)
} }
ctx->dev = cfg->dev; ctx->dev = cfg->dev;
ctx->type = cfg->type; ctx->type = cfg->type;
ctx->task_cnt = cfg->task_cnt;
jpege_bits_init(&ctx->bits); jpege_bits_init(&ctx->bits);
mpp_assert(ctx->bits); mpp_assert(ctx->bits);
@@ -89,13 +90,13 @@ MPP_RET hal_jpege_vepu2_init(void *hal, MppEncHalCfg *cfg)
ctx->cfg = cfg->cfg; ctx->cfg = cfg->cfg;
ctx->reg_size = sizeof(RK_U32) * VEPU_JPEGE_VEPU2_NUM_REGS; ctx->reg_size = sizeof(RK_U32) * VEPU_JPEGE_VEPU2_NUM_REGS;
ctx->regs = mpp_calloc_size(void, ctx->reg_size + EXTRA_INFO_SIZE); ctx->regs = mpp_calloc_size(void, (ctx->reg_size + EXTRA_INFO_SIZE) * ctx->task_cnt);
if (NULL == ctx->regs) { if (NULL == ctx->regs) {
mpp_err_f("failed to malloc vepu2 regs\n"); mpp_err_f("failed to malloc vepu2 regs\n");
return MPP_NOK; return MPP_NOK;
} }
ctx->regs_out = mpp_calloc_size(void, ctx->reg_size + EXTRA_INFO_SIZE); ctx->regs_out = mpp_calloc_size(void, (ctx->reg_size + EXTRA_INFO_SIZE) * ctx->task_cnt);
if (NULL == ctx->regs_out) { if (NULL == ctx->regs_out) {
mpp_err_f("failed to malloc vepu2 regs\n"); mpp_err_f("failed to malloc vepu2 regs\n");
return MPP_NOK; return MPP_NOK;
@@ -188,6 +189,15 @@ MPP_RET hal_jpege_vepu2_get_task(void *hal, HalEncTask *task)
ctx->rst_marker_idx = 0; ctx->rst_marker_idx = 0;
task->part_first = 1; task->part_first = 1;
task->part_last = 0; task->part_last = 0;
task->flags.reg_idx = 0;
/* rk3588 4 core frame parallel */
if (ctx->task_cnt > 1) {
task->flags.reg_idx = ctx->task_idx++;
if (ctx->task_idx >= ctx->task_cnt)
ctx->task_idx = 0;
goto MULTI_CORE_SPLIT_DONE;
}
/* Split single task to multi cores on rk3588 */ /* Split single task to multi cores on rk3588 */
if (ctx_ext) if (ctx_ext)
@@ -386,7 +396,8 @@ MPP_RET hal_jpege_vepu2_gen_regs(void *hal, HalEncTask *task)
RK_U32 hor_stride = 0; RK_U32 hor_stride = 0;
RK_U32 ver_stride = MPP_ALIGN(height, 16); RK_U32 ver_stride = MPP_ALIGN(height, 16);
JpegeBits bits = ctx->bits; JpegeBits bits = ctx->bits;
RK_U32 *regs = (RK_U32 *)ctx->regs; RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *regs = (RK_U32 *)((RK_U8 *)ctx->regs + ctx->reg_size * reg_idx);
size_t length = mpp_packet_get_length(task->packet); size_t length = mpp_packet_get_length(task->packet);
RK_U8 *buf = mpp_buffer_get_ptr(output); RK_U8 *buf = mpp_buffer_get_ptr(output);
size_t size = mpp_buffer_get_size(output); size_t size = mpp_buffer_get_size(output);
@@ -592,7 +603,8 @@ static MPP_RET multi_core_start(HalJpegeCtx *ctx, HalEncTask *task)
JpegeSyntax *syntax = &ctx->syntax; JpegeSyntax *syntax = &ctx->syntax;
MppDevRegOffCfgs *reg_cfg = ctx_ext->reg_cfg; MppDevRegOffCfgs *reg_cfg = ctx_ext->reg_cfg;
MppDev dev = ctx->dev; MppDev dev = ctx->dev;
RK_U32 *src = (RK_U32 *)ctx->regs; RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *src = (RK_U32 *)((RK_U8 *)ctx->regs + ctx->reg_size * reg_idx);
RK_U32 reg_size = ctx->reg_size; RK_U32 reg_size = ctx->reg_size;
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
RK_U32 partion_num = ctx_ext->partion_num; RK_U32 partion_num = ctx_ext->partion_num;
@@ -815,8 +827,10 @@ MPP_RET hal_jpege_vepu2_start(void *hal, HalEncTask *task)
MppDevRegWrCfg wr_cfg; MppDevRegWrCfg wr_cfg;
MppDevRegRdCfg rd_cfg; MppDevRegRdCfg rd_cfg;
RK_U32 reg_size = ctx->reg_size; RK_U32 reg_size = ctx->reg_size;
RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *regs = (RK_U32 *)((RK_U8 *)ctx->regs + reg_size * reg_idx);
wr_cfg.reg = ctx->regs; wr_cfg.reg = regs;
wr_cfg.size = reg_size; wr_cfg.size = reg_size;
wr_cfg.offset = 0; wr_cfg.offset = 0;
@@ -826,7 +840,7 @@ MPP_RET hal_jpege_vepu2_start(void *hal, HalEncTask *task)
break; break;
} }
rd_cfg.reg = ctx->regs; rd_cfg.reg = regs;
rd_cfg.size = reg_size; rd_cfg.size = reg_size;
rd_cfg.offset = 0; rd_cfg.offset = 0;
@@ -861,7 +875,8 @@ MPP_RET hal_jpege_vepu2_wait(void *hal, HalEncTask *task)
} else { } else {
JpegeFeedback *feedback = &ctx->feedback; JpegeFeedback *feedback = &ctx->feedback;
JpegeBits bits = ctx->bits; JpegeBits bits = ctx->bits;
RK_U32 *regs = ctx->regs; RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *regs = (RK_U32 *)((RK_U8 *)ctx->regs + ctx->reg_size * reg_idx);
RK_U32 sw_bit = 0; RK_U32 sw_bit = 0;
RK_U32 hw_bit = 0; RK_U32 hw_bit = 0;
RK_U32 val; RK_U32 val;
@@ -902,7 +917,8 @@ MPP_RET hal_jpege_vepu2_part_start(void *hal, HalEncTask *task)
RK_U32 mcu_h = syntax->mcu_h; RK_U32 mcu_h = syntax->mcu_h;
RK_U32 mcu_y = ctx->mcu_y; RK_U32 mcu_y = ctx->mcu_y;
RK_U32 part_mcu_h = syntax->part_rows; RK_U32 part_mcu_h = syntax->part_rows;
RK_U32 *regs = (RK_U32 *)ctx->regs; RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *regs = (RK_U32 *)((RK_U8 *)ctx->regs + ctx->reg_size * reg_idx);
RK_U32 part_enc_h; RK_U32 part_enc_h;
RK_U32 part_enc_mcu_h; RK_U32 part_enc_mcu_h;
RK_U32 part_y_fill; RK_U32 part_y_fill;
@@ -995,7 +1011,8 @@ MPP_RET hal_jpege_vepu2_part_wait(void *hal, HalEncTask *task)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
HalJpegeCtx *ctx = (HalJpegeCtx *)hal; HalJpegeCtx *ctx = (HalJpegeCtx *)hal;
RK_U32 *regs = ctx->regs_out; RK_S32 reg_idx = task->flags.reg_idx;
RK_U32 *regs = (RK_U32 *)((RK_U8 *)ctx->regs_out + ctx->reg_size * reg_idx);
JpegeFeedback *feedback = &ctx->feedback; JpegeFeedback *feedback = &ctx->feedback;
RK_U32 hw_bit = 0; RK_U32 hw_bit = 0;

View File

@@ -60,15 +60,19 @@ static void *list_wraper_frame(void *arg)
return NULL; return NULL;
} }
static MPP_RET check_frm_task_cnt_cap(MppCodingType coding) static RK_S32 check_frm_task_cnt_cap(MppCodingType coding)
{ {
if (coding != MPP_VIDEO_CodingAVC || if (strstr(mpp_get_soc_name(), "rk3588")) {
!strstr(mpp_get_soc_name(), "rk3588")) { if (coding == MPP_VIDEO_CodingAVC)
mpp_log("Only rk3588 h264 encoder can use frame parallel\n"); return 2;
return MPP_NOK;
if (coding == MPP_VIDEO_CodingMJPEG)
return 4;
} }
return MPP_OK; mpp_log("Only rk3588 h264/jpeg encoder can use frame parallel\n");
return 1;
} }
Mpp::Mpp(MppCtx ctx) Mpp::Mpp(MppCtx ctx)
@@ -189,6 +193,8 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding)
mInitDone = 1; mInitDone = 1;
} break; } break;
case MPP_CTX_ENC : { case MPP_CTX_ENC : {
RK_S32 input_task_count = 1;
mPktIn = new mpp_list(list_wraper_packet); mPktIn = new mpp_list(list_wraper_packet);
mPktOut = new mpp_list(list_wraper_packet); mPktOut = new mpp_list(list_wraper_packet);
mFrmIn = new mpp_list(NULL); mFrmIn = new mpp_list(NULL);
@@ -203,7 +209,15 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding)
mpp_buffer_group_get_internal(&mPacketGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_get_internal(&mPacketGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_get_internal(&mFrameGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_get_internal(&mFrameGroup, MPP_BUFFER_TYPE_ION);
mpp_task_queue_setup(mInputTaskQueue, 1); if (mInputTimeout == MPP_POLL_NON_BLOCK) {
mEncAyncIo = 1;
input_task_count = check_frm_task_cnt_cap(coding);
if (input_task_count == 1)
mInputTimeout = MPP_POLL_BLOCK;
}
mpp_task_queue_setup(mInputTaskQueue, input_task_count);
mpp_task_queue_setup(mOutputTaskQueue, 8); mpp_task_queue_setup(mOutputTaskQueue, 8);
mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT); mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT);
@@ -211,15 +225,9 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding)
mMppInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_OUTPUT); mMppInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_OUTPUT);
mMppOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_INPUT); mMppOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_INPUT);
if (mInputTimeout == MPP_POLL_NON_BLOCK) {
mEncAyncIo = 1;
if (check_frm_task_cnt_cap(coding))
mInputTimeout = MPP_POLL_BLOCK;
}
MppEncInitCfg cfg = { MppEncInitCfg cfg = {
coding, coding,
(mInputTimeout) ? (1) : (2), input_task_count,
this, this,
}; };