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.
This commit is contained in:
Wim Taymans 2010-10-06 16:43:27 +02:00
parent c330cdcc5d
commit 4aa9b97d3f

View file

@ -195,12 +195,23 @@ gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
/* fixed, non probing context */ /* fixed, non probing context */
if (context != NULL && context->width != -1) { if (context != NULL && context->width != -1) {
gint num, denom;
caps = gst_caps_new_simple (mimetype, caps = gst_caps_new_simple (mimetype,
"width", G_TYPE_INT, context->width, "width", G_TYPE_INT, context->width,
"height", G_TYPE_INT, context->height, "height", G_TYPE_INT, context->height, NULL);
"framerate", GST_TYPE_FRACTION,
context->time_base.den / context->ticks_per_frame, num = context->time_base.den / context->ticks_per_frame;
context->time_base.num, NULL); 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 { } else {
/* so we are after restricted caps in this case */ /* so we are after restricted caps in this case */
switch (codec_id) { switch (codec_id) {