Mercurial > libavcodec.hg
comparison aacenc.c @ 9935:d09283aeeef8 libavcodec
Merge the AAC encoder from SoC svn. It is still considered experimental.
author | alexc |
---|---|
date | Wed, 08 Jul 2009 20:01:31 +0000 |
parents | 67a20f0eb42c |
children | 7f42ae22c351 |
comparison
equal
deleted
inserted
replaced
9934:ff96ee73b08b | 9935:d09283aeeef8 |
---|---|
24 * AAC encoder | 24 * AAC encoder |
25 */ | 25 */ |
26 | 26 |
27 /*********************************** | 27 /*********************************** |
28 * TODOs: | 28 * TODOs: |
29 * psy model selection with some option | |
30 * add sane pulse detection | 29 * add sane pulse detection |
31 * add temporal noise shaping | 30 * add temporal noise shaping |
32 ***********************************/ | 31 ***********************************/ |
33 | 32 |
34 #include "avcodec.h" | 33 #include "avcodec.h" |
35 #include "get_bits.h" | 34 #include "put_bits.h" |
36 #include "dsputil.h" | 35 #include "dsputil.h" |
37 #include "mpeg4audio.h" | 36 #include "mpeg4audio.h" |
38 | 37 |
39 #include "aacpsy.h" | |
40 #include "aac.h" | 38 #include "aac.h" |
41 #include "aactab.h" | 39 #include "aactab.h" |
40 #include "aacenc.h" | |
41 | |
42 #include "psymodel.h" | |
42 | 43 |
43 static const uint8_t swb_size_1024_96[] = { | 44 static const uint8_t swb_size_1024_96[] = { |
44 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, | 45 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, |
45 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, | 46 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, |
46 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 | 47 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 |
81 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | 82 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, |
82 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, | 83 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, |
83 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 | 84 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 |
84 }; | 85 }; |
85 | 86 |
86 static const uint8_t * const swb_size_1024[] = { | 87 static const uint8_t *swb_size_1024[] = { |
87 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, | 88 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, |
88 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, | 89 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, |
89 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, | 90 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, |
90 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 | 91 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 |
91 }; | 92 }; |
108 | 109 |
109 static const uint8_t swb_size_128_8[] = { | 110 static const uint8_t swb_size_128_8[] = { |
110 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 | 111 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 |
111 }; | 112 }; |
112 | 113 |
113 static const uint8_t * const swb_size_128[] = { | 114 static const uint8_t *swb_size_128[] = { |
114 /* the last entry on the following row is swb_size_128_64 but is a | 115 /* the last entry on the following row is swb_size_128_64 but is a |
115 duplicate of swb_size_128_96 */ | 116 duplicate of swb_size_128_96 */ |
116 swb_size_128_96, swb_size_128_96, swb_size_128_96, | 117 swb_size_128_96, swb_size_128_96, swb_size_128_96, |
117 swb_size_128_48, swb_size_128_48, swb_size_128_48, | 118 swb_size_128_48, swb_size_128_48, swb_size_128_48, |
118 swb_size_128_24, swb_size_128_24, swb_size_128_16, | 119 swb_size_128_24, swb_size_128_24, swb_size_128_16, |
119 swb_size_128_16, swb_size_128_16, swb_size_128_8 | 120 swb_size_128_16, swb_size_128_16, swb_size_128_8 |
120 }; | |
121 | |
122 /** bits needed to code codebook run value for long windows */ | |
123 static const uint8_t run_value_bits_long[64] = { | |
124 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
125 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, | |
126 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
127 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15 | |
128 }; | |
129 | |
130 /** bits needed to code codebook run value for short windows */ | |
131 static const uint8_t run_value_bits_short[16] = { | |
132 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9 | |
133 }; | |
134 | |
135 static const uint8_t* const run_value_bits[2] = { | |
136 run_value_bits_long, run_value_bits_short | |
137 }; | 121 }; |
138 | 122 |
139 /** default channel configurations */ | 123 /** default channel configurations */ |
140 static const uint8_t aac_chan_configs[6][5] = { | 124 static const uint8_t aac_chan_configs[6][5] = { |
141 {1, TYPE_SCE}, // 1 channel - single channel element | 125 {1, TYPE_SCE}, // 1 channel - single channel element |
143 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo | 127 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo |
144 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center | 128 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center |
145 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo | 129 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo |
146 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE | 130 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE |
147 }; | 131 }; |
148 | |
149 /** | |
150 * structure used in optimal codebook search | |
151 */ | |
152 typedef struct BandCodingPath { | |
153 int prev_idx; ///< pointer to the previous path point | |
154 int codebook; ///< codebook for coding band run | |
155 int bits; ///< number of bit needed to code given number of bands | |
156 } BandCodingPath; | |
157 | |
158 /** | |
159 * AAC encoder context | |
160 */ | |
161 typedef struct { | |
162 PutBitContext pb; | |
163 MDCTContext mdct1024; ///< long (1024 samples) frame transform context | |
164 MDCTContext mdct128; ///< short (128 samples) frame transform context | |
165 DSPContext dsp; | |
166 DECLARE_ALIGNED_16(FFTSample, output[2048]); ///< temporary buffer for MDCT input coefficients | |
167 int16_t* samples; ///< saved preprocessed input | |
168 | |
169 int samplerate_index; ///< MPEG-4 samplerate index | |
170 | |
171 ChannelElement *cpe; ///< channel elements | |
172 AACPsyContext psy; ///< psychoacoustic model context | |
173 int last_frame; | |
174 } AACEncContext; | |
175 | 132 |
176 /** | 133 /** |
177 * Make AAC audio config object. | 134 * Make AAC audio config object. |
178 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | 135 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" |
179 */ | 136 */ |
195 | 152 |
196 static av_cold int aac_encode_init(AVCodecContext *avctx) | 153 static av_cold int aac_encode_init(AVCodecContext *avctx) |
197 { | 154 { |
198 AACEncContext *s = avctx->priv_data; | 155 AACEncContext *s = avctx->priv_data; |
199 int i; | 156 int i; |
157 const uint8_t *sizes[2]; | |
158 int lengths[2]; | |
200 | 159 |
201 avctx->frame_size = 1024; | 160 avctx->frame_size = 1024; |
202 | 161 |
203 for(i = 0; i < 16; i++) | 162 for(i = 0; i < 16; i++) |
204 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | 163 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) |
222 ff_sine_window_init(ff_sine_1024, 1024); | 181 ff_sine_window_init(ff_sine_1024, 1024); |
223 ff_sine_window_init(ff_sine_128, 128); | 182 ff_sine_window_init(ff_sine_128, 128); |
224 | 183 |
225 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); | 184 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); |
226 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); | 185 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); |
227 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, | |
228 aac_chan_configs[avctx->channels-1][0], 0, | |
229 swb_size_1024[i], ff_aac_num_swb_1024[i], swb_size_128[i], ff_aac_num_swb_128[i]) < 0){ | |
230 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); | |
231 return -1; | |
232 } | |
233 avctx->extradata = av_malloc(2); | 186 avctx->extradata = av_malloc(2); |
234 avctx->extradata_size = 2; | 187 avctx->extradata_size = 2; |
235 put_audio_specific_config(avctx); | 188 put_audio_specific_config(avctx); |
189 | |
190 sizes[0] = swb_size_1024[i]; | |
191 sizes[1] = swb_size_128[i]; | |
192 lengths[0] = ff_aac_num_swb_1024[i]; | |
193 lengths[1] = ff_aac_num_swb_128[i]; | |
194 ff_psy_init(&s->psy, avctx, 2, sizes, lengths); | |
195 s->psypp = ff_psy_preprocess_init(avctx); | |
196 s->coder = &ff_aac_coders[0]; | |
197 | |
198 s->lambda = avctx->global_quality ? avctx->global_quality : 120; | |
199 #if !CONFIG_HARDCODED_TABLES | |
200 for (i = 0; i < 428; i++) | |
201 ff_aac_pow2sf_tab[i] = pow(2, (i - 200)/4.); | |
202 #endif /* CONFIG_HARDCODED_TABLES */ | |
203 | |
204 if (avctx->channels > 5) | |
205 av_log(avctx, AV_LOG_ERROR, "This encoder does not yet enforce the restrictions on LFEs. " | |
206 "The output will most likely be an illegal bitstream.\n"); | |
207 | |
236 return 0; | 208 return 0; |
209 } | |
210 | |
211 static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s, | |
212 SingleChannelElement *sce, short *audio, int channel) | |
213 { | |
214 int i, j, k; | |
215 const float * lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024; | |
216 const float * swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; | |
217 const float * pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; | |
218 | |
219 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { | |
220 memcpy(s->output, sce->saved, sizeof(float)*1024); | |
221 if(sce->ics.window_sequence[0] == LONG_STOP_SEQUENCE){ | |
222 memset(s->output, 0, sizeof(s->output[0]) * 448); | |
223 for(i = 448; i < 576; i++) | |
224 s->output[i] = sce->saved[i] * pwindow[i - 448]; | |
225 for(i = 576; i < 704; i++) | |
226 s->output[i] = sce->saved[i]; | |
227 } | |
228 if(sce->ics.window_sequence[0] != LONG_START_SEQUENCE){ | |
229 j = channel; | |
230 for (i = 0; i < 1024; i++, j += avctx->channels){ | |
231 s->output[i+1024] = audio[j] * lwindow[1024 - i - 1]; | |
232 sce->saved[i] = audio[j] * lwindow[i]; | |
233 } | |
234 }else{ | |
235 j = channel; | |
236 for(i = 0; i < 448; i++, j += avctx->channels) | |
237 s->output[i+1024] = audio[j]; | |
238 for(i = 448; i < 576; i++, j += avctx->channels) | |
239 s->output[i+1024] = audio[j] * swindow[576 - i - 1]; | |
240 memset(s->output+1024+576, 0, sizeof(s->output[0]) * 448); | |
241 j = channel; | |
242 for(i = 0; i < 1024; i++, j += avctx->channels) | |
243 sce->saved[i] = audio[j]; | |
244 } | |
245 ff_mdct_calc(&s->mdct1024, sce->coeffs, s->output); | |
246 }else{ | |
247 j = channel; | |
248 for (k = 0; k < 1024; k += 128) { | |
249 for(i = 448 + k; i < 448 + k + 256; i++) | |
250 s->output[i - 448 - k] = (i < 1024) | |
251 ? sce->saved[i] | |
252 : audio[channel + (i-1024)*avctx->channels]; | |
253 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 ff_mdct_calc(&s->mdct128, sce->coeffs + k, s->output); | |
256 } | |
257 j = channel; | |
258 for(i = 0; i < 1024; i++, j += avctx->channels) | |
259 sce->saved[i] = audio[j]; | |
260 } | |
237 } | 261 } |
238 | 262 |
239 /** | 263 /** |
240 * Encode ics_info element. | 264 * Encode ics_info element. |
241 * @see Table 4.6 (syntax of ics_info) | 265 * @see Table 4.6 (syntax of ics_info) |
242 */ | 266 */ |
243 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) | 267 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) |
244 { | 268 { |
245 int i; | 269 int w; |
246 | 270 |
247 put_bits(&s->pb, 1, 0); // ics_reserved bit | 271 put_bits(&s->pb, 1, 0); // ics_reserved bit |
248 put_bits(&s->pb, 2, info->window_sequence[0]); | 272 put_bits(&s->pb, 2, info->window_sequence[0]); |
249 put_bits(&s->pb, 1, info->use_kb_window[0]); | 273 put_bits(&s->pb, 1, info->use_kb_window[0]); |
250 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){ | 274 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){ |
251 put_bits(&s->pb, 6, info->max_sfb); | 275 put_bits(&s->pb, 6, info->max_sfb); |
252 put_bits(&s->pb, 1, 0); // no prediction | 276 put_bits(&s->pb, 1, 0); // no prediction |
253 }else{ | 277 }else{ |
254 put_bits(&s->pb, 4, info->max_sfb); | 278 put_bits(&s->pb, 4, info->max_sfb); |
255 for(i = 1; i < info->num_windows; i++) | 279 for(w = 1; w < 8; w++){ |
256 put_bits(&s->pb, 1, info->group_len[i]); | 280 put_bits(&s->pb, 1, !info->group_len[w]); |
257 } | 281 } |
258 } | 282 } |
259 | 283 } |
260 /** | 284 |
261 * Calculate the number of bits needed to code all coefficient signs in current band. | 285 /** |
262 */ | 286 * Encode MS data. |
263 static int calculate_band_sign_bits(AACEncContext *s, SingleChannelElement *sce, | 287 * @see 4.6.8.1 "Joint Coding - M/S Stereo" |
264 int group_len, int start, int size) | 288 */ |
265 { | 289 static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe) |
266 int bits = 0; | 290 { |
267 int i, w; | 291 int i, w; |
268 for(w = 0; w < group_len; w++){ | 292 |
269 for(i = 0; i < size; i++){ | 293 put_bits(pb, 2, cpe->ms_mode); |
270 if(sce->icoefs[start + i]) | 294 if(cpe->ms_mode == 1){ |
271 bits++; | 295 for(w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w]){ |
272 } | 296 for(i = 0; i < cpe->ch[0].ics.max_sfb; i++) |
273 start += 128; | 297 put_bits(pb, 1, cpe->ms_mask[w*16 + i]); |
274 } | 298 } |
275 return bits; | 299 } |
300 } | |
301 | |
302 /** | |
303 * Produce integer coefficients from scalefactors provided by the model. | |
304 */ | |
305 static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, int chans) | |
306 { | |
307 int i, w, w2, g, ch; | |
308 int start, sum, maxsfb, cmaxsfb; | |
309 | |
310 for(ch = 0; ch < chans; ch++){ | |
311 IndividualChannelStream *ics = &cpe->ch[ch].ics; | |
312 start = 0; | |
313 maxsfb = 0; | |
314 cpe->ch[ch].pulse.num_pulse = 0; | |
315 for(w = 0; w < ics->num_windows*16; w += 16){ | |
316 for(g = 0; g < ics->num_swb; g++){ | |
317 sum = 0; | |
318 //apply M/S | |
319 if(!ch && cpe->ms_mask[w + g]){ | |
320 for(i = 0; i < ics->swb_sizes[g]; i++){ | |
321 cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0; | |
322 cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i]; | |
323 } | |
324 } | |
325 start += ics->swb_sizes[g]; | |
326 } | |
327 for(cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--); | |
328 maxsfb = FFMAX(maxsfb, cmaxsfb); | |
329 } | |
330 ics->max_sfb = maxsfb; | |
331 | |
332 //adjust zero bands for window groups | |
333 for(w = 0; w < ics->num_windows; w += ics->group_len[w]){ | |
334 for(g = 0; g < ics->max_sfb; g++){ | |
335 i = 1; | |
336 for(w2 = w; w2 < w + ics->group_len[w]; w2++){ | |
337 if(!cpe->ch[ch].zeroes[w2*16 + g]){ | |
338 i = 0; | |
339 break; | |
340 } | |
341 } | |
342 cpe->ch[ch].zeroes[w*16 + g] = i; | |
343 } | |
344 } | |
345 } | |
346 | |
347 if(chans > 1 && cpe->common_window){ | |
348 IndividualChannelStream *ics0 = &cpe->ch[0].ics; | |
349 IndividualChannelStream *ics1 = &cpe->ch[1].ics; | |
350 int msc = 0; | |
351 ics0->max_sfb = FFMAX(ics0->max_sfb, ics1->max_sfb); | |
352 ics1->max_sfb = ics0->max_sfb; | |
353 for(w = 0; w < ics0->num_windows*16; w += 16) | |
354 for(i = 0; i < ics0->max_sfb; i++) | |
355 if(cpe->ms_mask[w+i]) msc++; | |
356 if(msc == 0 || ics0->max_sfb == 0) cpe->ms_mode = 0; | |
357 else cpe->ms_mode = msc < ics0->max_sfb ? 1 : 2; | |
358 } | |
359 } | |
360 | |
361 /** | |
362 * Encode scalefactor band coding type. | |
363 */ | |
364 static void encode_band_info(AACEncContext *s, SingleChannelElement *sce) | |
365 { | |
366 int w; | |
367 | |
368 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | |
369 s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda); | |
370 } | |
371 } | |
372 | |
373 /** | |
374 * Encode scalefactors. | |
375 */ | |
376 static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce) | |
377 { | |
378 int off = sce->sf_idx[0], diff; | |
379 int i, w; | |
380 | |
381 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | |
382 for(i = 0; i < sce->ics.max_sfb; i++){ | |
383 if(!sce->zeroes[w*16 + i]){ | |
384 diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO; | |
385 if(diff < 0 || diff > 120) av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n"); | |
386 off = sce->sf_idx[w*16 + i]; | |
387 put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]); | |
388 } | |
389 } | |
390 } | |
276 } | 391 } |
277 | 392 |
278 /** | 393 /** |
279 * Encode pulse data. | 394 * Encode pulse data. |
280 */ | 395 */ |
296 /** | 411 /** |
297 * Encode spectral coefficients processed by psychoacoustic model. | 412 * Encode spectral coefficients processed by psychoacoustic model. |
298 */ | 413 */ |
299 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) | 414 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) |
300 { | 415 { |
301 int start, i, w, w2, wg; | 416 int start, i, w, w2; |
302 | 417 |
303 w = 0; | 418 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ |
304 for(wg = 0; wg < sce->ics.num_window_groups; wg++){ | |
305 start = 0; | 419 start = 0; |
306 for(i = 0; i < sce->ics.max_sfb; i++){ | 420 for(i = 0; i < sce->ics.max_sfb; i++){ |
307 if(sce->zeroes[w*16 + i]){ | 421 if(sce->zeroes[w*16 + i]){ |
308 start += sce->ics.swb_sizes[i]; | 422 start += sce->ics.swb_sizes[i]; |
309 continue; | 423 continue; |
310 } | 424 } |
311 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){ | 425 for(w2 = w; w2 < w + sce->ics.group_len[w]; w2++){ |
312 encode_band_coeffs(s, sce, start + w2*128, | 426 s->coder->quantize_and_encode_band(s, &s->pb, sce->coeffs + start + w2*128, |
313 sce->ics.swb_sizes[i], | 427 sce->ics.swb_sizes[i], |
314 sce->band_type[w*16 + i]); | 428 sce->sf_idx[w*16 + i], |
429 sce->band_type[w*16 + i], | |
430 s->lambda); | |
315 } | 431 } |
316 start += sce->ics.swb_sizes[i]; | 432 start += sce->ics.swb_sizes[i]; |
317 } | 433 } |
318 w += sce->ics.group_len[wg]; | 434 } |
319 } | 435 } |
436 | |
437 /** | |
438 * Encode one channel of audio data. | |
439 */ | |
440 static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, int common_window) | |
441 { | |
442 put_bits(&s->pb, 8, sce->sf_idx[0]); | |
443 if(!common_window) put_ics_info(s, &sce->ics); | |
444 encode_band_info(s, sce); | |
445 encode_scale_factors(avctx, s, sce); | |
446 encode_pulses(s, &sce->pulse); | |
447 put_bits(&s->pb, 1, 0); //tns | |
448 put_bits(&s->pb, 1, 0); //ssr | |
449 encode_spectral_coeffs(s, sce); | |
450 return 0; | |
320 } | 451 } |
321 | 452 |
322 /** | 453 /** |
323 * Write some auxiliary information about the created AAC file. | 454 * Write some auxiliary information about the created AAC file. |
324 */ | 455 */ |
337 for(i = 0; i < namelen - 2; i++) | 468 for(i = 0; i < namelen - 2; i++) |
338 put_bits(&s->pb, 8, name[i]); | 469 put_bits(&s->pb, 8, name[i]); |
339 put_bits(&s->pb, 12 - padbits, 0); | 470 put_bits(&s->pb, 12 - padbits, 0); |
340 } | 471 } |
341 | 472 |
473 static int aac_encode_frame(AVCodecContext *avctx, | |
474 uint8_t *frame, int buf_size, void *data) | |
475 { | |
476 AACEncContext *s = avctx->priv_data; | |
477 int16_t *samples = s->samples, *samples2, *la; | |
478 ChannelElement *cpe; | |
479 int i, j, chans, tag, start_ch; | |
480 const uint8_t *chan_map = aac_chan_configs[avctx->channels-1]; | |
481 int chan_el_counter[4]; | |
482 | |
483 if(s->last_frame) | |
484 return 0; | |
485 if(data){ | |
486 if(!s->psypp){ | |
487 memcpy(s->samples + 1024 * avctx->channels, data, 1024 * avctx->channels * sizeof(s->samples[0])); | |
488 }else{ | |
489 start_ch = 0; | |
490 samples2 = s->samples + 1024 * avctx->channels; | |
491 for(i = 0; i < chan_map[0]; i++){ | |
492 tag = chan_map[i+1]; | |
493 chans = tag == TYPE_CPE ? 2 : 1; | |
494 ff_psy_preprocess(s->psypp, (uint16_t*)data + start_ch, samples2 + start_ch, start_ch, chans); | |
495 start_ch += chans; | |
496 } | |
497 } | |
498 } | |
499 if(!avctx->frame_number){ | |
500 memcpy(s->samples, s->samples + 1024 * avctx->channels, 1024 * avctx->channels * sizeof(s->samples[0])); | |
501 return 0; | |
502 } | |
503 | |
504 init_put_bits(&s->pb, frame, buf_size*8); | |
505 if((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)){ | |
506 put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | |
507 } | |
508 start_ch = 0; | |
509 memset(chan_el_counter, 0, sizeof(chan_el_counter)); | |
510 for(i = 0; i < chan_map[0]; i++){ | |
511 FFPsyWindowInfo wi[2]; | |
512 tag = chan_map[i+1]; | |
513 chans = tag == TYPE_CPE ? 2 : 1; | |
514 cpe = &s->cpe[i]; | |
515 samples2 = samples + start_ch; | |
516 la = samples2 + 1024 * avctx->channels + start_ch; | |
517 if(!data) la = NULL; | |
518 for(j = 0; j < chans; j++){ | |
519 IndividualChannelStream *ics = &cpe->ch[j].ics; | |
520 int k; | |
521 wi[j] = ff_psy_suggest_window(&s->psy, samples2, la, start_ch + j, ics->window_sequence[0]); | |
522 ics->window_sequence[1] = ics->window_sequence[0]; | |
523 ics->window_sequence[0] = wi[j].window_type[0]; | |
524 ics->use_kb_window[1] = ics->use_kb_window[0]; | |
525 ics->use_kb_window[0] = wi[j].window_shape; | |
526 ics->num_windows = wi[j].num_windows; | |
527 ics->swb_sizes = s->psy.bands [ics->num_windows == 8]; | |
528 ics->num_swb = s->psy.num_bands[ics->num_windows == 8]; | |
529 for(k = 0; k < ics->num_windows; k++) | |
530 ics->group_len[k] = wi[j].grouping[k]; | |
531 | |
532 s->cur_channel = start_ch + j; | |
533 apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2, j); | |
534 s->coder->search_for_quantizers(avctx, s, &cpe->ch[j], s->lambda); | |
535 } | |
536 cpe->common_window = 0; | |
537 if(chans > 1 | |
538 && wi[0].window_type[0] == wi[1].window_type[0] | |
539 && wi[0].window_shape == wi[1].window_shape){ | |
540 | |
541 cpe->common_window = 1; | |
542 for(j = 0; j < wi[0].num_windows; j++){ | |
543 if(wi[0].grouping[j] != wi[1].grouping[j]){ | |
544 cpe->common_window = 0; | |
545 break; | |
546 } | |
547 } | |
548 } | |
549 if(cpe->common_window && s->coder->search_for_ms) | |
550 s->coder->search_for_ms(s, cpe, s->lambda); | |
551 adjust_frame_information(s, cpe, chans); | |
552 put_bits(&s->pb, 3, tag); | |
553 put_bits(&s->pb, 4, chan_el_counter[tag]++); | |
554 if(chans == 2){ | |
555 put_bits(&s->pb, 1, cpe->common_window); | |
556 if(cpe->common_window){ | |
557 put_ics_info(s, &cpe->ch[0].ics); | |
558 encode_ms_info(&s->pb, cpe); | |
559 } | |
560 } | |
561 for(j = 0; j < chans; j++){ | |
562 s->cur_channel = start_ch + j; | |
563 ff_psy_set_band_info(&s->psy, s->cur_channel, cpe->ch[j].coeffs, &wi[j]); | |
564 encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); | |
565 } | |
566 start_ch += chans; | |
567 } | |
568 | |
569 put_bits(&s->pb, 3, TYPE_END); | |
570 flush_put_bits(&s->pb); | |
571 avctx->frame_bits = put_bits_count(&s->pb); | |
572 | |
573 // rate control stuff | |
574 if(!(avctx->flags & CODEC_FLAG_QSCALE)){ | |
575 float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits; | |
576 s->lambda *= ratio; | |
577 } | |
578 | |
579 if (avctx->frame_bits > 6144*avctx->channels) { | |
580 av_log(avctx, AV_LOG_ERROR, "input buffer violation %d > %d.\n", avctx->frame_bits, 6144*avctx->channels); | |
581 } | |
582 | |
583 if(!data) | |
584 s->last_frame = 1; | |
585 memcpy(s->samples, s->samples + 1024 * avctx->channels, 1024 * avctx->channels * sizeof(s->samples[0])); | |
586 return put_bits_count(&s->pb)>>3; | |
587 } | |
588 | |
342 static av_cold int aac_encode_end(AVCodecContext *avctx) | 589 static av_cold int aac_encode_end(AVCodecContext *avctx) |
343 { | 590 { |
344 AACEncContext *s = avctx->priv_data; | 591 AACEncContext *s = avctx->priv_data; |
345 | 592 |
346 ff_mdct_end(&s->mdct1024); | 593 ff_mdct_end(&s->mdct1024); |
347 ff_mdct_end(&s->mdct128); | 594 ff_mdct_end(&s->mdct128); |
348 ff_aac_psy_end(&s->psy); | 595 ff_psy_end(&s->psy); |
596 ff_psy_preprocess_end(s->psypp); | |
349 av_freep(&s->samples); | 597 av_freep(&s->samples); |
350 av_freep(&s->cpe); | 598 av_freep(&s->cpe); |
351 return 0; | 599 return 0; |
352 } | 600 } |
353 | 601 |