summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorTom Greenwood <tgreenwood@Toms-MacBook-Pro.local>2013-03-06 13:28:37 +0000
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2013-03-25 10:08:44 +0100
commit2e38f24b56d906c25af5b270079aa9e822029c08 (patch)
tree7d06e45f09fa87953398e32d3bf8b2622697f3d0 /ext
parent53d7e8436ce5dd33b385a6261a5b6784bace2305 (diff)
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
Diffstat (limited to 'ext')
-rw-r--r--ext/x264/gstx264enc.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/ext/x264/gstx264enc.c b/ext/x264/gstx264enc.c
index 9b235863..0f5b9d3e 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)))