xref: /rockchip-linux_mpp/mpp/mpi.c (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 #define MODULE_TAG "mpi"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "rk_mpi.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "mpp_env.h"
13*437bfbebSnyanmisaka #include "mpp_mem.h"
14*437bfbebSnyanmisaka #include "mpp_debug.h"
15*437bfbebSnyanmisaka #include "mpp_common.h"
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #include "mpi_impl.h"
18*437bfbebSnyanmisaka #include "mpp_info.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka RK_U32 mpi_debug = 0;
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka typedef struct {
23*437bfbebSnyanmisaka     MppCtxType      type;
24*437bfbebSnyanmisaka     MppCodingType   coding;
25*437bfbebSnyanmisaka     const char      *type_name;
26*437bfbebSnyanmisaka     const char      *coding_name;
27*437bfbebSnyanmisaka } MppCodingTypeInfo;
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka static MppCodingTypeInfo support_list[] = {
30*437bfbebSnyanmisaka #if HAVE_MPEG2D
31*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingMPEG2,      "dec",  "mpeg2",        },
32*437bfbebSnyanmisaka #endif
33*437bfbebSnyanmisaka #if HAVE_MPEG4D
34*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingMPEG4,      "dec",  "mpeg4",        },
35*437bfbebSnyanmisaka #endif
36*437bfbebSnyanmisaka #if HAVE_H263D
37*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingH263,       "dec",  "h.263",        },
38*437bfbebSnyanmisaka #endif
39*437bfbebSnyanmisaka #if HAVE_H264D
40*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingAVC,        "dec",  "h.264/AVC",    },
41*437bfbebSnyanmisaka #endif
42*437bfbebSnyanmisaka #if HAVE_H265D
43*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingHEVC,       "dec",  "h.265/HEVC",   },
44*437bfbebSnyanmisaka #endif
45*437bfbebSnyanmisaka #if HAVE_VP8D
46*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingVP8,        "dec",  "vp8",          },
47*437bfbebSnyanmisaka #endif
48*437bfbebSnyanmisaka #if HAVE_VP9D
49*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingVP9,        "dec",  "VP9",          },
50*437bfbebSnyanmisaka #endif
51*437bfbebSnyanmisaka #if HAVE_AVSD
52*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingAVS,        "dec",  "avs",          },
53*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingAVSPLUS,    "dec",  "avs+",         },
54*437bfbebSnyanmisaka #endif
55*437bfbebSnyanmisaka #if HAVE_AVS2D
56*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingAVS2,       "dec",  "avs2",         },
57*437bfbebSnyanmisaka #endif
58*437bfbebSnyanmisaka #if HAVE_JPEGD
59*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingMJPEG,      "dec",  "jpeg",         },
60*437bfbebSnyanmisaka #endif
61*437bfbebSnyanmisaka #if HAVE_AV1D
62*437bfbebSnyanmisaka     {   MPP_CTX_DEC,    MPP_VIDEO_CodingAV1,        "dec",  "av1",          },
63*437bfbebSnyanmisaka #endif
64*437bfbebSnyanmisaka #if HAVE_H264E
65*437bfbebSnyanmisaka     {   MPP_CTX_ENC,    MPP_VIDEO_CodingAVC,        "enc",  "h.264/AVC",    },
66*437bfbebSnyanmisaka #endif
67*437bfbebSnyanmisaka #if HAVE_JPEGE
68*437bfbebSnyanmisaka     {   MPP_CTX_ENC,    MPP_VIDEO_CodingMJPEG,      "enc",  "jpeg",         },
69*437bfbebSnyanmisaka #endif
70*437bfbebSnyanmisaka #if HAVE_H265E
71*437bfbebSnyanmisaka     {   MPP_CTX_ENC,    MPP_VIDEO_CodingHEVC,       "enc",  "h265",         },
72*437bfbebSnyanmisaka #endif
73*437bfbebSnyanmisaka #if HAVE_VP8E
74*437bfbebSnyanmisaka     {   MPP_CTX_ENC,    MPP_VIDEO_CodingVP8,        "enc",  "vp8",          }
75*437bfbebSnyanmisaka #endif
76*437bfbebSnyanmisaka };
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka #define check_mpp_ctx(ctx)  _check_mpp_ctx(ctx, __FUNCTION__)
79*437bfbebSnyanmisaka 
_check_mpp_ctx(MpiImpl * p,const char * caller)80*437bfbebSnyanmisaka static MPP_RET _check_mpp_ctx(MpiImpl *p, const char *caller)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka     if (NULL == p || p->check != p || NULL == p->ctx) {
83*437bfbebSnyanmisaka         _mpp_err(MODULE_TAG, "found invalid context %p\n", caller, p);
84*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
85*437bfbebSnyanmisaka     }
86*437bfbebSnyanmisaka     return MPP_OK;
87*437bfbebSnyanmisaka }
88*437bfbebSnyanmisaka 
mpi_decode(MppCtx ctx,MppPacket packet,MppFrame * frame)89*437bfbebSnyanmisaka static MPP_RET mpi_decode(MppCtx ctx, MppPacket packet, MppFrame *frame)
90*437bfbebSnyanmisaka {
91*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
92*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p packet %p frame %p\n", ctx, packet, frame);
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     do {
97*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
98*437bfbebSnyanmisaka         if (ret)
99*437bfbebSnyanmisaka             break;
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka         /*
102*437bfbebSnyanmisaka          * NOTE: packet and frame could be NULL
103*437bfbebSnyanmisaka          * If packet is NULL then it is equal to get_frame
104*437bfbebSnyanmisaka          * If frame is NULL then it is equal to put_packet
105*437bfbebSnyanmisaka          */
106*437bfbebSnyanmisaka         if (frame)
107*437bfbebSnyanmisaka             *frame = NULL;
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka         ret = mpp_decode(p->ctx, packet, frame);
110*437bfbebSnyanmisaka     } while (0);
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
113*437bfbebSnyanmisaka     return ret;
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka 
mpi_decode_put_packet(MppCtx ctx,MppPacket packet)116*437bfbebSnyanmisaka static MPP_RET mpi_decode_put_packet(MppCtx ctx, MppPacket packet)
117*437bfbebSnyanmisaka {
118*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
119*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p packet %p\n", ctx, packet);
122*437bfbebSnyanmisaka     do {
123*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
124*437bfbebSnyanmisaka         if (ret)
125*437bfbebSnyanmisaka             break;
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka         if (NULL == packet) {
128*437bfbebSnyanmisaka             mpp_err_f("found NULL input packet\n");
129*437bfbebSnyanmisaka             ret = MPP_ERR_NULL_PTR;
130*437bfbebSnyanmisaka             break;
131*437bfbebSnyanmisaka         }
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka         ret = mpp_put_packet(p->ctx, packet);
134*437bfbebSnyanmisaka     } while (0);
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
137*437bfbebSnyanmisaka     return ret;
138*437bfbebSnyanmisaka }
139*437bfbebSnyanmisaka 
mpi_decode_get_frame(MppCtx ctx,MppFrame * frame)140*437bfbebSnyanmisaka static MPP_RET mpi_decode_get_frame(MppCtx ctx, MppFrame *frame)
141*437bfbebSnyanmisaka {
142*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
143*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p frame %p\n", ctx, frame);
146*437bfbebSnyanmisaka     do {
147*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
148*437bfbebSnyanmisaka         if (ret)
149*437bfbebSnyanmisaka             break;
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka         if (NULL == frame) {
152*437bfbebSnyanmisaka             mpp_err_f("found NULL input frame\n");
153*437bfbebSnyanmisaka             ret = MPP_ERR_NULL_PTR;
154*437bfbebSnyanmisaka             break;
155*437bfbebSnyanmisaka         }
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka         ret = mpp_get_frame(p->ctx, frame);
158*437bfbebSnyanmisaka     } while (0);
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
161*437bfbebSnyanmisaka     return ret;
162*437bfbebSnyanmisaka }
163*437bfbebSnyanmisaka 
mpi_encode(MppCtx ctx,MppFrame frame,MppPacket * packet)164*437bfbebSnyanmisaka static MPP_RET mpi_encode(MppCtx ctx, MppFrame frame, MppPacket *packet)
165*437bfbebSnyanmisaka {
166*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
167*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p frame %p packet %p\n", ctx, frame, packet);
170*437bfbebSnyanmisaka     do {
171*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
172*437bfbebSnyanmisaka         if (ret)
173*437bfbebSnyanmisaka             break;
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka         if (NULL == frame || NULL == packet) {
176*437bfbebSnyanmisaka             mpp_err_f("found NULL input frame %p packet %p\n", frame, packet);
177*437bfbebSnyanmisaka             ret = MPP_ERR_NULL_PTR;
178*437bfbebSnyanmisaka             break;
179*437bfbebSnyanmisaka         }
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka         // TODO: do encode here
182*437bfbebSnyanmisaka     } while (0);
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
185*437bfbebSnyanmisaka     return ret;
186*437bfbebSnyanmisaka }
187*437bfbebSnyanmisaka 
mpi_encode_put_frame(MppCtx ctx,MppFrame frame)188*437bfbebSnyanmisaka static MPP_RET mpi_encode_put_frame(MppCtx ctx, MppFrame frame)
189*437bfbebSnyanmisaka {
190*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
191*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p frame %p\n", ctx, frame);
194*437bfbebSnyanmisaka     do {
195*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
196*437bfbebSnyanmisaka         if (ret)
197*437bfbebSnyanmisaka             break;
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka         if (NULL == frame) {
200*437bfbebSnyanmisaka             mpp_err_f("found NULL input frame\n");
201*437bfbebSnyanmisaka             ret = MPP_ERR_NULL_PTR;
202*437bfbebSnyanmisaka             break;
203*437bfbebSnyanmisaka         }
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka         ret = mpp_put_frame(p->ctx, frame);
206*437bfbebSnyanmisaka     } while (0);
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
209*437bfbebSnyanmisaka     return ret;
210*437bfbebSnyanmisaka }
211*437bfbebSnyanmisaka 
mpi_encode_get_packet(MppCtx ctx,MppPacket * packet)212*437bfbebSnyanmisaka static MPP_RET mpi_encode_get_packet(MppCtx ctx, MppPacket *packet)
213*437bfbebSnyanmisaka {
214*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
215*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p packet %p\n", ctx, packet);
218*437bfbebSnyanmisaka     do {
219*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
220*437bfbebSnyanmisaka         if (ret)
221*437bfbebSnyanmisaka             break;
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka         if (NULL == packet) {
224*437bfbebSnyanmisaka             mpp_err_f("found NULL input packet\n");
225*437bfbebSnyanmisaka             ret = MPP_ERR_NULL_PTR;
226*437bfbebSnyanmisaka             break;
227*437bfbebSnyanmisaka         }
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka         ret = mpp_get_packet(p->ctx, packet);
230*437bfbebSnyanmisaka     } while (0);
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
233*437bfbebSnyanmisaka     return ret;
234*437bfbebSnyanmisaka }
235*437bfbebSnyanmisaka 
mpi_isp(MppCtx ctx,MppFrame dst,MppFrame src)236*437bfbebSnyanmisaka static MPP_RET mpi_isp(MppCtx ctx, MppFrame dst, MppFrame src)
237*437bfbebSnyanmisaka {
238*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
239*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p dst %p src %p\n", ctx, dst, src);
240*437bfbebSnyanmisaka 
241*437bfbebSnyanmisaka     // TODO: do isp process here
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
244*437bfbebSnyanmisaka     return MPP_OK;
245*437bfbebSnyanmisaka }
246*437bfbebSnyanmisaka 
mpi_isp_put_frame(MppCtx ctx,MppFrame frame)247*437bfbebSnyanmisaka static MPP_RET mpi_isp_put_frame(MppCtx ctx, MppFrame frame)
248*437bfbebSnyanmisaka {
249*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
250*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p frame %p\n", ctx, frame);
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     // TODO: do isp put frame process here
253*437bfbebSnyanmisaka 
254*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
255*437bfbebSnyanmisaka     return ret;
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka 
mpi_isp_get_frame(MppCtx ctx,MppFrame * frame)258*437bfbebSnyanmisaka static MPP_RET mpi_isp_get_frame(MppCtx ctx, MppFrame *frame)
259*437bfbebSnyanmisaka {
260*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
261*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p frame %p\n", ctx, frame);
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka     // TODO: do isp get frame process here
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     mpi_dbg_func("leave ret %d\n", ret);
266*437bfbebSnyanmisaka     return ret;
267*437bfbebSnyanmisaka }
268*437bfbebSnyanmisaka 
mpi_poll(MppCtx ctx,MppPortType type,MppPollType timeout)269*437bfbebSnyanmisaka static MPP_RET mpi_poll(MppCtx ctx, MppPortType type, MppPollType timeout)
270*437bfbebSnyanmisaka {
271*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
272*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
273*437bfbebSnyanmisaka 
274*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p type %d timeout %d\n", ctx, type, timeout);
275*437bfbebSnyanmisaka     do {
276*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
277*437bfbebSnyanmisaka         if (ret)
278*437bfbebSnyanmisaka             break;;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka         if (type >= MPP_PORT_BUTT ||
281*437bfbebSnyanmisaka             timeout < MPP_POLL_BUTT ||
282*437bfbebSnyanmisaka             timeout > MPP_POLL_MAX) {
283*437bfbebSnyanmisaka             mpp_err_f("invalid input type %d timeout %d\n", type, timeout);
284*437bfbebSnyanmisaka             ret = MPP_ERR_UNKNOW;
285*437bfbebSnyanmisaka             break;
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka         ret = mpp_poll(p->ctx, type, timeout);
289*437bfbebSnyanmisaka         if (ret > 0)
290*437bfbebSnyanmisaka             ret = MPP_OK;
291*437bfbebSnyanmisaka     } while (0);
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
294*437bfbebSnyanmisaka     return ret;
295*437bfbebSnyanmisaka }
296*437bfbebSnyanmisaka 
mpi_dequeue(MppCtx ctx,MppPortType type,MppTask * task)297*437bfbebSnyanmisaka static MPP_RET mpi_dequeue(MppCtx ctx, MppPortType type, MppTask *task)
298*437bfbebSnyanmisaka {
299*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
300*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p type %d task %p\n", ctx, type, task);
303*437bfbebSnyanmisaka     do {
304*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
305*437bfbebSnyanmisaka         if (ret)
306*437bfbebSnyanmisaka             break;;
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka         if (type >= MPP_PORT_BUTT || NULL == task) {
309*437bfbebSnyanmisaka             mpp_err_f("invalid input type %d task %p\n", type, task);
310*437bfbebSnyanmisaka             ret = MPP_ERR_UNKNOW;
311*437bfbebSnyanmisaka             break;
312*437bfbebSnyanmisaka         }
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka         ret = mpp_dequeue(p->ctx, type, task);
315*437bfbebSnyanmisaka     } while (0);
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
318*437bfbebSnyanmisaka     return ret;
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka 
mpi_enqueue(MppCtx ctx,MppPortType type,MppTask task)321*437bfbebSnyanmisaka static MPP_RET mpi_enqueue(MppCtx ctx, MppPortType type, MppTask task)
322*437bfbebSnyanmisaka {
323*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
324*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p type %d task %p\n", ctx, type, task);
327*437bfbebSnyanmisaka     do {
328*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
329*437bfbebSnyanmisaka         if (ret)
330*437bfbebSnyanmisaka             break;;
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka         if (type >= MPP_PORT_BUTT || NULL == task) {
333*437bfbebSnyanmisaka             mpp_err_f("invalid input type %d task %p\n", type, task);
334*437bfbebSnyanmisaka             ret = MPP_ERR_UNKNOW;
335*437bfbebSnyanmisaka             break;
336*437bfbebSnyanmisaka         }
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka         ret = mpp_enqueue(p->ctx, type, task);
339*437bfbebSnyanmisaka     } while (0);
340*437bfbebSnyanmisaka 
341*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
342*437bfbebSnyanmisaka     return ret;
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka 
mpi_reset(MppCtx ctx)345*437bfbebSnyanmisaka static MPP_RET mpi_reset(MppCtx ctx)
346*437bfbebSnyanmisaka {
347*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
348*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
349*437bfbebSnyanmisaka 
350*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p\n", ctx);
351*437bfbebSnyanmisaka     do {
352*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
353*437bfbebSnyanmisaka         if (ret)
354*437bfbebSnyanmisaka             break;;
355*437bfbebSnyanmisaka 
356*437bfbebSnyanmisaka         ret = mpp_reset(p->ctx);
357*437bfbebSnyanmisaka     } while (0);
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
360*437bfbebSnyanmisaka     return ret;
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka 
mpi_control(MppCtx ctx,MpiCmd cmd,MppParam param)363*437bfbebSnyanmisaka static MPP_RET mpi_control(MppCtx ctx, MpiCmd cmd, MppParam param)
364*437bfbebSnyanmisaka {
365*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
366*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl *)ctx;
367*437bfbebSnyanmisaka 
368*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p cmd %x parm %p\n", ctx, cmd, param);
369*437bfbebSnyanmisaka     do {
370*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
371*437bfbebSnyanmisaka         if (ret)
372*437bfbebSnyanmisaka             break;;
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka         ret = mpp_control(p->ctx, cmd, param);
375*437bfbebSnyanmisaka     } while (0);
376*437bfbebSnyanmisaka 
377*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
378*437bfbebSnyanmisaka     return ret;
379*437bfbebSnyanmisaka }
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka static MppApi mpp_api = {
382*437bfbebSnyanmisaka     .size              = sizeof(mpp_api),
383*437bfbebSnyanmisaka     .version           = 0,
384*437bfbebSnyanmisaka     .decode            = mpi_decode,
385*437bfbebSnyanmisaka     .decode_put_packet = mpi_decode_put_packet,
386*437bfbebSnyanmisaka     .decode_get_frame  = mpi_decode_get_frame,
387*437bfbebSnyanmisaka     .encode            = mpi_encode,
388*437bfbebSnyanmisaka     .encode_put_frame  = mpi_encode_put_frame,
389*437bfbebSnyanmisaka     .encode_get_packet = mpi_encode_get_packet,
390*437bfbebSnyanmisaka     .isp               = mpi_isp,
391*437bfbebSnyanmisaka     .isp_put_frame     = mpi_isp_put_frame,
392*437bfbebSnyanmisaka     .isp_get_frame     = mpi_isp_get_frame,
393*437bfbebSnyanmisaka     .poll              = mpi_poll,
394*437bfbebSnyanmisaka     .dequeue           = mpi_dequeue,
395*437bfbebSnyanmisaka     .enqueue           = mpi_enqueue,
396*437bfbebSnyanmisaka     .reset             = mpi_reset,
397*437bfbebSnyanmisaka     .control           = mpi_control,
398*437bfbebSnyanmisaka     .reserv            = {0},
399*437bfbebSnyanmisaka };
400*437bfbebSnyanmisaka 
mpp_create(MppCtx * ctx,MppApi ** mpi)401*437bfbebSnyanmisaka MPP_RET mpp_create(MppCtx *ctx, MppApi **mpi)
402*437bfbebSnyanmisaka {
403*437bfbebSnyanmisaka     mpp_env_get_u32("mpi_debug", &mpi_debug, 0);
404*437bfbebSnyanmisaka     mpp_get_log_level();
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka     if (NULL == ctx || NULL == mpi) {
407*437bfbebSnyanmisaka         mpp_err_f("invalid input ctx %p mpi %p\n", ctx, mpi);
408*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
409*437bfbebSnyanmisaka     }
410*437bfbebSnyanmisaka 
411*437bfbebSnyanmisaka     *ctx = NULL;
412*437bfbebSnyanmisaka     *mpi = NULL;
413*437bfbebSnyanmisaka 
414*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
415*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p mpi %p\n", ctx, mpi);
416*437bfbebSnyanmisaka     do {
417*437bfbebSnyanmisaka         MpiImpl *p = mpp_malloc(MpiImpl, 1);
418*437bfbebSnyanmisaka         if (NULL == p) {
419*437bfbebSnyanmisaka             mpp_err_f("failed to allocate context\n");
420*437bfbebSnyanmisaka             ret = MPP_ERR_MALLOC;
421*437bfbebSnyanmisaka             break;
422*437bfbebSnyanmisaka         }
423*437bfbebSnyanmisaka 
424*437bfbebSnyanmisaka         memset(p, 0, sizeof(*p));
425*437bfbebSnyanmisaka         ret = mpp_ctx_create(&p->ctx, p);
426*437bfbebSnyanmisaka         if (ret || NULL == p->ctx) {
427*437bfbebSnyanmisaka             mpp_free(p);
428*437bfbebSnyanmisaka             mpp_err_f("failed to create Mpp context ret %d\n", ret);
429*437bfbebSnyanmisaka             ret = MPP_ERR_MALLOC;
430*437bfbebSnyanmisaka             break;
431*437bfbebSnyanmisaka         }
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka         mpp_api.version = 0;
434*437bfbebSnyanmisaka         p->api      = &mpp_api;
435*437bfbebSnyanmisaka         p->check    = p;
436*437bfbebSnyanmisaka         *ctx = p;
437*437bfbebSnyanmisaka         *mpi = p->api;
438*437bfbebSnyanmisaka     } while (0);
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     show_mpp_version();
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     mpi_dbg_func("leave ret %d ctx %p mpi %p\n", ret, *ctx, *mpi);
443*437bfbebSnyanmisaka     return ret;
444*437bfbebSnyanmisaka }
445*437bfbebSnyanmisaka 
mpp_init(MppCtx ctx,MppCtxType type,MppCodingType coding)446*437bfbebSnyanmisaka MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding)
447*437bfbebSnyanmisaka {
448*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
449*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl*)ctx;
450*437bfbebSnyanmisaka 
451*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p type %d coding %d\n", ctx, type, coding);
452*437bfbebSnyanmisaka     do {
453*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
454*437bfbebSnyanmisaka         if (ret)
455*437bfbebSnyanmisaka             break;
456*437bfbebSnyanmisaka 
457*437bfbebSnyanmisaka         if (type >= MPP_CTX_BUTT ||
458*437bfbebSnyanmisaka             coding >= MPP_VIDEO_CodingMax) {
459*437bfbebSnyanmisaka             mpp_err_f("invalid input type %d coding %d\n", type, coding);
460*437bfbebSnyanmisaka             ret = MPP_ERR_UNKNOW;
461*437bfbebSnyanmisaka             break;
462*437bfbebSnyanmisaka         }
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka         ret = mpp_ctx_init(p->ctx, type, coding);
465*437bfbebSnyanmisaka         p->type     = type;
466*437bfbebSnyanmisaka         p->coding   = coding;
467*437bfbebSnyanmisaka     } while (0);
468*437bfbebSnyanmisaka 
469*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
470*437bfbebSnyanmisaka     return ret;
471*437bfbebSnyanmisaka }
472*437bfbebSnyanmisaka 
mpp_destroy(MppCtx ctx)473*437bfbebSnyanmisaka MPP_RET mpp_destroy(MppCtx ctx)
474*437bfbebSnyanmisaka {
475*437bfbebSnyanmisaka     mpi_dbg_func("enter ctx %p\n", ctx);
476*437bfbebSnyanmisaka 
477*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
478*437bfbebSnyanmisaka     MpiImpl *p = (MpiImpl*)ctx;
479*437bfbebSnyanmisaka 
480*437bfbebSnyanmisaka     do {
481*437bfbebSnyanmisaka         ret = check_mpp_ctx(p);
482*437bfbebSnyanmisaka         if (ret)
483*437bfbebSnyanmisaka             return ret;
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka         if (p->ctx)
486*437bfbebSnyanmisaka             mpp_ctx_destroy(p->ctx);
487*437bfbebSnyanmisaka 
488*437bfbebSnyanmisaka         mpp_free(p);
489*437bfbebSnyanmisaka     } while (0);
490*437bfbebSnyanmisaka 
491*437bfbebSnyanmisaka     mpi_dbg_func("leave ctx %p ret %d\n", ctx, ret);
492*437bfbebSnyanmisaka     return ret;
493*437bfbebSnyanmisaka }
494*437bfbebSnyanmisaka 
mpp_check_support_format(MppCtxType type,MppCodingType coding)495*437bfbebSnyanmisaka MPP_RET mpp_check_support_format(MppCtxType type, MppCodingType coding)
496*437bfbebSnyanmisaka {
497*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
498*437bfbebSnyanmisaka     RK_U32 i = 0;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(support_list); i++) {
501*437bfbebSnyanmisaka         MppCodingTypeInfo *info = &support_list[i];
502*437bfbebSnyanmisaka         if (type    == info->type &&
503*437bfbebSnyanmisaka             coding  == info->coding) {
504*437bfbebSnyanmisaka             ret = MPP_OK;
505*437bfbebSnyanmisaka             break;
506*437bfbebSnyanmisaka         }
507*437bfbebSnyanmisaka     }
508*437bfbebSnyanmisaka     return ret;
509*437bfbebSnyanmisaka }
510*437bfbebSnyanmisaka 
mpp_show_support_format(void)511*437bfbebSnyanmisaka void mpp_show_support_format(void)
512*437bfbebSnyanmisaka {
513*437bfbebSnyanmisaka     RK_U32 i = 0;
514*437bfbebSnyanmisaka 
515*437bfbebSnyanmisaka     mpp_log("mpp coding type support list:");
516*437bfbebSnyanmisaka 
517*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(support_list); i++) {
518*437bfbebSnyanmisaka         MppCodingTypeInfo *info = &support_list[i];
519*437bfbebSnyanmisaka         mpp_log("type: %s id %d coding: %-16s id %d\n",
520*437bfbebSnyanmisaka                 info->type_name, info->type,
521*437bfbebSnyanmisaka                 info->coding_name, info->coding);
522*437bfbebSnyanmisaka     }
523*437bfbebSnyanmisaka }
524*437bfbebSnyanmisaka 
525*437bfbebSnyanmisaka typedef struct {
526*437bfbebSnyanmisaka     MppFrameFormat  format;
527*437bfbebSnyanmisaka     const char      *name;
528*437bfbebSnyanmisaka } MppFrameFormatInfo;
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka static MppFrameFormatInfo color_list[] = {
531*437bfbebSnyanmisaka     { MPP_FMT_YUV420SP,         "YUV420SP,      NV12"   },
532*437bfbebSnyanmisaka     { MPP_FMT_YUV420SP_10BIT,   "YUV420SP-10bit"        },
533*437bfbebSnyanmisaka     { MPP_FMT_YUV422SP,         "YUV422SP,      NV24"   },
534*437bfbebSnyanmisaka     { MPP_FMT_YUV422SP_10BIT,   "YUV422SP-10bit"        },
535*437bfbebSnyanmisaka     { MPP_FMT_YUV420P,          "YUV420P,       I420"   },
536*437bfbebSnyanmisaka     { MPP_FMT_YUV420SP_VU,      "YUV420SP,      NV21"   },
537*437bfbebSnyanmisaka     { MPP_FMT_YUV422P,          "YUV422P,       422P"   },
538*437bfbebSnyanmisaka     { MPP_FMT_YUV422SP_VU,      "YUV422SP,      NV42"   },
539*437bfbebSnyanmisaka     { MPP_FMT_YUV422_YUYV,      "YUV422-YUYV,   YUY2"   },
540*437bfbebSnyanmisaka     { MPP_FMT_YUV422_UYVY,      "YUV422-UYVY,   UYVY"   },
541*437bfbebSnyanmisaka     { MPP_FMT_YUV400,           "YUV400-Y8,     Y800"   },
542*437bfbebSnyanmisaka     { MPP_FMT_YUV444SP,         "YUV444SP"              },
543*437bfbebSnyanmisaka     { MPP_FMT_YUV444P,          "YUV444P"               },
544*437bfbebSnyanmisaka 
545*437bfbebSnyanmisaka     { MPP_FMT_RGB565,           "RGB565"                },
546*437bfbebSnyanmisaka     { MPP_FMT_BGR565,           "BGR565"                },
547*437bfbebSnyanmisaka     { MPP_FMT_RGB555,           "RGB555"                },
548*437bfbebSnyanmisaka     { MPP_FMT_BGR555,           "BGR555"                },
549*437bfbebSnyanmisaka     { MPP_FMT_RGB888,           "RGB888"                },
550*437bfbebSnyanmisaka     { MPP_FMT_BGR888,           "BGR888"                },
551*437bfbebSnyanmisaka 
552*437bfbebSnyanmisaka     { MPP_FMT_ARGB8888,         "ARGB8888"              },
553*437bfbebSnyanmisaka     { MPP_FMT_ABGR8888,         "ABGR8888"              },
554*437bfbebSnyanmisaka     { MPP_FMT_BGRA8888,         "BGRA8888"              },
555*437bfbebSnyanmisaka     { MPP_FMT_RGBA8888,         "RGBA8888"              },
556*437bfbebSnyanmisaka };
557*437bfbebSnyanmisaka 
mpp_show_color_format(void)558*437bfbebSnyanmisaka void mpp_show_color_format(void)
559*437bfbebSnyanmisaka {
560*437bfbebSnyanmisaka     RK_U32 i = 0;
561*437bfbebSnyanmisaka 
562*437bfbebSnyanmisaka     mpp_log("mpp color support list:");
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(color_list); i++) {
565*437bfbebSnyanmisaka         MppFrameFormatInfo *info = &color_list[i];
566*437bfbebSnyanmisaka         mpp_log("color: id %-5d 0x%05x %s\n",
567*437bfbebSnyanmisaka                 info->format, info->format, info->name);
568*437bfbebSnyanmisaka     }
569*437bfbebSnyanmisaka }
570