X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Ftimefilter.c;h=5c780c8d90fe4ee8131d131017d58a39b34eb72b;hb=3c3daf4d198306295e3342631f19422bdc258dbb;hp=6873ad7b5502010871bedb9edb210e00a67c33f6;hpb=32284910277308ea3236edf5bf523cffc857cb12;p=ffmpeg diff --git a/libavformat/timefilter.c b/libavformat/timefilter.c index 6873ad7b550..5c780c8d90f 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,14 +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 clock_period, double feedback2_factor, double feedback3_factor) { TimeFilter *self = av_mallocz(sizeof(TimeFilter)); - self->integrator2_state = clock_period; + self->clock_period = clock_period; self->feedback2_factor = feedback2_factor; self->feedback3_factor = feedback3_factor; return self; @@ -59,37 +61,51 @@ double ff_timefilter_update(TimeFilter *self, double system_time, double period) 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 += FFMAX(self->feedback2_factor, 1.0/(self->count)) * 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; } #ifdef TEST -main(){ +#include "libavutil/lfg.h" +#define LFG_MAX ((1LL << 32) - 1) + +#undef printf + +int main(void) +{ + 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; - srandom(123); + av_lfg_init(&prng, 123); for(i=0; i