aacenc.c 24.5 KB
Newer Older
K
Kostya Shishkov 已提交
1 2 3 4
/*
 * AAC encoder
 * Copyright (C) 2008 Konstantin Shishkov
 *
5
 * This file is part of Libav.
K
Kostya Shishkov 已提交
6
 *
7
 * Libav is free software; you can redistribute it and/or
K
Kostya Shishkov 已提交
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,
K
Kostya Shishkov 已提交
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
K
Kostya Shishkov 已提交
19 20 21 22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
23
 * @file
K
Kostya Shishkov 已提交
24 25 26 27 28
 * AAC encoder
 */

/***********************************
 *              TODOs:
29
 * add sane pulse detection
K
Kostya Shishkov 已提交
30
 * add temporal noise shaping
K
Kostya Shishkov 已提交
31 32
 ***********************************/

33
#include "libavutil/opt.h"
K
Kostya Shishkov 已提交
34
#include "avcodec.h"
35
#include "put_bits.h"
K
Kostya Shishkov 已提交
36 37
#include "dsputil.h"
#include "mpeg4audio.h"
38
#include "kbdwin.h"
39
#include "sinewin.h"
K
Kostya Shishkov 已提交
40 41 42

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

#include "psymodel.h"
K
Kostya Shishkov 已提交
46

47 48
#define AAC_MAX_CHANNELS 6

K
Kostya Shishkov 已提交
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 91
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
};

92
static const uint8_t *swb_size_1024[] = {
K
Kostya Shishkov 已提交
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 118
    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
};

119
static const uint8_t *swb_size_128[] = {
K
Kostya Shishkov 已提交
120 121 122 123 124 125 126 127 128 129
    /* 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] = {
130 131 132 133 134 135
 {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
K
Kostya Shishkov 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
};

/**
 * 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
A
Alex Converse 已提交
155 156

    //Explicitly Mark SBR absent
157
    put_bits(&pb, 11, 0x2b7); //sync extension
A
Alex Converse 已提交
158 159
    put_bits(&pb, 5,  AOT_SBR);
    put_bits(&pb, 1,  0);
K
Kostya Shishkov 已提交
160 161 162 163 164 165 166
    flush_put_bits(&pb);
}

static av_cold int aac_encode_init(AVCodecContext *avctx)
{
    AACEncContext *s = avctx->priv_data;
    int i;
167
    const uint8_t *sizes[2];
168
    uint8_t grouping[AAC_MAX_CHANNELS];
169
    int lengths[2];
K
Kostya Shishkov 已提交
170 171 172

    avctx->frame_size = 1024;

173 174
    for (i = 0; i < 16; i++)
        if (avctx->sample_rate == ff_mpeg4audio_sample_rates[i])
K
Kostya Shishkov 已提交
175
            break;
176
    if (i == 16) {
K
Kostya Shishkov 已提交
177 178 179
        av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate);
        return -1;
    }
180
    if (avctx->channels > AAC_MAX_CHANNELS) {
K
Kostya Shishkov 已提交
181 182 183
        av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels);
        return -1;
    }
184 185 186 187
    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;
    }
188 189 190 191
    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;
    }
K
Kostya Shishkov 已提交
192 193 194
    s->samplerate_index = i;

    dsputil_init(&s->dsp, avctx);
195 196
    ff_mdct_init(&s->mdct1024, 11, 0, 1.0);
    ff_mdct_init(&s->mdct128,   8, 0, 1.0);
197 198 199
    // 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);
200 201
    ff_init_ff_sine_windows(10);
    ff_init_ff_sine_windows(7);
K
Kostya Shishkov 已提交
202

203
    s->chan_map           = aac_chan_configs[avctx->channels-1];
204
    s->samples            = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0]));
205
    s->cpe                = av_mallocz(sizeof(ChannelElement) * s->chan_map[0]);
A
Alex Converse 已提交
206 207
    avctx->extradata      = av_mallocz(5 + FF_INPUT_BUFFER_PADDING_SIZE);
    avctx->extradata_size = 5;
K
Kostya Shishkov 已提交
208
    put_audio_specific_config(avctx);
209

210 211
    sizes[0]   = swb_size_1024[i];
    sizes[1]   = swb_size_128[i];
212 213
    lengths[0] = ff_aac_num_swb_1024[i];
    lengths[1] = ff_aac_num_swb_128[i];
214 215 216
    for (i = 0; i < s->chan_map[0]; i++)
        grouping[i] = s->chan_map[i + 1] == TYPE_CPE;
    ff_psy_init(&s->psy, avctx, 2, sizes, lengths, s->chan_map[0], grouping);
217
    s->psypp = ff_psy_preprocess_init(avctx);
218
    s->coder = &ff_aac_coders[2];
219 220

    s->lambda = avctx->global_quality ? avctx->global_quality : 120;
221 222

    ff_aac_tableinit();
223

K
Kostya Shishkov 已提交
224 225 226
    return 0;
}

227
static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s,
228
                                  SingleChannelElement *sce, short *audio)
229
{
230 231
    int i, k;
    const int chans = avctx->channels;
232 233 234
    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;
Y
Young Han Lee 已提交
235
    float *output = sce->ret;
236 237

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

K
Kostya Shishkov 已提交
276 277 278 279
/**
 * Encode ics_info element.
 * @see Table 4.6 (syntax of ics_info)
 */
K
Kostya Shishkov 已提交
280
static void put_ics_info(AACEncContext *s, IndividualChannelStream *info)
K
Kostya Shishkov 已提交
281
{
282
    int w;
K
Kostya Shishkov 已提交
283 284 285 286

    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]);
