aacenc.c 22.8 KB
Newer Older
Kostya Shishkov's avatar
Kostya Shishkov committed
1 2 3 4
/*
 * AAC encoder
 * Copyright (C) 2008 Konstantin Shishkov
 *
5
 * This file is part of Libav.
Kostya Shishkov's avatar
Kostya Shishkov committed
6
 *
7
 * Libav is free software; you can redistribute it and/or
Kostya Shishkov's avatar
Kostya Shishkov committed
8 9 10 11
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
12
 * Libav is distributed in the hope that it will be useful,
Kostya Shishkov's avatar
Kostya Shishkov committed
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with Libav; if not, write to the Free Software
Kostya Shishkov's avatar
Kostya Shishkov committed
19 20 21 22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
23
 * @file
Kostya Shishkov's avatar
Kostya Shishkov committed
24 25 26 27 28
 * AAC encoder
 */

/***********************************
 *              TODOs:
29
 * add sane pulse detection
Kostya Shishkov's avatar
Kostya Shishkov committed
30
 * add temporal noise shaping
Kostya Shishkov's avatar
Kostya Shishkov committed
31 32 33
 ***********************************/

#include "avcodec.h"
34
#include "put_bits.h"
Kostya Shishkov's avatar
Kostya Shishkov committed
35 36
#include "dsputil.h"
#include "mpeg4audio.h"
37
#include "kbdwin.h"
38
#include "sinewin.h"
Kostya Shishkov's avatar
Kostya Shishkov committed
39 40 41

#include "aac.h"
#include "aactab.h"
42 43 44
#include "aacenc.h"

#include "psymodel.h"
Kostya Shishkov's avatar
Kostya Shishkov committed
45

46 47
#define AAC_MAX_CHANNELS 6

Kostya Shishkov's avatar
Kostya Shishkov committed
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
static const uint8_t swb_size_1024_96[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
    12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44,
    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
};

static const uint8_t swb_size_1024_64[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8,
    12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36,
    40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
};

static const uint8_t swb_size_1024_48[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
    12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
    96
};

static const uint8_t swb_size_1024_32[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
    12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
};

static const uint8_t swb_size_1024_24[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28,
    32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64
};

static const uint8_t swb_size_1024_16[] = {
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28,
    32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
};

static const uint8_t swb_size_1024_8[] = {
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28,
    32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80
};

91
static const uint8_t *swb_size_1024[] = {
Kostya Shishkov's avatar
Kostya Shishkov committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    swb_size_1024_96, swb_size_1024_96, swb_size_1024_64,
    swb_size_1024_48, swb_size_1024_48, swb_size_1024_32,
    swb_size_1024_24, swb_size_1024_24, swb_size_1024_16,
    swb_size_1024_16, swb_size_1024_16, swb_size_1024_8
};

static const uint8_t swb_size_128_96[] = {
    4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36
};

static const uint8_t swb_size_128_48[] = {
    4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16
};

static const uint8_t swb_size_128_24[] = {
    4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20
};

static const uint8_t swb_size_128_16[] = {
    4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
};

static const uint8_t swb_size_128_8[] = {
    4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20
};

118
static const uint8_t *swb_size_128[] = {
Kostya Shishkov's avatar
Kostya Shishkov committed
119 120 121 122 123 124 125 126 127 128
    /* the last entry on the following row is swb_size_128_64 but is a
       duplicate of swb_size_128_96 */
    swb_size_128_96, swb_size_128_96, swb_size_128_96,
    swb_size_128_48, swb_size_128_48, swb_size_128_48,
    swb_size_128_24, swb_size_128_24, swb_size_128_16,
    swb_size_128_16, swb_size_128_16, swb_size_128_8
};

/** default channel configurations */
static const uint8_t aac_chan_configs[6][5] = {
129 130 131 132 133 134
 {1, TYPE_SCE},                               // 1 channel  - single channel element
 {1, TYPE_CPE},                               // 2 channels - channel pair
 {2, TYPE_SCE, TYPE_CPE},                     // 3 channels - center + stereo
 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE},           // 4 channels - front center + stereo + back center
 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE},           // 5 channels - front center + stereo + back stereo
 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE
