xref: /rockchip-linux_mpp/mpp/vproc/vdpp/test/hwpq_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 "hwpq_test"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <getopt.h>
9*437bfbebSnyanmisaka #include <stdlib.h>
10*437bfbebSnyanmisaka #include <stdint.h>
11*437bfbebSnyanmisaka #include <string.h>
12*437bfbebSnyanmisaka #include <stdio.h>
13*437bfbebSnyanmisaka #include <pthread.h>
14*437bfbebSnyanmisaka #include <errno.h>
15*437bfbebSnyanmisaka 
16*437bfbebSnyanmisaka #include "mpp_mem.h"
17*437bfbebSnyanmisaka #include "mpp_buffer.h"
18*437bfbebSnyanmisaka #include "mpp_log.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "hwpq_vdpp_proc_api.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka typedef struct {
23*437bfbebSnyanmisaka     char src_file_name[128];
24*437bfbebSnyanmisaka     char dst_file_name_y[128];
25*437bfbebSnyanmisaka     char dst_file_name_uv[128];
26*437bfbebSnyanmisaka     char dst_file_name_hist[128];
27*437bfbebSnyanmisaka     unsigned int img_w_i;
28*437bfbebSnyanmisaka     unsigned int img_h_i;
29*437bfbebSnyanmisaka     unsigned int img_w_i_vir;
30*437bfbebSnyanmisaka     unsigned int img_h_i_vir;
31*437bfbebSnyanmisaka     unsigned int img_w_o;
32*437bfbebSnyanmisaka     unsigned int img_h_o;
33*437bfbebSnyanmisaka     unsigned int img_w_o_vir;
34*437bfbebSnyanmisaka     unsigned int img_h_o_vir;
35*437bfbebSnyanmisaka     unsigned int uv_diff_flag;
36*437bfbebSnyanmisaka     unsigned int img_w_o_c;
37*437bfbebSnyanmisaka     unsigned int img_h_o_c;
38*437bfbebSnyanmisaka     unsigned int img_w_o_c_vir;
39*437bfbebSnyanmisaka     unsigned int img_h_o_c_vir;
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     unsigned int work_mode;
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka     int32_t      nthreads;
44*437bfbebSnyanmisaka     int32_t      frame_num;
45*437bfbebSnyanmisaka } VdppCmdCfg;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka typedef struct {
48*437bfbebSnyanmisaka     int             chn;
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka     FILE           *fp_i;
51*437bfbebSnyanmisaka     FILE           *fp_o_y;
52*437bfbebSnyanmisaka     FILE           *fp_o_uv;
53*437bfbebSnyanmisaka     FILE           *fp_o_h;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka     unsigned int    frm_eos;
56*437bfbebSnyanmisaka     unsigned int    loop_times;
57*437bfbebSnyanmisaka } VdppTestMultiCtx;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka typedef struct {
60*437bfbebSnyanmisaka     VdppCmdCfg           *cmd;
61*437bfbebSnyanmisaka     int                   chn;
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     pthread_t             thd;     // thread for for each instance
64*437bfbebSnyanmisaka     VdppTestMultiCtx      ctx;     // context of vdpp
65*437bfbebSnyanmisaka } VdppTestMultiCtxInfo;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka static void parse_cmd(char** argv, int argc, VdppCmdCfg* p_cmd_cfg);
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka extern char *optarg;
70*437bfbebSnyanmisaka extern int   opterr;
71*437bfbebSnyanmisaka 
multi_vdpp(void * cmd_ctx)72*437bfbebSnyanmisaka static void *multi_vdpp(void *cmd_ctx)
73*437bfbebSnyanmisaka {
74*437bfbebSnyanmisaka     VdppTestMultiCtxInfo *info = (VdppTestMultiCtxInfo *)cmd_ctx;
75*437bfbebSnyanmisaka     VdppTestMultiCtx *ctx  = &info->ctx;
76*437bfbebSnyanmisaka     VdppCmdCfg *p_cmd_cfg  = info->cmd;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     rk_vdpp_context vdpp_ctx;
79*437bfbebSnyanmisaka     rk_vdpp_proc_params vdpp_proc_cfg;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     // cmd config params
82*437bfbebSnyanmisaka     if (p_cmd_cfg->uv_diff_flag == 0) {
83*437bfbebSnyanmisaka         p_cmd_cfg->img_w_o_c = p_cmd_cfg->img_w_o;
84*437bfbebSnyanmisaka         p_cmd_cfg->img_h_o_c = p_cmd_cfg->img_h_o;
85*437bfbebSnyanmisaka         p_cmd_cfg->img_w_o_c_vir = p_cmd_cfg->img_w_o_vir;
86*437bfbebSnyanmisaka         p_cmd_cfg->img_h_o_c_vir = p_cmd_cfg->img_h_o_vir;
87*437bfbebSnyanmisaka     }
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     size_t srcfrmsize = p_cmd_cfg->img_w_i_vir * p_cmd_cfg->img_h_i_vir * 3 / 2;
90*437bfbebSnyanmisaka     size_t dstfrmsize = p_cmd_cfg->img_w_o_vir * p_cmd_cfg->img_h_o_vir * 3;
91*437bfbebSnyanmisaka     size_t dstfrmsize_c = p_cmd_cfg->img_w_o_c_vir * p_cmd_cfg->img_h_o_c_vir * 2;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     // malloc buffers
94*437bfbebSnyanmisaka     MppBuffer srcbuf;
95*437bfbebSnyanmisaka     MppBuffer dstbuf;
96*437bfbebSnyanmisaka     MppBuffer dstbuf_c;
97*437bfbebSnyanmisaka     MppBuffer histbuf;
98*437bfbebSnyanmisaka     void *psrc = NULL;
99*437bfbebSnyanmisaka     void *pdst = NULL;
100*437bfbebSnyanmisaka     void *phist = NULL;
101*437bfbebSnyanmisaka     RK_S32 fdsrc = -1;
102*437bfbebSnyanmisaka     RK_S32 fddst = -1;
103*437bfbebSnyanmisaka     RK_S32 fdhist = -1;
104*437bfbebSnyanmisaka     int frame_idx = 0;
105*437bfbebSnyanmisaka     MppBufferGroup memGroup;
106*437bfbebSnyanmisaka     MPP_RET ret = mpp_buffer_group_get_internal(&memGroup, MPP_BUFFER_TYPE_DRM);
107*437bfbebSnyanmisaka     if (MPP_OK != ret) {
108*437bfbebSnyanmisaka         mpp_err("memGroup mpp_buffer_group_get failed\n");
109*437bfbebSnyanmisaka         return NULL;
110*437bfbebSnyanmisaka     }
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &srcbuf, srcfrmsize);
113*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &dstbuf, dstfrmsize);
114*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &dstbuf_c, dstfrmsize_c);
115*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &histbuf, VDPP_HIST_LENGTH);
116*437bfbebSnyanmisaka     psrc    = mpp_buffer_get_ptr(srcbuf);
117*437bfbebSnyanmisaka     pdst    = mpp_buffer_get_ptr(dstbuf);
118*437bfbebSnyanmisaka     phist   = mpp_buffer_get_ptr(histbuf);
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     fdsrc   = mpp_buffer_get_fd(srcbuf);
121*437bfbebSnyanmisaka     fddst   = mpp_buffer_get_fd(dstbuf);
122*437bfbebSnyanmisaka     fdhist  = mpp_buffer_get_fd(histbuf);
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka     hwpq_vdpp_init(&vdpp_ctx);
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     ctx->chn = info->chn;
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     ctx->fp_i = fopen(p_cmd_cfg->src_file_name, "rb");
129*437bfbebSnyanmisaka     if (!ctx->fp_i) {
130*437bfbebSnyanmisaka         mpp_err("failed to open file %s", p_cmd_cfg->src_file_name);
131*437bfbebSnyanmisaka         goto __RET;
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     ctx->fp_o_y = fopen(p_cmd_cfg->dst_file_name_y, "wb");
135*437bfbebSnyanmisaka     ctx->fp_o_uv = fopen(p_cmd_cfg->dst_file_name_uv, "wb");
136*437bfbebSnyanmisaka     ctx->fp_o_h = fopen(p_cmd_cfg->dst_file_name_hist, "wb");
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     while (1) {
139*437bfbebSnyanmisaka         vdpp_proc_cfg.frame_idx = frame_idx;
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka         if ((srcfrmsize > fread(psrc, 1, srcfrmsize, ctx->fp_i)) || feof(ctx->fp_i)) {
142*437bfbebSnyanmisaka             ctx->frm_eos = 1;
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka             if (p_cmd_cfg->frame_num < 0 || frame_idx < p_cmd_cfg->frame_num) {
145*437bfbebSnyanmisaka                 clearerr(ctx->fp_i);
146*437bfbebSnyanmisaka                 rewind(ctx->fp_i);
147*437bfbebSnyanmisaka                 ctx->frm_eos = 0;
148*437bfbebSnyanmisaka                 mpp_log("chn %d loop times %d\n", ctx->chn, ++ctx->loop_times);
149*437bfbebSnyanmisaka                 continue;
150*437bfbebSnyanmisaka             }
151*437bfbebSnyanmisaka             mpp_log("chn %d found last frame. feof %d\n", ctx->chn, feof(ctx->fp_i));
152*437bfbebSnyanmisaka         } else if (ret == MPP_ERR_VALUE)
153*437bfbebSnyanmisaka             break;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_fmt = VDPP_FMT_NV12;
156*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.fd = fdsrc;
157*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.addr = psrc;
158*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.offset = 0;
159*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.w_vld = p_cmd_cfg->img_w_i;
160*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.h_vld = p_cmd_cfg->img_h_i;
161*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.w_vir = p_cmd_cfg->img_w_i_vir;
162*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_yrgb.h_vir = p_cmd_cfg->img_h_i_vir;
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.fd = fdsrc;
165*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.addr = psrc;
166*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.offset = p_cmd_cfg->img_w_i_vir * p_cmd_cfg->img_h_i_vir;
167*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.w_vld = p_cmd_cfg->img_w_i / 2;
168*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.h_vld = p_cmd_cfg->img_h_i / 2;
169*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.w_vir = p_cmd_cfg->img_w_i_vir;
170*437bfbebSnyanmisaka         vdpp_proc_cfg.src_img_info.img_cbcr.h_vir = p_cmd_cfg->img_h_i_vir / 2;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_fmt = VDPP_FMT_NV24;
173*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.fd = fddst;
174*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.addr = pdst;
175*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.offset = 0;
176*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.w_vld = p_cmd_cfg->img_w_o;
177*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.h_vld = p_cmd_cfg->img_h_o;
178*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.w_vir = p_cmd_cfg->img_w_o_vir;
179*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_yrgb.h_vir = p_cmd_cfg->img_h_o_vir;
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.fd = fddst;
182*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.addr = pdst;
183*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.offset = p_cmd_cfg->img_w_o_vir * p_cmd_cfg->img_h_o_vir;
184*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.w_vld = p_cmd_cfg->img_w_o_c;
185*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.h_vld = p_cmd_cfg->img_h_o_c;
186*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.w_vir = p_cmd_cfg->img_w_o_c_vir;
187*437bfbebSnyanmisaka         vdpp_proc_cfg.dst_img_info.img_cbcr.h_vir = p_cmd_cfg->img_h_o_c_vir;
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka         {
190*437bfbebSnyanmisaka             int work_mode_ref = hwpq_vdpp_check_work_mode(vdpp_ctx, &vdpp_proc_cfg);
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka             vdpp_proc_cfg.hist_mode_en = (VDPP_RUN_MODE_HIST == p_cmd_cfg->work_mode) ||
193*437bfbebSnyanmisaka                                          (VDPP_RUN_MODE_HIST == work_mode_ref);
194*437bfbebSnyanmisaka         }
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka         vdpp_proc_cfg.hist_buf_fd = fdhist;
197*437bfbebSnyanmisaka         vdpp_proc_cfg.p_hist_buf = phist;
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka         vdpp_proc_cfg.yuv_diff_flag = 0;
200*437bfbebSnyanmisaka         vdpp_proc_cfg.vdpp_config_update_flag = 0;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka         hwpq_vdpp_proc(vdpp_ctx, &vdpp_proc_cfg);
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka         if (ctx->fp_o_y)
205*437bfbebSnyanmisaka             fwrite(vdpp_proc_cfg.dst_img_info.img_yrgb.addr, 1, p_cmd_cfg->img_w_o_vir * p_cmd_cfg->img_h_o_vir * 1, ctx->fp_o_y);
206*437bfbebSnyanmisaka         if (ctx->fp_o_uv)
207*437bfbebSnyanmisaka             fwrite((unsigned char*)vdpp_proc_cfg.dst_img_info.img_cbcr.addr + p_cmd_cfg->img_w_o_vir * p_cmd_cfg->img_h_o_vir, 1, p_cmd_cfg->img_w_o_c_vir * p_cmd_cfg->img_h_o_c_vir * 2, ctx->fp_o_uv);
208*437bfbebSnyanmisaka         if (ctx->fp_o_h)
209*437bfbebSnyanmisaka             fwrite(vdpp_proc_cfg.p_hist_buf, 1, VDPP_HIST_LENGTH, ctx->fp_o_h);
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka         frame_idx++;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka         if (p_cmd_cfg->frame_num > 0 && frame_idx >= p_cmd_cfg->frame_num) {
214*437bfbebSnyanmisaka             ctx->frm_eos = 1;
215*437bfbebSnyanmisaka             break;
216*437bfbebSnyanmisaka         }
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka         if (ctx->frm_eos)
219*437bfbebSnyanmisaka             break;
220*437bfbebSnyanmisaka     }
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka __RET:
223*437bfbebSnyanmisaka     if (ctx->fp_i) {
224*437bfbebSnyanmisaka         fclose(ctx->fp_i);
225*437bfbebSnyanmisaka         ctx->fp_i = NULL;
226*437bfbebSnyanmisaka     }
227*437bfbebSnyanmisaka     if (ctx->fp_o_y) {
228*437bfbebSnyanmisaka         fclose(ctx->fp_o_y);
229*437bfbebSnyanmisaka         ctx->fp_o_y = NULL;
230*437bfbebSnyanmisaka     }
231*437bfbebSnyanmisaka     if (ctx->fp_o_uv) {
232*437bfbebSnyanmisaka         fclose(ctx->fp_o_uv);
233*437bfbebSnyanmisaka         ctx->fp_o_uv = NULL;
234*437bfbebSnyanmisaka     }
235*437bfbebSnyanmisaka     if (ctx->fp_o_h) {
236*437bfbebSnyanmisaka         fclose(ctx->fp_o_h);
237*437bfbebSnyanmisaka         ctx->fp_o_h = NULL;
238*437bfbebSnyanmisaka     }
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka     mpp_buffer_put(srcbuf);
241*437bfbebSnyanmisaka     mpp_buffer_put(dstbuf);
242*437bfbebSnyanmisaka     mpp_buffer_put(histbuf);
243*437bfbebSnyanmisaka     mpp_buffer_put(dstbuf_c);
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka     if (memGroup) {
246*437bfbebSnyanmisaka         mpp_buffer_group_put(memGroup);
247*437bfbebSnyanmisaka         memGroup = NULL;
248*437bfbebSnyanmisaka     }
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka     hwpq_vdpp_deinit(vdpp_ctx);
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     return NULL;
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka 
main(int argc,char ** argv)255*437bfbebSnyanmisaka int32_t main(int argc, char **argv)
256*437bfbebSnyanmisaka {
257*437bfbebSnyanmisaka     VdppCmdCfg vdpp_cmd_cfg;
258*437bfbebSnyanmisaka     VdppCmdCfg *p_cmd_cfg = &vdpp_cmd_cfg;
259*437bfbebSnyanmisaka     VdppTestMultiCtxInfo *ctxs = NULL;
260*437bfbebSnyanmisaka     int i = 0;
261*437bfbebSnyanmisaka     int ret = 0;
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka     parse_cmd(argv, argc, p_cmd_cfg);
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     ctxs = mpp_calloc(VdppTestMultiCtxInfo, p_cmd_cfg->nthreads);
266*437bfbebSnyanmisaka     if (NULL == ctxs) {
267*437bfbebSnyanmisaka         mpp_err("failed to alloc context for instances\n");
268*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
269*437bfbebSnyanmisaka         goto __RET;
270*437bfbebSnyanmisaka     }
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka     for (i = 0; i < p_cmd_cfg->nthreads; i++) {
273*437bfbebSnyanmisaka         ctxs[i].cmd = p_cmd_cfg;
274*437bfbebSnyanmisaka         ctxs[i].chn = i;
275*437bfbebSnyanmisaka 
276*437bfbebSnyanmisaka         ret = pthread_create(&ctxs[i].thd, NULL, multi_vdpp, &ctxs[i]);
277*437bfbebSnyanmisaka         if (ret) {
278*437bfbebSnyanmisaka             mpp_err("failed to create thread %d\n", i);
279*437bfbebSnyanmisaka             ret = MPP_NOK;
280*437bfbebSnyanmisaka             goto __RET;
281*437bfbebSnyanmisaka         }
282*437bfbebSnyanmisaka     }
283*437bfbebSnyanmisaka 
284*437bfbebSnyanmisaka     for (i = 0; i < p_cmd_cfg->nthreads; i++)
285*437bfbebSnyanmisaka         pthread_join(ctxs[i].thd, NULL);
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka __RET:
288*437bfbebSnyanmisaka     MPP_FREE(ctxs);
289*437bfbebSnyanmisaka     ctxs = NULL;
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka     return ret;
292*437bfbebSnyanmisaka }
293*437bfbebSnyanmisaka 
parse_cmd(char ** argv,int argc,VdppCmdCfg * p_cmd_cfg)294*437bfbebSnyanmisaka static void parse_cmd(char** argv, int argc, VdppCmdCfg* p_cmd_cfg)
295*437bfbebSnyanmisaka {
296*437bfbebSnyanmisaka     mpp_log("in parse 3\n");
297*437bfbebSnyanmisaka     int32_t ch;
298*437bfbebSnyanmisaka     int32_t option_index = 0;
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka     opterr = 0;
301*437bfbebSnyanmisaka     static struct option long_options[] = {
302*437bfbebSnyanmisaka         {"ip",         required_argument, 0,  0 },
303*437bfbebSnyanmisaka         {"oy",         required_argument, 0,  0 },
304*437bfbebSnyanmisaka         {"oc",         required_argument, 0,  0 },
305*437bfbebSnyanmisaka         {"oh",         required_argument, 0,  0 },
306*437bfbebSnyanmisaka         {"wi_vld",     required_argument, 0,  0 },
307*437bfbebSnyanmisaka         {"hi_vld",     required_argument, 0,  0 },
308*437bfbebSnyanmisaka         {"wi_vir",     required_argument, 0,  0 },
309*437bfbebSnyanmisaka         {"hi_vir",     required_argument, 0,  0 },
310*437bfbebSnyanmisaka         {"wo_vld",     required_argument, 0,  0 },
311*437bfbebSnyanmisaka         {"ho_vld",     required_argument, 0,  0 },
312*437bfbebSnyanmisaka         {"wo_vir",     required_argument, 0,  0 },
313*437bfbebSnyanmisaka         {"ho_vir",     required_argument, 0,  0 },
314*437bfbebSnyanmisaka         {"uv_diff",    required_argument, 0,  0 },
315*437bfbebSnyanmisaka         {"wo_uv",      required_argument, 0,  0 },
316*437bfbebSnyanmisaka         {"ho_uv",      required_argument, 0,  0 },
317*437bfbebSnyanmisaka         {"wo_uv_vir",  required_argument, 0,  0 },
318*437bfbebSnyanmisaka         {"ho_uv_vir",  required_argument, 0,  0 },
319*437bfbebSnyanmisaka         {"work_mode",  required_argument, 0,  0 },
320*437bfbebSnyanmisaka         {"nthread",    required_argument, 0,  0 },
321*437bfbebSnyanmisaka         {"frame_num",  required_argument, 0,  0 },
322*437bfbebSnyanmisaka         { 0,           0,                 0,  0 },
323*437bfbebSnyanmisaka     };
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka     p_cmd_cfg->nthreads = 1;
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     while ((ch = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1) {
328*437bfbebSnyanmisaka         switch (ch) {
329*437bfbebSnyanmisaka         case 0: {
330*437bfbebSnyanmisaka             switch (option_index) {
331*437bfbebSnyanmisaka             case 0 : {
332*437bfbebSnyanmisaka                 strncpy(p_cmd_cfg->src_file_name, optarg, sizeof(p_cmd_cfg->src_file_name) - 1);
333*437bfbebSnyanmisaka                 mpp_log("ssrc file name: %s\n", p_cmd_cfg->src_file_name);
334*437bfbebSnyanmisaka             } break;
335*437bfbebSnyanmisaka             case 1 : {
336*437bfbebSnyanmisaka                 strncpy(p_cmd_cfg->dst_file_name_y, optarg, sizeof(p_cmd_cfg->dst_file_name_y) - 1);
337*437bfbebSnyanmisaka                 mpp_log("ddst-Y file name: %s\n", p_cmd_cfg->dst_file_name_y);
338*437bfbebSnyanmisaka             } break;
339*437bfbebSnyanmisaka             case 2 : {
340*437bfbebSnyanmisaka                 strncpy(p_cmd_cfg->dst_file_name_uv, optarg, sizeof(p_cmd_cfg->dst_file_name_uv) - 1);
341*437bfbebSnyanmisaka                 mpp_log("ddst-UV file name: %s\n", p_cmd_cfg->dst_file_name_uv);
342*437bfbebSnyanmisaka             } break;
343*437bfbebSnyanmisaka             case 3 : {
344*437bfbebSnyanmisaka                 strncpy(p_cmd_cfg->dst_file_name_hist, optarg, sizeof(p_cmd_cfg->dst_file_name_hist) - 1);
345*437bfbebSnyanmisaka                 mpp_log("ddst-Hist file name: %s\n", p_cmd_cfg->dst_file_name_hist);
346*437bfbebSnyanmisaka             } break;
347*437bfbebSnyanmisaka             case 4 : {
348*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_i = atoi(optarg);
349*437bfbebSnyanmisaka             } break;
350*437bfbebSnyanmisaka             case 5 : {
351*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_i = atoi(optarg);
352*437bfbebSnyanmisaka             } break;
353*437bfbebSnyanmisaka             case 6 : {
354*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_i_vir = atoi(optarg);
355*437bfbebSnyanmisaka             } break;
356*437bfbebSnyanmisaka             case 7 : {
357*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_i_vir = atoi(optarg);
358*437bfbebSnyanmisaka             } break;
359*437bfbebSnyanmisaka             case 8 : {
360*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_o = atoi(optarg);
361*437bfbebSnyanmisaka             } break;
362*437bfbebSnyanmisaka             case 9 : {
363*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_o = atoi(optarg);
364*437bfbebSnyanmisaka             } break;
365*437bfbebSnyanmisaka             case 10 : {
366*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_o_vir = atoi(optarg);
367*437bfbebSnyanmisaka             } break;
368*437bfbebSnyanmisaka             case 11 : {
369*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_o_vir = atoi(optarg);
370*437bfbebSnyanmisaka             } break;
371*437bfbebSnyanmisaka             case 12 : {
372*437bfbebSnyanmisaka                 p_cmd_cfg->uv_diff_flag = atoi(optarg);
373*437bfbebSnyanmisaka             } break;
374*437bfbebSnyanmisaka             case 13 : {
375*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_o_c = atoi(optarg);
376*437bfbebSnyanmisaka             } break;
377*437bfbebSnyanmisaka             case 14 : {
378*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_o_c = atoi(optarg);
379*437bfbebSnyanmisaka             } break;
380*437bfbebSnyanmisaka             case 15 : {
381*437bfbebSnyanmisaka                 p_cmd_cfg->img_w_o_c_vir = atoi(optarg);
382*437bfbebSnyanmisaka             } break;
383*437bfbebSnyanmisaka             case 16 : {
384*437bfbebSnyanmisaka                 p_cmd_cfg->img_h_o_c_vir = atoi(optarg);
385*437bfbebSnyanmisaka             } break;
386*437bfbebSnyanmisaka             case 17 : {
387*437bfbebSnyanmisaka                 p_cmd_cfg->work_mode = atoi(optarg);
388*437bfbebSnyanmisaka             } break;
389*437bfbebSnyanmisaka             case 18 : {
390*437bfbebSnyanmisaka                 p_cmd_cfg->nthreads = atoi(optarg);
391*437bfbebSnyanmisaka                 if (p_cmd_cfg->nthreads < 1)
392*437bfbebSnyanmisaka                     p_cmd_cfg->nthreads = 1;
393*437bfbebSnyanmisaka             } break;
394*437bfbebSnyanmisaka             case 19: {
395*437bfbebSnyanmisaka                 p_cmd_cfg->frame_num = atoi(optarg);
396*437bfbebSnyanmisaka             } break;
397*437bfbebSnyanmisaka             default : {
398*437bfbebSnyanmisaka             } break;
399*437bfbebSnyanmisaka             }
400*437bfbebSnyanmisaka             mpp_log("%s: %s", long_options[option_index].name, optarg);
401*437bfbebSnyanmisaka 
402*437bfbebSnyanmisaka         } break;
403*437bfbebSnyanmisaka         default: {
404*437bfbebSnyanmisaka         } break;
405*437bfbebSnyanmisaka         }
406*437bfbebSnyanmisaka     }
407*437bfbebSnyanmisaka }
408