aac.c 66.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * AAC decoder
 * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
 * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * 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.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * 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
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
24
 * @file libavcodec/aac.c
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 * AAC decoder
 * @author Oded Shimon  ( ods15 ods15 dyndns org )
 * @author Maxim Gavrilov ( maxim.gavrilov gmail com )
 */

/*
 * supported tools
 *
 * Support?             Name
 * N (code in SoC repo) gain control
 * Y                    block switching
 * Y                    window shapes - standard
 * N                    window shapes - Low Delay
 * Y                    filterbank - standard
 * N (code in SoC repo) filterbank - Scalable Sample Rate
 * Y                    Temporal Noise Shaping
 * N (code in SoC repo) Long Term Prediction
 * Y                    intensity stereo
 * Y                    channel coupling
44
 * Y                    frequency domain prediction
45 46 47 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
 * Y                    Perceptual Noise Substitution
 * Y                    Mid/Side stereo
 * N                    Scalable Inverse AAC Quantization
 * N                    Frequency Selective Switch
 * N                    upsampling filter
 * Y                    quantization & coding - AAC
 * N                    quantization & coding - TwinVQ
 * N                    quantization & coding - BSAC
 * N                    AAC Error Resilience tools
 * N                    Error Resilience payload syntax
 * N                    Error Protection tool
 * N                    CELP
 * N                    Silence Compression
 * N                    HVXC
 * N                    HVXC 4kbits/s VR
 * N                    Structured Audio tools
 * N                    Structured Audio Sample Bank Format
 * N                    MIDI
 * N                    Harmonic and Individual Lines plus Noise
 * N                    Text-To-Speech Interface
 * N (in progress)      Spectral Band Replication
 * Y (not in this code) Layer-1
 * Y (not in this code) Layer-2
 * Y (not in this code) Layer-3
 * N                    SinuSoidal Coding (Transient, Sinusoid, Noise)
 * N (planned)          Parametric Stereo
 * N                    Direct Stream Transfer
 *
 * Note: - HE AAC v1 comprises LC AAC with Spectral Band Replication.
 *       - HE AAC v2 comprises LC AAC with Spectral Band Replication and
           Parametric Stereo.
 */


#include "avcodec.h"
80
#include "internal.h"
81
#include "get_bits.h"
82
#include "dsputil.h"
83
#include "lpc.h"
84 85 86

#include "aac.h"
#include "aactab.h"
87
#include "aacdectab.h"
88
#include "mpeg4audio.h"
89
#include "aac_parser.h"
90 91 92 93 94 95

#include <assert.h>
#include <errno.h>
#include <math.h>
#include <string.h>

D
Diego Biurrun 已提交
96 97 98 99
union float754 {
    float f;
    uint32_t i;
};
100

101 102 103 104
static VLC vlc_scalefactors;
static VLC vlc_spectral[11];


D
Diego Biurrun 已提交
105 106
static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
{
107 108 109 110 111 112 113
    if (ac->tag_che_map[type][elem_id]) {
        return ac->tag_che_map[type][elem_id];
    }
    if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) {
        return NULL;
    }
    switch (ac->m4ac.chan_config) {
D
Diego Biurrun 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
    case 7:
        if (ac->tags_mapped == 3 && type == TYPE_CPE) {
            ac->tags_mapped++;
            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2];
        }
    case 6:
        /* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1]
           instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have
           encountered such a stream, transfer the LFE[0] element to SCE[1] */
        if (ac->tags_mapped == tags_per_config[ac->m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
            ac->tags_mapped++;
            return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0];
        }
    case 5:
        if (ac->tags_mapped == 2 && type == TYPE_CPE) {
            ac->tags_mapped++;
            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1];
        }
    case 4:
        if (ac->tags_mapped == 2 && ac->m4ac.chan_config == 4 && type == TYPE_SCE) {
            ac->tags_mapped++;
            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1];
        }
    case 3:
    case 2:
        if (ac->tags_mapped == (ac->m4ac.chan_config != 2) && type == TYPE_CPE) {
            ac->tags_mapped++;
            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0];
        } else if (ac->m4ac.chan_config == 2) {
143
            return NULL;
D
Diego Biurrun 已提交
144 145 146 147 148 149 150 151
        }
    case 1:
        if (!ac->tags_mapped && type == TYPE_SCE) {
            ac->tags_mapped++;
            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0];
        }
    default:
        return NULL;
152 153 154
    }
}

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
/**
 * Check for the channel element in the current channel position configuration.
 * If it exists, make sure the appropriate element is allocated and map the
 * channel order to match the internal FFmpeg channel layout.
 *
 * @param   che_pos current channel position configuration
 * @param   type channel element type
 * @param   id channel element id
 * @param   channels count of the number of channels in the configuration
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
static int che_configure(AACContext *ac,
                         enum ChannelPosition che_pos[4][MAX_ELEM_ID],
                         int type, int id,
                         int *channels)
{
    if (che_pos[type][id]) {
        if (!ac->che[type][id] && !(ac->che[type][id] = av_mallocz(sizeof(ChannelElement))))
            return AVERROR(ENOMEM);
        if (type != TYPE_CCE) {
            ac->output_data[(*channels)++] = ac->che[type][id]->ch[0].ret;
            if (type == TYPE_CPE) {
                ac->output_data[(*channels)++] = ac->che[type][id]->ch[1].ret;
            }
        }
    } else
        av_freep(&ac->che[type][id]);
    return 0;
}

186 187 188 189 190 191 192 193
/**
 * Configure output channel order based on the current program configuration element.
 *
 * @param   che_pos current channel position configuration
 * @param   new_che_pos New channel position configuration - we only do something if it differs from the current one.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
194 195 196
static int output_configure(AACContext *ac,
                            enum ChannelPosition che_pos[4][MAX_ELEM_ID],
                            enum ChannelPosition new_che_pos[4][MAX_ELEM_ID],
197
                            int channel_config, enum OCStatus oc_type)
D
Diego Biurrun 已提交
198
{
199
    AVCodecContext *avctx = ac->avccontext;
200
    int i, type, channels = 0, ret;
201 202 203

    memcpy(che_pos, new_che_pos, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));

204 205
    if (channel_config) {
        for (i = 0; i < tags_per_config[channel_config]; i++) {
206 207 208 209 210
            if ((ret = che_configure(ac, che_pos,
                                     aac_channel_layout_map[channel_config - 1][i][0],
                                     aac_channel_layout_map[channel_config - 1][i][1],
                                     &channels)))
                return ret;
211 212 213 214 215 216 217
        }

        memset(ac->tag_che_map, 0,       4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
        ac->tags_mapped = 0;

        avctx->channel_layout = aac_channel_layout[channel_config - 1];
    } else {
R
Robert Swain 已提交
218 219 220 221 222 223 224 225 226 227 228
        /* Allocate or free elements depending on if they are in the
         * current program configuration.
         *
         * Set up default 1:1 output mapping.
         *
         * For a 5.1 stream the output order will be:
         *    [ Center ] [ Front Left ] [ Front Right ] [ LFE ] [ Surround Left ] [ Surround Right ]
         */

        for (i = 0; i < MAX_ELEM_ID; i++) {
            for (type = 0; type < 4; type++) {
229 230
                if ((ret = che_configure(ac, che_pos, type, i, &channels)))
                    return ret;
R
Robert Swain 已提交
231
            }
232 233
        }

234
        memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
D
Diego Biurrun 已提交
235
        ac->tags_mapped = 4 * MAX_ELEM_ID;
236 237

        avctx->channel_layout = 0;
238 239
    }

240
    avctx->channels = channels;
241

242
    ac->output_configured = oc_type;
243

244 245 246
    return 0;
}

247 248 249 250 251 252 253 254
/**
 * Decode an array of 4 bit element IDs, optionally interleaved with a stereo/mono switching bit.
 *
 * @param cpe_map Stereo (Channel Pair Element) map, NULL if stereo bit is not present.
 * @param sce_map mono (Single Channel Element) map
 * @param type speaker type/position for these channels
 */
static void decode_channel_map(enum ChannelPosition *cpe_map,
D
Diego Biurrun 已提交
255 256 257 258 259
                               enum ChannelPosition *sce_map,
                               enum ChannelPosition type,
                               GetBitContext *gb, int n)
{
    while (n--) {
260 261 262 263 264 265 266 267 268 269 270 271
        enum ChannelPosition *map = cpe_map && get_bits1(gb) ? cpe_map : sce_map; // stereo or mono map
        map[get_bits(gb, 4)] = type;
    }
}

/**
 * Decode program configuration element; reference: table 4.2.
 *
 * @param   new_che_pos New channel position configuration - we only do something if it differs from the current one.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
272 273 274
static int decode_pce(AACContext *ac, enum ChannelPosition new_che_pos[4][MAX_ELEM_ID],
                      GetBitContext *gb)
{
275
    int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc, sampling_index;
276 277 278

    skip_bits(gb, 2);  // object_type

279
    sampling_index = get_bits(gb, 4);
280 281 282
    if (ac->m4ac.sampling_index != sampling_index)
        av_log(ac->avccontext, AV_LOG_WARNING, "Sample rate index in program config element does not match the sample rate index configured by the container.\n");

283 284 285 286 287 288 289
    num_front       = get_bits(gb, 4);
    num_side        = get_bits(gb, 4);
    num_back        = get_bits(gb, 4);
    num_lfe         = get_bits(gb, 2);
    num_assoc_data  = get_bits(gb, 3);
    num_cc          = get_bits(gb, 4);

290 291 292 293
    if (get_bits1(gb))
        skip_bits(gb, 4); // mono_mixdown_tag
    if (get_bits1(gb))
        skip_bits(gb, 4); // stereo_mixdown_tag
294

295 296
    if (get_bits1(gb))
        skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround
297

298 299 300 301
    decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_FRONT, gb, num_front);
    decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_SIDE,  gb, num_side );
    decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_BACK,  gb, num_back );
    decode_channel_map(NULL,                  new_che_pos[TYPE_LFE], AAC_CHANNEL_LFE,   gb, num_lfe  );
302 303 304

    skip_bits_long(gb, 4 * num_assoc_data);

305
    decode_channel_map(new_che_pos[TYPE_CCE], new_che_pos[TYPE_CCE], AAC_CHANNEL_CC,    gb, num_cc   );
306 307 308 309 310

    align_get_bits(gb);

    /* comment field, first byte is length */
    skip_bits_long(gb, 8 * get_bits(gb, 8));