Kostya Shishkov's avatar
Kostya Shishkov committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
};

/**
 * Make AAC audio config object.
 * @see 1.6.2.1 "Syntax - AudioSpecificConfig"
 */
static void put_audio_specific_config(AVCodecContext *avctx)
{
    PutBitContext pb;
    AACEncContext *s = avctx->priv_data;

    init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8);
    put_bits(&pb, 5, 2); //object type - AAC-LC
    put_bits(&pb, 4, s->samplerate_index); //sample rate index
    put_bits(&pb, 4, avctx->channels);
    //GASpecificConfig
    put_bits(&pb, 1, 0); //frame length - 1024 samples
    put_bits(&pb, 1, 0); //does not depend on core coder
    put_bits(&pb, 1, 0); //is not extension
Alex Converse's avatar
Alex Converse committed
154 155

    //Explicitly Mark SBR absent
156
    put_bits(&pb, 11, 0x2b7); //sync extension
Alex Converse's avatar
Alex Converse committed
157 158
    put_bits(&pb, 5,  AOT_SBR);
    put_bits(&pb, 1,  0);
Kostya Shishkov's avatar
Kostya Shishkov committed
159 160 161 162 163 164 165
    flush_put_bits(&pb);
}

static av_cold int aac_encode_init(AVCodecContext *avctx)
{
    AACEncContext *s = avctx->priv_data;
    int i;
166 167
    const uint8_t *sizes[2];
    int lengths[2];
Kostya Shishkov's avatar
Kostya Shishkov committed
168 169 170

    avctx->frame_size = 1024;

171 172
    for (i = 0; i < 16; i++)
        if (avctx->sample_rate == ff_mpeg4audio_sample_rates[i])
Kostya Shishkov's avatar
Kostya Shishkov committed
173
            break;
174
    if (i == 16) {
Kostya Shishkov's avatar
Kostya Shishkov committed
175 176 177
        av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate);
        return -1;
    }
178
    if (avctx->channels > AAC_MAX_CHANNELS) {
Kostya Shishkov's avatar
Kostya Shishkov committed
179 180 181
        av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels);
        return -1;
    }
182 183 184 185
    if (avctx->profile != FF_PROFILE_UNKNOWN && avctx->profile != FF_PROFILE_AAC_LOW) {
        av_log(avctx, AV_LOG_ERROR, "Unsupported profile %d\n", avctx->profile);
        return -1;
    }
186 187 188 189
    if (1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * avctx->channels) {
        av_log(avctx, AV_LOG_ERROR, "Too many bits per frame requested\n");
        return -1;
    }
Kostya Shishkov's avatar
Kostya Shishkov committed
190 191 192
    s->samplerate_index = i;

    dsputil_init(&s->dsp, avctx);
193 194
    ff_mdct_init(&s->mdct1024, 11, 0, 1.0);
    ff_mdct_init(&s->mdct128,   8, 0, 1.0);
195 196 197
    // window init
    ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
    ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
198 199
    ff_init_ff_sine_windows(10);
    ff_init_ff_sine_windows(7);
Kostya Shishkov's avatar
Kostya Shishkov committed
200

201 202
    s->samples            = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0]));
    s->cpe                = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]);
Alex Converse's avatar
Alex Converse committed
203 204
    avctx->extradata      = av_mallocz(5 + FF_INPUT_BUFFER_PADDING_SIZE);
    avctx->extradata_size = 5;
Kostya Shishkov's avatar
Kostya Shishkov committed
205
    put_audio_specific_config(avctx);
206

207 208
    sizes[0]   = swb_size_1024[i];
    sizes[1]   = swb_size_128[i];
209 210 211 212
    lengths[0] = ff_aac_num_swb_1024[i];
    lengths[1] = ff_aac_num_swb_128[i];
    ff_psy_init(&s->psy, avctx, 2, sizes, lengths);
    s->psypp = ff_psy_preprocess_init(avctx);
