Skip to content

Commit 40fb0dd

Browse files
kpchoimss-parkyearly-kim
authored
oapve_param_parse (#57)
* modification of decoding tile * refactoring Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * refactoring Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * added xeve_param_parse() API Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * fix for arm buiding Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * fix typo Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * added 'preset' to oapve_param_parse() Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * added most parameters Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * added param.c and param.h and detection of num cpu core Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * modification to compile on window * removed wrong end of line Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * oapv_get_num_cpu_cores() fix for mac - Fix compile error on mac env * introduced ctx->threads Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * modification to select number of threads * fixed bug in tile calculation Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * removed compile warning message Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> * fix to parse y4m header * Remove unused variable - remove unused variable in *_neon.c Signed-off-by: Yangwoo Kim <yearly.kim@samsung.com> * removed duplicated code Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> --------- Signed-off-by: kp5.choi@samsung.com <kp5.choi@samsung.com> Signed-off-by: Yangwoo Kim <yearly.kim@samsung.com> Co-authored-by: Minsoo Park <mss.park@samsung.com> Co-authored-by: Yangwoo Kim <yearly.kim@samsung.com>
1 parent e446c65 commit 40fb0dd

File tree

15 files changed

+744
-212
lines changed

15 files changed

+744
-212
lines changed

app/oapv_app_args.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct args_parser {
6969
int (*get_int)(args_parser_t *args, char *keyl, int *val, int *flag);
7070
int (*set_str)(args_parser_t *args, char *keyl, char *str);
7171
int (*set_int)(args_parser_t *args, char *keyl, int val);
72+
int (*set_int2str)(args_parser_t* args, char* keyl, int val);
7273
int (*set_flag)(args_parser_t *args, char *keyl, int flag);
7374
int (*check_mandatory)(args_parser_t *args, char **err_arg);
7475

@@ -406,6 +407,21 @@ static int args_set_int(args_parser_t *args, char *keyl, int val)
406407
}
407408
}
408409

