annotate resample.c @ 625:bb6a69f9d409 libavcodec

slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG) per context DCT selection
author michaelni
date Thu, 29 Aug 2002 23:55:32 +0000
parents 718a22dc121f
children f40723ee806d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * Sample rate convertion for both audio and video
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
3 * Copyright (c) 2000 Fabrice Bellard.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
8 * version 2 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
10 * This library is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
13 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 */
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
19 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 typedef struct {
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 /* fractional resampling */
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 UINT32 incr; /* fractional increment */
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 UINT32 frac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 int last_sample;
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 /* integer down sample */
986e461dc072 Initial revision
glantau
parents:
diff changeset
27 int iratio; /* integer divison ratio */
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 int icount, isum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
29 int inv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 } ReSampleChannelContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
31
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 struct ReSampleContext {
986e461dc072 Initial revision
glantau
parents:
diff changeset
33 ReSampleChannelContext channel_ctx[2];
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 float ratio;
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 /* channel convert */
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 int input_channels, output_channels, filter_channels;
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
38
986e461dc072 Initial revision
glantau
parents:
diff changeset
39
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #define FRAC_BITS 16
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #define FRAC (1 << FRAC_BITS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
42
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 static void init_mono_resample(ReSampleChannelContext *s, float ratio)
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 ratio = 1.0 / ratio;
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 s->iratio = (int)floor(ratio);
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 if (s->iratio == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 s->iratio = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 s->incr = (int)((ratio / s->iratio) * FRAC);
373
3007abcbc510 * Fix a problem with the first sample when down sampling.
philipjsg
parents: 64
diff changeset
50 s->frac = FRAC;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 s->last_sample = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 s->icount = s->iratio;
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 s->isum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 s->inv = (FRAC / s->iratio);
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
56
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 /* fractional audio resampling */
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 static int fractional_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 unsigned int frac, incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 int l0, l1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 short *q, *p, *pend;
986e461dc072 Initial revision
glantau
parents:
diff changeset
63
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 l0 = s->last_sample;
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 incr = s->incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 frac = s->frac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
67
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 p = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 pend = input + nb_samples;
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 q = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
71
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 l1 = *p++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 for(;;) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 /* interpolate */
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 *q++ = (l0 * (FRAC - frac) + l1 * frac) >> FRAC_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 frac = frac + s->incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 while (frac >= FRAC) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 if (p >= pend)
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 goto the_end;
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 frac -= FRAC;
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 l0 = l1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 l1 = *p++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 the_end:
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 s->last_sample = l1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 s->frac = frac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 return q - output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
90
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 static int integer_downsample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 short *q, *p, *pend;
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 int c, sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
95
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 p = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 pend = input + nb_samples;
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 q = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
99
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 c = s->icount;
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 sum = s->isum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
102
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 for(;;) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 sum += *p++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 if (--c == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 *q++ = (sum * s->inv) >> FRAC_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 c = s->iratio;
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 if (p >= pend)
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 s->isum = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 s->icount = c;
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 return q - output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
117
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 /* n1: number of samples */
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 static void stereo_to_mono(short *output, short *input, int n1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 short *p, *q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 int n = n1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
123
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 p = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 q = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 while (n >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 q[0] = (p[0] + p[1]) >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 q[1] = (p[2] + p[3]) >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 q[2] = (p[4] + p[5]) >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 q[3] = (p[6] + p[7]) >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 q += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 p += 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 n -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 while (n > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 q[0] = (p[0] + p[1]) >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 q++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 p += 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 n--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
142
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 /* n1: number of samples */
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 static void mono_to_stereo(short *output, short *input, int n1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 short *p, *q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 int n = n1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 int v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
149
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 p = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 q = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 while (n >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 v = p[0]; q[0] = v; q[1] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 v = p[1]; q[2] = v; q[3] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 v = p[2]; q[4] = v; q[5] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 v = p[3]; q[6] = v; q[7] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 q += 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 p += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 n -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 while (n > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 v = p[0]; q[0] = v; q[1] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 q += 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 p += 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 n--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
168
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 /* XXX: should use more abstract 'N' channels system */
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 static void stereo_split(short *output1, short *output2, short *input, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
173
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 for(i=0;i<n;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 *output1++ = *input++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 *output2++ = *input++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
179
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 static void stereo_mux(short *output, short *input1, short *input2, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
183
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 for(i=0;i<n;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 *output++ = *input1++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 *output++ = *input2++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
189
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 static int mono_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 {
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
192 short *buf1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 short *buftmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
194
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
195 buf1= (short*)av_malloc( nb_samples * sizeof(short) );
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
196
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 /* first downsample by an integer factor with averaging filter */
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 if (s->iratio > 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 buftmp = buf1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 nb_samples = integer_downsample(s, buftmp, input, nb_samples);
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 buftmp = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
204
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 /* then do a fractional resampling with linear interpolation */
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 if (s->incr != FRAC) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 nb_samples = fractional_resample(s, output, buftmp, nb_samples);
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 memcpy(output, buftmp, nb_samples * sizeof(short));
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 }
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
211 av_free(buf1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 return nb_samples;
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
214
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 ReSampleContext *audio_resample_init(int output_channels, int input_channels,
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 int output_rate, int input_rate)
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 ReSampleContext *s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
220
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 if (output_channels > 2 || input_channels > 2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 return NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
223
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 s = av_mallocz(sizeof(ReSampleContext));
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 if (!s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 return NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
227
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 s->ratio = (float)output_rate / (float)input_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
229
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 s->input_channels = input_channels;
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 s->output_channels = output_channels;
986e461dc072 Initial revision
glantau
parents:
diff changeset
232
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 s->filter_channels = s->input_channels;
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 if (s->output_channels < s->filter_channels)
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 s->filter_channels = s->output_channels;
986e461dc072 Initial revision
glantau
parents:
diff changeset
236
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 for(i=0;i<s->filter_channels;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 init_mono_resample(&s->channel_ctx[i], s->ratio);
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 return s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
242
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 /* resample audio. 'nb_samples' is the number of input samples */
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 /* XXX: optimize it ! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 /* XXX: do it with polyphase filters, since the quality here is
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 HORRIBLE. Return the number of samples available in output */
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples)
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 int i, nb_samples1;
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
250 short *bufin[2];
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
251 short *bufout[2];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 short *buftmp2[2], *buftmp3[2];
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
253 int lenout;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
254
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 if (s->input_channels == s->output_channels && s->ratio == 1.0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 /* nothing to do */
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 memcpy(output, input, nb_samples * s->input_channels * sizeof(short));
986e461dc072 Initial revision
glantau
parents:
diff changeset
258 return nb_samples;
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
260
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
261 /* XXX: move those malloc to resample init code */
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
262 bufin[0]= (short*) av_malloc( nb_samples * sizeof(short) );
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
263 bufin[1]= (short*) av_malloc( nb_samples * sizeof(short) );
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
264
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
265 /* make some zoom to avoid round pb */
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
266 lenout= (int)(nb_samples * s->ratio) + 16;
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
267 bufout[0]= (short*) av_malloc( lenout * sizeof(short) );
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
268 bufout[1]= (short*) av_malloc( lenout * sizeof(short) );
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
269
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 if (s->input_channels == 2 &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 s->output_channels == 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 buftmp2[0] = bufin[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 buftmp3[0] = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 stereo_to_mono(buftmp2[0], input, nb_samples);
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 } else if (s->output_channels == 2 && s->input_channels == 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
276 buftmp2[0] = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
277 buftmp3[0] = bufout[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 } else if (s->output_channels == 2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 buftmp2[0] = bufin[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 buftmp2[1] = bufin[1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 buftmp3[0] = bufout[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 buftmp3[1] = bufout[1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 stereo_split(buftmp2[0], buftmp2[1], input, nb_samples);
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 buftmp2[0] = input;
986e461dc072 Initial revision
glantau
parents:
diff changeset
286 buftmp3[0] = output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
288
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 /* resample each channel */
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 nb_samples1 = 0; /* avoid warning */
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 for(i=0;i<s->filter_channels;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 nb_samples1 = mono_resample(&s->channel_ctx[i], buftmp3[i], buftmp2[i], nb_samples);
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
294
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 if (s->output_channels == 2 && s->input_channels == 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 mono_to_stereo(output, buftmp3[0], nb_samples1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 } else if (s->output_channels == 2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 stereo_mux(output, buftmp3[0], buftmp3[1], nb_samples1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
300
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
301 av_free(bufin[0]);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
302 av_free(bufin[1]);
64
5aa6292a1660 win32 fixes
glantau
parents: 0
diff changeset
303
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
304 av_free(bufout[0]);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
305 av_free(bufout[1]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 return nb_samples1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
308
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 void audio_resample_close(ReSampleContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 373
diff changeset
311 av_free(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
312 }