X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Ftimefilter.c;h=4860a4ff70110d49e45e1aafacd3198955dac089;hb=70ad9842a5d0d685080d4e61243554dfad6dc00e;hp=809dbc60ce01f4346ffdc3fecd037ecf5ba932b3;hpb=1b85ec1ea231f26184c8e7328322916bdaf08db9;p=ffmpeg diff --git a/libavformat/timefilter.c b/libavformat/timefilter.c index 809dbc60ce0..4860a4ff701 100644 --- a/libavformat/timefilter.c +++ b/libavformat/timefilter.c @@ -1,22 +1,24 @@ /* * 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. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -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 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; @@ -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