mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 09:06:50 +08:00
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:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
36
mpp/mpp.cpp
36
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,
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user