Mercurial > libavcodec.hg
comparison aacenc.c @ 7571:58f6bb760994 libavcodec
Okayed parts of AAC encoder
author | kostya |
---|---|
date | Thu, 14 Aug 2008 05:52:29 +0000 |
parents | |
children | 27ee0ceab150 |
comparison
equal
deleted
inserted
replaced
7570:bb32f8a4c0f9 | 7571:58f6bb760994 |
---|---|
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 /** | |
23 * @file aacenc.c | |
24 * AAC encoder | |
25 */ | |
26 | |
27 /*********************************** | |
28 * TODOs: | |
29 * psy model selection with some option | |
30 * change greedy codebook search into something more optimal, like Viterbi algorithm | |
31 * determine run lengths along with codebook | |
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 | |
86 static const uint8_t *swb_size_1024[] = { | |
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 | |
113 static const uint8_t *swb_size_128[] = { | |
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 | |
122 #define CB_UNSIGNED 0x01 ///< coefficients are coded as absolute values | |
123 #define CB_PAIRS 0x02 ///< coefficients are grouped into pairs before coding (quads by default) | |
124 #define CB_ESCAPE 0x04 ///< codebook allows escapes | |
125 | |
126 /** spectral coefficients codebook information */ | |
127 static const struct { | |
128 int16_t maxval; ///< maximum possible value | |
129 int8_t cb_num; ///< codebook number | |
130 uint8_t flags; ///< codebook features | |
131 } aac_cb_info[] = { | |
132 { 0, -1, CB_UNSIGNED }, // zero codebook | |
133 { 1, 0, 0 }, | |
134 { 1, 1, 0 }, | |
135 { 2, 2, CB_UNSIGNED }, | |
136 { 2, 3, CB_UNSIGNED }, | |
137 { 4, 4, CB_PAIRS }, | |
138 { 4, 5, CB_PAIRS }, | |
139 { 7, 6, CB_PAIRS | CB_UNSIGNED }, | |
140 { 7, 7, CB_PAIRS | CB_UNSIGNED }, | |
141 { 12, 8, CB_PAIRS | CB_UNSIGNED }, | |
142 { 12, 9, CB_PAIRS | CB_UNSIGNED }, | |
143 { 8191, 10, CB_PAIRS | CB_UNSIGNED | CB_ESCAPE }, | |
144 { -1, -1, 0 }, // reserved | |
145 { -1, -1, 0 }, // perceptual noise substitution | |
146 { -1, -1, 0 }, // intensity out-of-phase | |
147 { -1, -1, 0 }, // intensity in-phase | |
148 }; | |
149 | |
150 /** default channel configurations */ | |
151 static const uint8_t aac_chan_configs[6][5] = { | |
152 {1, ID_SCE}, // 1 channel - single channel element | |
153 {1, ID_CPE}, // 2 channels - channel pair | |
154 {2, ID_SCE, ID_CPE}, // 3 channels - center + stereo | |
155 {3, ID_SCE, ID_CPE, ID_SCE}, // 4 channels - front center + stereo + back center | |
156 {3, ID_SCE, ID_CPE, ID_CPE}, // 5 channels - front center + stereo + back stereo | |
157 {4, ID_SCE, ID_CPE, ID_CPE, ID_LFE}, // 6 channels - front center + stereo + back stereo + LFE | |
158 }; | |
159 | |
160 /** | |
161 * AAC encoder context | |
162 */ | |
163 typedef struct { | |
164 PutBitContext pb; | |
165 MDCTContext mdct1024; ///< long (1024 samples) frame transform context | |
166 MDCTContext mdct128; ///< short (128 samples) frame transform context | |
167 DSPContext dsp; | |
168 DECLARE_ALIGNED_16(FFTSample, output[2048]); ///< temporary buffer for MDCT input coefficients | |
169 DECLARE_ALIGNED_16(FFTSample, tmp[1024]); ///< temporary buffer used by MDCT | |
170 int16_t* samples; ///< saved preprocessed input | |
171 | |
172 int samplerate_index; ///< MPEG-4 samplerate index | |
173 const uint8_t *swb_sizes1024; ///< scalefactor band sizes for long frame | |
174 int swb_num1024; ///< number of scalefactor bands for long frame | |
175 const uint8_t *swb_sizes128; ///< scalefactor band sizes for short frame | |
176 int swb_num128; ///< number of scalefactor bands for short frame | |
177 | |
178 ChannelElement *cpe; ///< channel elements | |
179 AACPsyContext psy; ///< psychoacoustic model context | |
180 int last_frame; | |
181 } AACEncContext; | |
182 | |
183 /** | |
184 * Make AAC audio config object. | |
185 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | |
186 */ | |
187 static void put_audio_specific_config(AVCodecContext *avctx) | |
188 { | |
189 PutBitContext pb; | |
190 AACEncContext *s = avctx->priv_data; | |
191 | |
192 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8); | |
193 put_bits(&pb, 5, 2); //object type - AAC-LC | |
194 put_bits(&pb, 4, s->samplerate_index); //sample rate index | |
195 put_bits(&pb, 4, avctx->channels); | |
196 //GASpecificConfig | |
197 put_bits(&pb, 1, 0); //frame length - 1024 samples | |
198 put_bits(&pb, 1, 0); //does not depend on core coder | |
199 put_bits(&pb, 1, 0); //is not extension | |
200 flush_put_bits(&pb); | |
201 } | |
202 | |
203 static av_cold int aac_encode_init(AVCodecContext *avctx) | |
204 { | |
205 AACEncContext *s = avctx->priv_data; | |
206 int i; | |
207 | |
208 avctx->frame_size = 1024; | |
209 | |
210 for(i = 0; i < 16; i++) | |
211 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | |
212 break; | |
213 if(i == 16){ | |
214 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate); | |
215 return -1; | |
216 } | |
217 if(avctx->channels > 6){ | |
218 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); | |
219 return -1; | |
220 } | |
221 s->samplerate_index = i; | |
222 s->swb_sizes1024 = swb_size_1024[i]; | |
223 s->swb_num1024 = ff_aac_num_swb_1024[i]; | |
224 s->swb_sizes128 = swb_size_128[i]; | |
225 s->swb_num128 = ff_aac_num_swb_128[i]; | |
226 | |
227 dsputil_init(&s->dsp, avctx); | |
228 ff_mdct_init(&s->mdct1024, 11, 0); | |
229 ff_mdct_init(&s->mdct128, 8, 0); | |
230 // window init | |
231 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
232 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
233 ff_sine_window_init(ff_aac_sine_long_1024, 1024); | |
234 ff_sine_window_init(ff_aac_sine_short_128, 128); | |
235 | |
236 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); | |
237 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); | |
238 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, aac_chan_configs[avctx->channels-1][0], 0, s->swb_sizes1024, s->swb_num1024, s->swb_sizes128, s->swb_num128) < 0){ | |
239 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); | |
240 return -1; | |
241 } | |
242 avctx->extradata = av_malloc(2); | |
243 avctx->extradata_size = 2; | |
244 put_audio_specific_config(avctx); | |
245 return 0; | |
246 } | |
247 | |
248 /** | |
249 * Encode ics_info element. | |
250 * @see Table 4.6 (syntax of ics_info) | |
251 */ | |
252 static void put_ics_info(AVCodecContext *avctx, IndividualChannelStream *info) | |
253 { | |
254 AACEncContext *s = avctx->priv_data; | |
255 int i; | |
256 | |
257 put_bits(&s->pb, 1, 0); // ics_reserved bit | |
258 put_bits(&s->pb, 2, info->window_sequence[0]); | |
259 put_bits(&s->pb, 1, info->use_kb_window[0]); | |
260 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){ | |
261 put_bits(&s->pb, 6, info->max_sfb); | |
262 put_bits(&s->pb, 1, 0); // no prediction | |
263 }else{ | |
264 put_bits(&s->pb, 4, info->max_sfb); | |
265 for(i = 1; i < info->num_windows; i++) | |
266 put_bits(&s->pb, 1, info->group_len[i]); | |
267 } | |
268 } | |
269 | |
270 /** | |
271 * Write some auxiliary information about the created AAC file. | |
272 */ | |
273 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, const char *name) | |
274 { | |
275 int i, namelen, padbits; | |
276 | |
277 namelen = strlen(name) + 2; | |
278 put_bits(&s->pb, 3, ID_FIL); | |
279 put_bits(&s->pb, 4, FFMIN(namelen, 15)); | |
280 if(namelen >= 15) | |
281 put_bits(&s->pb, 8, namelen - 16); | |
282 put_bits(&s->pb, 4, 0); //extension type - filler | |
283 padbits = 8 - (put_bits_count(&s->pb) & 7); | |
284 align_put_bits(&s->pb); | |
285 for(i = 0; i < namelen - 2; i++) | |
286 put_bits(&s->pb, 8, name[i]); | |
287 put_bits(&s->pb, 12 - padbits, 0); | |
288 } | |
289 | |
290 static av_cold int aac_encode_end(AVCodecContext *avctx) | |
291 { | |
292 AACEncContext *s = avctx->priv_data; | |
293 | |
294 ff_mdct_end(&s->mdct1024); | |
295 ff_mdct_end(&s->mdct128); | |
296 ff_aac_psy_end(&s->psy); | |
297 av_freep(&s->samples); | |
298 av_freep(&s->cpe); | |
299 return 0; | |
300 } | |
301 | |
302 AVCodec aac_encoder = { | |
303 "aac", | |
304 CODEC_TYPE_AUDIO, | |
305 CODEC_ID_AAC, | |
306 sizeof(AACEncContext), | |
307 aac_encode_init, | |
308 aac_encode_frame, | |
309 aac_encode_end, | |
310 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | |
311 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, | |
312 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), | |
313 }; |