Mercurial > libavcodec.hg
comparison aacenc.c @ 12190:4be87c8091bf libavcodec
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
Patch by Nathan Caldwell <saintdev@gmail.com>
author | alexc |
---|---|
date | Mon, 19 Jul 2010 18:19:53 +0000 |
parents | eb5059b0a051 |
children | 335efeae3bb7 |
comparison
equal
deleted
inserted
replaced
12189:0f0035942790 | 12190:4be87c8091bf |
---|---|
211 | 211 |
212 return 0; | 212 return 0; |
213 } | 213 } |
214 | 214 |
215 static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s, | 215 static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s, |
216 SingleChannelElement *sce, short *audio, int channel) | 216 SingleChannelElement *sce, short *audio) |
217 { | 217 { |
218 int i, j, k; | 218 int i, k; |
219 const int chans = avctx->channels; | |
219 const float * lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024; | 220 const float * lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024; |
220 const float * swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; | 221 const float * swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; |
221 const float * pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; | 222 const float * pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; |
222 | 223 |
223 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { | 224 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
228 s->output[i] = sce->saved[i] * pwindow[i - 448]; | 229 s->output[i] = sce->saved[i] * pwindow[i - 448]; |
229 for (i = 576; i < 704; i++) | 230 for (i = 576; i < 704; i++) |
230 s->output[i] = sce->saved[i]; | 231 s->output[i] = sce->saved[i]; |
231 } | 232 } |
232 if (sce->ics.window_sequence[0] != LONG_START_SEQUENCE) { | 233 if (sce->ics.window_sequence[0] != LONG_START_SEQUENCE) { |
233 for (i = 0, j = channel; i < 1024; i++, j += avctx->channels) { | 234 for (i = 0; i < 1024; i++) { |
234 s->output[i+1024] = audio[j] * lwindow[1024 - i - 1]; | 235 s->output[i+1024] = audio[i * chans] * lwindow[1024 - i - 1]; |
235 sce->saved[i] = audio[j] * lwindow[i]; | 236 sce->saved[i] = audio[i * chans] * lwindow[i]; |
236 } | 237 } |
237 } else { | 238 } else { |
238 for (i = 0, j = channel; i < 448; i++, j += avctx->channels) | 239 for (i = 0; i < 448; i++) |
239 s->output[i+1024] = audio[j]; | 240 s->output[i+1024] = audio[i * chans]; |
240 for (; i < 576; i++, j += avctx->channels) | 241 for (; i < 576; i++) |
241 s->output[i+1024] = audio[j] * swindow[576 - i - 1]; | 242 s->output[i+1024] = audio[i * chans] * swindow[576 - i - 1]; |
242 memset(s->output+1024+576, 0, sizeof(s->output[0]) * 448); | 243 memset(s->output+1024+576, 0, sizeof(s->output[0]) * 448); |
243 for (i = 0, j = channel; i < 1024; i++, j += avctx->channels) | 244 for (i = 0; i < 1024; i++) |
244 sce->saved[i] = audio[j]; | 245 sce->saved[i] = audio[i * chans]; |
245 } | 246 } |
246 ff_mdct_calc(&s->mdct1024, sce->coeffs, s->output); | 247 ff_mdct_calc(&s->mdct1024, sce->coeffs, s->output); |
247 } else { | 248 } else { |
248 for (k = 0; k < 1024; k += 128) { | 249 for (k = 0; k < 1024; k += 128) { |
249 for (i = 448 + k; i < 448 + k + 256; i++) | 250 for (i = 448 + k; i < 448 + k + 256; i++) |
250 s->output[i - 448 - k] = (i < 1024) | 251 s->output[i - 448 - k] = (i < 1024) |
251 ? sce->saved[i] | 252 ? sce->saved[i] |
252 : audio[channel + (i-1024)*avctx->channels]; | 253 : audio[(i-1024)*chans]; |
253 s->dsp.vector_fmul (s->output, k ? swindow : pwindow, 128); | 254 s->dsp.vector_fmul (s->output, k ? swindow : pwindow, 128); |
254 s->dsp.vector_fmul_reverse(s->output+128, s->output+128, swindow, 128); | 255 s->dsp.vector_fmul_reverse(s->output+128, s->output+128, swindow, 128); |
255 ff_mdct_calc(&s->mdct128, sce->coeffs + k, s->output); | 256 ff_mdct_calc(&s->mdct128, sce->coeffs + k, s->output); |
256 } | 257 } |
257 for (i = 0, j = channel; i < 1024; i++, j += avctx->channels) | 258 for (i = 0; i < 1024; i++) |
258 sce->saved[i] = audio[j]; | 259 sce->saved[i] = audio[i * chans]; |
259 } | 260 } |
260 } | 261 } |
261 | 262 |
262 /** | 263 /** |
263 * Encode ics_info element. | 264 * Encode ics_info element. |
541 ics->num_swb = tag == TYPE_LFE ? 12 : s->psy.num_bands[ics->num_windows == 8]; | 542 ics->num_swb = tag == TYPE_LFE ? 12 : s->psy.num_bands[ics->num_windows == 8]; |
542 for (k = 0; k < ics->num_windows; k++) | 543 for (k = 0; k < ics->num_windows; k++) |
543 ics->group_len[k] = wi[j].grouping[k]; | 544 ics->group_len[k] = wi[j].grouping[k]; |
544 | 545 |
545 s->cur_channel = start_ch + j; | 546 s->cur_channel = start_ch + j; |
546 apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2, j); | 547 apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2 + j); |
547 } | 548 } |
548 start_ch += chans; | 549 start_ch += chans; |
549 } | 550 } |
550 do { | 551 do { |
551 int frame_bits; | 552 int frame_bits; |