213
    s->coder = &ff_aac_coders[2];
214 215

    s->lambda = avctx->global_quality ? avctx->global_quality : 120;
216 217

    ff_aac_tableinit();
218

Kostya Shishkov's avatar
Kostya Shishkov committed
219 220 221
    return 0;
}

222
static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s,
223
                                  SingleChannelElement *sce, short *audio)
224
{
225 226
    int i, k;
    const int chans = avctx->channels;
227 228 229
    const float * lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
    const float * swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
    const float * pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
Young Han Lee's avatar
Young Han Lee committed
230
    float *output = sce->ret;
231 232

    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
Young Han Lee's avatar
Young Han Lee committed
233
        memcpy(output, sce->saved, sizeof(float)*1024);
234
        if (sce->ics.window_sequence[0] == LONG_STOP_SEQUENCE) {
Young Han Lee's avatar
Young Han Lee committed
235
            memset(output, 0, sizeof(output[0]) * 448);
236
            for (i = 448; i < 576; i++)
Young Han Lee's avatar
Young Han Lee committed
237
                output[i] = sce->saved[i] * pwindow[i - 448];
238
            for (i = 576; i < 704; i++)
Young Han Lee's avatar
Young Han Lee committed
239
                output[i] = sce->saved[i];
240
        }
241
        if (sce->ics.window_sequence[0] != LONG_START_SEQUENCE) {
242
            for (i = 0; i < 1024; i++) {
Young Han Lee's avatar
Young Han Lee committed
243
                output[i+1024]         = audio[i * chans] * lwindow[1024 - i - 1];
244
                sce->saved[i] = audio[i * chans] * lwindow[i];
245
            }
246
        } else {
247
            for (i = 0; i < 448; i++)
Young Han Lee's avatar
Young Han Lee committed
248
                output[i+1024]         = audio[i * chans];
249
            for (; i < 576; i++)
Young Han Lee's avatar
Young Han Lee committed
250 251
                output[i+1024]         = audio[i * chans] * swindow[576 - i - 1];
            memset(output+1024+576, 0, sizeof(output[0]) * 448);
252 253
            for (i = 0; i < 1024; i++)
                sce->saved[i] = audio[i * chans];
254
        }
255
        s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output);
256
    } else {
257
        for (k = 0; k < 1024; k += 128) {
258
            for (i = 448 + k; i < 448 + k + 256; i++)
Young Han Lee's avatar
Young Han Lee committed
259
                output[i - 448 - k] = (i < 1024)
260
                                         ? sce->saved[i]
261
                                         : audio[(i-1024)*chans];
Young Han Lee's avatar
Young Han Lee committed
262 263
            s->dsp.vector_fmul        (output,     output, k ?  swindow : pwindow, 128);
            s->dsp.vector_fmul_reverse(output+128, output+128, swindow, 128);
264
            s->mdct128.mdct_calc(&s->mdct128, sce->coeffs + k, output);
265
        }
266 267
        for (i = 0; i < 1024; i++)
            sce->saved[i] = audio[i * chans];
268 269 270
    }
}

Kostya Shishkov's avatar
Kostya Shishkov committed
271 272 273 274
/**
 * Encode ics_info element.
 * @see Table 4.6 (syntax of ics_info)
 */
Kostya Shishkov's avatar
Kostya Shishkov committed
275
static void put_ics_info(AACEncContext *s, IndividualChannelStream *info)
Kostya Shishkov's avatar
Kostya Shishkov committed
276
{
277
    int w;
Kostya Shishkov's avatar
Kostya Shishkov committed
278 279 280 281

    put_bits(&s->pb, 1, 0);                // ics_reserved bit
    put_bits(&s->pb, 2, info->window_sequence[0]);
    put_bits(&s->pb, 1, info->use_kb_window[0]);
282
    if (info->window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
Kostya Shishkov's avatar
Kostya Shishkov committed
283 284
        put_bits(&s->pb, 6, info->max_sfb);
        put_bits(&s->pb, 1, 0);            // no prediction
285
    } else {
Kostya Shishkov's avatar
Kostya Shishkov committed
286
        put_bits(&s->pb, 4, info->max_sfb);
287
        for (w = 1; w < 8; w++)
288
            put_bits(&s->pb, 1, !info->group_len[w]);
Kostya Shishkov's avatar
Kostya Shishkov committed
289 290 291
    }
}