311 312
    return 0;
}
313

314 315 316 317 318 319 320 321
/**
 * Set up channel positions based on a default channel configuration
 * as specified in table 1.17.
 *
 * @param   new_che_pos New channel position configuration - we only do something if it differs from the current one.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
322 323 324
static int set_default_channel_config(AACContext *ac,
                                      enum ChannelPosition new_che_pos[4][MAX_ELEM_ID],
                                      int channel_config)
325
{
D
Diego Biurrun 已提交
326
    if (channel_config < 1 || channel_config > 7) {
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
        av_log(ac->avccontext, AV_LOG_ERROR, "invalid default channel configuration (%d)\n",
               channel_config);
        return -1;
    }

    /* default channel configurations:
     *
     * 1ch : front center (mono)
     * 2ch : L + R (stereo)
     * 3ch : front center + L + R
     * 4ch : front center + L + R + back center
     * 5ch : front center + L + R + back stereo
     * 6ch : front center + L + R + back stereo + LFE
     * 7ch : front center + L + R + outer front left + outer front right + back stereo + LFE
     */

D
Diego Biurrun 已提交
343
    if (channel_config != 2)
344
        new_che_pos[TYPE_SCE][0] = AAC_CHANNEL_FRONT; // front center (or mono)
D
Diego Biurrun 已提交
345
    if (channel_config > 1)
346
        new_che_pos[TYPE_CPE][0] = AAC_CHANNEL_FRONT; // L + R (or stereo)
D
Diego Biurrun 已提交
347
    if (channel_config == 4)
348
        new_che_pos[TYPE_SCE][1] = AAC_CHANNEL_BACK;  // back center
D
Diego Biurrun 已提交
349
    if (channel_config > 4)
350
        new_che_pos[TYPE_CPE][(channel_config == 7) + 1]
D
Diego Biurrun 已提交
351 352
        = AAC_CHANNEL_BACK;  // back stereo
    if (channel_config > 5)
353
        new_che_pos[TYPE_LFE][0] = AAC_CHANNEL_LFE;   // LFE
D
Diego Biurrun 已提交
354
    if (channel_config == 7)
355 356 357 358 359
        new_che_pos[TYPE_CPE][1] = AAC_CHANNEL_FRONT; // outer front left + outer front right

    return 0;
}

360 361 362 363 364
/**
 * Decode GA "General Audio" specific configuration; reference: table 4.1.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
365 366 367
static int decode_ga_specific_config(AACContext *ac, GetBitContext *gb,
                                     int channel_config)
{
368 369 370
    enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
    int extension_flag, ret;

D
Diego Biurrun 已提交
371
    if (get_bits1(gb)) { // frameLengthFlag
372
        av_log_missing_feature(ac->avccontext, "960/120 MDCT window is", 1);
373 374 375 376 377 378 379
        return -1;
    }

    if (get_bits1(gb))       // dependsOnCoreCoder
        skip_bits(gb, 14);   // coreCoderDelay
    extension_flag = get_bits1(gb);

D
Diego Biurrun 已提交
380 381
    if (ac->m4ac.object_type == AOT_AAC_SCALABLE ||
        ac->m4ac.object_type == AOT_ER_AAC_SCALABLE)
382 383 384 385 386
        skip_bits(gb, 3);     // layerNr

    memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
    if (channel_config == 0) {
        skip_bits(gb, 4);  // element_instance_tag
D
Diego Biurrun 已提交
387
        if ((ret = decode_pce(ac, new_che_pos, gb)))
388 389
            return ret;
    } else {
D
Diego Biurrun 已提交
390
        if ((ret = set_default_channel_config(ac, new_che_pos, channel_config)))
391 392
            return ret;
    }
393
    if ((ret = output_configure(ac, ac->che_pos, new_che_pos, channel_config, OC_LOCKED)))
394 395 396 397
        return ret;

    if (extension_flag) {
        switch (ac->m4ac.object_type) {
D
Diego Biurrun 已提交
398 399 400 401 402 403 404 405 406
        case AOT_ER_BSAC:
            skip_bits(gb, 5);    // numOfSubFrame
            skip_bits(gb, 11);   // layer_length
            break;
        case AOT_ER_AAC_LC:
        case AOT_ER_AAC_LTP:
        case AOT_ER_AAC_SCALABLE:
        case AOT_ER_AAC_LD:
            skip_bits(gb, 3);  /* aacSectionDataResilienceFlag
407 408 409
                                    * aacScalefactorDataResilienceFlag
                                    * aacSpectralDataResilienceFlag
                                    */
D
Diego Biurrun 已提交
410
            break;
411 412 413 414 415 416 417 418 419 420 421 422 423 424
        }
        skip_bits1(gb);    // extensionFlag3 (TBD in version 3)
    }
    return 0;
}

/**
 * Decode audio specific configuration; reference: table 1.13.
 *
 * @param   data        pointer to AVCodecContext extradata
 * @param   data_size   size of AVCCodecContext extradata
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
425 426 427
static int decode_audio_specific_config(AACContext *ac, void *data,
                                        int data_size)
{
428 429 430 431 432
    GetBitContext gb;
    int i;

    init_get_bits(&gb, data, data_size * 8);

D
Diego Biurrun 已提交
433
    if ((i = ff_mpeg4audio_get_config(&ac->m4ac, data, data_size)) < 0)
434
        return -1;
D
Diego Biurrun 已提交
435
    if (ac->m4ac.sampling_index > 12) {
436 437 438 439 440 441 442
        av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index);
        return -1;
    }

    skip_bits_long(&gb, i);

    switch (ac->m4ac.object_type) {
443
    case AOT_AAC_MAIN:
444 445 446 447 448 449 450 451 452 453 454 455
    case AOT_AAC_LC:
        if (decode_ga_specific_config(ac, &gb, ac->m4ac.chan_config))
            return -1;
        break;
    default:
        av_log(ac->avccontext, AV_LOG_ERROR, "Audio object type %s%d is not supported.\n",
               ac->m4ac.sbr == 1? "SBR+" : "", ac->m4ac.object_type);
        return -1;
    }
    return 0;
}

456 457 458 459 460 461 462
/**
 * linear congruential pseudorandom number generator
 *
 * @param   previous_val    pointer to the current state of the generator
 *
 * @return  Returns a 32-bit pseudorandom integer
 */
D
Diego Biurrun 已提交
463 464
static av_always_inline int lcg_random(int previous_val)
{
465 466 467
    return previous_val * 1664525 + 1013904223;
}

D
Diego Biurrun 已提交
468 469 470 471
static void reset_predict_state(PredictorState *ps)
{
    ps->r0   = 0.0f;
    ps->r1   = 0.0f;
472 473 474 475 476 477
    ps->cor0 = 0.0f;
    ps->cor1 = 0.0f;
    ps->var0 = 1.0f;
    ps->var1 = 1.0f;
}

D
Diego Biurrun 已提交
478 479
static void reset_all_predictors(PredictorState *ps)
{
480 481 482 483 484
    int i;
    for (i = 0; i < MAX_PREDICTORS; i++)
        reset_predict_state(&ps[i]);
}

D
Diego Biurrun 已提交
485 486
static void reset_predictor_group(PredictorState *ps, int group_num)
{
487
    int i;
D
Diego Biurrun 已提交
488
    for (i = group_num - 1; i < MAX_PREDICTORS; i += 30)
489 490 491
        reset_predict_state(&ps[i]);
}

D
Diego Biurrun 已提交
492 493 494
static av_cold int aac_decode_init(AVCodecContext *avccontext)
{
    AACContext *ac = avccontext->priv_data;
495 496 497 498
    int i;

    ac->avccontext = avccontext;

499
    if (avccontext->extradata_size > 0) {
D
Diego Biurrun 已提交
500
        if (decode_audio_specific_config(ac, avccontext->extradata, avccontext->extradata_size))
501 502 503 504 505
            return -1;
        avccontext->sample_rate = ac->m4ac.sample_rate;
    } else if (avccontext->channels > 0) {
        ac->m4ac.sample_rate = avccontext->sample_rate;
    }
506

D
Diego Biurrun 已提交
507 508
    avccontext->sample_fmt = SAMPLE_FMT_S16;
    avccontext->frame_size = 1024;
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523

    AAC_INIT_VLC_STATIC( 0, 144);
    AAC_INIT_VLC_STATIC( 1, 114);
    AAC_INIT_VLC_STATIC( 2, 188);
    AAC_INIT_VLC_STATIC( 3, 180);
    AAC_INIT_VLC_STATIC( 4, 172);
    AAC_INIT_VLC_STATIC( 5, 140);
    AAC_INIT_VLC_STATIC( 6, 168);
    AAC_INIT_VLC_STATIC( 7, 114);
    AAC_INIT_VLC_STATIC( 8, 262);
    AAC_INIT_VLC_STATIC( 9, 248);
    AAC_INIT_VLC_STATIC(10, 384);

    dsputil_init(&ac->dsp, avccontext);

524 525
    ac->random_state = 0x1f2e3d4c;

526 527 528 529
    // -1024 - Compensate wrong IMDCT method.
    // 32768 - Required to scale values to the correct range for the bias method
    //         for float to int16 conversion.

530
    if (ac->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) {
D
Diego Biurrun 已提交
531 532
        ac->add_bias  = 385.0f;
        ac->sf_scale  = 1. / (-1024. * 32768.);
533 534
        ac->sf_offset = 0;
    } else {
D
Diego Biurrun 已提交
535 536
        ac->add_bias  = 0.0f;
        ac->sf_scale  = 1. / -1024.;
537 538 539
        ac->sf_offset = 60;
    }

540
#if !CONFIG_HARDCODED_TABLES
541
    for (i = 0; i < 428; i++)
D
Diego Biurrun 已提交
542
        ff_aac_pow2sf_tab[i] = pow(2, (i - 200) / 4.);
543 544
#endif /* CONFIG_HARDCODED_TABLES */

545
    INIT_VLC_STATIC(&vlc_scalefactors,7,FF_ARRAY_ELEMS(ff_aac_scalefactor_code),
D
Diego Biurrun 已提交
546 547 548
                    ff_aac_scalefactor_bits, sizeof(ff_aac_scalefactor_bits[0]), sizeof(ff_aac_scalefactor_bits[0]),
                    ff_aac_scalefactor_code, sizeof(ff_aac_scalefactor_code[0]), sizeof(ff_aac_scalefactor_code[0]),
                    352);
549

550 551
    ff_mdct_init(&ac->mdct, 11, 1, 1.0);
    ff_mdct_init(&ac->mdct_small, 8, 1, 1.0);
R
Robert Swain 已提交
552 553 554 555 556 557
    // window initialization
    ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
    ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
    ff_sine_window_init(ff_sine_1024, 1024);
    ff_sine_window_init(ff_sine_128, 128);

558 559 560
    return 0;
}