287
    if (info->window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
K
Kostya Shishkov 已提交
288 289
        put_bits(&s->pb, 6, info->max_sfb);
        put_bits(&s->pb, 1, 0);            // no prediction
290
    } else {
K
Kostya Shishkov 已提交
291
        put_bits(&s->pb, 4, info->max_sfb);
292
        for (w = 1; w < 8; w++)
293
            put_bits(&s->pb, 1, !info->group_len[w]);
K
Kostya Shishkov 已提交
294 295 296
    }
}

K
Kostya Shishkov 已提交
297
/**
298 299
 * Encode MS data.
 * @see 4.6.8.1 "Joint Coding - M/S Stereo"
K
Kostya Shishkov 已提交
300
 */
301
static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe)
K
Kostya Shishkov 已提交
302 303
{
    int i, w;
304 305

    put_bits(pb, 2, cpe->ms_mode);
306 307
    if (cpe->ms_mode == 1)
        for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w])
308
            for (i = 0; i < cpe->ch[0].ics.max_sfb; i++)
309 310 311 312 313 314 315 316 317
                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;
318
    int start, maxsfb, cmaxsfb;
319

320
    for (ch = 0; ch < chans; ch++) {
321 322 323 324
        IndividualChannelStream *ics = &cpe->ch[ch].ics;
        start = 0;
        maxsfb = 0;
        cpe->ch[ch].pulse.num_pulse = 0;
325 326
        for (w = 0; w < ics->num_windows*16; w += 16) {
            for (g = 0; g < ics->num_swb; g++) {
327
                //apply M/S
328
                if (cpe->common_window && !ch && cpe->ms_mask[w + g]) {
329
                    for (i = 0; i < ics->swb_sizes[g]; i++) {
330 331 332 333 334 335
                        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];
            }
336 337
            for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--)
                ;
338 339 340 341 342
            maxsfb = FFMAX(maxsfb, cmaxsfb);
        }
        ics->max_sfb = maxsfb;

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

357
    if (chans > 1 && cpe->common_window) {
358 359 360 361 362
        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;
363 364
        for (w = 0; w < ics0->num_windows*16; w += 16)
            for (i = 0; i < ics0->max_sfb; i++)
365 366
                if (cpe->ms_mask[w+i])
                    msc++;
367 368 369
        if (msc == 0 || ics0->max_sfb == 0)
            cpe->ms_mode = 0;
        else
370
            cpe->ms_mode = msc < ics0->max_sfb * ics0->num_windows ? 1 : 2;
371 372 373 374 375 376 377 378 379 380
    }
}

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

