From 4053e1d6acc241d7690c7b1325d3b43775b83e48 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Sun, 30 Jun 2013 21:01:20 +0200 Subject: [PATCH] qtdemux: compute framerate from average sample duration https://bugzilla.gnome.org/show_bug.cgi?id=703350 --- gst/isomp4/Makefile.am | 2 +- gst/isomp4/qtdemux.c | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gst/isomp4/Makefile.am b/gst/isomp4/Makefile.am index 3e806f9583..09887126af 100644 --- a/gst/isomp4/Makefile.am +++ b/gst/isomp4/Makefile.am @@ -10,7 +10,7 @@ libgstisomp4_la_LIBADD = \ -lgstrtp-@GST_API_VERSION@ \ -lgsttag-@GST_API_VERSION@ \ -lgstpbutils-@GST_API_VERSION@ \ - $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) + $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) $(LIBM) libgstisomp4_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} libgstisomp4_la_SOURCES = isomp4-plugin.c gstrtpxqtdepay.c \ qtdemux.c qtdemux_types.c qtdemux_dump.c qtdemux_lang.c \ diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index ff84f00e15..55d04eac49 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -70,6 +70,9 @@ #include #include +#include +#include + #ifdef HAVE_ZLIB # include #endif @@ -5528,11 +5531,19 @@ gst_qtdemux_configure_stream (GstQTDemux * qtdemux, QtDemuxStream * stream) stream->fps_n = 0; stream->fps_d = 1; } else { - stream->fps_n = stream->timescale; - if (stream->min_duration == 0) - stream->fps_d = 1; + /* we might need to scale the timescale to get precise framerate */ + const int required_scale = rint (log (10000) / 2.303); /* divide to get log10 */ + int current_scale = rint (log (stream->timescale) / 2.303); + int factor = pow (10.0, MAX (0, required_scale - current_scale)); + + stream->fps_n = stream->timescale * factor; + + if (stream->duration == 0) + stream->fps_d = factor; else - stream->fps_d = stream->min_duration; + stream->fps_d = + gst_util_uint64_scale_int_round (factor, stream->duration, + stream->n_samples); } if (stream->caps) {