annotate timefilter.c @ 6259:7b2f50760dfb libavformat

matroskaenc: write DisplayUnit element to better match the spec This makes it clear that we are specifying the aspect ratio, and not the intended display size in pixels.
author aurel
date Wed, 14 Jul 2010 19:36:14 +0000
parents 69c5cb7c0487
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
1 /*
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
2 * Delay Locked Loop based time filter
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
3 * Copyright (c) 2009 Samalyse
4665
aed6cf383ca2 Add my name to copyright & author as requested by the original author.
michael
parents: 4664
diff changeset
4 * Copyright (c) 2009 Michael Niedermayer
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
5 * Author: Olivier Guilyardi <olivier samalyse com>
4665
aed6cf383ca2 Add my name to copyright & author as requested by the original author.
michael
parents: 4664
diff changeset
6 * Michael Niedermayer <michaelni gmx at>
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
7 *
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
8 * This file is part of FFmpeg.
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
9 *
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
10 * FFmpeg is free software; you can redistribute it and/or
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
11 * modify it under the terms of the GNU Lesser General Public
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
12 * License as published by the Free Software Foundation; either
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
13 * version 2.1 of the License, or (at your option) any later version.
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
14 *
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
15 * FFmpeg is distributed in the hope that it will be useful,
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
18 * Lesser General Public License for more details.
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
19 *
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
20 * You should have received a copy of the GNU Lesser General Public
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
21 * License along with FFmpeg; if not, write to the Free Software
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
23 */
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
24
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
25
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
26 #include "config.h"
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
27 #include "avformat.h"
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
28 #include "timefilter.h"
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
29
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
30 struct TimeFilter {
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
31 /// Delay Locked Loop data. These variables refer to mathematical
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
32 /// concepts described in: http://www.kokkinizita.net/papers/usingdll.pdf
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
33 double cycle_time;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
34 double feedback2_factor;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
35 double feedback3_factor;
4658
d5c0fe987063 Better name for integrator2_state.
michael
parents: 4657
diff changeset
36 double clock_period;
4654
d90df812a2a1 Adapt first factor.
michael
parents: 4653
diff changeset
37 int count;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
38 };
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
39
4657
6b24b7aa7351 Add clock_period parameter, this should make the code easier to use.
michael
parents: 4656
diff changeset
40 TimeFilter * ff_timefilter_new(double clock_period, double feedback2_factor, double feedback3_factor)
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
41 {
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
42 TimeFilter *self = av_mallocz(sizeof(TimeFilter));
4658
d5c0fe987063 Better name for integrator2_state.
michael
parents: 4657
diff changeset
43 self->clock_period = clock_period;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
44 self->feedback2_factor = feedback2_factor;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
45 self->feedback3_factor = feedback3_factor;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
46 return self;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
47 }
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
48
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
49 void ff_timefilter_destroy(TimeFilter *self)
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
50 {
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
51 av_freep(&self);
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
52 }
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
53
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
54 void ff_timefilter_reset(TimeFilter *self)
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
55 {
4654
d90df812a2a1 Adapt first factor.
michael
parents: 4653
diff changeset
56 self->count = 0;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
57 }
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
58
4653
34a843f958b7 Merge ff_timefilter_read() and ff_timefilter_update(), this simplifies API and
michael
parents: 4652
diff changeset
59 double ff_timefilter_update(TimeFilter *self, double system_time, double period)
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
60 {
4654
d90df812a2a1 Adapt first factor.
michael
parents: 4653
diff changeset
61 self->count++;
4655
d9f082019a79 Fix bug with time==0 being special.
michael
parents: 4654
diff changeset
62 if (self->count==1) {
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
63 /// init loop
4659
0004dea93e16 Vertical align.
michael
parents: 4658
diff changeset
64 self->cycle_time = system_time;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
65 } else {
4651
2f6e99161450 Reorder operations, 20% improved performance, 1 variable less.
michael
parents: 4650
diff changeset
66 double loop_error;
4658
d5c0fe987063 Better name for integrator2_state.
michael
parents: 4657
diff changeset
67 self->cycle_time += self->clock_period * period;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
68 /// calculate loop error
4659
0004dea93e16 Vertical align.
michael
parents: 4658
diff changeset
69 loop_error = system_time - self->cycle_time;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
70
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
71 /// update loop
4659
0004dea93e16 Vertical align.
michael
parents: 4658
diff changeset
72 self->cycle_time += FFMAX(self->feedback2_factor, 1.0/(self->count)) * loop_error;
4658
d5c0fe987063 Better name for integrator2_state.
michael
parents: 4657
diff changeset
73 self->clock_period += self->feedback3_factor * loop_error / period;
4650
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
74 }
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
75 return self->cycle_time;
5090afc3cd19 Timefilter code by Olivier Guilyardi o list O samalyse o com
michael
parents:
diff changeset
76 }
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
77
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
78 #ifdef TEST
4848
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
79 #include "libavutil/lfg.h"
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
80 #define LFG_MAX ((1LL << 32) - 1)
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
81
4660
687695aeadca cosmetics: Fix test program warnings.
diego
parents: 4659
diff changeset
82 int main(void)
687695aeadca cosmetics: Fix test program warnings.
diego
parents: 4659
diff changeset
83 {
4848
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
84 AVLFG prng;
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
85 double n0,n1;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
86 #define SAMPLES 1000
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
87 double ideal[SAMPLES];
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
88 double samples[SAMPLES];
4664
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
89 #if 1
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
90 for(n0= 0; n0<40; n0=2*n0+1){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
91 for(n1= 0; n1<10; n1=2*n1+1){
4664
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
92 #else
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
93 {{
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
94 n0=7;
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
95 n1=1;
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
96 #endif
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
97 double best_error= 1000000000;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
98 double bestpar0=1;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
99 double bestpar1=0.001;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
100 int better, i;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
101
4848
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
102 av_lfg_init(&prng, 123);
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
103 for(i=0; i<SAMPLES; i++){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
104 ideal[i] = 10 + i + n1*i/(1000);
4848
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
105 samples[i] = ideal[i] + n0 * (av_lfg_get(&prng) - LFG_MAX / 2)
69c5cb7c0487 Replace rand() usage by av_lfg_get().
diego
parents: 4847
diff changeset
106 / (LFG_MAX * 10LL);
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
107 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
108
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
109 do{
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
110 double par0, par1;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
111 better=0;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
112 for(par0= bestpar0*0.8; par0<=bestpar0*1.21; par0+=bestpar0*0.05){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
113 for(par1= bestpar1*0.8; par1<=bestpar1*1.21; par1+=bestpar1*0.05){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
114 double error=0;
4657
6b24b7aa7351 Add clock_period parameter, this should make the code easier to use.
michael
parents: 4656
diff changeset
115 TimeFilter *tf= ff_timefilter_new(1, par0, par1);
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
116 for(i=0; i<SAMPLES; i++){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
117 double filtered;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
118 filtered= ff_timefilter_update(tf, samples[i], 1);
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
119 error += (filtered - ideal[i]) * (filtered - ideal[i]);
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
120 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
121 ff_timefilter_destroy(tf);
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
122 if(error < best_error){
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
123 best_error= error;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
124 bestpar0= par0;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
125 bestpar1= par1;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
126 better=1;
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
127 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
128 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
129 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
130 }while(better);
4664
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
131 #if 0
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
132 double lastfil=9;
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
133 TimeFilter *tf= ff_timefilter_new(1, bestpar0, bestpar1);
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
134 for(i=0; i<SAMPLES; i++){
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
135 double filtered;
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
136 filtered= ff_timefilter_update(tf, samples[i], 1);
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
137 printf("%f %f %f %f\n", i - samples[i] + 10, filtered - samples[i], samples[FFMAX(i, 1)] - samples[FFMAX(i-1, 0)], filtered - lastfil);
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
138 lastfil= filtered;
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
139 }
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
140 ff_timefilter_destroy(tf);
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
141 #else
4847
22aad159263c cosmetics: Align output columns.
diego
parents: 4665
diff changeset
142 printf(" [%f %f %9f]", bestpar0, bestpar1, best_error);
4664
48d9e631f630 Add code to the self test to print jitter & drift.
michael
parents: 4661
diff changeset
143 #endif
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
144 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
145 printf("\n");
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
146 }
4660
687695aeadca cosmetics: Fix test program warnings.
diego
parents: 4659
diff changeset
147 return 0;
4656
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
148 }
c467710f2fe2 Selftest code.
michael
parents: 4655
diff changeset
149 #endif