comparison timefilter.c @ 4652:28b80bbf6288 libavformat

Allow timespans to vary. No change in performance if they do not vary.
author michael
date Fri, 06 Mar 2009 00:09:14 +0000
parents 2f6e99161450
children 34a843f958b7
comparison
equal deleted inserted replaced
4651:2f6e99161450 4652:28b80bbf6288
32 double feedback2_factor; 32 double feedback2_factor;
33 double feedback3_factor; 33 double feedback3_factor;
34 double integrator2_state; 34 double integrator2_state;
35 }; 35 };
36 36
37 TimeFilter * ff_timefilter_new(double period, double feedback2_factor, double feedback3_factor) 37 TimeFilter * ff_timefilter_new(double feedback2_factor, double feedback3_factor)
38 { 38 {
39 TimeFilter *self = av_mallocz(sizeof(TimeFilter)); 39 TimeFilter *self = av_mallocz(sizeof(TimeFilter));
40 self->integrator2_state = period; 40 self->integrator2_state = 1.0;
41 self->feedback2_factor = feedback2_factor; 41 self->feedback2_factor = feedback2_factor;
42 self->feedback3_factor = feedback3_factor; 42 self->feedback3_factor = feedback3_factor;
43 return self; 43 return self;
44 } 44 }
45 45
51 void ff_timefilter_reset(TimeFilter *self) 51 void ff_timefilter_reset(TimeFilter *self)
52 { 52 {
53 self->cycle_time = 0; 53 self->cycle_time = 0;
54 } 54 }
55 55
56 void ff_timefilter_update(TimeFilter *self, double system_time) 56 void ff_timefilter_update(TimeFilter *self, double system_time, double period)
57 { 57 {
58 if (!self->cycle_time) { 58 if (!self->cycle_time) {
59 /// init loop 59 /// init loop
60 self->cycle_time = system_time; 60 self->cycle_time = system_time;
61 } else { 61 } else {
62 double loop_error; 62 double loop_error;
63 self->cycle_time+= self->integrator2_state; 63 self->cycle_time+= self->integrator2_state * period;
64 /// calculate loop error 64 /// calculate loop error
65 loop_error = system_time - self->cycle_time; 65 loop_error = system_time - self->cycle_time;
66 66
67 /// update loop 67 /// update loop
68 self->cycle_time += self->feedback2_factor * loop_error; 68 self->cycle_time += self->feedback2_factor * loop_error;
69 self->integrator2_state += self->feedback3_factor * loop_error; 69 self->integrator2_state += self->feedback3_factor * loop_error / period;
70 } 70 }
71 } 71 }
72 72
73 double ff_timefilter_read(TimeFilter *self) 73 double ff_timefilter_read(TimeFilter *self)
74 { 74 {