mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-07 01:52:46 +08:00
[h264e_vepu580]: Add dpb hal func and more buffer
Change-Id: I1e458732b821571d25079aebe19831948bd591ee Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
@@ -397,6 +397,9 @@ typedef struct MppEncHwCfg_t {
|
|||||||
|
|
||||||
/* vepu1/2 */
|
/* vepu1/2 */
|
||||||
RK_S32 mb_rc_disable;
|
RK_S32 mb_rc_disable;
|
||||||
|
|
||||||
|
/* vepu580 */
|
||||||
|
RK_S32 extra_buf;
|
||||||
} MppEncHwCfg;
|
} MppEncHwCfg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -644,6 +644,7 @@ static MPP_RET h264e_proc_hal(void *ctx, HalEncTask *task)
|
|||||||
h264e_add_syntax(p, H264E_SYN_CFG, p->cfg);
|
h264e_add_syntax(p, H264E_SYN_CFG, p->cfg);
|
||||||
h264e_add_syntax(p, H264E_SYN_SPS, &p->sps);
|
h264e_add_syntax(p, H264E_SYN_SPS, &p->sps);
|
||||||
h264e_add_syntax(p, H264E_SYN_PPS, &p->pps);
|
h264e_add_syntax(p, H264E_SYN_PPS, &p->pps);
|
||||||
|
h264e_add_syntax(p, H264E_SYN_DPB, &p->dpb);
|
||||||
h264e_add_syntax(p, H264E_SYN_SLICE, &p->slice);
|
h264e_add_syntax(p, H264E_SYN_SLICE, &p->slice);
|
||||||
h264e_add_syntax(p, H264E_SYN_FRAME, &p->frms);
|
h264e_add_syntax(p, H264E_SYN_FRAME, &p->frms);
|
||||||
|
|
||||||
|
@@ -25,6 +25,22 @@
|
|||||||
#include "h264e_dpb.h"
|
#include "h264e_dpb.h"
|
||||||
#include "h264e_slice.h"
|
#include "h264e_slice.h"
|
||||||
|
|
||||||
|
void h264e_dpb_dump_usage(H264eDpb *dpb, const char *fmt)
|
||||||
|
{
|
||||||
|
RK_S32 i = 0;
|
||||||
|
char buf[256];
|
||||||
|
RK_S32 pos = 0;
|
||||||
|
|
||||||
|
pos += snprintf(buf, sizeof(buf) - 1, "total %2d ", dpb->total_cnt);
|
||||||
|
|
||||||
|
for (i = 0; i < dpb->total_cnt; i++) {
|
||||||
|
H264eDpbFrm *frm = &dpb->frames[i];
|
||||||
|
|
||||||
|
pos += snprintf(buf + pos, sizeof(buf) - 1 - pos, "%04x ", frm->on_used);
|
||||||
|
}
|
||||||
|
mpp_log("%s %s", fmt, buf);
|
||||||
|
}
|
||||||
|
|
||||||
void h264e_dpb_dump_frm(H264eDpb *dpb, const char *caller, RK_S32 line)
|
void h264e_dpb_dump_frm(H264eDpb *dpb, const char *caller, RK_S32 line)
|
||||||
{
|
{
|
||||||
RK_S32 i = 0;
|
RK_S32 i = 0;
|
||||||
@@ -123,6 +139,9 @@ MPP_RET h264e_dpb_setup(H264eDpb *dpb, MppEncCfgSet* cfg, H264eSps *sps)
|
|||||||
dpb->max_poc_lsb = (1 << log2_max_poc_lsb);
|
dpb->max_poc_lsb = (1 << log2_max_poc_lsb);
|
||||||
dpb->poc_type = sps->pic_order_cnt_type;
|
dpb->poc_type = sps->pic_order_cnt_type;
|
||||||
|
|
||||||
|
if (cfg->hw.extra_buf)
|
||||||
|
dpb->total_cnt++;
|
||||||
|
|
||||||
h264e_dbg_dpb("max ref frm num %d total slot %d\n",
|
h264e_dbg_dpb("max ref frm num %d total slot %d\n",
|
||||||
ref_frm_num, dpb->total_cnt);
|
ref_frm_num, dpb->total_cnt);
|
||||||
h264e_dbg_dpb("log2 max frm num %d -> %d\n",
|
h264e_dbg_dpb("log2 max frm num %d -> %d\n",
|
||||||
@@ -135,9 +154,11 @@ MPP_RET h264e_dpb_setup(H264eDpb *dpb, MppEncCfgSet* cfg, H264eSps *sps)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
H264eDpbFrm *find_cpb_frame(H264eDpbFrm *frms, RK_S32 cnt, EncFrmStatus *frm)
|
H264eDpbFrm *find_cpb_frame(H264eDpb *dpb, EncFrmStatus *frm)
|
||||||
{
|
{
|
||||||
|
H264eDpbFrm *frms = dpb->frames;
|
||||||
RK_S32 seq_idx = frm->seq_idx;
|
RK_S32 seq_idx = frm->seq_idx;
|
||||||
|
RK_S32 cnt = dpb->total_cnt;
|
||||||
RK_S32 i;
|
RK_S32 i;
|
||||||
|
|
||||||
if (!frm->valid)
|
if (!frm->valid)
|
||||||
@@ -161,6 +182,8 @@ H264eDpbFrm *find_cpb_frame(H264eDpbFrm *frms, RK_S32 cnt, EncFrmStatus *frm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mpp_err_f("can not find match frm %d\n", seq_idx);
|
mpp_err_f("can not find match frm %d\n", seq_idx);
|
||||||
|
h264e_dpb_dump_frms(dpb);
|
||||||
|
abort();
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -230,7 +253,7 @@ void h264e_dpb_build_list(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
h264e_dbg_list("idx %d frm %d valid %d is_non_ref %d lt_ref %d\n",
|
h264e_dbg_list("idx %d frm %d valid %d is_non_ref %d lt_ref %d\n",
|
||||||
i, frm->seq_idx, frm->valid, frm->is_non_ref, frm->is_lt_ref);
|
i, frm->seq_idx, frm->valid, frm->is_non_ref, frm->is_lt_ref);
|
||||||
|
|
||||||
H264eDpbFrm *p = find_cpb_frame(dpb->frames, dpb->total_cnt, frm);
|
H264eDpbFrm *p = find_cpb_frame(dpb, frm);
|
||||||
if (!frm->is_lt_ref) {
|
if (!frm->is_lt_ref) {
|
||||||
dpb->stref[st_size++] = p;
|
dpb->stref[st_size++] = p;
|
||||||
p->status.val = frm->val;
|
p->status.val = frm->val;
|
||||||
@@ -413,7 +436,7 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
|
|
||||||
if (curr->is_idr) {
|
if (curr->is_idr) {
|
||||||
for (i = 0; i < H264E_MAX_REFS_CNT + 1; i++) {
|
for (i = 0; i < H264E_MAX_REFS_CNT + 1; i++) {
|
||||||
frames[i].on_used = 0;
|
frames[i].dpb_used = 0;
|
||||||
frames[i].status.valid = 0;
|
frames[i].status.valid = 0;
|
||||||
}
|
}
|
||||||
dpb->used_size = 0;
|
dpb->used_size = 0;
|
||||||
@@ -434,13 +457,13 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
* user defined cpb to hal slot index
|
* user defined cpb to hal slot index
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < MAX_CPB_REFS; i++) {
|
for (i = 0; i < MAX_CPB_REFS; i++) {
|
||||||
H264eDpbFrm *frm = find_cpb_frame(frames, dpb->total_cnt, &init[i]);
|
H264eDpbFrm *frm = find_cpb_frame(dpb, &init[i]);
|
||||||
dpb->map[i] = frm;
|
dpb->map[i] = frm;
|
||||||
if (frm) {
|
if (frm) {
|
||||||
if (!frm->on_used)
|
if (!frm->on_used)
|
||||||
mpp_err_f("warning frm %d is used by cpb but on not used status\n",
|
mpp_err_f("warning frm %d is used by cpb but on not used status\n",
|
||||||
frm->seq_idx);
|
frm->seq_idx);
|
||||||
frm->on_used = 1;
|
frm->dpb_used = 1;
|
||||||
used_size++;
|
used_size++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,7 +498,8 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h264e_dbg_dpb("slot %2d check in cpb init valid %d\n", i, valid);
|
h264e_dbg_dpb("slot %2d check in cpb init valid %d used %04x\n",
|
||||||
|
i, valid, p->on_used);
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (!p->on_used || !p->status.valid) {
|
if (!p->on_used || !p->status.valid) {
|
||||||
@@ -486,12 +510,19 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h264e_dbg_dpb("slot %2d used %04x checking\n", i, p->on_used);
|
||||||
|
|
||||||
|
if (p->hal_used)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (found_curr) {
|
if (found_curr) {
|
||||||
p->on_used = 0;
|
p->dpb_used = 0;
|
||||||
p->status.valid = 0;
|
p->status.valid = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h264e_dbg_dpb("slot %2d used %04x mark as current\n", i, p->on_used);
|
||||||
|
|
||||||
dpb->curr = p;
|
dpb->curr = p;
|
||||||
p->status.val = curr->val;
|
p->status.val = curr->val;
|
||||||
p->seq_idx = curr->seq_idx;
|
p->seq_idx = curr->seq_idx;
|
||||||
@@ -523,7 +554,7 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
|
|
||||||
}
|
}
|
||||||
p->lt_idx = curr->lt_idx;
|
p->lt_idx = curr->lt_idx;
|
||||||
p->on_used = 1;
|
p->dpb_used = 1;
|
||||||
|
|
||||||
rt->last_seq_idx = curr->seq_idx;
|
rt->last_seq_idx = curr->seq_idx;
|
||||||
rt->last_is_ref = !curr->is_non_ref;
|
rt->last_is_ref = !curr->is_non_ref;
|
||||||
@@ -542,7 +573,7 @@ MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
mpp_err_f("frm %d failed to find a slot for curr %d\n", seq_idx);
|
mpp_err_f("frm %d failed to find a slot for curr %d\n", seq_idx);
|
||||||
|
|
||||||
h264e_dbg_dpb("frm %d start finding slot for refr %d\n", seq_idx, refr->seq_idx);
|
h264e_dbg_dpb("frm %d start finding slot for refr %d\n", seq_idx, refr->seq_idx);
|
||||||
dpb->refr = find_cpb_frame(frames, dpb->total_cnt, refr);
|
dpb->refr = find_cpb_frame(dpb, refr);
|
||||||
if (NULL == dpb->refr)
|
if (NULL == dpb->refr)
|
||||||
dpb->refr = dpb->curr;
|
dpb->refr = dpb->curr;
|
||||||
|
|
||||||
@@ -576,7 +607,7 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
curr->seq_idx, refr->seq_idx);
|
curr->seq_idx, refr->seq_idx);
|
||||||
|
|
||||||
if (curr->status.is_non_ref) {
|
if (curr->status.is_non_ref) {
|
||||||
curr->on_used = 0;
|
curr->dpb_used = 0;
|
||||||
curr->status.valid = 0;
|
curr->status.valid = 0;
|
||||||
} else {
|
} else {
|
||||||
/* sliding window process */
|
/* sliding window process */
|
||||||
@@ -601,7 +632,7 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
if (tmp == curr)
|
if (tmp == curr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!tmp->on_used)
|
if (!tmp->dpb_used)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!tmp->status.valid)
|
if (!tmp->status.valid)
|
||||||
@@ -613,7 +644,7 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tmp->lt_idx == lt_idx) {
|
if (tmp->lt_idx == lt_idx) {
|
||||||
tmp->on_used = 0;
|
tmp->dpb_used = 0;
|
||||||
tmp->status.valid = 0;
|
tmp->status.valid = 0;
|
||||||
h264e_dbg_dpb("frm %d lt_idx %d replace %d\n",
|
h264e_dbg_dpb("frm %d lt_idx %d replace %d\n",
|
||||||
curr->seq_idx, curr->lt_idx, tmp->slot_idx);
|
curr->seq_idx, curr->lt_idx, tmp->slot_idx);
|
||||||
@@ -665,7 +696,7 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
h264e_dbg_dpb("removing frm %d poc %d\n",
|
h264e_dbg_dpb("removing frm %d poc %d\n",
|
||||||
unref->seq_idx, unref->poc);
|
unref->seq_idx, unref->poc);
|
||||||
|
|
||||||
unref->on_used = 0;
|
unref->dpb_used = 0;
|
||||||
dpb->st_size--;
|
dpb->st_size--;
|
||||||
mpp_assert(dpb->st_size >= 0);
|
mpp_assert(dpb->st_size >= 0);
|
||||||
used_size--;
|
used_size--;
|
||||||
@@ -685,7 +716,7 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
|
|
||||||
RK_S32 used_size = 0;
|
RK_S32 used_size = 0;
|
||||||
for (i = 0; i < MAX_CPB_REFS; i++) {
|
for (i = 0; i < MAX_CPB_REFS; i++) {
|
||||||
dpb->map[i] = find_cpb_frame(dpb->frames, dpb->total_cnt, &cpb->final[i]);
|
dpb->map[i] = find_cpb_frame(dpb, &cpb->final[i]);
|
||||||
if (dpb->map[i])
|
if (dpb->map[i])
|
||||||
used_size++;
|
used_size++;
|
||||||
}
|
}
|
||||||
@@ -696,3 +727,21 @@ void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb)
|
|||||||
|
|
||||||
h264e_dbg_dpb("leave %p\n", dpb);
|
h264e_dbg_dpb("leave %p\n", dpb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MPP_RET h264e_dpb_hal_start(H264eDpb *dpb, RK_S32 slot_idx)
|
||||||
|
{
|
||||||
|
H264eDpbFrm *frm = &dpb->frames[slot_idx];
|
||||||
|
|
||||||
|
frm->hal_used++;
|
||||||
|
//h264e_dpb_dump_usage(dpb, __FUNCTION__);
|
||||||
|
return MPP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPP_RET h264e_dpb_hal_end(H264eDpb *dpb, RK_S32 slot_idx)
|
||||||
|
{
|
||||||
|
H264eDpbFrm *frm = &dpb->frames[slot_idx];
|
||||||
|
|
||||||
|
frm->hal_used--;
|
||||||
|
//h264e_dpb_dump_usage(dpb, __FUNCTION__);
|
||||||
|
return MPP_OK;
|
||||||
|
}
|
||||||
|
@@ -54,7 +54,14 @@ typedef struct H264eDpbFrm_t {
|
|||||||
RK_S32 slot_idx;
|
RK_S32 slot_idx;
|
||||||
// frame index in frames
|
// frame index in frames
|
||||||
RK_S32 seq_idx;
|
RK_S32 seq_idx;
|
||||||
RK_U32 on_used;
|
|
||||||
|
union {
|
||||||
|
RK_U32 on_used;
|
||||||
|
struct {
|
||||||
|
RK_U32 dpb_used : 8;
|
||||||
|
RK_U32 hal_used : 8;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/* frame status */
|
/* frame status */
|
||||||
EncFrmStatus status;
|
EncFrmStatus status;
|
||||||
@@ -141,6 +148,13 @@ MPP_RET h264e_dpb_setup(H264eDpb *dpb, MppEncCfgSet* cfg, H264eSps *sps);
|
|||||||
* lt_ref - current frame is marked as longterm reference
|
* lt_ref - current frame is marked as longterm reference
|
||||||
*/
|
*/
|
||||||
MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb);
|
MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hal usage flag mark / unmark function
|
||||||
|
*/
|
||||||
|
MPP_RET h264e_dpb_hal_start(H264eDpb *dpb, RK_S32 slot_idx);
|
||||||
|
MPP_RET h264e_dpb_hal_end(H264eDpb *dpb, RK_S32 slot_idx);
|
||||||
|
|
||||||
void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb);
|
void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb);
|
||||||
|
|
||||||
#define h264e_dpb_dump_frms(dpb) h264e_dpb_dump_frm(dpb, __FUNCTION__, __LINE__)
|
#define h264e_dpb_dump_frms(dpb) h264e_dpb_dump_frm(dpb, __FUNCTION__, __LINE__)
|
||||||
|
@@ -35,6 +35,9 @@ typedef struct HalEncTaskFlag_t {
|
|||||||
RK_U32 err;
|
RK_U32 err;
|
||||||
RK_S32 drop_by_fps;
|
RK_S32 drop_by_fps;
|
||||||
RK_S32 reg_idx;
|
RK_S32 reg_idx;
|
||||||
|
/* hal buf index */
|
||||||
|
RK_S32 curr_idx;
|
||||||
|
RK_S32 refr_idx;
|
||||||
} HalEncTaskFlag;
|
} HalEncTaskFlag;
|
||||||
|
|
||||||
typedef struct MppSyntax_t {
|
typedef struct MppSyntax_t {
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "h264e_sps.h"
|
#include "h264e_sps.h"
|
||||||
#include "h264e_pps.h"
|
#include "h264e_pps.h"
|
||||||
|
#include "h264e_dpb.h"
|
||||||
#include "h264e_slice.h"
|
#include "h264e_slice.h"
|
||||||
|
|
||||||
#include "hal_h264e_debug.h"
|
#include "hal_h264e_debug.h"
|
||||||
@@ -62,6 +63,7 @@ typedef struct HalH264eVepu580Ctx_t {
|
|||||||
RK_U32 updated;
|
RK_U32 updated;
|
||||||
H264eSps *sps;
|
H264eSps *sps;
|
||||||
H264ePps *pps;
|
H264ePps *pps;
|
||||||
|
H264eDpb *dpb;
|
||||||
H264eSlice *slice;
|
H264eSlice *slice;
|
||||||
H264eFrmInfo *frms;
|
H264eFrmInfo *frms;
|
||||||
H264eReorderInfo *reorder;
|
H264eReorderInfo *reorder;
|
||||||
@@ -248,6 +250,7 @@ static MPP_RET hal_h264e_vepu580_init(void *hal, MppEncHalCfg *cfg)
|
|||||||
|
|
||||||
hw->qp_delta_row_i = 2;
|
hw->qp_delta_row_i = 2;
|
||||||
hw->qp_delta_row = 2;
|
hw->qp_delta_row = 2;
|
||||||
|
hw->extra_buf = 1;
|
||||||
|
|
||||||
memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
|
memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
|
||||||
memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
|
memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
|
||||||
@@ -286,7 +289,7 @@ static void setup_hal_bufs(HalH264eVepu580Ctx *ctx)
|
|||||||
RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
|
RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
|
||||||
RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
|
RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
|
||||||
RK_S32 old_max_cnt = ctx->max_buf_cnt;
|
RK_S32 old_max_cnt = ctx->max_buf_cnt;
|
||||||
RK_S32 new_max_cnt = 2;
|
RK_S32 new_max_cnt = 4;
|
||||||
MppEncRefCfg ref_cfg = cfg->ref_cfg;
|
MppEncRefCfg ref_cfg = cfg->ref_cfg;
|
||||||
|
|
||||||
if (ref_cfg) {
|
if (ref_cfg) {
|
||||||
@@ -391,6 +394,10 @@ static RK_U32 update_vepu580_syntax(HalH264eVepu580Ctx *ctx, MppSyntax *syntax)
|
|||||||
hal_h264e_dbg_detail("update pps");
|
hal_h264e_dbg_detail("update pps");
|
||||||
ctx->pps = desc->p;
|
ctx->pps = desc->p;
|
||||||
} break;
|
} break;
|
||||||
|
case H264E_SYN_DPB : {
|
||||||
|
hal_h264e_dbg_detail("update dpb");
|
||||||
|
ctx->dpb = desc->p;
|
||||||
|
} break;
|
||||||
case H264E_SYN_SLICE : {
|
case H264E_SYN_SLICE : {
|
||||||
hal_h264e_dbg_detail("update slice");
|
hal_h264e_dbg_detail("update slice");
|
||||||
ctx->slice = desc->p;
|
ctx->slice = desc->p;
|
||||||
@@ -419,6 +426,7 @@ static MPP_RET hal_h264e_vepu580_get_task(void *hal, HalEncTask *task)
|
|||||||
HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
|
HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
|
||||||
RK_U32 updated = update_vepu580_syntax(ctx, &task->syntax);
|
RK_U32 updated = update_vepu580_syntax(ctx, &task->syntax);
|
||||||
EncFrmStatus *frm_status = &task->rc_task->frm;
|
EncFrmStatus *frm_status = &task->rc_task->frm;
|
||||||
|
H264eFrmInfo *frms = ctx->frms;
|
||||||
|
|
||||||
hal_h264e_dbg_func("enter %p\n", hal);
|
hal_h264e_dbg_func("enter %p\n", hal);
|
||||||
|
|
||||||
@@ -433,7 +441,15 @@ static MPP_RET hal_h264e_vepu580_get_task(void *hal, HalEncTask *task)
|
|||||||
mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&ctx->osd_cfg.osd_data2, NULL);
|
mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&ctx->osd_cfg.osd_data2, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->dpb) {
|
||||||
|
h264e_dpb_hal_start(ctx->dpb, frms->curr_idx);
|
||||||
|
h264e_dpb_hal_start(ctx->dpb, frms->refr_idx);
|
||||||
|
}
|
||||||
|
|
||||||
task->flags.reg_idx = ctx->task_idx;
|
task->flags.reg_idx = ctx->task_idx;
|
||||||
|
task->flags.curr_idx = frms->curr_idx;
|
||||||
|
task->flags.refr_idx = frms->refr_idx;
|
||||||
|
|
||||||
ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
|
ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
|
||||||
ctx->regs_set = &ctx->regs_sets[ctx->task_idx];
|
ctx->regs_set = &ctx->regs_sets[ctx->task_idx];
|
||||||
ctx->osd_cfg.reg_base = &ctx->regs_set->reg_osd;
|
ctx->osd_cfg.reg_base = &ctx->regs_set->reg_osd;
|
||||||
@@ -2072,6 +2088,11 @@ static MPP_RET hal_h264e_vepu580_ret_task(void *hal, HalEncTask *task)
|
|||||||
|
|
||||||
mpp_dev_multi_offset_reset(ctx->offsets);
|
mpp_dev_multi_offset_reset(ctx->offsets);
|
||||||
|
|
||||||
|
if (ctx->dpb) {
|
||||||
|
h264e_dpb_hal_end(ctx->dpb, task->flags.curr_idx);
|
||||||
|
h264e_dpb_hal_end(ctx->dpb, task->flags.refr_idx);
|
||||||
|
}
|
||||||
|
|
||||||
hal_h264e_dbg_func("leave %p\n", hal);
|
hal_h264e_dbg_func("leave %p\n", hal);
|
||||||
|
|
||||||
return MPP_OK;
|
return MPP_OK;
|
||||||
|
Reference in New Issue
Block a user