Kostya Shishkov's avatar
Kostya Shishkov committed
292
/**
293 294
 * Encode MS data.
 * @see 4.6.8.1 "Joint Coding - M/S Stereo"
Kostya Shishkov's avatar
Kostya Shishkov committed
295
 */
296
static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe)
Kostya Shishkov's avatar
Kostya Shishkov committed
297 298
{
    int i, w;
299 300

    put_bits(pb, 2, cpe->ms_mode);
301 302
    if (cpe->ms_mode == 1)
        for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w])
303
            for (i = 0; i < cpe->ch[0].ics.max_sfb; i++)
304 305 306 307 308 309 310 311 312
                put_bits(pb, 1, cpe->ms_mask[w*16 + i]);
}

/**
 * Produce integer coefficients from scalefactors provided by the model.
 */
static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, int chans)
{
    int i, w, w2, g, ch;
313
    int start, maxsfb, cmaxsfb;
314

315
    for (ch = 0; ch < chans; ch++) {
316 317 318 319
        IndividualChannelStream *ics = &cpe->ch[ch].ics;
        start = 0;
        maxsfb = 0;
        cpe->ch[ch].pulse.num_pulse = 0;
320 321
        for (w = 0; w < ics->num_windows*16; w += 16) {
            for (g = 0; g < ics->num_swb; g++) {
322
                //apply M/S
323
                if (cpe->common_window && !ch && cpe->ms_mask[w + g]) {
324
                    for (i = 0; i < ics->swb_sizes[g]; i++) {
325 326 327 328 329 330
                        cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0;
                        cpe->ch[1].coeffs[start+i] =  cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
                    }
                }
                start += ics->swb_sizes[g];
            }
331 332
            for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--)
                ;
333 334 335 336 337
            maxsfb = FFMAX(maxsfb, cmaxsfb);
        }
        ics->max_sfb = maxsfb;

        //adjust zero bands for window groups
338 339
        for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
            for (g = 0; g < ics->max_sfb; g++) {
340
                i = 1;
341 342
                for (w2 = w; w2 < w + ics->group_len[w]; w2++) {
                    if (!cpe->ch[ch].zeroes[w2*16 + g]) {
343 344 345 346 347 348 349 350 351
                        i = 0;
                        break;
                    }
                }
                cpe->ch[ch].zeroes[w*16 + g] = i;
            }
        }
    }

352
    if (chans > 1 && cpe->common_window) {
353 354 355 356 357
        IndividualChannelStream *ics0 = &cpe->ch[0].ics;
        IndividualChannelStream *ics1 = &cpe->ch[1].ics;
        int msc = 0;
        ics0->max_sfb = FFMAX(ics0->max_sfb, ics1->max_sfb);
        ics1->max_sfb = ics0->max_sfb;
358 359
        for (w = 0; w < ics0->num_windows*16; w += 16)
            for (i = 0; i < ics0->max_sfb; i++)
360 361
                if (cpe->ms_mask[w+i])
                    msc++;
362 363 364 365
        if (msc == 0 || ics0->max_sfb == 0)
            cpe->ms_mode = 0;
        else
            cpe->ms_mode = msc < ics0->max_sfb ? 1 : 2;
366 367 368 369 370 371 372 373 374 375
    }
}

/**
 * Encode scalefactor band coding type.
 */
static void encode_band_info(AACEncContext *s, SingleChannelElement *sce)
{
    int w;

376
    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
377 378 379 380 381 382
        s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda);
}

/**
 * Encode scalefactors.
 */
383 384
static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s,
                                 SingleChannelElement *sce)
