xref: /rockchip-linux_mpp/mpp/inc/mpp.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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