@@ -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+
356397static 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
382428static 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+
465519static 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