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 #include <string.h>
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include "mpp_log.h"
9*437bfbebSnyanmisaka #include "mpp_frame.h"
10*437bfbebSnyanmisaka #include "mpp_common.h"
11*437bfbebSnyanmisaka #include "mpp_err.h"
12*437bfbebSnyanmisaka
13*437bfbebSnyanmisaka #include "utils.h"
14*437bfbebSnyanmisaka #include "rga_api.h"
15*437bfbebSnyanmisaka
16*437bfbebSnyanmisaka #define MAX_NAME_LENGTH 256
17*437bfbebSnyanmisaka
18*437bfbebSnyanmisaka typedef struct RgaTestCmd_t {
19*437bfbebSnyanmisaka RK_U32 src_w;
20*437bfbebSnyanmisaka RK_U32 src_h;
21*437bfbebSnyanmisaka RK_U32 dst_w;
22*437bfbebSnyanmisaka RK_U32 dst_h;
23*437bfbebSnyanmisaka MppFrameFormat src_fmt;
24*437bfbebSnyanmisaka MppFrameFormat dst_fmt;
25*437bfbebSnyanmisaka char input_file[MAX_NAME_LENGTH];
26*437bfbebSnyanmisaka char output_file[MAX_NAME_LENGTH];
27*437bfbebSnyanmisaka RK_U32 have_input;
28*437bfbebSnyanmisaka RK_U32 have_output;
29*437bfbebSnyanmisaka } RgaTestCmd;
30*437bfbebSnyanmisaka
usage()31*437bfbebSnyanmisaka void usage()
32*437bfbebSnyanmisaka {
33*437bfbebSnyanmisaka mpp_log("usage:./rga_test -i input -o output_file"
34*437bfbebSnyanmisaka " -w src_w -h src_h -f src_fmt -dst_w dst_w"
35*437bfbebSnyanmisaka " -dst_h dst_h -dst_fmt dst_fmt\n");
36*437bfbebSnyanmisaka }
37*437bfbebSnyanmisaka
rga_test_parse_options(int argc,char ** argv,RgaTestCmd * cmd)38*437bfbebSnyanmisaka static RK_S32 rga_test_parse_options(int argc, char **argv, RgaTestCmd *cmd)
39*437bfbebSnyanmisaka {
40*437bfbebSnyanmisaka const char *opt;
41*437bfbebSnyanmisaka const char *next;
42*437bfbebSnyanmisaka RK_S32 optindex = 1;
43*437bfbebSnyanmisaka RK_S32 handleoptions = 1;
44*437bfbebSnyanmisaka RK_S32 err = MPP_NOK;
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka if (argc < 2 || cmd == NULL) {
47*437bfbebSnyanmisaka err = 1;
48*437bfbebSnyanmisaka return err;
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka
51*437bfbebSnyanmisaka while (optindex < argc) {
52*437bfbebSnyanmisaka opt = (const char *) argv[optindex++];
53*437bfbebSnyanmisaka next = (const char *) argv[optindex];
54*437bfbebSnyanmisaka
55*437bfbebSnyanmisaka if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
56*437bfbebSnyanmisaka if (opt[1] == '-') {
57*437bfbebSnyanmisaka if (opt[2] != '\0') {
58*437bfbebSnyanmisaka opt++;
59*437bfbebSnyanmisaka } else {
60*437bfbebSnyanmisaka handleoptions = 0;
61*437bfbebSnyanmisaka break;
62*437bfbebSnyanmisaka }
63*437bfbebSnyanmisaka }
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisaka opt++;
66*437bfbebSnyanmisaka
67*437bfbebSnyanmisaka switch (*opt) {
68*437bfbebSnyanmisaka case 'i' :
69*437bfbebSnyanmisaka if (next) {
70*437bfbebSnyanmisaka strncpy(cmd->input_file, next, MAX_NAME_LENGTH - 1);
71*437bfbebSnyanmisaka cmd->input_file[strlen(next)] = '\0';
72*437bfbebSnyanmisaka cmd->have_input = 1;
73*437bfbebSnyanmisaka } else {
74*437bfbebSnyanmisaka mpp_err("input file is invalid\n");
75*437bfbebSnyanmisaka goto PARSE_ERR;
76*437bfbebSnyanmisaka }
77*437bfbebSnyanmisaka break;
78*437bfbebSnyanmisaka case 'o' :
79*437bfbebSnyanmisaka if (next) {
80*437bfbebSnyanmisaka strncpy(cmd->output_file, next, MAX_NAME_LENGTH - 1);
81*437bfbebSnyanmisaka cmd->output_file[strlen(next)] = '\0';
82*437bfbebSnyanmisaka cmd->have_output = 1;
83*437bfbebSnyanmisaka } else {
84*437bfbebSnyanmisaka mpp_err("output file is invalid\n");
85*437bfbebSnyanmisaka goto PARSE_ERR;
86*437bfbebSnyanmisaka }
87*437bfbebSnyanmisaka break;
88*437bfbebSnyanmisaka case 'w' :
89*437bfbebSnyanmisaka if (next) {
90*437bfbebSnyanmisaka cmd->src_w = atoi(next);
91*437bfbebSnyanmisaka } else {
92*437bfbebSnyanmisaka mpp_err("src width is invalid\n");
93*437bfbebSnyanmisaka goto PARSE_ERR;
94*437bfbebSnyanmisaka }
95*437bfbebSnyanmisaka break;
96*437bfbebSnyanmisaka case 'h' :
97*437bfbebSnyanmisaka if (next) {
98*437bfbebSnyanmisaka cmd->src_h = atoi(next);
99*437bfbebSnyanmisaka } else {
100*437bfbebSnyanmisaka mpp_err("src height is invalid\n");
101*437bfbebSnyanmisaka goto PARSE_ERR;
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka break;
104*437bfbebSnyanmisaka case 'f' :
105*437bfbebSnyanmisaka if (next) {
106*437bfbebSnyanmisaka cmd->src_fmt = (MppFrameFormat) atoi(next);
107*437bfbebSnyanmisaka err = ((cmd->src_fmt >= MPP_FMT_YUV_BUTT && cmd->src_fmt < MPP_FRAME_FMT_RGB) ||
108*437bfbebSnyanmisaka cmd->src_fmt >= MPP_FMT_RGB_BUTT);
109*437bfbebSnyanmisaka } else {
110*437bfbebSnyanmisaka mpp_err("src fmt is invalid\n");
111*437bfbebSnyanmisaka goto PARSE_ERR;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka break;
114*437bfbebSnyanmisaka case 'd' :
115*437bfbebSnyanmisaka if ((*(opt + 1) != '\0') && !strncmp(opt, "dst_w", 5)) {
116*437bfbebSnyanmisaka cmd->dst_w = atoi(next);
117*437bfbebSnyanmisaka } else if ((*(opt + 1) != '\0') && !strncmp(opt, "dst_h", 5)) {
118*437bfbebSnyanmisaka cmd->dst_h = atoi(next);
119*437bfbebSnyanmisaka } else if ((*(opt + 1) != '\0') && !strncmp(opt, "dst_fmt", 5)) {
120*437bfbebSnyanmisaka cmd->dst_fmt = (MppFrameFormat) atoi(next);
121*437bfbebSnyanmisaka } else {
122*437bfbebSnyanmisaka mpp_err("dst parameters is invalid\n");
123*437bfbebSnyanmisaka goto PARSE_ERR;
124*437bfbebSnyanmisaka }
125*437bfbebSnyanmisaka break;
126*437bfbebSnyanmisaka }
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka }
129*437bfbebSnyanmisaka PARSE_ERR:
130*437bfbebSnyanmisaka return err;
131*437bfbebSnyanmisaka }
132*437bfbebSnyanmisaka
main(int argc,char ** argv)133*437bfbebSnyanmisaka int main(int argc, char **argv)
134*437bfbebSnyanmisaka {
135*437bfbebSnyanmisaka mpp_log("rga test unit\n");
136*437bfbebSnyanmisaka
137*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
138*437bfbebSnyanmisaka RgaTestCmd cmd;
139*437bfbebSnyanmisaka MppBuffer src_buf = NULL;
140*437bfbebSnyanmisaka MppBuffer dst_buf = NULL;
141*437bfbebSnyanmisaka MppFrame src_frm = NULL;
142*437bfbebSnyanmisaka MppFrame dst_frm = NULL;
143*437bfbebSnyanmisaka FILE *fin = NULL;
144*437bfbebSnyanmisaka FILE *fout = NULL;
145*437bfbebSnyanmisaka RgaCtx ctx = NULL;
146*437bfbebSnyanmisaka RK_U32 frame_count = 0;
147*437bfbebSnyanmisaka
148*437bfbebSnyanmisaka void *ptr;
149*437bfbebSnyanmisaka RK_U32 src_w;
150*437bfbebSnyanmisaka RK_U32 src_h;
151*437bfbebSnyanmisaka RK_U32 dst_w;
152*437bfbebSnyanmisaka RK_U32 dst_h;
153*437bfbebSnyanmisaka RK_U32 src_size;
154*437bfbebSnyanmisaka RK_U32 dst_size;
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka memset(&cmd, 0, sizeof(cmd));
157*437bfbebSnyanmisaka if (rga_test_parse_options(argc, argv, &cmd)) {
158*437bfbebSnyanmisaka usage();
159*437bfbebSnyanmisaka goto END;
160*437bfbebSnyanmisaka }
161*437bfbebSnyanmisaka
162*437bfbebSnyanmisaka mpp_log("src w:%d h:%d fmt:%d dst w:%d h:%d fmt:%d input:%s output:%s\n",
163*437bfbebSnyanmisaka cmd.src_w, cmd.src_h, cmd.src_fmt,
164*437bfbebSnyanmisaka cmd.dst_w, cmd.dst_h, cmd.dst_fmt,
165*437bfbebSnyanmisaka cmd.input_file, cmd.output_file);
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka src_w = cmd.src_w;
168*437bfbebSnyanmisaka src_h = cmd.src_h;
169*437bfbebSnyanmisaka dst_w = cmd.dst_w;
170*437bfbebSnyanmisaka dst_h = cmd.dst_h;
171*437bfbebSnyanmisaka src_size = src_w * src_h * 4;
172*437bfbebSnyanmisaka dst_size = dst_w * dst_h * 4;
173*437bfbebSnyanmisaka
174*437bfbebSnyanmisaka if (cmd.have_input) {
175*437bfbebSnyanmisaka fin = fopen(cmd.input_file, "r");
176*437bfbebSnyanmisaka if (!fin) {
177*437bfbebSnyanmisaka mpp_log("open input file %s failed\n", cmd.input_file);
178*437bfbebSnyanmisaka goto END;
179*437bfbebSnyanmisaka }
180*437bfbebSnyanmisaka }
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka if (cmd.have_output) {
183*437bfbebSnyanmisaka fout = fopen(cmd.output_file, "w+");
184*437bfbebSnyanmisaka if (!fout) {
185*437bfbebSnyanmisaka mpp_log("open output file %s failed\n", cmd.output_file);
186*437bfbebSnyanmisaka goto END;
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka }
189*437bfbebSnyanmisaka
190*437bfbebSnyanmisaka ret = mpp_buffer_get(NULL, &src_buf, src_size);
191*437bfbebSnyanmisaka if (ret) {
192*437bfbebSnyanmisaka mpp_err("failed to get src buffer %d with size %d\n", ret, src_size);
193*437bfbebSnyanmisaka goto END;
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka ret = mpp_buffer_get(NULL, &dst_buf, dst_size);
197*437bfbebSnyanmisaka if (ret) {
198*437bfbebSnyanmisaka mpp_err("failed to get dst buffer %d with size %d\n", ret, dst_size);
199*437bfbebSnyanmisaka goto END;
200*437bfbebSnyanmisaka }
201*437bfbebSnyanmisaka
202*437bfbebSnyanmisaka ret = mpp_frame_init(&src_frm);
203*437bfbebSnyanmisaka if (ret) {
204*437bfbebSnyanmisaka mpp_err("failed to init src frame\n");
205*437bfbebSnyanmisaka goto END;
206*437bfbebSnyanmisaka }
207*437bfbebSnyanmisaka
208*437bfbebSnyanmisaka ret = mpp_frame_init(&dst_frm);
209*437bfbebSnyanmisaka if (ret) {
210*437bfbebSnyanmisaka mpp_err("failed to init dst frame\n");
211*437bfbebSnyanmisaka goto END;
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka ptr = mpp_buffer_get_ptr(src_buf);
215*437bfbebSnyanmisaka if (cmd.have_input) {
216*437bfbebSnyanmisaka ret = read_image((RK_U8 *)ptr, fin, cmd.src_w, cmd.src_h,
217*437bfbebSnyanmisaka cmd.src_w, cmd.src_h, cmd.dst_fmt);
218*437bfbebSnyanmisaka if (ret) {
219*437bfbebSnyanmisaka mpp_err("failed to read input file ret:%d\n", ret);
220*437bfbebSnyanmisaka goto END;
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka } else {
223*437bfbebSnyanmisaka ret = fill_image((RK_U8 *)ptr, cmd.src_w, cmd.src_h,
224*437bfbebSnyanmisaka cmd.src_w, cmd.src_h, cmd.src_fmt, frame_count);
225*437bfbebSnyanmisaka if (ret) {
226*437bfbebSnyanmisaka mpp_err("failed to fill input buffer ret:%d\n", ret);
227*437bfbebSnyanmisaka goto END;
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka }
230*437bfbebSnyanmisaka
231*437bfbebSnyanmisaka mpp_frame_set_buffer(src_frm, src_buf);
232*437bfbebSnyanmisaka mpp_frame_set_width(src_frm, src_w);
233*437bfbebSnyanmisaka mpp_frame_set_height(src_frm, src_h);
234*437bfbebSnyanmisaka mpp_frame_set_hor_stride(src_frm, MPP_ALIGN(src_w, 16));
235*437bfbebSnyanmisaka mpp_frame_set_ver_stride(src_frm, MPP_ALIGN(src_h, 16));
236*437bfbebSnyanmisaka mpp_frame_set_fmt(src_frm, cmd.src_fmt);
237*437bfbebSnyanmisaka
238*437bfbebSnyanmisaka mpp_frame_set_buffer(dst_frm, dst_buf);
239*437bfbebSnyanmisaka mpp_frame_set_width(dst_frm, dst_w);
240*437bfbebSnyanmisaka mpp_frame_set_height(dst_frm, dst_h);
241*437bfbebSnyanmisaka mpp_frame_set_hor_stride(dst_frm, MPP_ALIGN(dst_w, 16));
242*437bfbebSnyanmisaka mpp_frame_set_ver_stride(dst_frm, MPP_ALIGN(dst_h, 16));
243*437bfbebSnyanmisaka mpp_frame_set_fmt(dst_frm, cmd.dst_fmt);
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka ret = rga_init(&ctx);
246*437bfbebSnyanmisaka if (ret) {
247*437bfbebSnyanmisaka mpp_err("init rga context failed %d\n", ret);
248*437bfbebSnyanmisaka goto END;
249*437bfbebSnyanmisaka }
250*437bfbebSnyanmisaka
251*437bfbebSnyanmisaka // start copy process
252*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_INIT, NULL);
253*437bfbebSnyanmisaka if (ret) {
254*437bfbebSnyanmisaka mpp_err("rga cmd init failed %d\n", ret);
255*437bfbebSnyanmisaka goto END;
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka
258*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_SET_SRC, src_frm);
259*437bfbebSnyanmisaka if (ret) {
260*437bfbebSnyanmisaka mpp_err("rga cmd setup source failed %d\n", ret);
261*437bfbebSnyanmisaka goto END;
262*437bfbebSnyanmisaka }
263*437bfbebSnyanmisaka
264*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_SET_DST, dst_frm);
265*437bfbebSnyanmisaka if (ret) {
266*437bfbebSnyanmisaka mpp_err("rga cmd setup destination failed %d\n", ret);
267*437bfbebSnyanmisaka goto END;
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka
270*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_RUN_SYNC, NULL);
271*437bfbebSnyanmisaka if (ret) {
272*437bfbebSnyanmisaka mpp_err("rga cmd process copy failed %d\n", ret);
273*437bfbebSnyanmisaka goto END;
274*437bfbebSnyanmisaka }
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka // start field duplicate process
277*437bfbebSnyanmisaka mpp_frame_set_buffer(src_frm, dst_buf);
278*437bfbebSnyanmisaka mpp_frame_set_width(src_frm, dst_w);
279*437bfbebSnyanmisaka mpp_frame_set_height(src_frm, dst_h / 2);
280*437bfbebSnyanmisaka mpp_frame_set_hor_stride(src_frm, MPP_ALIGN(dst_w, 16) * 2);
281*437bfbebSnyanmisaka mpp_frame_set_ver_stride(src_frm, MPP_ALIGN(src_h, 16) / 2);
282*437bfbebSnyanmisaka mpp_frame_set_fmt(src_frm, cmd.dst_fmt);
283*437bfbebSnyanmisaka
284*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_INIT, NULL);
285*437bfbebSnyanmisaka if (ret) {
286*437bfbebSnyanmisaka mpp_err("rga cmd init failed %d\n", ret);
287*437bfbebSnyanmisaka goto END;
288*437bfbebSnyanmisaka }
289*437bfbebSnyanmisaka
290*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_SET_SRC, src_frm);
291*437bfbebSnyanmisaka if (ret) {
292*437bfbebSnyanmisaka mpp_err("rga cmd setup source failed %d\n", ret);
293*437bfbebSnyanmisaka goto END;
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_SET_DST, dst_frm);
297*437bfbebSnyanmisaka if (ret) {
298*437bfbebSnyanmisaka mpp_err("rga cmd setup destination failed %d\n", ret);
299*437bfbebSnyanmisaka goto END;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka
302*437bfbebSnyanmisaka ret = rga_control(ctx, RGA_CMD_RUN_SYNC, NULL);
303*437bfbebSnyanmisaka if (ret) {
304*437bfbebSnyanmisaka mpp_err("rga cmd process copy failed %d\n", ret);
305*437bfbebSnyanmisaka goto END;
306*437bfbebSnyanmisaka }
307*437bfbebSnyanmisaka
308*437bfbebSnyanmisaka ret = rga_deinit(ctx);
309*437bfbebSnyanmisaka if (ret) {
310*437bfbebSnyanmisaka mpp_err("deinit rga context failed %d\n", ret);
311*437bfbebSnyanmisaka goto END;
312*437bfbebSnyanmisaka }
313*437bfbebSnyanmisaka
314*437bfbebSnyanmisaka if (cmd.have_output)
315*437bfbebSnyanmisaka dump_mpp_frame_to_file(dst_frm, fout);
316*437bfbebSnyanmisaka
317*437bfbebSnyanmisaka END:
318*437bfbebSnyanmisaka if (src_frm)
319*437bfbebSnyanmisaka mpp_frame_deinit(&src_frm);
320*437bfbebSnyanmisaka
321*437bfbebSnyanmisaka if (dst_frm)
322*437bfbebSnyanmisaka mpp_frame_deinit(&dst_frm);
323*437bfbebSnyanmisaka
324*437bfbebSnyanmisaka if (src_buf)
325*437bfbebSnyanmisaka mpp_buffer_put(src_buf);
326*437bfbebSnyanmisaka
327*437bfbebSnyanmisaka if (dst_buf)
328*437bfbebSnyanmisaka mpp_buffer_put(dst_buf);
329*437bfbebSnyanmisaka
330*437bfbebSnyanmisaka if (fin)
331*437bfbebSnyanmisaka fclose(fin);
332*437bfbebSnyanmisaka
333*437bfbebSnyanmisaka if (fout)
334*437bfbebSnyanmisaka fclose(fout);
335*437bfbebSnyanmisaka
336*437bfbebSnyanmisaka mpp_log("rga test exit ret %d\n", ret);
337*437bfbebSnyanmisaka return 0;
338*437bfbebSnyanmisaka }
339