410+
static int args_set_int2str(args_parser_t* args, char* keyl, int val)
411+
{
412+
int idx;
413+
414+
idx = args_search_long_key(args->opts, keyl);
415+
if (idx >= 0) {
416+
sprintf((char*)(args->opts[idx].val), "%d", val);
417+
args->opts[idx].flag = 1;
418+
return 0;
419+
}
420+
else {
421+
return -1;
422+
}
423+
}
424+
409425
static int args_set_flag(args_parser_t *args, char *keyl, int flag)
410426
{
411427
int idx;
@@ -572,6 +588,7 @@ static args_parser_t *args_create(const args_opt_t *opt_table, int num_opt)
572588
args->get_int = args_get_int;
573589
args->set_str = args_set_str;
574590
args->set_int = args_set_int;
591+
args->set_int2str = args_set_int2str;
575592
args->set_flag = args_set_flag;
576593
args->check_mandatory = args_check_mandatory;
577594

app/oapv_app_enc.c

Lines changed: 128 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -70,26 +70,27 @@ static const args_opt_t enc_args_opts[] = {
7070
"file name of reconstructed video"
7171
},
7272
{
73-
'w', "width", ARGS_VAL_TYPE_INTEGER | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
73+
'w', "width", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
7474
"pixel width of input video"
7575
},
7676
{
77-
'h', "height", ARGS_VAL_TYPE_INTEGER | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
77+
'h', "height", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
7878
"pixel height of input video"
7979
},
8080
{
81-
'q', "qp", ARGS_VAL_TYPE_INTEGER, 0, NULL,
81+
'q', "qp", ARGS_VAL_TYPE_STRING, 0, NULL,
8282
"QP value: 0 ~ (63 + (bitdepth - 10)*6) \n"
8383
" - 10bit input: 0 ~ 63\n"
84-
" - 12bit input: 0 ~ 75\n"
84+
" - 12bit input: 0 ~ 75"
8585
},
8686
{
8787
'z', "fps", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
8888
"frame rate (frame per second))"
8989
},
9090
{
9191
'm', "threads", ARGS_VAL_TYPE_INTEGER, 0, NULL,
92-
"force to use a specific number of threads"
92+
"force to use a specific number of threads\n"
93+
" - '0' means decision of the number automatically"
9394
},
9495
{
9596
ARGS_NO_KEY, "preset", ARGS_VAL_TYPE_STRING, 0, NULL,
@@ -142,23 +143,19 @@ static const args_opt_t enc_args_opts[] = {
142143
"QP offset value for Component 3"
143144
},
144145
{
145-
ARGS_NO_KEY, "tile-w-mb", ARGS_VAL_TYPE_INTEGER, 0, NULL,
146-
"width of tile in units of MBs"
146+
ARGS_NO_KEY, "tile-w", ARGS_VAL_TYPE_STRING, 0, NULL,
147+
"width of tile in units of pixels"
147148
},
148149
{
149-
ARGS_NO_KEY, "tile-h-mb", ARGS_VAL_TYPE_INTEGER, 0, NULL,
150-
"height of tile in units of MBs"
150+
ARGS_NO_KEY, "tile-h", ARGS_VAL_TYPE_STRING, 0, NULL,
151+
"height of tile in units of pixels"
151152
},
152153
{
153154
ARGS_NO_KEY, "bitrate", ARGS_VAL_TYPE_STRING, 0, NULL,
154155
"enable ABR rate control\n"
155156
" bitrate in terms of kilo-bits per second: Kbps(none,K,k), Mbps(M,m)\n"
156157
" ex) 100 = 100K = 0.1M"
157158
},
158-
{
159-
ARGS_NO_KEY, "use-filler", ARGS_VAL_TYPE_INTEGER, 0, NULL,
160-
"user filler flag"
161-
},
162159
{
163160
ARGS_NO_KEY, "q-matrix-c0", ARGS_VAL_TYPE_STRING, 0, NULL,
164161
"custom quantization matrix for component 0 (Y) \"q1 q2 ... q63 q64\""
@@ -197,13 +194,35 @@ typedef struct args_var {
197194
int input_csp;
198195
int seek;
199196
int threads;
200-
char profile[32];
201-
char level[32];
202-
int band;
203-
char bitrate[64];
197+
198+
char profile[16];
199+
char level[16];
200+
char band[16];
201+
202+
char width[16];
203+
char height[16];
204204
char fps[256];
205-
char q_matrix[OAPV_MAX_CC][512]; // raster-scan order
206-
char preset[32];
205+
206+
char qp[16];
207+
char qp_offset_c1[16];
208+
char qp_offset_c2[16];
209+
char qp_offset_c3[16];
210+
char bitrate[32];
211+
212+
char preset[16];
213+
214+
char q_matrix_c0[512]; // raster-scan order
215+
char q_matrix_c1[512]; // raster-scan order
216+
char q_matrix_c2[512]; // raster-scan order
217+
char q_matrix_c3[512]; // raster-scan order
218+
char tile_w[16];
219+
char tile_h[16];
220+
221+
char color_primaries[16];
222+
char color_transfer[16];
223+
char color_matrix[16];
224+
char color_range[16];
225+
207226
oapve_param_t *param;
208227
} args_var_t;
209228

@@ -236,33 +255,32 @@ static args_var_t *args_init_vars(args_parser_t *args, oapve_param_t *param)
236255
strcpy(vars->profile, "422-10");
237256
args_set_variable_by_key_long(opts, "level", vars->level);
238257
strcpy(vars->level, "4.1");
239-
args_set_variable_by_key_long(opts, "band", &vars->band);
240-
vars->band = 2; /* default */
241-
args_set_variable_by_key_long(opts, "bitrate", vars->bitrate);
258+
args_set_variable_by_key_long(opts, "band", vars->band);
259+
strcpy(vars->band, "2"); /* default */
260+
261+
args_set_variable_by_key_long(opts, "width", vars->width);
262+
args_set_variable_by_key_long(opts, "height", vars->height);
242263
args_set_variable_by_key_long(opts, "fps", vars->fps);
243-
strcpy(vars->fps, "60");
244-
args_set_variable_by_key_long(opts, "q-matrix-c0", vars->q_matrix[0]);
245-
strcpy(vars->q_matrix[0], "");
246-
args_set_variable_by_key_long(opts, "q-matrix-c1", vars->q_matrix[1]);
247-
strcpy(vars->q_matrix[1], "");
248-
args_set_variable_by_key_long(opts, "q-matrix-c2", vars->q_matrix[2]);
249-
strcpy(vars->q_matrix[2], "");
250-
args_set_variable_by_key_long(opts, "q-matrix-c3", vars->q_matrix[3]);
251-
strcpy(vars->q_matrix[3], "");
264+
265+
args_set_variable_by_key_long(opts, "qp", vars->qp);
266+
args_set_variable_by_key_long(opts, "qp_offset_c1", vars->qp_offset_c1);
267+
args_set_variable_by_key_long(opts, "qp_offset_c2", vars->qp_offset_c2);
268+
args_set_variable_by_key_long(opts, "qp_offset_c3", vars->qp_offset_c3);
269+
270+
271+
args_set_variable_by_key_long(opts, "bitrate", vars->bitrate);
272+
args_set_variable_by_key_long(opts, "q-matrix-c0", vars->q_matrix_c0);
273+
args_set_variable_by_key_long(opts, "q-matrix-c1", vars->q_matrix_c1);
274+
args_set_variable_by_key_long(opts, "q-matrix-c2", vars->q_matrix_c2);
275+
args_set_variable_by_key_long(opts, "q-matrix-c3", vars->q_matrix_c3);
276+
252277
args_set_variable_by_key_long(opts, "threads", &vars->threads);
253-
vars->threads = 1; /* default */
278+
vars->threads = OAPVE_CDESC_THREADS_AUTO; /* default */
279+
280+
args_set_variable_by_key_long(opts, "tile-w", vars->tile_w);
281+
args_set_variable_by_key_long(opts, "tile-h", vars->tile_h);
282+
254283
args_set_variable_by_key_long(opts, "preset", vars->preset);
255-
strcpy(vars->preset, "");
256-
257-
ARGS_SET_PARAM_VAR_KEY(opts, param, w);
258-
ARGS_SET_PARAM_VAR_KEY(opts, param, h);
259-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp);
260-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, use_filler);
261-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, tile_w_mb);
262-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, tile_h_mb);
263-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c1);
264-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c2);
265-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c3);
266284

