1/* 2 * QDM2 compatible decoder 3 * Copyright (c) 2003 Ewald Snel 4 * Copyright (c) 2005 Benjamin Larsson 5 * Copyright (c) 2005 Alex Beregszaszi 6 * Copyright (c) 2005 Roberto Togni 7 * 8 * This file is part of Libav. 9 * 10 * Libav is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 14 * 15 * Libav is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more details. 19 * 20 * You should have received a copy of the GNU Lesser General Public 21 * License along with Libav; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23 */ 24 25 /** 26 * @file 27 * Various QDM2 tables. 28 */ 29 30#ifndef AVCODEC_QDM2DATA_H 31#define AVCODEC_QDM2DATA_H 32 33#include <stdint.h> 34 35/** VLC TABLES **/ 36 37/* values in this table range from -1..23; adjust retrieved value by -1 */ 38static const uint16_t vlc_tab_level_huffcodes[24] = { 39 0x037c, 0x0004, 0x003c, 0x004c, 0x003a, 0x002c, 0x001c, 0x001a, 40 0x0024, 0x0014, 0x0001, 0x0002, 0x0000, 0x0003, 0x0007, 0x0005, 41 0x0006, 0x0008, 0x0009, 0x000a, 0x000c, 0x00fc, 0x007c, 0x017c 42}; 43 44static const uint8_t vlc_tab_level_huffbits[24] = { 45 10, 6, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 4, 3, 3, 3, 3, 4, 4, 5, 7, 8, 9, 10 46}; 47 48/* values in this table range from -1..36; adjust retrieved value by -1 */ 49static const uint16_t vlc_tab_diff_huffcodes[37] = { 50 0x1c57, 0x0004, 0x0000, 0x0001, 0x0003, 0x0002, 0x000f, 0x000e, 51 0x0007, 0x0016, 0x0037, 0x0027, 0x0026, 0x0066, 0x0006, 0x0097, 52 0x0046, 0x01c6, 0x0017, 0x0786, 0x0086, 0x0257, 0x00d7, 0x0357, 53 0x00c6, 0x0386, 0x0186, 0x0000, 0x0157, 0x0c57, 0x0057, 0x0000, 54 0x0b86, 0x0000, 0x1457, 0x0000, 0x0457 55}; 56 57static const uint8_t vlc_tab_diff_huffbits[37] = { 58 13, 3, 3, 2, 3, 3, 4, 4, 6, 5, 6, 6, 7, 7, 8, 8, 59 8, 9, 8, 11, 9, 10, 8, 10, 9, 12, 10, 0, 10, 13, 11, 0, 60 12, 0, 13, 0, 13 61}; 62 63/* values in this table range from -1..5; adjust retrieved value by -1 */ 64static const uint8_t vlc_tab_run_huffcodes[6] = { 65 0x1f, 0x00, 0x01, 0x03, 0x07, 0x0f 66}; 67 68static const uint8_t vlc_tab_run_huffbits[6] = { 69 5, 1, 2, 3, 4, 5 70}; 71 72/* values in this table range from -1..19; adjust retrieved value by -1 */ 73static const uint16_t vlc_tab_tone_level_idx_hi1_huffcodes[20] = { 74 0x5714, 0x000c, 0x0002, 0x0001, 0x0000, 0x0004, 0x0034, 0x0054, 75 0x0094, 0x0014, 0x0114, 0x0214, 0x0314, 0x0614, 0x0e14, 0x0f14, 76 0x2714, 0x0714, 0x1714, 0x3714 77}; 78 79static const uint8_t vlc_tab_tone_level_idx_hi1_huffbits[20] = { 80 15, 4, 2, 1, 3, 5, 6, 7, 8, 10, 10, 11, 11, 12, 12, 12, 14, 14, 15, 14 81}; 82 83/* values in this table range from -1..23; adjust retrieved value by -1 */ 84static const uint16_t vlc_tab_tone_level_idx_mid_huffcodes[24] = { 85 0x0fea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 86 0x0000, 0x0000, 0x0000, 0x0000, 0x03ea, 0x00ea, 0x002a, 0x001a, 87 0x0006, 0x0001, 0x0000, 0x0002, 0x000a, 0x006a, 0x01ea, 0x07ea 88}; 89 90static const uint8_t vlc_tab_tone_level_idx_mid_huffbits[24] = { 91 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 9, 7, 5, 3, 1, 2, 4, 6, 8, 10, 12 92}; 93 94/* values in this table range from -1..23; adjust retrieved value by -1 */ 95static const uint16_t vlc_tab_tone_level_idx_hi2_huffcodes[24] = { 96 0x0664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0064, 0x00e4, 97 0x00a4, 0x0068, 0x0004, 0x0008, 0x0014, 0x0018, 0x0000, 0x0001, 98 0x0002, 0x0003, 0x000c, 0x0028, 0x0024, 0x0164, 0x0000, 0x0264 99}; 100 101static const uint8_t vlc_tab_tone_level_idx_hi2_huffbits[24] = { 102 11, 0, 0, 0, 0, 0, 10, 8, 8, 7, 6, 6, 5, 5, 4, 2, 2, 2, 4, 7, 8, 9, 0, 11 103}; 104 105/* values in this table range from -1..8; adjust retrieved value by -1 */ 106static const uint8_t vlc_tab_type30_huffcodes[9] = { 107 0x3c, 0x06, 0x00, 0x01, 0x03, 0x02, 0x04, 0x0c, 0x1c 108}; 109 110static const uint8_t vlc_tab_type30_huffbits[9] = { 111 6, 3, 3, 2, 2, 3, 4, 5, 6 112}; 113 114/* values in this table range from -1..9; adjust retrieved value by -1 */ 115static const uint8_t vlc_tab_type34_huffcodes[10] = { 116 0x18, 0x00, 0x01, 0x04, 0x05, 0x07, 0x03, 0x02, 0x06, 0x08 117}; 118 119static const uint8_t vlc_tab_type34_huffbits[10] = { 120 5, 4, 3, 3, 3, 3, 3, 3, 3, 5 121}; 122 123/* values in this table range from -1..22; adjust retrieved value by -1 */ 124static const uint16_t vlc_tab_fft_tone_offset_0_huffcodes[23] = { 125 0x038e, 0x0001, 0x0000, 0x0022, 0x000a, 0x0006, 0x0012, 0x0002, 126 0x001e, 0x003e, 0x0056, 0x0016, 0x000e, 0x0032, 0x0072, 0x0042, 127 0x008e, 0x004e, 0x00f2, 0x002e, 0x0036, 0x00c2, 0x018e 128}; 129 130static const uint8_t vlc_tab_fft_tone_offset_0_huffbits[23] = { 131 10, 1, 2, 6, 4, 5, 6, 7, 6, 6, 7, 7, 8, 7, 8, 8, 9, 7, 8, 6, 6, 8, 10 132}; 133 134/* values in this table range from -1..27; adjust retrieved value by -1 */ 135static const uint16_t vlc_tab_fft_tone_offset_1_huffcodes[28] = { 136 0x07a4, 0x0001, 0x0020, 0x0012, 0x001c, 0x0008, 0x0006, 0x0010, 137 0x0000, 0x0014, 0x0004, 0x0032, 0x0070, 0x000c, 0x0002, 0x003a, 138 0x001a, 0x002c, 0x002a, 0x0022, 0x0024, 0x000a, 0x0064, 0x0030, 139 0x0062, 0x00a4, 0x01a4, 0x03a4 140}; 141 142static const uint8_t vlc_tab_fft_tone_offset_1_huffbits[28] = { 143 11, 1, 6, 6, 5, 4, 3, 6, 6, 5, 6, 6, 7, 6, 6, 6, 144 6, 6, 6, 7, 8, 6, 7, 7, 7, 9, 10, 11 145}; 146 147/* values in this table range from -1..31; adjust retrieved value by -1 */ 148static const uint16_t vlc_tab_fft_tone_offset_2_huffcodes[32] = { 149 0x1760, 0x0001, 0x0000, 0x0082, 0x000c, 0x0006, 0x0003, 0x0007, 150 0x0008, 0x0004, 0x0010, 0x0012, 0x0022, 0x001a, 0x0000, 0x0020, 151 0x000a, 0x0040, 0x004a, 0x006a, 0x002a, 0x0042, 0x0002, 0x0060, 152 0x00aa, 0x00e0, 0x00c2, 0x01c2, 0x0160, 0x0360, 0x0760, 0x0f60 153}; 154 155static const uint8_t vlc_tab_fft_tone_offset_2_huffbits[32] = { 156 13, 2, 0, 8, 4, 3, 3, 3, 4, 4, 5, 5, 6, 5, 7, 7, 157 7, 7, 7, 7, 8, 8, 8, 9, 8, 8, 9, 9, 10, 11, 13, 12 158}; 159 160/* values in this table range from -1..34; adjust retrieved value by -1 */ 161static const uint16_t vlc_tab_fft_tone_offset_3_huffcodes[35] = { 162 0x33ea, 0x0005, 0x0000, 0x000c, 0x0000, 0x0006, 0x0003, 0x0008, 163 0x0002, 0x0001, 0x0004, 0x0007, 0x001a, 0x000f, 0x001c, 0x002c, 164 0x000a, 0x001d, 0x002d, 0x002a, 0x000d, 0x004c, 0x008c, 0x006a, 165 0x00cd, 0x004d, 0x00ea, 0x020c, 0x030c, 0x010c, 0x01ea, 0x07ea, 166 0x0bea, 0x03ea, 0x13ea 167}; 168 169static const uint8_t vlc_tab_fft_tone_offset_3_huffbits[35] = { 170 14, 4, 0, 10, 4, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6, 171 6, 5, 6, 7, 7, 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 11, 172 12, 13, 14 173}; 174 175/* values in this table range from -1..37; adjust retrieved value by -1 */ 176static const uint16_t vlc_tab_fft_tone_offset_4_huffcodes[38] = { 177 0x5282, 0x0016, 0x0000, 0x0136, 0x0004, 0x0000, 0x0007, 0x000a, 178 0x000e, 0x0003, 0x0001, 0x000d, 0x0006, 0x0009, 0x0012, 0x0005, 179 0x0025, 0x0022, 0x0015, 0x0002, 0x0076, 0x0035, 0x0042, 0x00c2, 180 0x0182, 0x00b6, 0x0036, 0x03c2, 0x0482, 0x01c2, 0x0682, 0x0882, 181 0x0a82, 0x0082, 0x0282, 0x1282, 0x3282, 0x2282 182}; 183 184static const uint8_t vlc_tab_fft_tone_offset_4_huffbits[38] = { 185 15, 6, 0, 9, 3, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6, 186 6, 6, 6, 8, 7, 6, 8, 9, 9, 8, 9, 10, 11, 10, 11, 12, 187 12, 12, 14, 15, 14, 14 188}; 189 190/** FFT TABLES **/ 191 192/* values in this table range from -1..27; adjust retrieved value by -1 */ 193static const uint16_t fft_level_exp_alt_huffcodes[28] = { 194 0x1ec6, 0x0006, 0x00c2, 0x0142, 0x0242, 0x0246, 0x00c6, 0x0046, 195 0x0042, 0x0146, 0x00a2, 0x0062, 0x0026, 0x0016, 0x000e, 0x0005, 196 0x0004, 0x0003, 0x0000, 0x0001, 0x000a, 0x0012, 0x0002, 0x0022, 197 0x01c6, 0x02c6, 0x06c6, 0x0ec6 198}; 199 200static const uint8_t fft_level_exp_alt_huffbits[28] = { 201 13, 7, 8, 9, 10, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, 3, 202 3, 2, 3, 3, 4, 5, 7, 8, 9, 11, 12, 13 203}; 204 205/* values in this table range from -1..19; adjust retrieved value by -1 */ 206static const uint16_t fft_level_exp_huffcodes[20] = { 207 0x0f24, 0x0001, 0x0002, 0x0000, 0x0006, 0x0005, 0x0007, 0x000c, 208 0x000b, 0x0014, 0x0013, 0x0004, 0x0003, 0x0023, 0x0064, 0x00a4, 209 0x0024, 0x0124, 0x0324, 0x0724 210}; 211 212static const uint8_t fft_level_exp_huffbits[20] = { 213 12, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 9, 10, 11, 12 214}; 215 216/* values in this table range from -1..6; adjust retrieved value by -1 */ 217static const uint8_t fft_stereo_exp_huffcodes[7] = { 218 0x3e, 0x01, 0x00, 0x02, 0x06, 0x0e, 0x1e 219}; 220 221static const uint8_t fft_stereo_exp_huffbits[7] = { 222 6, 1, 2, 3, 4, 5, 6 223}; 224 225/* values in this table range from -1..8; adjust retrieved value by -1 */ 226static const uint8_t fft_stereo_phase_huffcodes[9] = { 227 0x35, 0x02, 0x00, 0x01, 0x0d, 0x15, 0x05, 0x09, 0x03 228}; 229 230static const uint8_t fft_stereo_phase_huffbits[9] = { 231 6, 2, 2, 4, 4, 6, 5, 4, 2 232}; 233 234static const int fft_cutoff_index_table[4][2] = { 235 { 1, 2 }, {-1, 0 }, {-1,-2 }, { 0, 0 } 236}; 237 238static const int16_t fft_level_index_table[256] = { 239 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 240 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 241 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 242 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 243 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 244 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 245 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 246 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 247 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 248 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 249 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 250 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 251 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 252 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 253 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 254 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 255}; 256 257static const uint8_t last_coeff[3] = { 258 4, 7, 10 259}; 260 261static const uint8_t coeff_per_sb_for_avg[3][30] = { 262 { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, 263 { 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, 264 { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9 } 265}; 266 267static const uint32_t dequant_table[3][10][30] = { 268 { { 256, 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 }, 269 { 0, 256, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 270 { 0, 0, 0, 51, 102, 154, 205, 256, 238, 219, 201, 183, 165, 146, 128, 110, 91, 73, 55, 37, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 271 { 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 55, 73, 91, 110, 128, 146, 165, 183, 201, 219, 238, 256, 228, 199, 171, 142, 114, 85, 57, 28 }, 272 { 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 }, 273 { 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 }, 274 { 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 }, 275 { 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 }, 276 { 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 }, 277 { 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 } }, 278 { { 256, 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 }, 279 { 0, 256, 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 }, 280 { 0, 0, 256, 171, 85, 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 }, 281 { 0, 0, 0, 85, 171, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 282 { 0, 0, 0, 0, 0, 0, 85, 171, 256, 219, 183, 146, 110, 73, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 283 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 73, 110, 146, 183, 219, 256, 228, 199, 171, 142, 114, 85, 57, 28, 0, 0, 0, 0, 0, 0 }, 284 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 57, 85, 114, 142, 171, 199, 228, 256, 213, 171, 128, 85, 43 }, 285 { 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 }, 286 { 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 }, 287 { 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 } }, 288 { { 256, 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 }, 289 { 0, 256, 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 }, 290 { 0, 0, 256, 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 }, 291 { 0, 0, 0, 256, 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 }, 292 { 0, 0, 0, 0, 256, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 293 { 0, 0, 0, 0, 0, 0, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 294 { 0, 0, 0, 0, 0, 0, 0, 85, 171, 256, 192, 128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 295 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 128, 192, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 296 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 102, 154, 205, 256, 213, 171, 128, 85, 43, 0, 0, 0, 0, 0, 0 }, 297 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 85, 128, 171, 213, 256, 213, 171, 128, 85, 43 } } 298}; 299 300static const uint8_t coeff_per_sb_for_dequant[3][30] = { 301 { 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, 302 { 0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 }, 303 { 0, 1, 2, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9 } 304}; 305 306/* first index is subband, 2nd index is 0, 1 or 3 (2 is unused) */ 307static const int8_t tone_level_idx_offset_table[30][4] = { 308 { -50, -50, 0, -50 }, 309 { -50, -50, 0, -50 }, 310 { -50, -9, 0, -19 }, 311 { -16, -6, 0, -12 }, 312 { -11, -4, 0, -8 }, 313 { -8, -3, 0, -6 }, 314 { -7, -3, 0, -5 }, 315 { -6, -2, 0, -4 }, 316 { -5, -2, 0, -3 }, 317 { -4, -1, 0, -3 }, 318 { -4, -1, 0, -2 }, 319 { -3, -1, 0, -2 }, 320 { -3, -1, 0, -2 }, 321 { -3, -1, 0, -2 }, 322 { -2, -1, 0, -1 }, 323 { -2, -1, 0, -1 }, 324 { -2, -1, 0, -1 }, 325 { -2, 0, 0, -1 }, 326 { -2, 0, 0, -1 }, 327 { -1, 0, 0, -1 }, 328 { -1, 0, 0, -1 }, 329 { -1, 0, 0, -1 }, 330 { -1, 0, 0, -1 }, 331 { -1, 0, 0, -1 }, 332 { -1, 0, 0, -1 }, 333 { -1, 0, 0, -1 }, 334 { -1, 0, 0, 0 }, 335 { -1, 0, 0, 0 }, 336 { -1, 0, 0, 0 }, 337 { -1, 0, 0, 0 } 338}; 339 340/* all my samples have 1st index 0 or 1 */ 341/* second index is subband, only indexes 0-29 seem to be used */ 342static const int8_t coding_method_table[5][30] = { 343 { 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10, 344 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 345 }, 346 { 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10, 347 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 348 }, 349 { 34, 30, 30, 30, 24, 24, 16, 16, 16, 16, 16, 16, 10, 10, 10, 350 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 351 }, 352 { 34, 34, 30, 30, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16, 353 16, 16, 16, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10, 10 354 }, 355 { 34, 34, 30, 30, 30, 30, 30, 30, 24, 24, 24, 24, 24, 24, 24, 356 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 357 }, 358}; 359 360static const int vlc_stage3_values[60] = { 361 0, 1, 2, 3, 4, 6, 8, 10, 12, 16, 20, 24, 362 28, 36, 44, 52, 60, 76, 92, 108, 124, 156, 188, 220, 363 252, 316, 380, 444, 508, 636, 764, 892, 1020, 1276, 1532, 1788, 364 2044, 2556, 3068, 3580, 4092, 5116, 6140, 7164, 8188, 10236, 12284, 14332, 365 16380, 20476, 24572, 28668, 32764, 40956, 49148, 57340, 65532, 81916, 98300,114684 366}; 367 368static const float fft_tone_sample_table[4][16][5] = { 369 { { .0100000000f,-.0037037037f,-.0020000000f,-.0069444444f,-.0018416207f }, 370 { .0416666667f, .0000000000f, .0000000000f,-.0208333333f,-.0123456791f }, 371 { .1250000000f, .0558035709f, .0330687836f,-.0164473690f,-.0097465888f }, 372 { .1562500000f, .0625000000f, .0370370370f,-.0062500000f,-.0037037037f }, 373 { .1996007860f, .0781250000f, .0462962948f, .0022727272f, .0013468013f }, 374 { .2000000000f, .0625000000f, .0370370373f, .0208333333f, .0074074073f }, 375 { .2127659619f, .0555555556f, .0329218097f, .0208333333f, .0123456791f }, 376 { .2173913121f, .0473484844f, .0280583613f, .0347222239f, .0205761325f }, 377 { .2173913121f, .0347222239f, .0205761325f, .0473484844f, .0280583613f }, 378 { .2127659619f, .0208333333f, .0123456791f, .0555555556f, .0329218097f }, 379 { .2000000000f, .0208333333f, .0074074073f, .0625000000f, .0370370370f }, 380 { .1996007860f, .0022727272f, .0013468013f, .0781250000f, .0462962948f }, 381 { .1562500000f,-.0062500000f,-.0037037037f, .0625000000f, .0370370370f }, 382 { .1250000000f,-.0164473690f,-.0097465888f, .0558035709f, .0330687836f }, 383 { .0416666667f,-.0208333333f,-.0123456791f, .0000000000f, .0000000000f }, 384 { .0100000000f,-.0069444444f,-.0018416207f,-.0037037037f,-.0020000000f } }, 385 386 { { .0050000000f,-.0200000000f, .0125000000f,-.3030303030f, .0020000000f }, 387 { .1041666642f, .0400000000f,-.0250000000f, .0333333333f,-.0200000000f }, 388 { .1250000000f, .0100000000f, .0142857144f,-.0500000007f,-.0200000000f }, 389 { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f }, 390 { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f }, 391 { .1250000000f,-.0500000000f,-.0200000000f, .0100000000f, .0142857144f }, 392 { .1041666667f, .0333333333f,-.0200000000f, .0400000000f,-.0250000000f }, 393 { .0050000000f,-.3030303030f, .0020000001f,-.0200000000f, .0125000000f }, 394 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 395 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 396 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 397 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 398 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 399 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 400 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 401 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } }, 402 403 { { .1428571492f, .1250000000f,-.0285714287f,-.0357142873f, .0208333333f }, 404 { .1818181818f, .0588235296f, .0333333333f, .0212765951f, .0100000000f }, 405 { .1818181818f, .0212765951f, .0100000000f, .0588235296f, .0333333333f }, 406 { .1428571492f,-.0357142873f, .0208333333f, .1250000000f,-.0285714287f }, 407 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 408 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 409 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 410 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 411 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 412 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 413 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 414 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 415 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 416 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 417 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 418 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } }, 419 420 { { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 421 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 422 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 423 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 424 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 425 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 426 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 427 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 428 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 429 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 430 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 431 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 432 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 433 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 434 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f }, 435 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } } 436}; 437 438static const float fft_tone_level_table[2][64] = { { 439/* pow ~ (i > 46) ? 0 : (((((i & 1) ? 431 : 304) << (i >> 1))) / 1024.0); */ 440 0.17677669f, 0.42677650f, 0.60355347f, 0.85355347f, 441 1.20710683f, 1.68359375f, 2.37500000f, 3.36718750f, 442 4.75000000f, 6.73437500f, 9.50000000f, 13.4687500f, 443 19.0000000f, 26.9375000f, 38.0000000f, 53.8750000f, 444 76.0000000f, 107.750000f, 152.000000f, 215.500000f, 445 304.000000f, 431.000000f, 608.000000f, 862.000000f, 446 1216.00000f, 1724.00000f, 2432.00000f, 3448.00000f, 447 4864.00000f, 6896.00000f, 9728.00000f, 13792.0000f, 448 19456.0000f, 27584.0000f, 38912.0000f, 55168.0000f, 449 77824.0000f, 110336.000f, 155648.000f, 220672.000f, 450 311296.000f, 441344.000f, 622592.000f, 882688.000f, 451 1245184.00f, 1765376.00f, 2490368.00f, 0.00000000f, 452 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 453 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 454 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 455 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 456 }, { 457/* pow = (i > 45) ? 0 : ((((i & 1) ? 431 : 304) << (i >> 1)) / 512.0); */ 458 0.59375000f, 0.84179688f, 1.18750000f, 1.68359375f, 459 2.37500000f, 3.36718750f, 4.75000000f, 6.73437500f, 460 9.50000000f, 13.4687500f, 19.0000000f, 26.9375000f, 461 38.0000000f, 53.8750000f, 76.0000000f, 107.750000f, 462 152.000000f, 215.500000f, 304.000000f, 431.000000f, 463 608.000000f, 862.000000f, 1216.00000f, 1724.00000f, 464 2432.00000f, 3448.00000f, 4864.00000f, 6896.00000f, 465 9728.00000f, 13792.0000f, 19456.0000f, 27584.0000f, 466 38912.0000f, 55168.0000f, 77824.0000f, 110336.000f, 467 155648.000f, 220672.000f, 311296.000f, 441344.000f, 468 622592.000f, 882688.000f, 1245184.00f, 1765376.00f, 469 2490368.00f, 3530752.00f, 0.00000000f, 0.00000000f, 470 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 471 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 472 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 473 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f 474} }; 475 476static const float fft_tone_envelope_table[4][31] = { 477 { .009607375f, .038060248f, .084265202f, .146446645f, .222214907f, .308658302f, 478 .402454883f, .500000060f, .597545207f, .691341758f, .777785182f, .853553414f, 479 .915734828f, .961939812f, .990392685f, 1.00000000f, .990392625f, .961939752f, 480 .915734768f, .853553295f, .777785063f, .691341639f, .597545087f, .500000000f, 481 .402454853f, .308658272f, .222214878f, .146446615f, .084265172f, .038060218f, 482 .009607345f }, 483 { .038060248f, .146446645f, .308658302f, .500000060f, .691341758f, .853553414f, 484 .961939812f, 1.00000000f, .961939752f, .853553295f, .691341639f, .500000000f, 485 .308658272f, .146446615f, .038060218f, .000000000f, .000000000f, .000000000f, 486 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 487 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 488 .000000000f }, 489 { .146446645f, .500000060f, .853553414f, 1.00000000f, .853553295f, .500000000f, 490 .146446615f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 491 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 492 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 493 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 494 .000000000f }, 495 { .500000060f, 1.00000000f, .500000000f, .000000000f, .000000000f, .000000000f, 496 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 497 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 498 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 499 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, 500 .000000000f } 501}; 502 503static const float sb_noise_attenuation[32] = { 504 0.0f, 0.0f, 0.3f, 0.4f, 0.5f, 0.7f, 1.0f, 1.0f, 505 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 506 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 507 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 508}; 509 510static const uint8_t fft_subpackets[32] = { 511 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 512 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 513}; 514 515/* first index is joined_stereo, second index is 0 or 2 (1 is unused) */ 516static const float dequant_1bit[2][3] = { 517 {-0.920000f, 0.000000f, 0.920000f }, 518 {-0.890000f, 0.000000f, 0.890000f } 519}; 520 521static const float type30_dequant[8] = { 522 -1.0f,-0.625f,-0.291666656732559f,0.0f, 523 0.25f,0.5f,0.75f,1.0f, 524}; 525 526static const float type34_delta[10] = { // FIXME: covers 8 entries.. 527 -1.0f,-0.60947573184967f,-0.333333343267441f,-0.138071194291115f,0.0f, 528 0.138071194291115f,0.333333343267441f,0.60947573184967f,1.0f,0.0f, 529}; 530 531#endif /* AVCODEC_QDM2DATA_H */ 532