mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-26 10:30:20 +08:00
[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:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user