summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-07-27 14:04:07 +0200
committerAnton Khirnov <anton@khirnov.net>2012-07-29 08:05:46 +0200
commitf66eeff1c8fc5c1b2e5a563cf336865d52329006 (patch)
treead830da913b9ba1578dff049ac8bdec05d1abd0e /libavformat
parentfe1c1198e670242f3cf9e3e1eef27cff77f3ee23 (diff)
lavf: round estimated average fps to a "standard" fps.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/utils.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index bd94f7d7a7..d358c324f8 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2485,10 +2485,28 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
if (!st->avg_frame_rate.num && st->info->fps_last_dts != st->info->fps_first_dts) {
int64_t delta_dts = st->info->fps_last_dts - st->info->fps_first_dts;
int delta_packets = st->info->fps_last_dts_idx - st->info->fps_first_dts_idx;
+ int best_fps = 0;
+ double best_error = 0.01;
av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
delta_packets*(int64_t)st->time_base.den,
delta_dts*(int64_t)st->time_base.num, 60000);
+
+ /* round guessed framerate to a "standard" framerate if it's
+ * within 1% of the original estimate*/
+ for (j = 1; j < MAX_STD_TIMEBASES; j++) {
+ AVRational std_fps = (AVRational){get_std_framerate(j), 12*1001};
+ double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
+
+ if (error < best_error) {
+ best_error = error;
+ best_fps = std_fps.num;
+ }
+ }
+ if (best_fps) {
+ av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
+ best_fps, 12*1001, INT_MAX);
+ }
}
// the check for tb_unreliable() is not completely correct, since this is not about handling
// a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.