xref: /rockchip-linux_mpp/mpp/vproc/vdpp/test/vdpp_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "vdpp_test"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <getopt.h>
9*437bfbebSnyanmisaka #include <string.h>
10*437bfbebSnyanmisaka #include <errno.h>
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "mpp_mem.h"
13*437bfbebSnyanmisaka #include "mpp_common.h"
14*437bfbebSnyanmisaka #include "mpp_buffer.h"
15*437bfbebSnyanmisaka #include "mpp_soc.h"
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #include "utils.h"
18*437bfbebSnyanmisaka #include "vdpp_api.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #define MAX_URL_LEN        (256)
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #define SHP_CFG_STRIDE     (684)
23*437bfbebSnyanmisaka #define DM_ZME_CFG_STRIDE  (260)
24*437bfbebSnyanmisaka #define ES_CFG_STRIDE      (68)
25*437bfbebSnyanmisaka #define YUV_MAX_SIZE       (12582912) // 4096 * 2048 * 3 / 2
26*437bfbebSnyanmisaka #define DCI_HIST_SIZE      (10240)    // (16*16*16*18/8/4 + 256) * 4
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka typedef struct VdppTestCfg_t {
29*437bfbebSnyanmisaka     MppFrameFormat src_format;
30*437bfbebSnyanmisaka     RK_U32      src_width;
31*437bfbebSnyanmisaka     RK_U32      src_height;
32*437bfbebSnyanmisaka     RK_U32      src_width_vir;  // 16 align
33*437bfbebSnyanmisaka     RK_U32      src_height_vir; // 8 align
34*437bfbebSnyanmisaka     RK_U32      src_swa;
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     RK_U32      dst_width;
37*437bfbebSnyanmisaka     RK_U32      dst_height;
38*437bfbebSnyanmisaka     RK_U32      dst_width_vir;
39*437bfbebSnyanmisaka     RK_U32      dst_height_vir;
40*437bfbebSnyanmisaka     RK_U32      dst_fmt;
41*437bfbebSnyanmisaka     RK_U32      dst_swa;
42*437bfbebSnyanmisaka     RK_U32      yuv_out_diff;
43*437bfbebSnyanmisaka     RK_U32      dst_c_width;
44*437bfbebSnyanmisaka     RK_U32      dst_c_height;
45*437bfbebSnyanmisaka     RK_U32      dst_c_width_vir;
46*437bfbebSnyanmisaka     RK_U32      dst_c_height_vir;
47*437bfbebSnyanmisaka     /* high 16 bit: mask; low 3 bit: dmsr|es|sharp */
48*437bfbebSnyanmisaka     RK_U32      cfg_set;
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka     char        src_url[MAX_URL_LEN];
51*437bfbebSnyanmisaka     char        dst_url[MAX_URL_LEN];
52*437bfbebSnyanmisaka     char        dst_c_url[MAX_URL_LEN];
53*437bfbebSnyanmisaka     char        hist_url[MAX_URL_LEN];
54*437bfbebSnyanmisaka     char        hist_l_url[MAX_URL_LEN];
55*437bfbebSnyanmisaka     char        hist_g_url[MAX_URL_LEN];
56*437bfbebSnyanmisaka     char        slt_url[MAX_URL_LEN];
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     FILE        *fp_src;
59*437bfbebSnyanmisaka     FILE        *fp_dst;
60*437bfbebSnyanmisaka     FILE        *fp_dst_c;
61*437bfbebSnyanmisaka     FILE        *fp_hist;
62*437bfbebSnyanmisaka     FILE        *fp_hist_l;
63*437bfbebSnyanmisaka     FILE        *fp_hist_g;
64*437bfbebSnyanmisaka     FILE        *fp_slt;
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     RK_U32      frame_num;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     RK_U32      hist_mode_en;
69*437bfbebSnyanmisaka } VdppTestCfg;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka typedef struct {
72*437bfbebSnyanmisaka     MppFrameFormat  format;
73*437bfbebSnyanmisaka     const char      *name;
74*437bfbebSnyanmisaka } MppFrameFormatInfo;
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka extern void mpp_show_color_format();
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka static OptionInfo vdpp_test_cmd[] = {
79*437bfbebSnyanmisaka     {"w",         "src_width",        "input image width"},
80*437bfbebSnyanmisaka     {"h",         "src_height",       "input image height"},
81*437bfbebSnyanmisaka     {"s",         "src_swap",         "input image UV swap"},
82*437bfbebSnyanmisaka     {"f",         "src_format",       "input image format in MppFrameFormat"},
83*437bfbebSnyanmisaka     {"i",         "src_file",         "input image file name"},
84*437bfbebSnyanmisaka     {"W",         "dst_width",        "output image width"},
85*437bfbebSnyanmisaka     {"H",         "dst_height",       "output image height"},
86*437bfbebSnyanmisaka     {"F",         "dst_format",       "output image format in ASCII string"},
87*437bfbebSnyanmisaka     {"S",         "dst_swap",         "output image UV swap"},
88*437bfbebSnyanmisaka     {"o",         "dst_file",         "output image file name"},
89*437bfbebSnyanmisaka     {"n",         "frame_num",        "frame number"},
90*437bfbebSnyanmisaka     {"m",         "work_mode",        "work_mode : 0 - vdpp, 1 - dci hist"},
91*437bfbebSnyanmisaka     {"Y",         "packed_hist",      "output packed hist file name"},
92*437bfbebSnyanmisaka     {"O",         "dst_chroma_file",  "output chroma file name"},
93*437bfbebSnyanmisaka     {"wi_vir",    "src_width_vir",    "input virtual width"},
94*437bfbebSnyanmisaka     {"hi_vir",    "src_height_vir",   "input virtual height"},
95*437bfbebSnyanmisaka     {"wo_vir",    "dst_width_vir",    "output virtual width"},
96*437bfbebSnyanmisaka     {"ho_vir",    "dst_height_vir",   "output virtual height"},
97*437bfbebSnyanmisaka     {"wo_uv",     "dst_c_width",      "output chroma width"},
98*437bfbebSnyanmisaka     {"ho_uv",     "dst_c_height",     "output chroma height"},
99*437bfbebSnyanmisaka     {"wo_uv_vir", "dst_c_width_vir",  "output virtual chroma width"},
100*437bfbebSnyanmisaka     {"ho_uv_vir", "dst_c_height_vir", "output virtual chroma height"},
101*437bfbebSnyanmisaka     {"diff",      "yuv_out_diff",     "luma and chroma diff resolution flag"},
102*437bfbebSnyanmisaka     {"cfg_set",   "cfg_set",          "high 16 bit: mask; low 3 bit: dmsr|es|sharp"},
103*437bfbebSnyanmisaka     {"hist_l",    "local_hist",       "output local hist file name"},
104*437bfbebSnyanmisaka     {"hist_g",    "global_hist",      "output global hist file name"},
105*437bfbebSnyanmisaka     {"slt",       "slt_file",         "slt verify data file"},
106*437bfbebSnyanmisaka };
107*437bfbebSnyanmisaka 
vdpp_test_help()108*437bfbebSnyanmisaka static void vdpp_test_help()
109*437bfbebSnyanmisaka {
110*437bfbebSnyanmisaka     mpp_log("usage: vdpp_test [options]\n");
111*437bfbebSnyanmisaka     mpp_log("*******************************\n");
112*437bfbebSnyanmisaka     show_options(vdpp_test_cmd);
113*437bfbebSnyanmisaka     mpp_show_color_format();
114*437bfbebSnyanmisaka     mpp_log("*******************************\n");
115*437bfbebSnyanmisaka     mpp_log("supported ASCII format strings:\n");
116*437bfbebSnyanmisaka     mpp_log("1 - yuv444\n");
117*437bfbebSnyanmisaka     mpp_log("2 - yuv420 \n");
118*437bfbebSnyanmisaka     mpp_log("************ sample ***********\n");
119*437bfbebSnyanmisaka     mpp_log("vdpp_test -w 720 -h 480 -s 0 -i input.yuv -W 1920 -H 1080 -F yuv444 -S 0 -o output.yuv -n 1\n");
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka 
str_to_vdpp_fmt(const char * str)122*437bfbebSnyanmisaka static RK_S32 str_to_vdpp_fmt(const char *str)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka     RK_S32 fmt = -1;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     mpp_log("format %s\n", str);
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     if (!strcmp(str, "yuv420"))
129*437bfbebSnyanmisaka         fmt = VDPP_FMT_YUV420;
130*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv444"))
131*437bfbebSnyanmisaka         fmt = VDPP_FMT_YUV444;
132*437bfbebSnyanmisaka     else
133*437bfbebSnyanmisaka         mpp_err("invalid format %s\n", str);
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka     return fmt;
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka 
check_input_cmd(VdppTestCfg * cfg)138*437bfbebSnyanmisaka static MPP_RET check_input_cmd(VdppTestCfg *cfg)
139*437bfbebSnyanmisaka {
140*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     if (cfg->fp_src == NULL) {
143*437bfbebSnyanmisaka         mpp_err("failed to open input file %s\n", cfg->src_url);
144*437bfbebSnyanmisaka         ret = MPP_NOK;
145*437bfbebSnyanmisaka     }
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     return ret;
148*437bfbebSnyanmisaka }
149*437bfbebSnyanmisaka 
get_src_frm_size(RK_S32 fmt,RK_U32 w,RK_U32 h)150*437bfbebSnyanmisaka static inline size_t get_src_frm_size(RK_S32 fmt, RK_U32 w, RK_U32 h)
151*437bfbebSnyanmisaka {
152*437bfbebSnyanmisaka     RK_S32 frame_size;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka     switch (fmt & MPP_FRAME_FMT_MASK) {
155*437bfbebSnyanmisaka     case MPP_FMT_YUV420SP:
156*437bfbebSnyanmisaka     case MPP_FMT_YUV420P: {
157*437bfbebSnyanmisaka         frame_size = w * h * 3 / 2;
158*437bfbebSnyanmisaka     } break;
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     case MPP_FMT_YUV422_YUYV :
161*437bfbebSnyanmisaka     case MPP_FMT_YUV422_YVYU :
162*437bfbebSnyanmisaka     case MPP_FMT_YUV422_UYVY :
163*437bfbebSnyanmisaka     case MPP_FMT_YUV422_VYUY :
164*437bfbebSnyanmisaka     case MPP_FMT_YUV422P :
165*437bfbebSnyanmisaka     case MPP_FMT_YUV422SP :
166*437bfbebSnyanmisaka     case MPP_FMT_RGB444 :
167*437bfbebSnyanmisaka     case MPP_FMT_BGR444 :
168*437bfbebSnyanmisaka     case MPP_FMT_RGB555 :
169*437bfbebSnyanmisaka     case MPP_FMT_BGR555 :
170*437bfbebSnyanmisaka     case MPP_FMT_RGB565 :
171*437bfbebSnyanmisaka     case MPP_FMT_BGR565 : {
172*437bfbebSnyanmisaka         frame_size = w * h * 2;
173*437bfbebSnyanmisaka     } break;
174*437bfbebSnyanmisaka     case MPP_FMT_RGB888 :
175*437bfbebSnyanmisaka     case MPP_FMT_BGR888 : {
176*437bfbebSnyanmisaka         frame_size = w * h * 3;
177*437bfbebSnyanmisaka     } break;
178*437bfbebSnyanmisaka     case MPP_FMT_RGB101010 :
179*437bfbebSnyanmisaka     case MPP_FMT_BGR101010 :
180*437bfbebSnyanmisaka     case MPP_FMT_ARGB8888 :
181*437bfbebSnyanmisaka     case MPP_FMT_ABGR8888 :
182*437bfbebSnyanmisaka     case MPP_FMT_BGRA8888 :
183*437bfbebSnyanmisaka     case MPP_FMT_RGBA8888 : {
184*437bfbebSnyanmisaka         frame_size = w * h * 4;
185*437bfbebSnyanmisaka     } break;
186*437bfbebSnyanmisaka     default: {
187*437bfbebSnyanmisaka         frame_size = w * h * 4;
188*437bfbebSnyanmisaka     } break;
189*437bfbebSnyanmisaka     }
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     return frame_size;
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka 
get_dst_frm_size(RK_S32 fmt,RK_U32 w,RK_U32 h)194*437bfbebSnyanmisaka static inline size_t get_dst_frm_size(RK_S32 fmt, RK_U32 w, RK_U32 h)
195*437bfbebSnyanmisaka {
196*437bfbebSnyanmisaka     switch (fmt) {
197*437bfbebSnyanmisaka     case VDPP_FMT_YUV444:
198*437bfbebSnyanmisaka         return w * h * 3;
199*437bfbebSnyanmisaka     case VDPP_FMT_YUV420:
200*437bfbebSnyanmisaka         return w * h * 3 / 2;
201*437bfbebSnyanmisaka     default:
202*437bfbebSnyanmisaka         mpp_err("warning: unsupported input format %d", fmt);
203*437bfbebSnyanmisaka         return 0;
204*437bfbebSnyanmisaka     }
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka 
vdpp_test_set_img(vdpp_com_ctx * ctx,RK_U32 w,RK_U32 h,VdppImg * img,RK_S32 fd,VdppCmd cmd)207*437bfbebSnyanmisaka static void vdpp_test_set_img(vdpp_com_ctx *ctx, RK_U32 w, RK_U32 h,
208*437bfbebSnyanmisaka                               VdppImg *img, RK_S32 fd, VdppCmd cmd)
209*437bfbebSnyanmisaka {
210*437bfbebSnyanmisaka     RK_S32 y_size = w * h;
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka     img->mem_addr = fd;
213*437bfbebSnyanmisaka     img->uv_addr = fd;
214*437bfbebSnyanmisaka     img->uv_off = y_size;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     MPP_RET ret = ctx->ops->control(ctx->priv, cmd, img);
217*437bfbebSnyanmisaka     if (ret)
218*437bfbebSnyanmisaka         mpp_log_f("control %08x failed %d\n", cmd, ret);
219*437bfbebSnyanmisaka }
220*437bfbebSnyanmisaka 
vdpp_test(VdppTestCfg * cfg)221*437bfbebSnyanmisaka void vdpp_test(VdppTestCfg *cfg)
222*437bfbebSnyanmisaka {
223*437bfbebSnyanmisaka     vdpp_com_ctx* vdpp = rockchip_vdpp_api_alloc_ctx();
224*437bfbebSnyanmisaka     size_t srcfrmsize = get_src_frm_size(cfg->src_format, cfg->src_width_vir, cfg->src_height_vir);
225*437bfbebSnyanmisaka     size_t dstfrmsize = get_dst_frm_size(cfg->dst_fmt, cfg->dst_width_vir, cfg->dst_height_vir);
226*437bfbebSnyanmisaka     size_t dstfrmsize_c = cfg->dst_c_width_vir * cfg->dst_c_height_vir * 3;
227*437bfbebSnyanmisaka     MppBuffer srcbuf;
228*437bfbebSnyanmisaka     MppBuffer dstbuf;
229*437bfbebSnyanmisaka     MppBuffer dstbuf_c;
230*437bfbebSnyanmisaka     MppBuffer histbuf;
231*437bfbebSnyanmisaka     MppBuffer histbuf_l;
232*437bfbebSnyanmisaka     MppBuffer histbuf_g;
233*437bfbebSnyanmisaka     RK_U8 *psrc = NULL;
234*437bfbebSnyanmisaka     RK_U8 *pdst = NULL;
235*437bfbebSnyanmisaka     RK_U8 *pdst_c = NULL;
236*437bfbebSnyanmisaka     RK_U8 *phist = NULL;
237*437bfbebSnyanmisaka     RK_U8 *phist_l = NULL;
238*437bfbebSnyanmisaka     RK_U8 *phist_g = NULL;
239*437bfbebSnyanmisaka     RK_S32 fdsrc = -1;
240*437bfbebSnyanmisaka     RK_S32 fddst = -1;
241*437bfbebSnyanmisaka     RK_S32 fddst_c = -1;
242*437bfbebSnyanmisaka     RK_S32 fdhist = -1;
243*437bfbebSnyanmisaka     struct vdpp_api_params params;
244*437bfbebSnyanmisaka     RK_U32 is_vdpp2 = (mpp_get_soc_type() == ROCKCHIP_SOC_RK3576);
245*437bfbebSnyanmisaka     RK_U32 yuv_out_diff = (cfg->yuv_out_diff && is_vdpp2);
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     VdppImg imgsrc;
248*437bfbebSnyanmisaka     VdppImg imgdst;
249*437bfbebSnyanmisaka     VdppImg imgdst_c;
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     RK_U32 local_hist_size  = RKVOP_PQ_PREPROCESS_HIST_SIZE_VERI * RKVOP_PQ_PREPROCESS_HIST_SIZE_HORI *
252*437bfbebSnyanmisaka                               RKVOP_PQ_PREPROCESS_LOCAL_HIST_BIN_NUMS * sizeof(RK_U32);
253*437bfbebSnyanmisaka     RK_U32 global_hist_size = RKVOP_PQ_PREPROCESS_GLOBAL_HIST_BIN_NUMS * sizeof(RK_U32);
254*437bfbebSnyanmisaka 
255*437bfbebSnyanmisaka     mpp_assert(vdpp);
256*437bfbebSnyanmisaka     MppBufferGroup memGroup;
257*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
258*437bfbebSnyanmisaka     RK_U32 cnt = 0;
259*437bfbebSnyanmisaka     DataCrc checkcrc;
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     memset(&checkcrc, 0, sizeof(checkcrc));
262*437bfbebSnyanmisaka     checkcrc.sum = mpp_malloc(RK_ULONG, 512);
263*437bfbebSnyanmisaka 
264*437bfbebSnyanmisaka     ret = mpp_buffer_group_get_internal(&memGroup, MPP_BUFFER_TYPE_DRM);
265*437bfbebSnyanmisaka     if (MPP_OK != ret) {
266*437bfbebSnyanmisaka         mpp_err("memGroup mpp_buffer_group_get failed\n");
267*437bfbebSnyanmisaka         mpp_assert(0);
268*437bfbebSnyanmisaka     }
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka     mpp_log("src w:h [%d:%d] stride [%d:%d] require buf %d",
271*437bfbebSnyanmisaka             cfg->src_width, cfg->src_height, cfg->src_width_vir, cfg->src_height_vir, srcfrmsize);
272*437bfbebSnyanmisaka     mpp_log("dst w:h [%d:%d] stride [%d:%d] require buf %d",
273*437bfbebSnyanmisaka             cfg->dst_width, cfg->dst_height, cfg->dst_width_vir, cfg->dst_height_vir, dstfrmsize);
274*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &srcbuf, srcfrmsize);
275*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &dstbuf, dstfrmsize);
276*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &histbuf, DCI_HIST_SIZE);
277*437bfbebSnyanmisaka     mpp_assert(srcbuf && dstbuf && histbuf);
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &histbuf_l, local_hist_size);
280*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &histbuf_g, global_hist_size);
281*437bfbebSnyanmisaka     mpp_assert(histbuf_l && histbuf_g);
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka     psrc = mpp_buffer_get_ptr(srcbuf);
284*437bfbebSnyanmisaka     pdst = mpp_buffer_get_ptr(dstbuf);
285*437bfbebSnyanmisaka     phist = mpp_buffer_get_ptr(histbuf);
286*437bfbebSnyanmisaka     phist_l = mpp_buffer_get_ptr(histbuf_l);
287*437bfbebSnyanmisaka     phist_g = mpp_buffer_get_ptr(histbuf_g);
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka     fdsrc = mpp_buffer_get_fd(srcbuf);
290*437bfbebSnyanmisaka     fddst = mpp_buffer_get_fd(dstbuf);
291*437bfbebSnyanmisaka     fdhist = mpp_buffer_get_fd(histbuf);
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka     if (yuv_out_diff) {
294*437bfbebSnyanmisaka         mpp_log("dst chroma w:h [%d:%d] stride [%d:%d] require buf %d",
295*437bfbebSnyanmisaka                 cfg->dst_c_width, cfg->dst_c_height, cfg->dst_c_width_vir, cfg->dst_c_height_vir, dstfrmsize_c);
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka         mpp_buffer_get(memGroup, &dstbuf_c, dstfrmsize_c);
298*437bfbebSnyanmisaka         mpp_assert(dstbuf_c);
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka         pdst_c = mpp_buffer_get_ptr(dstbuf_c);
301*437bfbebSnyanmisaka         fddst_c = mpp_buffer_get_fd(dstbuf_c);
302*437bfbebSnyanmisaka     }
303*437bfbebSnyanmisaka 
304*437bfbebSnyanmisaka     vdpp->ops->init(&vdpp->priv);
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka     /* use default dmsr and zme params */
307*437bfbebSnyanmisaka     /* set common params */
308*437bfbebSnyanmisaka     if (is_vdpp2) {
309*437bfbebSnyanmisaka         params.ptype = VDPP_PARAM_TYPE_COM2;
310*437bfbebSnyanmisaka         memset(&params.param, 0, sizeof(union vdpp_api_content));
311*437bfbebSnyanmisaka         params.param.com2.sfmt = cfg->src_format;
312*437bfbebSnyanmisaka         params.param.com2.src_width = cfg->src_width;
313*437bfbebSnyanmisaka         params.param.com2.src_height = cfg->src_height;
314*437bfbebSnyanmisaka         params.param.com2.src_width_vir = cfg->src_width_vir;
315*437bfbebSnyanmisaka         params.param.com2.src_height_vir = cfg->src_height_vir;
316*437bfbebSnyanmisaka         params.param.com2.sswap = cfg->src_swa;
317*437bfbebSnyanmisaka         params.param.com2.dfmt = cfg->dst_fmt;
318*437bfbebSnyanmisaka         params.param.com2.dst_width = cfg->dst_width;
319*437bfbebSnyanmisaka         params.param.com2.dst_height = cfg->dst_height;
320*437bfbebSnyanmisaka         params.param.com2.dst_width_vir = cfg->dst_width_vir;
321*437bfbebSnyanmisaka         params.param.com2.dst_height_vir = cfg->dst_height_vir;
322*437bfbebSnyanmisaka         if (yuv_out_diff) {
323*437bfbebSnyanmisaka             params.param.com2.yuv_out_diff = yuv_out_diff;
324*437bfbebSnyanmisaka             params.param.com2.dst_c_width = cfg->dst_c_width;
325*437bfbebSnyanmisaka             params.param.com2.dst_c_height = cfg->dst_c_height;
326*437bfbebSnyanmisaka             params.param.com2.dst_c_width_vir = cfg->dst_c_width_vir;
327*437bfbebSnyanmisaka             params.param.com2.dst_c_height_vir = cfg->dst_c_height_vir;
328*437bfbebSnyanmisaka         }
329*437bfbebSnyanmisaka         params.param.com2.dswap = cfg->dst_swa;
330*437bfbebSnyanmisaka         params.param.com2.hist_mode_en = cfg->hist_mode_en;
331*437bfbebSnyanmisaka         params.param.com2.cfg_set = cfg->cfg_set;
332*437bfbebSnyanmisaka         vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_COM2_CFG, &params);
333*437bfbebSnyanmisaka     } else {
334*437bfbebSnyanmisaka         params.ptype = VDPP_PARAM_TYPE_COM;
335*437bfbebSnyanmisaka         memset(&params.param, 0, sizeof(union vdpp_api_content));
336*437bfbebSnyanmisaka         params.param.com.src_width = cfg->src_width;
337*437bfbebSnyanmisaka         params.param.com.src_height = cfg->src_height;
338*437bfbebSnyanmisaka         params.param.com.sswap = cfg->src_swa;
339*437bfbebSnyanmisaka         params.param.com.dfmt = cfg->dst_fmt;
340*437bfbebSnyanmisaka         params.param.com.dst_width = cfg->dst_width;
341*437bfbebSnyanmisaka         params.param.com.dst_height = cfg->dst_height;
342*437bfbebSnyanmisaka         params.param.com.dswap = cfg->dst_swa;
343*437bfbebSnyanmisaka         vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_COM_CFG, &params);
344*437bfbebSnyanmisaka     }
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     {
347*437bfbebSnyanmisaka         RK_S32 cap = vdpp->ops->check_cap(vdpp->priv);
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka         mpp_log("vdpp cap %d\n", cap);
350*437bfbebSnyanmisaka     }
351*437bfbebSnyanmisaka 
352*437bfbebSnyanmisaka     while (1) {
353*437bfbebSnyanmisaka         if (srcfrmsize > fread(psrc, 1, srcfrmsize, cfg->fp_src)) {
354*437bfbebSnyanmisaka             mpp_log("source exhaused\n");
355*437bfbebSnyanmisaka             break;
356*437bfbebSnyanmisaka         }
357*437bfbebSnyanmisaka         if (cnt >= cfg->frame_num)
358*437bfbebSnyanmisaka             break;
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka         /* notice the order of the input frames */
361*437bfbebSnyanmisaka         vdpp_test_set_img(vdpp, cfg->src_width_vir, cfg->src_height_vir,
362*437bfbebSnyanmisaka                           &imgsrc, fdsrc, VDPP_CMD_SET_SRC);
363*437bfbebSnyanmisaka         vdpp_test_set_img(vdpp, cfg->dst_width_vir, cfg->dst_height_vir,
364*437bfbebSnyanmisaka                           &imgdst, fddst, VDPP_CMD_SET_DST);
365*437bfbebSnyanmisaka         if (yuv_out_diff)
366*437bfbebSnyanmisaka             vdpp_test_set_img(vdpp, cfg->dst_c_width_vir, cfg->dst_c_height_vir,
367*437bfbebSnyanmisaka                               &imgdst_c, fddst_c, VDPP_CMD_SET_DST_C);
368*437bfbebSnyanmisaka 
369*437bfbebSnyanmisaka         if (is_vdpp2)
370*437bfbebSnyanmisaka             vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_HIST_FD, &fdhist);
371*437bfbebSnyanmisaka 
372*437bfbebSnyanmisaka         memset(pdst, 0, dstfrmsize);
373*437bfbebSnyanmisaka         memset(phist, 0, DCI_HIST_SIZE);
374*437bfbebSnyanmisaka 
375*437bfbebSnyanmisaka         if (vdpp->ops->control(vdpp->priv, VDPP_CMD_RUN_SYNC, NULL)) {
376*437bfbebSnyanmisaka             mpp_err("found vdpp run error, exit!\n");
377*437bfbebSnyanmisaka             break;
378*437bfbebSnyanmisaka         }
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka         cnt++;
381*437bfbebSnyanmisaka 
382*437bfbebSnyanmisaka         if (cfg->fp_dst) {
383*437bfbebSnyanmisaka             if (dstfrmsize > fwrite(pdst, 1, dstfrmsize, cfg->fp_dst)) {
384*437bfbebSnyanmisaka                 mpp_err("destination dump failed, errno %d %s\n", errno, strerror(errno));
385*437bfbebSnyanmisaka                 break;
386*437bfbebSnyanmisaka             }
387*437bfbebSnyanmisaka         }
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka         if (yuv_out_diff && cfg->fp_dst_c) {
390*437bfbebSnyanmisaka             if (dstfrmsize_c > fwrite(pdst_c, 1, dstfrmsize_c, cfg->fp_dst_c)) {
391*437bfbebSnyanmisaka                 mpp_err("chroma dump failed, errno %d %s\n", errno, strerror(errno));
392*437bfbebSnyanmisaka                 break;
393*437bfbebSnyanmisaka             }
394*437bfbebSnyanmisaka         }
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka         if (cfg->fp_hist) {
397*437bfbebSnyanmisaka             if (DCI_HIST_SIZE > fwrite(phist, 1, DCI_HIST_SIZE, cfg->fp_hist)) {
398*437bfbebSnyanmisaka                 mpp_err("packed hist dump err\n");
399*437bfbebSnyanmisaka                 break;
400*437bfbebSnyanmisaka             }
401*437bfbebSnyanmisaka         }
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka         memset(phist_l, 0, local_hist_size);
404*437bfbebSnyanmisaka         memset(phist_g, 0, global_hist_size);
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka         dci_hist_info_parser(phist, (RK_U32 *)phist_l, (RK_U32 *)phist_g);
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka         if (cfg->fp_hist_l) {
409*437bfbebSnyanmisaka             if (local_hist_size > fwrite(phist_l, 1, local_hist_size, cfg->fp_hist_l)) {
410*437bfbebSnyanmisaka                 mpp_err("local hist dump err\n");
411*437bfbebSnyanmisaka                 break;
412*437bfbebSnyanmisaka             }
413*437bfbebSnyanmisaka         }
414*437bfbebSnyanmisaka         if (cfg->fp_hist_g) {
415*437bfbebSnyanmisaka             if (global_hist_size > fwrite(phist_g, 1, global_hist_size, cfg->fp_hist_g)) {
416*437bfbebSnyanmisaka                 mpp_err("global hist dump err\n");
417*437bfbebSnyanmisaka                 break;
418*437bfbebSnyanmisaka             }
419*437bfbebSnyanmisaka         }
420*437bfbebSnyanmisaka 
421*437bfbebSnyanmisaka         if (cfg->fp_slt) {
422*437bfbebSnyanmisaka             if (pdst && !cfg->hist_mode_en) {
423*437bfbebSnyanmisaka                 calc_data_crc(pdst, dstfrmsize, &checkcrc);
424*437bfbebSnyanmisaka                 write_data_crc(cfg->fp_slt, &checkcrc);
425*437bfbebSnyanmisaka 
426*437bfbebSnyanmisaka             }
427*437bfbebSnyanmisaka 
428*437bfbebSnyanmisaka             if (pdst_c && yuv_out_diff && !cfg->hist_mode_en) {
429*437bfbebSnyanmisaka                 calc_data_crc(pdst_c, dstfrmsize_c, &checkcrc);
430*437bfbebSnyanmisaka                 write_data_crc(cfg->fp_slt, &checkcrc);
431*437bfbebSnyanmisaka 
432*437bfbebSnyanmisaka             }
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka             if (phist) {
435*437bfbebSnyanmisaka                 calc_data_crc(phist, DCI_HIST_SIZE, &checkcrc);
436*437bfbebSnyanmisaka                 write_data_crc(cfg->fp_slt, &checkcrc);
437*437bfbebSnyanmisaka             }
438*437bfbebSnyanmisaka         }
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     }
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     mpp_buffer_put(srcbuf);
443*437bfbebSnyanmisaka     mpp_buffer_put(dstbuf);
444*437bfbebSnyanmisaka     mpp_buffer_put(histbuf);
445*437bfbebSnyanmisaka     if (histbuf_l)
446*437bfbebSnyanmisaka         mpp_buffer_put(histbuf_l);
447*437bfbebSnyanmisaka     if (histbuf_g)
448*437bfbebSnyanmisaka         mpp_buffer_put(histbuf_g);
449*437bfbebSnyanmisaka     if (yuv_out_diff)
450*437bfbebSnyanmisaka         mpp_buffer_put(dstbuf_c);
451*437bfbebSnyanmisaka 
452*437bfbebSnyanmisaka     MPP_FREE(checkcrc.sum);
453*437bfbebSnyanmisaka 
454*437bfbebSnyanmisaka     if (memGroup) {
455*437bfbebSnyanmisaka         mpp_buffer_group_put(memGroup);
456*437bfbebSnyanmisaka         memGroup = NULL;
457*437bfbebSnyanmisaka     }
458*437bfbebSnyanmisaka 
459*437bfbebSnyanmisaka     vdpp->ops->deinit(vdpp->priv);
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     rockchip_vdpp_api_release_ctx(vdpp);
462*437bfbebSnyanmisaka }
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka extern char *optarg;
465*437bfbebSnyanmisaka extern int   opterr;
466*437bfbebSnyanmisaka 
main(int32_t argc,char ** argv)467*437bfbebSnyanmisaka int32_t main(int32_t argc, char **argv)
468*437bfbebSnyanmisaka {
469*437bfbebSnyanmisaka     VdppTestCfg cfg;
470*437bfbebSnyanmisaka     int32_t ch;
471*437bfbebSnyanmisaka     int32_t option_index = 0;
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     if (argc < 2) {
474*437bfbebSnyanmisaka         vdpp_test_help();
475*437bfbebSnyanmisaka         return 0;
476*437bfbebSnyanmisaka     }
477*437bfbebSnyanmisaka 
478*437bfbebSnyanmisaka     memset(&cfg, 0, sizeof(cfg));
479*437bfbebSnyanmisaka     cfg.src_swa = VDPP_YUV_SWAP_SP_UV;
480*437bfbebSnyanmisaka     cfg.dst_fmt = VDPP_FMT_YUV444;
481*437bfbebSnyanmisaka     cfg.dst_swa = VDPP_YUV_SWAP_SP_UV;
482*437bfbebSnyanmisaka     cfg.hist_mode_en = 0;
483*437bfbebSnyanmisaka 
484*437bfbebSnyanmisaka     /* get options */
485*437bfbebSnyanmisaka     opterr = 0;
486*437bfbebSnyanmisaka     /* not recommended if not familiar with HW */
487*437bfbebSnyanmisaka     static struct option long_options[] = {
488*437bfbebSnyanmisaka         {"wi_vir",     required_argument, 0,  0 },
489*437bfbebSnyanmisaka         {"hi_vir",     required_argument, 0,  0 },
490*437bfbebSnyanmisaka         {"wo_vir",     required_argument, 0,  0 },
491*437bfbebSnyanmisaka         {"ho_vir",     required_argument, 0,  0 },
492*437bfbebSnyanmisaka         {"wo_uv",      required_argument, 0,  0 },
493*437bfbebSnyanmisaka         {"ho_uv",      required_argument, 0,  0 },
494*437bfbebSnyanmisaka         {"wo_uv_vir",  required_argument, 0,  0 },
495*437bfbebSnyanmisaka         {"ho_uv_vir",  required_argument, 0,  0 },
496*437bfbebSnyanmisaka         {"diff",       required_argument, 0,  0 },
497*437bfbebSnyanmisaka         {"cfg_set",    required_argument, 0,  0 },
498*437bfbebSnyanmisaka         {"hist_l",     required_argument, 0,  0 },
499*437bfbebSnyanmisaka         {"hist_g",     required_argument, 0,  0 },
500*437bfbebSnyanmisaka         {"slt",        required_argument, 0,  0 },
501*437bfbebSnyanmisaka         { 0,           0,                 0,  0 },
502*437bfbebSnyanmisaka     };
503*437bfbebSnyanmisaka 
504*437bfbebSnyanmisaka     while ((ch = getopt_long_only(argc, argv, "w:h:f:s:i:W:H:F:S:o:O:n:m:Y:", long_options, &option_index)) != -1) {
505*437bfbebSnyanmisaka         switch (ch) {
506*437bfbebSnyanmisaka         case 0: {
507*437bfbebSnyanmisaka             switch (option_index) {
508*437bfbebSnyanmisaka             case 0 : {
509*437bfbebSnyanmisaka                 cfg.src_width_vir = atoi(optarg);
510*437bfbebSnyanmisaka             } break;
511*437bfbebSnyanmisaka             case 1 : {
512*437bfbebSnyanmisaka                 cfg.src_height_vir = atoi(optarg);
513*437bfbebSnyanmisaka             } break;
514*437bfbebSnyanmisaka             case 2 : {
515*437bfbebSnyanmisaka                 cfg.dst_width_vir = atoi(optarg);
516*437bfbebSnyanmisaka             } break;
517*437bfbebSnyanmisaka             case 3 : {
518*437bfbebSnyanmisaka                 cfg.dst_height_vir = atoi(optarg);
519*437bfbebSnyanmisaka             } break;
520*437bfbebSnyanmisaka             case 4 : {
521*437bfbebSnyanmisaka                 cfg.dst_c_width = atoi(optarg);
522*437bfbebSnyanmisaka             } break;
523*437bfbebSnyanmisaka             case 5 : {
524*437bfbebSnyanmisaka                 cfg.dst_c_height = atoi(optarg);
525*437bfbebSnyanmisaka             } break;
526*437bfbebSnyanmisaka             case 6 : {
527*437bfbebSnyanmisaka                 cfg.dst_c_width_vir = atoi(optarg);
528*437bfbebSnyanmisaka             } break;
529*437bfbebSnyanmisaka             case 7 : {
530*437bfbebSnyanmisaka                 cfg.dst_c_height_vir = atoi(optarg);
531*437bfbebSnyanmisaka             } break;
532*437bfbebSnyanmisaka             case 8 : {
533*437bfbebSnyanmisaka                 cfg.yuv_out_diff = atoi(optarg);
534*437bfbebSnyanmisaka             } break;
535*437bfbebSnyanmisaka             case 9 : {
536*437bfbebSnyanmisaka                 cfg.cfg_set = strtol(optarg, NULL, 0);
537*437bfbebSnyanmisaka             } break;
538*437bfbebSnyanmisaka             case 10 : {
539*437bfbebSnyanmisaka                 mpp_log("local hist name: %s\n", optarg);
540*437bfbebSnyanmisaka                 strncpy(cfg.hist_l_url, optarg, sizeof(cfg.hist_l_url) - 1);
541*437bfbebSnyanmisaka                 cfg.fp_hist_l = fopen(cfg.hist_l_url, "w+b");
542*437bfbebSnyanmisaka             } break;
543*437bfbebSnyanmisaka             case 11 : {
544*437bfbebSnyanmisaka                 mpp_log("global hist name: %s\n", optarg);
545*437bfbebSnyanmisaka                 strncpy(cfg.hist_g_url, optarg, sizeof(cfg.hist_g_url) - 1);
546*437bfbebSnyanmisaka                 cfg.fp_hist_g = fopen(cfg.hist_g_url, "w+b");
547*437bfbebSnyanmisaka             } break;
548*437bfbebSnyanmisaka             case 12 : {
549*437bfbebSnyanmisaka                 mpp_log("verify file: %s\n", optarg);
550*437bfbebSnyanmisaka                 strncpy(cfg.slt_url, optarg, sizeof(cfg.slt_url) - 1);
551*437bfbebSnyanmisaka                 cfg.fp_slt = fopen(cfg.slt_url, "w+b");
552*437bfbebSnyanmisaka             } break;
553*437bfbebSnyanmisaka             default : {
554*437bfbebSnyanmisaka             } break;
555*437bfbebSnyanmisaka             }
556*437bfbebSnyanmisaka             mpp_log("%s: %s", long_options[option_index].name, optarg);
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka         } break;
559*437bfbebSnyanmisaka         case 'w': {
560*437bfbebSnyanmisaka             cfg.src_width = atoi(optarg);
561*437bfbebSnyanmisaka         } break;
562*437bfbebSnyanmisaka         case 'h': {
563*437bfbebSnyanmisaka             cfg.src_height = atoi(optarg);
564*437bfbebSnyanmisaka         } break;
565*437bfbebSnyanmisaka         case 'f': {
566*437bfbebSnyanmisaka             cfg.src_format = atoi(optarg);
567*437bfbebSnyanmisaka         } break;
568*437bfbebSnyanmisaka         case 's': {
569*437bfbebSnyanmisaka             cfg.src_swa = atoi(optarg);
570*437bfbebSnyanmisaka         } break;
571*437bfbebSnyanmisaka         case 'i': {
572*437bfbebSnyanmisaka             mpp_log("input filename: %s\n", optarg);
573*437bfbebSnyanmisaka             strncpy(cfg.src_url, optarg, sizeof(cfg.src_url) - 1);
574*437bfbebSnyanmisaka             cfg.fp_src = fopen(cfg.src_url, "rb");
575*437bfbebSnyanmisaka         } break;
576*437bfbebSnyanmisaka         case 'W': {
577*437bfbebSnyanmisaka             cfg.dst_width = atoi(optarg);
578*437bfbebSnyanmisaka         } break;
579*437bfbebSnyanmisaka         case 'H': {
580*437bfbebSnyanmisaka             cfg.dst_height = atoi(optarg);
581*437bfbebSnyanmisaka         } break;
582*437bfbebSnyanmisaka         case 'F': {
583*437bfbebSnyanmisaka             cfg.dst_fmt = str_to_vdpp_fmt(optarg);
584*437bfbebSnyanmisaka         } break;
585*437bfbebSnyanmisaka         case 'S': {
586*437bfbebSnyanmisaka             cfg.dst_swa = atoi(optarg);
587*437bfbebSnyanmisaka         } break;
588*437bfbebSnyanmisaka         case 'o': {
589*437bfbebSnyanmisaka             mpp_log("output filename: %s\n", optarg);
590*437bfbebSnyanmisaka             strncpy(cfg.dst_url, optarg, sizeof(cfg.dst_url) - 1);
591*437bfbebSnyanmisaka             cfg.fp_dst = fopen(cfg.dst_url, "w+b");
592*437bfbebSnyanmisaka         } break;
593*437bfbebSnyanmisaka         case 'O': {
594*437bfbebSnyanmisaka             mpp_log("output chroma filename: %s\n", optarg);
595*437bfbebSnyanmisaka             strncpy(cfg.dst_c_url, optarg, sizeof(cfg.dst_c_url) - 1);
596*437bfbebSnyanmisaka             cfg.fp_dst_c = fopen(cfg.dst_c_url, "w+b");
597*437bfbebSnyanmisaka         } break;
598*437bfbebSnyanmisaka         case 'n': {
599*437bfbebSnyanmisaka             cfg.frame_num = atoi(optarg);
600*437bfbebSnyanmisaka         } break;
601*437bfbebSnyanmisaka         case 'm': {
602*437bfbebSnyanmisaka             cfg.hist_mode_en = atoi(optarg);
603*437bfbebSnyanmisaka         } break;
604*437bfbebSnyanmisaka         case 'Y': {
605*437bfbebSnyanmisaka             mpp_log("output hist: %s\n", optarg);
606*437bfbebSnyanmisaka             strncpy(cfg.hist_url, optarg, sizeof(cfg.hist_url) - 1);
607*437bfbebSnyanmisaka             cfg.fp_hist = fopen(cfg.hist_url, "w+b");
608*437bfbebSnyanmisaka         } break;
609*437bfbebSnyanmisaka         default: {
610*437bfbebSnyanmisaka         } break;
611*437bfbebSnyanmisaka         }
612*437bfbebSnyanmisaka     }
613*437bfbebSnyanmisaka 
614*437bfbebSnyanmisaka     /* set default vir stride */
615*437bfbebSnyanmisaka     if (!cfg.src_width_vir)
616*437bfbebSnyanmisaka         cfg.src_width_vir = MPP_ALIGN(cfg.src_width, 16);
617*437bfbebSnyanmisaka     if (!cfg.src_height_vir)
618*437bfbebSnyanmisaka         cfg.src_height_vir = MPP_ALIGN(cfg.src_height, 8);
619*437bfbebSnyanmisaka     if (!cfg.dst_width)
620*437bfbebSnyanmisaka         cfg.dst_width = cfg.src_width;
621*437bfbebSnyanmisaka     if (!cfg.dst_height)
622*437bfbebSnyanmisaka         cfg.dst_height = cfg.src_height;
623*437bfbebSnyanmisaka     if (!cfg.dst_width_vir)
624*437bfbebSnyanmisaka         cfg.dst_width_vir = MPP_ALIGN(cfg.dst_width, 16);
625*437bfbebSnyanmisaka     if (!cfg.dst_height_vir)
626*437bfbebSnyanmisaka         cfg.dst_height_vir = MPP_ALIGN(cfg.dst_height, 2);
627*437bfbebSnyanmisaka     if (cfg.yuv_out_diff) {
628*437bfbebSnyanmisaka         if (!cfg.dst_c_width)
629*437bfbebSnyanmisaka             cfg.dst_c_width = cfg.dst_width;
630*437bfbebSnyanmisaka         if (!cfg.dst_c_width_vir)
631*437bfbebSnyanmisaka             cfg.dst_c_width_vir = MPP_ALIGN(cfg.dst_c_width, 16);
632*437bfbebSnyanmisaka         if (!cfg.dst_c_height)
633*437bfbebSnyanmisaka             cfg.dst_c_height = cfg.dst_height;
634*437bfbebSnyanmisaka         if (!cfg.dst_c_height_vir)
635*437bfbebSnyanmisaka             cfg.dst_c_height_vir = MPP_ALIGN(cfg.dst_c_height, 2);
636*437bfbebSnyanmisaka     }
637*437bfbebSnyanmisaka     if (check_input_cmd(&cfg)) {
638*437bfbebSnyanmisaka         mpp_err("failed to pass cmd line check\n");
639*437bfbebSnyanmisaka         vdpp_test_help();
640*437bfbebSnyanmisaka         return -1;
641*437bfbebSnyanmisaka     }
642*437bfbebSnyanmisaka 
643*437bfbebSnyanmisaka     vdpp_test(&cfg);
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka     if (cfg.fp_src) {
646*437bfbebSnyanmisaka         fclose(cfg.fp_src);
647*437bfbebSnyanmisaka         cfg.fp_src = NULL;
648*437bfbebSnyanmisaka     }
649*437bfbebSnyanmisaka 
650*437bfbebSnyanmisaka     if (cfg.fp_dst) {
651*437bfbebSnyanmisaka         fclose(cfg.fp_dst);
652*437bfbebSnyanmisaka         cfg.fp_dst = NULL;
653*437bfbebSnyanmisaka     }
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka     if (cfg.fp_dst_c) {
656*437bfbebSnyanmisaka         fclose(cfg.fp_dst_c);
657*437bfbebSnyanmisaka         cfg.fp_dst_c = NULL;
658*437bfbebSnyanmisaka     }
659*437bfbebSnyanmisaka 
660*437bfbebSnyanmisaka     if (cfg.fp_hist) {
661*437bfbebSnyanmisaka         fclose(cfg.fp_hist);
662*437bfbebSnyanmisaka         cfg.fp_hist = NULL;
663*437bfbebSnyanmisaka     }
664*437bfbebSnyanmisaka 
665*437bfbebSnyanmisaka     if (cfg.fp_hist_l) {
666*437bfbebSnyanmisaka         fclose(cfg.fp_hist_l);
667*437bfbebSnyanmisaka         cfg.fp_hist_l = NULL;
668*437bfbebSnyanmisaka     }
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka     if (cfg.fp_hist_g) {
671*437bfbebSnyanmisaka         fclose(cfg.fp_hist_g);
672*437bfbebSnyanmisaka         cfg.fp_hist_g = NULL;
673*437bfbebSnyanmisaka     }
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka     if (cfg.fp_slt) {
676*437bfbebSnyanmisaka         fclose(cfg.fp_slt);
677*437bfbebSnyanmisaka         cfg.fp_slt = NULL;
678*437bfbebSnyanmisaka     }
679*437bfbebSnyanmisaka 
680*437bfbebSnyanmisaka     return 0;
681*437bfbebSnyanmisaka }
682