xref: /rockchip-linux_mpp/mpp/vproc/iep2/test/iep2_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2020 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "iep2_test"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_time.h"
23*437bfbebSnyanmisaka #include "mpp_debug.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka #include "mpp_thread.h"
26*437bfbebSnyanmisaka #include "mpp_buffer.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #include "iep2_api.h"
29*437bfbebSnyanmisaka #include "utils.h"
30*437bfbebSnyanmisaka //#include "iniparser.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #define MAX_URL_LEN                 (100)
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka typedef struct iep2_test_cfg_t {
35*437bfbebSnyanmisaka     RK_S32      w;
36*437bfbebSnyanmisaka     RK_S32      h;
37*437bfbebSnyanmisaka     RK_S32      src_fmt;
38*437bfbebSnyanmisaka     RK_S32      src_swa;
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka     RK_S32      dst_fmt;
41*437bfbebSnyanmisaka     RK_S32      dst_swa;
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka     char        src_url[MAX_URL_LEN];
44*437bfbebSnyanmisaka     char        dst_url[MAX_URL_LEN];
45*437bfbebSnyanmisaka     char        slt_url[MAX_URL_LEN];
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     FILE        *fp_src;
48*437bfbebSnyanmisaka     FILE        *fp_dst;
49*437bfbebSnyanmisaka     FILE        *fp_slt;
50*437bfbebSnyanmisaka     RK_U32      field_order;
51*437bfbebSnyanmisaka } iep2_test_cfg;
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka static OptionInfo iep2_test_cmd[] = {
54*437bfbebSnyanmisaka     {"w",   "width",            "input image width"},
55*437bfbebSnyanmisaka     {"h",   "height",           "input image height"},
56*437bfbebSnyanmisaka     {"c",   "format",           "input image format in ASCII string"},
57*437bfbebSnyanmisaka     {"i",   "src_file",         "input  image file name"},
58*437bfbebSnyanmisaka     {"C",   "dst_format",       "output image format in ASCII string"},
59*437bfbebSnyanmisaka     {"o",   "dst_file",         "output image file name"},
60*437bfbebSnyanmisaka     {"v",   "slt_file",         "slt verify data file"}
61*437bfbebSnyanmisaka };
62*437bfbebSnyanmisaka 
iep2_test_help()63*437bfbebSnyanmisaka static void iep2_test_help()
64*437bfbebSnyanmisaka {
65*437bfbebSnyanmisaka     mpp_log("usage: iep2_test [options]\n");
66*437bfbebSnyanmisaka     mpp_log("*******************************\n");
67*437bfbebSnyanmisaka     show_options(iep2_test_cmd);
68*437bfbebSnyanmisaka     mpp_log("*******************************\n");
69*437bfbebSnyanmisaka     mpp_log("supported ASCII format strings:\n");
70*437bfbebSnyanmisaka     mpp_log("1 - yuv422sp\n");
71*437bfbebSnyanmisaka     mpp_log("2 - yuv422p [just for source format]\n");
72*437bfbebSnyanmisaka     mpp_log("3 - yuv420sp\n");
73*437bfbebSnyanmisaka     mpp_log("4 - yuv420p [just for source format]\n");
74*437bfbebSnyanmisaka     mpp_log("5 - yvu422sp\n");
75*437bfbebSnyanmisaka     mpp_log("6 - yvu420sp\n");
76*437bfbebSnyanmisaka     mpp_log("************ sample ***********\n");
77*437bfbebSnyanmisaka     mpp_log("iep2_test -w 720 -h 480 -c yuv420p -i input.yuv -C yuv420p -o output.yuv\n");
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka 
str_to_iep2_fmt(const char * str)80*437bfbebSnyanmisaka static RK_S32 str_to_iep2_fmt(const char *str)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka     RK_S32 fmt = -1;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     mpp_log("format %s\n", str);
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     if (!strcmp(str, "yuv422sp") ||
87*437bfbebSnyanmisaka         !strcmp(str, "yuv422p") ||
88*437bfbebSnyanmisaka         !strcmp(str, "yvu422sp"))
89*437bfbebSnyanmisaka         fmt = IEP2_FMT_YUV422;
90*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv420p") ||
91*437bfbebSnyanmisaka              !strcmp(str, "yuv420sp") ||
92*437bfbebSnyanmisaka              !strcmp(str, "yvu420sp"))
93*437bfbebSnyanmisaka         fmt = IEP2_FMT_YUV420;
94*437bfbebSnyanmisaka     else
95*437bfbebSnyanmisaka         mpp_err("invalid format %s\n", str);
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     return fmt;
98*437bfbebSnyanmisaka }
99*437bfbebSnyanmisaka 
str_to_iep2_swa(const char * str)100*437bfbebSnyanmisaka static RK_S32 str_to_iep2_swa(const char *str)
101*437bfbebSnyanmisaka {
102*437bfbebSnyanmisaka     RK_S32 swa = -1;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     if (!strcmp(str, "yuv422p") ||
105*437bfbebSnyanmisaka         !strcmp(str, "yuv420p"))
106*437bfbebSnyanmisaka         swa = IEP2_YUV_SWAP_P;
107*437bfbebSnyanmisaka     else if (!strcmp(str, "yvu422sp") ||
108*437bfbebSnyanmisaka              !strcmp(str, "yvu420sp"))
109*437bfbebSnyanmisaka         swa = IEP2_YUV_SWAP_SP_VU;
110*437bfbebSnyanmisaka     else if (!strcmp(str, "yuv422sp") ||
111*437bfbebSnyanmisaka              !strcmp(str, "yuv420sp"))
112*437bfbebSnyanmisaka         swa = IEP2_YUV_SWAP_SP_UV;
113*437bfbebSnyanmisaka     else
114*437bfbebSnyanmisaka         mpp_err("invalid format %s\n", str);
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka     return swa;
117*437bfbebSnyanmisaka }
118*437bfbebSnyanmisaka 
check_input_cmd(iep2_test_cfg * cfg)119*437bfbebSnyanmisaka static MPP_RET check_input_cmd(iep2_test_cfg *cfg)
120*437bfbebSnyanmisaka {
121*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     if (cfg->w < 16 || cfg->w > 1920) {
124*437bfbebSnyanmisaka         mpp_err("invalid width %d\n", cfg->w);
125*437bfbebSnyanmisaka         ret = MPP_NOK;
126*437bfbebSnyanmisaka     }
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     if (cfg->h < 4 || cfg->h > 1088) {
129*437bfbebSnyanmisaka         mpp_err("invalid height %d\n", cfg->h);
130*437bfbebSnyanmisaka         ret = MPP_NOK;
131*437bfbebSnyanmisaka     }
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     mpp_log("src fmt %d, %d dst fmt %d, %d\n",
134*437bfbebSnyanmisaka             cfg->src_fmt, cfg->src_swa,
135*437bfbebSnyanmisaka             cfg->dst_fmt, cfg->dst_swa);
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     if (cfg->src_fmt < IEP2_FMT_YUV422 ||
138*437bfbebSnyanmisaka         cfg->src_fmt > IEP2_FMT_YUV420 ||
139*437bfbebSnyanmisaka         cfg->src_swa < IEP2_YUV_SWAP_SP_UV ||
140*437bfbebSnyanmisaka         cfg->src_swa > IEP2_YUV_SWAP_P) {
141*437bfbebSnyanmisaka         mpp_err("invalid input format\n");
142*437bfbebSnyanmisaka         ret = MPP_NOK;
143*437bfbebSnyanmisaka     }
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     if (cfg->fp_src == NULL) {
146*437bfbebSnyanmisaka         mpp_err("failed to open input file %s\n", cfg->src_url);
147*437bfbebSnyanmisaka         ret = MPP_NOK;
148*437bfbebSnyanmisaka     }
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     if (cfg->dst_fmt < IEP2_FMT_YUV422 ||
151*437bfbebSnyanmisaka         cfg->dst_fmt > IEP2_FMT_YUV420 ||
152*437bfbebSnyanmisaka         cfg->dst_swa < IEP2_YUV_SWAP_SP_UV ||
153*437bfbebSnyanmisaka         cfg->dst_swa > IEP2_YUV_SWAP_SP_VU) {
154*437bfbebSnyanmisaka         mpp_err("invalid output format\n");
155*437bfbebSnyanmisaka         ret = MPP_NOK;
156*437bfbebSnyanmisaka     }
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     return ret;
159*437bfbebSnyanmisaka }
160*437bfbebSnyanmisaka 
get_frm_size(RK_S32 fmt,int w,int h)161*437bfbebSnyanmisaka static inline size_t get_frm_size(RK_S32 fmt, int w, int h)
162*437bfbebSnyanmisaka {
163*437bfbebSnyanmisaka     switch (fmt) {
164*437bfbebSnyanmisaka     case IEP2_FMT_YUV422:
165*437bfbebSnyanmisaka         return w * h * 2;
166*437bfbebSnyanmisaka     case IEP2_FMT_YUV420:
167*437bfbebSnyanmisaka         return w * h * 3 / 2;
168*437bfbebSnyanmisaka     default:
169*437bfbebSnyanmisaka         abort();
170*437bfbebSnyanmisaka         return 0;
171*437bfbebSnyanmisaka     }
172*437bfbebSnyanmisaka }
173*437bfbebSnyanmisaka 
iep2_test_set_img(iep_com_ctx * ctx,int w,int h,IepImg * img,RK_S32 fd,IepCmd cmd)174*437bfbebSnyanmisaka static void iep2_test_set_img(iep_com_ctx *ctx, int w, int h,
175*437bfbebSnyanmisaka                               IepImg *img, RK_S32 fd, IepCmd cmd)
176*437bfbebSnyanmisaka {
177*437bfbebSnyanmisaka     RK_S32 y_size = w * h;
178*437bfbebSnyanmisaka     img->mem_addr = fd;
179*437bfbebSnyanmisaka     img->uv_addr = fd + (y_size << 10);
180*437bfbebSnyanmisaka     switch (img->format) {
181*437bfbebSnyanmisaka     case IEP2_FMT_YUV422:
182*437bfbebSnyanmisaka         img->v_addr = fd + ((y_size + y_size / 2) << 10);
183*437bfbebSnyanmisaka         break;
184*437bfbebSnyanmisaka     case IEP2_FMT_YUV420:
185*437bfbebSnyanmisaka         img->v_addr = fd + ((y_size + y_size / 4) << 10);
186*437bfbebSnyanmisaka         break;
187*437bfbebSnyanmisaka     default:
188*437bfbebSnyanmisaka         break;
189*437bfbebSnyanmisaka     }
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     MPP_RET ret = ctx->ops->control(ctx->priv, cmd, img);
192*437bfbebSnyanmisaka     if (ret)
193*437bfbebSnyanmisaka         mpp_log_f("control %08x failed %d\n", cmd, ret);
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka 
iep2_test(iep2_test_cfg * cfg)196*437bfbebSnyanmisaka void iep2_test(iep2_test_cfg *cfg)
197*437bfbebSnyanmisaka {
198*437bfbebSnyanmisaka     iep_com_ctx* iep2 = rockchip_iep2_api_alloc_ctx();
199*437bfbebSnyanmisaka     size_t srcfrmsize = get_frm_size(cfg->src_fmt, cfg->w, cfg->h);
200*437bfbebSnyanmisaka     size_t dstfrmsize = get_frm_size(cfg->dst_fmt, cfg->w, cfg->h);
201*437bfbebSnyanmisaka     MppBuffer srcbuf[3];
202*437bfbebSnyanmisaka     MppBuffer dstbuf[2];
203*437bfbebSnyanmisaka     RK_U8 *psrc[3];
204*437bfbebSnyanmisaka     RK_U8 *pdst[2];
205*437bfbebSnyanmisaka     RK_S32 fdsrc[3];
206*437bfbebSnyanmisaka     RK_S32 fddst[2];
207*437bfbebSnyanmisaka     int prev, curr, next;
208*437bfbebSnyanmisaka     struct iep2_api_params params;
209*437bfbebSnyanmisaka     RK_U32 i;
210*437bfbebSnyanmisaka     RK_S32 field_order = IEP2_FIELD_ORDER_TFF;
211*437bfbebSnyanmisaka     RK_S32 out_order = field_order == IEP2_FIELD_ORDER_TFF ? 0 : 1;
212*437bfbebSnyanmisaka     DataCrc checkcrc;
213*437bfbebSnyanmisaka     struct iep2_api_info dei_info;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     // NOTISE, used IepImg structure for version compatibility consideration,
216*437bfbebSnyanmisaka     // only addresses in this structure are useful in iep2
217*437bfbebSnyanmisaka     IepImg imgsrc[3];
218*437bfbebSnyanmisaka     IepImg imgdst[2];
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     mpp_assert(iep2);
221*437bfbebSnyanmisaka     MppBufferGroup memGroup;
222*437bfbebSnyanmisaka     MPP_RET ret = mpp_buffer_group_get_internal(&memGroup, MPP_BUFFER_TYPE_DRM);
223*437bfbebSnyanmisaka     if (MPP_OK != ret) {
224*437bfbebSnyanmisaka         mpp_err("memGroup mpp_buffer_group_get failed\n");
225*437bfbebSnyanmisaka         mpp_assert(0);
226*437bfbebSnyanmisaka     }
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka     memset(&checkcrc, 0, sizeof(checkcrc));
229*437bfbebSnyanmisaka     checkcrc.sum = mpp_malloc(RK_ULONG, 512);
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &srcbuf[0], srcfrmsize);
232*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &srcbuf[1], srcfrmsize);
233*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &srcbuf[2], srcfrmsize);
234*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &dstbuf[0], dstfrmsize);
235*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &dstbuf[1], dstfrmsize);
236*437bfbebSnyanmisaka     mpp_assert(srcbuf[0] && srcbuf[1] && srcbuf[2] && dstbuf[0] && dstbuf[1]);
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka     psrc[0] = mpp_buffer_get_ptr(srcbuf[0]);
239*437bfbebSnyanmisaka     psrc[1] = mpp_buffer_get_ptr(srcbuf[1]);
240*437bfbebSnyanmisaka     psrc[2] = mpp_buffer_get_ptr(srcbuf[2]);
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka     pdst[0] = mpp_buffer_get_ptr(dstbuf[0]);
243*437bfbebSnyanmisaka     pdst[1] = mpp_buffer_get_ptr(dstbuf[1]);
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka     fdsrc[0] = mpp_buffer_get_fd(srcbuf[0]);
246*437bfbebSnyanmisaka     fdsrc[1] = mpp_buffer_get_fd(srcbuf[1]);
247*437bfbebSnyanmisaka     fdsrc[2] = mpp_buffer_get_fd(srcbuf[2]);
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka     fddst[0] = mpp_buffer_get_fd(dstbuf[0]);
250*437bfbebSnyanmisaka     fddst[1] = mpp_buffer_get_fd(dstbuf[1]);
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     iep2->ops->init(&iep2->priv);
253*437bfbebSnyanmisaka 
254*437bfbebSnyanmisaka     if (srcfrmsize > fread(psrc[0], 1, srcfrmsize, cfg->fp_src)) {
255*437bfbebSnyanmisaka         mpp_log("source exhaused\n");
256*437bfbebSnyanmisaka         goto ret;
257*437bfbebSnyanmisaka     }
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka     if (srcfrmsize > fread(psrc[1], 1, srcfrmsize, cfg->fp_src)) {
260*437bfbebSnyanmisaka         mpp_log("source exhaused\n");
261*437bfbebSnyanmisaka         goto ret;
262*437bfbebSnyanmisaka     }
263*437bfbebSnyanmisaka 
264*437bfbebSnyanmisaka     curr = 1;
265*437bfbebSnyanmisaka 
266*437bfbebSnyanmisaka     // set running mode.
267*437bfbebSnyanmisaka     /* if deinterlacing mode is one in the following list:
268*437bfbebSnyanmisaka         IEP2_DIL_MODE_I5O2,
269*437bfbebSnyanmisaka         IEP2_DIL_MODE_I5O1T,
270*437bfbebSnyanmisaka         IEP2_DIL_MODE_I5O1B,
271*437bfbebSnyanmisaka         IEP2_DIL_MODE_DECT
272*437bfbebSnyanmisaka        field order will auto detect by iep2 library.
273*437bfbebSnyanmisaka        so don't try to set field order during the playback.
274*437bfbebSnyanmisaka     */
275*437bfbebSnyanmisaka     params.ptype = IEP2_PARAM_TYPE_MODE;
276*437bfbebSnyanmisaka     params.param.mode.dil_mode = IEP2_DIL_MODE_I5O2;
277*437bfbebSnyanmisaka     params.param.mode.out_mode = IEP2_OUT_MODE_LINE;
278*437bfbebSnyanmisaka     params.param.mode.dil_order = cfg->field_order;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     iep2->ops->control(iep2->priv, IEP_CMD_SET_DEI_CFG, &params);
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka     // set the image format.
283*437bfbebSnyanmisaka     params.ptype = IEP2_PARAM_TYPE_COM;
284*437bfbebSnyanmisaka     params.param.com.sfmt = cfg->src_fmt;
285*437bfbebSnyanmisaka     params.param.com.dfmt = cfg->dst_fmt;
286*437bfbebSnyanmisaka     params.param.com.sswap = cfg->src_swa;
287*437bfbebSnyanmisaka     params.param.com.dswap = cfg->dst_swa;
288*437bfbebSnyanmisaka     params.param.com.width = cfg->w;
289*437bfbebSnyanmisaka     params.param.com.height = cfg->h;
290*437bfbebSnyanmisaka     params.param.com.hor_stride = cfg->w;
291*437bfbebSnyanmisaka     iep2->ops->control(iep2->priv, IEP_CMD_SET_DEI_CFG, &params);
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(imgsrc); i++)
294*437bfbebSnyanmisaka         imgsrc[i].format = cfg->src_fmt;
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(imgdst); i++)
297*437bfbebSnyanmisaka         imgdst[i].format = cfg->dst_fmt;
298*437bfbebSnyanmisaka 
299*437bfbebSnyanmisaka     while (1) {
300*437bfbebSnyanmisaka         prev = (curr - 1) % 3;
301*437bfbebSnyanmisaka         curr = curr % 3;
302*437bfbebSnyanmisaka         next = (curr + 1) % 3;
303*437bfbebSnyanmisaka 
304*437bfbebSnyanmisaka         if (srcfrmsize > fread(psrc[next], 1, srcfrmsize, cfg->fp_src)) {
305*437bfbebSnyanmisaka             mpp_log("source exhaused\n");
306*437bfbebSnyanmisaka             break;
307*437bfbebSnyanmisaka         }
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka         // notice the order of the input frames.
310*437bfbebSnyanmisaka         iep2_test_set_img(iep2, cfg->w, cfg->h,
311*437bfbebSnyanmisaka                           &imgsrc[curr], fdsrc[curr], IEP_CMD_SET_SRC);
312*437bfbebSnyanmisaka         iep2_test_set_img(iep2, cfg->w, cfg->h,
313*437bfbebSnyanmisaka                           &imgsrc[next], fdsrc[next], IEP_CMD_SET_DEI_SRC1);
314*437bfbebSnyanmisaka         iep2_test_set_img(iep2, cfg->w, cfg->h,
315*437bfbebSnyanmisaka                           &imgsrc[prev], fdsrc[prev], IEP_CMD_SET_DEI_SRC2);
316*437bfbebSnyanmisaka         iep2_test_set_img(iep2, cfg->w, cfg->h,
317*437bfbebSnyanmisaka                           &imgdst[0], fddst[0], IEP_CMD_SET_DST);
318*437bfbebSnyanmisaka         iep2_test_set_img(iep2, cfg->w, cfg->h,
319*437bfbebSnyanmisaka                           &imgdst[1], fddst[1], IEP_CMD_SET_DEI_DST1);
320*437bfbebSnyanmisaka 
321*437bfbebSnyanmisaka         memset(pdst[0], 0, dstfrmsize);
322*437bfbebSnyanmisaka         memset(pdst[1], 0, dstfrmsize);
323*437bfbebSnyanmisaka         iep2->ops->control(iep2->priv, IEP_CMD_RUN_SYNC, &dei_info);
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka         if (cfg->fp_slt) {
326*437bfbebSnyanmisaka             calc_data_crc(pdst[out_order], dstfrmsize, &checkcrc);
327*437bfbebSnyanmisaka             write_data_crc(cfg->fp_slt, &checkcrc);
328*437bfbebSnyanmisaka             calc_data_crc(pdst[1 - out_order], dstfrmsize, &checkcrc);
329*437bfbebSnyanmisaka             write_data_crc(cfg->fp_slt, &checkcrc);
330*437bfbebSnyanmisaka         }
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka         out_order = dei_info.dil_order == IEP2_FIELD_ORDER_BFF ? 1 : 0;
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka         if (cfg->fp_dst) {
335*437bfbebSnyanmisaka             if (dstfrmsize > fwrite(pdst[out_order], 1, dstfrmsize, cfg->fp_dst)) {
336*437bfbebSnyanmisaka                 mpp_err("destination dump failed\n");
337*437bfbebSnyanmisaka                 break;
338*437bfbebSnyanmisaka             }
339*437bfbebSnyanmisaka 
340*437bfbebSnyanmisaka             if (dstfrmsize > fwrite(pdst[1 - out_order], 1, dstfrmsize, cfg->fp_dst)) {
341*437bfbebSnyanmisaka                 mpp_err("destination dump failed\n");
342*437bfbebSnyanmisaka                 break;
343*437bfbebSnyanmisaka             }
344*437bfbebSnyanmisaka         }
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka         curr++;
347*437bfbebSnyanmisaka     }
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka ret:
350*437bfbebSnyanmisaka     mpp_buffer_put(srcbuf[0]);
351*437bfbebSnyanmisaka     mpp_buffer_put(srcbuf[1]);
352*437bfbebSnyanmisaka     mpp_buffer_put(srcbuf[2]);
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     mpp_buffer_put(dstbuf[0]);
355*437bfbebSnyanmisaka     mpp_buffer_put(dstbuf[1]);
356*437bfbebSnyanmisaka 
357*437bfbebSnyanmisaka     MPP_FREE(checkcrc.sum);
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka     if (memGroup) {
360*437bfbebSnyanmisaka         mpp_buffer_group_put(memGroup);
361*437bfbebSnyanmisaka         memGroup = NULL;
362*437bfbebSnyanmisaka     }
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     iep2->ops->deinit(iep2->priv);
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka     rockchip_iep2_api_release_ctx(iep2);
367*437bfbebSnyanmisaka }
368*437bfbebSnyanmisaka 
main(int argc,char ** argv)369*437bfbebSnyanmisaka int main(int argc, char **argv)
370*437bfbebSnyanmisaka {
371*437bfbebSnyanmisaka     iep2_test_cfg cfg;
372*437bfbebSnyanmisaka     int ch;
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     if (argc < 2) {
375*437bfbebSnyanmisaka         iep2_test_help();
376*437bfbebSnyanmisaka         return 0;
377*437bfbebSnyanmisaka     }
378*437bfbebSnyanmisaka 
379*437bfbebSnyanmisaka     memset(&cfg, 0, sizeof(cfg));
380*437bfbebSnyanmisaka     cfg.src_fmt = IEP2_FMT_YUV420;
381*437bfbebSnyanmisaka     cfg.src_swa = IEP2_YUV_SWAP_SP_UV;
382*437bfbebSnyanmisaka     cfg.dst_fmt = IEP2_FMT_YUV420;
383*437bfbebSnyanmisaka     cfg.dst_swa = IEP2_YUV_SWAP_SP_UV;
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka     /// get options
386*437bfbebSnyanmisaka     opterr = 0;
387*437bfbebSnyanmisaka     while ((ch = getopt(argc, argv, "i:w:h:c:o:C:v:f:")) != -1) {
388*437bfbebSnyanmisaka         switch (ch) {
389*437bfbebSnyanmisaka         case 'w': {
390*437bfbebSnyanmisaka             cfg.w = atoi(optarg);
391*437bfbebSnyanmisaka         } break;
392*437bfbebSnyanmisaka         case 'h': {
393*437bfbebSnyanmisaka             cfg.h = atoi(optarg);
394*437bfbebSnyanmisaka         } break;
395*437bfbebSnyanmisaka         case 'c': {
396*437bfbebSnyanmisaka             cfg.src_fmt = str_to_iep2_fmt(optarg);
397*437bfbebSnyanmisaka             cfg.src_swa = str_to_iep2_swa(optarg);
398*437bfbebSnyanmisaka         } break;
399*437bfbebSnyanmisaka         case 'C': {
400*437bfbebSnyanmisaka             cfg.dst_fmt = str_to_iep2_fmt(optarg);
401*437bfbebSnyanmisaka             cfg.dst_swa = str_to_iep2_swa(optarg);
402*437bfbebSnyanmisaka         } break;
403*437bfbebSnyanmisaka         case 'i': {
404*437bfbebSnyanmisaka             mpp_log("input filename: %s\n", optarg);
405*437bfbebSnyanmisaka             strncpy(cfg.src_url, optarg, sizeof(cfg.src_url) - 1);
406*437bfbebSnyanmisaka             cfg.fp_src = fopen(cfg.src_url, "rb");
407*437bfbebSnyanmisaka         } break;
408*437bfbebSnyanmisaka         case 'o': {
409*437bfbebSnyanmisaka             mpp_log("output filename: %s\n", optarg);
410*437bfbebSnyanmisaka             strncpy(cfg.dst_url, optarg, sizeof(cfg.dst_url) - 1);
411*437bfbebSnyanmisaka             cfg.fp_dst = fopen(cfg.dst_url, "w+b");
412*437bfbebSnyanmisaka         } break;
413*437bfbebSnyanmisaka         case 'v': {
414*437bfbebSnyanmisaka             mpp_log("verify file: %s\n", optarg);
415*437bfbebSnyanmisaka             strncpy(cfg.slt_url, optarg, sizeof(cfg.slt_url) - 1);
416*437bfbebSnyanmisaka             cfg.fp_slt = fopen(cfg.slt_url, "w+b");
417*437bfbebSnyanmisaka         } break;
418*437bfbebSnyanmisaka         case 'f': {
419*437bfbebSnyanmisaka             if (!strcmp(optarg, "TFF"))
420*437bfbebSnyanmisaka                 cfg.field_order = IEP2_FIELD_ORDER_TFF;
421*437bfbebSnyanmisaka             else
422*437bfbebSnyanmisaka                 cfg.field_order = IEP2_FIELD_ORDER_BFF;
423*437bfbebSnyanmisaka         } break;
424*437bfbebSnyanmisaka         default: {
425*437bfbebSnyanmisaka         } break;
426*437bfbebSnyanmisaka         }
427*437bfbebSnyanmisaka     }
428*437bfbebSnyanmisaka 
429*437bfbebSnyanmisaka     if (check_input_cmd(&cfg)) {
430*437bfbebSnyanmisaka         mpp_err("failed to pass cmd line check\n");
431*437bfbebSnyanmisaka         iep2_test_help();
432*437bfbebSnyanmisaka         return -1;
433*437bfbebSnyanmisaka     }
434*437bfbebSnyanmisaka 
435*437bfbebSnyanmisaka     iep2_test(&cfg);
436*437bfbebSnyanmisaka 
437*437bfbebSnyanmisaka     if (cfg.fp_src) {
438*437bfbebSnyanmisaka         fclose(cfg.fp_src);
439*437bfbebSnyanmisaka         cfg.fp_src = NULL;
440*437bfbebSnyanmisaka     }
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     if (cfg.fp_dst) {
443*437bfbebSnyanmisaka         fclose(cfg.fp_dst);
444*437bfbebSnyanmisaka         cfg.fp_dst = NULL;
445*437bfbebSnyanmisaka     }
446*437bfbebSnyanmisaka 
447*437bfbebSnyanmisaka     if (cfg.fp_slt) {
448*437bfbebSnyanmisaka         fclose(cfg.fp_slt);
449*437bfbebSnyanmisaka         cfg.fp_slt = NULL;
450*437bfbebSnyanmisaka     }
451*437bfbebSnyanmisaka 
452*437bfbebSnyanmisaka     return 0;
453*437bfbebSnyanmisaka }
454