381
    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
382 383 384 385 386 387
        s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda);
}

/**
 * Encode scalefactors.
 */
388 389
static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s,
                                 SingleChannelElement *sce)
390 391 392 393
{
    int off = sce->sf_idx[0], diff;
    int i, w;

394 395 396
    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]) {
397
                diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO;
398 399
                if (diff < 0 || diff > 120)
                    av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n");
400 401 402
                off = sce->sf_idx[w*16 + i];
                put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]);
            }
K
Kostya Shishkov 已提交
403 404 405 406
        }
    }
}

407 408 409
/**
 * Encode pulse data.
 */
410
static void encode_pulses(AACEncContext *s, Pulse *pulse)
411 412 413 414
{
    int i;

    put_bits(&s->pb, 1, !!pulse->num_pulse);
415 416
    if (!pulse->num_pulse)
        return;
417 418 419

    put_bits(&s->pb, 2, pulse->num_pulse - 1);
    put_bits(&s->pb, 6, pulse->start);
420
    for (i = 0; i < pulse->num_pulse; i++) {
421
        put_bits(&s->pb, 5, pulse->pos[i]);
422 423 424 425 426 427 428
        put_bits(&s->pb, 4, pulse->amp[i]);
    }
}

/**
 * Encode spectral coefficients processed by psychoacoustic model.
 */
429
static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
430
{
431
    int start, i, w, w2;
432

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

451 452 453
/**
 * Encode one channel of audio data.
 */
454 455 456
static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s,
                                     SingleChannelElement *sce,
                                     int common_window)
457 458
{
    put_bits(&s->pb, 8, sce->sf_idx[0]);
459 460
    if (!common_window)
        put_ics_info(s, &sce->ics);
461 462 463 464 465 466 467 468 469
    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;
}

K
Kostya Shishkov 已提交
470 471 472
/**
 * Write some auxiliary information about the created AAC file.
 */
473 474
static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s,
                               const char *name)
K
Kostya Shishkov 已提交
475 476 477 478
{
    int i, namelen, padbits;

    namelen = strlen(name) + 2;
479
    put_bits(&s->pb, 3, TYPE_FIL);
K
Kostya Shishkov 已提交
480
    put_bits(&s->pb, 4, FFMIN(namelen, 15));
481
    if (namelen >= 15)
K
Kostya Shishkov 已提交
482 483 484 485
        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);
486
    for (i = 0; i < namelen - 2; i++)
K
Kostya Shishkov 已提交
487 488 489 490
        put_bits(&s->pb, 8, name[i]);
    put_bits(&s->pb, 12 - padbits, 0);
}

491 492 493 494 495 496
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;
497
    int i, ch, w, g, chans, tag, start_ch;
498
    int chan_el_counter[4];
499
    FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
500

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

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

557
            apply_window_and_mdct(avctx, s, &cpe->ch[ch], samples2);
558 559 560
        }
        start_ch += chans;
    }
561 562
    do {
        int frame_bits;
A
Alex Converse 已提交
563 564 565 566 567
        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));
568
        for (i = 0; i < s->chan_map[0]; i++) {
A
Alex Converse 已提交
569
            FFPsyWindowInfo* wi = windows + start_ch;
570
            const float *coeffs[2];
571
            tag      = s->chan_map[i+1];
A
Alex Converse 已提交
572 573
            chans    = tag == TYPE_CPE ? 2 : 1;
            cpe      = &s->cpe[i];
A
Alex Converse 已提交
574 575
            put_bits(&s->pb, 3, tag);
            put_bits(&s->pb, 4, chan_el_counter[tag]++);
576 577
            for (ch = 0; ch < chans; ch++)
                coeffs[ch] = cpe->ch[ch].coeffs;
578
            s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
579
            for (ch = 0; ch < chans; ch++) {
580
                s->cur_channel = start_ch * 2 + ch;
581
                s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
A
Alex Converse 已提交
582 583 584 585 586 587 588
            }
            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;
589 590
                for (w = 0; w < wi[0].num_windows; w++) {
                    if (wi[0].grouping[w] != wi[1].grouping[w]) {
A
Alex Converse 已提交
591 592 593
                        cpe->common_window = 0;
                        break;
                    }
594 595
                }
            }