561 562 563
/**
 * Skip data_stream_element; reference: table 4.10.
 */
D
Diego Biurrun 已提交
564 565
static void skip_data_stream_element(GetBitContext *gb)
{
566 567 568 569 570 571 572 573 574
    int byte_align = get_bits1(gb);
    int count = get_bits(gb, 8);
    if (count == 255)
        count += get_bits(gb, 8);
    if (byte_align)
        align_get_bits(gb);
    skip_bits_long(gb, 8 * count);
}

D
Diego Biurrun 已提交
575 576 577
static int decode_prediction(AACContext *ac, IndividualChannelStream *ics,
                             GetBitContext *gb)
{
578 579 580 581 582 583 584 585 586 587 588 589 590 591
    int sfb;
    if (get_bits1(gb)) {
        ics->predictor_reset_group = get_bits(gb, 5);
        if (ics->predictor_reset_group == 0 || ics->predictor_reset_group > 30) {
            av_log(ac->avccontext, AV_LOG_ERROR, "Invalid Predictor Reset Group.\n");
            return -1;
        }
    }
    for (sfb = 0; sfb < FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[ac->m4ac.sampling_index]); sfb++) {
        ics->prediction_used[sfb] = get_bits1(gb);
    }
    return 0;
}

592 593 594 595 596
/**
 * Decode Individual Channel Stream info; reference: table 4.6.
 *
 * @param   common_window   Channels have independent [0], or shared [1], Individual Channel Stream information.
 */
D
Diego Biurrun 已提交
597 598 599
static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
                           GetBitContext *gb, int common_window)
{
600 601 602 603 604 605 606
    if (get_bits1(gb)) {
        av_log(ac->avccontext, AV_LOG_ERROR, "Reserved bit set.\n");
        memset(ics, 0, sizeof(IndividualChannelStream));
        return -1;
    }
    ics->window_sequence[1] = ics->window_sequence[0];
    ics->window_sequence[0] = get_bits(gb, 2);
D
Diego Biurrun 已提交
607 608 609 610
    ics->use_kb_window[1]   = ics->use_kb_window[0];
    ics->use_kb_window[0]   = get_bits1(gb);
    ics->num_window_groups  = 1;
    ics->group_len[0]       = 1;
R
Robert Swain 已提交
611 612 613 614 615
    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
        int i;
        ics->max_sfb = get_bits(gb, 4);
        for (i = 0; i < 7; i++) {
            if (get_bits1(gb)) {
D
Diego Biurrun 已提交
616
                ics->group_len[ics->num_window_groups - 1]++;
R
Robert Swain 已提交
617 618
            } else {
                ics->num_window_groups++;
D
Diego Biurrun 已提交
619
                ics->group_len[ics->num_window_groups - 1] = 1;
R
Robert Swain 已提交
620 621
            }
        }
D
Diego Biurrun 已提交
622 623 624 625
        ics->num_windows       = 8;
        ics->swb_offset        =    ff_swb_offset_128[ac->m4ac.sampling_index];
        ics->num_swb           =   ff_aac_num_swb_128[ac->m4ac.sampling_index];
        ics->tns_max_bands     = ff_tns_max_bands_128[ac->m4ac.sampling_index];
626
        ics->predictor_present = 0;
R
Robert Swain 已提交
627
    } else {
D
Diego Biurrun 已提交
628 629 630 631 632 633
        ics->max_sfb               = get_bits(gb, 6);
        ics->num_windows           = 1;
        ics->swb_offset            =    ff_swb_offset_1024[ac->m4ac.sampling_index];
        ics->num_swb               =   ff_aac_num_swb_1024[ac->m4ac.sampling_index];
        ics->tns_max_bands         = ff_tns_max_bands_1024[ac->m4ac.sampling_index];
        ics->predictor_present     = get_bits1(gb);
634 635 636 637 638 639 640 641 642 643 644 645
        ics->predictor_reset_group = 0;
        if (ics->predictor_present) {
            if (ac->m4ac.object_type == AOT_AAC_MAIN) {
                if (decode_prediction(ac, ics, gb)) {
                    memset(ics, 0, sizeof(IndividualChannelStream));
                    return -1;
                }
            } else if (ac->m4ac.object_type == AOT_AAC_LC) {
                av_log(ac->avccontext, AV_LOG_ERROR, "Prediction is not allowed in AAC-LC.\n");
                memset(ics, 0, sizeof(IndividualChannelStream));
                return -1;
            } else {
646
                av_log_missing_feature(ac->avccontext, "Predictor bit set but LTP is", 1);
R
Robert Swain 已提交
647 648
                memset(ics, 0, sizeof(IndividualChannelStream));
                return -1;
649
            }
650 651 652
        }
    }

D
Diego Biurrun 已提交
653
    if (ics->max_sfb > ics->num_swb) {
654
        av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
655 656
               "Number of scalefactor bands in group (%d) exceeds limit (%d).\n",
               ics->max_sfb, ics->num_swb);
657 658 659 660
        memset(ics, 0, sizeof(IndividualChannelStream));
        return -1;
    }

661 662 663 664 665 666 667 668 669 670 671
    return 0;
}

/**
 * Decode band types (section_data payload); reference: table 4.46.
 *
 * @param   band_type           array of the used band type
 * @param   band_type_run_end   array of the last scalefactor band of a band type run
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
672 673 674 675
static int decode_band_types(AACContext *ac, enum BandType band_type[120],
                             int band_type_run_end[120], GetBitContext *gb,
                             IndividualChannelStream *ics)
{
676 677 678 679 680 681 682 683 684 685 686 687
    int g, idx = 0;
    const int bits = (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) ? 3 : 5;
    for (g = 0; g < ics->num_window_groups; g++) {
        int k = 0;
        while (k < ics->max_sfb) {
            uint8_t sect_len = k;
            int sect_len_incr;
            int sect_band_type = get_bits(gb, 4);
            if (sect_band_type == 12) {
                av_log(ac->avccontext, AV_LOG_ERROR, "invalid band type\n");
                return -1;
            }
D
Diego Biurrun 已提交
688
            while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits) - 1)
689 690 691 692
                sect_len += sect_len_incr;
            sect_len += sect_len_incr;
            if (sect_len > ics->max_sfb) {
                av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
693 694
                       "Number of bands (%d) exceeds limit (%d).\n",
                       sect_len, ics->max_sfb);
695 696
                return -1;
            }
R
Robert Swain 已提交
697 698 699 700
            for (; k < sect_len; k++) {
                band_type        [idx]   = sect_band_type;
                band_type_run_end[idx++] = sect_len;
            }
701 702 703 704
        }
    }
    return 0;
}
705

706 707
/**
 * Decode scalefactors; reference: table 4.47.
708 709 710 711 712 713 714 715
 *
 * @param   global_gain         first scalefactor value as scalefactors are differentially coded
 * @param   band_type           array of the used band type
 * @param   band_type_run_end   array of the last scalefactor band of a band type run
 * @param   sf                  array of scalefactors or intensity stereo positions
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
716 717 718 719 720 721
static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb,
                               unsigned int global_gain,
                               IndividualChannelStream *ics,
                               enum BandType band_type[120],
                               int band_type_run_end[120])
{
722 723 724 725 726 727 728 729 730
    const int sf_offset = ac->sf_offset + (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE ? 12 : 0);
    int g, i, idx = 0;
    int offset[3] = { global_gain, global_gain - 90, 100 };
    int noise_flag = 1;
    static const char *sf_str[3] = { "Global gain", "Noise gain", "Intensity stereo position" };
    for (g = 0; g < ics->num_window_groups; g++) {
        for (i = 0; i < ics->max_sfb;) {
            int run_end = band_type_run_end[idx];
            if (band_type[idx] == ZERO_BT) {
D
Diego Biurrun 已提交
731
                for (; i < run_end; i++, idx++)
732
                    sf[idx] = 0.;
D
Diego Biurrun 已提交
733 734
            } else if ((band_type[idx] == INTENSITY_BT) || (band_type[idx] == INTENSITY_BT2)) {
                for (; i < run_end; i++, idx++) {
735
                    offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
D
Diego Biurrun 已提交
736
                    if (offset[2] > 255U) {
737
                        av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
738
                               "%s (%d) out of range.\n", sf_str[2], offset[2]);
739 740
                        return -1;
                    }
D
Diego Biurrun 已提交
741
                    sf[idx] = ff_aac_pow2sf_tab[-offset[2] + 300];
742
                }
D
Diego Biurrun 已提交
743 744 745
            } else if (band_type[idx] == NOISE_BT) {
                for (; i < run_end; i++, idx++) {
                    if (noise_flag-- > 0)
746 747 748
                        offset[1] += get_bits(gb, 9) - 256;
                    else
                        offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
D
Diego Biurrun 已提交
749
                    if (offset[1] > 255U) {
750
                        av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
751
                               "%s (%d) out of range.\n", sf_str[1], offset[1]);
752 753
                        return -1;
                    }
D
Diego Biurrun 已提交
754
                    sf[idx] = -ff_aac_pow2sf_tab[offset[1] + sf_offset + 100];
755
                }
D
Diego Biurrun 已提交
756 757
            } else {
                for (; i < run_end; i++, idx++) {
758
                    offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
D
Diego Biurrun 已提交
759
                    if (offset[0] > 255U) {
760
                        av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
761
                               "%s (%d) out of range.\n", sf_str[0], offset[0]);
762 763 764 765 766 767 768 769 770 771 772 773 774
                        return -1;
                    }
                    sf[idx] = -ff_aac_pow2sf_tab[ offset[0] + sf_offset];
                }
            }
        }
    }
    return 0;
}

/**
 * Decode pulse data; reference: table 4.7.
 */
