Mercurial > libavformat.hg
annotate timefilter.c @ 6260:5c17c20dd67a libavformat
In ogg muxer, use dyn buffer to compute crc of the page, fix muxing with pipe
when page buffer is bigger than default buffer size. Max page is 65k.
| author | bcoudurier |
|---|---|
| date | Wed, 14 Jul 2010 23:21:18 +0000 |
| parents | 69c5cb7c0487 |
| children |
| 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 | 36 double clock_period; |
| 4654 | 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 | 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 | 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 | 61 self->count++; |
| 4655 | 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 | 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 | 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 | 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 | 72 self->cycle_time += FFMAX(self->feedback2_factor, 1.0/(self->count)) * loop_error; |
| 4658 | 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 | 77 |
| 78 #ifdef TEST | |
| 4848 | 79 #include "libavutil/lfg.h" |
| 80 #define LFG_MAX ((1LL << 32) - 1) | |
| 81 | |
| 4660 | 82 int main(void) |
| 83 { | |
| 4848 | 84 AVLFG prng; |
| 4656 | 85 double n0,n1; |
| 86 #define SAMPLES 1000 | |
| 87 double ideal[SAMPLES]; | |
| 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 | 90 for(n0= 0; n0<40; n0=2*n0+1){ |
| 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 | 97 double best_error= 1000000000; |
| 98 double bestpar0=1; | |
| 99 double bestpar1=0.001; | |
| 100 int better, i; | |
| 101 | |
| 4848 | 102 av_lfg_init(&prng, 123); |
| 4656 | 103 for(i=0; i<SAMPLES; i++){ |
| 104 ideal[i] = 10 + i + n1*i/(1000); | |
| 4848 | 105 samples[i] = ideal[i] + n0 * (av_lfg_get(&prng) - LFG_MAX / 2) |
| 106 / (LFG_MAX * 10LL); | |
| 4656 | 107 } |
| 108 | |
| 109 do{ | |
| 110 double par0, par1; | |
| 111 better=0; | |
| 112 for(par0= bestpar0*0.8; par0<=bestpar0*1.21; par0+=bestpar0*0.05){ | |
| 113 for(par1= bestpar1*0.8; par1<=bestpar1*1.21; par1+=bestpar1*0.05){ | |
| 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 | 116 for(i=0; i<SAMPLES; i++){ |
| 117 double filtered; | |
| 118 filtered= ff_timefilter_update(tf, samples[i], 1); | |
| 119 error += (filtered - ideal[i]) * (filtered - ideal[i]); | |
| 120 } | |
| 121 ff_timefilter_destroy(tf); | |
| 122 if(error < best_error){ | |
| 123 best_error= error; | |
| 124 bestpar0= par0; | |
| 125 bestpar1= par1; | |
| 126 better=1; | |
| 127 } | |
| 128 } | |
| 129 } | |
| 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 | 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 | 144 } |
| 145 printf("\n"); | |
| 146 } | |
| 4660 | 147 return 0; |
| 4656 | 148 } |
| 149 #endif |
