Skip to content

Commit d7352a9

Browse files
authored
Merge pull request #116 from mpeg5/modification_param_0610
Modification of FPS parameter
2 parents 0e655a8 + d73fd08 commit d7352a9

File tree

9 files changed

+119
-31
lines changed

9 files changed

+119
-31
lines changed

app/xeve_app.c

+38-9
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ typedef struct _Y4M_PARAMS
7979
{
8080
int w;
8181
int h;
82-
int fps;
82+
XEVE_RATIONAL fps;
8383
int color_format;
8484
int bit_depth;
8585
}Y4M_INFO;
@@ -216,7 +216,7 @@ static void print_config(ARGS_PARSER * args, XEVE_PARAM * param)
216216
}
217217
logv2("\twidth = %d\n", param->w);
218218
logv2("\theight = %d\n", param->h);
219-
logv2("\tFPS = %d\n", param->fps);
219+
logv2("\tFPS = %.2f\n", (float)param->fps.num/ param->fps.den);
220220
logv2("\tintra picture period = %d\n", param->keyint);
221221
if (param->rc_type == XEVE_RC_CRF)
222222
{
@@ -371,7 +371,7 @@ static int y4m_parse_tags(Y4M_INFO * y4m, char * tags)
371371
char *q;
372372
char t_buff[20];
373373
int found_w = 0, found_h = 0, found_cf = 0;
374-
int fps_n, fps_d, pix_ratio_n, pix_ratio_d, interlace;
374+
int pix_ratio_n, pix_ratio_d, interlace;
375375

376376
for (p = tags;; p = q)
377377
{
@@ -404,8 +404,7 @@ static int y4m_parse_tags(Y4M_INFO * y4m, char * tags)
404404
}
405405
case 'F':
406406
{
407-
if (sscanf(p + 1, "%d:%d", &fps_n, &fps_d) != 2) return XEVE_ERR;
408-
y4m->fps = (int)((fps_n /(fps_d*1.0)) + 0.5);
407+
if (sscanf(p + 1, "%d:%d", &y4m->fps.num, &y4m->fps.den) != 2) return XEVE_ERR;
409408
break;
410409
}
411410
case 'I':
@@ -540,7 +539,9 @@ static void y4m_update_param(ARGS_PARSER * args, Y4M_INFO * y4m, XEVE_PARAM * pa
540539
{
541540
args->set_int(args, "width", y4m->w);
542541
args->set_int(args, "height", y4m->h);
543-
args->set_int(args, "fps", y4m->fps);
542+
char tmp_fps[256];
543+
sprintf(tmp_fps, "%d/%d", y4m->fps.num, y4m->fps.den);
544+
args->set_str(args, "fps", tmp_fps);
544545
args->set_int(args, "input-depth", y4m->bit_depth);
545546
}
546547

@@ -571,6 +572,27 @@ static int kbps_str_to_int(char * str)
571572
return kbps;
572573
}
573574

575+
static int update_fps_param(ARGS_PARSER* args, XEVE_PARAM* param)
576+
{
577+
if (strpbrk(args->fps, "/") != NULL)
578+
{
579+
sscanf(args->fps, "%d/%d", &param->fps.num, &param->fps.den);
580+
}
581+
else if (strpbrk(args->fps, ".") != NULL)
582+
{
583+
float tmp_fps = 0;
584+
sscanf(args->fps, "%f", &tmp_fps);
585+
param->fps.num = tmp_fps * 10000;
586+
param->fps.den = 10000;
587+
}
588+
else
589+
{
590+
sscanf(args->fps, "%d", &param->fps.num);
591+
param->fps.den = 1;
592+
}
593+
return XEVE_OK;
594+
}
595+
574596
static int update_rc_param(ARGS_PARSER * args, XEVE_PARAM * param)
575597
{
576598
if (strlen(args->bitrate) > 0)
@@ -775,7 +797,7 @@ static int vui_param_check(XEVE_PARAM * param)
775797
else if (param->num_units_in_tick == 0)
776798
{
777799
/*If num_units_in_tick is not present, set to fps, to propagate the coded fps */
778-
param->num_units_in_tick = param->fps;
800+
param->num_units_in_tick = param->fps.num / param->fps.den;
779801
param->timing_info_present_flag = param->timing_info_present_flag || 0;
780802
}
781803
else
@@ -1023,6 +1045,13 @@ int main(int argc, const char **argv)
10231045
/* coding color space should follow codec internal bit depth */
10241046
param->cs = XEVE_CS_SET(color_format, param->codec_bit_depth, 0);
10251047

1048+
/* update rate controller parameters */
1049+
if (update_fps_param(args, param))
1050+
{
1051+
logerr("fps is not proper\n");
1052+
ret = XEVE_ERR; goto ERR;
1053+
}
1054+
10261055
/* update rate controller parameters */
10271056
if (update_rc_param(args, param))
10281057
{
@@ -1315,7 +1344,7 @@ int main(int argc, const char **argv)
13151344
total_time = total_time % 60;
13161345
int s = total_time;
13171346
double curr_bitrate = bitrate;
1318-
curr_bitrate *= (param->fps * 8);
1347+
curr_bitrate *= ((double)param->fps.num/param->fps.den * 8);
13191348
curr_bitrate /= (encod_frames + 1);
13201349
curr_bitrate /= 1000;
13211350
logv2("[ %d / %d frames ] [ %.2f frame/sec ] [ %.4f kbps ] [ %2dh %2dm %2ds ] \r"
@@ -1383,7 +1412,7 @@ int main(int argc, const char **argv)
13831412
logv3(" PSNR U(dB) : %-5.4f\n", psnr_avg[1]);
13841413
logv3(" PSNR V(dB) : %-5.4f\n", psnr_avg[2]);
13851414
logv3(" Total bits(bits) : %.0f\n", bitrate * 8);
1386-
bitrate *= (param->fps * 8);
1415+
bitrate *= ((double)param->fps.num/ param->fps.den * 8);
13871416
bitrate /= pic_ocnt;
13881417
bitrate /= 1000;
13891418

app/xeve_app_args.h

+23-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static const ARGS_OPT args_opt_table[] = \
102102
"QP value (0~51)"
103103
},
104104
{
105-
'z', "fps", ARGS_VAL_TYPE_INTEGER | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
105+
'z', "fps", ARGS_VAL_TYPE_STRING | ARGS_VAL_TYPE_MANDATORY, 0, NULL,
106106
"frame rate (frame per second)"
107107
},
108108
{
@@ -637,6 +637,7 @@ struct _ARGS_PARSER
637637
int (*parse)(ARGS_PARSER * args, int argc, const char* argv[], char ** errstr);
638638
int (*get_help)(ARGS_PARSER * args, int idx, char * help);
639639
int (*get_str)(ARGS_PARSER * args, char * keyl, char * str, int *flag);
640+
int (*set_str)(ARGS_PARSER* args, char* keyl, char * str);
640641
int (*get_int)(ARGS_PARSER * args, char * keyl, int * val, int *flag);
641642
int (*set_int)(ARGS_PARSER * args, char * keyl, int val);
642643
int (*set_flag)(ARGS_PARSER * args, char * keyl, int flag);
@@ -663,6 +664,7 @@ struct _ARGS_PARSER
663664
char tune[32];
664665
char bitrate[64];
665666
char vbv_bufsize[64];
667+
char fps[256];
666668

667669
/* VUI options*/
668670
char sar[64];
@@ -1024,6 +1026,8 @@ static int args_init(ARGS_PARSER * args, XEVE_PARAM* param)
10241026
args_set_variable_by_key_long(opts, "bitrate", args->bitrate);
10251027
strcpy(args->vbv_bufsize, ""); /* default */
10261028
args_set_variable_by_key_long(opts, "vbv-bufsize", args->vbv_bufsize);
1029+
strcpy(args->fps, "30"); /* default */
1030+
args_set_variable_by_key_long(opts, "fps", args->fps);
10271031

10281032
strcpy(args->sar, ""); /* default */
10291033
args_set_variable_by_key_long(opts, "sar", args->sar);
@@ -1080,7 +1084,6 @@ static int args_init(ARGS_PARSER * args, XEVE_PARAM* param)
10801084
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, qp);
10811085
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, crf);
10821086
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, aq_mode);
1083-
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, fps);
10841087
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, keyint);
10851088
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, bframes);
10861089
ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, threads);
@@ -1251,6 +1254,23 @@ static int args_get(ARGS_PARSER * args, char * keyl, void ** val, int * flag)
12511254
}
12521255
}
12531256