D
Diego Biurrun 已提交
775 776 777
static int decode_pulses(Pulse *pulse, GetBitContext *gb,
                         const uint16_t *swb_offset, int num_swb)
{
778
    int i, pulse_swb;
779
    pulse->num_pulse = get_bits(gb, 2) + 1;
780 781 782 783
    pulse_swb        = get_bits(gb, 6);
    if (pulse_swb >= num_swb)
        return -1;
    pulse->pos[0]    = swb_offset[pulse_swb];
784
    pulse->pos[0]   += get_bits(gb, 5);
785 786
    if (pulse->pos[0] > 1023)
        return -1;
787 788
    pulse->amp[0]    = get_bits(gb, 4);
    for (i = 1; i < pulse->num_pulse; i++) {
D
Diego Biurrun 已提交
789
        pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i - 1];
790 791
        if (pulse->pos[i] > 1023)
            return -1;
792
        pulse->amp[i] = get_bits(gb, 4);
793
    }
794
    return 0;
795 796
}

R
Robert Swain 已提交
797 798 799 800 801
/**
 * Decode Temporal Noise Shaping data; reference: table 4.48.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
802 803 804
static int decode_tns(AACContext *ac, TemporalNoiseShaping *tns,
                      GetBitContext *gb, const IndividualChannelStream *ics)
{
R
Robert Swain 已提交
805 806 807 808
    int w, filt, i, coef_len, coef_res, coef_compress;
    const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE;
    const int tns_max_order = is8 ? 7 : ac->m4ac.object_type == AOT_AAC_MAIN ? 20 : 12;
    for (w = 0; w < ics->num_windows; w++) {
809
        if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) {
R
Robert Swain 已提交
810 811
            coef_res = get_bits1(gb);

R
Robert Swain 已提交
812 813
            for (filt = 0; filt < tns->n_filt[w]; filt++) {
                int tmp2_idx;
D
Diego Biurrun 已提交
814
                tns->length[w][filt] = get_bits(gb, 6 - 2 * is8);
R
Robert Swain 已提交
815

D
Diego Biurrun 已提交
816
                if ((tns->order[w][filt] = get_bits(gb, 5 - 2 * is8)) > tns_max_order) {
R
Robert Swain 已提交
817 818 819 820 821
                    av_log(ac->avccontext, AV_LOG_ERROR, "TNS filter order %d is greater than maximum %d.",
                           tns->order[w][filt], tns_max_order);
                    tns->order[w][filt] = 0;
                    return -1;
                }
822
                if (tns->order[w][filt]) {
R
Robert Swain 已提交
823 824 825
                    tns->direction[w][filt] = get_bits1(gb);
                    coef_compress = get_bits1(gb);
                    coef_len = coef_res + 3 - coef_compress;
D
Diego Biurrun 已提交
826
                    tmp2_idx = 2 * coef_compress + coef_res;
R
Robert Swain 已提交
827

R
Robert Swain 已提交
828 829
                    for (i = 0; i < tns->order[w][filt]; i++)
                        tns->coef[w][filt][i] = tns_tmp2_map[tmp2_idx][get_bits(gb, coef_len)];
830
                }
R
Robert Swain 已提交
831
            }
832
        }
R
Robert Swain 已提交
833 834 835 836
    }
    return 0;
}

837 838 839 840 841 842 843
/**
 * Decode Mid/Side data; reference: table 4.54.
 *
 * @param   ms_present  Indicates mid/side stereo presence. [0] mask is all 0s;
 *                      [1] mask is decoded from bitstream; [2] mask is all 1s;
 *                      [3] reserved for scalable AAC
 */
D
Diego Biurrun 已提交
844 845 846
static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
                                   int ms_present)
{
847 848 849 850 851 852 853 854
    int idx;
    if (ms_present == 1) {
        for (idx = 0; idx < cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb; idx++)
            cpe->ms_mask[idx] = get_bits1(gb);
    } else if (ms_present == 2) {
        memset(cpe->ms_mask, 1, cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb * sizeof(cpe->ms_mask[0]));
    }
}
855

R
Robert Swain 已提交
856 857 858 859 860 861 862 863 864 865 866 867
/**
 * Decode spectral data; reference: table 4.50.
 * Dequantize and scale spectral data; reference: 4.6.3.3.
 *
 * @param   coef            array of dequantized, scaled spectral data
 * @param   sf              array of scalefactors or intensity stereo positions
 * @param   pulse_present   set if pulses are present
 * @param   pulse           pointer to pulse data struct
 * @param   band_type       array of the used band type
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
868 869 870 871 872 873
static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
                                       GetBitContext *gb, float sf[120],
                                       int pulse_present, const Pulse *pulse,
                                       const IndividualChannelStream *ics,
                                       enum BandType band_type[120])
{
R
Robert Swain 已提交
874
    int i, k, g, idx = 0;
D
Diego Biurrun 已提交
875 876
    const int c = 1024 / ics->num_windows;
    const uint16_t *offsets = ics->swb_offset;
R
Robert Swain 已提交
877
    float *coef_base = coef;
878
    static const float sign_lookup[] = { 1.0f, -1.0f };
R
Robert Swain 已提交
879 880

    for (g = 0; g < ics->num_windows; g++)
D
Diego Biurrun 已提交
881
        memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float) * (c - offsets[ics->max_sfb]));
R
Robert Swain 已提交
882 883 884 885 886 887 888

    for (g = 0; g < ics->num_window_groups; g++) {
        for (i = 0; i < ics->max_sfb; i++, idx++) {
            const int cur_band_type = band_type[idx];
            const int dim = cur_band_type >= FIRST_PAIR_BT ? 2 : 4;
            const int is_cb_unsigned = IS_CODEBOOK_UNSIGNED(cur_band_type);
            int group;
889
            if (cur_band_type == ZERO_BT || cur_band_type == INTENSITY_BT2 || cur_band_type == INTENSITY_BT) {
R
Robert Swain 已提交
890
                for (group = 0; group < ics->group_len[g]; group++) {
D
Diego Biurrun 已提交
891
                    memset(coef + group * 128 + offsets[i], 0, (offsets[i + 1] - offsets[i]) * sizeof(float));
R
Robert Swain 已提交
892
                }
D
Diego Biurrun 已提交
893
            } else if (cur_band_type == NOISE_BT) {
R
Robert Swain 已提交
894
                for (group = 0; group < ics->group_len[g]; group++) {
895
                    float scale;
896
                    float band_energy;
M
Måns Rullgård 已提交
897
                    float *cf = coef + group * 128 + offsets[i];
M
Måns Rullgård 已提交
898 899
                    int len = offsets[i+1] - offsets[i];

900
                    for (k = 0; k < len; k++) {
R
Robert Swain 已提交
901
                        ac->random_state  = lcg_random(ac->random_state);
902
                        cf[k] = ac->random_state;
903
                    }
M
Måns Rullgård 已提交
904

905
                    band_energy = ac->dsp.scalarproduct_float(cf, cf, len);
906
                    scale = sf[idx] / sqrtf(band_energy);
M
Måns Rullgård 已提交
907
                    ac->dsp.vector_fmul_scalar(cf, cf, scale, len);
R
Robert Swain 已提交
908
                }
D
Diego Biurrun 已提交
909
            } else {
R
Robert Swain 已提交
910
                for (group = 0; group < ics->group_len[g]; group++) {
M
Måns Rullgård 已提交
911 912 913 914 915
                    const float *vq[96];
                    const float **vqp = vq;
                    float *cf = coef + (group << 7) + offsets[i];
                    int len = offsets[i + 1] - offsets[i];

D
Diego Biurrun 已提交
916
                    for (k = offsets[i]; k < offsets[i + 1]; k += dim) {
R
Robert Swain 已提交
917 918 919 920
                        const int index = get_vlc2(gb, vlc_spectral[cur_band_type - 1].table, 6, 3);
                        const int coef_tmp_idx = (group << 7) + k;
                        const float *vq_ptr;
                        int j;
D
Diego Biurrun 已提交
921
                        if (index >= ff_aac_spectral_sizes[cur_band_type - 1]) {
R
Robert Swain 已提交
922
                            av_log(ac->avccontext, AV_LOG_ERROR,
D
Diego Biurrun 已提交
923 924
                                   "Read beyond end of ff_aac_codebook_vectors[%d][]. index %d >= %d\n",
                                   cur_band_type - 1, index, ff_aac_spectral_sizes[cur_band_type - 1]);
R
Robert Swain 已提交
925 926 927
                            return -1;
                        }
                        vq_ptr = &ff_aac_codebook_vectors[cur_band_type - 1][index * dim];
M
Måns Rullgård 已提交
928
                        *vqp++ = vq_ptr;
R
Robert Swain 已提交
929
                        if (is_cb_unsigned) {
D
Diego Biurrun 已提交
930 931 932 933
                            if (vq_ptr[0])
                                coef[coef_tmp_idx    ] = sign_lookup[get_bits1(gb)];
                            if (vq_ptr[1])
                                coef[coef_tmp_idx + 1] = sign_lookup[get_bits1(gb)];
934
                            if (dim == 4) {
D
Diego Biurrun 已提交
935 936 937 938
                                if (vq_ptr[2])
                                    coef[coef_tmp_idx + 2] = sign_lookup[get_bits1(gb)];
                                if (vq_ptr[3])
                                    coef[coef_tmp_idx + 3] = sign_lookup[get_bits1(gb)];
939
                            }
A
Alex Converse 已提交
940 941 942 943 944 945 946
                            if (cur_band_type == ESC_BT) {
                                for (j = 0; j < 2; j++) {
                                    if (vq_ptr[j] == 64.0f) {
                                        int n = 4;
                                        /* The total length of escape_sequence must be < 22 bits according
                                           to the specification (i.e. max is 11111111110xxxxxxxxxx). */
                                        while (get_bits1(gb) && n < 15) n++;
