From 1770da18f7e63b3afbfda9ab598f3e7424206e39 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 7 Dec 2013 04:13:44 +0100 Subject: [PATCH] avformat/utils: reject poorly fitting rfps values earlier This avoids collecting statistics for rfps values that very likely will get rejected later. Signed-off-by: Michael Niedermayer --- libavformat/utils.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index babd7d5b0c..71100f8e26 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2719,16 +2719,36 @@ int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts) // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO) // av_log(NULL, AV_LOG_ERROR, "%f\n", dts); for (i=0; iinfo->duration_error[j][0][i] += error; - st->info->duration_error[j][1][i] += error*error; + if (st->info->duration_error[0][1][i] < 1e10) { + int framerate= get_std_framerate(i); + double sdts= dts*framerate/(1001*12); + for(j=0; j<2; j++){ + int64_t ticks= llrint(sdts+j*0.5); + double error= sdts - ticks + j*0.5; + st->info->duration_error[j][0][i] += error; + st->info->duration_error[j][1][i] += error*error; + } } } st->info->duration_count++; + + if (st->info->duration_count % 10 == 0) { + int n = st->info->duration_count; + for (i=0; iinfo->duration_error[0][1][i] < 1e10) { + int framerate= get_std_framerate(i); + double a0 = st->info->duration_error[0][0][i] / n; + double error0 = st->info->duration_error[0][1][i] / n - a0*a0; + double a1 = st->info->duration_error[1][0][i] / n; + double error1 = st->info->duration_error[1][1][i] / n - a1*a1; + if (error0 > 0.04 && error1 > 0.04) { + st->info->duration_error[0][1][i] = 2e10; + st->info->duration_error[1][1][i] = 2e10; + } + } + } + } + // ignore the first 4 values, they might have some random jitter if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last)) st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);