267285
return vars;
268286
}
@@ -353,6 +371,29 @@ static void print_commandline(int argc, const char **argv)
353371
logv3("\n\n");
354372
}
355373

374+
static void add_thousands_comma_to_number(char *in, char *out)
375+
{
376+
int len, left = 0;
377+
len = strlen(in);
378+
left = len % 3;
379+
380+
while(len > 0) {
381+
*out = *in;
382+
383+
out++; in++;
384+
385+
left--;
386+
len--;
387+
388+
if(left == 0 && len >= 3) {
389+
*out = ',';
390+
out++;
391+
left = 3;
392+
}
393+
}
394+
*out='\0';
395+
}
396+
356397
static void print_config(args_var_t *vars, oapve_param_t *param)
357398
{
358399
if(op_verbose < VERBOSE_FRAME)
@@ -367,16 +408,21 @@ static void print_config(args_var_t *vars, oapve_param_t *param)
367408
logv3("Reconstructed sequence : %s \n", vars->fname_rec);
368409
}
369410
logv3(" profile = %s\n", vars->profile);
411+
logv3(" level = %s\n", vars->level);
412+
logv3(" band = %s\n", vars->band);
370413
logv3(" width = %d\n", param->w);
371414
logv3(" height = %d\n", param->h);
372-
logv3(" FPS = %.2f\n", (float)param->fps_num / param->fps_den);
373-
logv3(" QP = %d\n", param->qp);
374-
logv3(" max number of AUs = %d\n", vars->max_au);
375-
logv3(" rate control type = %s\n", (param->rc_type == OAPV_RC_ABR) ? "average Bitrate" : "constant QP");
376-
if(param->rc_type == OAPV_RC_ABR) {
377-
logv3(" target bitrate = %dkbps\n", param->bitrate);
415+
logv3(" fps = %.2f\n", (float)param->fps_num / param->fps_den);
416+
logv3(" rate control type = %s\n", (param->rc_type == OAPV_RC_ABR) ? "average bitrate" : "constant qp");
417+
if(param->rc_type == OAPV_RC_CQP){
418+
logv3(" qp = %d\n", param->qp);
419+
}
420+
else if(param->rc_type == OAPV_RC_ABR) {
421+
//add_thousands_comma_to_number(vars->bitrate, tstr);
422+
logv3(" target bitrate = %s\n", vars->bitrate);
378423
}
379-
logv3(" tile size = %d x %d\n", param->tile_w_mb * OAPV_MB_W, param->tile_h_mb * OAPV_MB_H);
424+
logv3(" max number of AUs = %d\n", vars->max_au);
425+
logv3(" tile size = %d x %d\n", param->tile_w, param->tile_h);
380426
}
381427

