diff --git a/mpp/codec/dec/av1/av1d_codec.h b/mpp/codec/dec/av1/av1d_codec.h index 5e55db31..9a28f042 100644 --- a/mpp/codec/dec/av1/av1d_codec.h +++ b/mpp/codec/dec/av1/av1d_codec.h @@ -18,7 +18,7 @@ #define __AV1D_CODEC_H__ #include "mpp_frame.h" -#include "hal_task.h" + #include "av1d_cbs.h" #include "av1d_syntax.h" #include "mpp_bitread.h" diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 10841104..1e40b192 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -1747,7 +1747,7 @@ MPP_RET mpp_dec_init(MppDec *dec, MppDecInitCfg *cfg) dec_cfg->status.hal_support_fast_mode = support_fast_mode; dec_cfg->status.hal_task_count = hal_task_count; - ret = hal_task_group_init(&tasks, hal_task_count, sizeof(HalDecTask)); + ret = hal_task_group_init(&tasks, TASK_BUTT, hal_task_count, sizeof(HalDecTask)); if (ret) { mpp_err_f("hal_task_group_init failed ret %d\n", ret); break; diff --git a/mpp/hal/hal_task.cpp b/mpp/hal/hal_task.cpp index f52934cc..d1574e7e 100644 --- a/mpp/hal/hal_task.cpp +++ b/mpp/hal/hal_task.cpp @@ -33,55 +33,64 @@ struct HalTaskImpl_t { struct list_head list; HalTaskGroupImpl *group; RK_S32 index; - HalTaskStatus status; + RK_S32 status; void *data; }; struct HalTaskGroupImpl_t { - MppCtxType type; + RK_S32 stage_count; RK_S32 task_count; spinlock_t lock; - struct list_head list[TASK_BUTT]; - RK_U32 count[TASK_BUTT]; RK_S32 size; RK_S32 aligned_size; - HalTaskImpl tasks[]; + struct list_head *list; + RK_U32 *count; + HalTaskImpl *tasks; }; -MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count, RK_S32 size) +MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 stage_cnt, RK_S32 task_cnt, RK_S32 task_size) { - if (NULL == group) { - mpp_err_f("found invalid input group %p count %d\n", group, count); + if (NULL == group || stage_cnt < 0 || task_cnt < 0 || task_size < 0) { + mpp_err_f("found invalid input group %p stage %d task %d size %d\n", + group, stage_cnt, task_cnt, task_size); return MPP_ERR_UNKNOW; } HalTaskGroupImpl *p = NULL; - RK_S32 aligned_size = MPP_ALIGN(size, sizeof(void *)); - RK_U8 *buf = NULL; + RK_S32 aligned_size = MPP_ALIGN(task_size, sizeof(void *)); do { + RK_U8 *buf = NULL; + RK_S32 i; + p = mpp_calloc_size(HalTaskGroupImpl, sizeof(HalTaskGroupImpl) + - (sizeof(HalTaskImpl) + aligned_size) * count); + (sizeof(HalTaskImpl) + aligned_size) * task_cnt + + (sizeof(struct list_head)) * stage_cnt + + (sizeof(RK_U32)) * stage_cnt); if (NULL == p) { mpp_err_f("malloc group failed\n"); break; } - p->task_count = count; - p->size = size; + p->stage_count = stage_cnt; + p->task_count = task_cnt; + p->size = task_size; p->aligned_size = aligned_size; + p->list = (struct list_head *)((HalTaskImpl *)(p + 1)); + p->count = (RK_U32 *)(p->list + stage_cnt); + p->tasks = (HalTaskImpl *)(p->count + stage_cnt); mpp_spinlock_init(&p->lock); - for (RK_U32 i = 0; i < TASK_BUTT; i++) + for (i = 0; i < stage_cnt; i++) INIT_LIST_HEAD(&p->list[i]); - buf = (RK_U8 *)(((HalTaskImpl *)(p + 1) + count)); + buf = (RK_U8 *)(p->tasks + task_cnt); - for (RK_S32 i = 0; i < count; i++) { + for (i = 0; i < task_cnt; i++) { HalTaskImpl *task = &p->tasks[i]; INIT_LIST_HEAD(&task->list); @@ -108,7 +117,7 @@ MPP_RET hal_task_group_deinit(HalTaskGroup group) return MPP_OK; } -MPP_RET hal_task_get_hnd(HalTaskGroup group, HalTaskStatus status, HalTaskHnd *hnd) +MPP_RET hal_task_get_hnd(HalTaskGroup group, RK_S32 status, HalTaskHnd *hnd) { if (NULL == group || status >= TASK_BUTT || NULL == hnd) { mpp_err_f("found invaid input group %p status %d hnd %p\n", group, status, hnd); @@ -132,7 +141,7 @@ MPP_RET hal_task_get_hnd(HalTaskGroup group, HalTaskStatus status, HalTaskHnd *h return MPP_OK; } -MPP_RET hal_task_check_empty(HalTaskGroup group, HalTaskStatus status) +MPP_RET hal_task_check_empty(HalTaskGroup group, RK_S32 status) { if (NULL == group || status >= TASK_BUTT) { mpp_err_f("found invaid input group %p status %d \n", group, status); @@ -150,7 +159,7 @@ MPP_RET hal_task_check_empty(HalTaskGroup group, HalTaskStatus status) return ret; } -RK_S32 hal_task_get_count(HalTaskGroup group, HalTaskStatus status) +RK_S32 hal_task_get_count(HalTaskGroup group, RK_S32 status) { if (NULL == group || status >= TASK_BUTT) { mpp_err_f("found invaid input group %p status %d\n", group, status); @@ -167,7 +176,7 @@ RK_S32 hal_task_get_count(HalTaskGroup group, HalTaskStatus status) return count; } -MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, HalTaskStatus status) +MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, RK_S32 status) { if (NULL == hnd || status >= TASK_BUTT) { mpp_err_f("found invaid input hnd %p status %d\n", hnd, status); diff --git a/mpp/hal/inc/hal_task.h b/mpp/hal/inc/hal_task.h index f3e84c61..fe48b895 100644 --- a/mpp/hal/inc/hal_task.h +++ b/mpp/hal/inc/hal_task.h @@ -17,11 +17,9 @@ #ifndef __HAL_TASK__ #define __HAL_TASK__ +#include "rk_type.h" #include "mpp_err.h" -typedef void* HalTaskHnd; -typedef void* HalTaskGroup; - typedef enum HalTaskStatus_e { TASK_IDLE, TASK_PROCESSING, @@ -29,6 +27,9 @@ typedef enum HalTaskStatus_e { TASK_BUTT, } HalTaskStatus; +typedef void* HalTaskHnd; +typedef void* HalTaskGroup; + #ifdef __cplusplus extern "C" { #endif @@ -37,7 +38,8 @@ extern "C" { * group init / deinit will be called by hal * HalTaskGroup is a group of task list with status */ -MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count, RK_S32 size); +MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 stage_cnt, + RK_S32 task_cnt, RK_S32 task_size); MPP_RET hal_task_group_deinit(HalTaskGroup group); /* @@ -64,13 +66,13 @@ MPP_RET hal_task_group_deinit(HalTaskGroup group); * hal_task_set_hnd(hnd, idle) - codec mark task is idle * */ -MPP_RET hal_task_get_hnd(HalTaskGroup group, HalTaskStatus status, HalTaskHnd *hnd); -RK_S32 hal_task_get_count(HalTaskGroup group, HalTaskStatus status); -MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, HalTaskStatus status); +MPP_RET hal_task_get_hnd(HalTaskGroup group, RK_S32 status, HalTaskHnd *hnd); +RK_S32 hal_task_get_count(HalTaskGroup group, RK_S32 status); +MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, RK_S32 status); MPP_RET hal_task_hnd_set_info(HalTaskHnd hnd, void *task); MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, void *task); void *hal_task_hnd_get_data(HalTaskHnd hnd); -MPP_RET hal_task_check_empty(HalTaskGroup group, HalTaskStatus status); +MPP_RET hal_task_check_empty(HalTaskGroup group, RK_S32 status); #ifdef __cplusplus } diff --git a/mpp/hal/mpp_enc_hal.cpp b/mpp/hal/mpp_enc_hal.cpp index c4104ce2..b1e9703b 100644 --- a/mpp/hal/mpp_enc_hal.cpp +++ b/mpp/hal/mpp_enc_hal.cpp @@ -80,7 +80,7 @@ MPP_RET mpp_enc_hal_init(MppEncHal *ctx, MppEncHalCfg *cfg) break; } - ret = hal_task_group_init(&p->tasks, cfg->task_cnt, + ret = hal_task_group_init(&p->tasks, TASK_BUTT, cfg->task_cnt, sizeof(EncAsyncTaskInfo)); if (ret) { mpp_err_f("hal_task_group_init failed ret %d\n", ret); diff --git a/mpp/vproc/mpp_dec_vproc.cpp b/mpp/vproc/mpp_dec_vproc.cpp index ad305742..288b6733 100644 --- a/mpp/vproc/mpp_dec_vproc.cpp +++ b/mpp/vproc/mpp_dec_vproc.cpp @@ -592,7 +592,7 @@ MPP_RET dec_vproc_init(MppDecVprocCtx *ctx, MppDecVprocCfg *cfg) p->slots = ((MppDecImpl *)p->mpp->mDec)->frame_slots; p->thd = new MppThread(dec_vproc_thread, p, "mpp_dec_vproc"); sem_init(&p->reset_sem, 0, 0); - ret = hal_task_group_init(&p->task_group, 4, sizeof(HalDecVprocTask)); + ret = hal_task_group_init(&p->task_group, TASK_BUTT, 4, sizeof(HalDecVprocTask)); if (ret) { mpp_err_f("create task group failed\n"); delete p->thd;