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