xref: /rockchip-linux_mpp/inc/rk_mpi.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #ifndef __RK_MPI_H__
18*437bfbebSnyanmisaka #define __RK_MPI_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka /**
21*437bfbebSnyanmisaka  * @addtogroup rk_mpi
22*437bfbebSnyanmisaka  * @brief Rockchip Media Process Interface
23*437bfbebSnyanmisaka  * @details Media Process Platform(MPP) provides application programming
24*437bfbebSnyanmisaka  *          interface for the application layer, by which applications can
25*437bfbebSnyanmisaka  *          call hardware encode and decode. Current MPP fully supports
26*437bfbebSnyanmisaka  *          chipset RK3288/RK3228/RK3229/RK3399/RK3328/RV1108. Old chipset
27*437bfbebSnyanmisaka  *          like RK29xx/RK30xx/RK31XX/RK3368 is partly supported due to lack
28*437bfbebSnyanmisaka  *          of some hardware register generation module.
29*437bfbebSnyanmisaka  */
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #include "rk_mpi_cmd.h"
32*437bfbebSnyanmisaka #include "mpp_task.h"
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka /**
35*437bfbebSnyanmisaka  * @ingroup rk_mpi
36*437bfbebSnyanmisaka  * @brief MPP main work function set
37*437bfbebSnyanmisaka  * @details all api function are seperated into two sets: data io api set
38*437bfbebSnyanmisaka  *          and control api set
39*437bfbebSnyanmisaka  *
40*437bfbebSnyanmisaka  * (1). the data api set is for data input/output flow including:
41*437bfbebSnyanmisaka  *
42*437bfbebSnyanmisaka  * (1.1) simple data api set:
43*437bfbebSnyanmisaka  *
44*437bfbebSnyanmisaka  * decode   : both send video stream packet to decoder and get video frame from
45*437bfbebSnyanmisaka  *            decoder at the same time.
46*437bfbebSnyanmisaka  *
47*437bfbebSnyanmisaka  * encode   : both send video frame to encoder and get encoded video stream from
48*437bfbebSnyanmisaka  *            encoder at the same time.
49*437bfbebSnyanmisaka  *
50*437bfbebSnyanmisaka  * decode_put_packet: send video stream packet to decoder only, async interface
51*437bfbebSnyanmisaka  *
52*437bfbebSnyanmisaka  * decode_get_frame : get video frame from decoder only, async interface
53*437bfbebSnyanmisaka  *
54*437bfbebSnyanmisaka  * encode_put_frame : send video frame to encoder only, async interface
55*437bfbebSnyanmisaka  *
56*437bfbebSnyanmisaka  * encode_get_packet: get encoded video packet from encoder only, async interface
57*437bfbebSnyanmisaka  *
58*437bfbebSnyanmisaka  * (1.2) advanced task api set:
59*437bfbebSnyanmisaka  *
60*437bfbebSnyanmisaka  * poll     : poll port for dequeue
61*437bfbebSnyanmisaka  *
62*437bfbebSnyanmisaka  * dequeue  : pop a task from mpp task queue
63*437bfbebSnyanmisaka  *
64*437bfbebSnyanmisaka  * enqueue  : push a task to mpp task queue
65*437bfbebSnyanmisaka  *
66*437bfbebSnyanmisaka  * (2). the control api set is for mpp context control including:
67*437bfbebSnyanmisaka  *
68*437bfbebSnyanmisaka  * control  : similiar to ioctl in kernel driver, setup or get mpp internal parameter
69*437bfbebSnyanmisaka  *
70*437bfbebSnyanmisaka  * reset    : clear all data in mpp context, discard all packet and frame,
71*437bfbebSnyanmisaka  *            reset all components to initialized status
72*437bfbebSnyanmisaka  */
73*437bfbebSnyanmisaka typedef struct MppApi_t {
74*437bfbebSnyanmisaka     /**
75*437bfbebSnyanmisaka      * @brief size of struct MppApi
76*437bfbebSnyanmisaka      */
77*437bfbebSnyanmisaka     RK_U32  size;
78*437bfbebSnyanmisaka     /**
79*437bfbebSnyanmisaka      * @brief mpp api version, generated by Git
80*437bfbebSnyanmisaka      */
81*437bfbebSnyanmisaka     RK_U32  version;
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     // simple data flow interface
84*437bfbebSnyanmisaka     /**
85*437bfbebSnyanmisaka      * @brief both send video stream packet to decoder and get video frame from
86*437bfbebSnyanmisaka      *        decoder at the same time
87*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
88*437bfbebSnyanmisaka      *                by mpp_init().
89*437bfbebSnyanmisaka      * @param[in] packet The input video stream, its usage can refer mpp_packet.h.
90*437bfbebSnyanmisaka      * @param[out] frame The output picture, its usage can refer mpp_frame.h.
91*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
92*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
93*437bfbebSnyanmisaka      */
94*437bfbebSnyanmisaka     MPP_RET (*decode)(MppCtx ctx, MppPacket packet, MppFrame *frame);
95*437bfbebSnyanmisaka     /**
96*437bfbebSnyanmisaka      * @brief send video stream packet to decoder only, async interface
97*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
98*437bfbebSnyanmisaka      *                by mpp_init().
99*437bfbebSnyanmisaka      * @param[in] packet The input video stream, its usage can refer mpp_packet.h.
100*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
101*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
102*437bfbebSnyanmisaka      */
103*437bfbebSnyanmisaka     MPP_RET (*decode_put_packet)(MppCtx ctx, MppPacket packet);
104*437bfbebSnyanmisaka     /**
105*437bfbebSnyanmisaka      * @brief get video frame from decoder only, async interface
106*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
107*437bfbebSnyanmisaka      *                by mpp_init().
108*437bfbebSnyanmisaka      * @param[out] frame The output picture, its usage can refer mpp_frame.h.
109*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
110*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
111*437bfbebSnyanmisaka      */
112*437bfbebSnyanmisaka     MPP_RET (*decode_get_frame)(MppCtx ctx, MppFrame *frame);
113*437bfbebSnyanmisaka     /**
114*437bfbebSnyanmisaka      * @brief both send video frame to encoder and get encoded video stream from
115*437bfbebSnyanmisaka      *        encoder at the same time
116*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
117*437bfbebSnyanmisaka      *                by mpp_init().
118*437bfbebSnyanmisaka      * @param[in] frame The input video data, its usage can refer mpp_frame.h.
119*437bfbebSnyanmisaka      * @param[out] packet The output compressed data, its usage can refer mpp_packet.h.
120*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
121*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
122*437bfbebSnyanmisaka      */
123*437bfbebSnyanmisaka     MPP_RET (*encode)(MppCtx ctx, MppFrame frame, MppPacket *packet);
124*437bfbebSnyanmisaka     /**
125*437bfbebSnyanmisaka      * @brief send video frame to encoder only, async interface
126*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
127*437bfbebSnyanmisaka      *                by mpp_init().
128*437bfbebSnyanmisaka      * @param[in] frame The input video data, its usage can refer mpp_frame.h.
129*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
130*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
131*437bfbebSnyanmisaka      */
132*437bfbebSnyanmisaka     MPP_RET (*encode_put_frame)(MppCtx ctx, MppFrame frame);
133*437bfbebSnyanmisaka     /**
134*437bfbebSnyanmisaka      * @brief get encoded video packet from encoder only, async interface
135*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
136*437bfbebSnyanmisaka      *                by mpp_init().
137*437bfbebSnyanmisaka      * @param[out] packet The output compressed data, its usage can refer mpp_packet.h.
138*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
139*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
140*437bfbebSnyanmisaka      */
141*437bfbebSnyanmisaka     MPP_RET (*encode_get_packet)(MppCtx ctx, MppPacket *packet);
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka     /**
144*437bfbebSnyanmisaka      * @brief ISP interface, will be supported in the future.
145*437bfbebSnyanmisaka      */
146*437bfbebSnyanmisaka     MPP_RET (*isp)(MppCtx ctx, MppFrame dst, MppFrame src);
147*437bfbebSnyanmisaka     /**
148*437bfbebSnyanmisaka      * @brief ISP interface, will be supported in the future.
149*437bfbebSnyanmisaka      */
150*437bfbebSnyanmisaka     MPP_RET (*isp_put_frame)(MppCtx ctx, MppFrame frame);
151*437bfbebSnyanmisaka     /**
152*437bfbebSnyanmisaka      * @brief ISP interface, will be supported in the future.
153*437bfbebSnyanmisaka      */
154*437bfbebSnyanmisaka     MPP_RET (*isp_get_frame)(MppCtx ctx, MppFrame *frame);
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     // advance data flow interface
157*437bfbebSnyanmisaka     /**
158*437bfbebSnyanmisaka      * @brief poll port for dequeue
159*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
160*437bfbebSnyanmisaka      *                by mpp_init().
161*437bfbebSnyanmisaka      * @param[in] type input port or output port which are both for data transaction
162*437bfbebSnyanmisaka      * @param[in] timeout mpp poll type, its usage can refer mpp_task.h.
163*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
164*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
165*437bfbebSnyanmisaka      */
166*437bfbebSnyanmisaka     MPP_RET (*poll)(MppCtx ctx, MppPortType type, MppPollType timeout);
167*437bfbebSnyanmisaka     /**
168*437bfbebSnyanmisaka      * @brief dequeue MppTask, pop a task from mpp task queue
169*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
170*437bfbebSnyanmisaka      *                by mpp_init().
171*437bfbebSnyanmisaka      * @param[in] type input port or output port which are both for data transaction
172*437bfbebSnyanmisaka      * @param[out] task MppTask popped from mpp task queue, its usage can refer mpp_task.h.
173*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
174*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
175*437bfbebSnyanmisaka      */
176*437bfbebSnyanmisaka     MPP_RET (*dequeue)(MppCtx ctx, MppPortType type, MppTask *task);
177*437bfbebSnyanmisaka     /**
178*437bfbebSnyanmisaka      * @brief enqueue MppTask, push a task to mpp task queue
179*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
180*437bfbebSnyanmisaka      *                by mpp_init().
181*437bfbebSnyanmisaka      * @param[in] type input port or output port which are both for data transaction
182*437bfbebSnyanmisaka      * @param[in] task MppTask which is sent to mpp for process, its usage can refer mpp_task.h.
183*437bfbebSnyanmisaka      * @return 0 and positive for success, negative for failure. The return
184*437bfbebSnyanmisaka      *         value is an error code. For details, please refer mpp_err.h.
185*437bfbebSnyanmisaka      */
186*437bfbebSnyanmisaka     MPP_RET (*enqueue)(MppCtx ctx, MppPortType type, MppTask task);
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka     // control interface
189*437bfbebSnyanmisaka     /**
190*437bfbebSnyanmisaka      * @brief discard all packet and frame, reset all component,
191*437bfbebSnyanmisaka      *        for both decoder and encoder
192*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
193*437bfbebSnyanmisaka      *                by mpp_init().
194*437bfbebSnyanmisaka      * @return 0 for success, others for failure. The return value is an
195*437bfbebSnyanmisaka      *         error code. For details, please refer mpp_err.h.
196*437bfbebSnyanmisaka      */
197*437bfbebSnyanmisaka     MPP_RET (*reset)(MppCtx ctx);
198*437bfbebSnyanmisaka     /**
199*437bfbebSnyanmisaka      * @brief control function for mpp property setting
200*437bfbebSnyanmisaka      * @param[in] ctx The context of mpp, created by mpp_create() and initiated
201*437bfbebSnyanmisaka      *                by mpp_init().
202*437bfbebSnyanmisaka      * @param[in] cmd The mpi command, its definition can refer rk_mpi_cmd.h.
203*437bfbebSnyanmisaka      * @param[in,out] param The mpi command parameter
204*437bfbebSnyanmisaka      * @return 0 for success, others for failure. The return value is an
205*437bfbebSnyanmisaka      *         error code. For details, please refer mpp_err.h.
206*437bfbebSnyanmisaka      */
207*437bfbebSnyanmisaka     MPP_RET (*control)(MppCtx ctx, MpiCmd cmd, MppParam param);
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka     /**
210*437bfbebSnyanmisaka      * @brief The reserved segment, may be used in the future
211*437bfbebSnyanmisaka      */
212*437bfbebSnyanmisaka     RK_U32 reserv[16];
213*437bfbebSnyanmisaka } MppApi;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka #ifdef __cplusplus
217*437bfbebSnyanmisaka extern "C" {
218*437bfbebSnyanmisaka #endif
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka /**
221*437bfbebSnyanmisaka  * @ingroup rk_mpi
222*437bfbebSnyanmisaka  * @brief Create empty context structure and mpi function pointers.
223*437bfbebSnyanmisaka  *        Use functions in MppApi to access mpp services.
224*437bfbebSnyanmisaka  * @param[in,out] ctx pointer of the mpp context, refer to MpiImpl_t.
225*437bfbebSnyanmisaka  * @param[in,out] mpi pointer of mpi function, refer to MppApi.
226*437bfbebSnyanmisaka  * @return 0 for success, others for failure. The return value is an
227*437bfbebSnyanmisaka  *         error code. For details, please refer mpp_err.h.
228*437bfbebSnyanmisaka  * @note This interface creates base flow context, all function calls
229*437bfbebSnyanmisaka  *       are based on it.
230*437bfbebSnyanmisaka  */
231*437bfbebSnyanmisaka MPP_RET mpp_create(MppCtx *ctx, MppApi **mpi);
232*437bfbebSnyanmisaka /**
233*437bfbebSnyanmisaka  * @ingroup rk_mpi
234*437bfbebSnyanmisaka  * @brief Call after mpp_create to setup mpp type and video format.
235*437bfbebSnyanmisaka  *        This function will call internal context init function.
236*437bfbebSnyanmisaka  * @param[in] ctx The context of mpp, created by mpp_create().
237*437bfbebSnyanmisaka  * @param[in] type specify decoder or encoder, refer to MppCtxType.
238*437bfbebSnyanmisaka  * @param[in] coding specify video compression coding, refer to MppCodingType.
239*437bfbebSnyanmisaka  * @return 0 for success, others for failure. The return value is an
240*437bfbebSnyanmisaka  *         error code. For details, please refer mpp_err.h.
241*437bfbebSnyanmisaka  */
242*437bfbebSnyanmisaka MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding);
243*437bfbebSnyanmisaka /**
244*437bfbebSnyanmisaka  * @ingroup rk_mpi
245*437bfbebSnyanmisaka  * @brief Destroy mpp context and free both context and mpi structure,
246*437bfbebSnyanmisaka  *        it matches with mpp_init().
247*437bfbebSnyanmisaka  * @param[in] ctx The context of mpp, created by mpp_create().
248*437bfbebSnyanmisaka  * @return 0 for success, others for failure. The return value is an
249*437bfbebSnyanmisaka  *         error code. For details, please refer mpp_err.h.
250*437bfbebSnyanmisaka  */
251*437bfbebSnyanmisaka MPP_RET mpp_destroy(MppCtx ctx);
252*437bfbebSnyanmisaka /**
253*437bfbebSnyanmisaka  * @ingroup rk_mpi
254*437bfbebSnyanmisaka  * @brief judge given format is supported or not by MPP.
255*437bfbebSnyanmisaka  * @param[in] type specify decoder or encoder, refer to MppCtxType.
256*437bfbebSnyanmisaka  * @param[in] coding specify video compression coding, refer to MppCodingType.
257*437bfbebSnyanmisaka  * @return 0 for support, -1 for unsupported.
258*437bfbebSnyanmisaka  */
259*437bfbebSnyanmisaka MPP_RET mpp_check_support_format(MppCtxType type, MppCodingType coding);
260*437bfbebSnyanmisaka /**
261*437bfbebSnyanmisaka  * @ingroup rk_mpi
262*437bfbebSnyanmisaka  * @brief List all formats supported by MPP
263*437bfbebSnyanmisaka  * @param NULL no need to input parameter
264*437bfbebSnyanmisaka  * @return No return value. This function just prints format information supported
265*437bfbebSnyanmisaka  *         by MPP on standard output.
266*437bfbebSnyanmisaka  */
267*437bfbebSnyanmisaka void    mpp_show_support_format(void);
268*437bfbebSnyanmisaka void    mpp_show_color_format(void);
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka #ifdef __cplusplus
271*437bfbebSnyanmisaka }
272*437bfbebSnyanmisaka #endif
273*437bfbebSnyanmisaka 
274*437bfbebSnyanmisaka #endif /*__RK_MPI_H__*/
275