Mercurial > mplayer.hg
annotate libaf/af.h @ 7616:d09c125a88fa
Changing frequency limit for resampling
author | anders |
---|---|
date | Sun, 06 Oct 2002 11:28:03 +0000 |
parents | c67328dd459a |
children | 90e16aa8ae5f |
rev | line source |
---|---|
7568 | 1 #ifndef __aop_h__ |
2 #define __aop_h__ | |
3 | |
4 struct af_instance_s; | |
5 | |
6 // Audio data chunk | |
7 typedef struct af_data_s | |
8 { | |
9 void* audio; // data buffer | |
10 int len; // buffer length | |
11 int rate; // sample rate | |
12 int nch; // number of channels | |
13 int format; // format | |
14 int bps; // bytes per sample | |
15 } af_data_t; | |
16 | |
17 // Fraction, used to calculate buffer lengths | |
18 typedef struct frac_s | |
19 { | |
20 int n; // Numerator | |
21 int d; // Denominator | |
22 } frac_t; | |
23 | |
7615 | 24 // Flags used for defining the behavour of an audio filter |
25 #define AF_FLAGS_REENTRANT 0x00000000 | |
26 #define AF_FLAGS_NOT_REENTRANT 0x00000001 | |
27 | |
7568 | 28 /* Audio filter information not specific for current instance, but for |
29 a specific filter */ | |
30 typedef struct af_info_s | |
31 { | |
32 const char *info; | |
33 const char *name; | |
34 const char *author; | |
35 const char *comment; | |
7615 | 36 const int flags; |
7568 | 37 int (*open)(struct af_instance_s* vf); |
38 } af_info_t; | |
39 | |
40 // Linked list of audio filters | |
41 typedef struct af_instance_s | |
42 { | |
43 af_info_t* info; | |
44 int (*control)(struct af_instance_s* af, int cmd, void* arg); | |
45 void (*uninit)(struct af_instance_s* af); | |
46 af_data_t* (*play)(struct af_instance_s* af, af_data_t* data); | |
47 void* setup; // setup data for this specific instance and filter | |
48 af_data_t* data; // configuration for outgoing data stream | |
49 struct af_instance_s* next; | |
50 struct af_instance_s* prev; | |
51 frac_t mul; /* length multiplier: how much does this instance change | |
52 the length of the buffer. */ | |
53 }af_instance_t; | |
54 | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
55 // Initialization types |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
56 #define SLOW 1 |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
57 #define FAST 2 |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
58 #define FORCE 3 |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
59 |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
60 // Configuration switches |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
61 typedef struct af_cfg_s{ |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
62 int force; // Initialization type |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
63 char** list; /* list of names of plugins that are added to filter |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
64 list during first initialization of stream */ |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
65 }af_cfg_t; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
66 |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
67 // Current audio stream |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
68 typedef struct af_stream_s |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
69 { |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
70 // The first and last filter in the list |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
71 af_instance_t* first; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
72 af_instance_t* last; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
73 // Storage for input and output data formats |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
74 af_data_t input; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
75 af_data_t output; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
76 // Cofiguration for this stream |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
77 af_cfg_t cfg; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
78 }af_stream_t; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
79 |
7568 | 80 /********************************************* |
81 // Control parameters | |
82 */ | |
83 | |
84 /* The control system is divided into 3 levels | |
85 mandatory calls - all filters must answer to all of these | |
86 optional calls - are optional | |
87 filter specific calls - applies only to some filters | |
88 */ | |
89 | |
90 #define AF_CONTROL_MANDATORY_BASE 0 | |
91 #define AF_CONTROL_OPTIONAL_BASE 100 | |
92 #define AF_CONTROL_FILTER_SPECIFIC_BASE 200 | |
93 | |
94 // MANDATORY CALLS | |
95 | |
96 /* Reinitialize filter. The optional argument contains the new | |
97 configuration in form of a af_data_t struct. If the filter does not | |
98 support the new format the struct should be changed and AF_FALSE | |
99 should be returned. If the incoming and outgoing data streams are | |
100 identical the filter can return AF_DETACH. This will remove the | |
101 filter. */ | |
102 #define AF_CONTROL_REINIT 1 + AF_CONTROL_MANDATORY_BASE | |
103 | |
104 // OPTIONAL CALLS | |
105 | |
106 | |
107 // FILTER SPECIFIC CALLS | |
108 | |
109 // Set output rate in resample | |
110 #define AF_CONTROL_RESAMPLE 1 + AF_CONTROL_FILTER_SPECIFIC_BASE | |
111 // Set output format in format | |
112 #define AF_CONTROL_FORMAT 2 + AF_CONTROL_FILTER_SPECIFIC_BASE | |
113 // Set number of output channels in channels | |
114 #define AF_CONTROL_CHANNELS 3 + AF_CONTROL_FILTER_SPECIFIC_BASE | |
115 // Set delay length in delay | |
116 #define AF_CONTROL_SET_DELAY_LEN 4 + AF_CONTROL_FILTER_SPECIFIC_BASE | |
117 /********************************************* | |
118 // Return values | |
119 */ | |
120 | |
121 #define AF_DETACH 2 | |
122 #define AF_OK 1 | |
123 #define AF_TRUE 1 | |
124 #define AF_FALSE 0 | |
125 #define AF_UNKNOWN -1 | |
126 #define AF_ERROR -2 | |
127 #define AF_NA -3 | |
128 | |
129 | |
130 | |
131 // Export functions | |
132 | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
133 /* Initialize the stream "s". This function creates a new fileterlist |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
134 if nessesary according to the values set in input and output. Input |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
135 and output should contain the format of the current movie and the |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
136 formate of the preferred output respectively. The function is |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
137 reentreant i.e. if called wit an already initialized stream the |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
138 stream will be reinitialized. The return value is 0 if sucess and |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
139 -1 if failure */ |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
140 int af_init(af_stream_t* s); |
7568 | 141 // Uninit and remove all filters |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
142 void af_uninit(af_stream_t* s); |
7568 | 143 // Filter data chunk through the filters in the list |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
144 af_data_t* af_play(af_stream_t* s, af_data_t* data); |
7568 | 145 /* Calculate how long the output from the filters will be given the |
7589 | 146 input length "len". The calculated length is >= the actual |
147 length */ | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
148 int af_outputlen(af_stream_t* s, int len); |
7568 | 149 /* Calculate how long the input to the filters should be to produce a |
150 certain output length, i.e. the return value of this function is | |
7589 | 151 the input length required to produce the output length "len". The |
152 calculated length is <= the actual length */ | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
153 int af_inputlen(af_stream_t* s, int len); |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
154 /* Calculate how long the input IN to the filters should be to produce |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
155 a certain output length OUT but with the following three constraints: |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
156 1. IN <= max_insize, where max_insize is the maximum possible input |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
157 block length |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
158 2. OUT <= max_outsize, where max_outsize is the maximum possible |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
159 output block length |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
160 3. If possible OUT >= len. |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
161 Return -1 in case of error */ |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
162 int af_calc_insize_constrained(af_stream_t* s, int len, |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7591
diff
changeset
|
163 int max_outsize,int max_insize); |
7568 | 164 |
165 | |
166 // Helper functions and macros used inside the audio filters | |
167 | |
168 /* Helper function called by the macro with the same name only to be | |
169 called from inside filters */ | |
170 int af_resize_local_buffer(af_instance_t* af, af_data_t* data); | |
171 | |
172 /* Helper function used to calculate the exact buffer length needed | |
7589 | 173 when buffers are resized. The returned length is >= than what is |
174 needed */ | |
175 int af_lencalc(frac_t mul, af_data_t* data); | |
7568 | 176 |
177 /* Memory reallocation macro: if a local buffer is used (i.e. if the | |
178 filter doesn't operate on the incoming buffer this macro must be | |
179 called to ensure the buffer is big enough. */ | |
180 #define RESIZE_LOCAL_BUFFER(a,d)\ | |
7591 | 181 ((a->data->len < af_lencalc(a->mul,d))?af_resize_local_buffer(a,d):AF_OK) |
7568 | 182 |
183 #ifndef min | |
184 #define min(a,b)(((a)>(b))?(b):(a)) | |
185 #endif | |
186 | |
187 #ifndef max | |
188 #define max(a,b)(((a)>(b))?(a):(b)) | |
189 #endif | |
190 | |
191 #endif |