Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions app/oapv_app_args.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ struct args_parser {
int (*get_int)(args_parser_t *args, char *keyl, int *val, int *flag);
int (*set_str)(args_parser_t *args, char *keyl, char *str);
int (*set_int)(args_parser_t *args, char *keyl, int val);
int (*set_int2str)(args_parser_t* args, char* keyl, int val);
int (*set_flag)(args_parser_t *args, char *keyl, int flag);
int (*check_mandatory)(args_parser_t *args, char **err_arg);

Expand Down Expand Up @@ -406,6 +407,21 @@ static int args_set_int(args_parser_t *args, char *keyl, int val)
}
}

static int args_set_int2str(args_parser_t* args, char* keyl, int val)
{
int idx;

idx = args_search_long_key(args->opts, keyl);
if (idx >= 0) {
sprintf((char*)(args->opts[idx].val), "%d", val);
args->opts[idx].flag = 1;
return 0;
}
else {
return -1;
}
}

static int args_set_flag(args_parser_t *args, char *keyl, int flag)
{
int idx;
Expand Down Expand Up @@ -572,6 +588,7 @@ static args_parser_t *args_create(const args_opt_t *opt_table, int num_opt)
args->get_int = args_get_int;
args->set_str = args_set_str;
args->set_int = args_set_int;
args->set_int2str = args_set_int2str;
args->set_flag = args_set_flag;
args->check_mandatory = args_check_mandatory;

Expand Down
271 changes: 128 additions & 143 deletions app/oapv_app_enc.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,27 @@ static const args_opt_t enc_args_opts[] = {
"file name of reconstructed video"
},
{
'w', "width", ARGS_VAL_TYPE_INTEGER | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
'w', "width", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
"pixel width of input video"
},
{
'h', "height", ARGS_VAL_TYPE_INTEGER | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
'h', "height", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
"pixel height of input video"
},
{
'q', "qp", ARGS_VAL_TYPE_INTEGER, 0, NULL,
'q', "qp", ARGS_VAL_TYPE_STRING, 0, NULL,
"QP value: 0 ~ (63 + (bitdepth - 10)*6) \n"
" - 10bit input: 0 ~ 63\n"
" - 12bit input: 0 ~ 75\n"
" - 12bit input: 0 ~ 75"
},
{
'z', "fps", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
"frame rate (frame per second))"
},
{
'm', "threads", ARGS_VAL_TYPE_INTEGER, 0, NULL,
"force to use a specific number of threads"
"force to use a specific number of threads\n"
" - '0' means decision of the number automatically"
},
{
ARGS_NO_KEY, "preset", ARGS_VAL_TYPE_STRING, 0, NULL,
Expand Down Expand Up @@ -142,23 +143,19 @@ static const args_opt_t enc_args_opts[] = {
"QP offset value for Component 3"
},
{
ARGS_NO_KEY, "tile-w-mb", ARGS_VAL_TYPE_INTEGER, 0, NULL,
"width of tile in units of MBs"
ARGS_NO_KEY, "tile-w", ARGS_VAL_TYPE_STRING, 0, NULL,
"width of tile in units of pixels"
},
{
ARGS_NO_KEY, "tile-h-mb", ARGS_VAL_TYPE_INTEGER, 0, NULL,
"height of tile in units of MBs"
ARGS_NO_KEY, "tile-h", ARGS_VAL_TYPE_STRING, 0, NULL,
"height of tile in units of pixels"
},
{
ARGS_NO_KEY, "bitrate", ARGS_VAL_TYPE_STRING, 0, NULL,
"enable ABR rate control\n"
" bitrate in terms of kilo-bits per second: Kbps(none,K,k), Mbps(M,m)\n"
" ex) 100 = 100K = 0.1M"
},
{
ARGS_NO_KEY, "use-filler", ARGS_VAL_TYPE_INTEGER, 0, NULL,
"user filler flag"
},
{
ARGS_NO_KEY, "q-matrix-c0", ARGS_VAL_TYPE_STRING, 0, NULL,
"custom quantization matrix for component 0 (Y) \"q1 q2 ... q63 q64\""
Expand Down Expand Up @@ -197,13 +194,35 @@ typedef struct args_var {
int input_csp;
int seek;
int threads;
char profile[32];
char level[32];
int band;
char bitrate[64];

char profile[16];
char level[16];
char band[16];

char width[16];
char height[16];
char fps[256];
char q_matrix[OAPV_MAX_CC][512]; // raster-scan order
char preset[32];

char qp[16];
char qp_offset_c1[16];
char qp_offset_c2[16];
char qp_offset_c3[16];
char bitrate[32];

char preset[16];

char q_matrix_c0[512]; // raster-scan order
char q_matrix_c1[512]; // raster-scan order
char q_matrix_c2[512]; // raster-scan order
char q_matrix_c3[512]; // raster-scan order
char tile_w[16];
char tile_h[16];

char color_primaries[16];
char color_transfer[16];
char color_matrix[16];
char color_range[16];

oapve_param_t *param;
} args_var_t;

Expand Down Expand Up @@ -236,33 +255,32 @@ static args_var_t *args_init_vars(args_parser_t *args, oapve_param_t *param)
strcpy(vars->profile, "422-10");
args_set_variable_by_key_long(opts, "level", vars->level);
strcpy(vars->level, "4.1");
args_set_variable_by_key_long(opts, "band", &vars->band);
vars->band = 2; /* default */
args_set_variable_by_key_long(opts, "bitrate", vars->bitrate);
args_set_variable_by_key_long(opts, "band", vars->band);
strcpy(vars->band, "2"); /* default */

args_set_variable_by_key_long(opts, "width", vars->width);
args_set_variable_by_key_long(opts, "height", vars->height);
args_set_variable_by_key_long(opts, "fps", vars->fps);
strcpy(vars->fps, "60");
args_set_variable_by_key_long(opts, "q-matrix-c0", vars->q_matrix[0]);
strcpy(vars->q_matrix[0], "");
args_set_variable_by_key_long(opts, "q-matrix-c1", vars->q_matrix[1]);
strcpy(vars->q_matrix[1], "");
args_set_variable_by_key_long(opts, "q-matrix-c2", vars->q_matrix[2]);
strcpy(vars->q_matrix[2], "");
args_set_variable_by_key_long(opts, "q-matrix-c3", vars->q_matrix[3]);
strcpy(vars->q_matrix[3], "");

args_set_variable_by_key_long(opts, "qp", vars->qp);
args_set_variable_by_key_long(opts, "qp_offset_c1", vars->qp_offset_c1);
args_set_variable_by_key_long(opts, "qp_offset_c2", vars->qp_offset_c2);
args_set_variable_by_key_long(opts, "qp_offset_c3", vars->qp_offset_c3);


args_set_variable_by_key_long(opts, "bitrate", vars->bitrate);
args_set_variable_by_key_long(opts, "q-matrix-c0", vars->q_matrix_c0);
args_set_variable_by_key_long(opts, "q-matrix-c1", vars->q_matrix_c1);
args_set_variable_by_key_long(opts, "q-matrix-c2", vars->q_matrix_c2);
args_set_variable_by_key_long(opts, "q-matrix-c3", vars->q_matrix_c3);

args_set_variable_by_key_long(opts, "threads", &vars->threads);
vars->threads = 1; /* default */
vars->threads = OAPVE_CDESC_THREADS_AUTO; /* default */

args_set_variable_by_key_long(opts, "tile-w", vars->tile_w);
args_set_variable_by_key_long(opts, "tile-h", vars->tile_h);

args_set_variable_by_key_long(opts, "preset", vars->preset);
strcpy(vars->preset, "");

ARGS_SET_PARAM_VAR_KEY(opts, param, w);
ARGS_SET_PARAM_VAR_KEY(opts, param, h);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, use_filler);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, tile_w_mb);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, tile_h_mb);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c1);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c2);
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp_offset_c3);

