/*
 * Common code and tables of the AAC fixed- and floating-point decoders
 * 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
 */

/**
 * @file
 * Common code and tables of the AAC fixed- and floating-point decoders
 */

#include "aacdec_tab.h"

#include "libavcodec/aac.h"
#include "libavcodec/aacps.h"
#include "libavcodec/aactab.h"
#include "libavcodec/vlc.h"

#include "libavutil/attributes.h"
#include "libavutil/thread.h"

const int8_t ff_tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 5, 5, 16, 5, 0 };

const uint8_t ff_aac_channel_layout_map[16][16][3] = {
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, },
    { { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE  }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_FRONT }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE  }, },
    { { 0, } },
    { { 0, } },
    { { 0, } },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE  }, },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE  }, },
    {
      { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, // SCE1 = FC,
      { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, // CPE1 = FLc and FRc,
      { TYPE_CPE, 1, AAC_CHANNEL_FRONT }, // CPE2 = FL and FR,
      { TYPE_CPE, 2, AAC_CHANNEL_BACK  }, // CPE3 = SiL and SiR,
      { TYPE_CPE, 3, AAC_CHANNEL_BACK  }, // CPE4 = BL and BR,
      { TYPE_SCE, 1, AAC_CHANNEL_BACK  }, // SCE2 = BC,
      { TYPE_LFE, 0, AAC_CHANNEL_LFE   }, // LFE1 = LFE1,
      { TYPE_LFE, 1, AAC_CHANNEL_LFE   }, // LFE2 = LFE2,
      { TYPE_SCE, 2, AAC_CHANNEL_FRONT }, // SCE3 = TpFC,
      { TYPE_CPE, 4, AAC_CHANNEL_FRONT }, // CPE5 = TpFL and TpFR,
      { TYPE_CPE, 5, AAC_CHANNEL_SIDE  }, // CPE6 = TpSiL and TpSiR,
      { TYPE_SCE, 3, AAC_CHANNEL_SIDE  }, // SCE4 = TpC,
      { TYPE_CPE, 6, AAC_CHANNEL_BACK  }, // CPE7 = TpBL and TpBR,
      { TYPE_SCE, 4, AAC_CHANNEL_BACK  }, // SCE5 = TpBC,
      { TYPE_SCE, 5, AAC_CHANNEL_FRONT }, // SCE6 = BtFC,
      { TYPE_CPE, 7, AAC_CHANNEL_FRONT }, // CPE8 = BtFL and BtFR
    },
    { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, { TYPE_CPE, 2, AAC_CHANNEL_FRONT  }, },
    { { 0, } },
};

const int16_t ff_aac_channel_map[3][4][6] = {
    {
      { AV_CHAN_FRONT_CENTER,        AV_CHAN_FRONT_LEFT_OF_CENTER, AV_CHAN_FRONT_RIGHT_OF_CENTER, AV_CHAN_FRONT_LEFT,        AV_CHAN_FRONT_RIGHT,        AV_CHAN_NONE },
      { AV_CHAN_UNUSED,              AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE },
      { AV_CHAN_UNUSED,              AV_CHAN_SIDE_LEFT,            AV_CHAN_SIDE_RIGHT,            AV_CHAN_BACK_LEFT,         AV_CHAN_BACK_RIGHT,         AV_CHAN_BACK_CENTER },
      { AV_CHAN_LOW_FREQUENCY,       AV_CHAN_LOW_FREQUENCY_2,      AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE },
    },
    {
      { AV_CHAN_TOP_FRONT_CENTER,    AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_TOP_FRONT_LEFT,    AV_CHAN_TOP_FRONT_RIGHT,    AV_CHAN_NONE },
      { AV_CHAN_UNUSED,              AV_CHAN_TOP_SIDE_LEFT,        AV_CHAN_TOP_SIDE_RIGHT,        AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_TOP_CENTER},
      { AV_CHAN_UNUSED,              AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_TOP_BACK_LEFT,     AV_CHAN_TOP_BACK_RIGHT,     AV_CHAN_TOP_BACK_CENTER},
      { AV_CHAN_NONE,                AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE},
    },
    {
      { AV_CHAN_BOTTOM_FRONT_CENTER, AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_BOTTOM_FRONT_LEFT, AV_CHAN_BOTTOM_FRONT_RIGHT, AV_CHAN_NONE },
      { AV_CHAN_NONE,                AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE },
      { AV_CHAN_NONE,                AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE },
      { AV_CHAN_NONE,                AV_CHAN_NONE,                 AV_CHAN_NONE,                  AV_CHAN_NONE,              AV_CHAN_NONE,               AV_CHAN_NONE },
    },
};

const AVChannelLayout ff_aac_ch_layout[] = {
    AV_CHANNEL_LAYOUT_MONO,
    AV_CHANNEL_LAYOUT_STEREO,
    AV_CHANNEL_LAYOUT_SURROUND,
    AV_CHANNEL_LAYOUT_4POINT0,
    AV_CHANNEL_LAYOUT_5POINT0_BACK,
    AV_CHANNEL_LAYOUT_5POINT1_BACK,
    AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK,
    AV_CHANNEL_LAYOUT_6POINT1_BACK,
    AV_CHANNEL_LAYOUT_7POINT1,
    AV_CHANNEL_LAYOUT_22POINT2,
    AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK,
    { 0 },
};

VLCElem ff_vlc_scalefactors[352];
const VLCElem *ff_vlc_spectral[11];

/// Huffman tables for SBR

static const uint8_t sbr_huffman_tab[][2] = {
    /* t_huffman_env_1_5dB - 121 entries */
    {  60,   2 }, {  59,   2 }, {  61,   3 }, {  58,   3 }, {  62,   4 },
    {  57,   4 }, {  63,   5 }, {  56,   5 }, {  64,   6 }, {  55,   6 },
    {  65,   7 }, {  54,   7 }, {  66,   8 }, {  53,   8 }, {  67,   9 },
    {  52,   9 }, {  51,  10 }, {  68,  10 }, {  50,  11 }, {  69,  12 },
    {  49,  12 }, {  70,  13 }, {  48,  13 }, {  47,  13 }, {  71,  14 },
    {  46,  14 }, {  72,  14 }, {  45,  14 }, {  44,  15 }, {  73,  15 },
    {  41,  16 }, {  42,  16 }, {  43,  16 }, {  74,  16 }, {  36,  16 },
    {  40,  16 }, {  76,  16 }, {  34,  17 }, {  39,  17 }, {  75,  17 },
    {  37,  17 }, {  35,  18 }, {  38,  18 }, {   0,  18 }, {   1,  18 },
    {   2,  18 }, {   3,  18 }, {   4,  18 }, {   5,  18 }, {   6,  19 },
    {   7,  19 }, {   8,  19 }, {   9,  19 }, {  10,  19 }, {  11,  19 },
    {  12,  19 }, {  13,  19 }, {  14,  19 }, {  15,  19 }, {  16,  19 },
    {  17,  19 }, {  18,  19 }, {  19,  19 }, {  20,  19 }, {  21,  19 },
    {  22,  19 }, {  23,  19 }, {  24,  19 }, {  25,  19 }, {  26,  19 },
    {  27,  19 }, {  28,  19 }, {  29,  19 }, {  30,  19 }, {  31,  19 },
    {  32,  19 }, {  33,  19 }, {  77,  19 }, {  78,  19 }, {  79,  19 },
    {  80,  19 }, {  81,  19 }, {  82,  19 }, {  83,  19 }, {  84,  19 },
    {  85,  19 }, {  86,  19 }, {  87,  19 }, {  88,  19 }, {  89,  19 },
    {  90,  19 }, {  91,  19 }, {  92,  19 }, {  93,  19 }, {  94,  19 },
    {  95,  19 }, {  96,  19 }, {  97,  19 }, {  98,  19 }, {  99,  19 },
    { 100,  19 }, { 101,  19 }, { 102,  19 }, { 103,  19 }, { 104,  19 },
    { 105,  19 }, { 106,  19 }, { 107,  19 }, { 108,  19 }, { 109,  19 },
    { 110,  19 }, { 111,  19 }, { 112,  19 }, { 113,  19 }, { 114,  19 },
    { 115,  19 }, { 116,  19 }, { 117,  19 }, { 118,  19 }, { 119,  19 },
    { 120,  19 },
    /* f_huffman_env_1_5dB - 121 entries */
    {  60,   2 }, {  59,   2 }, {  61,   3 }, {  58,   3 }, {  57,   4 },
    {  62,   4 }, {  56,   5 }, {  63,   5 }, {  55,   6 }, {  64,   6 },
    {  54,   7 }, {  65,   8 }, {  53,   8 }, {  66,   8 }, {  52,   9 },
    {  67,   9 }, {  51,   9 }, {  68,  10 }, {  50,  10 }, {  69,  11 },
    {  49,  11 }, {  70,  11 }, {  71,  11 }, {  48,  12 }, {  72,  12 },
    {  47,  12 }, {  73,  12 }, {  74,  13 }, {  46,  13 }, {  45,  13 },
    {  75,  13 }, {  76,  14 }, {  77,  14 }, {  44,  14 }, {  43,  15 },
    {  42,  15 }, {  41,  16 }, {  78,  16 }, {  79,  16 }, {  40,  16 },
    {  39,  16 }, {  80,  17 }, {  81,  17 }, {  36,  17 }, {  37,  17 },
    {  38,  17 }, {  34,  17 }, {  32,  18 }, {  82,  18 }, {  83,  18 },
    {  85,  18 }, {  19,  18 }, {  35,  18 }, {  86,  18 }, {  87,  18 },
    {  30,  18 }, {  33,  18 }, {  84,  18 }, {  88,  18 }, { 104,  18 },
    {   9,  19 }, {  14,  19 }, {  16,  19 }, {  17,  19 }, {  23,  19 },
    {  27,  19 }, {  29,  19 }, {  31,  19 }, {  90,  19 }, {  97,  19 },
    { 102,  19 }, { 107,  19 }, { 108,  19 }, {   0,  19 }, {   1,  19 },
    {   2,  20 }, {   3,  20 }, {   4,  20 }, {   5,  20 }, {   6,  20 },
    {   7,  20 }, {   8,  20 }, {  10,  20 }, {  11,  20 }, {  12,  20 },
    {  13,  20 }, {  15,  20 }, {  18,  20 }, {  20,  20 }, {  21,  20 },
    {  22,  20 }, {  24,  20 }, {  25,  20 }, {  26,  20 }, {  28,  20 },
    {  89,  20 }, {  91,  20 }, {  92,  20 }, {  93,  20 }, {  94,  20 },
    {  95,  20 }, {  96,  20 }, {  98,  20 }, {  99,  20 }, { 100,  20 },
    { 101,  20 }, { 103,  20 }, { 105,  20 }, { 106,  20 }, { 109,  20 },
    { 110,  20 }, { 111,  20 }, { 112,  20 }, { 113,  20 }, { 114,  20 },
    { 115,  20 }, { 116,  20 }, { 117,  20 }, { 118,  20 }, { 119,  20 },
    { 120,  20 },
    /* t_huffman_env_bal_1_5dB - 49 entries */
    {  24,   1 }, {  25,   2 }, {  23,   3 }, {  26,   4 }, {  22,   5 },
    {  27,   6 }, {  21,   7 }, {  28,   8 }, {  20,   9 }, {  19,  11 },
    {  29,  11 }, {  18,  12 }, {  30,  12 }, {  31,  15 }, {  17,  16 },
    {  32,  16 }, {   0,  16 }, {   1,  16 }, {   2,  16 }, {   3,  16 },
    {   4,  16 }, {   5,  16 }, {   6,  16 }, {   7,  16 }, {   8,  16 },
    {   9,  16 }, {  10,  16 }, {  11,  16 }, {  12,  16 }, {  13,  16 },
    {  14,  16 }, {  15,  16 }, {  16,  16 }, {  33,  16 }, {  34,  16 },
    {  35,  16 }, {  36,  16 }, {  37,  16 }, {  38,  16 }, {  39,  17 },
    {  40,  17 }, {  41,  17 }, {  42,  17 }, {  43,  17 }, {  44,  17 },
    {  45,  17 }, {  46,  17 }, {  47,  17 }, {  48,  17 },
    /* f_huffman_env_bal_1_5dB - 49 entries */
    {  24,   1 }, {  23,   2 }, {  25,   3 }, {  22,   4 }, {  26,   5 },
    {  27,   6 }, {  21,   7 }, {  20,   8 }, {  28,   9 }, {  19,  11 },
    {  29,  11 }, {  18,  11 }, {  30,  12 }, {  17,  14 }, {  31,  15 },
    {  32,  16 }, {  15,  16 }, {  16,  17 }, {   0,  18 }, {   1,  18 },
    {   2,  18 }, {   3,  18 }, {   4,  18 }, {   5,  18 }, {   6,  18 },
    {   7,  18 }, {   8,  18 }, {   9,  18 }, {  10,  18 }, {  11,  18 },
    {  12,  18 }, {  13,  18 }, {  14,  18 }, {  33,  18 }, {  34,  18 },
    {  35,  18 }, {  36,  18 }, {  37,  18 }, {  38,  18 }, {  39,  18 },
    {  40,  18 }, {  41,  18 }, {  42,  18 }, {  43,  18 }, {  44,  18 },
    {  45,  18 }, {  46,  18 }, {  47,  19 }, {  48,  19 },
    /* t_huffman_env_3_0dB - 63 entries */
    {  31,   1 }, {  30,   2 }, {  32,   3 }, {  29,   4 }, {  33,   5 },
    {  28,   6 }, {  34,   7 }, {  27,   8 }, {  35,   9 }, {  26,  11 },
    {  36,  11 }, {  25,  12 }, {  24,  13 }, {  37,  13 }, {  23,  14 },
    {  38,  14 }, {  22,  14 }, {  21,  14 }, {  39,  14 }, {  40,  15 },
    {  41,  16 }, {  18,  16 }, {  20,  16 }, {  19,  16 }, {  17,  17 },
    {  42,  17 }, {  43,  18 }, {   0,  18 }, {   1,  18 }, {   2,  19 },
    {   3,  19 }, {   4,  19 }, {   5,  19 }, {   6,  19 }, {   7,  19 },
    {   8,  19 }, {   9,  19 }, {  10,  19 }, {  11,  19 }, {  12,  19 },
    {  13,  19 }, {  14,  19 }, {  15,  19 }, {  16,  19 }, {  44,  19 },
    {  45,  19 }, {  46,  19 }, {  47,  19 }, {  48,  19 }, {  49,  19 },
    {  50,  19 }, {  51,  19 }, {  52,  19 }, {  53,  19 }, {  54,  19 },
    {  55,  19 }, {  56,  19 }, {  57,  19 }, {  58,  19 }, {  59,  19 },
    {  60,  19 }, {  61,  19 }, {  62,  19 },
    /* f_huffman_env_3_0dB - 63 entries */
    {  31,   1 }, {  30,   2 }, {  32,   3 }, {  29,   4 }, {  33,   5 },
    {  28,   6 }, {  34,   8 }, {  27,   8 }, {  35,   9 }, {  26,   9 },
    {  36,  10 }, {  25,  10 }, {  37,  11 }, {  24,  11 }, {  38,  12 },
    {  23,  12 }, {  39,  13 }, {  40,  14 }, {  22,  14 }, {  21,  15 },
    {  41,  15 }, {  42,  15 }, {  20,  16 }, {  19,  16 }, {  43,  16 },
    {  44,  16 }, {  18,  17 }, {  16,  17 }, {  45,  17 }, {  46,  17 },
    {  17,  18 }, {  49,  18 }, {  13,  18 }, {   7,  18 }, {  12,  18 },
    {  47,  18 }, {  48,  18 }, {   9,  19 }, {  10,  19 }, {  15,  19 },
    {  51,  19 }, {  52,  19 }, {  53,  19 }, {  56,  19 }, {   8,  19 },
    {  11,  19 }, {  55,  19 }, {   0,  20 }, {   1,  20 }, {   2,  20 },
    {   3,  20 }, {   4,  20 }, {   5,  20 }, {   6,  20 }, {  14,  20 },
    {  50,  20 }, {  54,  20 }, {  57,  20 }, {  58,  20 }, {  59,  20 },
    {  60,  20 }, {  61,  20 }, {  62,  20 },
    /* t_huffman_env_bal_3_0dB - 25 entries */
    {  12,   1 }, {  13,   2 }, {  11,   3 }, {  10,   4 }, {  14,   5 },
    {  15,   6 }, {   9,   7 }, {   8,   8 }, {  16,   9 }, {   7,  12 },
    {   0,  13 }, {   1,  13 }, {   2,  13 }, {   3,  13 }, {   4,  13 },
    {   5,  13 }, {   6,  13 }, {  17,  13 }, {  18,  13 }, {  19,  13 },
    {  20,  13 }, {  21,  13 }, {  22,  13 }, {  23,  14 }, {  24,  14 },
    /* f_huffman_env_bal_3_0dB - 25 entries */
    {  12,   1 }, {  11,   2 }, {  13,   3 }, {  10,   4 }, {  14,   5 },
    {  15,   6 }, {   9,   7 }, {   8,   8 }, {  16,   9 }, {   7,  11 },
    {  17,  12 }, {  18,  13 }, {   0,  13 }, {   1,  13 }, {   2,  13 },
    {   3,  13 }, {   4,  13 }, {   5,  14 }, {   6,  14 }, {  19,  14 },
    {  20,  14 }, {  21,  14 }, {  22,  14 }, {  23,  14 }, {  24,  14 },
    /* t_huffman_noise_3_0dB - 63 entries */
    {  31,   1 }, {  32,   2 }, {  30,   3 }, {  29,   4 }, {  33,   5 },
    {  28,   6 }, {  34,   8 }, {  27,   8 }, {  35,  10 }, {  26,  11 },
    {  36,  13 }, {  42,  13 }, {   0,  13 }, {   1,  13 }, {   2,  13 },
    {   3,  13 }, {   4,  13 }, {   5,  13 }, {   6,  13 }, {   7,  13 },
    {   8,  13 }, {   9,  13 }, {  10,  13 }, {  11,  13 }, {  12,  13 },
    {  13,  13 }, {  14,  13 }, {  15,  13 }, {  16,  13 }, {  17,  13 },
    {  18,  13 }, {  19,  13 }, {  20,  13 }, {  21,  13 }, {  22,  13 },
    {  23,  13 }, {  24,  13 }, {  25,  13 }, {  37,  13 }, {  38,  13 },
    {  39,  13 }, {  40,  13 }, {  41,  13 }, {  43,  13 }, {  44,  13 },
    {  45,  13 }, {  46,  13 }, {  47,  13 }, {  48,  13 }, {  49,  13 },
    {  50,  13 }, {  51,  13 }, {  52,  13 }, {  53,  13 }, {  54,  13 },
    {  55,  13 }, {  56,  13 }, {  57,  13 }, {  58,  13 }, {  59,  13 },
    {  60,  13 }, {  61,  14 }, {  62,  14 },
    /* t_huffman_noise_bal_3_0dB - 25 entries */
    {  12,   1 }, {  11,   2 }, {  13,   3 }, {  10,   5 }, {  14,   6 },
    {   0,   8 }, {   1,   8 }, {   2,   8 }, {   3,   8 }, {   4,   8 },
    {   5,   8 }, {   6,   8 }, {   7,   8 }, {   8,   8 }, {   9,   8 },
    {  15,   8 }, {  16,   8 }, {  17,   8 }, {  18,   8 }, {  19,   8 },
    {  20,   8 }, {  21,   8 }, {  22,   8 }, {  23,   8 }, {  24,   8 },
};

static const uint8_t sbr_huffman_nb_codes[] = {
    121, 121, 49, 49, 63, 63, 25, 25, 63, 25
};

static const int8_t sbr_vlc_offsets[10] = {
    -60, -60, -24, -24, -31, -31, -12, -12, -31, -12
};


const VLCElem *ff_aac_sbr_vlc[10];

static av_cold void init_sbr_tables(void)
{
    static VLCElem vlc_buf[(1098 + 1092 + 768 + 1026 + 1058 +
                            1052 +  544 + 544 +  592 + 512)];
    VLCInitState state = VLC_INIT_STATE(vlc_buf);
    const uint8_t (*tab)[2] = sbr_huffman_tab;

    // SBR VLC table initialization
    for (int i = 0; i < FF_ARRAY_ELEMS(ff_aac_sbr_vlc); i++) {
        ff_aac_sbr_vlc[i] =
            ff_vlc_init_tables_from_lengths(&state, 9, sbr_huffman_nb_codes[i],
                                            &tab[0][1], 2,
                                            &tab[0][0], 2, 1,
                                            sbr_vlc_offsets[i], 0);
        tab += sbr_huffman_nb_codes[i];
    }
}

const int16_t ff_aac_hcod_firstband_CLD[30][2] = {
    {   2,   1 }, {   4,   3 }, {   6,   5 }, {   8,   7 }, {  10,   9 },
    {  12,  11 }, {  14,  13 }, {  -8,  15 }, {  -9,  16 }, { -10,  17 },
    { -18,  18 }, { -17, -19 }, { -16,  19 }, { -11, -20 }, { -15, -21 },
    {  -7,  20 }, { -22,  21 }, { -12, -14 }, { -13, -23 }, {  23,  22 },
    { -24, -31 }, {  -6,  24 }, { -25, -26 }, {  26,  25 }, {  -5, -27 },
    { -28,  27 }, {  -4,  28 }, { -29,  29 }, {  -1, -30 }, {  -2,  -3 },
};

const int16_t ff_aac_hcod1D_CLD[2 /* DT/DF */][30][2] = {
    { {  -1,   1 }, {  -2,   2 }, {  -3,   3 }, {  -4,   4 }, {  -5,   5 },
      {  -6,   6 }, {  -7,   7 }, {   9,   8 }, {  -8,  10 }, {  -9,  11 },
      { -10,  12 }, { -11,  13 }, { -12,  14 }, { -13,  15 }, { -14,  16 },
      { -15,  17 }, { -16,  18 }, { -17,  19 }, { -18,  20 }, { -19, -20 },
      { -21,  21 }, { -22,  22 }, { -23,  23 }, {  25,  24 }, { -24,  26 },
      { -25,  27 }, {  29,  28 }, { -26, -31 }, { -29, -30 }, { -27, -28 }, },
    { {  -1,   1 }, {  -2,   2 }, {  -3,   3 }, {  -4,   4 }, {  -5,   5 },
      {  -6,   6 }, {  -7,   7 }, {  -8,   8 }, {  -9,   9 }, { -10,  10 },
      { -11,  11 }, { -12,  12 }, { -13,  13 }, {  15,  14 }, { -14,  16 },
      { -15,  17 }, { -16,  18 }, { -17,  19 }, { -18,  20 }, { -19,  21 },
      { -20, -21 }, { -23,  22 }, { -22,  23 }, { -24,  24 }, { -25,  25 },
      {  27,  26 }, {  29,  28 }, { -30, -31 }, { -28, -29 }, { -26, -27 }, },
};

const int16_t ff_aac_hcod2D_CLD_03[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][15][2] = {
    { { {  -1,   1 }, { -52,   2 }, {   4,   3 }, {  -2,   5 }, { -17,   6 },
        { -18,   7 }, { -36, -51 }, {   9,   8 }, { -35,  10 }, { -34,  11 },
        { -19, -33 }, {  -3,  12 }, { -20,  13 }, { -50,  14 }, {  -4, -49 }, },
      { {  -1,   1 }, { -52,   2 }, { -17,   3 }, {   5,   4 }, { -36,   6 },
        { -33,   7 }, {  -2, -18 }, { -20,   8 }, {  10,   9 }, { -34, -49 },
        { -51,  11 }, { -35,  12 }, { -19,  13 }, {  -3,  14 }, {  -4, -50 }, }, },
    { { {  -1,   1 }, { -52,   2 }, { -17,   3 }, {   5,   4 }, {  -2, -36 },
        { -18,   6 }, {   8,   7 }, { -51,   9 }, { -33,  10 }, { -34,  11 },
        { -20, -35 }, { -19,  12 }, {  -3,  13 }, { -49,  14 }, {  -4, -50 }, },
      { {   2,   1 }, {  -1, -52 }, {   4,   3 }, {  -2,   5 }, { -51,   6 },
        { -17, -18 }, {   8,   7 }, {  10,   9 }, {  -3, -36 }, { -19,  11 },
        { -35, -50 }, { -34,  12 }, {  -4,  13 }, { -33,  14 }, { -20, -49 }, }, },
};

const int16_t ff_aac_hcod2D_CLD_05[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][35][2] = {
    { { {   2,   1 }, { -86,   3 }, {   5,   4 }, {  -1,   6 }, {   8,   7 },
        { -17, -18 }, {  -2,   9 }, { -70,  10 }, { -85,  11 }, {  13,  12 },
        { -69,  14 }, { -34,  15 }, {  17,  16 }, { -19,  18 }, { -33, -35 },
        { -54,  19 }, { -53,  20 }, {  -3,  21 }, { -68,  22 }, { -84,  23 },
        { -50,  24 }, { -52,  25 }, { -51,  26 }, { -20, -36 }, { -49,  27 },
        { -38,  28 }, { -37,  29 }, {  -4, -83 }, { -67,  30 }, { -66,  31 },
        { -21,  32 }, { -22, -65 }, {  -5,  33 }, { -82,  34 }, {  -6, -81 }, },
    { {   2,   1 }, {   4,   3 }, { -86,   5 }, {  -1,   6 }, { -17,   7 },
        { -70,   8 }, {  10,   9 }, { -18,  11 }, { -33,  12 }, { -54,  13 },
        {  -2,  14 }, { -34,  15 }, { -38,  16 }, { -49,  17 }, { -85,  18 },
        { -50,  19 }, { -69,  20 }, { -53, -65 }, { -22,  21 }, { -66,  22 },
        { -19,  23 }, { -37,  24 }, { -35, -81 }, {  -3,  25 }, { -51,  26 },
        { -68, -84 }, { -52,  27 }, {  29,  28 }, { -20,  30 }, {  -4, -36 },
        { -83,  31 }, { -67,  32 }, { -21,  33 }, {  -5,  34 }, {  -6, -82 }, }, },
    { { {   2,   1 }, { -86,   3 }, {  -1,   4 }, { -17,   5 }, {   7,   6 },
        { -70,   8 }, {  -2, -18 }, {  10,   9 }, {  12,  11 }, { -85,  13 },
        { -33,  14 }, { -34, -54 }, {  16,  15 }, { -69,  17 }, {  19,  18 },
        { -50, -53 }, { -19,  20 }, { -38,  21 }, { -35, -49 }, {  -3,  22 },
        {  24,  23 }, { -68,  25 }, { -84,  26 }, { -65,  27 }, { -51, -66 },
        { -22, -37 }, { -52,  28 }, { -20,  29 }, { -36,  30 }, { -81,  31 },
        {  -4, -83 }, { -67,  32 }, { -21,  33 }, {  -5,  34 }, {  -6, -82 }, },
      { {   2,   1 }, {   4,   3 }, { -86,   5 }, {   7,   6 }, {   9,   8 },
        {  -1,  -2 }, { -85,  10 }, { -18,  11 }, { -17,  12 }, {  14,  13 },
        { -70,  15 }, {  17,  16 }, { -19, -69 }, { -84,  18 }, {  -3,  19 },
        {  21,  20 }, { -34, -68 }, { -20,  22 }, { -35,  23 }, { -83,  24 },
        { -33,  25 }, {  -4,  26 }, { -53,  27 }, { -54, -67 }, { -36,  28 },
        { -21, -52 }, { -82,  29 }, {  -5, -50 }, { -51,  30 }, { -38,  31 },
        { -37, -49 }, {  -6,  32 }, { -66,  33 }, { -65,  34 }, { -22, -81 }, }, },
};

const int16_t ff_aac_hcod2D_CLD_07[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][63][2] = {
    { { {   2,   1 }, {   4,   3 }, {-120,   5 }, {   7,   6 }, {   9,   8 },
        {  -1,  10 }, { -18,  11 }, { -17,  12 }, {  -2,-104 }, {-119,  13 },
        {  15,  14 }, {-103,  16 }, {  18,  17 }, { -34,  19 }, { -19,  20 },
        {  22,  21 }, { -35,  23 }, { -33,  24 }, { -88,  25 }, { -87,  26 },
        {  28,  27 }, {  -3,-102 }, { -86,  29 }, { -52,-118 }, {  31,  30 },
        { -50,  32 }, { -51,  33 }, { -70,  34 }, { -36,  35 }, { -85,  36 },
        { -20,  37 }, {  39,  38 }, { -69, -71 }, { -72,  40 }, { -49, -67 },
        {  42,  41 }, { -68,  43 }, {  -4,-101 }, { -53,-117 }, { -37,  44 },
        { -66,  45 }, { -55,  46 }, {  48,  47 }, { -54,  49 }, { -21,  50 },
        { -84,-100 }, { -56, -65 }, {  52,  51 }, { -82, -83 }, {  54,  53 },
        {  -5,-116 }, { -22,  55 }, { -38,  56 }, { -39, -40 }, {  58,  57 },
        { -81,-115 }, { -98, -99 }, {  -6,  59 }, { -23,  60 }, { -24,  61 },
        {  -7, -97 }, {-114,  62 }, {  -8,-113 }, },
    { {   2,   1 }, {   4,   3 }, {   6,   5 }, {-120,   7 }, { -17,   8 },
        {  -1,-104 }, {  10,   9 }, {  12,  11 }, { -18,  13 }, { -33, -88 },
        {  15,  14 }, {  17,  16 }, {  -2,  18 }, { -34,  19 }, { -72,  20 },
        { -49,  21 }, {-119,  22 }, { -50,  23 }, {-103,  24 }, { -56,  25 },
        { -65,  26 }, {  28,  27 }, { -40, -87 }, { -66,  29 }, { -82,  30 },
        {  32,  31 }, { -19, -81 }, { -71,  33 }, { -97,  34 }, { -35, -55 },
        { -24,  35 }, {  37,  36 }, {  -3, -98 }, { -51,  38 }, { -67,  39 },
        { -39,-118 }, {-113,  40 }, {-102,  41 }, { -86,  42 }, { -70, -83 },
        {  44,  43 }, { -20, -54 }, { -52,  45 }, { -36,  46 }, {  -4,  47 },
        { -68,  48 }, { -85,  49 }, {-101,-117 }, { -69,  50 }, {  52,  51 },
        { -21, -37 }, { -53,  53 }, {  55,  54 }, {  -5,-100 }, {-116,  56 },
        { -84,  57 }, { -38,  58 }, { -22, -99 }, {-115,  59 }, {  -6,  60 },
        { -23,  61 }, {  -7,  62 }, {-114,   0 }, }, },
    { { {   2,   1 }, {-120,   3 }, {  -1,   4 }, {   6,   5 }, { -17,   7 },
        {-104,   8 }, { -18,   9 }, {  -2,  10 }, {  12,  11 }, {  14,  13 },
        {-119,  15 }, { -33,  16 }, { -34, -88 }, {-103,  17 }, {  19,  18 },
        {  21,  20 }, {  23,  22 }, {  25,  24 }, { -19, -72 }, { -50,  26 },
        { -49,  27 }, { -87,  28 }, {  30,  29 }, {  32,  31 }, {  -3, -35 },
        {  34,  33 }, { -56,  35 }, { -65, -66 }, { -40,  36 }, { -82,-118 },
        { -71,  37 }, { -55,  38 }, { -67,-102 }, { -51,  39 }, { -70,  40 },
        {  42,  41 }, { -81,  43 }, { -86,  44 }, { -52, -97 }, { -98,  45 },
        { -24, -39 }, { -20,  46 }, { -54, -83 }, { -36,  47 }, { -85,  48 },
        { -68,  49 }, {  -4,  50 }, { -69,-113 }, {-117,  51 }, { -37,-101 },
        { -53,  52 }, { -21,  53 }, {  55,  54 }, { -84,-100 }, {  -5,  56 },
        {-116,  57 }, { -22,  58 }, { -38,-115 }, {  60,  59 }, {  -6, -99 },
        { -23,  61 }, {-114,  62 }, {  -7,  -8 }, },
      { {   2,   1 }, {   4,   3 }, {-120,   5 }, {   7,   6 }, {   9,   8 },
        {  11,  10 }, {  -1,  12 }, { -18,-119 }, {  -2,  13 }, {  15,  14 },
        { -17,  16 }, {-104,  17 }, {  19,  18 }, { -19,  20 }, {-103,  21 },
        {-118,  22 }, {  24,  23 }, {  -3,  25 }, {  27,  26 }, { -34,  28 },
        {-102,  29 }, { -20,  30 }, { -35,  31 }, {  33,  32 }, {-117,  34 },
        { -33,  35 }, { -88,  36 }, {  -4,  37 }, { -87,  38 }, {  40,  39 },
        { -36,-101 }, { -86,  41 }, { -21, -37 }, { -85,-100 }, { -52,  42 },
        { -22,  43 }, {-116,  44 }, { -50 , 45 }, {  47,  46 }, {  -5, -51 },
        {-115,  48 }, { -70,  49 }, { -84,  50 }, { -38, -49 }, { -72, -99 },
        { -53,  51 }, { -69, -71 }, { -23,  52 }, {  -6, -67 }, {-114,  53 },
        {  -7,  54 }, { -66, -68 }, { -55,  55 }, {  57,  56 }, { -54, -65 },
        {  -8, -56 }, { -82, -83 }, {  59,  58 }, { -39, -40 }, { -81,  60 },
        { -98,  61 }, { -97,  62 }, { -24,-113 }, }, },
};

const int16_t ff_aac_hcod2D_CLD_09[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][99][2] = {
    { { {   2,   1 }, {   4,   3 }, {-154,   5 }, {   7,   6 }, {   9,   8 },
        {  11,  10 }, {  -1,  12 }, { -18,  13 }, { -17,  14 }, {  -2,-138 },
        {  16,  15 }, {-153,  17 }, {-137,  18 }, {  20,  19 }, {  22,  21 },
        { -34,  23 }, { -19,  24 }, { -35,  25 }, {  27,  26 }, {  29,  28 },
        {-121,  30 }, {-120,  31 }, {-136,  32 }, { -33,-122 }, {  34,  33 },
        {-152,  35 }, {  -3,  36 }, { -51,  37 }, { -52,  38 }, { -69,  39 },
        { -36,  40 }, { -50,  41 }, {  43,  42 }, { -20,  44 }, {-104,  45 },
        {-103,  46 }, { -87,  47 }, {-119,  48 }, {-105,  49 }, { -86,  50 },
        {-102,  51 }, {-106,  52 }, { -49,-135 }, { -68,  53 }, {  55,  54 },
        { -53,  56 }, { -67,-151 }, {  -4,  57 }, { -84,  58 }, { -85,  59 },
        { -66,  60 }, { -37,  61 }, { -70,  62 }, { -54, -88 }, { -21,  63 },
        {  65,  64 }, { -89,  66 }, {-118,  67 }, { -72,  68 }, { -90,  69 },
        { -71,  70 }, { -65,-134 }, {-150,  71 }, { -83,  72 }, {  -5,  73 },
        {-101,-117 }, { -82,  74 }, {  76,  75 }, { -99,  77 }, { -38,  78 },
        {-100,  79 }, { -22,  80 }, { -73,  81 }, { -39, -74 }, {  83,  82 },
        { -55, -81 }, { -57,  84 }, {-133,-149 }, { -56,  85 }, {  -6,  86 },
        { -98,  87 }, {-132,  88 }, { -23,  89 }, {-114,  90 }, {-116,  91 },
        { -58,-115 }, { -24,  92 }, { -97,-148 }, { -40, -41 }, {  -7, -42 },
        {-147,  93 }, {  95,  94 }, {-131,  96 }, {  -8,-130 }, { -25,-113 },
        {  -9,  97 }, { -26,-129 }, {-146,  98 }, { -10,-145 }, },
      { {   2,   1 }, {   4,   3 }, {   6,   5 }, {-154,   7 }, {   9,   8 },
        { -17,  10 }, {-138,  11 }, {  -1,  12 }, {  14,  13 }, {  16,  15 },
        { -33,-122 }, { -18,  17 }, {  19,  18 }, { -34,  20 }, {  -2,  21 },
        {-106,  22 }, { -49,  23 }, {  25,  24 }, { -50,  26 }, {-153,  27 },
        { -90,  28 }, {-137,  29 }, { -65,  30 }, {  32,  31 }, { -66,  33 },
        {-121,  34 }, { -74,  35 }, { -81,  36 }, {  38,  37 }, { -42,  39 },
        { -82,  40 }, {-105,  41 }, { -19,-114 }, { -58,  42 }, { -35,  43 },
        { -97,  44 }, {  46,  45 }, {-129,  47 }, { -26, -89 }, { -57, -98 },
        { -51,  48 }, {  -3,  49 }, {-113,  50 }, {-130,  51 }, {-152,  52 },
        { -67, -73 }, { -99,-136 }, {-145,  53 }, {-120,  54 }, { -41,  55 },
        { -83,  56 }, { -72,  57 }, {-104,  58 }, {-115,  59 }, { -20,  60 },
        {  62,  61 }, { -36, -88 }, { -84,  63 }, { -52, -56 }, {  65,  64 },
        {  -4, -87 }, { -68,  66 }, {-151,  67 }, {-100,-135 }, {  69,  68 },
        { -69,-119 }, {-103,  70 }, { -71,  71 }, {  73,  72 }, { -21,  74 },
        { -85,  75 }, { -37, -53 }, { -86,  76 }, {  78,  77 }, {-102,-150 },
        {  -5,  79 }, {-134,  80 }, {-118,  81 }, { -54,-117 }, {  83,  82 },
        { -38, -70 }, { -22,  84 }, {  -6,  85 }, {  87,  86 }, { -55,  88 },
        {-101,  89 }, {-133,-149 }, { -24, -39 }, {  91,  90 }, {-132,  92 },
        { -23,  93 }, {  -7,  94 }, {-147,-148 }, {-116,-131 }, { -25,  95 },
        { -40,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
    { { {   2,   1 }, {-154,   3 }, {   5,   4 }, {  -1,   6 }, {   8,   7 },
        { -17,   9 }, {-138,  10 }, { -18,  11 }, {  -2,  12 }, {  14,  13 },
        {  16,  15 }, {-153,  17 }, { -34,  18 }, { -33,-122 }, {  20,  19 },
        {  22,  21 }, {-137,  23 }, {  25,  24 }, {  27,  26 }, {-106,  28 },
        {  30,  29 }, { -50,  31 }, { -19,  32 }, { -49,-121 }, {  34,  33 },
        {  36,  35 }, { -35,  37 }, { -90,  38 }, { -66,  39 }, {  -3,  40 },
        {  42,  41 }, { -65,  43 }, {-105,  44 }, {  46,  45 }, { -74,  47 },
        { -51,  48 }, { -82,-152 }, {-136,  49 }, { -81,  50 }, { -42, -89 },
        {-114,  51 }, {  53,  52 }, { -57, -58 }, {-120,  54 }, { -98,  55 },
        { -67,  56 }, { -97,  57 }, {  59,  58 }, { -99,  60 }, { -73,-104 },
        { -72,  61 }, {-113,  62 }, { -20, -83 }, { -84,-130 }, { -36,  63 },
        { -26,  64 }, { -41,  65 }, { -52,-129 }, { -87, -88 }, {  67,  66 },
        {-115,  68 }, { -68,  69 }, { -56, -69 }, {  -4,-100 }, {-151,  70 },
        {-135,  71 }, {-103,-119 }, {  73,  72 }, { -71,-145 }, {-102,  74 },
        {  76,  75 }, { -53, -85 }, { -37,  77 }, { -21, -86 }, {  79,  78 },
        {  -5,  80 }, { -54,-134 }, {-150,  81 }, {-118,  82 }, { -70,  83 },
        {-117,  84 }, { -22, -38 }, {-101,  85 }, { -55,  86 }, {-149,  87 },
        { -39,  88 }, {-133,  89 }, {  -6,  90 }, {-116,  91 }, { -24,  92 },
        {  -7,-132 }, { -23,  93 }, { -40,  94 }, {-131,-148 }, { -25,  95 },
        {-147,  96 }, {-146,  97 }, {  -8,   0 }, {   0,   0 }, },
      { {   2,   1 }, {   4,   3 }, {   6,   5 }, {-154,   7 }, {   9,   8 },
        {  11,  10 }, {  13,  12 }, {  15,  14 }, { -18,  16 }, {-153,  17 },
        {  -1,  -2 }, {  19,  18 }, {-138,  20 }, { -17,  21 }, {  23,  22 },
        {  25,  24 }, { -19,-137 }, {  27,  26 }, {-152,  28 }, {  30,  29 },
        {  -3, -34 }, {  32,  31 }, {  34,  33 }, {  36,  35 }, {-136,  37 },
        { -35,  38 }, { -20,  39 }, {-122,  40 }, {-151,  41 }, { -33,  42 },
        {-121,  43 }, {  45,  44 }, {  47,  46 }, {  -4,  48 }, { -36,-120 },
        {-135,  49 }, {  51,  50 }, { -21,  52 }, {  54,  53 }, {  56,  55 },
        { -50,-150 }, {  58,  57 }, { -51,  59 }, {  61,  60 }, {-119,  62 },
        { -52,  63 }, {  -5,  64 }, { -37,  65 }, {-117,-134 }, { -39, -54 },
        { -22,  66 }, {-106,  67 }, { -69,-102 }, {-132,  68 }, {-105,  69 },
        { -49,  70 }, {-149,  71 }, { -24,-104 }, {  73,  72 }, { -53,  74 },
        { -38,-118 }, {-103,  75 }, {  -6,  76 }, { -66, -87 }, {-133,-147 },
        { -23,  77 }, { -67,  78 }, { -68, -86 }, { -70,-101 }, { -40,-148 },
        {-116,  79 }, { -55,  80 }, { -84,-131 }, {  82,  81 }, { -89, -90 },
        {  -7, -25 }, { -85, -88 }, { -65,  83 }, { -72,-146 }, {  85,  84 },
        {  -9, -71 }, { -83,  86 }, { -82,  87 }, {  -8,  88 }, {-100,  89 },
        { -74, -99 }, { -73,  90 }, { -10, -81 }, { -56,  91 }, { -57, -98 },
        {  93,  92 }, { -58,-114 }, { -97,-115 }, {  95,  94 }, { -41,  96 },
        { -42,  97 }, { -26,-129 }, {-113,  98 }, {-130,-145 }, },
    },
};

const int16_t ff_aac_hcod_firstband_ICC[7][2] = {
    {   2,   1 }, {  -5,   3 }, {  -4,  -6 }, {  -3,   4 }, {  -2,   5 },
    {  -1,   6 }, {  -7,  -8 },
};

const int16_t ff_aac_hcod1D_ICC[7][2] = {
    {  -1,   1 }, {  -2,   2 }, {  -3,   3 }, {  -4,   4 }, {  -5,   5 },
    {  -6,   6 }, {  -7,  -8 },
};

const int16_t ff_aac_hcod2D_ICC_01[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][3][2] = {
    { { {  -1,   1 }, { -18,   2 }, {  -2, -17 }, },
      { {  -1,   1 }, { -18,   2 }, {  -2, -17 }, }, },
    { { {  -1,   1 }, { -18,   2 }, {  -2, -17 }, },
      { {  -1,   1 }, { -18,   2 }, {  -2, -17 }, }, },
};

const int16_t ff_aac_hcod2D_ICC_03[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][15][2] = {
    { { { -52,   1 }, {  -1,   2 }, {   4,   3 }, {  -2,   5 }, { -17, -18 },
        { -51,   6 }, { -36,   7 }, {   9,   8 }, { -35,  10 }, {  -3,  11 },
        { -19, -34 }, { -33,  12 }, { -50,  13 }, { -20,  14 }, {  -4, -49 }, },
      { {   2,   1 }, {  -1, -52 }, { -17,   3 }, {   5,   4 }, { -36,   6 },
        {  -2,   7 }, { -18, -33 }, {   9,   8 }, { -20,  10 }, { -34, -51 },
        { -49,  11 }, { -35,  12 }, { -19,  13 }, {  -3,  14 }, {  -4, -50 }, }, },
    { { { -52,   1 }, {  -1,   2 }, {   4,   3 }, {  -2, -17 }, { -18,   5 },
        { -36,   6 }, { -51,   7 }, {   9,   8 }, { -33,  10 }, { -34,  11 },
        { -35,  12 }, { -19, -20 }, {  -3,  13 }, { -49,  14 }, {  -4, -50 }, },
      { {   2,   1 }, {  -1, -52 }, {  -2,   3 }, {   5,   4 }, { -51,   6 },
        { -18,   7 }, { -17,   8 }, {  -3,   9 }, { -36,  10 }, { -19, -50 },
        { -35,  11 }, {  -4,  12 }, { -34,  13 }, { -33,  14 }, { -20, -49 }, },},
};

const int16_t ff_aac_hcod2D_ICC_05[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][35][2] = {
    { { {   2,   1 }, { -86,   3 }, {  -1,   4 }, {   6,   5 }, { -18,   7 },
        {  -2, -17 }, {   9,   8 }, { -70,  10 }, { -69, -85 }, { -35,  11 },
        {  13,  12 }, { -34,  14 }, { -19,  15 }, { -53,  16 }, { -68,  17 },
        { -33,  18 }, {  -3, -52 }, {  20,  19 }, { -54,  21 }, { -84,  22 },
        { -50,  23 }, { -20, -51 }, { -36,  24 }, {  26,  25 }, { -83,  27 },
        {  -4, -38 }, { -49,  28 }, { -37,  29 }, { -67,  30 }, {  -5,  31 },
        { -21,  32 }, { -65, -66 }, { -82,  33 }, { -22,  34 }, {  -6, -81 }, },
      { {   2,   1 }, { -86,   3 }, {  -1,   4 }, { -17,   5 }, {   7,   6 },
        { -70,   8 }, { -33,   9 }, { -18,  10 }, {  -2,  11 }, { -54,  12 },
        { -49,  13 }, { -38,  14 }, { -34, -65 }, { -85,  15 }, { -50,  16 },
        { -69,  17 }, { -22,  18 }, { -53,  19 }, {  21,  20 }, { -19, -81 },
        { -66,  22 }, {  -3, -35 }, {  24,  23 }, { -37,  25 }, { -68, -84 },
        { -51,  26 }, {  28,  27 }, { -20, -52 }, {  30,  29 }, {  -4, -36 },
        { -83,  31 }, { -67,  32 }, { -82,  33 }, { -21,  34 }, {  -5,  -6 }, }, },
    { { {  -1,   1 }, { -86,   2 }, {   4,   3 }, { -17,   5 }, {  -2,   6 },
        { -18,   7 }, { -70,   8 }, { -85,   9 }, {  11,  10 }, {  13,  12 },
        { -33,  14 }, {  16,  15 }, { -34, -54 }, { -69,  17 }, { -38,  18 },
        { -50,  19 }, { -35, -53 }, { -49,  20 }, { -19,  21 }, {  -3,  22 },
        { -65,  23 }, { -68,  24 }, { -22,  25 }, { -81, -84 }, { -66,  26 },
        { -37,  27 }, { -20, -51 }, {  29,  28 }, { -52,  30 }, {  -4, -83 },
        { -36,  31 }, { -67,  32 }, {  -5,  33 }, { -82,  34 }, { -21,   0 }, },
      { {   2,   1 }, { -86,   3 }, {  -1,   4 }, {   6,   5 }, {  -2,   7 },
        { -85,   8 }, { -18,   9 }, {  11,  10 }, { -17,  12 }, {  14,  13 },
        { -70,  15 }, {  -3, -19 }, { -69,  16 }, { -84,  17 }, { -68,  18 },
        { -20, -35 }, { -34, -83 }, {  20,  19 }, {  -4,  21 }, { -33,  22 },
        {  -5,  23 }, { -53,  24 }, { -36, -52 }, { -67,  25 }, { -21, -82 },
        { -54,  26 }, {  -6,  27 }, { -51,  28 }, { -50,  29 }, { -49,  30 },
        { -37,  31 }, { -38,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
};

const int16_t ff_aac_hcod2D_ICC_07[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][63][2] = {
    { { {   2,   1 }, {  -1,-120 }, {   4,   3 }, {   6,   5 }, { -18,   7 },
        {   9,   8 }, { -17,  10 }, {  -2,  11 }, {-103,  12 }, { -52,  13 },
        { -35,-104 }, {-119,  14 }, {  16,  15 }, { -69, -86 }, {  18,  17 },
        { -34,  19 }, { -19,  20 }, {  22,  21 }, { -70,  23 }, { -87,  24 },
        {-102,  25 }, { -85,  26 }, { -33,  27 }, { -36,  28 }, {  -3,  29 },
        { -88,  30 }, { -51,  31 }, {-118,  32 }, {  34,  33 }, { -68,  35 },
        { -53,  36 }, { -67,  37 }, { -20,  38 }, {-101,  39 }, { -50,  40 },
        {  42,  41 }, { -37,  43 }, {-116,  44 }, {-117,  45 }, { -49,  46 },
        { -21,-100 }, {  48,  47 }, { -55, -71 }, {  -4,  49 }, { -22, -84 },
        {-115,  50 }, { -66, -82 }, { -72,  51 }, {  -5,  -6 }, { -54,  52 },
        { -38,  53 }, { -83,  54 }, { -40,  55 }, { -39,  56 }, { -99,  57 },
        { -23, -56 }, {  -7,  58 }, { -65, -97 }, {  -8,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {   2,   1 }, {   4,   3 }, {  -1,-120 }, {   6,   5 }, {   8,   7 },
        { -18,   9 }, {  -2,  10 }, {  12,  11 }, {  14,  13 }, { -17,-119 },
        {  16,  15 }, {-103,  17 }, {-104,  18 }, { -52,  19 }, {  21,  20 },
        { -69,  22 }, {  24,  23 }, {  -3, -35 }, { -19,  25 }, { -34, -85 },
        {  27,  26 }, { -86,  28 }, {-118,  29 }, { -37,  30 }, {  32,  31 },
        {-102,  33 }, { -20, -22 }, {  -4,-117 }, { -87,  34 }, {-100,  35 },
        { -33, -36 }, {  37,  36 }, { -70, -88 }, {-101,  38 }, {  -5,  39 },
        { -51, -53 }, { -50,  40 }, {-115,  41 }, { -21,  42 }, {-116,  43 },
        { -38,  44 }, { -23, -84 }, { -49, -99 }, {  46,  45 }, {  -6,-114 },
        {  -7, -72 }, { -71,  47 }, {  -8,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
    { { {  -1,   1 }, {-120,   2 }, {   4,   3 }, { -17,   5 }, {  -2,   6 },
        {   8,   7 }, { -18,   9 }, {-104,  10 }, {  12,  11 }, {  14,  13 },
        {  16,  15 }, {-119,  17 }, { -81,  18 }, {  20,  19 }, { -33,  21 },
        { -88,  22 }, {-103,  23 }, { -34,  24 }, { -56,  25 }, { -72,  26 },
        { -49,  27 }, { -82,  28 }, { -50,  29 }, { -65,  30 }, { -55, -87 },
        { -19,  31 }, { -67,  32 }, { -35, -40 }, {  34,  33 }, { -52, -71 },
        { -66,  35 }, { -70,  36 }, {  38,  37 }, { -51, -97 }, { -86,-102 },
        {  -3,  39 }, {-118,  40 }, {  42,  41 }, { -24, -85 }, { -54,  43 },
        { -39,  44 }, { -98,-113 }, { -36, -37 }, { -20, -69 }, {  -4,  45 },
        {  -5,  46 }, { -21,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {   2,   1 }, {   4,   3 }, {  -1,-120 }, {   6,   5 }, {   8,   7 },
        { -18,   9 }, {  -2,  10 }, {  12,  11 }, {  14,  13 }, { -17,-119 },
        {  16,  15 }, {-103,  17 }, {-104,  18 }, { -52,  19 }, {  21,  20 },
        { -69,  22 }, {  24,  23 }, {  -3, -35 }, { -19,  25 }, { -34, -85 },
        {  27,  26 }, { -86,  28 }, {-118,  29 }, { -37,  30 }, {  32,  31 },
        {-102,  33 }, { -20, -22 }, {  -4,-117 }, { -87,  34 }, {-100,  35 },
        { -33, -36 }, {  37,  36 }, { -70, -88 }, {-101,  38 }, {  -5,  39 },
        { -51, -53 }, { -50,  40 }, {-115,  41 }, { -21,  42 }, {-116,  43 },
        { -38,  44 }, { -23, -84 }, { -49, -99 }, {  46,  45 }, {  -6,-114 },
        {  -7, -72 }, { -71,  47 }, {  -8,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
};

const int16_t ff_aac_hcod_firstband_IPD[7][2] = {
    {  -1,   1 }, {  -8,   2 }, {  -2,   3 }, {   5,   4 }, {  -7,   6 },
    {  -3,  -5 }, {  -4,  -6 },
};

const int16_t ff_aac_hcod1D_IPD[2 /* DT, DF */ ][7][2] = {
    { {  -1,   1 }, {  -2,   2 }, {  -8,   3 }, {  -3,   4 }, {  -7,   5 },
      {  -4,   6 }, {  -5,  -6 }, }, /* DT */
    { {  -1,   1 }, {  -8,   2 }, {  -2,   3 }, {   5,   4 }, {  -3,  -7 },
      {  -6,   6 }, {  -4,  -5 }, }, /* DF */
};

const int16_t ff_aac_hcod2D_IPD_01[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][3][2] = {
    { { {  -1,   1 }, { -18,   2 }, { -17,   0 }, },
      { {  -1,   1 }, { -18,   2 }, { -17,   0 }, }, },
    { { {  -1,   1 }, { -18,   2 }, { -17,   0 }, },
      { {  -1,   1 }, { -18,   2 }, { -17,   0 }, }, },
};

const int16_t ff_aac_hcod2D_IPD_03[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][15][2] = {
    { { {  -1,   1 }, {   3,   2 }, { -18,   4 }, { -52,   5 }, { -34, -36 },
        { -35,   6 }, { -17,   7 }, { -33,   8 }, { -20,   9 }, { -49,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {  -1,   1 }, { -36,   2 }, { -18,   3 }, { -35,   4 }, { -52,   5 },
        {   7,   6 }, { -34,   8 }, { -33, -49 }, { -20,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
    { { {  -1,   1 }, {   3,   2 }, { -18,   4 }, { -52,   5 }, { -34, -36 },
        { -35,   6 }, { -17,   7 }, { -33,   8 }, { -20,   9 }, { -49,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {  -1,   1 }, { -36,   2 }, { -18,   3 }, { -35,   4 }, { -52,   5 },
        {   7,   6 }, { -34,   8 }, { -33, -49 }, { -20,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
};

const int16_t ff_aac_hcod2D_IPD_05[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][35][2] = {
    { { {  -1,   1 }, {   3,   2 }, { -52,   4 }, { -86,   5 }, { -35,   6 },
        { -53,   7 }, { -70,   8 }, { -17,   9 }, { -37,  10 }, {  12,  11 },
        { -38, -66 }, { -18,  13 }, { -51,  14 }, {  16,  15 }, { -34, -69 },
        {  18,  17 }, { -54, -65 }, { -50,  19 }, { -33, -49 }, { -22,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {  -1,   1 }, {   3,   2 }, {   5,   4 }, { -86,   6 }, { -66,   7 },
        {   9,   8 }, {  11,  10 }, { -18,  12 }, { -51,  13 }, { -37, -52 },
        { -69,  14 }, { -38,  15 }, { -53,  16 }, { -35,  17 }, { -50, -70 },
        { -22, -49 }, { -33,  18 }, { -17,  19 }, { -34, -65 }, { -81,  20 },
        { -54,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
    { { {  -1,   1 }, {   3,   2 }, { -52,   4 }, { -86,   5 }, { -35,   6 },
        { -53,   7 }, { -70,   8 }, { -17,   9 }, { -37,  10 }, {  12,  11 },
        { -38, -66 }, { -18,  13 }, { -51,  14 }, {  16,  15 }, { -34, -69 },
        {  18,  17 }, { -54, -65 }, { -50,  19 }, { -33, -49 }, { -22,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {  -1,   1 }, {   3,   2 }, {   5,   4 }, { -86,   6 }, { -66,   7 },
        {   9,   8 }, {  11,  10 }, { -18,  12 }, { -51,  13 }, { -37, -52 },
        { -69,  14 }, { -38,  15 }, { -53,  16 }, { -35,  17 }, { -50, -70 },
        { -22, -49 }, { -33,  18 }, { -17,  19 }, { -34, -65 }, { -81,  20 },
        { -54,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
};

const int16_t ff_aac_hcod2D_IPD_07[2 /* _TP/_FP */ ][2 /* DT_/DF_ */ ][63][2] = {
    { { {  -1,   1 }, { -69,   2 }, {   4,   3 }, {-120,   5 }, {   7,   6 },
        {-113,   8 }, { -68,   9 }, {  11,  10 }, { -17,  12 }, { -52,  13 },
        { -24,  14 }, { -18,  15 }, {  17,  16 }, {-104,  18 }, {  20,  19 },
        { -54, -70 }, {  22,  21 }, {  24,  23 }, { -86, -97 }, {-103,  25 },
        { -83,  26 }, { -35,  27 }, { -34, -98 }, { -40,  28 }, { -39, -67 },
        {  30,  29 }, { -33, -51 }, { -87,  31 }, { -88,  32 }, { -82,  33 },
        { -55, -81 }, { -56, -71 }, { -72,  34 }, { -50, -66 }, { -65,  35 },
        { -49,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {   2,   1 }, {   4,   3 }, {  -1,   5 }, { -69,   6 }, {-120,   7 },
        { -68,   8 }, {  10,   9 }, {  12,  11 }, {  14,  13 }, { -52, -54 },
        { -18,  15 }, { -70,  16 }, { -67,  17 }, {  19,  18 }, { -17,  20 },
        {-113,  21 }, {  23,  22 }, { -83,  24 }, { -24,  25 }, {-103,-104 },
        { -51, -55 }, {  27,  26 }, { -71,  28 }, { -86,  29 }, { -35,  30 },
        { -66,  31 }, { -39, -50 }, { -82, -98 }, { -72,  32 }, { -56, -87 },
        { -34,  33 }, { -33, -88 }, { -40, -97 }, { -65,  34 }, { -49,  35 },
        { -81,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
    { { {  -1,   1 }, { -69,   2 }, {   4,   3 }, {-120,   5 }, {   7,   6 },
        {-113,   8 }, { -68,   9 }, {  11,  10 }, { -17,  12 }, { -52,  13 },
        { -24,  14 }, { -18,  15 }, {  17,  16 }, {-104,  18 }, {  20,  19 },
        { -54, -70 }, {  22,  21 }, {  24,  23 }, { -86, -97 }, {-103,  25 },
        { -83,  26 }, { -35,  27 }, { -34, -98 }, { -40,  28 }, { -39, -67 },
        {  30,  29 }, { -33, -51 }, { -87,  31 }, { -88,  32 }, { -82,  33 },
        { -55, -81 }, { -56, -71 }, { -72,  34 }, { -50, -66 }, { -65,  35 },
        { -49,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, },
      { {   2,   1 }, {   4,   3 }, {  -1,   5 }, { -69,   6 }, {-120,   7 },
        { -68,   8 }, {  10,   9 }, {  12,  11 }, {  14,  13 }, { -52, -54 },
        { -18,  15 }, { -70,  16 }, { -67,  17 }, {  19,  18 }, { -17,  20 },
        {-113,  21 }, {  23,  22 }, { -83,  24 }, { -24,  25 }, {-103,-104 },
        { -51, -55 }, {  27,  26 }, { -71,  28 }, { -86,  29 }, { -35,  30 },
        { -66,  31 }, { -39, -50 }, { -82, -98 }, { -72,  32 }, { -56, -87 },
        { -34,  33 }, { -33, -88 }, { -40, -97 }, { -65,  34 }, { -49,  35 },
        { -81,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 }, {   0,   0 },
        {   0,   0 }, {   0,   0 }, {   0,   0 }, }, },
};

const int16_t ff_aac_hcod_lav_idx[3][2] = {
    {  -1,   1 }, {  -2,   2 }, {  -3,  -4 },
};

const int16_t ff_aac_hcod2D_reshape[39][2] = {
    {   2,   1 }, {   4,   3 }, {   6,   5 }, { -33,   7 }, { -17,   8 },
    { -49,   9 }, { -34,  10 }, {  12,  11 }, { -18, -35 }, { -50,  13 },
    {  15,  14 }, { -40,  16 }, { -36,  17 }, { -19,  18 }, {  -1, -37 },
    { -51,  19 }, {  21,  20 }, { -38, -65 }, {  -2, -39 }, { -20,  22 },
    { -52,  23 }, {  25,  24 }, { -21,  26 }, { -66,  27 }, { -53,  28 },
    {  -3,  29 }, {  31,  30 }, { -22,  32 }, { -54,  33 }, {  -4,  34 },
    { -56,  35 }, { -24, -67 }, { -23, -55 }, {  -8, -72 }, {  -5,  36 },
    { -68,  37 }, {  -6,  38 }, {  -7, -69 }, { -70, -71 },
};

const uint8_t ff_aac_lav_tab_XXX[3][4] = {
    { 3, 5, 7, 9 }, { 1, 3, 5, 7 }, { 7, 1, 3, 5 }
};

static av_cold void init_base_tables(void)
{
    static VLCElem vlc_buf[(304 + 270 + 550 + 300 + 328 +
                            294 + 306 + 268 + 510 + 366 + 462)];
    VLCInitState state = VLC_INIT_STATE(vlc_buf);

    for (unsigned i = 0; i < 11; i++) {
#define TAB_WRAP_SIZE(name) name[i], sizeof(name[i][0]), sizeof(name[i][0])
        ff_vlc_spectral[i] =
            ff_vlc_init_tables_sparse(&state, 8, ff_aac_spectral_sizes[i],
                                      TAB_WRAP_SIZE(ff_aac_spectral_bits),
                                      TAB_WRAP_SIZE(ff_aac_spectral_codes),
                                      TAB_WRAP_SIZE(ff_aac_codebook_vector_idx),
                                      0);
    }

    VLC_INIT_STATIC_TABLE(ff_vlc_scalefactors, 7,
                          FF_ARRAY_ELEMS(ff_aac_scalefactor_code),
                          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]), 0);
}

static av_cold void aacdec_common_init(void)
{
    init_base_tables();
    init_sbr_tables();
    ff_ps_init_common();
}

av_cold void ff_aacdec_common_init_once(void)
{
    static AVOnce init_static_once = AV_ONCE_INIT;
    ff_thread_once(&init_static_once, aacdec_common_init);
}
