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