D
Diego Biurrun 已提交
947
                                        if (n == 15) {
A
Alex Converse 已提交
948 949 950
                                            av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n");
                                            return -1;
                                        }
D
Diego Biurrun 已提交
951
                                        n = (1 << n) + get_bits(gb, n);
A
Alex Converse 已提交
952
                                        coef[coef_tmp_idx + j] *= cbrtf(n) * n;
D
Diego Biurrun 已提交
953
                                    } else
A
Alex Converse 已提交
954 955
                                        coef[coef_tmp_idx + j] *= vq_ptr[j];
                                }
R
Robert Swain 已提交
956
                            }
957
                        }
R
Robert Swain 已提交
958
                    }
M
Måns Rullgård 已提交
959 960 961 962

                    if (is_cb_unsigned && cur_band_type != ESC_BT) {
                        ac->dsp.vector_fmul_sv_scalar[dim>>2](
                            cf, cf, vq, sf[idx], len);
963
                    } else if (cur_band_type == ESC_BT) {
M
Måns Rullgård 已提交
964 965 966 967
                        ac->dsp.vector_fmul_scalar(cf, cf, sf[idx], len);
                    } else {    /* !is_cb_unsigned */
                        ac->dsp.sv_fmul_scalar[dim>>2](cf, vq, sf[idx], len);
                    }
R
Robert Swain 已提交
968 969 970
                }
            }
        }
D
Diego Biurrun 已提交
971
        coef += ics->group_len[g] << 7;
R
Robert Swain 已提交
972 973 974
    }

    if (pulse_present) {
975
        idx = 0;
D
Diego Biurrun 已提交
976 977 978
        for (i = 0; i < pulse->num_pulse; i++) {
            float co = coef_base[ pulse->pos[i] ];
            while (offsets[idx + 1] <= pulse->pos[i])
979 980
                idx++;
            if (band_type[idx] != NOISE_BT && sf[idx]) {
R
Robert Swain 已提交
981 982 983 984 985 986
                float ico = -pulse->amp[i];
                if (co) {
                    co /= sf[idx];
                    ico = co / sqrtf(sqrtf(fabsf(co))) + (co > 0 ? -ico : ico);
                }
                coef_base[ pulse->pos[i] ] = cbrtf(fabsf(ico)) * ico * sf[idx];
987
            }
R
Robert Swain 已提交
988 989 990 991 992
        }
    }
    return 0;
}

D
Diego Biurrun 已提交
993 994
static av_always_inline float flt16_round(float pf)
{
995 996 997 998
    union float754 tmp;
    tmp.f = pf;
    tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U;
    return tmp.f;
999 1000
}

D
Diego Biurrun 已提交
1001 1002
static av_always_inline float flt16_even(float pf)
{
1003 1004
    union float754 tmp;
    tmp.f = pf;
D
Diego Biurrun 已提交
1005
    tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U;
1006
    return tmp.f;
1007 1008
}

D
Diego Biurrun 已提交
1009 1010
static av_always_inline float flt16_trunc(float pf)
{
1011 1012 1013 1014
    union float754 pun;
    pun.f = pf;
    pun.i &= 0xFFFF0000U;
    return pun.f;
1015 1016
}

D
Diego Biurrun 已提交
1017 1018 1019 1020 1021
static void predict(AACContext *ac, PredictorState *ps, float *coef,
                    int output_enable)
{
    const float a     = 0.953125; // 61.0 / 64
    const float alpha = 0.90625;  // 29.0 / 32
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
    float e0, e1;
    float pv;
    float k1, k2;

    k1 = ps->var0 > 1 ? ps->cor0 * flt16_even(a / ps->var0) : 0;
    k2 = ps->var1 > 1 ? ps->cor1 * flt16_even(a / ps->var1) : 0;

    pv = flt16_round(k1 * ps->r0 + k2 * ps->r1);
    if (output_enable)
        *coef += pv * ac->sf_scale;

    e0 = *coef / ac->sf_scale;
    e1 = e0 - k1 * ps->r0;

    ps->cor1 = flt16_trunc(alpha * ps->cor1 + ps->r1 * e1);
    ps->var1 = flt16_trunc(alpha * ps->var1 + 0.5 * (ps->r1 * ps->r1 + e1 * e1));
    ps->cor0 = flt16_trunc(alpha * ps->cor0 + ps->r0 * e0);
    ps->var0 = flt16_trunc(alpha * ps->var0 + 0.5 * (ps->r0 * ps->r0 + e0 * e0));

    ps->r1 = flt16_trunc(a * (ps->r0 - k1 * e0));
    ps->r0 = flt16_trunc(a * e0);
}

/**
 * Apply AAC-Main style frequency domain prediction.
 */
D
Diego Biurrun 已提交
1048 1049
static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
{
1050 1051 1052
    int sfb, k;

    if (!sce->ics.predictor_initialized) {
1053
        reset_all_predictors(sce->predictor_state);
1054 1055 1056 1057 1058 1059
        sce->ics.predictor_initialized = 1;
    }

    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
        for (sfb = 0; sfb < ff_aac_pred_sfb_max[ac->m4ac.sampling_index]; sfb++) {
            for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) {
1060
                predict(ac, &sce->predictor_state[k], &sce->coeffs[k],
D
Diego Biurrun 已提交
1061
                        sce->ics.predictor_present && sce->ics.prediction_used[sfb]);
1062 1063 1064
            }
        }
        if (sce->ics.predictor_reset_group)
1065
            reset_predictor_group(sce->predictor_state, sce->ics.predictor_reset_group);
1066
    } else
1067
        reset_all_predictors(sce->predictor_state);
1068 1069
}

1070
/**
1071 1072 1073 1074 1075 1076 1077
 * Decode an individual_channel_stream payload; reference: table 4.44.
 *
 * @param   common_window   Channels have independent [0], or shared [1], Individual Channel Stream information.
 * @param   scale_flag      scalable [1] or non-scalable [0] AAC (Unused until scalable AAC is implemented.)
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
1078 1079 1080
static int decode_ics(AACContext *ac, SingleChannelElement *sce,
                      GetBitContext *gb, int common_window, int scale_flag)
{
1081
    Pulse pulse;
D
Diego Biurrun 已提交
1082 1083 1084
    TemporalNoiseShaping    *tns = &sce->tns;
    IndividualChannelStream *ics = &sce->ics;
    float *out = sce->coeffs;
1085 1086
    int global_gain, pulse_present = 0;

1087 1088
    /* This assignment is to silence a GCC warning about the variable being used
     * uninitialized when in fact it always is.
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
     */
    pulse.num_pulse = 0;

    global_gain = get_bits(gb, 8);

    if (!common_window && !scale_flag) {
        if (decode_ics_info(ac, ics, gb, 0) < 0)
            return -1;
    }

    if (decode_band_types(ac, sce->band_type, sce->band_type_run_end, gb, ics) < 0)
        return -1;
    if (decode_scalefactors(ac, sce->sf, gb, global_gain, ics, sce->band_type, sce->band_type_run_end) < 0)
        return -1;

    pulse_present = 0;
    if (!scale_flag) {
        if ((pulse_present = get_bits1(gb))) {
            if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
                av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n");
                return -1;
            }
1111 1112 1113 1114
            if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
                av_log(ac->avccontext, AV_LOG_ERROR, "Pulse data corrupt or invalid.\n");
                return -1;
            }
1115 1116 1117 1118
        }
        if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics))
            return -1;
        if (get_bits1(gb)) {
1119
            av_log_missing_feature(ac->avccontext, "SSR", 1);
1120 1121 1122 1123
            return -1;
        }
    }

1124
    if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present, &pulse, ics, sce->band_type) < 0)
1125
        return -1;
1126

D
Diego Biurrun 已提交
1127
    if (ac->m4ac.object_type == AOT_AAC_MAIN && !common_window)
1128 1129
        apply_prediction(ac, sce);

1130 1131 1132
    return 0;
}

R
Robert Swain 已提交
1133 1134 1135
/**
 * Mid/Side stereo decoding; reference: 4.6.8.1.3.
 */
