X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Ftimefilter.c;h=4a582242eca173f2726488aec3268e1de3be9b5e;hb=0e59034ed8278c306219c99e7d5b2925c04dd5e0;hp=26d57c0617f05f3c2febfa05254cb714b670166c;hpb=08ffd3708bd15613e85e331b04c89fbde2054b30;p=ffmpeg diff --git a/libavformat/timefilter.c b/libavformat/timefilter.c index 26d57c0617f..4a582242eca 100644 --- a/libavformat/timefilter.c +++ b/libavformat/timefilter.c @@ -1,7 +1,9 @@ /* * Delay Locked Loop based time filter * Copyright (c) 2009 Samalyse + * Copyright (c) 2009 Michael Niedermayer * Author: Olivier Guilyardi + * Michael Niedermayer * * This file is part of FFmpeg. * @@ -31,13 +33,14 @@ struct TimeFilter { double cycle_time; double feedback2_factor; double feedback3_factor; - double integrator2_state; + double clock_period; + int count; }; -TimeFilter * ff_timefilter_new(double feedback2_factor, double feedback3_factor) +TimeFilter * ff_timefilter_new(double clock_period, double feedback2_factor, double feedback3_factor) { TimeFilter *self = av_mallocz(sizeof(TimeFilter)); - self->integrator2_state = 1.0; + self->clock_period = clock_period; self->feedback2_factor = feedback2_factor; self->feedback3_factor = feedback3_factor; return self; @@ -50,27 +53,97 @@ void ff_timefilter_destroy(TimeFilter *self) void ff_timefilter_reset(TimeFilter *self) { - self->cycle_time = 0; + self->count = 0; } -void ff_timefilter_update(TimeFilter *self, double system_time, double period) +double ff_timefilter_update(TimeFilter *self, double system_time, double period) { - if (!self->cycle_time) { + self->count++; + if (self->count==1) { /// init loop - self->cycle_time = system_time; + self->cycle_time = system_time; } else { double loop_error; - self->cycle_time+= self->integrator2_state * period; + self->cycle_time += self->clock_period * period; /// calculate loop error - loop_error = system_time - self->cycle_time; + loop_error = system_time - self->cycle_time; /// update loop - self->cycle_time += self->feedback2_factor * loop_error; - self->integrator2_state += self->feedback3_factor * loop_error / period; + self->cycle_time += FFMAX(self->feedback2_factor, 1.0/(self->count)) * loop_error; + self->clock_period += self->feedback3_factor * loop_error / period; } + return self->cycle_time; } -double ff_timefilter_read(TimeFilter *self) +#ifdef TEST +#include "libavutil/lfg.h" +#define LFG_MAX ((1LL << 32) - 1) + +int main(void) { - return self->cycle_time; + AVLFG prng; + double n0,n1; +#define SAMPLES 1000 + double ideal[SAMPLES]; + double samples[SAMPLES]; +#if 1 + for(n0= 0; n0<40; n0=2*n0+1){ + for(n1= 0; n1<10; n1=2*n1+1){ +#else + {{ + n0=7; + n1=1; +#endif + double best_error= 1000000000; + double bestpar0=1; + double bestpar1=0.001; + int better, i; + + av_lfg_init(&prng, 123); + for(i=0; i