385 386 387 388
{
    int off = sce->sf_idx[0], diff;
    int i, w;

389 390 391
    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
        for (i = 0; i < sce->ics.max_sfb; i++) {
            if (!sce->zeroes[w*16 + i]) {
392
                diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO;
393 394
                if (diff < 0 || diff > 120)
                    av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n");
395 396 397
                off = sce->sf_idx[w*16 + i];
                put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]);
            }
Kostya Shishkov's avatar
Kostya Shishkov committed
398 399 400 401
        }
    }
}

402 403 404
/**
 * Encode pulse data.
 */
405
static void encode_pulses(AACEncContext *s, Pulse *pulse)
406 407 408 409
{
    int i;

    put_bits(&s->pb, 1, !!pulse->num_pulse);
410 411
    if (!pulse->num_pulse)
        return;
412 413 414

    put_bits(&s->pb, 2, pulse->num_pulse - 1);
    put_bits(&s->pb, 6, pulse->start);
415
    for (i = 0; i < pulse->num_pulse; i++) {
416
        put_bits(&s->pb, 5, pulse->pos[i]);
417 418 419 420 421 422 423
        put_bits(&s->pb, 4, pulse->amp[i]);
    }
}

/**
 * Encode spectral coefficients processed by psychoacoustic model.
 */
424
static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
425
{
426
    int start, i, w, w2;
427

428
    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
429
        start = 0;
430 431
        for (i = 0; i < sce->ics.max_sfb; i++) {
            if (sce->zeroes[w*16 + i]) {
432
                start += sce->ics.swb_sizes[i];
433 434
                continue;
            }
435
            for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++)
436
                s->coder->quantize_and_encode_band(s, &s->pb, sce->coeffs + start + w2*128,
437 438 439 440
                                                   sce->ics.swb_sizes[i],
                                                   sce->sf_idx[w*16 + i],
                                                   sce->band_type[w*16 + i],
                                                   s->lambda);
441
            start += sce->ics.swb_sizes[i];
442 443 444 445
        }
    }
}

446 447 448
/**
 * Encode one channel of audio data.
 */
449 450 451
static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s,
                                     SingleChannelElement *sce,
                                     int common_window)
452 453
{
    put_bits(&s->pb, 8, sce->sf_idx[0]);
454 455
    if (!common_window)
        put_ics_info(s, &sce->ics);
456 457 458 459 460 461 462 463 464
    encode_band_info(s, sce);
    encode_scale_factors(avctx, s, sce);
    encode_pulses(s, &sce->pulse);
    put_bits(&s->pb, 1, 0); //tns
    put_bits(&s->pb, 1, 0); //ssr
    encode_spectral_coeffs(s, sce);
    return 0;
}

Kostya Shishkov's avatar
Kostya Shishkov committed
465 466 467
/**
 * Write some auxiliary information about the created AAC file.
 */
468 469
static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s,
                               const char *name)
Kostya Shishkov's avatar
Kostya Shishkov committed
470 471 472 473
{
    int i, namelen, padbits;

    namelen = strlen(name) + 2;
474
    put_bits(&s->pb, 3, TYPE_FIL);
Kostya Shishkov's avatar
Kostya Shishkov committed
475
    put_bits(&s->pb, 4, FFMIN(namelen, 15));
476
    if (namelen >= 15)
Kostya Shishkov's avatar
Kostya Shishkov committed
477 478 479 480
        put_bits(&s->pb, 8, namelen - 16);
    put_bits(&s->pb, 4, 0); //extension type - filler
    padbits = 8 - (put_bits_count(&s->pb) & 7);
    align_put_bits(&s->pb);
481
    for (i = 0; i < namelen - 2; i++)
Kostya Shishkov's avatar
Kostya Shishkov committed
482 483 484 485
        put_bits(&s->pb, 8, name[i]);
    put_bits(&s->pb, 12 - padbits, 0);
}

