3 * Copyright (C) 2008 Konstantin Shishkov
5 * This file is part of FFmpeg.
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.
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.
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
27 /***********************************
29 * psy model selection with some option
30 * add sane pulse detection
31 ***********************************/
34 #include "bitstream.h"
36 #include "mpeg4audio.h"
42 static const uint8_t swb_size_1024_96[] = {
43 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
44 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44,
45 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
48 static const uint8_t swb_size_1024_64[] = {
49 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8,
50 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36,
51 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
54 static const uint8_t swb_size_1024_48[] = {
55 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
56 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
57 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
61 static const uint8_t swb_size_1024_32[] = {
62 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
63 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
64 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
67 static const uint8_t swb_size_1024_24[] = {
68 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
69 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28,
70 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64
73 static const uint8_t swb_size_1024_16[] = {
74 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28,
76 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
79 static const uint8_t swb_size_1024_8[] = {
80 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
81 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28,
82 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80
85 static const uint8_t *swb_size_1024[] = {
86 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64,
87 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32,
88 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16,
89 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8
92 static const uint8_t swb_size_128_96[] = {
93 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36
96 static const uint8_t swb_size_128_48[] = {
97 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16
100 static const uint8_t swb_size_128_24[] = {
101 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20
104 static const uint8_t swb_size_128_16[] = {
105 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
108 static const uint8_t swb_size_128_8[] = {
109 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20
112 static const uint8_t *swb_size_128[] = {
113 /* the last entry on the following row is swb_size_128_64 but is a
114 duplicate of swb_size_128_96 */
115 swb_size_128_96, swb_size_128_96, swb_size_128_96,
116 swb_size_128_48, swb_size_128_48, swb_size_128_48,
117 swb_size_128_24, swb_size_128_24, swb_size_128_16,
118 swb_size_128_16, swb_size_128_16, swb_size_128_8
121 /** bits needed to code codebook run value for long windows */
122 static const uint8_t run_value_bits_long[64] = {
123 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
124 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
125 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
126 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
129 /** bits needed to code codebook run value for short windows */
130 static const uint8_t run_value_bits_short[16] = {
131 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
134 static const uint8_t* run_value_bits[2] = {
135 run_value_bits_long, run_value_bits_short
138 /** default channel configurations */
139 static const uint8_t aac_chan_configs[6][5] = {
140 {1, TYPE_SCE}, // 1 channel - single channel element
141 {1, TYPE_CPE}, // 2 channels - channel pair
142 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo
143 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center
144 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo
145 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE
149 * structure used in optimal codebook search
151 typedef struct BandCodingPath {
152 int prev_idx; ///< pointer to the previous path point
153 int codebook; ///< codebook for coding band run
154 int bits; ///< number of bit needed to code given number of bands
158 * AAC encoder context
162 MDCTContext mdct1024; ///< long (1024 samples) frame transform context
163 MDCTContext mdct128; ///< short (128 samples) frame transform context
165 DECLARE_ALIGNED_16(FFTSample, output[2048]); ///< temporary buffer for MDCT input coefficients
166 int16_t* samples; ///< saved preprocessed input
168 int samplerate_index; ///< MPEG-4 samplerate index
170 ChannelElement *cpe; ///< channel elements
171 AACPsyContext psy; ///< psychoacoustic model context
176 * Make AAC audio config object.
177 * @see 1.6.2.1 "Syntax - AudioSpecificConfig"
179 static void put_audio_specific_config(AVCodecContext *avctx)
182 AACEncContext *s = avctx->priv_data;
184 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8);
185 put_bits(&pb, 5, 2); //object type - AAC-LC
186 put_bits(&pb, 4, s->samplerate_index); //sample rate index
187 put_bits(&pb, 4, avctx->channels);
189 put_bits(&pb, 1, 0); //frame length - 1024 samples
190 put_bits(&pb, 1, 0); //does not depend on core coder
191 put_bits(&pb, 1, 0); //is not extension
195 static av_cold int aac_encode_init(AVCodecContext *avctx)
197 AACEncContext *s = avctx->priv_data;
200 avctx->frame_size = 1024;
202 for(i = 0; i < 16; i++)
203 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i])
206 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate);
209 if(avctx->channels > 6){
210 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels);
213 s->samplerate_index = i;
214 s->swb_sizes1024 = swb_size_1024[i];
215 s->swb_num1024 = ff_aac_num_swb_1024[i];
216 s->swb_sizes128 = swb_size_128[i];
217 s->swb_num128 = ff_aac_num_swb_128[i];
219 dsputil_init(&s->dsp, avctx);
220 ff_mdct_init(&s->mdct1024, 11, 0);
221 ff_mdct_init(&s->mdct128, 8, 0);
223 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
224 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
225 ff_sine_window_init(ff_sine_1024, 1024);
226 ff_sine_window_init(ff_sine_128, 128);
228 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0]));
229 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]);
230 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP,
231 aac_chan_configs[avctx->channels-1][0], 0,
232 s->swb_sizes1024, s->swb_num1024, s->swb_sizes128, s->swb_num128) < 0){
233 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n");
236 avctx->extradata = av_malloc(2);
237 avctx->extradata_size = 2;
238 put_audio_specific_config(avctx);
243 * Encode ics_info element.
244 * @see Table 4.6 (syntax of ics_info)
246 static void put_ics_info(AVCodecContext *avctx, IndividualChannelStream *info)
248 AACEncContext *s = avctx->priv_data;
251 put_bits(&s->pb, 1, 0); // ics_reserved bit
252 put_bits(&s->pb, 2, info->window_sequence[0]);
253 put_bits(&s->pb, 1, info->use_kb_window[0]);
254 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){
255 put_bits(&s->pb, 6, info->max_sfb);
256 put_bits(&s->pb, 1, 0); // no prediction
258 put_bits(&s->pb, 4, info->max_sfb);
259 for(i = 1; i < info->num_windows; i++)
260 put_bits(&s->pb, 1, info->group_len[i]);
267 static void encode_pulses(AACEncContext *s, Pulse *pulse)
271 put_bits(&s->pb, 1, !!pulse->num_pulse);
272 if(!pulse->num_pulse) return;
274 put_bits(&s->pb, 2, pulse->num_pulse - 1);
275 put_bits(&s->pb, 6, pulse->start);
276 for(i = 0; i < pulse->num_pulse; i++){
277 put_bits(&s->pb, 5, pulse->pos[i]);
278 put_bits(&s->pb, 4, pulse->amp[i]);
283 * Encode spectral coefficients processed by psychoacoustic model.
285 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
287 int start, i, w, w2, wg;
290 for(wg = 0; wg < sce->ics.num_window_groups; wg++){
292 for(i = 0; i < sce->ics.max_sfb; i++){
293 if(sce->zeroes[w*16 + i]){
294 start += sce->ics.swb_sizes[i];
297 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){
298 encode_band_coeffs(s, cpe, channel, start + w2*128,
299 sce->ics.swb_sizes[i],
300 sce->band_type[w*16 + i]);
302 start += sce->ics.swb_sizes[i];
304 w += sce->ics.group_len[wg];
309 * Write some auxiliary information about the created AAC file.
311 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, const char *name)
313 int i, namelen, padbits;
315 namelen = strlen(name) + 2;
316 put_bits(&s->pb, 3, TYPE_FIL);
317 put_bits(&s->pb, 4, FFMIN(namelen, 15));
319 put_bits(&s->pb, 8, namelen - 16);
320 put_bits(&s->pb, 4, 0); //extension type - filler
321 padbits = 8 - (put_bits_count(&s->pb) & 7);
322 align_put_bits(&s->pb);
323 for(i = 0; i < namelen - 2; i++)
324 put_bits(&s->pb, 8, name[i]);
325 put_bits(&s->pb, 12 - padbits, 0);
328 static av_cold int aac_encode_end(AVCodecContext *avctx)
330 AACEncContext *s = avctx->priv_data;
332 ff_mdct_end(&s->mdct1024);
333 ff_mdct_end(&s->mdct128);
334 ff_aac_psy_end(&s->psy);
335 av_freep(&s->samples);
340 AVCodec aac_encoder = {
344 sizeof(AACEncContext),
348 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
349 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
350 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"),