From 0589fb5bd35152b17026f19d53d85fe848f4b4f8 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Wed, 13 Oct 2021 10:51:07 +0800 Subject: [PATCH] [mpp_dec_cfg]: Add external notification callback Add callback on two events: 1. packet ready and wait for new packet input. 2. frame ready and wait for output frame poll.e NOTE: Add callback command param for version compatible sync between user and mpp library. Change-Id: Ic41d495a06cf653acb6b5100699f1b7f5f735f2e Signed-off-by: Herman Chen --- inc/rk_vdec_cmd.h | 4 ++++ mpp/base/mpp_dec_cfg.cpp | 10 ++++++++-- mpp/codec/mpp_dec.cpp | 21 +++++++++++++++++++++ mpp/inc/mpp_dec_cfg.h | 24 ++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/inc/rk_vdec_cmd.h b/inc/rk_vdec_cmd.h index c0f542e5..adeeb35d 100644 --- a/inc/rk_vdec_cmd.h +++ b/inc/rk_vdec_cmd.h @@ -18,6 +18,7 @@ #define __RK_VDEC_CMD_H__ #include "rk_type.h" +#include "mpp_err.h" /* * decoder query interface is only for debug usage @@ -62,4 +63,7 @@ typedef struct MppDecQueryCfg_t { RK_U32 dec_out_frm_cnt; } MppDecQueryCfg; +typedef void* MppExtCbCtx; +typedef MPP_RET (*MppExtCbFunc)(MppExtCbCtx cb_ctx, MppCtx mpp, RK_S32 cmd, void *arg); + #endif /*__RK_VDEC_CMD_H__*/ diff --git a/mpp/base/mpp_dec_cfg.cpp b/mpp/base/mpp_dec_cfg.cpp index 12613ab6..f76bdfcf 100644 --- a/mpp/base/mpp_dec_cfg.cpp +++ b/mpp/base/mpp_dec_cfg.cpp @@ -161,7 +161,13 @@ static const char *dec_cfg_func_names[] = { ENTRY(base, internal_pts, U32, RK_U32, MPP_DEC_CFG_CHANGE_INTERNAL_PTS, base, internal_pts) \ ENTRY(base, sort_pts, U32, RK_U32, MPP_DEC_CFG_CHANGE_SORT_PTS, base, sort_pts) \ ENTRY(base, disable_error, U32, RK_U32, MPP_DEC_CFG_CHANGE_DISABLE_ERROR, base, disable_error) \ - ENTRY(base, enable_vproc, U32, RK_U32, MPP_DEC_CFG_CHANGE_ENABLE_VPROC, base, enable_vproc) + ENTRY(base, enable_vproc, U32, RK_U32, MPP_DEC_CFG_CHANGE_ENABLE_VPROC, base, enable_vproc) \ + ENTRY(cb, pkt_rdy_cb, PTR, MppExtCbFunc, MPP_DEC_CB_CFG_CHANGE_PKT_RDY, cb, pkt_rdy_cb) \ + ENTRY(cb, pkt_rdy_ctx, PTR, MppExtCbCtx, MPP_DEC_CB_CFG_CHANGE_PKT_RDY, cb, pkt_rdy_ctx) \ + ENTRY(cb, pkt_rdy_cmd, S32, RK_S32, MPP_DEC_CB_CFG_CHANGE_PKT_RDY, cb, pkt_rdy_cmd) \ + ENTRY(cb, frm_rdy_cb, PTR, MppExtCbFunc, MPP_DEC_CB_CFG_CHANGE_FRM_RDY, cb, frm_rdy_cb) \ + ENTRY(cb, frm_rdy_ctx, PTR, MppExtCbCtx, MPP_DEC_CB_CFG_CHANGE_FRM_RDY, cb, frm_rdy_ctx) \ + ENTRY(cb, frm_rdy_cmd, S32, RK_S32, MPP_DEC_CB_CFG_CHANGE_FRM_RDY, cb, frm_rdy_cmd) ENTRY_TABLE(EXPAND_AS_FUNC) ENTRY_TABLE(EXPAND_AS_API) @@ -175,7 +181,7 @@ RK_S32 dec_const_strlen(const char* str) return *str ? 1 + dec_const_strlen(str + 1) : 0; } -static RK_S32 dec_node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) + 39; +static RK_S32 dec_node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) + 16; class MppDecCfgService { diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 17d59303..a5065928 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -1515,6 +1515,7 @@ static const char *timing_str[DEC_TIMING_BUTT] = { MPP_RET mpp_dec_set_cfg(MppDecCfgSet *dst, MppDecCfgSet *src) { MppDecBaseCfg *src_base = &src->base; + MppDecCbCfg *src_cb = &src->cb; if (src_base->change) { MppDecBaseCfg *dst_base = &dst->base; @@ -1560,6 +1561,26 @@ MPP_RET mpp_dec_set_cfg(MppDecCfgSet *dst, MppDecCfgSet *src) src_base->change = 0; } + if (src_cb->change) { + MppDecCbCfg *dst_cb = &dst->cb; + RK_U32 change = src_cb->change; + + if (change & MPP_DEC_CB_CFG_CHANGE_PKT_RDY) { + dst_cb->pkt_rdy_cb = src_cb->pkt_rdy_cb; + dst_cb->pkt_rdy_ctx = src_cb->pkt_rdy_ctx; + dst_cb->pkt_rdy_cmd = src_cb->pkt_rdy_cmd; + } + + if (change & MPP_DEC_CB_CFG_CHANGE_FRM_RDY) { + dst_cb->frm_rdy_cb = src_cb->frm_rdy_cb; + dst_cb->frm_rdy_ctx = src_cb->frm_rdy_ctx; + dst_cb->frm_rdy_cmd = src_cb->frm_rdy_cmd; + } + + dst_cb->change = change; + src_cb->change = 0; + } + return MPP_OK; } diff --git a/mpp/inc/mpp_dec_cfg.h b/mpp/inc/mpp_dec_cfg.h index d471b29c..26750705 100644 --- a/mpp/inc/mpp_dec_cfg.h +++ b/mpp/inc/mpp_dec_cfg.h @@ -18,6 +18,7 @@ #define __MPP_DEC_CFG_H__ #include "mpp_frame.h" +#include "rk_vdec_cmd.h" typedef enum MppDecCfgChange_e { MPP_DEC_CFG_CHANGE_TYPE = (1 << 0), @@ -33,6 +34,7 @@ typedef enum MppDecCfgChange_e { MPP_DEC_CFG_CHANGE_SORT_PTS = (1 << 13), MPP_DEC_CFG_CHANGE_DISABLE_ERROR = (1 << 14), MPP_DEC_CFG_CHANGE_ENABLE_VPROC = (1 << 15), + MPP_DEC_CFG_CHANGE_ALL = (0xFFFFFFFF), } MppDecCfgChange; @@ -54,6 +56,27 @@ typedef struct MppDecBaseCfg_t { RK_U32 enable_vproc; } MppDecBaseCfg; +typedef enum MppDecCbCfgChange_e { + MPP_DEC_CB_CFG_CHANGE_PKT_RDY = (1 << 0), + MPP_DEC_CB_CFG_CHANGE_FRM_RDY = (1 << 1), + + MPP_DEC_CB_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppDecCbCfgChange; + +typedef struct MppDecCbCfg_t { + RK_U64 change; + + /* notify packet process done and can accept new packet */ + MppExtCbFunc pkt_rdy_cb; + MppExtCbCtx pkt_rdy_ctx; + RK_S32 pkt_rdy_cmd; + + /* notify frame ready for output */ + MppExtCbFunc frm_rdy_cb; + MppExtCbCtx frm_rdy_ctx; + RK_S32 frm_rdy_cmd; +} MppDecCbCfg; + typedef struct MppDecStatusCfg_t { RK_U32 hal_task_count; RK_U32 vproc_task_count; @@ -62,6 +85,7 @@ typedef struct MppDecStatusCfg_t { typedef struct MppDecCfgSet_t { MppDecBaseCfg base; MppDecStatusCfg status; + MppDecCbCfg cb; } MppDecCfgSet; /*