[hal_task]: Change hal_task to info with status

1. Split encoder and decoder hal_task defs and infos.
2. Change hal_task to a general info list with status.

Change-Id: I6f26035eeee4772d1ef99a21d85716e9c33eb9a6
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2022-02-18 15:35:56 +08:00
parent a7d198da66
commit fc8c86154e
22 changed files with 108 additions and 133 deletions

View File

@@ -23,7 +23,7 @@
#include "mpp_mem.h"
#include "mpp_log.h"
#include "mpp_packet_impl.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "avsd_api.h"
#include "avsd_parse.h"

View File

@@ -20,7 +20,7 @@
#include "mpp_packet.h"
#include "mpp_buf_slot.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#define H263D_DBG_FUNCTION (0x00000001)
#define H263D_DBG_STARTCODE (0x00000002)

View File

@@ -22,7 +22,7 @@
#include "mpp_mem.h"
#include "mpp_packet_impl.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "h264d_global.h"
#include "h264d_parse.h"

View File

@@ -37,7 +37,7 @@
#include "mpp_buf_slot.h"
#include "mpp_mem_pool.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "h265d_codec.h"
#include "h265_syntax.h"

View File

@@ -20,7 +20,7 @@
#include "mpp_packet.h"
#include "mpp_buf_slot.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#define MPG4D_DBG_FUNCTION (0x00000001)
#define MPG4D_DBG_STARTCODE (0x00000002)

View File

@@ -18,7 +18,7 @@
#define __VP9D_CODEC_H__
#include "mpp_frame.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "vp9d_syntax.h"

View File

@@ -16,6 +16,7 @@
#ifndef __H265D_API_H__
#define __H265D_API_H__
#include "parser_api.h"
#ifdef __cplusplus

View File

