diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-12-07 04:13:44 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-12-07 04:20:05 +0100 |
commit | 1770da18f7e63b3afbfda9ab598f3e7424206e39 (patch) | |
tree | 17bbd2b66431b265b50f2bf2afcc8fb0b4e4ed57 /libavformat/utils.c | |
parent | ba189b1db49c27e2c9e117362c516cbf106e585e (diff) | |
download | ffmpeg-1770da18f7e63b3afbfda9ab598f3e7424206e39.tar.gz |
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 <michaelni@gmx.at>
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 34 |
1 files 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; i<MAX_STD_TIMEBASES; i++) { - 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; + 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; i<MAX_STD_TIMEBASES; i++) { + if (st->info->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); |