[mpp_dec]: Add mpp_dec_callback

NOTE: The MppCtx should be restored for external user.

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I2a4241ddacb14196f43b29a59b46658131ebfcee
This commit is contained in:
Herman Chen
2021-10-13 16:40:31 +08:00
parent 1894648650
commit 3aad89dee8
7 changed files with 56 additions and 13 deletions

View File

@@ -22,6 +22,13 @@
#include "rk_mpi_cmd.h" #include "rk_mpi_cmd.h"
#include "mpp_dec_cfg.h" #include "mpp_dec_cfg.h"
typedef enum MppDecEvent_e {
MPP_DEC_EVENT_ON_PKT_RELEASE,
MPP_DEC_EVENT_ON_FRM_READY,
MPP_DEC_EVENT_BUTT,
} MppDecEvent;
typedef void* MppDec; typedef void* MppDec;
typedef struct { typedef struct {
@@ -45,6 +52,7 @@ MPP_RET mpp_dec_reset(MppDec ctx);
MPP_RET mpp_dec_flush(MppDec ctx); MPP_RET mpp_dec_flush(MppDec ctx);
MPP_RET mpp_dec_control(MppDec ctx, MpiCmd cmd, void *param); MPP_RET mpp_dec_control(MppDec ctx, MpiCmd cmd, void *param);
MPP_RET mpp_dec_notify(MppDec ctx, RK_U32 flag); MPP_RET mpp_dec_notify(MppDec ctx, RK_U32 flag);
MPP_RET mpp_dec_callback(MppDec ctx, MppDecEvent event, void *arg);
/* update init cfg before init */ /* update init cfg before init */
MPP_RET mpp_dec_set_cfg_by_cmd(MppDecCfgSet *set, MpiCmd cmd, void *param); MPP_RET mpp_dec_set_cfg_by_cmd(MppDecCfgSet *set, MpiCmd cmd, void *param);

View File

@@ -203,6 +203,18 @@ static MPP_RET dec_release_task_in_port(MppPort port)
return ret; return ret;
} }
static void dec_release_input_packet(MppDecImpl *dec, RK_S32 force)
{
if (dec->mpp_pkt_in) {
if (force || 0 == mpp_packet_get_length(dec->mpp_pkt_in)) {
mpp_packet_deinit(&dec->mpp_pkt_in);
mpp_dec_callback(dec, MPP_DEC_EVENT_ON_PKT_RELEASE, dec->mpp_pkt_in);
dec->mpp_pkt_in = NULL;
}
}
}
static RK_U32 reset_parser_thread(Mpp *mpp, DecTask *task) static RK_U32 reset_parser_thread(Mpp *mpp, DecTask *task)
{ {
MppDecImpl *dec = (MppDecImpl *)mpp->mDec; MppDecImpl *dec = (MppDecImpl *)mpp->mDec;
@@ -265,10 +277,7 @@ static RK_U32 reset_parser_thread(Mpp *mpp, DecTask *task)
task->status.task_parsed_rdy = 0; task->status.task_parsed_rdy = 0;
} }
if (dec->mpp_pkt_in) { dec_release_input_packet(dec, 1);
mpp_packet_deinit(&dec->mpp_pkt_in);
dec->mpp_pkt_in = NULL;
}
while (MPP_OK == mpp_buf_slot_dequeue(frame_slots, &index, QUEUE_DISPLAY)) { while (MPP_OK == mpp_buf_slot_dequeue(frame_slots, &index, QUEUE_DISPLAY)) {
/* release extra ref in slot's MppBuffer */ /* release extra ref in slot's MppBuffer */
@@ -590,6 +599,8 @@ static void mpp_dec_put_frame(Mpp *mpp, RK_S32 index, HalDecTaskFlag flags)
if (fake_frame) if (fake_frame)
mpp_frame_deinit(&frame); mpp_frame_deinit(&frame);
mpp_dec_callback(dec, MPP_DEC_EVENT_ON_FRM_READY, out);
} }
} }
@@ -812,10 +823,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
mpp_parser_prepare(dec->parser, dec->mpp_pkt_in, task_dec); mpp_parser_prepare(dec->parser, dec->mpp_pkt_in, task_dec);
mpp_clock_pause(dec->clocks[DEC_PRS_PREPARE]); mpp_clock_pause(dec->clocks[DEC_PRS_PREPARE]);
if (0 == mpp_packet_get_length(dec->mpp_pkt_in)) { dec_release_input_packet(dec, 0);
mpp_packet_deinit(&dec->mpp_pkt_in);
dec->mpp_pkt_in = NULL;
}
} }
task->status.curr_task_rdy = task_dec->valid; task->status.curr_task_rdy = task_dec->valid;
@@ -1939,6 +1947,29 @@ MPP_RET mpp_dec_notify(MppDec ctx, RK_U32 flag)
return MPP_OK; return MPP_OK;
} }
MPP_RET mpp_dec_callback(MppDec ctx, MppDecEvent event, void *arg)
{
MppDecImpl *dec = (MppDecImpl *)ctx;
MppDecCbCfg *cb = &dec->cfg.cb;
Mpp *mpp = (Mpp *)dec->mpp;
MPP_RET ret = MPP_OK;
switch (event) {
case MPP_DEC_EVENT_ON_PKT_RELEASE : {
if (cb->pkt_rdy_cb)
ret = cb->pkt_rdy_cb(cb->pkt_rdy_ctx, mpp->mCtx, cb->pkt_rdy_cmd, arg);
} break;
case MPP_DEC_EVENT_ON_FRM_READY : {
if (cb->frm_rdy_cb)
ret = cb->frm_rdy_cb(cb->frm_rdy_ctx, mpp->mCtx, cb->frm_rdy_cmd, arg);
} break;
default : {
} break;
}
return ret;
}
MPP_RET mpp_dec_control(MppDec ctx, MpiCmd cmd, void *param) MPP_RET mpp_dec_control(MppDec ctx, MpiCmd cmd, void *param)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
@@ -2013,5 +2044,3 @@ MPP_RET mpp_dec_set_cfg_by_cmd(MppDecCfgSet *set, MpiCmd cmd, void *param)
return ret; return ret;
} }

