x264enc: Fix for 0/1 framerate - now uses VFR in this case
authorTom Greenwood <tgreenwood@Toms-MacBook-Pro.local>
Wed, 6 Mar 2013 13:28:37 +0000 (13:28 +0000)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 25 Mar 2013 09:08:44 +0000 (10:08 +0100)
Previously did a division by zero.

https://bugzilla.gnome.org/show_bug.cgi?id=695728

ext/x264/gstx264enc.c

index 9b235863f9ce366c41bcbed6c25de6b99cc4e232..0f5b9d3e39725548ae4ce4d7a2ab4ddb672b5bcc 100644 (file)
@@ -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)))