596
            s->cur_channel = start_ch * 2;
597 598 599 600 601 602 603 604 605 606
            if (s->options.stereo_mode && cpe->common_window) {
                if (s->options.stereo_mode > 0) {
                    IndividualChannelStream *ics = &cpe->ch[0].ics;
                    for (w = 0; w < ics->num_windows; w += ics->group_len[w])
                        for (g = 0;  g < ics->num_swb; g++)
                            cpe->ms_mask[w*16+g] = 1;
                } else if (s->coder->search_for_ms) {
                    s->coder->search_for_ms(s, cpe, s->lambda);
                }
            }
A
Alex Converse 已提交
607 608 609 610 611 612 613
            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);
                }
614
            }
615 616 617
            for (ch = 0; ch < chans; ch++) {
                s->cur_channel = start_ch + ch;
                encode_individual_channel(avctx, s, &cpe->ch[ch], cpe->common_window);
A
Alex Converse 已提交
618 619
            }
            start_ch += chans;
620 621
        }

622
        frame_bits = put_bits_count(&s->pb);
623 624
        if (frame_bits <= 6144 * avctx->channels - 3) {
            s->psy.bitres.bits = frame_bits / avctx->channels;
625
            break;
626
        }
627 628 629 630 631

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

    } while (1);

632 633 634 635 636
    put_bits(&s->pb, 3, TYPE_END);
    flush_put_bits(&s->pb);
    avctx->frame_bits = put_bits_count(&s->pb);

    // rate control stuff
637
    if (!(avctx->flags & CODEC_FLAG_QSCALE)) {
638 639
        float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits;
        s->lambda *= ratio;
640
        s->lambda = FFMIN(s->lambda, 65536.f);
641 642
    }

643
    if (!data)
644
        s->last_frame = 1;
645 646
    memcpy(s->samples, s->samples + 1024 * avctx->channels,
           1024 * avctx->channels * sizeof(s->samples[0]));
647 648 649
    return put_bits_count(&s->pb)>>3;
}

K
Kostya Shishkov 已提交
650 651 652 653 654 655
static av_cold int aac_encode_end(AVCodecContext *avctx)
{
    AACEncContext *s = avctx->priv_data;

    ff_mdct_end(&s->mdct1024);
    ff_mdct_end(&s->mdct128);
656 657
    ff_psy_end(&s->psy);
    ff_psy_preprocess_end(s->psypp);
K
Kostya Shishkov 已提交
658 659 660 661 662
    av_freep(&s->samples);
    av_freep(&s->cpe);
    return 0;
}

663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
#define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
static const AVOption aacenc_options[] = {
    {"stereo_mode", "Stereo coding method", offsetof(AACEncContext, options.stereo_mode), FF_OPT_TYPE_INT, {.dbl = 0}, -1, 1, AACENC_FLAGS, "stereo_mode"},
        {"auto",     "Selected by the Encoder", 0, FF_OPT_TYPE_CONST, {.dbl = -1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
        {"ms_off",   "Disable Mid/Side coding", 0, FF_OPT_TYPE_CONST, {.dbl =  0 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
        {"ms_force", "Force Mid/Side for the whole frame if possible", 0, FF_OPT_TYPE_CONST, {.dbl =  1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
    {NULL}
};

static const AVClass aacenc_class = {
    "AAC encoder",
    av_default_item_name,
    aacenc_options,
    LIBAVUTIL_VERSION_INT,
};

679
AVCodec ff_aac_encoder = {
680 681 682 683 684 685 686
    .name           = "aac",
    .type           = AVMEDIA_TYPE_AUDIO,
    .id             = CODEC_ID_AAC,
    .priv_data_size = sizeof(AACEncContext),
    .init           = aac_encode_init,
    .encode         = aac_encode_frame,
    .close          = aac_encode_end,
687
    .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL,
688
    .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
K
Kostya Shishkov 已提交
689
    .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"),
690
    .priv_class = &aacenc_class,
K
Kostya Shishkov 已提交
691
};