M
Måns Rullgård 已提交
1136
static void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe)
D
Diego Biurrun 已提交
1137 1138
{
    const IndividualChannelStream *ics = &cpe->ch[0].ics;
R
Robert Swain 已提交
1139 1140
    float *ch0 = cpe->ch[0].coeffs;
    float *ch1 = cpe->ch[1].coeffs;
M
Måns Rullgård 已提交
1141
    int g, i, group, idx = 0;
D
Diego Biurrun 已提交
1142
    const uint16_t *offsets = ics->swb_offset;
R
Robert Swain 已提交
1143 1144 1145
    for (g = 0; g < ics->num_window_groups; g++) {
        for (i = 0; i < ics->max_sfb; i++, idx++) {
            if (cpe->ms_mask[idx] &&
D
Diego Biurrun 已提交
1146
                    cpe->ch[0].band_type[idx] < NOISE_BT && cpe->ch[1].band_type[idx] < NOISE_BT) {
R
Robert Swain 已提交
1147
                for (group = 0; group < ics->group_len[g]; group++) {
M
Måns Rullgård 已提交
1148 1149 1150
                    ac->dsp.butterflies_float(ch0 + group * 128 + offsets[i],
                                              ch1 + group * 128 + offsets[i],
                                              offsets[i+1] - offsets[i]);
R
Robert Swain 已提交
1151 1152 1153
                }
            }
        }
D
Diego Biurrun 已提交
1154 1155
        ch0 += ics->group_len[g] * 128;
        ch1 += ics->group_len[g] * 128;
R
Robert Swain 已提交
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
    }
}

/**
 * intensity stereo decoding; reference: 4.6.8.2.3
 *
 * @param   ms_present  Indicates mid/side stereo presence. [0] mask is all 0s;
 *                      [1] mask is decoded from bitstream; [2] mask is all 1s;
 *                      [3] reserved for scalable AAC
 */
D
Diego Biurrun 已提交
1166 1167 1168 1169
static void apply_intensity_stereo(ChannelElement *cpe, int ms_present)
{
    const IndividualChannelStream *ics = &cpe->ch[1].ics;
    SingleChannelElement         *sce1 = &cpe->ch[1];
R
Robert Swain 已提交
1170
    float *coef0 = cpe->ch[0].coeffs, *coef1 = cpe->ch[1].coeffs;
D
Diego Biurrun 已提交
1171
    const uint16_t *offsets = ics->swb_offset;
R
Robert Swain 已提交
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
    int g, group, i, k, idx = 0;
    int c;
    float scale;
    for (g = 0; g < ics->num_window_groups; g++) {
        for (i = 0; i < ics->max_sfb;) {
            if (sce1->band_type[idx] == INTENSITY_BT || sce1->band_type[idx] == INTENSITY_BT2) {
                const int bt_run_end = sce1->band_type_run_end[idx];
                for (; i < bt_run_end; i++, idx++) {
                    c = -1 + 2 * (sce1->band_type[idx] - 14);
                    if (ms_present)
                        c *= 1 - 2 * cpe->ms_mask[idx];
                    scale = c * sce1->sf[idx];
                    for (group = 0; group < ics->group_len[g]; group++)
D
Diego Biurrun 已提交
1185 1186
                        for (k = offsets[i]; k < offsets[i + 1]; k++)
                            coef1[group * 128 + k] = scale * coef0[group * 128 + k];
R
Robert Swain 已提交
1187 1188 1189 1190 1191 1192 1193
                }
            } else {
                int bt_run_end = sce1->band_type_run_end[idx];
                idx += bt_run_end - i;
                i    = bt_run_end;
            }
        }
D
Diego Biurrun 已提交
1194 1195
        coef0 += ics->group_len[g] * 128;
        coef1 += ics->group_len[g] * 128;
R
Robert Swain 已提交
1196 1197 1198
    }
}

1199 1200 1201 1202 1203 1204 1205
/**
 * Decode a channel_pair_element; reference: table 4.4.
 *
 * @param   elem_id Identifies the instance of a syntax element.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
1206 1207
static int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe)
{
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
    int i, ret, common_window, ms_present = 0;

    common_window = get_bits1(gb);
    if (common_window) {
        if (decode_ics_info(ac, &cpe->ch[0].ics, gb, 1))
            return -1;
        i = cpe->ch[1].ics.use_kb_window[0];
        cpe->ch[1].ics = cpe->ch[0].ics;
        cpe->ch[1].ics.use_kb_window[1] = i;
        ms_present = get_bits(gb, 2);
D
Diego Biurrun 已提交
1218
        if (ms_present == 3) {
1219 1220
            av_log(ac->avccontext, AV_LOG_ERROR, "ms_present = 3 is reserved.\n");
            return -1;
D
Diego Biurrun 已提交
1221
        } else if (ms_present)
1222 1223 1224 1225 1226 1227 1228
            decode_mid_side_stereo(cpe, gb, ms_present);
    }
    if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0)))
        return ret;
    if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0)))
        return ret;

1229 1230
    if (common_window) {
        if (ms_present)
M
Måns Rullgård 已提交
1231
            apply_mid_side_stereo(ac, cpe);
1232 1233 1234 1235 1236
        if (ac->m4ac.object_type == AOT_AAC_MAIN) {
            apply_prediction(ac, &cpe->ch[0]);
            apply_prediction(ac, &cpe->ch[1]);
        }
    }
1237

1238
    apply_intensity_stereo(cpe, ms_present);
1239 1240 1241
    return 0;
}

R
Robert Swain 已提交
1242 1243 1244 1245 1246 1247 1248
/**
 * Decode coupling_channel_element; reference: table 4.8.
 *
 * @param   elem_id Identifies the instance of a syntax element.
 *
 * @return  Returns error status. 0 - OK, !0 - error
 */
D
Diego Biurrun 已提交
1249 1250
static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
{
R
Robert Swain 已提交
1251
    int num_gain = 0;
1252
    int c, g, sfb, ret;
R
Robert Swain 已提交
1253 1254
    int sign;
    float scale;
D
Diego Biurrun 已提交
1255 1256
    SingleChannelElement *sce = &che->ch[0];
    ChannelCoupling     *coup = &che->coup;
R
Robert Swain 已提交
1257

D
Diego Biurrun 已提交
1258
    coup->coupling_point = 2 * get_bits1(gb);
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268
    coup->num_coupled = get_bits(gb, 3);
    for (c = 0; c <= coup->num_coupled; c++) {
        num_gain++;
        coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE;
        coup->id_select[c] = get_bits(gb, 4);
        if (coup->type[c] == TYPE_CPE) {
            coup->ch_select[c] = get_bits(gb, 2);
            if (coup->ch_select[c] == 3)
                num_gain++;
        } else
1269
            coup->ch_select[c] = 2;
1270
    }
D
Diego Biurrun 已提交
1271
    coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1);
1272

D
Diego Biurrun 已提交
1273
    sign  = get_bits(gb, 1);
1274
    scale = pow(2., pow(2., (int)get_bits(gb, 2) - 3));
1275 1276 1277 1278 1279

    if ((ret = decode_ics(ac, sce, gb, 0, 0)))
        return ret;

    for (c = 0; c < num_gain; c++) {
D
Diego Biurrun 已提交
1280 1281
        int idx  = 0;
        int cge  = 1;
1282 1283 1284 1285 1286
        int gain = 0;
        float gain_cache = 1.;
        if (c) {
            cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb);
            gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0;
1287
            gain_cache = pow(scale, -gain);
1288
        }
1289 1290 1291
        if (coup->coupling_point == AFTER_IMDCT) {
            coup->gain[c][0] = gain_cache;
        } else {
A
Alex Converse 已提交
1292 1293 1294 1295 1296
            for (g = 0; g < sce->ics.num_window_groups; g++) {
                for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) {
                    if (sce->band_type[idx] != ZERO_BT) {
                        if (!cge) {
                            int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
D
Diego Biurrun 已提交
1297
                            if (t) {
A
Alex Converse 已提交
1298 1299 1300 1301 1302 1303 1304
                                int s = 1;
                                t = gain += t;
                                if (sign) {
                                    s  -= 2 * (t & 0x1);
                                    t >>= 1;
                                }
                                gain_cache = pow(scale, -t) * s;
1305 1306
                            }
                        }
A
Alex Converse 已提交
1307
                        coup->gain[c][idx] = gain_cache;
1308 1309
                    }
                }
R
Robert Swain 已提交
1310 1311
            }
        }
1312 1313 1314 1315
    }
    return 0;
}

1316 1317
/**
 * Decode Spectral Band Replication extension data; reference: table 4.55.
1318 1319 1320
 *
 * @param   crc flag indicating the presence of CRC checksum
 * @param   cnt length of TYPE_FIL syntactic element in bytes
1321
 *
1322 1323
 * @return  Returns number of bytes consumed from the TYPE_FIL element.
 */
D
Diego Biurrun 已提交
1324 1325 1326
static int decode_sbr_extension(AACContext *ac, GetBitContext *gb,
                                int crc, int cnt)
{
1327
    // TODO : sbr_extension implementation
1328
    av_log_missing_feature(ac->avccontext, "SBR", 0);
D
Diego Biurrun 已提交
1329
    skip_bits_long(gb, 8 * cnt - 4); // -4 due to reading extension type
1330 1331 1332
    return cnt;
}

1333 1334 1335 1336 1337
/**
 * Parse whether channels are to be excluded from Dynamic Range Compression; reference: table 4.53.
 *
 * @return  Returns number of bytes consumed.
 */
D
Diego Biurrun 已提交
1338 1339 1340
static int decode_drc_channel_exclusions(DynamicRangeControl *che_drc,
                                         GetBitContext *gb)
{
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351
    int i;
    int num_excl_chan = 0;

    do {
        for (i = 0; i < 7; i++)
            che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb);
    } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb));

    return num_excl_chan / 7;
}

1352 1353 1354 1355 1356 1357 1358
/**
 * Decode dynamic range information; reference: table 4.52.
 *
 * @param   cnt length of TYPE_FIL syntactic element in bytes
 *
 * @return  Returns number of bytes consumed.
 */
