xref: /rockchip-linux_mpp/mpp/vproc/rga/test/rga_test.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 #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