[hal_task]: Add task stage count on init

Change-Id: Ic983ae423f826e244518e8d5ef06124a5c65c5dc
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2022-05-26 14:46:59 +08:00
parent 0f0d28c2ec
commit bb3dd76f91
6 changed files with 43 additions and 32 deletions

View File

@@ -18,7 +18,7 @@
#define __AV1D_CODEC_H__ #define __AV1D_CODEC_H__
#include "mpp_frame.h" #include "mpp_frame.h"
#include "hal_task.h"
#include "av1d_cbs.h" #include "av1d_cbs.h"
#include "av1d_syntax.h" #include "av1d_syntax.h"
#include "mpp_bitread.h" #include "mpp_bitread.h"

View File

@@ -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_support_fast_mode = support_fast_mode;
dec_cfg->status.hal_task_count = hal_task_count; 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) { if (ret) {
mpp_err_f("hal_task_group_init failed ret %d\n", ret); mpp_err_f("hal_task_group_init failed ret %d\n", ret);
break; break;

View File

@@ -33,55 +33,64 @@ struct HalTaskImpl_t {
struct list_head list; struct list_head list;
HalTaskGroupImpl *group; HalTaskGroupImpl *group;
RK_S32 index; RK_S32 index;
HalTaskStatus status; RK_S32 status;
void *data; void *data;
}; };
struct HalTaskGroupImpl_t { struct HalTaskGroupImpl_t {
MppCtxType type; RK_S32 stage_count;
RK_S32 task_count; RK_S32 task_count;
spinlock_t lock; spinlock_t lock;
struct list_head list[TASK_BUTT];
RK_U32 count[TASK_BUTT];
RK_S32 size; RK_S32 size;
RK_S32 aligned_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) { if (NULL == group || stage_cnt < 0 || task_cnt < 0 || task_size < 0) {
mpp_err_f("found invalid input group %p count %d\n", group, count); 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; return MPP_ERR_UNKNOW;
} }
HalTaskGroupImpl *p = NULL; HalTaskGroupImpl *p = NULL;
RK_S32 aligned_size = MPP_ALIGN(size, sizeof(void *)); RK_S32 aligned_size = MPP_ALIGN(task_size, sizeof(void *));
RK_U8 *buf = NULL;
do { do {
RK_U8 *buf = NULL;
RK_S32 i;
p = mpp_calloc_size(HalTaskGroupImpl, sizeof(HalTaskGroupImpl) + 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) { if (NULL == p) {
mpp_err_f("malloc group failed\n"); mpp_err_f("malloc group failed\n");
break; break;
} }
p->task_count = count; p->stage_count = stage_cnt;
p->size = size; p->task_count = task_cnt;
p->size = task_size;
p->aligned_size = aligned_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); 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]); 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]; HalTaskImpl *task = &p->tasks[i];
INIT_LIST_HEAD(&task->list); INIT_LIST_HEAD(&task->list);
@@ -108,7 +117,7 @@ MPP_RET hal_task_group_deinit(HalTaskGroup group)
return MPP_OK; 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) { if (NULL == group || status >= TASK_BUTT || NULL == hnd) {
mpp_err_f("found invaid input group %p status %d hnd %p\n", group, status, 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; 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) { if (NULL == group || status >= TASK_BUTT) {
mpp_err_f("found invaid input group %p status %d \n", group, status); 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; 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) { if (NULL == group || status >= TASK_BUTT) {
mpp_err_f("found invaid input group %p status %d\n", group, status); 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; 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) { if (NULL == hnd || status >= TASK_BUTT) {
mpp_err_f("found invaid input hnd %p status %d\n", hnd, status); mpp_err_f("found invaid input hnd %p status %d\n", hnd, status);

View File

@@ -17,11 +17,9 @@
#ifndef __HAL_TASK__ #ifndef __HAL_TASK__
#define __HAL_TASK__ #define __HAL_TASK__
#include "rk_type.h"
#include "mpp_err.h" #include "mpp_err.h"
typedef void* HalTaskHnd;
typedef void* HalTaskGroup;
typedef enum HalTaskStatus_e { typedef enum HalTaskStatus_e {
TASK_IDLE, TASK_IDLE,
TASK_PROCESSING, TASK_PROCESSING,
@@ -29,6 +27,9 @@ typedef enum HalTaskStatus_e {
TASK_BUTT, TASK_BUTT,
} HalTaskStatus; } HalTaskStatus;
typedef void* HalTaskHnd;
typedef void* HalTaskGroup;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -37,7 +38,8 @@ extern "C" {
* group init / deinit will be called by hal * group init / deinit will be called by hal
* HalTaskGroup is a group of task list with status * 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); 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 * hal_task_set_hnd(hnd, idle) - codec mark task is idle
* *
*/ */
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);
RK_S32 hal_task_get_count(HalTaskGroup group, HalTaskStatus status); RK_S32 hal_task_get_count(HalTaskGroup group, RK_S32 status);
MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, HalTaskStatus 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_set_info(HalTaskHnd hnd, void *task);
MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, void *task); MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, void *task);
void *hal_task_hnd_get_data(HalTaskHnd hnd); 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 #ifdef __cplusplus
} }

View File

@@ -80,7 +80,7 @@ MPP_RET mpp_enc_hal_init(MppEncHal *ctx, MppEncHalCfg *cfg)
break; 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)); sizeof(EncAsyncTaskInfo));
if (ret) { if (ret) {
mpp_err_f("hal_task_group_init failed ret %d\n", ret); mpp_err_f("hal_task_group_init failed ret %d\n", ret);

View File

@@ -592,7 +592,7 @@ MPP_RET dec_vproc_init(MppDecVprocCtx *ctx, MppDecVprocCfg *cfg)
p->slots = ((MppDecImpl *)p->mpp->mDec)->frame_slots; p->slots = ((MppDecImpl *)p->mpp->mDec)->frame_slots;
p->thd = new MppThread(dec_vproc_thread, p, "mpp_dec_vproc"); p->thd = new MppThread(dec_vproc_thread, p, "mpp_dec_vproc");
sem_init(&p->reset_sem, 0, 0); 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) { if (ret) {
mpp_err_f("create task group failed\n"); mpp_err_f("create task group failed\n");
delete p->thd; delete p->thd;