diff --git a/mpp/hal/vpu/jpege/hal_jpege_base.h b/mpp/hal/vpu/jpege/hal_jpege_base.h index 057c5ea9..fdf4f729 100644 --- a/mpp/hal/vpu/jpege/hal_jpege_base.h +++ b/mpp/hal/vpu/jpege/hal_jpege_base.h @@ -44,6 +44,8 @@ typedef struct hal_jpege_ctx_s { void *regs; void *regs_out; RK_U32 reg_size; + RK_S32 task_cnt; + RK_S32 task_idx; MppEncCfgSet *cfg; JpegeSyntax syntax; diff --git a/mpp/hal/vpu/jpege/hal_jpege_vepu2_v2.c b/mpp/hal/vpu/jpege/hal_jpege_vepu2_v2.c index 21ab08b2..1d5c11b5 100644 --- a/mpp/hal/vpu/jpege/hal_jpege_vepu2_v2.c +++ b/mpp/hal/vpu/jpege/hal_jpege_vepu2_v2.c @@ -80,6 +80,7 @@ MPP_RET hal_jpege_vepu2_init(void *hal, MppEncHalCfg *cfg) } ctx->dev = cfg->dev; ctx->type = cfg->type; + ctx->task_cnt = cfg->task_cnt; jpege_bits_init(&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->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) { mpp_err_f("failed to malloc vepu2 regs\n"); 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) { mpp_err_f("failed to malloc vepu2 regs\n"); return MPP_NOK; @@ -188,6 +189,15 @@ MPP_RET hal_jpege_vepu2_get_task(void *hal, HalEncTask *task) ctx->rst_marker_idx = 0; task->part_first = 1; 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 */ 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 ver_stride = MPP_ALIGN(height, 16); 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); RK_U8 *buf = mpp_buffer_get_ptr(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; MppDevRegOffCfgs *reg_cfg = ctx_ext->reg_cfg; 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; MPP_RET ret = MPP_OK; 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; MppDevRegRdCfg rd_cfg; 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.offset = 0; @@ -826,7 +840,7 @@ MPP_RET hal_jpege_vepu2_start(void *hal, HalEncTask *task) break; } - rd_cfg.reg = ctx->regs; + rd_cfg.reg = regs; rd_cfg.size = reg_size; rd_cfg.offset = 0; @@ -861,7 +875,8 @@ MPP_RET hal_jpege_vepu2_wait(void *hal, HalEncTask *task) } else { JpegeFeedback *feedback = &ctx->feedback; 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 hw_bit = 0; 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_y = ctx->mcu_y; 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_mcu_h; 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; 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; RK_U32 hw_bit = 0; diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 632d7696..93fd4a58 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -60,15 +60,19 @@ static void *list_wraper_frame(void *arg) 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 || - !strstr(mpp_get_soc_name(), "rk3588")) { - mpp_log("Only rk3588 h264 encoder can use frame parallel\n"); - return MPP_NOK; + if (strstr(mpp_get_soc_name(), "rk3588")) { + if (coding == MPP_VIDEO_CodingAVC) + return 2; + + 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) @@ -189,6 +193,8 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) mInitDone = 1; } break; case MPP_CTX_ENC : { + RK_S32 input_task_count = 1; + mPktIn = new mpp_list(list_wraper_packet); mPktOut = new mpp_list(list_wraper_packet); 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(&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); 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); 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 = { coding, - (mInputTimeout) ? (1) : (2), + input_task_count, this, };