xref: /rockchip-linux_mpp/mpp/vproc/iep/test/iep_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2018 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "iep_test"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "mpp_mem.h"
11*437bfbebSnyanmisaka #include "mpp_time.h"
12*437bfbebSnyanmisaka #include "mpp_debug.h"
13*437bfbebSnyanmisaka #include "mpp_common.h"
14*437bfbebSnyanmisaka #include "mpp_thread.h"
15*437bfbebSnyanmisaka #include "mpp_buffer.h"
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #include "iep_api.h"
18*437bfbebSnyanmisaka #include "utils.h"
19*437bfbebSnyanmisaka #include "iniparser.h"
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #define MAX_URL_LEN                 (100)
22*437bfbebSnyanmisaka #define ADD_OFFSET(base, offset)    ((RK_U32)base + ((RK_U32)(offset) << 10))
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka typedef enum {
25*437bfbebSnyanmisaka     TEST_CASE_NONE,
26*437bfbebSnyanmisaka     TEST_CASE_DEINTERLACE,
27*437bfbebSnyanmisaka     TEST_CASE_YUVENHANCE,
28*437bfbebSnyanmisaka     TEST_CASE_RGBENHANCE,
29*437bfbebSnyanmisaka } TEST_CASE;
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka typedef struct IepTestCfg_t {
32*437bfbebSnyanmisaka     RK_S32      src_w;
33*437bfbebSnyanmisaka     RK_S32      src_h;
34*437bfbebSnyanmisaka     RK_S32      src_fmt;
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     RK_S32      dst_w;
37*437bfbebSnyanmisaka     RK_S32      dst_h;
38*437bfbebSnyanmisaka     RK_S32      dst_fmt;
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka     char        src_url[MAX_URL_LEN];
41*437bfbebSnyanmisaka     char        dst_url[MAX_URL_LEN];
42*437bfbebSnyanmisaka     char        cfg_url[MAX_URL_LEN];
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     FILE        *fp_src;
45*437bfbebSnyanmisaka     FILE        *fp_dst;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     TEST_CASE   mode;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka     dictionary  *ini;
50*437bfbebSnyanmisaka     IepCmdParamDeiCfg       *dei_cfg;
51*437bfbebSnyanmisaka     IepCmdParamYuvEnhance   *yuv_enh;
52*437bfbebSnyanmisaka     IepCmdParamRgbEnhance   *rgb_enh;
53*437bfbebSnyanmisaka     IepCmdParamColorConvert *colorcvt;
54*437bfbebSnyanmisaka } IepTestCfg;
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka typedef struct IepTestInfo_t {
57*437bfbebSnyanmisaka     IepTestCfg *cfg;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka     size_t src_size;
60*437bfbebSnyanmisaka     size_t dst_size;
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka     RK_U32 phy_src0;
63*437bfbebSnyanmisaka     RK_U32 phy_src1;
64*437bfbebSnyanmisaka     RK_U32 phy_dst0;
65*437bfbebSnyanmisaka     RK_U32 phy_dst1;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     RK_U8 *vir_src0;
68*437bfbebSnyanmisaka     RK_U8 *vir_src1;
69*437bfbebSnyanmisaka     RK_U8 *vir_dst0;
70*437bfbebSnyanmisaka     RK_U8 *vir_dst1;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     IepImg src;
73*437bfbebSnyanmisaka     IepImg dst;
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka     IepCtx                  ctx;
76*437bfbebSnyanmisaka } IepTestInfo;
77*437bfbebSnyanmisaka 
parse_cfg(IepTestCfg * cfg)78*437bfbebSnyanmisaka static void parse_cfg(IepTestCfg *cfg)
79*437bfbebSnyanmisaka {
80*437bfbebSnyanmisaka     dictionary *ini = cfg->ini;
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     cfg->dei_cfg = mpp_calloc(IepCmdParamDeiCfg, 1);
83*437bfbebSnyanmisaka     if (iniparser_find_entry(ini, "deinterlace")) {
84*437bfbebSnyanmisaka         mpp_assert(cfg->dei_cfg);
85*437bfbebSnyanmisaka         cfg->dei_cfg->dei_high_freq_en =
86*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:high_freq_en", 0);
87*437bfbebSnyanmisaka         cfg->dei_cfg->dei_mode =
88*437bfbebSnyanmisaka             (IepDeiMode)iniparser_getint(ini, "deinterlace:dei_mode", 0);
89*437bfbebSnyanmisaka         cfg->dei_cfg->dei_high_freq_fct =
90*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:dei_high_freq_fct", 0);
91*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_mode =
92*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:dei_ei_mode", 0);
93*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_smooth =
94*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:dei_ei_smooth", 0);
95*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_sel =
96*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:dei_ei_sel", 0);
97*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_radius =
98*437bfbebSnyanmisaka             iniparser_getint(ini, "deinterlace:dei_ei_radius", 0);
99*437bfbebSnyanmisaka     } else {
100*437bfbebSnyanmisaka         cfg->dei_cfg->dei_high_freq_en  = 1;
101*437bfbebSnyanmisaka         cfg->dei_cfg->dei_mode          = IEP_DEI_MODE_I4O1;
102*437bfbebSnyanmisaka         cfg->dei_cfg->dei_field_order   = IEP_DEI_FLD_ORDER_BOT_FIRST;
103*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_mode       = 0;
104*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_smooth     = 0;
105*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_sel        = 0;
106*437bfbebSnyanmisaka         cfg->dei_cfg->dei_ei_radius     = 0;
107*437bfbebSnyanmisaka     }
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     if (iniparser_find_entry(ini, "yuv enhance")) {
110*437bfbebSnyanmisaka         cfg->yuv_enh = mpp_calloc(IepCmdParamYuvEnhance, 1);
111*437bfbebSnyanmisaka         cfg->yuv_enh->saturation =
112*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:saturation", 0);
113*437bfbebSnyanmisaka         cfg->yuv_enh->contrast =
114*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:contrast", 0);
115*437bfbebSnyanmisaka         cfg->yuv_enh->brightness =
116*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:brightness", 0);
117*437bfbebSnyanmisaka         cfg->yuv_enh->hue_angle =
118*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:hue_angle", 0);
119*437bfbebSnyanmisaka         cfg->yuv_enh->video_mode =
120*437bfbebSnyanmisaka             (IepVideoMode)
121*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:video_mode", 0);
122*437bfbebSnyanmisaka         cfg->yuv_enh->color_bar_y =
123*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:color_bar_y", 0);
124*437bfbebSnyanmisaka         cfg->yuv_enh->color_bar_u =
125*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:color_bar_u", 0);
126*437bfbebSnyanmisaka         cfg->yuv_enh->color_bar_v =
127*437bfbebSnyanmisaka             iniparser_getint(ini, "yuv enhance:color_bar_v", 0);
128*437bfbebSnyanmisaka     }
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     if (iniparser_find_entry(ini, "rgb enhance")) {
131*437bfbebSnyanmisaka         cfg->rgb_enh = mpp_calloc(IepCmdParamRgbEnhance, 1);
132*437bfbebSnyanmisaka         cfg->rgb_enh->coe =
133*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:coe", 0);
134*437bfbebSnyanmisaka         cfg->rgb_enh->mode =
135*437bfbebSnyanmisaka             (IepRgbEnhanceMode)
136*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:mode", 0);
137*437bfbebSnyanmisaka         cfg->rgb_enh->cg_en =
138*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:cg_en", 0);
139*437bfbebSnyanmisaka         cfg->rgb_enh->cg_rr =
140*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:cg_rr", 0);
141*437bfbebSnyanmisaka         cfg->rgb_enh->cg_rg =
142*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:cg_rg", 0);
143*437bfbebSnyanmisaka         cfg->rgb_enh->cg_rb =
144*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:cg_rb", 0);
145*437bfbebSnyanmisaka         cfg->rgb_enh->order =
146*437bfbebSnyanmisaka             (IepRgbEnhanceOrder)
147*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:order", 0);
148*437bfbebSnyanmisaka         cfg->rgb_enh->threshold =
149*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:threshold", 0);
150*437bfbebSnyanmisaka         cfg->rgb_enh->alpha_num =
151*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:alpha_num", 0);
152*437bfbebSnyanmisaka         cfg->rgb_enh->alpha_base =
153*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:alpha_base", 0);
154*437bfbebSnyanmisaka         cfg->rgb_enh->radius =
155*437bfbebSnyanmisaka             iniparser_getint(ini, "rgb enhance:radius", 0);
156*437bfbebSnyanmisaka     }
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     if (iniparser_find_entry(ini, "colorcvt")) {
159*437bfbebSnyanmisaka         cfg->colorcvt = mpp_calloc(IepCmdParamColorConvert, 1);
160*437bfbebSnyanmisaka         cfg->colorcvt->rgb2yuv_mode =
161*437bfbebSnyanmisaka             (IepColorConvertMode)
162*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:rgb2yuv_mode", 0);
163*437bfbebSnyanmisaka         cfg->colorcvt->yuv2rgb_mode =
164*437bfbebSnyanmisaka             (IepColorConvertMode)
165*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:yuv2rgb_mode", 0);
166*437bfbebSnyanmisaka         cfg->colorcvt->rgb2yuv_input_clip   =
167*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:rgb2yuv_input_clip", 0);
168*437bfbebSnyanmisaka         cfg->colorcvt->yuv2rgb_input_clip   =
169*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:yuv2rgb_input_clip", 0);
170*437bfbebSnyanmisaka         cfg->colorcvt->global_alpha_value   =
171*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:global_alpha_value", 0);
172*437bfbebSnyanmisaka         cfg->colorcvt->dither_up_en         =
173*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:dither_up_en", 0);
174*437bfbebSnyanmisaka         cfg->colorcvt->dither_down_en       =
175*437bfbebSnyanmisaka             iniparser_getint(ini, "colorcvt:dither_down_en", 0);
176*437bfbebSnyanmisaka     }
177*437bfbebSnyanmisaka }
178*437bfbebSnyanmisaka 
get_image_size(RK_S32 w,RK_S32 h,RK_S32 fmt)179*437bfbebSnyanmisaka static RK_S32 get_image_size(RK_S32 w, RK_S32 h, RK_S32 fmt)
180*437bfbebSnyanmisaka {
181*437bfbebSnyanmisaka     RK_S32 img_size = 0;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     switch (fmt) {
184*437bfbebSnyanmisaka     case IEP_FORMAT_ABGR_8888:
185*437bfbebSnyanmisaka     case IEP_FORMAT_ARGB_8888:
186*437bfbebSnyanmisaka     case IEP_FORMAT_BGRA_8888:
187*437bfbebSnyanmisaka     case IEP_FORMAT_RGBA_8888:
188*437bfbebSnyanmisaka         img_size = w * h * 4;
189*437bfbebSnyanmisaka         break;
190*437bfbebSnyanmisaka     case IEP_FORMAT_BGR_565:
191*437bfbebSnyanmisaka     case IEP_FORMAT_RGB_565:
192*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_422_P:
193*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_422_SP:
194*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_422_P:
195*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_422_SP:
196*437bfbebSnyanmisaka         img_size = w * h * 2;
197*437bfbebSnyanmisaka         break;
198*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_420_P:
199*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_420_SP:
200*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_420_P:
201*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_420_SP:
202*437bfbebSnyanmisaka         img_size = w * h * 3 / 2;
203*437bfbebSnyanmisaka         break;
204*437bfbebSnyanmisaka     default : {
205*437bfbebSnyanmisaka     } break;
206*437bfbebSnyanmisaka     }
207*437bfbebSnyanmisaka     return img_size;
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka 
config_iep_img(IepImg * img,RK_S32 w,RK_S32 h,RK_S32 fmt,RK_U32 base)210*437bfbebSnyanmisaka static void config_iep_img(IepImg *img, RK_S32 w, RK_S32 h, RK_S32 fmt, RK_U32 base)
211*437bfbebSnyanmisaka {
212*437bfbebSnyanmisaka     switch (fmt) {
213*437bfbebSnyanmisaka     case IEP_FORMAT_ABGR_8888:
214*437bfbebSnyanmisaka     case IEP_FORMAT_ARGB_8888:
215*437bfbebSnyanmisaka     case IEP_FORMAT_BGRA_8888:
216*437bfbebSnyanmisaka     case IEP_FORMAT_RGBA_8888:
217*437bfbebSnyanmisaka         img->v_addr = 0;
218*437bfbebSnyanmisaka         break;
219*437bfbebSnyanmisaka     case IEP_FORMAT_BGR_565:
220*437bfbebSnyanmisaka     case IEP_FORMAT_RGB_565:
221*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_422_P:
222*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_422_SP:
223*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_422_P:
224*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_422_SP:
225*437bfbebSnyanmisaka         img->v_addr = ADD_OFFSET(base, w * h + w * h / 2);
226*437bfbebSnyanmisaka         break;
227*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_420_P:
228*437bfbebSnyanmisaka     case IEP_FORMAT_YCbCr_420_SP:
229*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_420_P:
230*437bfbebSnyanmisaka     case IEP_FORMAT_YCrCb_420_SP:
231*437bfbebSnyanmisaka         img->v_addr = ADD_OFFSET(base, w * h + w * h / 4);
232*437bfbebSnyanmisaka         break;
233*437bfbebSnyanmisaka     default : {
234*437bfbebSnyanmisaka     } break;
235*437bfbebSnyanmisaka     }
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka     img->act_w      = w;
238*437bfbebSnyanmisaka     img->act_h      = h;
239*437bfbebSnyanmisaka     img->x_off      = 0;
240*437bfbebSnyanmisaka     img->y_off      = 0;
241*437bfbebSnyanmisaka     img->vir_w      = w;
242*437bfbebSnyanmisaka     img->vir_h      = h;
243*437bfbebSnyanmisaka     img->format     = fmt;
244*437bfbebSnyanmisaka     img->mem_addr   = base;
245*437bfbebSnyanmisaka     img->uv_addr    = ADD_OFFSET(base, w * h);
246*437bfbebSnyanmisaka }
247*437bfbebSnyanmisaka 
iep_process_thread(void * param)248*437bfbebSnyanmisaka void* iep_process_thread(void *param)
249*437bfbebSnyanmisaka {
250*437bfbebSnyanmisaka     IepTestInfo *info = (IepTestInfo*)param;
251*437bfbebSnyanmisaka     IepTestCfg *cfg = info->cfg;
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka     config_iep_img(&info->src, cfg->src_w, cfg->src_h, cfg->src_fmt, info->phy_src0);
254*437bfbebSnyanmisaka     config_iep_img(&info->dst, cfg->dst_w, cfg->dst_h, cfg->dst_fmt, info->phy_dst0);
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     if (info->src_size > fread(info->vir_src0, 1, info->src_size, cfg->fp_src)) {
257*437bfbebSnyanmisaka         mpp_err("read file failed\n");
258*437bfbebSnyanmisaka         return NULL;
259*437bfbebSnyanmisaka     }
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     iep_control(info->ctx, IEP_CMD_INIT, NULL);
262*437bfbebSnyanmisaka     iep_control(info->ctx, IEP_CMD_SET_SRC, &info->src);
263*437bfbebSnyanmisaka     iep_control(info->ctx, IEP_CMD_SET_DST, &info->dst);
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     switch (cfg->mode) {
266*437bfbebSnyanmisaka     case TEST_CASE_YUVENHANCE: {
267*437bfbebSnyanmisaka         iep_control(info->ctx, IEP_CMD_SET_YUV_ENHANCE, cfg->yuv_enh);
268*437bfbebSnyanmisaka     } break;
269*437bfbebSnyanmisaka     case TEST_CASE_RGBENHANCE: {
270*437bfbebSnyanmisaka         iep_control(info->ctx, IEP_CMD_SET_RGB_ENHANCE, cfg->rgb_enh);
271*437bfbebSnyanmisaka     } break;
272*437bfbebSnyanmisaka     case TEST_CASE_DEINTERLACE: {
273*437bfbebSnyanmisaka         IepImg src1;
274*437bfbebSnyanmisaka         IepImg dst1;
275*437bfbebSnyanmisaka 
276*437bfbebSnyanmisaka         if (info->src_size != fread(info->vir_src1, 1, info->src_size, cfg->fp_src))
277*437bfbebSnyanmisaka             mpp_err("failed to read %d from input\n", info->src_size);
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka         config_iep_img(&src1, cfg->src_w, cfg->src_h, cfg->src_fmt, info->phy_src1);
280*437bfbebSnyanmisaka         config_iep_img(&dst1, cfg->src_w, cfg->src_h, cfg->src_fmt, info->phy_dst1);
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka         iep_control(info->ctx, IEP_CMD_SET_DEI_SRC1, &src1);
283*437bfbebSnyanmisaka         iep_control(info->ctx, IEP_CMD_SET_DEI_DST1, &dst1);
284*437bfbebSnyanmisaka         iep_control(info->ctx, IEP_CMD_SET_DEI_CFG, cfg->dei_cfg);
285*437bfbebSnyanmisaka     } break;
286*437bfbebSnyanmisaka     default: {
287*437bfbebSnyanmisaka     } break;
288*437bfbebSnyanmisaka     }
289*437bfbebSnyanmisaka 
290*437bfbebSnyanmisaka     RK_S64 intime = mpp_time();
291*437bfbebSnyanmisaka     if (0 == iep_control(info->ctx, IEP_CMD_RUN_SYNC, NULL))
292*437bfbebSnyanmisaka         mpp_log("%d success\n", getpid());
293*437bfbebSnyanmisaka     else
294*437bfbebSnyanmisaka         mpp_log("%d failure\n", getpid());
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka     mpp_log("%s consume %lld ms\n", __func__, (mpp_time() - intime) / 1000);
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     if (cfg->fp_dst)
299*437bfbebSnyanmisaka         fwrite(info->vir_dst0, 1, info->dst_size, cfg->fp_dst);
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka     return NULL;
302*437bfbebSnyanmisaka }
303*437bfbebSnyanmisaka 
str_to_iep_fmt(const char * str)304*437bfbebSnyanmisaka static RK_S32 str_to_iep_fmt(const char *str)
305*437bfbebSnyanmisaka {
306*437bfbebSnyanmisaka     RK_S32 fmt = -1;
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     if (!strcmp(str, "argb8888"))
309*437bfbebSnyanmisaka         fmt = IEP_FORMAT_ARGB_8888;
310*437bfbebSnyanmisaka     else if (!strcmp(str, "abgr8888"))
311*437bfbebSnyanmisaka         fmt = IEP_FORMAT_ABGR_8888;
312*437bfbebSnyanmisaka     else if (!strcmp(str, "rgba8888"))
313*437bfbebSnyanmisaka         fmt = IEP_FORMAT_BGRA_8888;
314*437bfbebSnyanmisaka     else if (!strcmp(str, "bgra8888"))
315*437bfbebSnyanmisaka         fmt = IEP_FORMAT_BGRA_8888;
316*437bfbebSnyanmisaka     else if (!strcmp(str, "rgb565"))
317*437bfbebSnyanmisaka         fmt = IEP_FORMAT_RGB_565;
318*437bfbebSnyanmisaka     else if (!strcmp(str, "bgr565"))
319*437bfbebSnyanmisaka         fmt = IEP_FORMAT_BGR_565;
320*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv422sp"))
321*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCbCr_422_SP;
322*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv422p"))
323*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCbCr_422_P;
324*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv420sp"))
325*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCbCr_420_SP;
326*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv420p"))
327*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCbCr_420_P;
328*437bfbebSnyanmisaka     else if (!strcmp(str, "yvu422sp"))
329*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCrCb_422_SP;
330*437bfbebSnyanmisaka     else if (!strcmp(str, "yvu422p"))
331*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCrCb_422_P;
332*437bfbebSnyanmisaka     else if (!strcmp(str, "yvu420sp"))
333*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCrCb_420_SP;
334*437bfbebSnyanmisaka     else if (!strcmp(str, "yvu420p"))
335*437bfbebSnyanmisaka         fmt = IEP_FORMAT_YCrCb_420_P;
336*437bfbebSnyanmisaka     else
337*437bfbebSnyanmisaka         mpp_err("invalid format %s\n", str);
338*437bfbebSnyanmisaka 
339*437bfbebSnyanmisaka     return fmt;
340*437bfbebSnyanmisaka }
341*437bfbebSnyanmisaka 
check_input_cmd(IepTestCfg * cfg)342*437bfbebSnyanmisaka static MPP_RET check_input_cmd(IepTestCfg *cfg)
343*437bfbebSnyanmisaka {
344*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     if (cfg->src_w <= 0) {
347*437bfbebSnyanmisaka         mpp_err("non-positive input width %d\n", cfg->src_w);
348*437bfbebSnyanmisaka         ret = MPP_NOK;
349*437bfbebSnyanmisaka     }
350*437bfbebSnyanmisaka     if (cfg->src_h <= 0) {
351*437bfbebSnyanmisaka         mpp_err("non-positive input height %d\n", cfg->src_h);
352*437bfbebSnyanmisaka         ret = MPP_NOK;
353*437bfbebSnyanmisaka     }
354*437bfbebSnyanmisaka     if (cfg->src_fmt < IEP_FORMAT_ARGB_8888 ||
355*437bfbebSnyanmisaka         cfg->src_fmt > IEP_FORMAT_YCrCb_420_P) {
356*437bfbebSnyanmisaka         mpp_err("invalid input format\n");
357*437bfbebSnyanmisaka         ret = MPP_NOK;
358*437bfbebSnyanmisaka     }
359*437bfbebSnyanmisaka     if (cfg->fp_src == NULL) {
360*437bfbebSnyanmisaka         mpp_err("failed to open input file %s\n", cfg->src_url);
361*437bfbebSnyanmisaka         ret = MPP_NOK;
362*437bfbebSnyanmisaka     }
363*437bfbebSnyanmisaka     if (cfg->dst_w <= 0) {
364*437bfbebSnyanmisaka         mpp_err("non-positive input width %d\n", cfg->dst_w);
365*437bfbebSnyanmisaka         ret = MPP_NOK;
366*437bfbebSnyanmisaka     }
367*437bfbebSnyanmisaka     if (cfg->dst_h <= 0) {
368*437bfbebSnyanmisaka         mpp_err("non-positive input height %d\n", cfg->dst_h);
369*437bfbebSnyanmisaka         ret = MPP_NOK;
370*437bfbebSnyanmisaka     }
371*437bfbebSnyanmisaka     if (cfg->dst_fmt < IEP_FORMAT_ARGB_8888 ||
372*437bfbebSnyanmisaka         cfg->dst_fmt > IEP_FORMAT_YCrCb_420_P) {
373*437bfbebSnyanmisaka         mpp_err("invalid input format\n");
374*437bfbebSnyanmisaka         ret = MPP_NOK;
375*437bfbebSnyanmisaka     }
376*437bfbebSnyanmisaka     if (cfg->mode == TEST_CASE_NONE) {
377*437bfbebSnyanmisaka         mpp_err("invalid work mode\n");
378*437bfbebSnyanmisaka         ret = MPP_NOK;
379*437bfbebSnyanmisaka     }
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka     return ret;
382*437bfbebSnyanmisaka }
383*437bfbebSnyanmisaka 
384*437bfbebSnyanmisaka static OptionInfo iep_test_cmd[] = {
385*437bfbebSnyanmisaka     {"w",   "src_width",            "input  image width"},
386*437bfbebSnyanmisaka     {"h",   "src_height",           "input  image height"},
387*437bfbebSnyanmisaka     {"c",   "src_format",           "input  image format in ASCII string"},
388*437bfbebSnyanmisaka     {"f",   "src_file",             "input  image file name"},
389*437bfbebSnyanmisaka     {"W",   "dst_width",            "output image width"},
390*437bfbebSnyanmisaka     {"H",   "dst_height",           "output image height"},
391*437bfbebSnyanmisaka     {"C",   "dst_format",           "output image format in ASCII string"},
392*437bfbebSnyanmisaka     {"F",   "dst_file",             "output image file name"},
393*437bfbebSnyanmisaka     {"m",   "work_mode",            "working mode of iep in ASCII string"},
394*437bfbebSnyanmisaka     {"x",   "configure",            "configure file of working mode"},
395*437bfbebSnyanmisaka };
396*437bfbebSnyanmisaka 
iep_test_help()397*437bfbebSnyanmisaka static void iep_test_help()
398*437bfbebSnyanmisaka {
399*437bfbebSnyanmisaka     mpp_log("usage: iep_test [options]\n");
400*437bfbebSnyanmisaka     mpp_log("*******************************\n");
401*437bfbebSnyanmisaka     show_options(iep_test_cmd);
402*437bfbebSnyanmisaka     mpp_log("*******************************\n");
403*437bfbebSnyanmisaka     mpp_log("supported ASCII format strings:\n");
404*437bfbebSnyanmisaka     mpp_log(" 0 - argb8888\n");
405*437bfbebSnyanmisaka     mpp_log(" 1 - abgr8888\n");
406*437bfbebSnyanmisaka     mpp_log(" 2 - rgba8888\n");
407*437bfbebSnyanmisaka     mpp_log(" 3 - bgra8888\n");
408*437bfbebSnyanmisaka     mpp_log(" 4 - rgb565\n");
409*437bfbebSnyanmisaka     mpp_log(" 5 - bgr565\n");
410*437bfbebSnyanmisaka     mpp_log(" 6 - yuv422sp\n");
411*437bfbebSnyanmisaka     mpp_log(" 7 - yuv422p\n");
412*437bfbebSnyanmisaka     mpp_log(" 8 - yuv420sp\n");
413*437bfbebSnyanmisaka     mpp_log(" 9 - yuv420p\n");
414*437bfbebSnyanmisaka     mpp_log("10 - yvu422sp\n");
415*437bfbebSnyanmisaka     mpp_log("11 - yvu422p\n");
416*437bfbebSnyanmisaka     mpp_log("12 - yvu420sp\n");
417*437bfbebSnyanmisaka     mpp_log("13 - yvu420p\n");
418*437bfbebSnyanmisaka     mpp_log("*******************************\n");
419*437bfbebSnyanmisaka     mpp_log("supported work mode strings:\n");
420*437bfbebSnyanmisaka     mpp_log(" 1 - deinterlace\n");
421*437bfbebSnyanmisaka     mpp_log(" 2 - yuvenhance\n");
422*437bfbebSnyanmisaka     mpp_log(" 3 - rgbenhance\n");
423*437bfbebSnyanmisaka     mpp_log("************ sample ***********\n");
424*437bfbebSnyanmisaka     mpp_log("iep_test -w 720 -h 480 -c yuv420p -f input.yuv -W 720 -H 480 -C yuv420p -F output.yuv -m deinterlace -x dil.cfg\n");
425*437bfbebSnyanmisaka }
426*437bfbebSnyanmisaka 
main(int argc,char ** argv)427*437bfbebSnyanmisaka int main(int argc, char **argv)
428*437bfbebSnyanmisaka {
429*437bfbebSnyanmisaka     IepTestCfg cfg;
430*437bfbebSnyanmisaka     IepTestInfo info;
431*437bfbebSnyanmisaka     int ch;
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     if (argc < 2) {
434*437bfbebSnyanmisaka         iep_test_help();
435*437bfbebSnyanmisaka         return 0;
436*437bfbebSnyanmisaka     }
437*437bfbebSnyanmisaka 
438*437bfbebSnyanmisaka     memset(&cfg, 0, sizeof(cfg));
439*437bfbebSnyanmisaka     memset(&info, 0, sizeof(info));
440*437bfbebSnyanmisaka     cfg.src_fmt = IEP_FORMAT_YCbCr_420_SP;
441*437bfbebSnyanmisaka     cfg.dst_fmt = IEP_FORMAT_YCbCr_420_SP;
442*437bfbebSnyanmisaka 
443*437bfbebSnyanmisaka     /// get options
444*437bfbebSnyanmisaka     opterr = 0;
445*437bfbebSnyanmisaka     while ((ch = getopt(argc, argv, "f:w:h:c:F:W:H:C:m:x:")) != -1) {
446*437bfbebSnyanmisaka         switch (ch) {
447*437bfbebSnyanmisaka         case 'w': {
448*437bfbebSnyanmisaka             cfg.src_w = atoi(optarg);
449*437bfbebSnyanmisaka         } break;
450*437bfbebSnyanmisaka         case 'h': {
451*437bfbebSnyanmisaka             cfg.src_h = atoi(optarg);
452*437bfbebSnyanmisaka         } break;
453*437bfbebSnyanmisaka         case 'c': {
454*437bfbebSnyanmisaka             cfg.src_fmt = str_to_iep_fmt(optarg);
455*437bfbebSnyanmisaka         } break;
456*437bfbebSnyanmisaka         case 'W': {
457*437bfbebSnyanmisaka             cfg.dst_w = atoi(optarg);
458*437bfbebSnyanmisaka         } break;
459*437bfbebSnyanmisaka         case 'H': {
460*437bfbebSnyanmisaka             cfg.dst_h = atoi(optarg);
461*437bfbebSnyanmisaka         } break;
462*437bfbebSnyanmisaka         case 'C': {
463*437bfbebSnyanmisaka             cfg.dst_fmt = str_to_iep_fmt(optarg);
464*437bfbebSnyanmisaka         } break;
465*437bfbebSnyanmisaka         case 'f': {
466*437bfbebSnyanmisaka             mpp_log("input filename: %s\n", optarg);
467*437bfbebSnyanmisaka             strncpy(cfg.src_url, optarg, sizeof(cfg.src_url) - 1);
468*437bfbebSnyanmisaka             cfg.fp_src = fopen(cfg.src_url, "rb");
469*437bfbebSnyanmisaka         } break;
470*437bfbebSnyanmisaka         case 'F': {
471*437bfbebSnyanmisaka             mpp_log("output filename: %s\n", optarg);
472*437bfbebSnyanmisaka             strncpy(cfg.dst_url, optarg, sizeof(cfg.dst_url) - 1);
473*437bfbebSnyanmisaka             cfg.fp_dst = fopen(cfg.dst_url, "w+b");
474*437bfbebSnyanmisaka         } break;
475*437bfbebSnyanmisaka         case 'm': {
476*437bfbebSnyanmisaka             if (!strcmp(optarg, "deinterlace")) {
477*437bfbebSnyanmisaka                 cfg.mode = TEST_CASE_DEINTERLACE;
478*437bfbebSnyanmisaka             } else if (!strcmp(optarg, "yuvenhance")) {
479*437bfbebSnyanmisaka                 cfg.mode = TEST_CASE_YUVENHANCE;
480*437bfbebSnyanmisaka             } else if (!strcmp(optarg, "rgbenhance")) {
481*437bfbebSnyanmisaka                 cfg.mode = TEST_CASE_RGBENHANCE;
482*437bfbebSnyanmisaka             } else {
483*437bfbebSnyanmisaka                 mpp_err("invalid work mode %s\n", optarg);
484*437bfbebSnyanmisaka                 cfg.mode = TEST_CASE_NONE;
485*437bfbebSnyanmisaka             }
486*437bfbebSnyanmisaka         } break;
487*437bfbebSnyanmisaka         case 'x': {
488*437bfbebSnyanmisaka             mpp_log("configure filename: %s\n", optarg);
489*437bfbebSnyanmisaka             strncpy(cfg.cfg_url, optarg, sizeof(cfg.cfg_url) - 1);
490*437bfbebSnyanmisaka             cfg.ini = iniparser_load(cfg.cfg_url);
491*437bfbebSnyanmisaka             if (cfg.ini)
492*437bfbebSnyanmisaka                 parse_cfg(&cfg);
493*437bfbebSnyanmisaka             else
494*437bfbebSnyanmisaka                 mpp_err("invalid configure file %s\n", optarg);
495*437bfbebSnyanmisaka         } break;
496*437bfbebSnyanmisaka         default: {
497*437bfbebSnyanmisaka         } break;
498*437bfbebSnyanmisaka         }
499*437bfbebSnyanmisaka     }
500*437bfbebSnyanmisaka 
501*437bfbebSnyanmisaka     if (check_input_cmd(&cfg)) {
502*437bfbebSnyanmisaka         mpp_err("failed to pass cmd line check\n");
503*437bfbebSnyanmisaka         iep_test_help();
504*437bfbebSnyanmisaka         return -1;
505*437bfbebSnyanmisaka     }
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka     info.cfg = &cfg;
508*437bfbebSnyanmisaka     info.src_size = get_image_size(cfg.src_w, cfg.src_h, cfg.src_fmt);
509*437bfbebSnyanmisaka     info.dst_size = get_image_size(cfg.dst_w, cfg.dst_h, cfg.dst_fmt);
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka     // allocate 12M in/out memory and initialize memory address
512*437bfbebSnyanmisaka     MppBuffer buffer = NULL;
513*437bfbebSnyanmisaka     size_t src_size = MPP_ALIGN(info.src_size, SZ_4K);
514*437bfbebSnyanmisaka     size_t dst_size = MPP_ALIGN(info.dst_size, SZ_4K);
515*437bfbebSnyanmisaka     // NOTE: deinterlace need 4 fields (2 frames) as input and output 2 frames
516*437bfbebSnyanmisaka     size_t total_size = src_size * 2 + dst_size * 2;
517*437bfbebSnyanmisaka 
518*437bfbebSnyanmisaka     mpp_buffer_get(NULL, &buffer, total_size);
519*437bfbebSnyanmisaka     mpp_assert(buffer);
520*437bfbebSnyanmisaka 
521*437bfbebSnyanmisaka     int buf_fd = mpp_buffer_get_fd(buffer);
522*437bfbebSnyanmisaka     RK_U8 *buf_ptr = (RK_U8 *)mpp_buffer_get_ptr(buffer);
523*437bfbebSnyanmisaka 
524*437bfbebSnyanmisaka     memset(buf_ptr, 0xff, total_size);
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka     info.phy_src0 = ADD_OFFSET(buf_fd, 0);
527*437bfbebSnyanmisaka     info.phy_src1 = ADD_OFFSET(buf_fd, src_size);
528*437bfbebSnyanmisaka     info.phy_dst0 = ADD_OFFSET(buf_fd, src_size * 2);
529*437bfbebSnyanmisaka     info.phy_dst1 = ADD_OFFSET(buf_fd, src_size * 2 + dst_size);
530*437bfbebSnyanmisaka 
531*437bfbebSnyanmisaka     info.vir_src0 = buf_ptr;
532*437bfbebSnyanmisaka     info.vir_src1 = buf_ptr + src_size;
533*437bfbebSnyanmisaka     info.vir_dst0 = buf_ptr + src_size * 2;
534*437bfbebSnyanmisaka     info.vir_dst1 = buf_ptr + src_size * 2 + dst_size;
535*437bfbebSnyanmisaka 
536*437bfbebSnyanmisaka     iep_init(&info.ctx);
537*437bfbebSnyanmisaka 
538*437bfbebSnyanmisaka     pthread_t td;
539*437bfbebSnyanmisaka     pthread_create(&td, NULL, iep_process_thread, &info);
540*437bfbebSnyanmisaka     pthread_join(td, NULL);
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka     if (info.ctx) {
543*437bfbebSnyanmisaka         iep_deinit(info.ctx);
544*437bfbebSnyanmisaka         info.ctx = NULL;
545*437bfbebSnyanmisaka     }
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     if (cfg.fp_src) {
548*437bfbebSnyanmisaka         fclose(cfg.fp_src);
549*437bfbebSnyanmisaka         cfg.fp_src = NULL;
550*437bfbebSnyanmisaka     }
551*437bfbebSnyanmisaka 
552*437bfbebSnyanmisaka     if (cfg.fp_dst) {
553*437bfbebSnyanmisaka         fclose(cfg.fp_dst);
554*437bfbebSnyanmisaka         cfg.fp_dst = NULL;
555*437bfbebSnyanmisaka     }
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     if (cfg.ini) {
558*437bfbebSnyanmisaka         iniparser_freedict(cfg.ini);
559*437bfbebSnyanmisaka         cfg.ini = NULL;
560*437bfbebSnyanmisaka         if (cfg.yuv_enh)
561*437bfbebSnyanmisaka             mpp_free(cfg.yuv_enh);
562*437bfbebSnyanmisaka         if (cfg.rgb_enh)
563*437bfbebSnyanmisaka             mpp_free(cfg.rgb_enh);
564*437bfbebSnyanmisaka         if (cfg.dei_cfg)
565*437bfbebSnyanmisaka             mpp_free(cfg.dei_cfg);
566*437bfbebSnyanmisaka         if (cfg.colorcvt)
567*437bfbebSnyanmisaka             mpp_free(cfg.colorcvt);
568*437bfbebSnyanmisaka     }
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka     mpp_buffer_put(buffer);
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka     return 0;
573*437bfbebSnyanmisaka }
574