diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-10-06 16:43:27 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-10-06 16:58:52 +0200 |
commit | 4aa9b97d3fabdbb5a7c63f9543b673dbf29a1965 (patch) | |
tree | d438ab40a5e738b1fd4ed9107583e79c5f511a97 | |
parent | c330cdcc5df1d76e91ed51ba144f09b299a0da7a (diff) |
ffcodecmap: avoid setting large framerates
When the framerate is bigger than 1000/1, set it to 0/1 instead. This avoids
letting the videosink do QoS on these very small frame durations.
-rw-r--r-- | ext/ffmpeg/gstffmpegcodecmap.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/ext/ffmpeg/gstffmpegcodecmap.c b/ext/ffmpeg/gstffmpegcodecmap.c index a4293a2..45581a5 100644 --- a/ext/ffmpeg/gstffmpegcodecmap.c +++ b/ext/ffmpeg/gstffmpegcodecmap.c @@ -195,12 +195,23 @@ gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id, /* fixed, non probing context */ if (context != NULL && context->width != -1) { + gint num, denom; + caps = gst_caps_new_simple (mimetype, "width", G_TYPE_INT, context->width, - "height", G_TYPE_INT, context->height, - "framerate", GST_TYPE_FRACTION, - context->time_base.den / context->ticks_per_frame, - context->time_base.num, NULL); + "height", G_TYPE_INT, context->height, NULL); + + num = context->time_base.den / context->ticks_per_frame; + denom = context->time_base.num; + + if (gst_util_fraction_compare (num, denom, 1000, 1) > 0) { + GST_LOG ("excessive framerate: %d/%d, -> 0/1", num, denom); + num = 0; + denom = 1; + } + GST_LOG ("setting framerate: %d/%d", num, denom); + gst_caps_set_simple (caps, + "framerate", GST_TYPE_FRACTION, num, denom, NULL); } else { /* so we are after restricted caps in this case */ switch (codec_id) { |