From 2e38f24b56d906c25af5b270079aa9e822029c08 Mon Sep 17 00:00:00 2001 From: Tom Greenwood Date: Wed, 6 Mar 2013 13:28:37 +0000 Subject: [PATCH] x264enc: Fix for 0/1 framerate - now uses VFR in this case Previously did a division by zero. https://bugzilla.gnome.org/show_bug.cgi?id=695728 --- ext/x264/gstx264enc.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/ext/x264/gstx264enc.c b/ext/x264/gstx264enc.c index 9b235863f9..0f5b9d3e39 100644 --- a/ext/x264/gstx264enc.c +++ b/ext/x264/gstx264enc.c @@ -312,7 +312,7 @@ static const GFlagsValue tune_types[] = { {0x0, "No tuning", "none"}, {0x1, "Still image", "stillimage"}, {0x2, "Fast decode", "fastdecode"}, - {0x4, "Zero latency (requires constant framerate)", "zerolatency"}, + {0x4, "Zero latency", "zerolatency"}, {0, NULL, NULL}, }; @@ -1217,8 +1217,21 @@ gst_x264_enc_init_encoder (GstX264Enc * encoder) /* set up encoder parameters */ encoder->x264param.i_csp = gst_x264_enc_gst_to_x264_video_format (info->finfo->format, NULL); - encoder->x264param.i_fps_num = info->fps_n; - encoder->x264param.i_fps_den = info->fps_d; + if (info->fps_d == 0 || info->fps_n == 0) { + /* No FPS so must use VFR + * This raises latency apparently see http://mewiki.project357.com/wiki/X264_Encoding_Suggestions */ + encoder->x264param.b_vfr_input = TRUE; + if (encoder->keyint_max) { /* NB the default is 250 setup by x264 itself */ + encoder->x264param.i_keyint_max = encoder->keyint_max; + } + } else { + /* FPS available so set it up */ + encoder->x264param.i_fps_num = info->fps_n; + encoder->x264param.i_fps_den = info->fps_d; + encoder->x264param.i_keyint_max = + encoder->keyint_max ? encoder->keyint_max : (10 * info->fps_n / + info->fps_d); + } encoder->x264param.i_width = info->width; encoder->x264param.i_height = info->height; if (info->par_d > 0) { @@ -1226,9 +1239,6 @@ gst_x264_enc_init_encoder (GstX264Enc * encoder) encoder->x264param.vui.i_sar_height = info->par_d; } - encoder->x264param.i_keyint_max = encoder->keyint_max ? encoder->keyint_max : - (10 * info->fps_n / info->fps_d); - if ((((info->height == 576) && ((info->width == 720) || (info->width == 704) || (info->width == 352))) || ((info->height == 288) && (info->width == 352)))