View File

@@ -169,6 +169,7 @@ MPP_RET mpp_parser_callback(void *prs, void *err_info)
return MPP_OK; return MPP_OK;
return p->api->callback(p->ctx, err_info); return p->api->callback(p->ctx, err_info);
} }
MPP_RET mpp_parser_reset(Parser prs) MPP_RET mpp_parser_reset(Parser prs)
{ {
if (NULL == prs) { if (NULL == prs) {

View File

@@ -96,7 +96,7 @@
class Mpp class Mpp
{ {
public: public:
Mpp(); Mpp(MppCtx ctx);
~Mpp(); ~Mpp();
MPP_RET init(MppCtxType type, MppCodingType coding); MPP_RET init(MppCtxType type, MppCodingType coding);
@@ -173,6 +173,7 @@ public:
MppTask mInputTask; MppTask mInputTask;
MppTask mEosTask; MppTask mEosTask;
MppCtx mCtx;
MppDec mDec; MppDec mDec;
MppEnc mEnc; MppEnc mEnc;

View File

@@ -449,7 +449,7 @@ MPP_RET mpp_create(MppCtx *ctx, MppApi **mpi)
} }
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->ctx = new Mpp(); p->ctx = new Mpp(p);
if (NULL == p->ctx) { if (NULL == p->ctx) {
mpp_free(p); mpp_free(p);
mpp_err_f("failed to new Mpp\n"); mpp_err_f("failed to new Mpp\n");

View File

@@ -60,7 +60,7 @@ static void *list_wraper_frame(void *arg)
return NULL; return NULL;
} }
Mpp::Mpp() Mpp::Mpp(MppCtx ctx = NULL)
: mPackets(NULL), : mPackets(NULL),
mFrames(NULL), mFrames(NULL),
mTimeStamps(NULL), mTimeStamps(NULL),
@@ -83,6 +83,7 @@ Mpp::Mpp()
mOutputTimeout(MPP_POLL_BUTT), mOutputTimeout(MPP_POLL_BUTT),
mInputTask(NULL), mInputTask(NULL),
mEosTask(NULL), mEosTask(NULL),
mCtx(ctx),
mDec(NULL), mDec(NULL),
mEnc(NULL), mEnc(NULL),
mEncVersion(0), mEncVersion(0),

View File

@@ -95,6 +95,9 @@ static void dec_vproc_put_frame(Mpp *mpp, MppFrame frame, MppBuffer buf, RK_S64
mpp->mFramePutCount++; mpp->mFramePutCount++;
list->signal(); list->signal();
list->unlock(); list->unlock();
if (mpp->mDec)
mpp_dec_callback(mpp->mDec, MPP_DEC_EVENT_ON_FRM_READY, out);
} }
static void dec_vproc_clr_prev0(MppDecVprocCtxImpl *ctx) static void dec_vproc_clr_prev0(MppDecVprocCtxImpl *ctx)