D
Diego Biurrun 已提交
1359 1360 1361 1362
static int decode_dynamic_range(DynamicRangeControl *che_drc,
                                GetBitContext *gb, int cnt)
{
    int n             = 1;
1363 1364 1365 1366
    int drc_num_bands = 1;
    int i;

    /* pce_tag_present? */
D
Diego Biurrun 已提交
1367
    if (get_bits1(gb)) {
1368 1369 1370 1371 1372 1373
        che_drc->pce_instance_tag  = get_bits(gb, 4);
        skip_bits(gb, 4); // tag_reserved_bits
        n++;
    }

    /* excluded_chns_present? */
D
Diego Biurrun 已提交
1374
    if (get_bits1(gb)) {
1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
        n += decode_drc_channel_exclusions(che_drc, gb);
    }

    /* drc_bands_present? */
    if (get_bits1(gb)) {
        che_drc->band_incr            = get_bits(gb, 4);
        che_drc->interpolation_scheme = get_bits(gb, 4);
        n++;
        drc_num_bands += che_drc->band_incr;
        for (i = 0; i < drc_num_bands; i++) {
            che_drc->band_top[i] = get_bits(gb, 8);
            n++;
        }
    }

    /* prog_ref_level_present? */
    if (get_bits1(gb)) {
        che_drc->prog_ref_level = get_bits(gb, 7);
        skip_bits1(gb); // prog_ref_level_reserved_bits
        n++;
    }

    for (i = 0; i < drc_num_bands; i++) {
        che_drc->dyn_rng_sgn[i] = get_bits1(gb);
        che_drc->dyn_rng_ctl[i] = get_bits(gb, 7);
        n++;
    }

    return n;
}

/**
 * Decode extension data (incomplete); reference: table 4.51.
 *
 * @param   cnt length of TYPE_FIL syntactic element in bytes
 *
 * @return Returns number of bytes consumed
 */
D
Diego Biurrun 已提交
1413 1414
static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt)
{
1415 1416 1417
    int crc_flag = 0;
    int res = cnt;
    switch (get_bits(gb, 4)) { // extension type
D
Diego Biurrun 已提交
1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
    case EXT_SBR_DATA_CRC:
        crc_flag++;
    case EXT_SBR_DATA:
        res = decode_sbr_extension(ac, gb, crc_flag, cnt);
        break;
    case EXT_DYNAMIC_RANGE:
        res = decode_dynamic_range(&ac->che_drc, gb, cnt);
        break;
    case EXT_FILL:
    case EXT_FILL_DATA:
    case EXT_DATA_ELEMENT:
    default:
        skip_bits_long(gb, 8 * cnt - 4);
        break;
1432 1433 1434 1435
    };
    return res;
}

1436 1437 1438 1439 1440 1441
/**
 * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3.
 *
 * @param   decode  1 if tool is used normally, 0 if tool is used in LTP.
 * @param   coef    spectral coefficients
 */
D
Diego Biurrun 已提交
1442 1443 1444 1445
static void apply_tns(float coef[1024], TemporalNoiseShaping *tns,
                      IndividualChannelStream *ics, int decode)
{
    const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
R
Robert Swain 已提交
1446
    int w, filt, m, i;
1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
    int bottom, top, order, start, end, size, inc;
    float lpc[TNS_MAX_ORDER];

    for (w = 0; w < ics->num_windows; w++) {
        bottom = ics->num_swb;
        for (filt = 0; filt < tns->n_filt[w]; filt++) {
            top    = bottom;
            bottom = FFMAX(0, top - tns->length[w][filt]);
            order  = tns->order[w][filt];
            if (order == 0)
                continue;

1459 1460
            // tns_decode_coef
            compute_lpc_coefs(tns->coef[w][filt], order, lpc, 0, 0, 0);
1461

R
Robert Swain 已提交
1462 1463 1464 1465 1466
            start = ics->swb_offset[FFMIN(bottom, mmm)];
            end   = ics->swb_offset[FFMIN(   top, mmm)];
            if ((size = end - start) <= 0)
                continue;
            if (tns->direction[w][filt]) {
D
Diego Biurrun 已提交
1467 1468
                inc = -1;
                start = end - 1;
R
Robert Swain 已提交
1469 1470 1471 1472 1473 1474 1475 1476
            } else {
                inc = 1;
            }
            start += w * 128;

            // ar filter
            for (m = 0; m < size; m++, start += inc)
                for (i = 1; i <= FFMIN(m, order); i++)
D
Diego Biurrun 已提交
1477
                    coef[start] -= coef[start - i * inc] * lpc[i - 1];
R
Robert Swain 已提交
1478 1479 1480 1481
        }
    }
}

1482 1483 1484
/**
 * Conduct IMDCT and windowing.
 */
D
Diego Biurrun 已提交
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
{
    IndividualChannelStream *ics = &sce->ics;
    float *in    = sce->coeffs;
    float *out   = sce->ret;
    float *saved = sce->saved;
    const float *swindow      = ics->use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
    const float *lwindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
    const float *swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
    float *buf  = ac->buf_mdct;
    float *temp = ac->temp;
1496 1497
    int i;

1498
    // imdct
1499 1500 1501 1502 1503
    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
        if (ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE)
            av_log(ac->avccontext, AV_LOG_WARNING,
                   "Transition from an ONLY_LONG or LONG_STOP to an EIGHT_SHORT sequence detected. "
                   "If you heard an audible artifact, please submit the sample to the FFmpeg developers.\n");
1504 1505
        for (i = 0; i < 1024; i += 128)
            ff_imdct_half(&ac->mdct_small, buf + i, in + i);
1506
    } else
1507
        ff_imdct_half(&ac->mdct, buf, in);
1508 1509 1510 1511 1512 1513 1514 1515

    /* window overlapping
     * NOTE: To simplify the overlapping code, all 'meaningless' short to long
     * and long to short transitions are considered to be short to short
     * transitions. This leaves just two cases (long to long and short to short)
     * with a little special sauce for EIGHT_SHORT_SEQUENCE.
     */
    if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) &&
D
Diego Biurrun 已提交
1516
            (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) {
1517
        ac->dsp.vector_fmul_window(    out,               saved,            buf,         lwindow_prev, ac->add_bias, 512);
1518
    } else {
1519 1520
        for (i = 0; i < 448; i++)
            out[i] = saved[i] + ac->add_bias;
1521

1522
        if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1523 1524 1525 1526 1527 1528
            ac->dsp.vector_fmul_window(out + 448 + 0*128, saved + 448,      buf + 0*128, swindow_prev, ac->add_bias, 64);
            ac->dsp.vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow,      ac->add_bias, 64);
            ac->dsp.vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow,      ac->add_bias, 64);
            ac->dsp.vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow,      ac->add_bias, 64);
            ac->dsp.vector_fmul_window(temp,              buf + 3*128 + 64, buf + 4*128, swindow,      ac->add_bias, 64);
            memcpy(                    out + 448 + 4*128, temp, 64 * sizeof(float));
1529
        } else {
1530
            ac->dsp.vector_fmul_window(out + 448,         saved + 448,      buf,         swindow_prev, ac->add_bias, 64);
1531
            for (i = 576; i < 1024; i++)
1532
                out[i] = buf[i-512] + ac->add_bias;
1533 1534
        }
    }
1535

1536 1537
    // buffer update
    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1538 1539 1540 1541 1542 1543
        for (i = 0; i < 64; i++)
            saved[i] = temp[64 + i] - ac->add_bias;
        ac->dsp.vector_fmul_window(saved + 64,  buf + 4*128 + 64, buf + 5*128, swindow, 0, 64);
        ac->dsp.vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 0, 64);
        ac->dsp.vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 0, 64);
        memcpy(                    saved + 448, buf + 7*128 + 64,  64 * sizeof(float));
1544
    } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
1545 1546
        memcpy(                    saved,       buf + 512,        448 * sizeof(float));
        memcpy(                    saved + 448, buf + 7*128 + 64,  64 * sizeof(float));
1547
    } else { // LONG_STOP or ONLY_LONG
1548
        memcpy(                    saved,       buf + 512,        512 * sizeof(float));
1549 1550 1551
    }
}

1552 1553 1554 1555 1556
/**
 * Apply dependent channel coupling (applied before IMDCT).
 *
 * @param   index   index into coupling gain array
 */
D
Diego Biurrun 已提交
1557 1558 1559 1560 1561 1562 1563 1564
static void apply_dependent_coupling(AACContext *ac,
                                     SingleChannelElement *target,
                                     ChannelElement *cce, int index)
{
    IndividualChannelStream *ics = &cce->ch[0].ics;
    const uint16_t *offsets = ics->swb_offset;
    float *dest = target->coeffs;
    const float *src = cce->ch[0].coeffs;
1565
    int g, i, group, k, idx = 0;
D
Diego Biurrun 已提交
1566
    if (ac->m4ac.object_type == AOT_AAC_LTP) {
1567 1568 1569 1570 1571 1572
        av_log(ac->avccontext, AV_LOG_ERROR,
               "Dependent coupling is not supported together with LTP\n");
        return;
    }
    for (g = 0; g < ics->num_window_groups; g++) {
        for (i = 0; i < ics->max_sfb; i++, idx++) {
1573
            if (cce->ch[0].band_type[idx] != ZERO_BT) {
1574
                const float gain = cce->coup.gain[index][idx];
1575
                for (group = 0; group < ics->group_len[g]; group++) {
D
Diego Biurrun 已提交
1576
                    for (k = offsets[i]; k < offsets[i + 1]; k++) {
1577
                        // XXX dsputil-ize
D
Diego Biurrun 已提交
1578
                        dest[group * 128 + k] += gain * src[group * 128 + k];
1579 1580 1581 1582
                    }
                }
            }
        }
D
Diego Biurrun 已提交
1583 1584
        dest += ics->group_len[g] * 128;
        src  += ics->group_len[g] * 128;
1585 1586 1587 1588 1589 1590 1591 1592
    }
}

/**
 * Apply independent channel coupling (applied after IMDCT).
 *
 * @param   index   index into coupling gain array
 */
