1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */ 2*437bfbebSnyanmisaka /* 3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd. 4*437bfbebSnyanmisaka */ 5*437bfbebSnyanmisaka 6*437bfbebSnyanmisaka #ifndef __MPP_H__ 7*437bfbebSnyanmisaka #define __MPP_H__ 8*437bfbebSnyanmisaka 9*437bfbebSnyanmisaka #include "mpp_queue.h" 10*437bfbebSnyanmisaka #include "mpp_task_impl.h" 11*437bfbebSnyanmisaka 12*437bfbebSnyanmisaka #include "mpp_dec.h" 13*437bfbebSnyanmisaka #include "mpp_enc.h" 14*437bfbebSnyanmisaka #include "mpp_impl.h" 15*437bfbebSnyanmisaka #include "kmpp_obj.h" 16*437bfbebSnyanmisaka #include "kmpp.h" 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka #ifdef __cplusplus 19*437bfbebSnyanmisaka extern "C" { 20*437bfbebSnyanmisaka #endif 21*437bfbebSnyanmisaka 22*437bfbebSnyanmisaka #define MPP_DBG_FUNCTION (0x00000001) 23*437bfbebSnyanmisaka #define MPP_DBG_PACKET (0x00000002) 24*437bfbebSnyanmisaka #define MPP_DBG_FRAME (0x00000004) 25*437bfbebSnyanmisaka #define MPP_DBG_BUFFER (0x00000008) 26*437bfbebSnyanmisaka 27*437bfbebSnyanmisaka /* 28*437bfbebSnyanmisaka * mpp notify event flags 29*437bfbebSnyanmisaka * When event happens mpp will signal deocder / encoder with different flag. 30*437bfbebSnyanmisaka * These event will wake up the codec thread or hal thread 31*437bfbebSnyanmisaka */ 32*437bfbebSnyanmisaka #define MPP_INPUT_ENQUEUE (0x00000001) 33*437bfbebSnyanmisaka #define MPP_OUTPUT_DEQUEUE (0x00000002) 34*437bfbebSnyanmisaka #define MPP_INPUT_DEQUEUE (0x00000004) 35*437bfbebSnyanmisaka #define MPP_OUTPUT_ENQUEUE (0x00000008) 36*437bfbebSnyanmisaka #define MPP_RESET (0xFFFFFFFF) 37*437bfbebSnyanmisaka 38*437bfbebSnyanmisaka /* mpp dec event flags */ 39*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_PACKET_ENQUEUE (MPP_INPUT_ENQUEUE) 40*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_FRAME_DEQUEUE (MPP_OUTPUT_DEQUEUE) 41*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_EXT_BUF_GRP_READY (0x00000010) 42*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_INFO_CHG_DONE (0x00000020) 43*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_BUFFER_VALID (0x00000040) 44*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_TASK_ALL_DONE (0x00000080) 45*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_TASK_HND_VALID (0x00000100) 46*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_TASK_PREV_DONE (0x00000200) 47*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_BUFFER_MATCH (0x00000400) 48*437bfbebSnyanmisaka #define MPP_DEC_NOTIFY_SLOT_VALID (0x00004000) 49*437bfbebSnyanmisaka #define MPP_DEC_CONTROL (0x00010000) 50*437bfbebSnyanmisaka #define MPP_DEC_RESET (MPP_RESET) 51*437bfbebSnyanmisaka 52*437bfbebSnyanmisaka /* mpp enc event flags */ 53*437bfbebSnyanmisaka #define MPP_ENC_NOTIFY_FRAME_ENQUEUE (MPP_INPUT_ENQUEUE) 54*437bfbebSnyanmisaka #define MPP_ENC_NOTIFY_PACKET_DEQUEUE (MPP_OUTPUT_DEQUEUE) 55*437bfbebSnyanmisaka #define MPP_ENC_NOTIFY_FRAME_DEQUEUE (MPP_INPUT_DEQUEUE) 56*437bfbebSnyanmisaka #define MPP_ENC_NOTIFY_PACKET_ENQUEUE (MPP_OUTPUT_ENQUEUE) 57*437bfbebSnyanmisaka #define MPP_ENC_CONTROL (0x00000010) 58*437bfbebSnyanmisaka #define MPP_ENC_RESET (MPP_RESET) 59*437bfbebSnyanmisaka 60*437bfbebSnyanmisaka typedef enum MppIOMode_e { 61*437bfbebSnyanmisaka MPP_IO_MODE_DEFAULT = -1, 62*437bfbebSnyanmisaka MPP_IO_MODE_NORMAL = 0, 63*437bfbebSnyanmisaka MPP_IO_MODE_TASK = 1, 64*437bfbebSnyanmisaka MPP_IO_MODE_BUTT, 65*437bfbebSnyanmisaka } MppIoMode; 66*437bfbebSnyanmisaka 67*437bfbebSnyanmisaka /* 68*437bfbebSnyanmisaka * mpp hierarchy 69*437bfbebSnyanmisaka * 70*437bfbebSnyanmisaka * mpp layer create mpp_dec or mpp_dec instance 71*437bfbebSnyanmisaka * mpp_dec create its parser and hal module 72*437bfbebSnyanmisaka * mpp_enc create its control and hal module 73*437bfbebSnyanmisaka * 74*437bfbebSnyanmisaka * +-------+ 75*437bfbebSnyanmisaka * | | 76*437bfbebSnyanmisaka * +-------------+ mpp +-------------+ 77*437bfbebSnyanmisaka * | | | | 78*437bfbebSnyanmisaka * | +-------+ | 79*437bfbebSnyanmisaka * | | 80*437bfbebSnyanmisaka * | | 81*437bfbebSnyanmisaka * | | 82*437bfbebSnyanmisaka * +-----+-----+ +-----+-----+ 83*437bfbebSnyanmisaka * | | | | 84*437bfbebSnyanmisaka * +---+ mpp_dec +--+ +--+ mpp_enc +---+ 85*437bfbebSnyanmisaka * | | | | | | | | 86*437bfbebSnyanmisaka * | +-----------+ | | +-----------+ | 87*437bfbebSnyanmisaka * | | | | 88*437bfbebSnyanmisaka * | | | | 89*437bfbebSnyanmisaka * | | | | 90*437bfbebSnyanmisaka * +-------v------+ +-----v-----+ +-----v-----+ +------v-------+ 91*437bfbebSnyanmisaka * | | | | | | | | 92*437bfbebSnyanmisaka * | dec_parser | | dec_hal | | enc_hal | | enc_control | 93*437bfbebSnyanmisaka * | | | | | | | | 94*437bfbebSnyanmisaka * +--------------+ +-----------+ +-----------+ +--------------+ 95*437bfbebSnyanmisaka */ 96*437bfbebSnyanmisaka 97*437bfbebSnyanmisaka typedef struct Mpp { 98*437bfbebSnyanmisaka /* Public members that were previously public in C++ class */ 99*437bfbebSnyanmisaka MppList *mPktIn; 100*437bfbebSnyanmisaka MppList *mPktOut; 101*437bfbebSnyanmisaka MppList *mFrmIn; 102*437bfbebSnyanmisaka MppList *mFrmOut; 103*437bfbebSnyanmisaka /* counters for debug */ 104*437bfbebSnyanmisaka RK_U32 mPacketPutCount; 105*437bfbebSnyanmisaka RK_U32 mPacketGetCount; 106*437bfbebSnyanmisaka RK_U32 mFramePutCount; 107*437bfbebSnyanmisaka RK_U32 mFrameGetCount; 108*437bfbebSnyanmisaka RK_U32 mTaskPutCount; 109*437bfbebSnyanmisaka RK_U32 mTaskGetCount; 110*437bfbebSnyanmisaka 111*437bfbebSnyanmisaka /* 112*437bfbebSnyanmisaka * packet buffer group 113*437bfbebSnyanmisaka * - packets in I/O, can be ion buffer or normal buffer 114*437bfbebSnyanmisaka * frame buffer group 115*437bfbebSnyanmisaka * - frames in I/O, normally should be a ion buffer group 116*437bfbebSnyanmisaka */ 117*437bfbebSnyanmisaka MppBufferGroup mPacketGroup; 118*437bfbebSnyanmisaka MppBufferGroup mFrameGroup; 119*437bfbebSnyanmisaka RK_U32 mExternalBufferMode; 120*437bfbebSnyanmisaka 121*437bfbebSnyanmisaka /* 122*437bfbebSnyanmisaka * Mpp task queue for advance task mode 123*437bfbebSnyanmisaka */ 124*437bfbebSnyanmisaka /* 125*437bfbebSnyanmisaka * Task data flow: 126*437bfbebSnyanmisaka * | 127*437bfbebSnyanmisaka * user | mpp 128*437bfbebSnyanmisaka * mInputTaskQueue 129*437bfbebSnyanmisaka * mUsrInPort -> | -> mMppInPort 130*437bfbebSnyanmisaka * | | 131*437bfbebSnyanmisaka * | v 132*437bfbebSnyanmisaka * | process 133*437bfbebSnyanmisaka * | | 134*437bfbebSnyanmisaka * | v 135*437bfbebSnyanmisaka * mUsrOutPort <- | <- mMppOutPort 136*437bfbebSnyanmisaka * mOutputTaskQueue 137*437bfbebSnyanmisaka */ 138*437bfbebSnyanmisaka MppPort mUsrInPort; 139*437bfbebSnyanmisaka MppPort mUsrOutPort; 140*437bfbebSnyanmisaka MppPort mMppInPort; 141*437bfbebSnyanmisaka MppPort mMppOutPort; 142*437bfbebSnyanmisaka MppTaskQueue mInputTaskQueue; 143*437bfbebSnyanmisaka MppTaskQueue mOutputTaskQueue; 144*437bfbebSnyanmisaka RK_S32 mInputTaskCount; 145*437bfbebSnyanmisaka RK_S32 mOutputTaskCount; 146*437bfbebSnyanmisaka 147*437bfbebSnyanmisaka MppPollType mInputTimeout; 148*437bfbebSnyanmisaka MppPollType mOutputTimeout; 149*437bfbebSnyanmisaka 150*437bfbebSnyanmisaka MppTask mInputTask; 151*437bfbebSnyanmisaka MppTask mEosTask; 152*437bfbebSnyanmisaka 153*437bfbebSnyanmisaka MppCtx mCtx; 154*437bfbebSnyanmisaka MppDec mDec; 155*437bfbebSnyanmisaka MppEnc mEnc; 156*437bfbebSnyanmisaka 157*437bfbebSnyanmisaka RK_U32 mEncAyncIo; 158*437bfbebSnyanmisaka RK_U32 mEncAyncProc; 159*437bfbebSnyanmisaka MppIoMode mIoMode; 160*437bfbebSnyanmisaka RK_U32 mDisableThread; 161*437bfbebSnyanmisaka 162*437bfbebSnyanmisaka /* dump info for debug */ 163*437bfbebSnyanmisaka MppDump mDump; 164*437bfbebSnyanmisaka 165*437bfbebSnyanmisaka /* kmpp infos */ 166*437bfbebSnyanmisaka Kmpp *mKmpp; 167*437bfbebSnyanmisaka KmppObj mVencInitKcfg; 168*437bfbebSnyanmisaka 169*437bfbebSnyanmisaka MppCtxType mType; 170*437bfbebSnyanmisaka MppCodingType mCoding; 171*437bfbebSnyanmisaka 172*437bfbebSnyanmisaka RK_U32 mInitDone; 173*437bfbebSnyanmisaka 174*437bfbebSnyanmisaka RK_U32 mStatus; 175*437bfbebSnyanmisaka 176*437bfbebSnyanmisaka /* decoder paramter before init */ 177*437bfbebSnyanmisaka MppDecCfg mDecCfg; 178*437bfbebSnyanmisaka RK_U32 mParserFastMode; 179*437bfbebSnyanmisaka RK_U32 mParserNeedSplit; 180*437bfbebSnyanmisaka RK_U32 mParserInternalPts; /* for MPEG2/MPEG4 */ 181*437bfbebSnyanmisaka RK_U32 mImmediateOut; 182*437bfbebSnyanmisaka /* backup extra packet for seek */ 183*437bfbebSnyanmisaka MppPacket mExtraPacket; 184*437bfbebSnyanmisaka } Mpp; 185*437bfbebSnyanmisaka 186*437bfbebSnyanmisaka MPP_RET mpp_ctx_create(Mpp **mpp, MppCtx ctx); 187*437bfbebSnyanmisaka MPP_RET mpp_ctx_destroy(Mpp *mpp); 188*437bfbebSnyanmisaka MPP_RET mpp_ctx_init(Mpp *mpp, MppCtxType type, MppCodingType coding); 189*437bfbebSnyanmisaka void mpp_clear(Mpp *mpp); 190*437bfbebSnyanmisaka 191*437bfbebSnyanmisaka /* Control functions */ 192*437bfbebSnyanmisaka MPP_RET mpp_start(Mpp *mpp); 193*437bfbebSnyanmisaka MPP_RET mpp_stop(Mpp *mpp); 194*437bfbebSnyanmisaka MPP_RET mpp_pause(Mpp *mpp); 195*437bfbebSnyanmisaka MPP_RET mpp_resume(Mpp *mpp); 196*437bfbebSnyanmisaka 197*437bfbebSnyanmisaka /* Data processing functions */ 198*437bfbebSnyanmisaka MPP_RET mpp_put_packet(Mpp *mpp, MppPacket packet); 199*437bfbebSnyanmisaka MPP_RET mpp_get_frame(Mpp *mpp, MppFrame *frame); 200*437bfbebSnyanmisaka MPP_RET mpp_get_frame_noblock(Mpp *mpp, MppFrame *frame); 201*437bfbebSnyanmisaka 202*437bfbebSnyanmisaka MPP_RET mpp_put_frame(Mpp *mpp, MppFrame frame); 203*437bfbebSnyanmisaka MPP_RET mpp_get_packet(Mpp *mpp, MppPacket *packet); 204*437bfbebSnyanmisaka 205*437bfbebSnyanmisaka /* Task queue functions */ 206*437bfbebSnyanmisaka MPP_RET mpp_poll(Mpp *mpp, MppPortType type, MppPollType timeout); 207*437bfbebSnyanmisaka MPP_RET mpp_dequeue(Mpp *mpp, MppPortType type, MppTask *task); 208*437bfbebSnyanmisaka MPP_RET mpp_enqueue(Mpp *mpp, MppPortType type, MppTask task); 209*437bfbebSnyanmisaka 210*437bfbebSnyanmisaka /* Decode function */ 211*437bfbebSnyanmisaka MPP_RET mpp_decode(Mpp *mpp, MppPacket packet, MppFrame *frame); 212*437bfbebSnyanmisaka 213*437bfbebSnyanmisaka /* System functions */ 214*437bfbebSnyanmisaka MPP_RET mpp_reset(Mpp *mpp); 215*437bfbebSnyanmisaka MPP_RET mpp_control(Mpp *mpp, MpiCmd cmd, MppParam param); 216*437bfbebSnyanmisaka 217*437bfbebSnyanmisaka /* Notification functions */ 218*437bfbebSnyanmisaka MPP_RET mpp_notify_flag(Mpp *mpp, RK_U32 flag); 219*437bfbebSnyanmisaka MPP_RET mpp_notify_group(Mpp *mpp, MppBufferGroup group); 220*437bfbebSnyanmisaka 221*437bfbebSnyanmisaka MPP_RET mpp_control_mpp(Mpp *mpp, MpiCmd cmd, MppParam param); 222*437bfbebSnyanmisaka MPP_RET mpp_control_osal(Mpp *mpp, MpiCmd cmd, MppParam param); 223*437bfbebSnyanmisaka MPP_RET mpp_control_codec(Mpp *mpp, MpiCmd cmd, MppParam param); 224*437bfbebSnyanmisaka MPP_RET mpp_control_dec(Mpp *mpp, MpiCmd cmd, MppParam param); 225*437bfbebSnyanmisaka MPP_RET mpp_control_enc(Mpp *mpp, MpiCmd cmd, MppParam param); 226*437bfbebSnyanmisaka MPP_RET mpp_control_isp(Mpp *mpp, MpiCmd cmd, MppParam param); 227*437bfbebSnyanmisaka 228*437bfbebSnyanmisaka /* for special encoder async io mode */ 229*437bfbebSnyanmisaka MPP_RET mpp_put_frame_async(Mpp *mpp, MppFrame frame); 230*437bfbebSnyanmisaka MPP_RET mpp_get_packet_async(Mpp *mpp, MppPacket *packet); 231*437bfbebSnyanmisaka 232*437bfbebSnyanmisaka void mpp_set_io_mode(Mpp *mpp, MppIoMode mode); 233*437bfbebSnyanmisaka 234*437bfbebSnyanmisaka #ifdef __cplusplus 235*437bfbebSnyanmisaka } 236*437bfbebSnyanmisaka #endif 237*437bfbebSnyanmisaka 238*437bfbebSnyanmisaka #endif /*__MPP_H__*/ 239