return vars;
}
Expand Down Expand Up @@ -353,6 +371,29 @@ static void print_commandline(int argc, const char **argv)
logv3("\n\n");
}

static void add_thousands_comma_to_number(char *in, char *out)
{
int len, left = 0;
len = strlen(in);
left = len % 3;

while(len > 0) {
*out = *in;

out++; in++;

left--;
len--;

if(left == 0 && len >= 3) {
*out = ',';
out++;
left = 3;
}
}
*out='\0';
}

static void print_config(args_var_t *vars, oapve_param_t *param)
{
if(op_verbose < VERBOSE_FRAME)
Expand All @@ -367,16 +408,21 @@ static void print_config(args_var_t *vars, oapve_param_t *param)
logv3("Reconstructed sequence : %s \n", vars->fname_rec);
}
logv3(" profile = %s\n", vars->profile);
logv3(" level = %s\n", vars->level);
logv3(" band = %s\n", vars->band);
logv3(" width = %d\n", param->w);
logv3(" height = %d\n", param->h);
logv3(" FPS = %.2f\n", (float)param->fps_num / param->fps_den);
logv3(" QP = %d\n", param->qp);
logv3(" max number of AUs = %d\n", vars->max_au);
logv3(" rate control type = %s\n", (param->rc_type == OAPV_RC_ABR) ? "average Bitrate" : "constant QP");
if(param->rc_type == OAPV_RC_ABR) {
logv3(" target bitrate = %dkbps\n", param->bitrate);
logv3(" fps = %.2f\n", (float)param->fps_num / param->fps_den);
logv3(" rate control type = %s\n", (param->rc_type == OAPV_RC_ABR) ? "average bitrate" : "constant qp");
if(param->rc_type == OAPV_RC_CQP){
logv3(" qp = %d\n", param->qp);
}
else if(param->rc_type == OAPV_RC_ABR) {
//add_thousands_comma_to_number(vars->bitrate, tstr);
logv3(" target bitrate = %s\n", vars->bitrate);
}
logv3(" tile size = %d x %d\n", param->tile_w_mb * OAPV_MB_W, param->tile_h_mb * OAPV_MB_H);
logv3(" max number of AUs = %d\n", vars->max_au);
logv3(" tile size = %d x %d\n", param->tile_w, param->tile_h);
}

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)
Expand Down Expand Up @@ -462,108 +508,47 @@ static int kbps_str_to_int(char *str)
return kbps;
}

