mirror of https://git.ffmpeg.org/ffmpeg.git
lavf: round estimated average fps to a "standard" fps.
This commit is contained in:
parent
fe1c1198e6
commit
f66eeff1c8
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue