qdm2.c 68.5 KB
Newer Older
Roberto Togni's avatar
Roberto Togni committed
1 2 3 4 5 6 7
/*
 * QDM2 compatible decoder
 * Copyright (c) 2003 Ewald Snel
 * Copyright (c) 2005 Benjamin Larsson
 * Copyright (c) 2005 Alex Beregszaszi
 * Copyright (c) 2005 Roberto Togni
 *
8
 * This file is part of Libav.
9
 *
10
 * Libav is free software; you can redistribute it and/or
Roberto Togni's avatar
Roberto Togni committed
11 12
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
13
 * version 2.1 of the License, or (at your option) any later version.
Roberto Togni's avatar
Roberto Togni committed
14
 *
15
 * Libav is distributed in the hope that it will be useful,
Roberto Togni's avatar
Roberto Togni committed
16 17 18 19 20
 * 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
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
Roberto Togni's avatar
Roberto Togni committed
23 24 25
 */

/**
26
 * @file
Roberto Togni's avatar
Roberto Togni committed
27 28
 * QDM2 decoder
 * @author Ewald Snel, Benjamin Larsson, Alex Beregszaszi, Roberto Togni
29
 *
30 31
 * The decoder is not perfect yet, there are still some distortions
 * especially on files encoded with 16 or 8 subbands.
Roberto Togni's avatar
Roberto Togni committed
32 33 34 35 36 37
 */

#include <math.h>
#include <stddef.h>
#include <stdio.h>

38
#include "libavutil/channel_layout.h"
39 40

#define BITSTREAM_READER_LE
Roberto Togni's avatar
Roberto Togni committed
41
#include "avcodec.h"
42
#include "bitstream.h"
43
#include "internal.h"
Roberto Togni's avatar
Roberto Togni committed
44
#include "mpegaudio.h"
45 46
#include "mpegaudiodsp.h"
#include "rdft.h"
47
#include "vlc.h"
Roberto Togni's avatar
Roberto Togni committed
48 49

#include "qdm2data.h"
50
#include "qdm2_tablegen.h"
Roberto Togni's avatar
Roberto Togni committed
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


#define QDM2_LIST_ADD(list, size, packet) \
do { \
      if (size > 0) { \
    list[size - 1].next = &list[size]; \
      } \
      list[size].packet = packet; \
      list[size].next = NULL; \
      size++; \
} while(0)

// Result is 8, 16 or 30
#define QDM2_SB_USED(sub_sampling) (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling))

#define FIX_NOISE_IDX(noise_idx) \
  if ((noise_idx) >= 3840) \
    (noise_idx) -= 3840; \

#define SB_DITHERING_NOISE(sb,noise_idx) (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)])

#define SAMPLES_NEEDED \
     av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n");

#define SAMPLES_NEEDED_2(why) \
     av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);

78
#define QDM2_MAX_FRAME_SIZE 512
Roberto Togni's avatar
Roberto Togni committed
79 80 81 82 83 84

typedef int8_t sb_int8_array[2][30][64];

/**
 * Subpacket
 */
85
typedef struct QDM2SubPacket {
Roberto Togni's avatar
Roberto Togni committed
86 87 88 89 90 91
    int type;            ///< subpacket type
    unsigned int size;   ///< subpacket size
    const uint8_t *data; ///< pointer to subpacket data (points to input data buffer, it's not a private copy)
} QDM2SubPacket;

/**
92
 * A node in the subpacket list
Roberto Togni's avatar
Roberto Togni committed
93
 */
94
typedef struct QDM2SubPNode {
Roberto Togni's avatar
Roberto Togni committed
95
    QDM2SubPacket *packet;      ///< packet
96
    struct QDM2SubPNode *next; ///< pointer to next packet in the list, NULL if leaf node
Roberto Togni's avatar
Roberto Togni committed
97 98
} QDM2SubPNode;

99
typedef struct QDM2Complex {
100 101 102 103
    float re;
    float im;
} QDM2Complex;

104
typedef struct FFTTone {
Roberto Togni's avatar
Roberto Togni committed
105
    float level;
106
    QDM2Complex *complex;
Michael Niedermayer's avatar
Michael Niedermayer committed
107
    const float *table;
Roberto Togni's avatar
Roberto Togni committed
108 109 110 111 112 113 114
    int   phase;
    int   phase_shift;
    int   duration;
    short time_index;
    short cutoff;
} FFTTone;

115
typedef struct FFTCoefficient {
Roberto Togni's avatar
Roberto Togni committed
116 117 118 119 120 121 122
    int16_t sub_packet;
    uint8_t channel;
    int16_t offset;
    int16_t exp;
    uint8_t phase;
} FFTCoefficient;

123
typedef struct QDM2FFT {
124
    DECLARE_ALIGNED(32, QDM2Complex, complex)[MPA_MAX_CHANNELS][256];
Roberto Togni's avatar
Roberto Togni committed
125 126 127 128 129
} QDM2FFT;

/**
 * QDM2 decoder context
 */