382428
static void print_stat_au(oapve_stat_t *stat, int au_cnt, oapve_param_t *param, int max_au, double bitrate_tot, oapv_clk_t clk_au, oapv_clk_t clk_tot)
@@ -462,108 +508,47 @@ static int kbps_str_to_int(char *str)
462508
return kbps;
463509
}
464510

511+
#define UPDATE_A_PARAM_W_KEY_VAL(param, key, val) \
512+
if(strlen(val) > 0) { \
513+
if(OAPV_FAILED(oapve_param_parse(param, key, val))) { \
514+
logerr("input value (%s) of %s is invalid\n", val, key); \
515+
return -1; \
516+
} \
517+
}
518+
465519
static int update_param(args_var_t *vars, oapve_param_t *param)
466520
{
467-
int q_len[OAPV_MAX_CC];
468-
/* update reate controller parameters */
469-
if(strlen(vars->bitrate) > 0) {
470-
param->bitrate = kbps_str_to_int(vars->bitrate);
471-
param->rc_type = OAPV_RC_ABR;
472-
}
473-
474-
/* update q_matrix */
475-
for(int c = 0; c < OAPV_MAX_CC; c++) {
476-
q_len[c] = (int)strlen(vars->q_matrix[c]);
477-
if(q_len[c] > 0) {
478-
param->use_q_matrix = 1;
479-
char *qstr = vars->q_matrix[c];
480-
int qcnt = 0;
481-
while(strlen(qstr) > 0 && qcnt < OAPV_BLK_D) {
482-
int t0, read;
483-
sscanf(qstr, "%d%n", &t0, &read);
484-
if(t0 < 1 || t0 > 255) {
485-
logerr("input value (%d) for q_matrix[%d][%d] is invalid\n", t0, c, qcnt);
486-
return -1;
487-
}
488-
param->q_matrix[c][qcnt] = t0;
489-
qstr += read;
490-
qcnt++;
491-
}
492-
if(qcnt < OAPV_BLK_D) {
493-
logerr("input number of q_matrix[%d] is not enough\n", c);
494-
return -1;
495-
}
496-
}
497-
}
521+
UPDATE_A_PARAM_W_KEY_VAL(param, "profile", vars->profile);
522+
UPDATE_A_PARAM_W_KEY_VAL(param, "level", vars->level);
523+
UPDATE_A_PARAM_W_KEY_VAL(param, "band", vars->band);
498524

499-
param->csp = vars->input_csp;
525+
UPDATE_A_PARAM_W_KEY_VAL(param, "width", vars->width);
526+
UPDATE_A_PARAM_W_KEY_VAL(param, "height", vars->height);
527+
UPDATE_A_PARAM_W_KEY_VAL(param, "fps", vars->fps);
500528

501-
/* update level idc */
502-
float tmp_level = 0;
503-
sscanf(vars->level, "%f", &tmp_level);
504-
param->level_idc = (int)((tmp_level * 30.0) + 0.5);
505-
/* update band idc */
506-
param->band_idc = vars->band;
529+
UPDATE_A_PARAM_W_KEY_VAL(param, "qp", vars->qp);
530+
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c1", vars->qp_offset_c1);
531+
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c2", vars->qp_offset_c2);
532+
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c3", vars->qp_offset_c3);
533+
UPDATE_A_PARAM_W_KEY_VAL(param, "bitrate", vars->bitrate);
507534

508-
/* update fps */
509-
if(strpbrk(vars->fps, "/") != NULL) {
510-
sscanf(vars->fps, "%d/%d", &param->fps_num, &param->fps_den);
511-
}
512-
else if(strpbrk(vars->fps, ".") != NULL) {
513-
float tmp_fps = 0;
514-
sscanf(vars->fps, "%f", &tmp_fps);
515-
param->fps_num = tmp_fps * 10000;
516-
param->fps_den = 10000;
517-
}
518-
else {
519-
sscanf(vars->fps, "%d", &param->fps_num);
520-
param->fps_den = 1;
521-
}
535+
UPDATE_A_PARAM_W_KEY_VAL(param, "preset", vars->preset);
522536

523-
if(strlen(vars->preset) > 0) {
524-
if(strcmp(vars->preset, "fastest") == 0) {
525-
param->preset = OAPV_PRESET_FASTEST;
526-
}
527-
else if(strcmp(vars->preset, "fast") == 0) {
528-
param->preset = OAPV_PRESET_FAST;
529-
}
530-
else if(strcmp(vars->preset, "medium") == 0) {
531-
param->preset = OAPV_PRESET_MEDIUM;
532-
}
533-
else if(strcmp(vars->preset, "slow") == 0) {
534-
param->preset = OAPV_PRESET_SLOW;
535-
}
536-
else if(strcmp(vars->preset, "placebo") == 0) {
537-
param->preset = OAPV_PRESET_PLACEBO;
538-
}
539-
else {
540-
logerr("input value of preset is invalid\n");
541-
return -1;
542-
}
543-
}
544-
else {
545-
param->preset = OAPV_PRESET_DEFAULT;
546-
}
537+
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c0", vars->q_matrix_c0);
538+
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c1", vars->q_matrix_c1);
539+
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c2", vars->q_matrix_c2);
540+
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c3", vars->q_matrix_c3);
547541

548-
/* update tile */
549-
if (param->tile_w_mb < OAPV_MIN_TILE_W_MB) {
550-
param->tile_w_mb = OAPV_MIN_TILE_W_MB;
551-
}
552-
if (param->tile_h_mb < OAPV_MIN_TILE_H_MB) {
553-
param->tile_h_mb = OAPV_MIN_TILE_H_MB;
554-
}
542+
UPDATE_A_PARAM_W_KEY_VAL(param, "color-primaries", vars->color_primaries);
543+
UPDATE_A_PARAM_W_KEY_VAL(param, "color-transfer", vars->color_transfer);
544+
UPDATE_A_PARAM_W_KEY_VAL(param, "color-matrix", vars->color_matrix);
545+
UPDATE_A_PARAM_W_KEY_VAL(param, "color-range", vars->color_range);
555546

556-
int tile_w = param->tile_w_mb << OAPV_LOG2_MB_W;
557-
int tile_h = param->tile_h_mb << OAPV_LOG2_MB_H;
558-
int tile_cols = (param->w + tile_w - 1) / tile_w;
559-
int tile_rows = (param->h + tile_h - 1) / tile_h;
560-
if (tile_cols > OAPV_MAX_TILE_COLS) {
561-
param->tile_w_mb = (((param->w + OAPV_MB_W - 1) >> OAPV_LOG2_MB_W) + OAPV_MAX_TILE_COLS - 1) / OAPV_MAX_TILE_COLS;
562-
}
563-
if (tile_rows > OAPV_MAX_TILE_ROWS) {
564-
param->tile_h_mb = (((param->h + OAPV_MB_H - 1) >> OAPV_LOG2_MB_H) + OAPV_MAX_TILE_ROWS - 1) / OAPV_MAX_TILE_ROWS;
565-
}
566547

548+
UPDATE_A_PARAM_W_KEY_VAL(param, "tile-w", vars->tile_w);
549+
UPDATE_A_PARAM_W_KEY_VAL(param, "tile-w", vars->tile_h);
550+
551+
param->csp = vars->input_csp;
567552
return 0;
568553
}
569554

0 commit comments

Comments
 (0)