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