@@ -21,7 +21,7 @@
#include "mpp_packet.h"
#include "mpp_buf_slot.h"
#include "mpp_dec_cfg.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "mpp_soc.h"
/*

View File

@@ -136,6 +136,22 @@ static RK_S32 ts_cmp(void *priv, const struct list_head *a, const struct list_he
return ts1->pts - ts2->pts;
}
static MPP_RET dec_task_info_init(HalTaskInfo *task)
{
HalDecTask *p = &task->dec;
p->valid = 0;
p->flags.val = 0;
p->flags.eos = 0;
p->input_packet = NULL;
p->output = -1;
p->input = -1;
memset(&task->dec.syntax, 0, sizeof(task->dec.syntax));
memset(task->dec.refer, -1, sizeof(task->dec.refer));
return MPP_OK;
}
static void dec_task_init(DecTask *task)
{
task->hnd = NULL;
@@ -144,7 +160,7 @@ static void dec_task_init(DecTask *task)
task->status.prev_task_rdy = 1;
INIT_LIST_HEAD(&task->ts_cur.link);
hal_task_info_init(&task->info, MPP_CTX_DEC);
dec_task_info_init(&task->info);
}
/*
@@ -991,7 +1007,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
}
task->status.curr_task_rdy = 0;
task->status.task_parsed_rdy = 0;
hal_task_info_init(&task->info, MPP_CTX_DEC);
dec_task_info_init(&task->info);
return MPP_NOK;
}
dec_dbg_detail("detail: %p check output index pass\n", dec);
@@ -1117,7 +1133,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
task->status.curr_task_rdy = 0;
task->status.task_parsed_rdy = 0;
task->status.prev_task_rdy = 0;
hal_task_info_init(&task->info, MPP_CTX_DEC);
dec_task_info_init(&task->info);
dec_dbg_detail("detail: %p one task ready\n", dec);
@@ -1525,7 +1541,7 @@ void *mpp_dec_advanced_thread(void *data)
packet = NULL;
frame = NULL;
hal_task_info_init(&pTask->info, MPP_CTX_DEC);
dec_task_info_init(&pTask->info);
task.status.mpp_pkt_in_rdy = 0;
}

View File

@@ -22,6 +22,7 @@
#include "mpp_log.h"
#include "mpp_list.h"
#include "mpp_lock.h"
#include "mpp_common.h"
#include "hal_task.h"
@@ -33,7 +34,7 @@ struct HalTaskImpl_t {
HalTaskGroupImpl *group;
RK_S32 index;
HalTaskStatus status;
HalTaskInfo task;
void *data;
};
struct HalTaskGroupImpl_t {
@@ -44,11 +45,13 @@ struct HalTaskGroupImpl_t {
struct list_head list[TASK_BUTT];
RK_U32 count[TASK_BUTT];
RK_S32 size;
RK_S32 aligned_size;
HalTaskImpl tasks[];
};
MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count)
MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count, RK_S32 size)
{
if (NULL == group) {
mpp_err_f("found invalid input group %p count %d\n", group, count);
@@ -56,21 +59,28 @@ MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count)
}
HalTaskGroupImpl *p = NULL;
RK_S32 aligned_size = MPP_ALIGN(size, sizeof(void *));
RK_U8 *buf = NULL;
do {
p = mpp_calloc_size(HalTaskGroupImpl, sizeof(HalTaskGroupImpl) +
sizeof(HalTaskImpl) * count);
(sizeof(HalTaskImpl) + aligned_size) * count);
if (NULL == p) {
mpp_err_f("malloc group failed\n");
break;
}
p->task_count = count;
p->size = size;
p->aligned_size = aligned_size;
mpp_spinlock_init(&p->lock);
for (RK_U32 i = 0; i < TASK_BUTT; i++)
INIT_LIST_HEAD(&p->list[i]);
buf = (RK_U8 *)(((HalTaskImpl *)(p + 1) + count));
for (RK_S32 i = 0; i < count; i++) {
HalTaskImpl *task = &p->tasks[i];
@@ -78,6 +88,7 @@ MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count)
task->index = i;
task->group = p;
task->status = TASK_IDLE;
task->data = buf + i * aligned_size;
list_add_tail(&task->list, &p->list[TASK_IDLE]);
p->count[TASK_IDLE]++;
}
@@ -178,10 +189,10 @@ MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, HalTaskStatus status)
return MPP_OK;
}
MPP_RET hal_task_hnd_set_info(HalTaskHnd hnd, HalTaskInfo *task)
MPP_RET hal_task_hnd_set_info(HalTaskHnd hnd, void *info)
{
if (NULL == hnd || NULL == task) {
mpp_err_f("found invaid input hnd %p task %p\n", hnd, task);
if (NULL == hnd || NULL == info) {
mpp_err_f("found invaid input hnd %p info %p\n", hnd, info);
return MPP_ERR_UNKNOW;
}
@@ -191,16 +202,16 @@ MPP_RET hal_task_hnd_set_info(HalTaskHnd hnd, HalTaskInfo *task)
mpp_assert(impl->index < group->task_count);
mpp_spinlock_lock(&group->lock);
memcpy(&impl->task, task, sizeof(impl->task));
memcpy(impl->data, info, group->size);
mpp_spinlock_unlock(&group->lock);
return MPP_OK;
}
MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, HalTaskInfo *task)
MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, void *info)
{
if (NULL == hnd || NULL == task) {
mpp_err_f("found invaid input hnd %p task %p\n", hnd, task);
if (NULL == hnd || NULL == info) {
mpp_err_f("found invaid input hnd %p info %p\n", hnd, info);
return MPP_ERR_UNKNOW;
}
@@ -210,29 +221,8 @@ MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, HalTaskInfo *task)
mpp_assert(impl->index < group->task_count);
mpp_spinlock_lock(&group->lock);
memcpy(task, &impl->task, sizeof(impl->task));
memcpy(info, impl->data, group->size);
mpp_spinlock_unlock(&group->lock);
return MPP_OK;
}
MPP_RET hal_task_info_init(HalTaskInfo *task, MppCtxType type)
{
if (NULL == task || type >= MPP_CTX_BUTT) {
mpp_err_f("found invalid input task %p type %d\n", task, type);
return MPP_ERR_UNKNOW;
}
HalDecTask *p = &task->dec;
p->valid = 0;
p->flags.val = 0;
p->flags.eos = 0;
p->input_packet = NULL;
p->output = -1;
p->input = -1;
memset(&task->dec.syntax, 0, sizeof(task->dec.syntax));
memset(task->dec.refer, -1, sizeof(task->dec.refer));
return MPP_OK;
}

View File

@@ -18,11 +18,22 @@
#ifndef __HAL_DEC_TASK__
#define __HAL_DEC_TASK__
#include "hal_task_defs.h"
#include "hal_task.h"
#include "mpp_callback.h"
#define MAX_DEC_REF_NUM 17
/*
* modified by parser and encoder
*
* number : the number of the data pointer array element
* data : the address of the pointer array, parser will add its data here
*/
typedef struct MppSyntax_t {
RK_U32 number;
void *data;
} MppSyntax;
typedef union HalDecTaskFlag_t {
RK_U32 val;
struct {
@@ -79,4 +90,25 @@ typedef struct HalDecTask_t {
RK_S32 refer[MAX_DEC_REF_NUM];
} HalDecTask;
typedef union HalDecVprocTaskFlag_t {
RK_U32 val;
struct {
RK_U32 eos : 1;
RK_U32 info_change : 1;
};
} HalDecVprocTaskFlag;
typedef struct HalDecVprocTask_t {
// input slot index for post-process
HalDecVprocTaskFlag flags;
RK_S32 input;
} HalDecVprocTask;
typedef union HalTask_u {
HalDecTask dec;
HalDecVprocTask dec_vproc;
} HalTaskInfo;
#endif /* __HAL_DEC_TASK__ */

View File

@@ -20,7 +20,7 @@
#include "mpp_time.h"
#include "hal_task_defs.h"
#include "hal_task.h"
#include "mpp_rc_defs.h"
#include "mpp_enc_refs.h"
@@ -35,6 +35,11 @@ typedef struct HalEncTaskFlag_t {
RK_U32 err;
} HalEncTaskFlag;
typedef struct MppSyntax_t {
RK_U32 number;
void *data;
} MppSyntax;
typedef struct HalEncTask_t {
RK_U32 valid;

View File

@@ -19,28 +19,16 @@
#define __HAL_TASK__
#include "mpp_err.h"
#include "hal_dec_task.h"
typedef union HalDecVprocTaskFlag_t {
RK_U32 val;
typedef void* HalTaskHnd;
typedef void* HalTaskGroup;
struct {
RK_U32 eos : 1;
RK_U32 info_change : 1;
};
} HalDecVprocTaskFlag;
typedef struct HalDecVprocTask_t {
// input slot index for post-process
HalDecVprocTaskFlag flags;
RK_S32 input;
} HalDecVprocTask;
typedef union HalTask_u {
HalDecTask dec;
HalDecVprocTask dec_vproc;
} HalTaskInfo;
typedef enum HalTaskStatus_e {
TASK_IDLE,
TASK_PROCESSING,
TASK_PROC_DONE,
TASK_BUTT,
} HalTaskStatus;
#ifdef __cplusplus
extern "C" {
@@ -52,7 +40,7 @@ extern "C" {
* NOTE: use mpp_list to implement
* the count means the max task waiting for process
*/
MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count);
MPP_RET hal_task_group_init(HalTaskGroup *group, RK_S32 count, RK_S32 size);
MPP_RET hal_task_group_deinit(HalTaskGroup group);
/*
@@ -82,9 +70,8 @@ MPP_RET hal_task_group_deinit(HalTaskGroup group);
MPP_RET hal_task_get_hnd(HalTaskGroup group, HalTaskStatus status, HalTaskHnd *hnd);
MPP_RET hal_task_get_count(HalTaskGroup group, HalTaskStatus status, RK_U32 *count);
MPP_RET hal_task_hnd_set_status(HalTaskHnd hnd, HalTaskStatus status);
MPP_RET hal_task_hnd_set_info(HalTaskHnd hnd, HalTaskInfo *task);
MPP_RET hal_task_hnd_get_info(HalTaskHnd hnd, HalTaskInfo *task);
MPP_RET hal_task_info_init(HalTaskInfo *task, MppCtxType type);
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_check_empty(HalTaskGroup group, HalTaskStatus status);
#ifdef __cplusplus
@@ -92,4 +79,3 @@ MPP_RET hal_task_check_empty(HalTaskGroup group, HalTaskStatus status);
#endif
#endif /*__HAL_TASK__*/

View File

@@ -1,44 +0,0 @@
/*
*
* Copyright 2015 Rockchip Electronics Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __HAL_TASK_DEFS__
#define __HAL_TASK_DEFS__
#include "rk_type.h"
typedef void* HalTaskHnd;
typedef void* HalTaskGroup;
typedef enum HalTaskStatus_e {
TASK_IDLE,
TASK_PROCESSING,
TASK_PROC_DONE,
TASK_BUTT,
} HalTaskStatus;
/*
* modified by parser and encoder
*
* number : the number of the data pointer array element
* data : the address of the pointer array, parser will add its data here
*/
typedef struct MppSyntax_t {
RK_U32 number;
void *data;
} MppSyntax;
#endif /* __HAL_TASK_DEFS__ */

View File

@@ -17,8 +17,7 @@
#ifndef __HAL_VP8E_API_V2_H__
#define __HAL_VP8E_API_V2_H__
#include "mpp_hal.h"
#include "mpp_enc_hal.h"
extern const MppEncHalApi hal_api_vp8e_v2;

View File

@@ -22,7 +22,7 @@
#include "mpp_buf_slot.h"
#include "mpp_platform.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "mpp_dec_cfg.h"
#include "mpp_device.h"

View File

@@ -49,9 +49,6 @@ typedef struct MppEncHalImpl_t {
void *ctx;
const MppEncHalApi *api;
HalTaskGroup tasks;
RK_S32 task_count;
} MppEncHalImpl;
MPP_RET mpp_enc_hal_init(MppEncHal *ctx, MppEncHalCfg *cfg)
@@ -81,12 +78,6 @@ MPP_RET mpp_enc_hal_init(MppEncHal *ctx, MppEncHalCfg *cfg)
break;
}
ret = hal_task_group_init(&p->tasks, p->task_count);
if (ret) {
mpp_err_f("hal_task_group_init failed ret %d\n", ret);
break;
}
*ctx = p;
return MPP_OK;
}
@@ -109,8 +100,6 @@ MPP_RET mpp_enc_hal_deinit(MppEncHal ctx)
MppEncHalImpl *p = (MppEncHalImpl*)ctx;
p->api->deinit(p->ctx);
mpp_free(p->ctx);
if (p->tasks)
hal_task_group_deinit(p->tasks);
mpp_free(p);
return MPP_OK;
}

View File

@@ -112,7 +112,8 @@ MPP_RET mpp_hal_init(MppHal *ctx, MppHalCfg *cfg)
break;
}
ret = hal_task_group_init(&p->tasks, cfg->cfg->status.hal_task_count);
ret = hal_task_group_init(&p->tasks, cfg->cfg->status.hal_task_count,
sizeof(HalDecTask));
if (ret) {
mpp_err_f("hal_task_group_init failed ret %d\n", ret);
break;

View File

@@ -26,7 +26,7 @@
#include "mpp_bitread.h"
#include "mpp_bitput.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "jpegd_syntax.h"
#include "jpegd_api.h"
#include "hal_jpegd_common.h"

View File

@@ -23,7 +23,7 @@
#include "mpp_buf_slot.h"
#include "mpp_device.h"
#include "hal_task.h"
#include "hal_dec_task.h"
#include "vp8d_syntax.h"

View File

@@ -17,7 +17,7 @@
#ifndef __MPP_DEC_VPROC_H__
#define __MPP_DEC_VPROC_H__
#include "hal_task.h"
#include "hal_dec_task.h"
typedef struct MppDecVprocCfg_t {
void *mpp;

View File

@@ -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);
ret = hal_task_group_init(&p->task_group, 4, sizeof(HalDecVprocTask));
if (ret) {
mpp_err_f("create task group failed\n");
delete p->thd;