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(¶ms.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, ¶ms);
333*437bfbebSnyanmisaka } else {
334*437bfbebSnyanmisaka params.ptype = VDPP_PARAM_TYPE_COM;
335*437bfbebSnyanmisaka memset(¶ms.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, ¶ms);
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