130
typedef struct QDM2Context {
Roberto Togni's avatar
Roberto Togni committed
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    /// Parameters from codec header, do not change during playback
    int nb_channels;         ///< number of channels
    int channels;            ///< number of channels
    int group_size;          ///< size of frame group (16 frames per group)
    int fft_size;            ///< size of FFT, in complex numbers
    int checksum_size;       ///< size of data block, used also for checksum

    /// Parameters built from header parameters, do not change during playback
    int group_order;         ///< order of frame group
    int fft_order;           ///< order of FFT (actually fftorder+1)
    int frame_size;          ///< size of data frame
    int frequency_range;
    int sub_sampling;        ///< subsampling: 0=25%, 1=50%, 2=100% */
    int coeff_per_sb_select; ///< selector for "num. of coeffs. per subband" tables. Can be 0, 1, 2
    int cm_table_select;     ///< selector for "coding method" tables. Can be 0, 1 (from init: 0-4)

    /// Packets and packet lists
    QDM2SubPacket sub_packets[16];      ///< the packets themselves
    QDM2SubPNode sub_packet_list_A[16]; ///< list of all packets
    QDM2SubPNode sub_packet_list_B[16]; ///< FFT packets B are on list
    int sub_packets_B;                  ///< number of packets on 'B' list
    QDM2SubPNode sub_packet_list_C[16]; ///< packets with errors?
    QDM2SubPNode sub_packet_list_D[16]; ///< DCT packets

    /// FFT and tones
    FFTTone fft_tones[1000];
    int fft_tone_start;
    int fft_tone_end;
    FFTCoefficient fft_coefs[1000];
    int fft_coefs_index;
    int fft_coefs_min_index[5];
    int fft_coefs_max_index[5];
    int fft_level_exp[6];
164
    RDFTContext rdft_ctx;
Roberto Togni's avatar
Roberto Togni committed
165 166 167
    QDM2FFT fft;

    /// I/O data
Michael Niedermayer's avatar
Michael Niedermayer committed
168
    const uint8_t *compressed_data;
Roberto Togni's avatar
Roberto Togni committed
169
    int compressed_size;
170
    float output_buffer[QDM2_MAX_FRAME_SIZE * 2];
Roberto Togni's avatar
Roberto Togni committed
171 172

    /// Synthesis filter
173
    MPADSPContext mpadsp;
174
    DECLARE_ALIGNED(32, float, synth_buf)[MPA_MAX_CHANNELS][512*2];
Roberto Togni's avatar
Roberto Togni committed
175
    int synth_buf_offset[MPA_MAX_CHANNELS];
176
    DECLARE_ALIGNED(32, float, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
177
    DECLARE_ALIGNED(32, float, samples)[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
Roberto Togni's avatar
Roberto Togni committed
178 179 180 181 182 183 184 185 186 187 188 189 190

    /// Mixed temporary data used in decoding
    float tone_level[MPA_MAX_CHANNELS][30][64];
    int8_t coding_method[MPA_MAX_CHANNELS][30][64];
    int8_t quantized_coeffs[MPA_MAX_CHANNELS][10][8];
    int8_t tone_level_idx_base[MPA_MAX_CHANNELS][30][8];
    int8_t tone_level_idx_hi1[MPA_MAX_CHANNELS][3][8][8];
    int8_t tone_level_idx_mid[MPA_MAX_CHANNELS][26][8];
    int8_t tone_level_idx_hi2[MPA_MAX_CHANNELS][26];
    int8_t tone_level_idx[MPA_MAX_CHANNELS][30][64];
    int8_t tone_level_idx_temp[MPA_MAX_CHANNELS][30][64];

    // Flags
191
    int has_errors;         ///< packet has errors
Roberto Togni's avatar
Roberto Togni committed
192 193 194 195
    int superblocktype_2_3; ///< select fft tables and some algorithm based on superblock type
    int do_synth_filter;    ///< used to perform or skip synthesis filter

    int sub_packet;
196
    int noise_idx; ///< index for dithering noise table
Roberto Togni's avatar
Roberto Togni committed
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
} QDM2Context;


static VLC vlc_tab_level;
static VLC vlc_tab_diff;
static VLC vlc_tab_run;
static VLC fft_level_exp_alt_vlc;
static VLC fft_level_exp_vlc;
static VLC fft_stereo_exp_vlc;
static VLC fft_stereo_phase_vlc;
static VLC vlc_tab_tone_level_idx_hi1;
static VLC vlc_tab_tone_level_idx_mid;
static VLC vlc_tab_tone_level_idx_hi2;
static VLC vlc_tab_type30;
static VLC vlc_tab_type34;
static VLC vlc_tab_fft_tone_offset[5];

214 215 216
static const uint16_t qdm2_vlc_offs[] = {
    0,260,566,598,894,1166,1230,1294,1678,1950,2214,2278,2310,2570,2834,3124,3448,3838,
};
Roberto Togni's avatar
Roberto Togni committed
217

218 219 220 221
static const int switchtable[23] = {
    0, 5, 1, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 4
};

222
static av_cold void qdm2_init_vlc(void)
Roberto Togni's avatar
Roberto Togni committed
223
{
224 225
    static VLC_TYPE qdm2_table[3838][2];

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
    vlc_tab_level.table           = &qdm2_table[qdm2_vlc_offs[0]];
    vlc_tab_level.table_allocated = qdm2_vlc_offs[1] - qdm2_vlc_offs[0];
    init_vlc(&vlc_tab_level, 8, 24,
             vlc_tab_level_huffbits, 1, 1,
             vlc_tab_level_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_diff.table           = &qdm2_table[qdm2_vlc_offs[1]];
    vlc_tab_diff.table_allocated = qdm2_vlc_offs[2] - qdm2_vlc_offs[1];
    init_vlc(&vlc_tab_diff, 8, 37,
             vlc_tab_diff_huffbits, 1, 1,
             vlc_tab_diff_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_run.table           = &qdm2_table[qdm2_vlc_offs[2]];
    vlc_tab_run.table_allocated = qdm2_vlc_offs[3] - qdm2_vlc_offs[2];
    init_vlc(&vlc_tab_run, 5, 6,
             vlc_tab_run_huffbits, 1, 1,
             vlc_tab_run_huffcodes, 1, 1,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    fft_level_exp_alt_vlc.table           = &qdm2_table[qdm2_vlc_offs[3]];
    fft_level_exp_alt_vlc.table_allocated = qdm2_vlc_offs[4] -
                                            qdm2_vlc_offs[3];
    init_vlc(&fft_level_exp_alt_vlc, 8, 28,
             fft_level_exp_alt_huffbits, 1, 1,
             fft_level_exp_alt_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    fft_level_exp_vlc.table           = &qdm2_table[qdm2_vlc_offs[4]];
    fft_level_exp_vlc.table_allocated = qdm2_vlc_offs[5] - qdm2_vlc_offs[4];
    init_vlc(&fft_level_exp_vlc, 8, 20,
             fft_level_exp_huffbits, 1, 1,
             fft_level_exp_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    fft_stereo_exp_vlc.table           = &qdm2_table[qdm2_vlc_offs[5]];
    fft_stereo_exp_vlc.table_allocated = qdm2_vlc_offs[6] -
                                         qdm2_vlc_offs[5];
    init_vlc(&fft_stereo_exp_vlc, 6, 7,
             fft_stereo_exp_huffbits, 1, 1,
             fft_stereo_exp_huffcodes, 1, 1,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    fft_stereo_phase_vlc.table           = &qdm2_table[qdm2_vlc_offs[6]];
    fft_stereo_phase_vlc.table_allocated = qdm2_vlc_offs[7] -
                                           qdm2_vlc_offs[6];
    init_vlc(&fft_stereo_phase_vlc, 6, 9,
             fft_stereo_phase_huffbits, 1, 1,
             fft_stereo_phase_huffcodes, 1, 1,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_tone_level_idx_hi1.table =
        &qdm2_table[qdm2_vlc_offs[7]];
    vlc_tab_tone_level_idx_hi1.table_allocated = qdm2_vlc_offs[8] -
                                                 qdm2_vlc_offs[7];
    init_vlc(&vlc_tab_tone_level_idx_hi1, 8, 20,
             vlc_tab_tone_level_idx_hi1_huffbits, 1, 1,
             vlc_tab_tone_level_idx_hi1_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_tone_level_idx_mid.table =
        &qdm2_table[qdm2_vlc_offs[8]];
    vlc_tab_tone_level_idx_mid.table_allocated = qdm2_vlc_offs[9] -
                                                 qdm2_vlc_offs[8];
    init_vlc(&vlc_tab_tone_level_idx_mid, 8, 24,
             vlc_tab_tone_level_idx_mid_huffbits, 1, 1,
             vlc_tab_tone_level_idx_mid_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_tone_level_idx_hi2.table =
        &qdm2_table[qdm2_vlc_offs[9]];
    vlc_tab_tone_level_idx_hi2.table_allocated = qdm2_vlc_offs[10] -
                                                 qdm2_vlc_offs[9];
    init_vlc(&vlc_tab_tone_level_idx_hi2, 8, 24,
             vlc_tab_tone_level_idx_hi2_huffbits, 1, 1,
             vlc_tab_tone_level_idx_hi2_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_type30.table           = &qdm2_table[qdm2_vlc_offs[10]];
    vlc_tab_type30.table_allocated = qdm2_vlc_offs[11] - qdm2_vlc_offs[10];
    init_vlc(&vlc_tab_type30, 6, 9,
             vlc_tab_type30_huffbits, 1, 1,
             vlc_tab_type30_huffcodes, 1, 1,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_type34.table           = &qdm2_table[qdm2_vlc_offs[11]];
    vlc_tab_type34.table_allocated = qdm2_vlc_offs[12] - qdm2_vlc_offs[11];
    init_vlc(&vlc_tab_type34, 5, 10,
             vlc_tab_type34_huffbits, 1, 1,
             vlc_tab_type34_huffcodes, 1, 1,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_fft_tone_offset[0].table =
        &qdm2_table[qdm2_vlc_offs[12]];
    vlc_tab_fft_tone_offset[0].table_allocated = qdm2_vlc_offs[13] -
                                                 qdm2_vlc_offs[12];
    init_vlc(&vlc_tab_fft_tone_offset[0], 8, 23,
             vlc_tab_fft_tone_offset_0_huffbits, 1, 1,
             vlc_tab_fft_tone_offset_0_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_fft_tone_offset[1].table =
        &qdm2_table[qdm2_vlc_offs[13]];
    vlc_tab_fft_tone_offset[1].table_allocated = qdm2_vlc_offs[14] -
                                                 qdm2_vlc_offs[13];
    init_vlc(&vlc_tab_fft_tone_offset[1], 8, 28,
             vlc_tab_fft_tone_offset_1_huffbits, 1, 1,
             vlc_tab_fft_tone_offset_1_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_fft_tone_offset[2].table =
        &qdm2_table[qdm2_vlc_offs[14]];
    vlc_tab_fft_tone_offset[2].table_allocated = qdm2_vlc_offs[15] -
                                                 qdm2_vlc_offs[14];
    init_vlc(&vlc_tab_fft_tone_offset[2], 8, 32,
             vlc_tab_fft_tone_offset_2_huffbits, 1, 1,
             vlc_tab_fft_tone_offset_2_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_fft_tone_offset[3].table =
        &qdm2_table[qdm2_vlc_offs[15]];
    vlc_tab_fft_tone_offset[3].table_allocated = qdm2_vlc_offs[16] -
                                                 qdm2_vlc_offs[15];
    init_vlc(&vlc_tab_fft_tone_offset[3], 8, 35,
             vlc_tab_fft_tone_offset_3_huffbits, 1, 1,
             vlc_tab_fft_tone_offset_3_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);

    vlc_tab_fft_tone_offset[4].table =
        &qdm2_table[qdm2_vlc_offs[16]];
    vlc_tab_fft_tone_offset[4].table_allocated = qdm2_vlc_offs[17] -
                                                 qdm2_vlc_offs[16];
    init_vlc(&vlc_tab_fft_tone_offset[4], 8, 38,
             vlc_tab_fft_tone_offset_4_huffbits, 1, 1,
             vlc_tab_fft_tone_offset_4_huffcodes, 2, 2,
             INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
Roberto Togni's avatar
Roberto Togni committed
363 364
}

365
static int qdm2_get_vlc(BitstreamContext *bc, VLC *vlc, int flag, int depth)
Roberto Togni's avatar
Roberto Togni committed
366 367 368
{
    int value;

369
    value = bitstream_read_vlc(bc, vlc->table, vlc->bits, depth);
Roberto Togni's avatar
Roberto Togni committed
370 371 372

    /* stage-2, 3 bits exponent escape sequence */
    if (value-- == 0)
373
        value = bitstream_read(bc, bitstream_read(bc, 3) + 1);
Roberto Togni's avatar
Roberto Togni committed
374 375 376 377 378 379

    /* stage-3, optional */
    if (flag) {
        int tmp = vlc_stage3_values[value];

        if ((value & ~3) > 0)
380
            tmp += bitstream_read(bc, value >> 2);
Roberto Togni's avatar
Roberto Togni committed
381 382 383 384 385 386
        value = tmp;
    }

    return value;
}

387
static int qdm2_get_se_vlc(VLC *vlc, BitstreamContext *bc, int depth)
Roberto Togni's avatar
Roberto Togni committed
388
{
389
    int value = qdm2_get_vlc(bc, vlc, 0, depth);
Roberto Togni's avatar
Roberto Togni committed
390 391 392 393 394 395 396

    return (value & 1) ? ((value + 1) >> 1) : -(value >> 1);
}

/**
 * QDM2 checksum
 *
397
 * @param data      pointer to data to be checksummed
Roberto Togni's avatar
Roberto Togni committed
398 399 400
 * @param length    data length
 * @param value     checksum value
 *
401
 * @return          0 if checksum is OK
Roberto Togni's avatar
Roberto Togni committed
402
 */
403 404
static uint16_t qdm2_packet_checksum(const uint8_t *data, int length, int value)
{
Roberto Togni's avatar
Roberto Togni committed
405 406
    int i;

407
    for (i = 0; i < length; i++)
Roberto Togni's avatar
Roberto Togni committed
408 409 410 411 412 413
        value -= data[i];

    return (uint16_t)(value & 0xffff);
}

/**
414
 * Fill a QDM2SubPacket structure with packet type, size, and data pointer.
Roberto Togni's avatar
Roberto Togni committed
415
 *
416
 * @param bc            bitreader context
Roberto Togni's avatar
Roberto Togni committed
417 418
 * @param sub_packet    packet under analysis
 */
419
static void qdm2_decode_sub_packet_header(BitstreamContext *bc,
420
                                          QDM2SubPacket *sub_packet)
Roberto Togni's avatar
Roberto Togni committed
421
{
422
    sub_packet->type = bitstream_read(bc, 8);
Roberto Togni's avatar
Roberto Togni committed
423 424 425 426 427

    if (sub_packet->type == 0) {
        sub_packet->size = 0;
        sub_packet->data = NULL;
    } else {
428
        sub_packet->size = bitstream_read(bc, 8);
Roberto Togni's avatar
Roberto Togni committed
429

430 431
        if (sub_packet->type & 0x80) {
            sub_packet->size <<= 8;
432
            sub_packet->size  |= bitstream_read(bc, 8);
433 434
            sub_packet->type  &= 0x7f;
        }
Roberto Togni's avatar
Roberto Togni committed
435

436
        if (sub_packet->type == 0x7f)
437
            sub_packet->type |= bitstream_read(bc, 8) << 8;
Roberto Togni's avatar
Roberto Togni committed
438

439
        // FIXME: this depends on bitreader-internal data
440
        sub_packet->data = &bc->buffer[bitstream_tell(bc) / 8];
Roberto Togni's avatar
Roberto Togni committed
441 442
    }

443
    av_log(NULL, AV_LOG_DEBUG, "Subpacket: type=%d size=%d start_offs=%x\n",
444
           sub_packet->type, sub_packet->size, bitstream_tell(bc) / 8);
Roberto Togni's avatar
Roberto Togni committed
445 446 447
}

/**
448
 * Return node pointer to first packet of requested type in list.
Roberto Togni's avatar
Roberto Togni committed
449
 *
450
 * @param list    list of subpackets to be scanned
Roberto Togni's avatar
Roberto Togni committed
451 452 453
 * @param type    type of searched subpacket
 * @return        node pointer for subpacket if found, else NULL
 */
454 455
static QDM2SubPNode *qdm2_search_subpacket_type_in_list(QDM2SubPNode *list,
                                                        int type)
Roberto Togni's avatar
Roberto Togni committed
456
{
457
    while (list && list->packet) {
Roberto Togni's avatar
Roberto Togni committed
458 459 460 461 462 463 464 465
        if (list->packet->type == type)
            return list;
        list = list->next;
    }
    return NULL;
}

/**
466
 * Replace 8 elements with their average value.
467
 * Called by qdm2_decode_superblock before starting subblock decoding.
Roberto Togni's avatar
Roberto Togni committed
468 469 470
 *
 * @param q       context
 */
471
static void average_quantized_coeffs(QDM2Context *q)
Roberto Togni's avatar
Roberto Togni committed
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
{
    int i, j, n, ch, sum;

    n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1;

    for (ch = 0; ch < q->nb_channels; ch++)
        for (i = 0; i < n; i++) {
            sum = 0;

            for (j = 0; j < 8; j++)
                sum += q->quantized_coeffs[ch][i][j];

            sum /= 8;
            if (sum > 0)
                sum--;

488
            for (j = 0; j < 8; j++)
Roberto Togni's avatar
Roberto Togni committed
489 490 491 492 493
                q->quantized_coeffs[ch][i][j] = sum;
        }
}

/**
494 495
 * Build subband samples with noise weighted by q->tone_level.
 * Called by synthfilt_build_sb_samples.
Roberto Togni's avatar
Roberto Togni committed
496 497 498 499
 *
 * @param q     context
 * @param sb    subband index
 */
500
static void build_sb_samples_from_noise(QDM2Context *q, int sb)
Roberto Togni's avatar
Roberto Togni committed
501 502 503 504 505 506 507 508
{
    int ch, j;

    FIX_NOISE_IDX(q->noise_idx);

    if (!q->nb_channels)
        return;

509
    for (ch = 0; ch < q->nb_channels; ch++) {
Roberto Togni's avatar
Roberto Togni committed
510
        for (j = 0; j < 64; j++) {
511 512 513 514
            q->sb_samples[ch][j * 2][sb] =
                SB_DITHERING_NOISE(sb, q->noise_idx) * q->tone_level[ch][sb][j];
            q->sb_samples[ch][j * 2 + 1][sb] =
                SB_DITHERING_NOISE(sb, q->noise_idx) * q->tone_level[ch][sb][j];
Roberto Togni's avatar
Roberto Togni committed
515
        }
516
    }
Roberto Togni's avatar
Roberto Togni committed
517 518 519
}

/**
520 521
 * Called while processing data from subpackets 11 and 12.
 * Used after making changes to coding_method array.
Roberto Togni's avatar
Roberto Togni committed
522 523 524 525 526
 *
 * @param sb               subband index
 * @param channels         number of channels
 * @param coding_method    q->coding_method[0][0][0]
 */
527 528
static int fix_coding_method_array(int sb, int channels,
                                   sb_int8_array coding_method)
Roberto Togni's avatar
Roberto Togni committed
529
{
530
    int j, k;
Roberto Togni's avatar
Roberto Togni committed
531 532 533 534 535
    int ch;
    int run, case_val;

    for (ch = 0; ch < channels; ch++) {
        for (j = 0; j < 64; ) {
536 537
            if (coding_method[ch][sb][j] < 8)
                return -1;
538 539
            if ((coding_method[ch][sb][j] - 8) > 22) {
                run      = 1;
Roberto Togni's avatar
Roberto Togni committed
540 541
                case_val = 8;
            } else {
542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
                switch (switchtable[coding_method[ch][sb][j] - 8]) {
                case 0: run  = 10;
                    case_val = 10;
                    break;
                case 1: run  = 1;
                    case_val = 16;
                    break;
                case 2: run  = 5;
                    case_val = 24;
                    break;
                case 3: run  = 3;
                    case_val = 30;
                    break;
                case 4: run  = 1;
                    case_val = 30;
                    break;
                case 5: run  = 1;
                    case_val = 8;
                    break;
                default: run = 1;
                    case_val = 8;
                    break;
Roberto Togni's avatar
Roberto Togni committed
564 565
                }
            }
566 567 568
            for (k = 0; k < run; k++) {
                if (j + k < 128) {
                    if (coding_method[ch][sb + (j + k) / 64][(j + k) % 64] > coding_method[ch][sb][j]) {
Roberto Togni's avatar
Roberto Togni committed
569
                        if (k > 0) {
570
                            SAMPLES_NEEDED
Roberto Togni's avatar
Roberto Togni committed
571
                            //not debugged, almost never used
572 573 574 575
                            memset(&coding_method[ch][sb][j + k], case_val,
                                   k *sizeof(int8_t));
                            memset(&coding_method[ch][sb][j + k], case_val,
                                   3 * sizeof(int8_t));
Roberto Togni's avatar
Roberto Togni committed
576
                        }
577 578 579
                    }
                }
            }
Roberto Togni's avatar
Roberto Togni committed
580 581 582
            j += run;
        }
    }
583
    return 0;
Roberto Togni's avatar
Roberto Togni committed
584 585 586 587 588 589 590 591 592
}

/**
 * Related to synthesis filter
 * Called by process_subpacket_10
 *
 * @param q       context
 * @param flag    1 if called after getting data from subpacket 10, 0 if no subpacket 10
 */
593
static void fill_tone_level_array(QDM2Context *q, int flag)
Roberto Togni's avatar
Roberto Togni committed
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
{
    int i, sb, ch, sb_used;
    int tmp, tab;

    for (ch = 0; ch < q->nb_channels; ch++)
        for (sb = 0; sb < 30; sb++)
            for (i = 0; i < 8; i++) {
                if ((tab=coeff_per_sb_for_dequant[q->coeff_per_sb_select][sb]) < (last_coeff[q->coeff_per_sb_select] - 1))
                    tmp = q->quantized_coeffs[ch][tab + 1][i] * dequant_table[q->coeff_per_sb_select][tab + 1][sb]+
                          q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
                else
                    tmp = q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
                if(tmp < 0)
                    tmp += 0xff;
                q->tone_level_idx_base[ch][sb][i] = (tmp / 256) & 0xff;
            }

    sb_used = QDM2_SB_USED(q->sub_sampling);

    if ((q->superblocktype_2_3 != 0) && !flag) {
        for (sb = 0; sb < sb_used; sb++)
            for (ch = 0; ch < q->nb_channels; ch++)
                for (i = 0; i < 64; i++) {
                    q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
                    if (q->tone_level_idx[ch][sb][i] < 0)
                        q->tone_level[ch][sb][i] = 0;
                    else
                        q->tone_level[ch][sb][i] = fft_tone_level_table[0][q->tone_level_idx[ch][sb][i] & 0x3f];
                }
    } else {
        tab = q->superblocktype_2_3 ? 0 : 1;
        for (sb = 0; sb < sb_used; sb++) {
            if ((sb >= 4) && (sb <= 23)) {
                for (ch = 0; ch < q->nb_channels; ch++)
                    for (i = 0; i < 64; i++) {
                        tmp = q->tone_level_idx_base[ch][sb][i / 8] -
                              q->tone_level_idx_hi1[ch][sb / 8][i / 8][i % 8] -
                              q->tone_level_idx_mid[ch][sb - 4][i / 8] -
                              q->tone_level_idx_hi2[ch][sb - 4];
                        q->tone_level_idx[ch][sb][i] = tmp & 0xff;
                        if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
                            q->tone_level[ch][sb][i] = 0;
                        else
                            q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
                }
            } else {
                if (sb > 4) {
                    for (ch = 0; ch < q->nb_channels; ch++)
                        for (i = 0; i < 64; i++) {
                            tmp = q->tone_level_idx_base[ch][sb][i / 8] -
                                  q->tone_level_idx_hi1[ch][2][i / 8][i % 8] -
                                  q->tone_level_idx_hi2[ch][sb - 4];
                            q->tone_level_idx[ch][sb][i] = tmp & 0xff;
                            if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
                                q->tone_level[ch][sb][i] = 0;
                            else
                                q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
                    }
                } else {
                    for (ch = 0; ch < q->nb_channels; ch++)
                        for (i = 0; i < 64; i++) {
                            tmp = q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
                            if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
                                q->tone_level[ch][sb][i] = 0;
                            else
                                q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
                        }
                }
            }
        }
    }
}

/**
 * Related to synthesis filter
 * Called by process_subpacket_11
 * c is built with data from subpacket 11
671 672
 * Most of this function is used only if superblock_type_2_3 == 0,
 * never seen it in samples.
Roberto Togni's avatar
Roberto Togni committed
673
 *
674
 * @param tone_level_idx
Roberto Togni's avatar
Roberto Togni committed
675 676 677 678 679 680 681
 * @param tone_level_idx_temp
 * @param coding_method        q->coding_method[0][0][0]
 * @param nb_channels          number of channels
 * @param c                    coming from subpacket 11, passed as 8*c
 * @param superblocktype_2_3   flag based on superblock packet type
 * @param cm_table_select      q->cm_table_select
 */
682 683 684 685 686 687
static void fill_coding_method_array(sb_int8_array tone_level_idx,
                                     sb_int8_array tone_level_idx_temp,
                                     sb_int8_array coding_method,
                                     int nb_channels,
                                     int c, int superblocktype_2_3,
                                     int cm_table_select)
Roberto Togni's avatar
Roberto Togni committed
688 689 690 691 692 693 694 695 696 697 698
{
    int ch, sb, j;
    int tmp, acc, esp_40, comp;
    int add1, add2, add3, add4;
    int64_t multres;

    if (!superblocktype_2_3) {
        /* This case is untested, no samples available */
        SAMPLES_NEEDED
        for (ch = 0; ch < nb_channels; ch++)
            for (sb = 0; sb < 30; sb++) {
699
                for (j = 1; j < 63; j++) {  // The loop only iterates to 63 so the code doesn't overflow the buffer
Roberto Togni's avatar
Roberto Togni committed
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
                    add1 = tone_level_idx[ch][sb][j] - 10;
                    if (add1 < 0)
                        add1 = 0;
                    add2 = add3 = add4 = 0;
                    if (sb > 1) {
                        add2 = tone_level_idx[ch][sb - 2][j] + tone_level_idx_offset_table[sb][0] - 6;
                        if (add2 < 0)
                            add2 = 0;
                    }
                    if (sb > 0) {
                        add3 = tone_level_idx[ch][sb - 1][j] + tone_level_idx_offset_table[sb][1] - 6;
                        if (add3 < 0)
                            add3 = 0;
                    }
                    if (sb < 29) {
                        add4 = tone_level_idx[ch][sb + 1][j] + tone_level_idx_offset_table[sb][3] - 6;
                        if (add4 < 0)
                            add4 = 0;
                    }
                    tmp = tone_level_idx[ch][sb][j + 1] * 2 - add4 - add3 - add2 - add1;
                    if (tmp < 0)
                        tmp = 0;
                    tone_level_idx_temp[ch][sb][j + 1] = tmp & 0xff;
                }
                tone_level_idx_temp[ch][sb][0] = tone_level_idx_temp[ch][sb][1];
            }
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757

        acc = 0;
        for (ch = 0; ch < nb_channels; ch++)
            for (sb = 0; sb < 30; sb++)
                for (j = 0; j < 64; j++)
                    acc += tone_level_idx_temp[ch][sb][j];

        multres = 0x66666667LL * (acc * 10);
        esp_40 = (multres >> 32) / 8 + ((multres & 0xffffffff) >> 31);
        for (ch = 0;  ch < nb_channels; ch++)
            for (sb = 0; sb < 30; sb++)
                for (j = 0; j < 64; j++) {
                    comp = tone_level_idx_temp[ch][sb][j]* esp_40 * 10;
                    if (comp < 0)
                        comp += 0xff;
                    comp /= 256; // signed shift
                    switch(sb) {
                        case 0:
                            if (comp < 30)
                                comp = 30;
                            comp += 15;
                            break;
                        case 1:
                            if (comp < 24)
                                comp = 24;
                            comp += 10;
                            break;
                        case 2:
                        case 3:
                        case 4:
                            if (comp < 16)
                                comp = 16;
Roberto Togni's avatar
Roberto Togni committed
758
                    }
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
                    if (comp <= 5)
                        tmp = 0;
                    else if (comp <= 10)
                        tmp = 10;
                    else if (comp <= 16)
                        tmp = 16;
                    else if (comp <= 24)
                        tmp = -1;
                    else
                        tmp = 0;
                    coding_method[ch][sb][j] = ((tmp & 0xfffa) + 30 )& 0xff;
                }
        for (sb = 0; sb < 30; sb++)
            fix_coding_method_array(sb, nb_channels, coding_method);
        for (ch = 0; ch < nb_channels; ch++)
Roberto Togni's avatar
Roberto Togni committed
774
            for (sb = 0; sb < 30; sb++)
775 776 777 778 779 780 781 782
                for (j = 0; j < 64; j++)
                    if (sb >= 10) {
                        if (coding_method[ch][sb][j] < 10)
                            coding_method[ch][sb][j] = 10;
                    } else {
                        if (sb >= 2) {
                            if (coding_method[ch][sb][j] < 16)
                                coding_method[ch][sb][j] = 16;
Roberto Togni's avatar
Roberto Togni committed
783
                        } else {
784 785
                            if (coding_method[ch][sb][j] < 30)
                                coding_method[ch][sb][j] = 30;
Roberto Togni's avatar
Roberto Togni committed
786
                        }
787
                    }
Roberto Togni's avatar
Roberto Togni committed
788 789 790 791 792 793 794 795 796
    } else { // superblocktype_2_3 != 0
        for (ch = 0; ch < nb_channels; ch++)
            for (sb = 0; sb < 30; sb++)
                for (j = 0; j < 64; j++)
                    coding_method[ch][sb][j] = coding_method_table[cm_table_select][sb];
    }
}

/**
797 798 799 800
 * Called by process_subpacket_11 to process more data from subpacket 11
 * with sb 0-8.
 * Called by process_subpacket_12 to process data from subpacket 12 with
 * sb 8-sb_used.
Roberto Togni's avatar
Roberto Togni committed
801 802
 *
 * @param q         context
803
 * @param bc        bitreader context
804
 * @param length    packet length in bits
Roberto Togni's avatar
Roberto Togni committed
805 806 807
 * @param sb_min    lower subband processed (sb_min included)
 * @param sb_max    higher subband processed (sb_max excluded)
 */
808
static void synthfilt_build_sb_samples(QDM2Context *q, BitstreamContext *bc,
809
                                       int length, int sb_min, int sb_max)
Roberto Togni's avatar
Roberto Togni committed
810 811
{
    int sb, j, k, n, ch, run, channels;
812
    int joined_stereo, zero_encoding;
Roberto Togni's avatar
Roberto Togni committed
813 814 815 816 817 818 819 820
    int type34_first;
    float type34_div = 0;
    float type34_predictor;
    float samples[10], sign_bits[16];

    if (length == 0) {
        // If no data use noise
        for (sb=sb_min; sb < sb_max; sb++)
821
            build_sb_samples_from_noise(q, sb);
Roberto Togni's avatar
Roberto Togni committed
822 823 824 825 826 827 828 829 830 831 832 833

        return;
    }

    for (sb = sb_min; sb < sb_max; sb++) {
        channels = q->nb_channels;

        if (q->nb_channels <= 1 || sb < 12)
            joined_stereo = 0;
        else if (sb >= 24)
            joined_stereo = 1;
        else
834
            joined_stereo = (bitstream_bits_left(bc) >= 1) ? bitstream_read_bit(bc) : 0;
Roberto Togni's avatar
Roberto Togni committed
835 836

        if (joined_stereo) {
837
            if (bitstream_bits_left(bc) >= 16)
Roberto Togni's avatar
Roberto Togni committed
838
                for (j = 0; j < 16; j++)
839
                    sign_bits[j] = bitstream_read_bit(bc);
Roberto Togni's avatar
Roberto Togni committed
840 841 842 843 844

            for (j = 0; j < 64; j++)
                if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
                    q->coding_method[0][sb][j] = q->coding_method[1][sb][j];

845 846 847 848 849
            if (fix_coding_method_array(sb, q->nb_channels,
                                            q->coding_method)) {
                build_sb_samples_from_noise(q, sb);
                continue;
            }
Roberto Togni's avatar
Roberto Togni committed
850 851 852 853
            channels = 1;
        }

        for (ch = 0; ch < channels; ch++) {
854
            FIX_NOISE_IDX(q->noise_idx);
855
            zero_encoding = (bitstream_bits_left(bc) >= 1) ? bitstream_read_bit(bc) : 0;
Roberto Togni's avatar
Roberto Togni committed
856 857 858 859 860 861
            type34_predictor = 0.0;
            type34_first = 1;

            for (j = 0; j < 128; ) {
                switch (q->coding_method[ch][sb][j / 2]) {
                    case 8:
862
                        if (bitstream_bits_left(bc) >= 10) {
Roberto Togni's avatar
Roberto Togni committed
863 864 865 866
                            if (zero_encoding) {
                                for (k = 0; k < 5; k++) {
                                    if ((j + 2 * k) >= 128)
                                        break;
867
                                    samples[2 * k] = bitstream_read_bit(bc) ? dequant_1bit[joined_stereo][2 * bitstream_read_bit(bc)] : 0;
Roberto Togni's avatar
Roberto Togni committed
868 869
                                }
                            } else {
870
                                n = bitstream_read(bc, 8);
Roberto Togni's avatar
Roberto Togni committed
871 872 873 874 875 876 877 878 879 880 881 882 883
                                for (k = 0; k < 5; k++)
                                    samples[2 * k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
                            }
                            for (k = 0; k < 5; k++)
                                samples[2 * k + 1] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        } else {
                            for (k = 0; k < 10; k++)
                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        }
                        run = 10;
                        break;

                    case 10:
884
                        if (bitstream_bits_left(bc) >= 1) {
Roberto Togni's avatar
Roberto Togni committed
885 886
                            float f = 0.81;

887
                            if (bitstream_read_bit(bc))
Roberto Togni's avatar
Roberto Togni committed
888 889 890 891 892 893 894 895 896 897
                                f = -f;
                            f -= noise_samples[((sb + 1) * (j +5 * ch + 1)) & 127] * 9.0 / 40.0;
                            samples[0] = f;
                        } else {
                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        }
                        run = 1;
                        break;

                    case 16:
898
                        if (bitstream_bits_left(bc) >= 10) {
Roberto Togni's avatar
Roberto Togni committed
899 900 901 902
                            if (zero_encoding) {
                                for (k = 0; k < 5; k++) {
                                    if ((j + k) >= 128)
                                        break;
903
                                    samples[k] = (bitstream_read_bit(bc) == 0) ? 0 : dequant_1bit[joined_stereo][2 * bitstream_read_bit(bc)];
Roberto Togni's avatar
Roberto Togni committed
904 905
                                }
                            } else {
906
                                n = bitstream_read (bc, 8);
Roberto Togni's avatar
Roberto Togni committed
907 908 909 910 911 912 913 914 915 916 917
                                for (k = 0; k < 5; k++)
                                    samples[k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
                            }
                        } else {
                            for (k = 0; k < 5; k++)
                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        }
                        run = 5;
                        break;

                    case 24:
918 919
                        if (bitstream_bits_left(bc) >= 7) {
                            n = bitstream_read(bc, 7);
Roberto Togni's avatar
Roberto Togni committed
920 921 922 923 924 925 926 927 928 929
                            for (k = 0; k < 3; k++)
                                samples[k] = (random_dequant_type24[n][k] - 2.0) * 0.5;
                        } else {
                            for (k = 0; k < 3; k++)
                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        }
                        run = 3;
                        break;

                    case 30:
930 931
                        if (bitstream_bits_left(bc) >= 4) {
                            unsigned index = qdm2_get_vlc(bc, &vlc_tab_type30, 0, 1);
932 933 934 935 936
                            if (index < FF_ARRAY_ELEMS(type30_dequant)) {
                                samples[0] = type30_dequant[index];
                            } else
                                samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        } else
Roberto Togni's avatar
Roberto Togni committed
937
                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
938

Roberto Togni's avatar
Roberto Togni committed
939 940 941 942
                        run = 1;
                        break;

                    case 34:
943
                        if (bitstream_bits_left(bc) >= 7) {
Roberto Togni's avatar
Roberto Togni committed
944
                            if (type34_first) {
945 946
                                type34_div = (float)(1 << bitstream_read(bc, 2));
                                samples[0] = ((float)bitstream_read(bc, 5) - 16.0) / 15.0;
Roberto Togni's avatar
Roberto Togni committed
947 948 949
                                type34_predictor = samples[0];
                                type34_first = 0;
                            } else {
950
                                unsigned index = qdm2_get_vlc(bc, &vlc_tab_type34, 0, 1);
951 952 953 954 955
                                if (index < FF_ARRAY_ELEMS(type34_delta)) {
                                    samples[0] = type34_delta[index] / type34_div + type34_predictor;
                                    type34_predictor = samples[0];
                                } else
                                    samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
Roberto Togni's avatar
Roberto Togni committed
956 957 958 959 960 961 962 963 964 965 966 967 968 969
                            }
                        } else {
                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        }
                        run = 1;
                        break;

                    default:
                        samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
                        run = 1;
                        break;
                }

                if (joined_stereo) {
970 971 972 973 974 975 976 977 978 979 980
                    for (k = 0; k < run && j + k < 128; k++) {
                        q->sb_samples[0][j + k][sb] =
                            q->tone_level[0][sb][(j + k) / 2] * samples[k];
                        if (q->nb_channels == 2) {
                            if (sign_bits[(j + k) / 8])
                                q->sb_samples[1][j + k][sb] =
                                    q->tone_level[1][sb][(j + k) / 2] * -samples[k];
                            else
                                q->sb_samples[1][j + k][sb] =
                                    q->tone_level[1][sb][(j + k) / 2] * samples[k];
                        }
Roberto Togni's avatar
Roberto Togni committed
981 982 983 984
                    }
                } else {
                    for (k = 0; k < run; k++)
                        if ((j + k) < 128)
985
                            q->sb_samples[ch][j + k][sb] = q->tone_level[ch][sb][(j + k)/2] * samples[k];
Roberto Togni's avatar
Roberto Togni committed
986 987 988 989 990 991 992 993 994
                }

                j += run;
            } // j loop
        } // channel loop
    } // subband loop
}

/**
995 996 997 998
 * Init the first element of a channel in quantized_coeffs with data
 * from packet 10 (quantized_coeffs[ch][0]).
 * This is similar to process_subpacket_9, but for a single channel
 * and for element [0]
999
 * same VLC tables as process_subpacket_9 are used.
Roberto Togni's avatar
Roberto Togni committed
1000 1001
 *
 * @param quantized_coeffs    pointer to quantized_coeffs[ch][0]
1002
 * @param bc        bitreader context
Roberto Togni's avatar
Roberto Togni committed
1003
 */
1004
static void init_quantized_coeffs_elem0(int8_t *quantized_coeffs,
1005
                                        BitstreamContext *bc)
Roberto Togni's avatar
Roberto Togni committed
1006 1007 1008
{
    int i, k, run, level, diff;

1009
    if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1010
        return;
1011
    level = qdm2_get_vlc(bc, &vlc_tab_level, 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1012 1013 1014 1015

    quantized_coeffs[0] = level;

    for (i = 0; i < 7; ) {
1016
        if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1017
            break;
1018
        run = qdm2_get_vlc(bc, &vlc_tab_run, 0, 1) + 1;
Roberto Togni's avatar
Roberto Togni committed
1019

1020
        if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1021
            break;
1022
        diff = qdm2_get_se_vlc(&vlc_tab_diff, bc, 2);
1023

Roberto Togni's avatar
Roberto Togni committed
1024 1025
        for (k = 1; k <= run; k++)
            quantized_coeffs[i + k] = (level + ((k * diff) / run));
1026

Roberto Togni's avatar
Roberto Togni committed
1027 1028 1029 1030 1031 1032 1033 1034
        level += diff;
        i += run;
    }
}

/**
 * Related to synthesis filter, process data from packet 10
 * Init part of quantized_coeffs via function init_quantized_coeffs_elem0
1035 1036
 * Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with
 * data from packet 10
Roberto Togni's avatar
Roberto Togni committed
1037 1038
 *
 * @param q         context
1039
 * @param bc        bitreader context
Roberto Togni's avatar
Roberto Togni committed
1040
 */
1041
static void init_tone_level_dequantization(QDM2Context *q, BitstreamContext *bc)
Roberto Togni's avatar
Roberto Togni committed
1042 1043 1044 1045
{
    int sb, j, k, n, ch;

    for (ch = 0; ch < q->nb_channels; ch++) {
1046
        init_quantized_coeffs_elem0(q->quantized_coeffs[ch][0], bc);
Roberto Togni's avatar
Roberto Togni committed
1047

1048
        if (bitstream_bits_left(bc) < 16) {
Roberto Togni's avatar
Roberto Togni committed
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
            memset(q->quantized_coeffs[ch][0], 0, 8);
            break;
        }
    }

    n = q->sub_sampling + 1;

    for (sb = 0; sb < n; sb++)
        for (ch = 0; ch < q->nb_channels; ch++)
            for (j = 0; j < 8; j++) {
1059
                if (bitstream_bits_left(bc) < 1)
Roberto Togni's avatar
Roberto Togni committed
1060
                    break;
1061
                if (bitstream_read_bit(bc)) {
Roberto Togni's avatar
Roberto Togni committed
1062
                    for (k=0; k < 8; k++) {
1063
                        if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1064
                            break;
1065
                        q->tone_level_idx_hi1[ch][sb][j][k] = qdm2_get_vlc(bc, &vlc_tab_tone_level_idx_hi1, 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076
                    }
                } else {
                    for (k=0; k < 8; k++)
                        q->tone_level_idx_hi1[ch][sb][j][k] = 0;
                }
            }

    n = QDM2_SB_USED(q->sub_sampling) - 4;

    for (sb = 0; sb < n; sb++)
        for (ch = 0; ch < q->nb_channels; ch++) {
1077
            if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1078
                break;
1079
            q->tone_level_idx_hi2[ch][sb] = qdm2_get_vlc(bc, &vlc_tab_tone_level_idx_hi2, 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
            if (sb > 19)
                q->tone_level_idx_hi2[ch][sb] -= 16;
            else
                for (j = 0; j < 8; j++)
                    q->tone_level_idx_mid[ch][sb][j] = -16;
        }

    n = QDM2_SB_USED(q->sub_sampling) - 5;

    for (sb = 0; sb < n; sb++)
        for (ch = 0; ch < q->nb_channels; ch++)
            for (j = 0; j < 8; j++) {
1092
                if (bitstream_bits_left(bc) < 16)
Roberto Togni's avatar
Roberto Togni committed
1093
                    break;
1094
                q->tone_level_idx_mid[ch][sb][j] = qdm2_get_vlc(bc, &vlc_tab_tone_level_idx_mid, 0, 2) - 32;
Roberto Togni's avatar
Roberto Togni committed
1095 1096 1097 1098 1099 1100 1101 1102 1103
            }
}

/**
 * Process subpacket 9, init quantized_coeffs with data from it
 *
 * @param q       context
 * @param node    pointer to node with packet
 */
1104
static void process_subpacket_9(QDM2Context *q, QDM2SubPNode *node)
Roberto Togni's avatar
Roberto Togni committed
1105
{
1106
    BitstreamContext bc;
Roberto Togni's avatar
Roberto Togni committed
1107 1108
    int i, j, k, n, ch, run, level, diff;

1109
    bitstream_init8(&bc, node->packet->data, node->packet->size);
Roberto Togni's avatar
Roberto Togni committed
1110

1111
    n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1;
Roberto Togni's avatar
Roberto Togni committed
1112 1113

    for (i = 1; i < n; i++)
1114
        for (ch = 0; ch < q->nb_channels; ch++) {
1115
            level = qdm2_get_vlc(&bc, &vlc_tab_level, 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1116 1117 1118
            q->quantized_coeffs[ch][i][0] = level;

            for (j = 0; j < (8 - 1); ) {
1119 1120
                run  = qdm2_get_vlc(&bc, &vlc_tab_run, 0, 1) + 1;
                diff = qdm2_get_se_vlc(&vlc_tab_diff, &bc, 2);
Roberto Togni's avatar
Roberto Togni committed
1121 1122

                for (k = 1; k <= run; k++)
1123
                    q->quantized_coeffs[ch][i][j + k] = (level + ((k * diff) / run));
Roberto Togni's avatar
Roberto Togni committed
1124 1125

                level += diff;
1126
                j     += run;
Roberto Togni's avatar
Roberto Togni committed
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
            }
        }

    for (ch = 0; ch < q->nb_channels; ch++)
        for (i = 0; i < 8; i++)
            q->quantized_coeffs[ch][0][i] = 0;
}

/**
 * Process subpacket 10 if not null, else
 *
 * @param q         context
 * @param node      pointer to node with packet
 */
1141
static void process_subpacket_10(QDM2Context *q, QDM2SubPNode *node)
Roberto Togni's avatar
Roberto Togni committed
1142
{
1143
    BitstreamContext bc;
Roberto Togni's avatar
Roberto Togni committed
1144

1145
    if (node) {
1146
        bitstream_init8(&bc, node->packet->data, node->packet->size);
1147
        init_tone_level_dequantization(q, &bc);
Roberto Togni's avatar
Roberto Togni committed
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
        fill_tone_level_array(q, 1);
    } else {
        fill_tone_level_array(q, 0);
    }
}

/**
 * Process subpacket 11
 *
 * @param q         context
 * @param node      pointer to node with packet
 */
1160
static void process_subpacket_11(QDM2Context *q, QDM2SubPNode *node)
Roberto Togni's avatar
Roberto Togni committed
1161
{
1162
    BitstreamContext bc;
1163 1164 1165 1166
    int length = 0;

    if (node) {
        length = node->packet->size * 8;
1167
        bitstream_init(&bc, node->packet->data, length);
1168
    }
Roberto Togni's avatar
Roberto Togni committed
1169 1170

    if (length >= 32) {
1171
        int c = bitstream_read(&bc, 13);
Roberto Togni's avatar
Roberto Togni committed
1172 1173

        if (c > 3)
1174 1175 1176 1177
            fill_coding_method_array(q->tone_level_idx,
                                     q->tone_level_idx_temp, q->coding_method,
                                     q->nb_channels, 8 * c,
                                     q->superblocktype_2_3, q->cm_table_select);
Roberto Togni's avatar
Roberto Togni committed
1178 1179
    }

1180
    synthfilt_build_sb_samples(q, &bc, length, 0, 8);
Roberto Togni's avatar
Roberto Togni committed
1181 1182 1183 1184 1185 1186 1187 1188
}

/**
 * Process subpacket 12
 *
 * @param q         context
 * @param node      pointer to node with packet
 */
1189
static void process_subpacket_12(QDM2Context *q, QDM2SubPNode *node)
Roberto Togni's avatar
Roberto Togni committed
1190
{
1191
    BitstreamContext bc;
1192 1193 1194 1195
    int length = 0;

    if (node) {
        length = node->packet->size * 8;
1196
        bitstream_init(&bc, node->packet->data, length);
1197
    }
Roberto Togni's avatar
Roberto Togni committed
1198

1199
    synthfilt_build_sb_samples(q, &bc, length, 8, QDM2_SB_USED(q->sub_sampling));
Roberto Togni's avatar
Roberto Togni committed
1200 1201 1202 1203 1204 1205 1206 1207
}

/*
 * Process new subpackets for synthesis filter
 *
 * @param q       context
 * @param list    list with synthesis filter packets (list D)
 */
1208
static void process_synthesis_subpackets(QDM2Context *q, QDM2SubPNode *list)
Roberto Togni's avatar
Roberto Togni committed
1209 1210 1211 1212
{
    QDM2SubPNode *nodes[4];

    nodes[0] = qdm2_search_subpacket_type_in_list(list, 9);
1213
    if (nodes[0])
Roberto Togni's avatar
Roberto Togni committed
1214 1215 1216
        process_subpacket_9(q, nodes[0]);

    nodes[1] = qdm2_search_subpacket_type_in_list(list, 10);
1217
    if (nodes[1])
1218
        process_subpacket_10(q, nodes[1]);
Roberto Togni's avatar
Roberto Togni committed
1219
    else
1220
        process_subpacket_10(q, NULL);
Roberto Togni's avatar
Roberto Togni committed
1221 1222

    nodes[2] = qdm2_search_subpacket_type_in_list(list, 11);
1223
    if (nodes[0] && nodes[1] && nodes[2])
1224
        process_subpacket_11(q, nodes[2]);
Roberto Togni's avatar
Roberto Togni committed
1225
    else
1226
        process_subpacket_11(q, NULL);
Roberto Togni's avatar
Roberto Togni committed
1227 1228

    nodes[3] = qdm2_search_subpacket_type_in_list(list, 12);
1229
    if (nodes[0] && nodes[1] && nodes[3])
1230
        process_subpacket_12(q, nodes[3]);
Roberto Togni's avatar
Roberto Togni committed
1231
    else
1232
        process_subpacket_12(q, NULL);
Roberto Togni's avatar
Roberto Togni committed
1233 1234 1235
}

/*
1236
 * Decode superblock, fill packet lists.
Roberto Togni's avatar
Roberto Togni committed
1237 1238 1239
 *
 * @param q    context
 */
1240
static void qdm2_decode_super_block(QDM2Context *q)
Roberto Togni's avatar
Roberto Togni committed
1241
{
1242
    BitstreamContext bc;
Roberto Togni's avatar
Roberto Togni committed
1243 1244 1245 1246 1247 1248 1249 1250 1251
    QDM2SubPacket header, *packet;
    int i, packet_bytes, sub_packet_size, sub_packets_D;
    unsigned int next_index = 0;

    memset(q->tone_level_idx_hi1, 0, sizeof(q->tone_level_idx_hi1));
    memset(q->tone_level_idx_mid, 0, sizeof(q->tone_level_idx_mid));
    memset(q->tone_level_idx_hi2, 0, sizeof(q->tone_level_idx_hi2));

    q->sub_packets_B = 0;
1252
    sub_packets_D    = 0;
Roberto Togni's avatar
Roberto Togni committed
1253 1254 1255

    average_quantized_coeffs(q); // average elements in quantized_coeffs[max_ch][10][8]

1256
    bitstream_init8(&bc, q->compressed_data, q->compressed_size);
1257
    qdm2_decode_sub_packet_header(&bc, &header);
Roberto Togni's avatar
Roberto Togni committed
1258 1259 1260

    if (header.type < 2 || header.type >= 8) {
        q->has_errors = 1;
1261
        av_log(NULL, AV_LOG_ERROR, "bad superblock type\n");
Roberto Togni's avatar
Roberto Togni committed
1262 1263 1264 1265
        return;
    }

    q->superblocktype_2_3 = (header.type == 2 || header.type == 3);
1266
    packet_bytes          = (q->compressed_size - bitstream_tell(&bc) / 8);
Roberto Togni's avatar
Roberto Togni committed
1267

1268
    bitstream_init8(&bc, header.data, header.size);
Roberto Togni's avatar
Roberto Togni committed
1269 1270

    if (header.type == 2 || header.type == 4 || header.type == 5) {
1271 1272
        int csum = 257 * bitstream_read(&bc, 8);
        csum    +=   2 * bitstream_read(&bc, 8);
Roberto Togni's avatar
Roberto Togni committed
1273 1274 1275 1276 1277

        csum = qdm2_packet_checksum(q->compressed_data, q->checksum_size, csum);

        if (csum != 0) {
            q->has_errors = 1;
1278
            av_log(NULL, AV_LOG_ERROR, "bad packet checksum\n");
Roberto Togni's avatar
Roberto Togni committed
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
            return;
        }
    }

    q->sub_packet_list_B[0].packet = NULL;
    q->sub_packet_list_D[0].packet = NULL;

    for (i = 0; i < 6; i++)
        if (--q->fft_level_exp[i] < 0)
            q->fft_level_exp[i] = 0;

    for (i = 0; packet_bytes > 0; i++) {
        int j;

1293 1294 1295 1296 1297
        if (i >= FF_ARRAY_ELEMS(q->sub_packet_list_A)) {
            SAMPLES_NEEDED_2("too many packet bytes");
            return;
        }

Roberto Togni's avatar
Roberto Togni committed
1298 1299 1300 1301 1302 1303
        q->sub_packet_list_A[i].next = NULL;

        if (i > 0) {
            q->sub_packet_list_A[i - 1].next = &q->sub_packet_list_A[i];

            /* seek to next block */
1304
            bitstream_init8(&bc, header.data, header.size);
1305
            bitstream_skip(&bc, next_index * 8);
Roberto Togni's avatar
Roberto Togni committed
1306 1307 1308 1309 1310

            if (next_index >= header.size)
                break;
        }

1311
        /* decode subpacket */
Roberto Togni's avatar
Roberto Togni committed
1312
        packet = &q->sub_packets[i];
1313 1314
        qdm2_decode_sub_packet_header(&bc, packet);
        next_index      = packet->size + bitstream_tell(&bc) / 8;
Roberto Togni's avatar
Roberto Togni committed
1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
        sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2;

        if (packet->type == 0)
            break;

        if (sub_packet_size > packet_bytes) {
            if (packet->type != 10 && packet->type != 11 && packet->type != 12)
                break;
            packet->size += packet_bytes - sub_packet_size;
        }

        packet_bytes -= sub_packet_size;

1328
        /* add subpacket to 'all subpackets' list */
Roberto Togni's avatar
Roberto Togni committed
1329 1330
        q->sub_packet_list_A[i].packet = packet;

1331
        /* add subpacket to related list */
Roberto Togni's avatar
Roberto Togni committed
1332 1333 1334 1335 1336 1337 1338 1339
        if (packet->type == 8) {
            SAMPLES_NEEDED_2("packet type 8");
            return;
        } else if (packet->type >= 9 && packet->type <= 12) {
            /* packets for MPEG Audio like Synthesis Filter */
            QDM2_LIST_ADD(q->sub_packet_list_D, sub_packets_D, packet);
        } else if (packet->type == 13) {
            for (j = 0; j < 6; j++)
1340
                q->fft_level_exp[j] = bitstream_read(&bc, 6);
Roberto Togni's avatar
Roberto Togni committed
1341 1342
        } else if (packet->type == 14) {
            for (j = 0; j < 6; j++)
1343
                q->fft_level_exp[j] = qdm2_get_vlc(&bc, &fft_level_exp_vlc, 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1344 1345 1346
        } else if (packet->type == 15) {
            SAMPLES_NEEDED_2("packet type 15")
            return;
1347 1348
        } else if (packet->type >= 16 && packet->type < 48 &&
                   !fft_subpackets[packet->type - 16]) {
Roberto Togni's avatar
Roberto Togni committed
1349 1350 1351 1352 1353
            /* packets for FFT */
            QDM2_LIST_ADD(q->sub_packet_list_B, q->sub_packets_B, packet);
        }
    } // Packet bytes loop

1354
    if (q->sub_packet_list_D[0].packet) {
Roberto Togni's avatar
Roberto Togni committed
1355 1356 1357
        process_synthesis_subpackets(q, q->sub_packet_list_D);
        q->do_synth_filter = 1;
    } else if (q->do_synth_filter) {
1358 1359 1360
        process_subpacket_10(q, NULL);
        process_subpacket_11(q, NULL);
        process_subpacket_12(q, NULL);
Roberto Togni's avatar
Roberto Togni committed
1361 1362 1363
    }
}

1364 1365 1366
static void qdm2_fft_init_coefficient(QDM2Context *q, int sub_packet,
                                      int offset, int duration, int channel,
                                      int exp, int phase)
Roberto Togni's avatar
Roberto Togni committed
1367 1368 1369 1370
{
    if (q->fft_coefs_min_index[duration] < 0)
        q->fft_coefs_min_index[duration] = q->fft_coefs_index;

1371 1372
    q->fft_coefs[q->fft_coefs_index].sub_packet =
        ((sub_packet >= 16) ? (sub_packet - 16) : sub_packet);
Roberto Togni's avatar
Roberto Togni committed
1373
    q->fft_coefs[q->fft_coefs_index].channel = channel;
1374 1375 1376
    q->fft_coefs[q->fft_coefs_index].offset  = offset;
    q->fft_coefs[q->fft_coefs_index].exp     = exp;
    q->fft_coefs[q->fft_coefs_index].phase   = phase;
Roberto Togni's avatar
Roberto Togni committed
1377 1378 1379
    q->fft_coefs_index++;
}

1380
static void qdm2_fft_decode_tones(QDM2Context *q, int duration,
1381
                                  BitstreamContext *bc, int b)
Roberto Togni's avatar
Roberto Togni committed
1382 1383
{
    int channel, stereo, phase, exp;
1384
    int local_int_4, local_int_8, stereo_phase, local_int_10;
Roberto Togni's avatar
Roberto Togni committed
1385 1386 1387
    int local_int_14, stereo_exp, local_int_20, local_int_28;
    int n, offset;

1388
    local_int_4  = 0;
Roberto Togni's avatar
Roberto Togni committed
1389 1390
    local_int_28 = 0;
    local_int_20 = 2;
1391
    local_int_8  = (4 - duration);
Roberto Togni's avatar
Roberto Togni committed
1392
    local_int_10 = 1 << (q->group_order - duration - 1);
1393
    offset       = 1;
Roberto Togni's avatar
Roberto Togni committed
1394 1395 1396

    while (1) {
        if (q->superblocktype_2_3) {
1397
            while ((n = qdm2_get_vlc(bc, &vlc_tab_fft_tone_offset[local_int_8], 1, 2)) < 2) {
Roberto Togni's avatar
Roberto Togni committed
1398 1399
                offset = 1;
                if (n == 0) {
1400
                    local_int_4  += local_int_10;
Roberto Togni's avatar
Roberto Togni committed
1401 1402
                    local_int_28 += (1 << local_int_8);
                } else {
1403
                    local_int_4  += 8 * local_int_10;
Roberto Togni's avatar
Roberto Togni committed
1404 1405 1406 1407 1408
                    local_int_28 += (8 << local_int_8);
                }
            }
            offset += (n - 2);
        } else {
1409
            offset += qdm2_get_vlc(bc, &vlc_tab_fft_tone_offset[local_int_8], 1, 2);
Roberto Togni's avatar
Roberto Togni committed
1410
            while (offset >= (local_int_10 - 1)) {
1411
                offset       += (1 - (local_int_10 - 1));
Roberto Togni's avatar
Roberto Togni committed
1412 1413 1414 1415 1416 1417 1418 1419 1420
                local_int_4  += local_int_10;
                local_int_28 += (1 << local_int_8);
            }
        }

        if (local_int_4 >= q->group_size)
            return;

        local_int_14 = (offset >> local_int_8);
1421 1422
        if (local_int_14 >= FF_ARRAY_ELEMS(fft_level_index_table))
            return;
Roberto Togni's avatar
Roberto Togni committed
1423 1424

        if (q->nb_channels > 1) {
1425 1426
            channel = bitstream_read_bit(bc);
            stereo  = bitstream_read_bit(bc);
Roberto Togni's avatar
Roberto Togni committed
1427 1428
        } else {
            channel = 0;
1429
            stereo  = 0;
Roberto Togni's avatar
Roberto Togni committed
1430 1431
        }

1432
        exp  = qdm2_get_vlc(bc, (b ? &fft_level_exp_vlc : &fft_level_exp_alt_vlc), 0, 2);
Roberto Togni's avatar
Roberto Togni committed
1433
        exp += q->fft_level_exp[fft_level_index_table[local_int_14]];
1434
        exp  = (exp < 0) ? 0 : exp;
Roberto Togni's avatar
Roberto Togni committed
1435

1436
        phase        = bitstream_read(bc, 3);
1437
        stereo_exp   = 0;
Roberto Togni's avatar
Roberto Togni committed
1438 1439 1440
        stereo_phase = 0;

        if (stereo) {
1441 1442
            stereo_exp   = (exp   - qdm2_get_vlc(bc, &fft_stereo_exp_vlc,   0, 1));
            stereo_phase = (phase - qdm2_get_vlc(bc, &fft_stereo_phase_vlc, 0, 1));
Roberto Togni's avatar
Roberto Togni committed
1443 1444 1445 1446 1447 1448 1449
            if (stereo_phase < 0)
                stereo_phase += 8;
        }

        if (q->frequency_range > (local_int_14 + 1)) {
            int sub_packet = (local_int_20 + local_int_28);

1450 1451
            qdm2_fft_init_coefficient(q, sub_packet, offset, duration,
                                      channel, exp, phase);
Roberto Togni's avatar
Roberto Togni committed
1452
            if (stereo)
1453 1454 1455
                qdm2_fft_init_coefficient(q, sub_packet, offset, duration,
                                          1 - channel,
                                          stereo_exp, stereo_phase);
Roberto Togni's avatar
Roberto Togni committed
1456 1457 1458 1459 1460
        }
        offset++;
    }
}

1461
static void qdm2_decode_fft_packets(QDM2Context *q)
Roberto Togni's avatar
Roberto Togni committed
1462 1463
{
    int i, j, min, max, value, type, unknown_flag;
1464
    BitstreamContext bc;
Roberto Togni's avatar
Roberto Togni committed
1465

1466
    if (!q->sub_packet_list_B[0].packet)
Roberto Togni's avatar
Roberto Togni committed
1467 1468
        return;

1469
    /* reset minimum indexes for FFT coefficients */
Roberto Togni's avatar
Roberto Togni committed
1470
    q->fft_coefs_index = 0;
1471
    for (i = 0; i < 5; i++)
Roberto Togni's avatar
Roberto Togni committed
1472 1473
        q->fft_coefs_min_index[i] = -1;

1474
    /* process subpackets ordered by type, largest type first */
Roberto Togni's avatar
Roberto Togni committed
1475
    for (i = 0, max = 256; i < q->sub_packets_B; i++) {
1476
        QDM2SubPacket *packet = NULL;
Roberto Togni's avatar
Roberto Togni committed
1477

1478
        /* find subpacket with largest type less than max */
1479
        for (j = 0, min = 0; j < q->sub_packets_B; j++) {
Roberto Togni's avatar
Roberto Togni committed
1480 1481
            value = q->sub_packet_list_B[j].packet->type;
            if (value > min && value < max) {
1482
                min    = value;
Roberto Togni's avatar
Roberto Togni committed
1483 1484 1485 1486 1487 1488 1489
                packet = q->sub_packet_list_B[j].packet;
            }
        }

        max = min;

        /* check for errors (?) */
1490 1491 1492
        if (!packet)
            return;

1493 1494 1495
        if (i == 0 &&
            (packet->type < 16 || packet->type >= 48 ||
             fft_subpackets[packet->type - 16]))
Roberto Togni's avatar
Roberto Togni committed
1496 1497 1498
            return;

        /* decode FFT tones */
1499
        bitstream_init8(&bc, packet->data, packet->size);
Roberto Togni's avatar
Roberto Togni committed
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511

        if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16])
            unknown_flag = 1;
        else
            unknown_flag = 0;

        type = packet->type;

        if ((type >= 17 && type < 24) || (type >= 33 && type < 40)) {
            int duration = q->sub_sampling + 5 - (type & 15);

            if (duration >= 0 && duration < 4)
1512
                qdm2_fft_decode_tones(q, duration, &bc, unknown_flag);
Roberto Togni's avatar
Roberto Togni committed
1513
        } else if (type == 31) {
1514
            for (j = 0; j < 4; j++)
1515
                qdm2_fft_decode_tones(q, j, &bc, unknown_flag);
Roberto Togni's avatar
Roberto Togni committed
1516
        } else if (type == 46) {
1517
            for (j = 0; j < 6; j++)
1518
                q->fft_level_exp[j] = bitstream_read(&bc, 6);
1519
            for (j = 0; j < 4; j++)
1520
                qdm2_fft_decode_tones(q, j, &bc, unknown_flag);
Roberto Togni's avatar
Roberto Togni committed
1521 1522 1523
        }
    } // Loop on B packets

1524
    /* calculate maximum indexes for FFT coefficients */
Roberto Togni's avatar
Roberto Togni committed
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534
    for (i = 0, j = -1; i < 5; i++)
        if (q->fft_coefs_min_index[i] >= 0) {
            if (j >= 0)
                q->fft_coefs_max_index[j] = q->fft_coefs_min_index[i];
            j = i;
        }
    if (j >= 0)
        q->fft_coefs_max_index[j] = q->fft_coefs_index;
}

1535
static void qdm2_fft_generate_tone(QDM2Context *q, FFTTone *tone)
Roberto Togni's avatar
Roberto Togni committed
1536
{
1537 1538 1539 1540
    float level, f[6];
    int i;
    QDM2Complex c;
    const double iscale = 2.0 * M_PI / 512.0;
Roberto Togni's avatar
Roberto Togni committed
1541 1542 1543 1544 1545

    tone->phase += tone->phase_shift;

    /* calculate current level (maximum amplitude) of tone */
    level = fft_tone_envelope_table[tone->duration][tone->time_index] * tone->level;
1546 1547
    c.im  = level * sin(tone->phase * iscale);
    c.re  = level * cos(tone->phase * iscale);
Roberto Togni's avatar
Roberto Togni committed
1548 1549 1550

    /* generate FFT coefficients for tone */
    if (tone->duration >= 3 || tone->cutoff >= 3) {
1551 1552 1553 1554
        tone->complex[0].im += c.im;
        tone->complex[0].re += c.re;
        tone->complex[1].im -= c.im;
        tone->complex[1].re -= c.re;
Roberto Togni's avatar
Roberto Togni committed
1555 1556
    } else {
        f[1] = -tone->table[4];
1557 1558 1559 1560 1561
        f[0] = tone->table[3] - tone->table[0];
        f[2] = 1.0 - tone->table[2] - tone->table[3];
        f[3] = tone->table[1] + tone->table[4] - 1.0;
        f[4] = tone->table[0] - tone->table[1];
        f[5] = tone->table[2];
Roberto Togni's avatar
Roberto Togni committed
1562
        for (i = 0; i < 2; i++) {
1563 1564 1565 1566
            tone->complex[fft_cutoff_index_table[tone->cutoff][i]].re +=
                c.re * f[i];
            tone->complex[fft_cutoff_index_table[tone->cutoff][i]].im +=
                c.im * ((tone->cutoff <= i) ? -f[i] : f[i]);
Roberto Togni's avatar
Roberto Togni committed
1567 1568
        }
        for (i = 0; i < 4; i++) {
1569 1570
            tone->complex[i].re += c.re * f[i + 2];
            tone->complex[i].im += c.im * f[i + 2];
Roberto Togni's avatar
Roberto Togni committed
1571 1572 1573 1574 1575
        }
    }

    /* copy the tone if it has not yet died out */
    if (++tone->time_index < ((1 << (5 - tone->duration)) - 1)) {
1576 1577
        memcpy(&q->fft_tones[q->fft_tone_end], tone, sizeof(FFTTone));
        q->fft_tone_end = (q->fft_tone_end + 1) % 1000;
Roberto Togni's avatar
Roberto Togni committed
1578 1579 1580
    }
}

1581
static void qdm2_fft_tone_synthesizer(QDM2Context *q, int sub_packet)
Roberto Togni's avatar
Roberto Togni committed
1582 1583 1584 1585 1586
{
    int i, j, ch;
    const double iscale = 0.25 * M_PI;

    for (ch = 0; ch < q->channels; ch++) {
1587
        memset(q->fft.complex[ch], 0, q->fft_size * sizeof(QDM2Complex));
Roberto Togni's avatar
Roberto Togni committed
1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
    }


    /* apply FFT tones with duration 4 (1 FFT period) */
    if (q->fft_coefs_min_index[4] >= 0)
        for (i = q->fft_coefs_min_index[4]; i < q->fft_coefs_max_index[4]; i++) {
            float level;
            QDM2Complex c;

            if (q->fft_coefs[i].sub_packet != sub_packet)
                break;

            ch = (q->channels == 1) ? 0 : q->fft_coefs[i].channel;
            level = (q->fft_coefs[i].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[i].exp & 63];

            c.re = level * cos(q->fft_coefs[i].phase * iscale);
            c.im = level * sin(q->fft_coefs[i].phase * iscale);
1605 1606 1607 1608
            q->fft.complex[ch][q->fft_coefs[i].offset + 0].re += c.re;
            q->fft.complex[ch][q->fft_coefs[i].offset + 0].im += c.im;
            q->fft.complex[ch][q->fft_coefs[i].offset + 1].re -= c.re;
            q->fft.complex[ch][q->fft_coefs[i].offset + 1].im -= c.im;
Roberto Togni's avatar
Roberto Togni committed
1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637
        }

    /* generate existing FFT tones */
    for (i = q->fft_tone_end; i != q->fft_tone_start; ) {
        qdm2_fft_generate_tone(q, &q->fft_tones[q->fft_tone_start]);
        q->fft_tone_start = (q->fft_tone_start + 1) % 1000;
    }

    /* create and generate new FFT tones with duration 0 (long) to 3 (short) */
    for (i = 0; i < 4; i++)
        if (q->fft_coefs_min_index[i] >= 0) {
            for (j = q->fft_coefs_min_index[i]; j < q->fft_coefs_max_index[i]; j++) {
                int offset, four_i;
                FFTTone tone;

                if (q->fft_coefs[j].sub_packet != sub_packet)
                    break;

                four_i = (4 - i);
                offset = q->fft_coefs[j].offset >> four_i;
                ch = (q->channels == 1) ? 0 : q->fft_coefs[j].channel;

                if (offset < q->frequency_range) {
                    if (offset < 2)
                        tone.cutoff = offset;
                    else
                        tone.cutoff = (offset >= 60) ? 3 : 2;

                    tone.level = (q->fft_coefs[j].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[j].exp & 63];
1638
                    tone.complex = &q->fft.complex[ch][offset];
Michael Niedermayer's avatar
Michael Niedermayer committed
1639
                    tone.table = fft_tone_sample_table[i][q->fft_coefs[j].offset - (offset << four_i)];
Roberto Togni's avatar
Roberto Togni committed
1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651
                    tone.phase = 64 * q->fft_coefs[j].phase - (offset << 8) - 128;
                    tone.phase_shift = (2 * q->fft_coefs[j].offset + 1) << (7 - four_i);
                    tone.duration = i;
                    tone.time_index = 0;

                    qdm2_fft_generate_tone(q, &tone);
                }
            }
            q->fft_coefs_min_index[i] = j;
        }
}

1652
static void qdm2_calculate_fft(QDM2Context *q, int channel, int sub_packet)
Roberto Togni's avatar
Roberto Togni committed
1653
{
1654
    const float gain = (q->channels == 1 && q->nb_channels == 2) ? 0.5f : 1.0f;
1655
    float *out       = q->output_buffer + channel;
1656 1657
    int i;
    q->fft.complex[channel][0].re *= 2.0f;
1658
    q->fft.complex[channel][0].im  = 0.0f;
1659
    q->rdft_ctx.rdft_calc(&q->rdft_ctx, (FFTSample *)q->fft.complex[channel]);
Roberto Togni's avatar
Roberto Togni committed
1660
    /* add samples to output buffer */
1661 1662 1663
    for (i = 0; i < FFALIGN(q->fft_size, 8); i++) {
        out[0]           += q->fft.complex[channel][i].re * gain;
        out[q->channels] += q->fft.complex[channel][i].im * gain;
1664
        out              += 2 * q->channels;
1665
    }
Roberto Togni's avatar
Roberto Togni committed
1666 1667 1668 1669 1670 1671
}

/**
 * @param q        context
 * @param index    subpacket number
 */
1672
static void qdm2_synthesis_filter(QDM2Context *q, int index)
Roberto Togni's avatar
Roberto Togni committed
1673 1674 1675 1676 1677 1678 1679 1680
{
    int i, k, ch, sb_used, sub_sampling, dither_state = 0;

    /* copy sb_samples */
    sb_used = QDM2_SB_USED(q->sub_sampling);

    for (ch = 0; ch < q->channels; ch++)
        for (i = 0; i < 8; i++)
1681
            for (k = sb_used; k < SBLIMIT; k++)
Roberto Togni's avatar
Roberto Togni committed
1682 1683 1684
                q->sb_samples[ch][(8 * index) + i][k] = 0;

    for (ch = 0; ch < q->nb_channels; ch++) {
1685
        float *samples_ptr = q->samples + ch;
Roberto Togni's avatar
Roberto Togni committed
1686 1687

        for (i = 0; i < 8; i++) {
1688
            ff_mpa_synth_filter_float(&q->mpadsp,
1689 1690 1691 1692
                                      q->synth_buf[ch], &(q->synth_buf_offset[ch]),
                                      ff_mpa_synth_window_float, &dither_state,
                                      samples_ptr, q->nb_channels,
                                      q->sb_samples[ch][(8 * index) + i]);
Roberto Togni's avatar
Roberto Togni committed
1693 1694 1695 1696 1697 1698 1699 1700 1701
            samples_ptr += 32 * q->nb_channels;
        }
    }

    /* add samples to output buffer */
    sub_sampling = (4 >> q->sub_sampling);

    for (ch = 0; ch < q->channels; ch++)
        for (i = 0; i < q->frame_size; i++)
1702
            q->output_buffer[q->channels * i + ch] += (1 << 23) * q->samples[q->nb_channels * sub_sampling * i + ch];
Roberto Togni's avatar
Roberto Togni committed
1703 1704 1705 1706 1707 1708 1709
}

/**
 * Init static data (does not depend on specific file)
 *
 * @param q    context
 */
1710
static av_cold void qdm2_init_static_data(AVCodec *codec) {
Roberto Togni's avatar
Roberto Togni committed
1711
    qdm2_init_vlc();
1712
    ff_mpa_synth_init_float(ff_mpa_synth_window_float);
Roberto Togni's avatar
Roberto Togni committed
1713 1714 1715 1716 1717 1718 1719 1720
    softclip_table_init();
    rnd_table_init();
    init_noise_samples();
}

/**
 * Init parameters from codec extradata
 */
1721
static av_cold int qdm2_decode_init(AVCodecContext *avctx)
Roberto Togni's avatar
Roberto Togni committed
1722 1723 1724 1725 1726
{
    QDM2Context *s = avctx->priv_data;
    uint8_t *extradata;
    int extradata_size;
    int tmp_val, tmp, size;
1727

Roberto Togni's avatar
Roberto Togni committed
1728
    /* extradata parsing
1729

Roberto Togni's avatar
Roberto Togni committed
1730 1731 1732 1733 1734 1735
    Structure:
    wave {
        frma (QDM2)
        QDCA
        QDCP
    }
1736

Roberto Togni's avatar
Roberto Togni committed
1737 1738 1739
    32  size (including this field)
    32  tag (=frma)
    32  type (=QDM2 or QDMC)
1740

Roberto Togni's avatar
Roberto Togni committed
1741 1742 1743 1744 1745 1746 1747 1748 1749
    32  size (including this field, in bytes)
    32  tag (=QDCA) // maybe mandatory parameters
    32  unknown (=1)
    32  channels (=2)
    32  samplerate (=44100)
    32  bitrate (=96000)
    32  block size (=4096)
    32  frame size (=256) (for one channel)
    32  packet size (=1300)
1750

Roberto Togni's avatar
Roberto Togni committed
1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
    32  size (including this field, in bytes)
    32  tag (=QDCP) // maybe some tuneable parameters
    32  float1 (=1.0)
    32  zero ?
    32  float2 (=1.0)
    32  float3 (=1.0)
    32  unknown (27)
    32  unknown (8)
    32  zero ?
    */

    if (!avctx->extradata || (avctx->extradata_size < 48)) {
        av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
1764
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1765 1766
    }

1767
    extradata      = avctx->extradata;
Roberto Togni's avatar
Roberto Togni committed
1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
    extradata_size = avctx->extradata_size;

    while (extradata_size > 7) {
        if (!memcmp(extradata, "frmaQDM", 7))
            break;
        extradata++;
        extradata_size--;
    }

    if (extradata_size < 12) {
        av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
               extradata_size);
1780
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1781 1782 1783 1784
    }

    if (memcmp(extradata, "frmaQDM", 7)) {
        av_log(avctx, AV_LOG_ERROR, "invalid headers, QDM? not found\n");
1785
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1786 1787 1788 1789
    }

    if (extradata[7] == 'C') {
//        s->is_qdmc = 1;
1790 1791
        avpriv_report_missing_feature(avctx, "QDMC version 1");
        return AVERROR_PATCHWELCOME;
Roberto Togni's avatar
Roberto Togni committed
1792 1793 1794 1795 1796
    }

    extradata += 8;
    extradata_size -= 8;

1797
    size = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1798 1799 1800 1801

    if(size > extradata_size){
        av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
               extradata_size, size);
1802
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1803 1804 1805 1806
    }

    extradata += 4;
    av_log(avctx, AV_LOG_DEBUG, "size: %d\n", size);
1807
    if (AV_RB32(extradata) != MKBETAG('Q','D','C','A')) {
Roberto Togni's avatar
Roberto Togni committed
1808
        av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
1809
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1810 1811 1812 1813
    }

    extradata += 8;

1814
    avctx->channels = s->nb_channels = s->channels = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1815
    extradata += 4;
1816
    if (s->channels <= 0 || s->channels > MPA_MAX_CHANNELS)
1817
        return AVERROR_INVALIDDATA;
1818 1819
    avctx->channel_layout = avctx->channels == 2 ? AV_CH_LAYOUT_STEREO :
                                                   AV_CH_LAYOUT_MONO;
Roberto Togni's avatar
Roberto Togni committed
1820

1821
    avctx->sample_rate = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1822 1823
    extradata += 4;

1824
    avctx->bit_rate = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1825 1826
    extradata += 4;

1827
    s->group_size = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1828 1829
    extradata += 4;

1830
    s->fft_size = AV_RB32(extradata);
Roberto Togni's avatar
Roberto Togni committed
1831 1832
    extradata += 4;

1833
    s->checksum_size = AV_RB32(extradata);
1834 1835 1836 1837
    if (s->checksum_size >= 1U << 28) {
        av_log(avctx, AV_LOG_ERROR, "data block size too large (%u)\n", s->checksum_size);
        return AVERROR_INVALIDDATA;
    }
Roberto Togni's avatar
Roberto Togni committed
1838 1839 1840 1841 1842 1843

    s->fft_order = av_log2(s->fft_size) + 1;

    // something like max decodable tones
    s->group_order = av_log2(s->group_size) + 1;
    s->frame_size = s->group_size / 16; // 16 iterations per super block
1844 1845
    if (s->frame_size > QDM2_MAX_FRAME_SIZE)
        return AVERROR_INVALIDDATA;
Roberto Togni's avatar
Roberto Togni committed
1846

1847
    s->sub_sampling = s->fft_order - 7;
Roberto Togni's avatar
Roberto Togni committed
1848
    s->frequency_range = 255 / (1 << (2 - s->sub_sampling));
1849

Roberto Togni's avatar
Roberto Togni committed
1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
    switch ((s->sub_sampling * 2 + s->channels - 1)) {
        case 0: tmp = 40; break;
        case 1: tmp = 48; break;
        case 2: tmp = 56; break;
        case 3: tmp = 72; break;
        case 4: tmp = 80; break;
        case 5: tmp = 100;break;
        default: tmp=s->sub_sampling; break;
    }
    tmp_val = 0;
    if ((tmp * 1000) < avctx->bit_rate)  tmp_val = 1;
    if ((tmp * 1440) < avctx->bit_rate)  tmp_val = 2;
    if ((tmp * 1760) < avctx->bit_rate)  tmp_val = 3;
    if ((tmp * 2240) < avctx->bit_rate)  tmp_val = 4;
    s->cm_table_select = tmp_val;

    if (s->sub_sampling == 0)
1867
        tmp = 7999;
Roberto Togni's avatar
Roberto Togni committed
1868 1869 1870
    else
        tmp = ((-(s->sub_sampling -1)) & 8000) + 20000;
    /*
1871
    0: 7999 -> 0
Roberto Togni's avatar
Roberto Togni committed
1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
    1: 20000 -> 2
    2: 28000 -> 2
    */
    if (tmp < 8000)
        s->coeff_per_sb_select = 0;
    else if (tmp <= 16000)
        s->coeff_per_sb_select = 1;
    else
        s->coeff_per_sb_select = 2;

1882
    // Fail on unknown fft order
1883
    if ((s->fft_order < 7) || (s->fft_order > 9)) {
1884 1885
        avpriv_request_sample(avctx, "Unknown FFT order %d", s->fft_order);
        return AVERROR_PATCHWELCOME;
1886
    }
1887 1888 1889 1890
    if (s->fft_size != (1 << (s->fft_order - 1))) {
        av_log(avctx, AV_LOG_ERROR, "FFT size %d not power of 2.\n", s->fft_size);
        return AVERROR_INVALIDDATA;
    }
Roberto Togni's avatar
Roberto Togni committed
1891

1892
    ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
1893
    ff_mpadsp_init(&s->mpadsp);
Roberto Togni's avatar
Roberto Togni committed
1894

1895
    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1896

Roberto Togni's avatar
Roberto Togni committed
1897 1898 1899
    return 0;
}

1900
static av_cold int qdm2_decode_close(AVCodecContext *avctx)
Roberto Togni's avatar
Roberto Togni committed
1901 1902 1903
{
    QDM2Context *s = avctx->priv_data;

1904
    ff_rdft_end(&s->rdft_ctx);
1905

Roberto Togni's avatar
Roberto Togni committed
1906 1907 1908
    return 0;
}

1909
static int qdm2_decode(QDM2Context *q, const uint8_t *in, int16_t *out)
Roberto Togni's avatar
Roberto Togni committed
1910 1911 1912
{
    int ch, i;
    const int frame_size = (q->frame_size * q->channels);
1913

Roberto Togni's avatar
Roberto Togni committed
1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924
    /* select input buffer */
    q->compressed_data = in;
    q->compressed_size = q->checksum_size;

    /* copy old block, clear new block of output samples */
    memmove(q->output_buffer, &q->output_buffer[frame_size], frame_size * sizeof(float));
    memset(&q->output_buffer[frame_size], 0, frame_size * sizeof(float));

    /* decode block of QDM2 compressed data */
    if (q->sub_packet == 0) {
        q->has_errors = 0; // zero it for a new super block
1925
        av_log(NULL,AV_LOG_DEBUG,"Superblock follows\n");
Roberto Togni's avatar
Roberto Togni committed
1926 1927 1928
        qdm2_decode_super_block(q);
    }

1929
    /* parse subpackets */
Roberto Togni's avatar
Roberto Togni committed
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
    if (!q->has_errors) {
        if (q->sub_packet == 2)
            qdm2_decode_fft_packets(q);

        qdm2_fft_tone_synthesizer(q, q->sub_packet);
    }

    /* sound synthesis stage 1 (FFT) */
    for (ch = 0; ch < q->channels; ch++) {
        qdm2_calculate_fft(q, ch, q->sub_packet);

1941
        if (!q->has_errors && q->sub_packet_list_C[0].packet) {
Roberto Togni's avatar
Roberto Togni committed
1942
            SAMPLES_NEEDED_2("has errors, and C list is not empty")
1943
            return -1;
Roberto Togni's avatar
Roberto Togni committed
1944 1945 1946 1947 1948 1949 1950 1951 1952
        }
    }

    /* sound synthesis stage 2 (MPEG audio like synthesis filter) */
    if (!q->has_errors && q->do_synth_filter)
        qdm2_synthesis_filter(q, q->sub_packet);

    q->sub_packet = (q->sub_packet + 1) % 16;

1953
    /* clip and convert output float[] to 16-bit signed samples */
Roberto Togni's avatar
Roberto Togni committed
1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
    for (i = 0; i < frame_size; i++) {
        int value = (int)q->output_buffer[i];

        if (value > SOFTCLIP_THRESHOLD)
            value = (value >  HARDCLIP_THRESHOLD) ?  32767 :  softclip_table[ value - SOFTCLIP_THRESHOLD];
        else if (value < -SOFTCLIP_THRESHOLD)
            value = (value < -HARDCLIP_THRESHOLD) ? -32767 : -softclip_table[-value - SOFTCLIP_THRESHOLD];

        out[i] = value;
    }
1964 1965

    return 0;
Roberto Togni's avatar
Roberto Togni committed
1966 1967
}

1968 1969
static int qdm2_decode_frame(AVCodecContext *avctx, void *data,
                             int *got_frame_ptr, AVPacket *avpkt)
Roberto Togni's avatar
Roberto Togni committed
1970
{
1971
    AVFrame *frame     = data;
1972 1973
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
Roberto Togni's avatar
Roberto Togni committed
1974
    QDM2Context *s = avctx->priv_data;
1975 1976
    int16_t *out;
    int i, ret;
Roberto Togni's avatar
Roberto Togni committed
1977

Michael Niedermayer's avatar
Michael Niedermayer committed
1978
    if(!buf)
Roberto Togni's avatar
Roberto Togni committed
1979
        return 0;
Michael Niedermayer's avatar
Michael Niedermayer committed
1980 1981
    if(buf_size < s->checksum_size)
        return -1;
Roberto Togni's avatar
Roberto Togni committed
1982

1983
    /* get output buffer */
1984
    frame->nb_samples = 16 * s->frame_size;
1985
    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
1986 1987
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
        return ret;
1988
    }
1989
    out = (int16_t *)frame->data[0];
Roberto Togni's avatar
Roberto Togni committed
1990

1991
    for (i = 0; i < 16; i++) {
1992 1993
        if ((ret = qdm2_decode(s, buf, out)) < 0)
            return ret;
1994
        out += s->channels * s->frame_size;
Roberto Togni's avatar
Roberto Togni committed
1995 1996
    }

1997
    *got_frame_ptr = 1;
1998

1999
    return s->checksum_size;
Roberto Togni's avatar
Roberto Togni committed
2000 2001
}

2002
AVCodec ff_qdm2_decoder = {
2003
    .name             = "qdm2",
2004
    .long_name        = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
2005 2006 2007 2008 2009 2010 2011
    .type             = AVMEDIA_TYPE_AUDIO,
    .id               = AV_CODEC_ID_QDM2,
    .priv_data_size   = sizeof(QDM2Context),
    .init             = qdm2_decode_init,
    .init_static_data = qdm2_init_static_data,
    .close            = qdm2_decode_close,
    .decode           = qdm2_decode_frame,
2012
    .capabilities     = AV_CODEC_CAP_DR1,
Roberto Togni's avatar
Roberto Togni committed
2013
};