#define UPDATE_A_PARAM_W_KEY_VAL(param, key, val) \
if(strlen(val) > 0) { \
if(OAPV_FAILED(oapve_param_parse(param, key, val))) { \
logerr("input value (%s) of %s is invalid\n", val, key); \
return -1; \
} \
}

static int update_param(args_var_t *vars, oapve_param_t *param)
{
int q_len[OAPV_MAX_CC];
/* update reate controller parameters */
if(strlen(vars->bitrate) > 0) {
param->bitrate = kbps_str_to_int(vars->bitrate);
param->rc_type = OAPV_RC_ABR;
}

/* update q_matrix */
for(int c = 0; c < OAPV_MAX_CC; c++) {
q_len[c] = (int)strlen(vars->q_matrix[c]);
if(q_len[c] > 0) {
param->use_q_matrix = 1;
char *qstr = vars->q_matrix[c];
int qcnt = 0;
while(strlen(qstr) > 0 && qcnt < OAPV_BLK_D) {
int t0, read;
sscanf(qstr, "%d%n", &t0, &read);
if(t0 < 1 || t0 > 255) {
logerr("input value (%d) for q_matrix[%d][%d] is invalid\n", t0, c, qcnt);
return -1;
}
param->q_matrix[c][qcnt] = t0;
qstr += read;
qcnt++;
}
if(qcnt < OAPV_BLK_D) {
logerr("input number of q_matrix[%d] is not enough\n", c);
return -1;
}
}
}
UPDATE_A_PARAM_W_KEY_VAL(param, "profile", vars->profile);
UPDATE_A_PARAM_W_KEY_VAL(param, "level", vars->level);
UPDATE_A_PARAM_W_KEY_VAL(param, "band", vars->band);

param->csp = vars->input_csp;
UPDATE_A_PARAM_W_KEY_VAL(param, "width", vars->width);
UPDATE_A_PARAM_W_KEY_VAL(param, "height", vars->height);
UPDATE_A_PARAM_W_KEY_VAL(param, "fps", vars->fps);

/* update level idc */
float tmp_level = 0;
sscanf(vars->level, "%f", &tmp_level);
param->level_idc = (int)((tmp_level * 30.0) + 0.5);
/* update band idc */
param->band_idc = vars->band;
UPDATE_A_PARAM_W_KEY_VAL(param, "qp", vars->qp);
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c1", vars->qp_offset_c1);
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c2", vars->qp_offset_c2);
UPDATE_A_PARAM_W_KEY_VAL(param, "qp-offset-c3", vars->qp_offset_c3);
UPDATE_A_PARAM_W_KEY_VAL(param, "bitrate", vars->bitrate);

/* update fps */
if(strpbrk(vars->fps, "/") != NULL) {
sscanf(vars->fps, "%d/%d", &param->fps_num, &param->fps_den);
}
else if(strpbrk(vars->fps, ".") != NULL) {
float tmp_fps = 0;
sscanf(vars->fps, "%f", &tmp_fps);
param->fps_num = tmp_fps * 10000;
param->fps_den = 10000;
}
else {
sscanf(vars->fps, "%d", &param->fps_num);
param->fps_den = 1;
}
UPDATE_A_PARAM_W_KEY_VAL(param, "preset", vars->preset);

if(strlen(vars->preset) > 0) {
if(strcmp(vars->preset, "fastest") == 0) {
param->preset = OAPV_PRESET_FASTEST;
}
else if(strcmp(vars->preset, "fast") == 0) {
param->preset = OAPV_PRESET_FAST;
}
else if(strcmp(vars->preset, "medium") == 0) {
param->preset = OAPV_PRESET_MEDIUM;
}
else if(strcmp(vars->preset, "slow") == 0) {
param->preset = OAPV_PRESET_SLOW;
}
else if(strcmp(vars->preset, "placebo") == 0) {
param->preset = OAPV_PRESET_PLACEBO;
}
else {
logerr("input value of preset is invalid\n");
return -1;
}
}
else {
param->preset = OAPV_PRESET_DEFAULT;
}
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c0", vars->q_matrix_c0);
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c1", vars->q_matrix_c1);
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c2", vars->q_matrix_c2);
UPDATE_A_PARAM_W_KEY_VAL(param, "q-matrix-c3", vars->q_matrix_c3);

/* update tile */
if (param->tile_w_mb < OAPV_MIN_TILE_W_MB) {
param->tile_w_mb = OAPV_MIN_TILE_W_MB;
}
if (param->tile_h_mb < OAPV_MIN_TILE_H_MB) {
param->tile_h_mb = OAPV_MIN_TILE_H_MB;
}
UPDATE_A_PARAM_W_KEY_VAL(param, "color-primaries", vars->color_primaries);
UPDATE_A_PARAM_W_KEY_VAL(param, "color-transfer", vars->color_transfer);
UPDATE_A_PARAM_W_KEY_VAL(param, "color-matrix", vars->color_matrix);
UPDATE_A_PARAM_W_KEY_VAL(param, "color-range", vars->color_range);

int tile_w = param->tile_w_mb << OAPV_LOG2_MB_W;
int tile_h = param->tile_h_mb << OAPV_LOG2_MB_H;
int tile_cols = (param->w + tile_w - 1) / tile_w;
int tile_rows = (param->h + tile_h - 1) / tile_h;
if (tile_cols > OAPV_MAX_TILE_COLS) {
param->tile_w_mb = (((param->w + OAPV_MB_W - 1) >> OAPV_LOG2_MB_W) + OAPV_MAX_TILE_COLS - 1) / OAPV_MAX_TILE_COLS;
}
if (tile_rows > OAPV_MAX_TILE_ROWS) {
param->tile_h_mb = (((param->h + OAPV_MB_H - 1) >> OAPV_LOG2_MB_H) + OAPV_MAX_TILE_ROWS - 1) / OAPV_MAX_TILE_ROWS;
}

UPDATE_A_PARAM_W_KEY_VAL(param, "tile-w", vars->tile_w);
UPDATE_A_PARAM_W_KEY_VAL(param, "tile-w", vars->tile_h);

param->csp = vars->input_csp;
return 0;
}

Expand Down
Loading