Mercurial > libavcodec.hg
annotate aacenc.c @ 9077:ad7fd7a40717 libavcodec
Do not read uninitialized buffer, no matter if it will be multiplied by
zero later. This should fix some valgrind warnings and hopefully FATE
ra144 test on ARM.
author | vitor |
---|---|
date | Sun, 01 Mar 2009 11:14:21 +0000 |
parents | e9d9d946f213 |
children | 0dce4fe6e6f3 |
rev | line source |
---|---|
7571 | 1 /* |
2 * AAC encoder | |
3 * Copyright (C) 2008 Konstantin Shishkov | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
7978
diff
changeset
|
23 * @file libavcodec/aacenc.c |
7571 | 24 * AAC encoder |
25 */ | |
26 | |
27 /*********************************** | |
28 * TODOs: | |
29 * psy model selection with some option | |
7584 | 30 * add sane pulse detection |
7681 | 31 * add temporal noise shaping |
7571 | 32 ***********************************/ |
33 | |
34 #include "avcodec.h" | |
35 #include "bitstream.h" | |
36 #include "dsputil.h" | |
37 #include "mpeg4audio.h" | |
38 | |
39 #include "aacpsy.h" | |
40 #include "aac.h" | |
41 #include "aactab.h" | |
42 | |
43 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 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, | |
46 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 | |
47 }; | |
48 | |
49 static const uint8_t swb_size_1024_64[] = { | |
50 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, | |
51 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, | |
52 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 | |
53 }; | |
54 | |
55 static const uint8_t swb_size_1024_48[] = { | |
56 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
57 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
58 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | |
59 96 | |
60 }; | |
61 | |
62 static const uint8_t swb_size_1024_32[] = { | |
63 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
64 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
65 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 | |
66 }; | |
67 | |
68 static const uint8_t swb_size_1024_24[] = { | |
69 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
70 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, | |
71 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 | |
72 }; | |
73 | |
74 static const uint8_t swb_size_1024_16[] = { | |
75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
76 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, | |
77 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 | |
78 }; | |
79 | |
80 static const uint8_t swb_size_1024_8[] = { | |
81 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 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 | |
84 }; | |
85 | |
7978 | 86 static const uint8_t * const swb_size_1024[] = { |
7571 | 87 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_24, swb_size_1024_24, swb_size_1024_16, | |
90 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 | |
91 }; | |
92 | |
93 static const uint8_t swb_size_128_96[] = { | |
94 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 | |
95 }; | |
96 | |
97 static const uint8_t swb_size_128_48[] = { | |
98 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 | |
99 }; | |
100 | |
101 static const uint8_t swb_size_128_24[] = { | |
102 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 | |
103 }; | |
104 | |
105 static const uint8_t swb_size_128_16[] = { | |
106 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 | |
107 }; | |
108 | |
109 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 }; | |
112 | |
7978 | 113 static const uint8_t * const swb_size_128[] = { |
7571 | 114 /* the last entry on the following row is swb_size_128_64 but is a |
115 duplicate of swb_size_128_96 */ | |
116 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_24, swb_size_128_24, swb_size_128_16, | |
119 swb_size_128_16, swb_size_128_16, swb_size_128_8 | |
120 }; | |
121 | |
7596 | 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 | |
7978 | 135 static const uint8_t* const run_value_bits[2] = { |
7596 | 136 run_value_bits_long, run_value_bits_short |
137 }; | |
138 | |
7571 | 139 /** default channel configurations */ |
140 static const uint8_t aac_chan_configs[6][5] = { | |
7585 | 141 {1, TYPE_SCE}, // 1 channel - single channel element |
142 {1, TYPE_CPE}, // 2 channels - channel pair | |
143 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo | |
144 {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 | |
146 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE | |
7571 | 147 }; |
148 | |
149 /** | |
7596 | 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 /** | |
7584 | 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; | |
7605 | 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 | |
7596 | 172 AACPsyContext psy; ///< psychoacoustic model context |
173 int last_frame; | |
7584 | 174 } AACEncContext; |
175 | |
176 /** | |
7571 | 177 * Make AAC audio config object. |
178 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | |
179 */ | |
180 static void put_audio_specific_config(AVCodecContext *avctx) | |
181 { | |
182 PutBitContext pb; | |
183 AACEncContext *s = avctx->priv_data; | |
184 | |
185 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8); | |
186 put_bits(&pb, 5, 2); //object type - AAC-LC | |
187 put_bits(&pb, 4, s->samplerate_index); //sample rate index | |
188 put_bits(&pb, 4, avctx->channels); | |
189 //GASpecificConfig | |
190 put_bits(&pb, 1, 0); //frame length - 1024 samples | |
191 put_bits(&pb, 1, 0); //does not depend on core coder | |
192 put_bits(&pb, 1, 0); //is not extension | |
193 flush_put_bits(&pb); | |
194 } | |
195 | |
196 static av_cold int aac_encode_init(AVCodecContext *avctx) | |
197 { | |
198 AACEncContext *s = avctx->priv_data; | |
199 int i; | |
200 | |
201 avctx->frame_size = 1024; | |
202 | |
203 for(i = 0; i < 16; i++) | |
204 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | |
205 break; | |
206 if(i == 16){ | |
207 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate); | |
208 return -1; | |
209 } | |
210 if(avctx->channels > 6){ | |
211 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); | |
212 return -1; | |
213 } | |
214 s->samplerate_index = i; | |
215 | |
216 dsputil_init(&s->dsp, avctx); | |
217 ff_mdct_init(&s->mdct1024, 11, 0); | |
218 ff_mdct_init(&s->mdct128, 8, 0); | |
7584 | 219 // window init |
220 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
221 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
222 ff_sine_window_init(ff_sine_1024, 1024); | |
223 ff_sine_window_init(ff_sine_128, 128); | |
7571 | 224 |
225 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]); | |
7605 | 227 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, |
228 aac_chan_configs[avctx->channels-1][0], 0, | |
7681 | 229 swb_size_1024[i], ff_aac_num_swb_1024[i], swb_size_128[i], ff_aac_num_swb_128[i]) < 0){ |
7571 | 230 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); |
231 return -1; | |
232 } | |
233 avctx->extradata = av_malloc(2); | |
234 avctx->extradata_size = 2; | |
235 put_audio_specific_config(avctx); | |
236 return 0; | |
237 } | |
238 | |
239 /** | |
240 * Encode ics_info element. | |
241 * @see Table 4.6 (syntax of ics_info) | |
242 */ | |
7681 | 243 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) |
7571 | 244 { |
245 int i; | |
246 | |
247 put_bits(&s->pb, 1, 0); // ics_reserved bit | |
248 put_bits(&s->pb, 2, info->window_sequence[0]); | |
249 put_bits(&s->pb, 1, info->use_kb_window[0]); | |
250 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){ | |
251 put_bits(&s->pb, 6, info->max_sfb); | |
252 put_bits(&s->pb, 1, 0); // no prediction | |
253 }else{ | |
254 put_bits(&s->pb, 4, info->max_sfb); | |
255 for(i = 1; i < info->num_windows; i++) | |
256 put_bits(&s->pb, 1, info->group_len[i]); | |
257 } | |
258 } | |
259 | |
260 /** | |
7681 | 261 * Calculate the number of bits needed to code all coefficient signs in current band. |
262 */ | |
263 static int calculate_band_sign_bits(AACEncContext *s, SingleChannelElement *sce, | |
264 int group_len, int start, int size) | |
265 { | |
266 int bits = 0; | |
267 int i, w; | |
268 for(w = 0; w < group_len; w++){ | |
269 for(i = 0; i < size; i++){ | |
270 if(sce->icoefs[start + i]) | |
271 bits++; | |
272 } | |
273 start += 128; | |
274 } | |
275 return bits; | |
276 } | |
277 | |
278 /** | |
7584 | 279 * Encode pulse data. |
280 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
281 static void encode_pulses(AACEncContext *s, Pulse *pulse) |
7584 | 282 { |
283 int i; | |
284 | |
285 put_bits(&s->pb, 1, !!pulse->num_pulse); | |
286 if(!pulse->num_pulse) return; | |
287 | |
288 put_bits(&s->pb, 2, pulse->num_pulse - 1); | |
289 put_bits(&s->pb, 6, pulse->start); | |
290 for(i = 0; i < pulse->num_pulse; i++){ | |
7585 | 291 put_bits(&s->pb, 5, pulse->pos[i]); |
7584 | 292 put_bits(&s->pb, 4, pulse->amp[i]); |
293 } | |
294 } | |
295 | |
296 /** | |
297 * Encode spectral coefficients processed by psychoacoustic model. | |
298 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
299 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) |
7584 | 300 { |
301 int start, i, w, w2, wg; | |
302 | |
303 w = 0; | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
304 for(wg = 0; wg < sce->ics.num_window_groups; wg++){ |
7584 | 305 start = 0; |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
306 for(i = 0; i < sce->ics.max_sfb; i++){ |
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
307 if(sce->zeroes[w*16 + i]){ |
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
308 start += sce->ics.swb_sizes[i]; |
7584 | 309 continue; |
310 } | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
311 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){ |
7681 | 312 encode_band_coeffs(s, sce, start + w2*128, |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
313 sce->ics.swb_sizes[i], |
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
314 sce->band_type[w*16 + i]); |
7584 | 315 } |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
316 start += sce->ics.swb_sizes[i]; |
7584 | 317 } |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
318 w += sce->ics.group_len[wg]; |
7584 | 319 } |
320 } | |
321 | |
322 /** | |
7571 | 323 * Write some auxiliary information about the created AAC file. |
324 */ | |
325 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, const char *name) | |
326 { | |
327 int i, namelen, padbits; | |
328 | |
329 namelen = strlen(name) + 2; | |
7585 | 330 put_bits(&s->pb, 3, TYPE_FIL); |
7571 | 331 put_bits(&s->pb, 4, FFMIN(namelen, 15)); |
332 if(namelen >= 15) | |
333 put_bits(&s->pb, 8, namelen - 16); | |
334 put_bits(&s->pb, 4, 0); //extension type - filler | |
335 padbits = 8 - (put_bits_count(&s->pb) & 7); | |
336 align_put_bits(&s->pb); | |
337 for(i = 0; i < namelen - 2; i++) | |
338 put_bits(&s->pb, 8, name[i]); | |
339 put_bits(&s->pb, 12 - padbits, 0); | |
340 } | |
341 | |
342 static av_cold int aac_encode_end(AVCodecContext *avctx) | |
343 { | |
344 AACEncContext *s = avctx->priv_data; | |
345 | |
346 ff_mdct_end(&s->mdct1024); | |
347 ff_mdct_end(&s->mdct128); | |
348 ff_aac_psy_end(&s->psy); | |
349 av_freep(&s->samples); | |
350 av_freep(&s->cpe); | |
351 return 0; | |
352 } | |
353 | |
354 AVCodec aac_encoder = { | |
355 "aac", | |
356 CODEC_TYPE_AUDIO, | |
357 CODEC_ID_AAC, | |
358 sizeof(AACEncContext), | |
359 aac_encode_init, | |
360 aac_encode_frame, | |
361 aac_encode_end, | |
362 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | |
363 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, | |
364 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), | |
365 }; |