1257+
static int args_set_str(ARGS_PARSER* args, char* keyl, char * str)
1258+
{
1259+
int idx;
1260+
1261+
idx = args_search_long_key(args->opts, keyl);
1262+
if (idx >= 0)
1263+
{
1264+
sprintf((char*)(args->opts[idx].val), "%s", str);
1265+
args->opts[idx].flag = 1;
1266+
return 0;
1267+
}
1268+
else
1269+
{
1270+
return -1;
1271+
}
1272+
}
1273+
12541274
static int args_set_int(ARGS_PARSER * args, char * keyl, int val)
12551275
{
12561276
int idx;
@@ -1439,6 +1459,7 @@ static ARGS_PARSER * args_create(void)
14391459
args->parse = args_parse;
14401460
args->get_help = args_get_help;
14411461
args->get_str = args_get_str;
1462+
args->set_str = args_set_str;
14421463
args->get_int = args_get_int;
14431464
args->set_int = args_set_int;
14441465
args->set_flag = args_set_flag;

inc/xeve.h

+12-1
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,17 @@ typedef struct _XEVE_BITB
326326
#define XEVE_RC_ABR 1
327327
#define XEVE_RC_CRF 2
328328

329+
/*****************************************************************************
330+
* coding parameters
331+
*****************************************************************************/
332+
typedef struct _XEVE_RATIONAL
333+
{
334+
/* Numerator */
335+
int num;
336+
/* Denominator */
337+
int den;
338+
} XEVE_RATIONAL;
339+
329340
/*****************************************************************************
330341
* coding parameters
331342
*****************************************************************************/
@@ -340,7 +351,7 @@ typedef struct _XEVE_PARAM
340351
/* height of input frame */
341352
int h;
342353
/* frame rate (Hz) */
343-
int fps;
354+
XEVE_RATIONAL fps;
344355
/* MAX I-frame period in frames.
345356
- 0: only one I-frame at the first time.
346357
- 1: every frame is coded in I-frame

src_base/xeve.c

+19-6
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,23 @@ int xeve_config(XEVE id, int cfg, void * buf, int * size)
183183
ctx->param.qp = t0;
184184
break;
185185
case XEVE_CFG_SET_FPS:
186-
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
187-
t0 = *((int *)buf);
188-
xeve_assert_rv(t0 > 0, XEVE_ERR_INVALID_ARGUMENT);
189-
ctx->param.fps = t0;
186+
xeve_assert_rv(*size == sizeof(char*), XEVE_ERR_INVALID_ARGUMENT);
187+
if (strpbrk((char*)buf, "/") != NULL)
188+
{
189+
sscanf((char*)buf, "%d/%d", &ctx->param.fps.num, &ctx->param.fps.den);
190+
}
191+
else if (strpbrk((char*)buf, ".") != NULL)
192+
{
193+
float tmp_fps = 0;
194+
sscanf((char*)buf, "%f", &tmp_fps);
195+
ctx->param.fps.num = tmp_fps * 10000;
196+
ctx->param.fps.den = 10000;
197+
}
198+
else
199+
{
200+
sscanf((char*)buf, "%d", &ctx->param.fps.num);
201+
ctx->param.fps.den = 1;
202+
}
190203
break;
191204
case XEVE_CFG_SET_BPS:
192205
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
@@ -248,8 +261,8 @@ int xeve_config(XEVE id, int cfg, void * buf, int * size)
248261
*((int *)buf) = ctx->param.h;
249262
break;
250263
case XEVE_CFG_GET_FPS:
251-
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
252-
*((int *)buf) = ctx->param.fps;
264+
xeve_assert_rv(*size == sizeof(char*), XEVE_ERR_INVALID_ARGUMENT);
265+
sprintf((char*)buf, "%d/%d", ctx->param.fps.num, ctx->param.fps.den);
253266
break;
254267
case XEVE_CFG_GET_BPS:
255268
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);

src_base/xeve_enc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2618,7 +2618,7 @@ void xeve_param2string(XEVE_PARAM * param, char * sei_buf, int padx, int pady)
26182618
sei_buf += snprintf(sei_buf, max_n, "profile=%d", param->profile);
26192619
sei_buf += snprintf(sei_buf, max_n, " threads=%d", param->threads);
26202620
sei_buf += snprintf(sei_buf, max_n, " input-res=%dx%d", param->w - padx, param->h - pady);
2621-
sei_buf += snprintf(sei_buf, max_n, " fps=%u", param->fps);
2621+
sei_buf += snprintf(sei_buf, max_n, " fps=%.3f", (float)param->fps.num/ param->fps.den);
26222622
sei_buf += snprintf(sei_buf, max_n, " keyint=%d", param->keyint);
26232623
sei_buf += snprintf(sei_buf, max_n, " color-space=%d", param->cs);
26242624
sei_buf += snprintf(sei_buf, max_n, " rc-type=%s", (param->rc_type == XEVE_RC_ABR) ? "ABR" : (param->rc_type == XEVE_RC_CRF) ? "CRF" : "CQP");

src_base/xeve_param_parse.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ static const XEVE_PARAM_METADATA xeve_params_metadata[] = {
6565
SET_XEVE_PARAM_METADATA( threads, DT_INTEGER ),
6666
SET_XEVE_PARAM_METADATA( w, DT_INTEGER ),
6767
SET_XEVE_PARAM_METADATA( h, DT_INTEGER ),
68-
SET_XEVE_PARAM_METADATA( fps, DT_INTEGER ),
68+
SET_XEVE_PARAM_METADATA( fps.num, DT_INTEGER ),
69+
SET_XEVE_PARAM_METADATA( fps.den, DT_INTEGER),
6970
SET_XEVE_PARAM_METADATA( keyint, DT_INTEGER ),
7071
SET_XEVE_PARAM_METADATA( cs, DT_INTEGER ),
7172
SET_XEVE_PARAM_METADATA( rc_type, DT_INTEGER ),

src_base/xeve_picman.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ static void picman_set_pic_to_pb(XEVE_PM * pm, XEVE_PIC * pic,
209209

210210
if(pos >= 0)
211211
{
212-
xeve_assert(pm->pic[pos] == NULL);
212+
xeve_assert(pm->pic[pos] == NULL || pm->pic[pos]->is_ref == 0);
213213
pm->pic[pos] = pic;
214214
}
215215
else /* pos < 0 */

src_base/xeve_rc.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void xeve_init_rc_bpf_tbl(XEVE_CTX * ctx)
176176

177177
int ld_struct = ctx->param.ref_pic_gap_length;
178178
int fnum_in_sec[10];
179-
int ngop_in_sec = (ctx->param.fps + ld_struct - 1) / ld_struct;
179+
int ngop_in_sec = ((int)((float)ctx->param.fps.num/ ctx->param.fps.den + 0.5) + ld_struct - 1) / ld_struct;
180180

181181
for (int i = ld_struct; i > 0; i = i >> 1)
182182
{
@@ -296,7 +296,7 @@ int xeve_rc_set(XEVE_CTX * ctx)
296296

297297
/* set default value */
298298
rc->param = &tbl_rc_param;
299-
rc->fps = ctx->param.fps;
299+
rc->fps = (double)ctx->param.fps.num/ ctx->param.fps.den;
300300
rc->bitrate = (double)(ctx->param.bitrate * 1000);
301301
rc->fps_idx = (((int)rc->fps + (ctx->param.gop_size >> 1)) / ctx->param.gop_size) - 1;
302302
rc->prev_bpf = 0;
@@ -531,7 +531,7 @@ double get_qfactor_clip(XEVE_CTX *ctx, XEVE_RCORE * rcore, double qf)
531531
if (ctx->param.lookahead >= 24)
532532
{
533533
/* when encount scene change just after IDR, raise up qp to bits */
534-
t0 = ctx->param.fps >> 3;
534+
t0 = (int)((float)ctx->param.fps.num/ ctx->param.fps.den + 0.5) >> 3;
535535
t1 = i_period >> 3;
536536

537537
thd_distance = XEVE_MIN(t0, t1);
@@ -559,7 +559,7 @@ double get_qfactor_clip(XEVE_CTX *ctx, XEVE_RCORE * rcore, double qf)
559559
if (rcore->scene_type == SCENE_HIGH)
560560
{
561561
/* when encount scene change just before IDR, raise up qp to bits */
562-
t0 = ctx->param.fps >> 3;
562+
t0 = (int)((float)ctx->param.fps.num / ctx->param.fps.den + 0.5) >> 3;
563563
t1 = i_period >> 3;
564564

565565
thd_distance = XEVE_MIN(t0, t1);

src_main/xevem.c

+19-6
Original file line numberDiff line numberDiff line change
@@ -899,10 +899,23 @@ int xeve_config(XEVE id, int cfg, void * buf, int * size)
899899
ctx->param.qp = t0;
900900
break;
901901
case XEVE_CFG_SET_FPS:
902-
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
903-
t0 = *((int *)buf);
904-
xeve_assert_rv(t0 > 0, XEVE_ERR_INVALID_ARGUMENT);
905-
ctx->param.fps = t0;
902+
xeve_assert_rv(*size == sizeof(char*), XEVE_ERR_INVALID_ARGUMENT);
903+
if (strpbrk((char*)buf, "/") != NULL)
904+
{
905+
sscanf((char*)buf, "%d/%d", &ctx->param.fps.num, &ctx->param.fps.den);
906+
}
907+
else if (strpbrk((char*)buf, ".") != NULL)
908+
{
909+
float tmp_fps = 0;
910+
sscanf((char*)buf, "%f", &tmp_fps);
911+
ctx->param.fps.num = tmp_fps * 10000;
912+
ctx->param.fps.den = 10000;
913+
}
914+
else
915+
{
916+
sscanf((char*)buf, "%d", &ctx->param.fps.num);
917+
ctx->param.fps.den = 1;
918+
}
906919
break;
907920
case XEVE_CFG_SET_BPS:
908921
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
@@ -968,8 +981,8 @@ int xeve_config(XEVE id, int cfg, void * buf, int * size)
968981
*((int *)buf) = ctx->param.h;
969982
break;
970983
case XEVE_CFG_GET_FPS:
971-
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);
972-
*((int *)buf) = ctx->param.fps;
984+
xeve_assert_rv(*size == sizeof(char*), XEVE_ERR_INVALID_ARGUMENT);
985+
sprintf((char*)buf, "%d/%d", ctx->param.fps.num, ctx->param.fps.den);
973986
break;
974987
case XEVE_CFG_GET_KEYINT:
975988
xeve_assert_rv(*size == sizeof(int), XEVE_ERR_INVALID_ARGUMENT);

0 commit comments

Comments
 (0)