486 487 488 489 490 491
static int aac_encode_frame(AVCodecContext *avctx,
                            uint8_t *frame, int buf_size, void *data)
{
    AACEncContext *s = avctx->priv_data;
    int16_t *samples = s->samples, *samples2, *la;
    ChannelElement *cpe;
492
    int i, ch, w, chans, tag, start_ch;
493 494
    const uint8_t *chan_map = aac_chan_configs[avctx->channels-1];
    int chan_el_counter[4];
495
    FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
496

497
    if (s->last_frame)
498
        return 0;
499 500
    if (data) {
        if (!s->psypp) {
501 502
            memcpy(s->samples + 1024 * avctx->channels, data,
                   1024 * avctx->channels * sizeof(s->samples[0]));
503
        } else {
504 505
            start_ch = 0;
            samples2 = s->samples + 1024 * avctx->channels;
506
            for (i = 0; i < chan_map[0]; i++) {
507 508
                tag = chan_map[i+1];
                chans = tag == TYPE_CPE ? 2 : 1;
509 510
                ff_psy_preprocess(s->psypp, (uint16_t*)data + start_ch,
                                  samples2 + start_ch, start_ch, chans);
511 512 513 514
                start_ch += chans;
            }
        }
    }
515
    if (!avctx->frame_number) {
516 517
        memcpy(s->samples, s->samples + 1024 * avctx->channels,
               1024 * avctx->channels * sizeof(s->samples[0]));
518 519 520 521
        return 0;
    }

    start_ch = 0;
522
    for (i = 0; i < chan_map[0]; i++) {
523
        FFPsyWindowInfo* wi = windows + start_ch;
524 525 526
        tag      = chan_map[i+1];
        chans    = tag == TYPE_CPE ? 2 : 1;
        cpe      = &s->cpe[i];
527 528 529
        for (ch = 0; ch < chans; ch++) {
            IndividualChannelStream *ics = &cpe->ch[ch].ics;
            int cur_channel = start_ch + ch;
530 531 532 533
            samples2 = samples + cur_channel;
            la       = samples2 + (448+64) * avctx->channels;
            if (!data)
                la = NULL;
534
            if (tag == TYPE_LFE) {
535 536 537 538
                wi[ch].window_type[0] = ONLY_LONG_SEQUENCE;
                wi[ch].window_shape   = 0;
                wi[ch].num_windows    = 1;
                wi[ch].grouping[0]    = 1;
539
            } else {
540 541
                wi[ch] = s->psy.model->window(&s->psy, samples2, la, cur_channel,
                                              ics->window_sequence[0]);
542
            }
543
            ics->window_sequence[1] = ics->window_sequence[0];
544
            ics->window_sequence[0] = wi[ch].window_type[0];
545
            ics->use_kb_window[1]   = ics->use_kb_window[0];
546 547
            ics->use_kb_window[0]   = wi[ch].window_shape;
            ics->num_windows        = wi[ch].num_windows;
548
            ics->swb_sizes          = s->psy.bands    [ics->num_windows == 8];
549
            ics->num_swb            = tag == TYPE_LFE ? 12 : s->psy.num_bands[ics->num_windows == 8];
550 551
            for (w = 0; w < ics->num_windows; w++)
                ics->group_len[w] = wi[ch].grouping[w];
552

553
            apply_window_and_mdct(avctx, s, &cpe->ch[ch], samples2);
554 555 556
        }
        start_ch += chans;
    }
557 558
    do {
        int frame_bits;
Alex Converse's avatar
Alex Converse committed
559 560 561 562 563 564 565 566 567 568
        init_put_bits(&s->pb, frame, buf_size*8);
        if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT))
            put_bitstream_info(avctx, s, LIBAVCODEC_IDENT);
        start_ch = 0;
        memset(chan_el_counter, 0, sizeof(chan_el_counter));
        for (i = 0; i < chan_map[0]; i++) {
            FFPsyWindowInfo* wi = windows + start_ch;
            tag      = chan_map[i+1];
            chans    = tag == TYPE_CPE ? 2 : 1;
            cpe      = &s->cpe[i];
569 570
            put_bits(&s->pb, 3, tag);
            put_bits(&s->pb, 4, chan_el_counter[tag]++);
571 572
            for (ch = 0; ch < chans; ch++) {
                s->cur_channel = start_ch + ch;
573
                s->psy.model->analyze(&s->psy, s->cur_channel, cpe->ch[ch].coeffs, &wi[ch]);
574
                s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
Alex Converse's avatar
Alex Converse committed
575 576 577 578 579 580 581
            }
            cpe->common_window = 0;
            if (chans > 1
                && wi[0].window_type[0] == wi[1].window_type[0]
                && wi[0].window_shape   == wi[1].window_shape) {

                cpe->common_window = 1;
582 583
                for (w = 0; w < wi[0].num_windows; w++) {
                    if (wi[0].grouping[w] != wi[1].grouping[w]) {
Alex Converse's avatar
Alex Converse committed
584 585 586
                        cpe->common_window = 0;
                        break;
                    }
587 588
                }
            }
589
            s->cur_channel = start_ch;
Alex Converse's avatar
Alex Converse committed
590 591 592 593 594 595 596 597 598
            if (cpe->common_window && s->coder->search_for_ms)
                s->coder->search_for_ms(s, cpe, s->lambda);
            adjust_frame_information(s, cpe, chans);
            if (chans == 2) {
                put_bits(&s->pb, 1, cpe->common_window);
                if (cpe->common_window) {
                    put_ics_info(s, &cpe->ch[0].ics);
                    encode_ms_info(&s->pb, cpe);
                }
599
            }
600 601 602
            for (ch = 0; ch < chans; ch++) {
                s->cur_channel = start_ch + ch;
                encode_individual_channel(avctx, s, &cpe->ch[ch], cpe->common_window);
Alex Converse's avatar
Alex Converse committed
603 604
            }
            start_ch += chans;
605 606
        }