D
Diego Biurrun 已提交
1593 1594 1595 1596
static void apply_independent_coupling(AACContext *ac,
                                       SingleChannelElement *target,
                                       ChannelElement *cce, int index)
{
1597
    int i;
1598 1599
    const float gain = cce->coup.gain[index][0];
    const float bias = ac->add_bias;
D
Diego Biurrun 已提交
1600 1601
    const float *src = cce->ch[0].ret;
    float *dest = target->ret;
1602

1603
    for (i = 0; i < 1024; i++)
1604
        dest[i] += gain * (src[i] - bias);
1605 1606
}

R
Robert Swain 已提交
1607 1608 1609 1610 1611 1612
/**
 * channel coupling transformation interface
 *
 * @param   index   index into coupling gain array
 * @param   apply_coupling_method   pointer to (in)dependent coupling function
 */
D
Diego Biurrun 已提交
1613 1614 1615 1616
static void apply_channel_coupling(AACContext *ac, ChannelElement *cc,
                                   enum RawDataBlockType type, int elem_id,
                                   enum CouplingPoint coupling_point,
                                   void (*apply_coupling_method)(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index))
R
Robert Swain 已提交
1617
{
1618 1619 1620 1621 1622 1623 1624
    int i, c;

    for (i = 0; i < MAX_ELEM_ID; i++) {
        ChannelElement *cce = ac->che[TYPE_CCE][i];
        int index = 0;

        if (cce && cce->coup.coupling_point == coupling_point) {
D
Diego Biurrun 已提交
1625
            ChannelCoupling *coup = &cce->coup;
1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637

            for (c = 0; c <= coup->num_coupled; c++) {
                if (coup->type[c] == type && coup->id_select[c] == elem_id) {
                    if (coup->ch_select[c] != 1) {
                        apply_coupling_method(ac, &cc->ch[0], cce, index);
                        if (coup->ch_select[c] != 0)
                            index++;
                    }
                    if (coup->ch_select[c] != 2)
                        apply_coupling_method(ac, &cc->ch[1], cce, index++);
                } else
                    index += 1 + (coup->ch_select[c] == 3);
R
Robert Swain 已提交
1638 1639 1640 1641 1642 1643 1644 1645
            }
        }
    }
}

/**
 * Convert spectral data to float samples, applying all supported tools as appropriate.
 */
D
Diego Biurrun 已提交
1646 1647
static void spectral_to_sample(AACContext *ac)
{
1648
    int i, type;
D
Diego Biurrun 已提交
1649
    for (type = 3; type >= 0; type--) {
1650
        for (i = 0; i < MAX_ELEM_ID; i++) {
R
Robert Swain 已提交
1651
            ChannelElement *che = ac->che[type][i];
D
Diego Biurrun 已提交
1652 1653
            if (che) {
                if (type <= TYPE_CPE)
1654
                    apply_channel_coupling(ac, che, type, i, BEFORE_TNS, apply_dependent_coupling);
D
Diego Biurrun 已提交
1655
                if (che->ch[0].tns.present)
R
Robert Swain 已提交
1656
                    apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1);
D
Diego Biurrun 已提交
1657
                if (che->ch[1].tns.present)
R
Robert Swain 已提交
1658
                    apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1);
D
Diego Biurrun 已提交
1659
                if (type <= TYPE_CPE)
1660
                    apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling);
D
Diego Biurrun 已提交
1661
                if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT)
1662
                    imdct_and_windowing(ac, &che->ch[0]);
D
Diego Biurrun 已提交
1663
                if (type == TYPE_CPE)
R
Robert Swain 已提交
1664
                    imdct_and_windowing(ac, &che->ch[1]);
D
Diego Biurrun 已提交
1665
                if (type <= TYPE_CCE)
1666
                    apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
1667 1668 1669 1670 1671
            }
        }
    }
}

D
Diego Biurrun 已提交
1672 1673
static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
{
1674 1675 1676 1677 1678
    int size;
    AACADTSHeaderInfo hdr_info;

    size = ff_aac_parse_header(gb, &hdr_info);
    if (size > 0) {
1679
        if (ac->output_configured != OC_LOCKED && hdr_info.chan_config) {
1680 1681
            enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
            memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
1682
            ac->m4ac.chan_config = hdr_info.chan_config;
1683 1684
            if (set_default_channel_config(ac, new_che_pos, hdr_info.chan_config))
                return -7;
1685
            if (output_configure(ac, ac->che_pos, new_che_pos, hdr_info.chan_config, OC_TRIAL_FRAME))
1686
                return -7;
1687 1688
        } else if (ac->output_configured != OC_LOCKED) {
            ac->output_configured = OC_NONE;
1689
        }
1690 1691 1692
        ac->m4ac.sample_rate     = hdr_info.sample_rate;
        ac->m4ac.sampling_index  = hdr_info.sampling_index;
        ac->m4ac.object_type     = hdr_info.object_type;
A
Alex Converse 已提交
1693 1694 1695 1696
        if (hdr_info.num_aac_frames == 1) {
            if (!hdr_info.crc_absent)
                skip_bits(gb, 16);
        } else {
1697
            av_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0);
A
Alex Converse 已提交
1698 1699
            return -1;
        }
1700
    }
1701 1702 1703
    return size;
}

D
Diego Biurrun 已提交
1704 1705 1706
static int aac_decode_frame(AVCodecContext *avccontext, void *data,
                            int *data_size, AVPacket *avpkt)
{
1707 1708
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
D
Diego Biurrun 已提交
1709 1710
    AACContext *ac = avccontext->priv_data;
    ChannelElement *che = NULL;
1711 1712 1713 1714
    GetBitContext gb;
    enum RawDataBlockType elem_type;
    int err, elem_id, data_size_tmp;

D
Diego Biurrun 已提交
1715
    init_get_bits(&gb, buf, buf_size * 8);
1716

1717
    if (show_bits(&gb, 12) == 0xfff) {
1718
        if (parse_adts_frame_header(ac, &gb) < 0) {
1719 1720 1721
            av_log(avccontext, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
            return -1;
        }
1722
        if (ac->m4ac.sampling_index > 12) {
1723 1724 1725
            av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index);
            return -1;
        }
1726 1727
    }

1728 1729 1730 1731
    // parse
    while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
        elem_id = get_bits(&gb, 4);

D
Diego Biurrun 已提交
1732
        if (elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) {
1733 1734
            av_log(ac->avccontext, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id);
            return -1;
1735 1736 1737 1738 1739
        }

        switch (elem_type) {

        case TYPE_SCE:
1740
            err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
1741 1742 1743
            break;

        case TYPE_CPE:
1744
            err = decode_cpe(ac, &gb, che);
1745 1746 1747
            break;

        case TYPE_CCE:
1748
            err = decode_cce(ac, &gb, che);
1749 1750 1751
            break;

        case TYPE_LFE:
1752
            err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
1753 1754 1755 1756 1757 1758 1759
            break;

        case TYPE_DSE:
            skip_data_stream_element(&gb);
            err = 0;
            break;

D
Diego Biurrun 已提交
1760
        case TYPE_PCE: {
1761 1762
            enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
            memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
D
Diego Biurrun 已提交
1763
            if ((err = decode_pce(ac, new_che_pos, &gb)))
1764
                break;
1765
            if (ac->output_configured <= OC_TRIAL_PCE)
1766 1767 1768
                av_log(avccontext, AV_LOG_ERROR,
                       "Not evaluating a further program_config_element as this construct is dubious at best.\n");
            else
1769
                err = output_configure(ac, ac->che_pos, new_che_pos, 0, OC_TRIAL_PCE);
1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785
            break;
        }

        case TYPE_FIL:
            if (elem_id == 15)
                elem_id += get_bits(&gb, 8) - 1;
            while (elem_id > 0)
                elem_id -= decode_extension_payload(ac, &gb, elem_id);
            err = 0; /* FIXME */
            break;

        default:
            err = -1; /* should not happen, but keeps compiler happy */
            break;
        }

D
Diego Biurrun 已提交
1786
        if (err)
1787 1788 1789 1790 1791
            return err;
    }

    spectral_to_sample(ac);

1792 1793 1794
    if (!ac->is_saved) {
        ac->is_saved = 1;
        *data_size = 0;
1795
        return buf_size;
1796 1797 1798
    }

    data_size_tmp = 1024 * avccontext->channels * sizeof(int16_t);
D
Diego Biurrun 已提交
1799
    if (*data_size < data_size_tmp) {
1800 1801 1802 1803 1804 1805 1806 1807 1808
        av_log(avccontext, AV_LOG_ERROR,
               "Output buffer too small (%d) or trying to output too many samples (%d) for this frame.\n",
               *data_size, data_size_tmp);
        return -1;
    }
    *data_size = data_size_tmp;

    ac->dsp.float_to_int16_interleave(data, (const float **)ac->output_data, 1024, avccontext->channels);

1809 1810 1811
    if (ac->output_configured)
        ac->output_configured = OC_LOCKED;

1812 1813 1814
    return buf_size;
}

D
Diego Biurrun 已提交
1815 1816 1817
static av_cold int aac_decode_close(AVCodecContext *avccontext)
{
    AACContext *ac = avccontext->priv_data;
1818
    int i, type;
1819

1820
    for (i = 0; i < MAX_ELEM_ID; i++) {
D
Diego Biurrun 已提交
1821
        for (type = 0; type < 4; type++)
1822
            av_freep(&ac->che[type][i]);
1823 1824 1825 1826
    }

    ff_mdct_end(&ac->mdct);
    ff_mdct_end(&ac->mdct_small);
D
Diego Biurrun 已提交
1827
    return 0;
1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
}

AVCodec aac_decoder = {
    "aac",
    CODEC_TYPE_AUDIO,
    CODEC_ID_AAC,
    sizeof(AACContext),
    aac_decode_init,
    NULL,
    aac_decode_close,
    aac_decode_frame,
    .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"),
1840
    .sample_fmts = (const enum SampleFormat[]) {
D
Diego Biurrun 已提交
1841 1842
        SAMPLE_FMT_S16,SAMPLE_FMT_NONE
    },
1843
    .channel_layouts = aac_channel_layout,
1844
};