607
        frame_bits = put_bits_count(&s->pb);
608 609
        if (frame_bits <= 6144 * avctx->channels - 3) {
            s->psy.bitres.bits = frame_bits / avctx->channels;
610
            break;
611
        }
612 613 614 615 616

        s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;

    } while (1);

617 618 619 620 621
    put_bits(&s->pb, 3, TYPE_END);
    flush_put_bits(&s->pb);
    avctx->frame_bits = put_bits_count(&s->pb);

    // rate control stuff
622
    if (!(avctx->flags & CODEC_FLAG_QSCALE)) {
623 624
        float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits;
        s->lambda *= ratio;
625
        s->lambda = FFMIN(s->lambda, 65536.f);
626 627
    }

628
    if (!data)
629
        s->last_frame = 1;
630 631
    memcpy(s->samples, s->samples + 1024 * avctx->channels,
           1024 * avctx->channels * sizeof(s->samples[0]));
632 633 634
    return put_bits_count(&s->pb)>>3;
}

Kostya Shishkov's avatar
Kostya Shishkov committed
635 636 637 638 639 640
static av_cold int aac_encode_end(AVCodecContext *avctx)
{
    AACEncContext *s = avctx->priv_data;

    ff_mdct_end(&s->mdct1024);
    ff_mdct_end(&s->mdct128);
641 642
    ff_psy_end(&s->psy);
    ff_psy_preprocess_end(s->psypp);
Kostya Shishkov's avatar
Kostya Shishkov committed
643 644 645 646 647
    av_freep(&s->samples);
    av_freep(&s->cpe);
    return 0;
}

648
AVCodec ff_aac_encoder = {
Kostya Shishkov's avatar
Kostya Shishkov committed
649
    "aac",
650
    AVMEDIA_TYPE_AUDIO,
Kostya Shishkov's avatar
Kostya Shishkov committed
651 652 653 654 655
    CODEC_ID_AAC,
    sizeof(AACEncContext),
    aac_encode_init,
    aac_encode_frame,
    aac_encode_end,
656
    .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL,
657
    .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
Kostya Shishkov's avatar
Kostya Shishkov committed
658 659
    .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"),
};