mlpdec.c 41.6 KB
Newer Older
Ramiro Polla's avatar
Ramiro Polla committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * MLP decoder
 * Copyright (c) 2007-2008 Ian Caulfield
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
23
 * @file
Ramiro Polla's avatar
Ramiro Polla committed
24 25 26
 * MLP decoder
 */

27 28
#include <stdint.h>

Ramiro Polla's avatar
Ramiro Polla committed
29
#include "avcodec.h"
30
#include "dsputil.h"
Ramiro Polla's avatar
Ramiro Polla committed
31
#include "libavutil/intreadwrite.h"
32
#include "get_bits.h"
Ramiro Polla's avatar
Ramiro Polla committed
33 34 35
#include "libavutil/crc.h"
#include "parser.h"
#include "mlp_parser.h"
36
#include "mlp.h"
Ramiro Polla's avatar
Ramiro Polla committed
37

Diego Biurrun's avatar
Diego Biurrun committed
38
/** number of bits used for VLC lookup - longest Huffman code is 9 */
Ramiro Polla's avatar
Ramiro Polla committed
39 40 41
#define VLC_BITS            9

typedef struct SubStream {
42
    /// Set if a valid restart header has been read. Otherwise the substream cannot be decoded.
Ramiro Polla's avatar
Ramiro Polla committed
43 44 45 46
    uint8_t     restart_seen;

    //@{
    /** restart header data */
47
    /// The type of noise to be used in the rematrix stage.
Ramiro Polla's avatar
Ramiro Polla committed
48 49
    uint16_t    noise_type;

50
    /// The index of the first channel coded in this substream.
Ramiro Polla's avatar
Ramiro Polla committed
51
    uint8_t     min_channel;
52
    /// The index of the last channel coded in this substream.
Ramiro Polla's avatar
Ramiro Polla committed
53
    uint8_t     max_channel;
54
    /// The number of channels input into the rematrix stage.
Ramiro Polla's avatar
Ramiro Polla committed
55
    uint8_t     max_matrix_channel;
56
    /// For each channel output by the matrix, the output channel to map it to
57
    uint8_t     ch_assign[MAX_CHANNELS];
Ramiro Polla's avatar
Ramiro Polla committed
58

59
    /// Channel coding parameters for channels in the substream
60 61
    ChannelParams channel_params[MAX_CHANNELS];

62
    /// The left shift applied to random noise in 0x31ea substreams.
Ramiro Polla's avatar
Ramiro Polla committed
63
    uint8_t     noise_shift;
64
    /// The current seed value for the pseudorandom noise generator(s).
Ramiro Polla's avatar
Ramiro Polla committed
65 66
    uint32_t    noisegen_seed;

67
    /// Set if the substream contains extra info to check the size of VLC blocks.
Ramiro Polla's avatar
Ramiro Polla committed
68 69
    uint8_t     data_check_present;

70
    /// Bitmask of which parameter sets are conveyed in a decoding parameter block.
Ramiro Polla's avatar
Ramiro Polla committed
71 72 73 74 75 76 77 78
    uint8_t     param_presence_flags;
#define PARAM_BLOCKSIZE     (1 << 7)
#define PARAM_MATRIX        (1 << 6)
#define PARAM_OUTSHIFT      (1 << 5)
#define PARAM_QUANTSTEP     (1 << 4)
#define PARAM_FIR           (1 << 3)
#define PARAM_IIR           (1 << 2)
#define PARAM_HUFFOFFSET    (1 << 1)
79
#define PARAM_PRESENCE      (1 << 0)
Ramiro Polla's avatar
Ramiro Polla committed
80 81 82 83 84
    //@}

    //@{
    /** matrix data */

85
    /// Number of matrices to be applied.
Ramiro Polla's avatar
Ramiro Polla committed
86 87
    uint8_t     num_primitive_matrices;

88
    /// matrix output channel
Ramiro Polla's avatar
Ramiro Polla committed
89 90
    uint8_t     matrix_out_ch[MAX_MATRICES];

91
    /// Whether the LSBs of the matrix output are encoded in the bitstream.
Ramiro Polla's avatar
Ramiro Polla committed
92
    uint8_t     lsb_bypass[MAX_MATRICES];
93
    /// Matrix coefficients, stored as 2.14 fixed point.
94
    int32_t     matrix_coeff[MAX_MATRICES][MAX_CHANNELS];
95
    /// Left shift to apply to noise values in 0x31eb substreams.
Ramiro Polla's avatar
Ramiro Polla committed
96 97 98
    uint8_t     matrix_noise_shift[MAX_MATRICES];
    //@}

99
    /// Left shift to apply to Huffman-decoded residuals.
Ramiro Polla's avatar
Ramiro Polla committed
100 101
    uint8_t     quant_step_size[MAX_CHANNELS];

102
    /// number of PCM samples in current audio block
Ramiro Polla's avatar
Ramiro Polla committed
103
    uint16_t    blocksize;
104
    /// Number of PCM samples decoded so far in this frame.
Ramiro Polla's avatar
Ramiro Polla committed
105 106
    uint16_t    blockpos;

107
    /// Left shift to apply to decoded PCM values to get final 24-bit output.
Ramiro Polla's avatar
Ramiro Polla committed
108 109
    int8_t      output_shift[MAX_CHANNELS];

110
    /// Running XOR of all output samples.
Ramiro Polla's avatar
Ramiro Polla committed
111 112 113 114 115 116
    int32_t     lossless_check_data;

} SubStream;

typedef struct MLPDecodeContext {
    AVCodecContext *avctx;
117
    AVFrame     frame;
Ramiro Polla's avatar
Ramiro Polla committed
118

119
    /// Current access unit being read has a major sync.
120 121
    int         is_major_sync_unit;

122
    /// Set if a valid major sync block has been read. Otherwise no decoding is possible.
Ramiro Polla's avatar
Ramiro Polla committed
123 124
    uint8_t     params_valid;

125
    /// Number of substreams contained within this stream.
Ramiro Polla's avatar
Ramiro Polla committed
126 127
    uint8_t     num_substreams;

128
    /// Index of the last substream to decode - further substreams are skipped.
Ramiro Polla's avatar
Ramiro Polla committed
129 130
    uint8_t     max_decoded_substream;

131
    /// Stream needs channel reordering to comply with FFmpeg's channel order
132 133
    uint8_t     needs_reordering;

134
    /// number of PCM samples contained in each frame
Ramiro Polla's avatar
Ramiro Polla committed
135
    int         access_unit_size;
136
    /// next power of two above the number of samples in each frame
Ramiro Polla's avatar
Ramiro Polla committed
137 138 139 140
    int         access_unit_size_pow2;

    SubStream   substream[MAX_SUBSTREAMS];

141 142 143
    int         matrix_changed;
    int         filter_changed[MAX_CHANNELS][NUM_FILTERS];

Ramiro Polla's avatar
Ramiro Polla committed
144 145
    int8_t      noise_buffer[MAX_BLOCKSIZE_POW2];
    int8_t      bypassed_lsbs[MAX_BLOCKSIZE][MAX_CHANNELS];
146
    int32_t     sample_buffer[MAX_BLOCKSIZE][MAX_CHANNELS];
147 148

    DSPContext  dsp;
Ramiro Polla's avatar
Ramiro Polla committed
149 150 151 152 153 154
} MLPDecodeContext;

static VLC huff_vlc[3];

/** Initialize static data, constant between all invocations of the codec. */

155
static av_cold void init_static(void)
Ramiro Polla's avatar
Ramiro Polla committed
156
{
157
    if (!huff_vlc[0].bits) {
Ramiro Polla's avatar
Ramiro Polla committed
158 159 160 161 162 163 164 165 166
        INIT_VLC_STATIC(&huff_vlc[0], VLC_BITS, 18,
                    &ff_mlp_huffman_tables[0][0][1], 2, 1,
                    &ff_mlp_huffman_tables[0][0][0], 2, 1, 512);
        INIT_VLC_STATIC(&huff_vlc[1], VLC_BITS, 16,
                    &ff_mlp_huffman_tables[1][0][1], 2, 1,
                    &ff_mlp_huffman_tables[1][0][0], 2, 1, 512);
        INIT_VLC_STATIC(&huff_vlc[2], VLC_BITS, 15,
                    &ff_mlp_huffman_tables[2][0][1], 2, 1,
                    &ff_mlp_huffman_tables[2][0][0], 2, 1, 512);
167
    }
Ramiro Polla's avatar
Ramiro Polla committed
168

169
    ff_mlp_init_crc();
Ramiro Polla's avatar
Ramiro Polla committed
170 171 172 173 174 175
}

static inline int32_t calculate_sign_huff(MLPDecodeContext *m,
                                          unsigned int substr, unsigned int ch)
{
    SubStream *s = &m->substream[substr];
176
    ChannelParams *cp = &s->channel_params[ch];
177 178 179
    int lsb_bits = cp->huff_lsbs - s->quant_step_size[ch];
    int sign_shift = lsb_bits + (cp->codebook ? 2 - cp->codebook : -1);
    int32_t sign_huff_offset = cp->huff_offset;
Ramiro Polla's avatar
Ramiro Polla committed
180

181
    if (cp->codebook > 0)
Ramiro Polla's avatar
Ramiro Polla committed
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
        sign_huff_offset -= 7 << lsb_bits;

    if (sign_shift >= 0)
        sign_huff_offset -= 1 << sign_shift;

    return sign_huff_offset;
}

/** Read a sample, consisting of either, both or neither of entropy-coded MSBs
 *  and plain LSBs. */

static inline int read_huff_channels(MLPDecodeContext *m, GetBitContext *gbp,
                                     unsigned int substr, unsigned int pos)
{
    SubStream *s = &m->substream[substr];
    unsigned int mat, channel;

    for (mat = 0; mat < s->num_primitive_matrices; mat++)
        if (s->lsb_bypass[mat])
            m->bypassed_lsbs[pos + s->blockpos][mat] = get_bits1(gbp);

    for (channel = s->min_channel; channel <= s->max_channel; channel++) {
204
        ChannelParams *cp = &s->channel_params[channel];
205
        int codebook = cp->codebook;
Ramiro Polla's avatar
Ramiro Polla committed
206
        int quant_step_size = s->quant_step_size[channel];
207
        int lsb_bits = cp->huff_lsbs - quant_step_size;
Ramiro Polla's avatar
Ramiro Polla committed
208 209 210 211 212 213 214
        int result = 0;

        if (codebook > 0)
            result = get_vlc2(gbp, huff_vlc[codebook-1].table,
                            VLC_BITS, (9 + VLC_BITS - 1) / VLC_BITS);

        if (result < 0)
215
            return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
216 217 218 219

        if (lsb_bits > 0)
            result = (result << lsb_bits) + get_bits(gbp, lsb_bits);

220
        result  += cp->sign_huff_offset;
Ramiro Polla's avatar
Ramiro Polla committed
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
        result <<= quant_step_size;

        m->sample_buffer[pos + s->blockpos][channel] = result;
    }

    return 0;
}

static av_cold int mlp_decode_init(AVCodecContext *avctx)
{
    MLPDecodeContext *m = avctx->priv_data;
    int substr;

    init_static();
    m->avctx = avctx;
    for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
        m->substream[substr].lossless_check_data = 0xffffffff;
238
    ff_dsputil_init(&m->dsp, avctx);
239

240 241 242
    avcodec_get_frame_defaults(&m->frame);
    avctx->coded_frame = &m->frame;

Ramiro Polla's avatar
Ramiro Polla committed
243 244 245 246 247 248 249 250 251 252 253
    return 0;
}

/** Read a major sync info header - contains high level information about
 *  the stream - sample rate, channel arrangement etc. Most of this
 *  information is not actually necessary for decoding, only for playback.
 */

static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb)
{
    MLPHeaderInfo mh;
254
    int substr, ret;
Ramiro Polla's avatar
Ramiro Polla committed
255

256 257
    if ((ret = ff_mlp_read_major_sync(m->avctx, &mh, gb)) != 0)
        return ret;
Ramiro Polla's avatar
Ramiro Polla committed
258 259

    if (mh.group1_bits == 0) {
Diego Biurrun's avatar
Diego Biurrun committed
260
        av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown bits per sample\n");
261
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
262 263 264
    }
    if (mh.group2_bits > mh.group1_bits) {
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
265
               "Channel group 2 cannot have more bits per sample than group 1.\n");
266
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
267 268 269 270
    }

    if (mh.group2_samplerate && mh.group2_samplerate != mh.group1_samplerate) {
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
271
               "Channel groups with differing sample rates are not currently supported.\n");
272
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
273 274 275
    }

    if (mh.group1_samplerate == 0) {
Diego Biurrun's avatar
Diego Biurrun committed
276
        av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown sampling rate\n");
277
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
278 279 280
    }
    if (mh.group1_samplerate > MAX_SAMPLERATE) {
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
281
               "Sampling rate %d is greater than the supported maximum (%d).\n",
Ramiro Polla's avatar
Ramiro Polla committed
282
               mh.group1_samplerate, MAX_SAMPLERATE);
283
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
284 285 286
    }
    if (mh.access_unit_size > MAX_BLOCKSIZE) {
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
287
               "Block size %d is greater than the supported maximum (%d).\n",
Ramiro Polla's avatar
Ramiro Polla committed
288
               mh.access_unit_size, MAX_BLOCKSIZE);
289
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
290 291 292
    }
    if (mh.access_unit_size_pow2 > MAX_BLOCKSIZE_POW2) {
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
293
               "Block size pow2 %d is greater than the supported maximum (%d).\n",
Ramiro Polla's avatar
Ramiro Polla committed
294
               mh.access_unit_size_pow2, MAX_BLOCKSIZE_POW2);
295
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
296 297 298
    }

    if (mh.num_substreams == 0)
299
        return AVERROR_INVALIDDATA;
300 301
    if (m->avctx->codec_id == CODEC_ID_MLP && mh.num_substreams > 2) {
        av_log(m->avctx, AV_LOG_ERROR, "MLP only supports up to 2 substreams.\n");
302
        return AVERROR_INVALIDDATA;
303
    }
Ramiro Polla's avatar
Ramiro Polla committed
304
    if (mh.num_substreams > MAX_SUBSTREAMS) {
305
        av_log_ask_for_sample(m->avctx,
Diego Biurrun's avatar
Diego Biurrun committed
306
               "Number of substreams %d is larger than the maximum supported "
307 308
               "by the decoder.\n", mh.num_substreams);
        return AVERROR_PATCHWELCOME;
Ramiro Polla's avatar
Ramiro Polla committed
309 310 311 312 313 314 315 316 317 318 319
    }

    m->access_unit_size      = mh.access_unit_size;
    m->access_unit_size_pow2 = mh.access_unit_size_pow2;

    m->num_substreams        = mh.num_substreams;
    m->max_decoded_substream = m->num_substreams - 1;

    m->avctx->sample_rate    = mh.group1_samplerate;
    m->avctx->frame_size     = mh.access_unit_size;

320
    m->avctx->bits_per_raw_sample = mh.group1_bits;
321
    if (mh.group1_bits > 16)
322
        m->avctx->sample_fmt = AV_SAMPLE_FMT_S32;
323
    else
324
        m->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
Ramiro Polla's avatar
Ramiro Polla committed
325 326 327 328 329

    m->params_valid = 1;
    for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
        m->substream[substr].restart_seen = 0;

330 331 332 333 334 335 336 337 338 339 340
    if (mh.stream_type == 0xbb) {
        /* MLP stream */
        m->avctx->channel_layout = ff_mlp_layout[mh.channels_mlp];
    } else { /* mh.stream_type == 0xba */
        /* TrueHD stream */
        if (mh.channels_thd_stream2) {
            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream2);
        } else {
            m->avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream1);
        }
        if (m->avctx->channels &&
341
            !m->avctx->request_channels && !m->avctx->request_channel_layout &&
342 343 344 345 346 347
            av_get_channel_layout_nb_channels(m->avctx->channel_layout) != m->avctx->channels) {
            m->avctx->channel_layout = 0;
            av_log_ask_for_sample(m->avctx, "Unknown channel layout.");
        }
    }

348 349
    m->needs_reordering = mh.channels_mlp >= 18 && mh.channels_mlp <= 20;

Ramiro Polla's avatar
Ramiro Polla committed
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
    return 0;
}

/** Read a restart header from a block in a substream. This contains parameters
 *  required to decode the audio that do not change very often. Generally
 *  (always) present only in blocks following a major sync. */

static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
                               const uint8_t *buf, unsigned int substr)
{
    SubStream *s = &m->substream[substr];
    unsigned int ch;
    int sync_word, tmp;
    uint8_t checksum;
    uint8_t lossless_check;
    int start_count = get_bits_count(gbp);
366 367 368
    const int max_matrix_channel = m->avctx->codec_id == CODEC_ID_MLP
                                 ? MAX_MATRIX_CHANNEL_MLP
                                 : MAX_MATRIX_CHANNEL_TRUEHD;
369
    int max_channel, min_channel, matrix_channel;
Ramiro Polla's avatar
Ramiro Polla committed
370 371 372

    sync_word = get_bits(gbp, 13);

373
    if (sync_word != 0x31ea >> 1) {
Ramiro Polla's avatar
Ramiro Polla committed
374
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
375
               "restart header sync incorrect (got 0x%04x)\n", sync_word);
376
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
377 378
    }

379 380 381 382
    s->noise_type = get_bits1(gbp);

    if (m->avctx->codec_id == CODEC_ID_MLP && s->noise_type) {
        av_log(m->avctx, AV_LOG_ERROR, "MLP must have 0x31ea sync word.\n");
383
        return AVERROR_INVALIDDATA;
384 385
    }

Ramiro Polla's avatar
Ramiro Polla committed
386 387
    skip_bits(gbp, 16); /* Output timestamp */

388 389 390
    min_channel    = get_bits(gbp, 4);
    max_channel    = get_bits(gbp, 4);
    matrix_channel = get_bits(gbp, 4);
Ramiro Polla's avatar
Ramiro Polla committed
391

392
    if (matrix_channel > max_matrix_channel) {
393 394 395
        av_log(m->avctx, AV_LOG_ERROR,
               "Max matrix channel cannot be greater than %d.\n",
               max_matrix_channel);
396
        return AVERROR_INVALIDDATA;
397 398
    }

399
    if (max_channel != matrix_channel) {
400 401
        av_log(m->avctx, AV_LOG_ERROR,
               "Max channel must be equal max matrix channel.\n");
402
        return AVERROR_INVALIDDATA;
403 404
    }

405 406
    /* This should happen for TrueHD streams with >6 channels and MLP's noise
     * type. It is not yet known if this is allowed. */
407
    if (max_channel > MAX_MATRIX_CHANNEL_MLP && !s->noise_type) {
408
        av_log_ask_for_sample(m->avctx,
409
               "Number of channels %d is larger than the maximum supported "
410
               "by the decoder.\n", max_channel + 2);
411
        return AVERROR_PATCHWELCOME;
412 413
    }

414
    if (min_channel > max_channel) {
Ramiro Polla's avatar
Ramiro Polla committed
415 416
        av_log(m->avctx, AV_LOG_ERROR,
               "Substream min channel cannot be greater than max channel.\n");
417
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
418 419
    }

420 421 422 423
    s->min_channel = min_channel;
    s->max_channel = max_channel;
    s->max_matrix_channel = matrix_channel;

Ramiro Polla's avatar
Ramiro Polla committed
424 425 426
    if (m->avctx->request_channels > 0
        && s->max_channel + 1 >= m->avctx->request_channels
        && substr < m->max_decoded_substream) {
427
        av_log(m->avctx, AV_LOG_DEBUG,
Ramiro Polla's avatar
Ramiro Polla committed
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
               "Extracting %d channel downmix from substream %d. "
               "Further substreams will be skipped.\n",
               s->max_channel + 1, substr);
        m->max_decoded_substream = substr;
    }

    s->noise_shift   = get_bits(gbp,  4);
    s->noisegen_seed = get_bits(gbp, 23);

    skip_bits(gbp, 19);

    s->data_check_present = get_bits1(gbp);
    lossless_check = get_bits(gbp, 8);
    if (substr == m->max_decoded_substream
        && s->lossless_check_data != 0xffffffff) {
443
        tmp = xor_32_to_8(s->lossless_check_data);
Ramiro Polla's avatar
Ramiro Polla committed
444 445
        if (tmp != lossless_check)
            av_log(m->avctx, AV_LOG_WARNING,
Diego Biurrun's avatar
Diego Biurrun committed
446
                   "Lossless check failed - expected %02x, calculated %02x.\n",
Ramiro Polla's avatar
Ramiro Polla committed
447 448 449 450 451
                   lossless_check, tmp);
    }

    skip_bits(gbp, 16);

452 453
    memset(s->ch_assign, 0, sizeof(s->ch_assign));

Ramiro Polla's avatar
Ramiro Polla committed
454 455
    for (ch = 0; ch <= s->max_matrix_channel; ch++) {
        int ch_assign = get_bits(gbp, 6);
456
        if (ch_assign > s->max_matrix_channel) {
457 458 459 460
            av_log_ask_for_sample(m->avctx,
                   "Assignment of matrix channel %d to invalid output channel %d.\n",
                   ch, ch_assign);
            return AVERROR_PATCHWELCOME;
Ramiro Polla's avatar
Ramiro Polla committed
461
        }
462
        s->ch_assign[ch_assign] = ch;
Ramiro Polla's avatar
Ramiro Polla committed
463 464
    }

465
    if (m->avctx->codec_id == CODEC_ID_MLP && m->needs_reordering) {
466 467
        if (m->avctx->channel_layout == (AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY) ||
            m->avctx->channel_layout == AV_CH_LAYOUT_5POINT0_BACK) {
468 469 470 471
            int i = s->ch_assign[4];
            s->ch_assign[4] = s->ch_assign[3];
            s->ch_assign[3] = s->ch_assign[2];
            s->ch_assign[2] = i;
472
        } else if (m->avctx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) {
473 474 475 476
            FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
            FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
        }
    }
477
    if (m->avctx->codec_id == CODEC_ID_TRUEHD &&
478 479
        (m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1 ||
        m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1_WIDE)) {
480 481
        FFSWAP(int, s->ch_assign[4], s->ch_assign[6]);
        FFSWAP(int, s->ch_assign[5], s->ch_assign[7]);
482 483 484 485 486 487 488 489
    } else if (m->avctx->codec_id == CODEC_ID_TRUEHD &&
        (m->avctx->channel_layout == AV_CH_LAYOUT_6POINT1 ||
        m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_CENTER) ||
        m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 | AV_CH_TOP_FRONT_CENTER))) {
        int i = s->ch_assign[6];
        s->ch_assign[6] = s->ch_assign[5];
        s->ch_assign[5] = s->ch_assign[4];
        s->ch_assign[4] = i;
490
    }
491

492
    checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
Ramiro Polla's avatar
Ramiro Polla committed
493 494

    if (checksum != get_bits(gbp, 8))
Diego Biurrun's avatar
Diego Biurrun committed
495
        av_log(m->avctx, AV_LOG_ERROR, "restart header checksum error\n");
Ramiro Polla's avatar
Ramiro Polla committed
496

Diego Biurrun's avatar
Diego Biurrun committed
497
    /* Set default decoding parameters. */
Ramiro Polla's avatar
Ramiro Polla committed
498 499 500 501 502 503 504 505 506
    s->param_presence_flags   = 0xff;
    s->num_primitive_matrices = 0;
    s->blocksize              = 8;
    s->lossless_check_data    = 0;

    memset(s->output_shift   , 0, sizeof(s->output_shift   ));
    memset(s->quant_step_size, 0, sizeof(s->quant_step_size));

    for (ch = s->min_channel; ch <= s->max_channel; ch++) {
507
        ChannelParams *cp = &s->channel_params[ch];
508 509 510 511
        cp->filter_params[FIR].order = 0;
        cp->filter_params[IIR].order = 0;
        cp->filter_params[FIR].shift = 0;
        cp->filter_params[IIR].shift = 0;
Ramiro Polla's avatar
Ramiro Polla committed
512

Diego Biurrun's avatar
Diego Biurrun committed
513
        /* Default audio coding is 24-bit raw PCM. */
514 515 516 517
        cp->huff_offset      = 0;
        cp->sign_huff_offset = (-1) << 23;
        cp->codebook         = 0;
        cp->huff_lsbs        = 24;
Ramiro Polla's avatar
Ramiro Polla committed
518 519
    }

520
    if (substr == m->max_decoded_substream)
521
        m->avctx->channels = s->max_matrix_channel + 1;
Ramiro Polla's avatar
Ramiro Polla committed
522 523 524 525 526 527 528

    return 0;
}

/** Read parameters for one of the prediction filters. */

static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
529 530
                              unsigned int substr, unsigned int channel,
                              unsigned int filter)
Ramiro Polla's avatar
Ramiro Polla committed
531
{
532 533
    SubStream *s = &m->substream[substr];
    FilterParams *fp = &s->channel_params[channel].filter_params[filter];
534
    const int max_order = filter ? MAX_IIR_ORDER : MAX_FIR_ORDER;
Ramiro Polla's avatar
Ramiro Polla committed
535 536 537
    const char fchar = filter ? 'I' : 'F';
    int i, order;

Diego Biurrun's avatar
Diego Biurrun committed
538
    // Filter is 0 for FIR, 1 for IIR.
Ramiro Polla's avatar
Ramiro Polla committed
539 540
    assert(filter < 2);

541 542
    if (m->filter_changed[channel][filter]++ > 1) {
        av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
543
        return AVERROR_INVALIDDATA;
544
    }
545

Ramiro Polla's avatar
Ramiro Polla committed
546
    order = get_bits(gbp, 4);
547
    if (order > max_order) {
Ramiro Polla's avatar
Ramiro Polla committed
548
        av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
549
               "%cIR filter order %d is greater than maximum %d.\n",
550
               fchar, order, max_order);
551
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
552
    }
553
    fp->order = order;
Ramiro Polla's avatar
Ramiro Polla committed
554 555

    if (order > 0) {
556
        int32_t *fcoeff = s->channel_params[channel].coeff[filter];
Ramiro Polla's avatar
Ramiro Polla committed
557 558
        int coeff_bits, coeff_shift;

559
        fp->shift = get_bits(gbp, 4);
Ramiro Polla's avatar
Ramiro Polla committed
560 561 562 563 564

        coeff_bits  = get_bits(gbp, 5);
        coeff_shift = get_bits(gbp, 3);
        if (coeff_bits < 1 || coeff_bits > 16) {
            av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
565
                   "%cIR filter coeff_bits must be between 1 and 16.\n",
Ramiro Polla's avatar
Ramiro Polla committed
566
                   fchar);
567
            return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
568 569 570
        }
        if (coeff_bits + coeff_shift > 16) {
            av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
571
                   "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
Ramiro Polla's avatar
Ramiro Polla committed
572
                   fchar);
573
            return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
574 575 576
        }

        for (i = 0; i < order; i++)
577
            fcoeff[i] = get_sbits(gbp, coeff_bits) << coeff_shift;
Ramiro Polla's avatar
Ramiro Polla committed
578 579 580 581 582 583

        if (get_bits1(gbp)) {
            int state_bits, state_shift;

            if (filter == FIR) {
                av_log(m->avctx, AV_LOG_ERROR,
Diego Biurrun's avatar
Diego Biurrun committed
584
                       "FIR filter has state data specified.\n");
585
                return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
586 587 588 589 590
            }

            state_bits  = get_bits(gbp, 4);
            state_shift = get_bits(gbp, 4);

Diego Biurrun's avatar
Diego Biurrun committed
591
            /* TODO: Check validity of state data. */
Ramiro Polla's avatar
Ramiro Polla committed
592 593

            for (i = 0; i < order; i++)
594
                fp->state[i] = get_sbits(gbp, state_bits) << state_shift;
Ramiro Polla's avatar
Ramiro Polla committed
595 596 597 598 599 600
        }
    }

    return 0;
}

601 602
/** Read parameters for primitive matrices. */

603
static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitContext *gbp)
604
{
605
    SubStream *s = &m->substream[substr];
606
    unsigned int mat, ch;
607 608 609
    const int max_primitive_matrices = m->avctx->codec_id == CODEC_ID_MLP
                                     ? MAX_MATRICES_MLP
                                     : MAX_MATRICES_TRUEHD;
610

611 612
    if (m->matrix_changed++ > 1) {
        av_log(m->avctx, AV_LOG_ERROR, "Matrices may change only once per access unit.\n");
613
        return AVERROR_INVALIDDATA;
614 615
    }

616 617
    s->num_primitive_matrices = get_bits(gbp, 4);

618 619 620 621
    if (s->num_primitive_matrices > max_primitive_matrices) {
        av_log(m->avctx, AV_LOG_ERROR,
               "Number of primitive matrices cannot be greater than %d.\n",
               max_primitive_matrices);
622
        return AVERROR_INVALIDDATA;
623 624
    }

625 626 627 628 629 630
    for (mat = 0; mat < s->num_primitive_matrices; mat++) {
        int frac_bits, max_chan;
        s->matrix_out_ch[mat] = get_bits(gbp, 4);
        frac_bits             = get_bits(gbp, 4);
        s->lsb_bypass   [mat] = get_bits1(gbp);

631
        if (s->matrix_out_ch[mat] > s->max_matrix_channel) {
632 633 634
            av_log(m->avctx, AV_LOG_ERROR,
                    "Invalid channel %d specified as output from matrix.\n",
                    s->matrix_out_ch[mat]);
635
            return AVERROR_INVALIDDATA;
636 637 638 639
        }
        if (frac_bits > 14) {
            av_log(m->avctx, AV_LOG_ERROR,
                    "Too many fractional bits specified.\n");
640
            return AVERROR_INVALIDDATA;
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
        }

        max_chan = s->max_matrix_channel;
        if (!s->noise_type)
            max_chan+=2;

        for (ch = 0; ch <= max_chan; ch++) {
            int coeff_val = 0;
            if (get_bits1(gbp))
                coeff_val = get_sbits(gbp, frac_bits + 2);

            s->matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
        }

        if (s->noise_type)
            s->matrix_noise_shift[mat] = get_bits(gbp, 4);
        else
            s->matrix_noise_shift[mat] = 0;
    }

    return 0;
}

664 665 666 667 668
/** Read channel parameters. */

static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
                               GetBitContext *gbp, unsigned int ch)
{
669 670
    SubStream *s = &m->substream[substr];
    ChannelParams *cp = &s->channel_params[ch];
671 672
    FilterParams *fir = &cp->filter_params[FIR];
    FilterParams *iir = &cp->filter_params[IIR];
673
    int ret;
674 675 676

    if (s->param_presence_flags & PARAM_FIR)
        if (get_bits1(gbp))
677 678
            if ((ret = read_filter_params(m, gbp, substr, ch, FIR)) < 0)
                return ret;
679 680 681

    if (s->param_presence_flags & PARAM_IIR)
        if (get_bits1(gbp))
682 683
            if ((ret = read_filter_params(m, gbp, substr, ch, IIR)) < 0)
                return ret;
684

685 686
    if (fir->order + iir->order > 8) {
        av_log(m->avctx, AV_LOG_ERROR, "Total filter orders too high.\n");
687
        return AVERROR_INVALIDDATA;
688 689
    }

690 691 692 693
    if (fir->order && iir->order &&
        fir->shift != iir->shift) {
        av_log(m->avctx, AV_LOG_ERROR,
                "FIR and IIR filters must use the same precision.\n");
694
        return AVERROR_INVALIDDATA;
695 696
    }
    /* The FIR and IIR filters must have the same precision.
697 698 699 700
     * To simplify the filtering code, only the precision of the
     * FIR filter is considered. If only the IIR filter is employed,
     * the FIR filter precision is set to that of the IIR filter, so
     * that the filtering code can use it. */
701 702 703 704 705 706 707 708 709 710
    if (!fir->order && iir->order)
        fir->shift = iir->shift;

    if (s->param_presence_flags & PARAM_HUFFOFFSET)
        if (get_bits1(gbp))
            cp->huff_offset = get_sbits(gbp, 15);

    cp->codebook  = get_bits(gbp, 2);
    cp->huff_lsbs = get_bits(gbp, 5);

711 712
    if (cp->huff_lsbs > 24) {
        av_log(m->avctx, AV_LOG_ERROR, "Invalid huff_lsbs.\n");
713
        return AVERROR_INVALIDDATA;
714
    }
715

716
    cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
717 718 719 720

    return 0;
}

Ramiro Polla's avatar
Ramiro Polla committed
721 722 723 724 725 726 727
/** Read decoding parameters that change more often than those in the restart
 *  header. */

static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
                                unsigned int substr)
{
    SubStream *s = &m->substream[substr];
728
    unsigned int ch;
729
    int ret;
Ramiro Polla's avatar
Ramiro Polla committed
730

731
    if (s->param_presence_flags & PARAM_PRESENCE)
732 733
        if (get_bits1(gbp))
            s->param_presence_flags = get_bits(gbp, 8);
Ramiro Polla's avatar
Ramiro Polla committed
734 735 736 737

    if (s->param_presence_flags & PARAM_BLOCKSIZE)
        if (get_bits1(gbp)) {
            s->blocksize = get_bits(gbp, 9);
738 739
            if (s->blocksize < 8 || s->blocksize > m->access_unit_size) {
                av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.");
Ramiro Polla's avatar
Ramiro Polla committed
740
                s->blocksize = 0;
741
                return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
742 743 744 745
            }
        }

    if (s->param_presence_flags & PARAM_MATRIX)
746
        if (get_bits1(gbp))
747 748
            if ((ret = read_matrix_params(m, substr, gbp)) < 0)
                return ret;
Ramiro Polla's avatar
Ramiro Polla committed
749 750 751

    if (s->param_presence_flags & PARAM_OUTSHIFT)
        if (get_bits1(gbp))
752
            for (ch = 0; ch <= s->max_matrix_channel; ch++)
753
                s->output_shift[ch] = get_sbits(gbp, 4);
Ramiro Polla's avatar
Ramiro Polla committed
754 755 756 757

    if (s->param_presence_flags & PARAM_QUANTSTEP)
        if (get_bits1(gbp))
            for (ch = 0; ch <= s->max_channel; ch++) {
758
                ChannelParams *cp = &s->channel_params[ch];
759

Ramiro Polla's avatar
Ramiro Polla committed
760 761
                s->quant_step_size[ch] = get_bits(gbp, 4);

762
                cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
Ramiro Polla's avatar
Ramiro Polla committed
763 764 765
            }

    for (ch = s->min_channel; ch <= s->max_channel; ch++)
766
        if (get_bits1(gbp))
767 768
            if ((ret = read_channel_params(m, substr, gbp, ch)) < 0)
                return ret;
Ramiro Polla's avatar
Ramiro Polla committed
769 770 771 772 773 774 775 776 777 778 779 780 781

    return 0;
}

#define MSB_MASK(bits)  (-1u << bits)

/** Generate PCM samples using the prediction filters and residual values
 *  read from the data stream, and update the filter state. */

static void filter_channel(MLPDecodeContext *m, unsigned int substr,
                           unsigned int channel)
{
    SubStream *s = &m->substream[substr];
782
    const int32_t *fircoeff = s->channel_params[channel].coeff[FIR];
783 784 785
    int32_t state_buffer[NUM_FILTERS][MAX_BLOCKSIZE + MAX_FIR_ORDER];
    int32_t *firbuf = state_buffer[FIR] + MAX_BLOCKSIZE;
    int32_t *iirbuf = state_buffer[IIR] + MAX_BLOCKSIZE;
786 787
    FilterParams *fir = &s->channel_params[channel].filter_params[FIR];
    FilterParams *iir = &s->channel_params[channel].filter_params[IIR];
788
    unsigned int filter_shift = fir->shift;
Ramiro Polla's avatar
Ramiro Polla committed
789 790
    int32_t mask = MSB_MASK(s->quant_step_size[channel]);

791 792
    memcpy(firbuf, fir->state, MAX_FIR_ORDER * sizeof(int32_t));
    memcpy(iirbuf, iir->state, MAX_IIR_ORDER * sizeof(int32_t));
Ramiro Polla's avatar
Ramiro Polla committed
793

794 795
    m->dsp.mlp_filter_channel(firbuf, fircoeff,
                              fir->order, iir->order,
796 797
                              filter_shift, mask, s->blocksize,
                              &m->sample_buffer[s->blockpos][channel]);
Ramiro Polla's avatar
Ramiro Polla committed
798

799 800
    memcpy(fir->state, firbuf - s->blocksize, MAX_FIR_ORDER * sizeof(int32_t));
    memcpy(iir->state, iirbuf - s->blocksize, MAX_IIR_ORDER * sizeof(int32_t));
Ramiro Polla's avatar
Ramiro Polla committed
801 802 803 804 805 806 807 808 809
}

/** Read a block of PCM residual data (or actual if no filtering active). */

static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
                           unsigned int substr)
{
    SubStream *s = &m->substream[substr];
    unsigned int i, ch, expected_stream_pos = 0;
810
    int ret;
Ramiro Polla's avatar
Ramiro Polla committed
811 812 813 814

    if (s->data_check_present) {
        expected_stream_pos  = get_bits_count(gbp);
        expected_stream_pos += get_bits(gbp, 16);
815 816
        av_log_ask_for_sample(m->avctx, "This file contains some features "
                              "we have not tested yet.\n");
Ramiro Polla's avatar
Ramiro Polla committed
817 818 819
    }

    if (s->blockpos + s->blocksize > m->access_unit_size) {
Diego Biurrun's avatar
Diego Biurrun committed
820
        av_log(m->avctx, AV_LOG_ERROR, "too many audio samples in frame\n");
821
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
822 823 824 825 826
    }

    memset(&m->bypassed_lsbs[s->blockpos][0], 0,
           s->blocksize * sizeof(m->bypassed_lsbs[0]));

827
    for (i = 0; i < s->blocksize; i++)
828 829
        if ((ret = read_huff_channels(m, gbp, substr, i)) < 0)
            return ret;
Ramiro Polla's avatar
Ramiro Polla committed
830

831
    for (ch = s->min_channel; ch <= s->max_channel; ch++)
Ramiro Polla's avatar
Ramiro Polla committed
832 833 834 835 836 837
        filter_channel(m, substr, ch);

    s->blockpos += s->blocksize;

    if (s->data_check_present) {
        if (get_bits_count(gbp) != expected_stream_pos)
Diego Biurrun's avatar
Diego Biurrun committed
838
            av_log(m->avctx, AV_LOG_ERROR, "block data length mismatch\n");
Ramiro Polla's avatar
Ramiro Polla committed
839 840 841 842 843 844
        skip_bits(gbp, 8);
    }

    return 0;
}

Diego Biurrun's avatar
Diego Biurrun committed
845
/** Data table used for TrueHD noise generation function. */
Ramiro Polla's avatar
Ramiro Polla committed
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932

static const int8_t noise_table[256] = {
     30,  51,  22,  54,   3,   7,  -4,  38,  14,  55,  46,  81,  22,  58,  -3,   2,
     52,  31,  -7,  51,  15,  44,  74,  30,  85, -17,  10,  33,  18,  80,  28,  62,
     10,  32,  23,  69,  72,  26,  35,  17,  73,  60,   8,  56,   2,   6,  -2,  -5,
     51,   4,  11,  50,  66,  76,  21,  44,  33,  47,   1,  26,  64,  48,  57,  40,
     38,  16, -10, -28,  92,  22, -18,  29, -10,   5, -13,  49,  19,  24,  70,  34,
     61,  48,  30,  14,  -6,  25,  58,  33,  42,  60,  67,  17,  54,  17,  22,  30,
     67,  44,  -9,  50, -11,  43,  40,  32,  59,  82,  13,  49, -14,  55,  60,  36,
     48,  49,  31,  47,  15,  12,   4,  65,   1,  23,  29,  39,  45,  -2,  84,  69,
      0,  72,  37,  57,  27,  41, -15, -16,  35,  31,  14,  61,  24,   0,  27,  24,
     16,  41,  55,  34,  53,   9,  56,  12,  25,  29,  53,   5,  20, -20,  -8,  20,
     13,  28,  -3,  78,  38,  16,  11,  62,  46,  29,  21,  24,  46,  65,  43, -23,
     89,  18,  74,  21,  38, -12,  19,  12, -19,   8,  15,  33,   4,  57,   9,  -8,
     36,  35,  26,  28,   7,  83,  63,  79,  75,  11,   3,  87,  37,  47,  34,  40,
     39,  19,  20,  42,  27,  34,  39,  77,  13,  42,  59,  64,  45,  -1,  32,  37,
     45,  -5,  53,  -6,   7,  36,  50,  23,   6,  32,   9, -21,  18,  71,  27,  52,
    -25,  31,  35,  42,  -1,  68,  63,  52,  26,  43,  66,  37,  41,  25,  40,  70,
};

/** Noise generation functions.
 *  I'm not sure what these are for - they seem to be some kind of pseudorandom
 *  sequence generators, used to generate noise data which is used when the
 *  channels are rematrixed. I'm not sure if they provide a practical benefit
 *  to compression, or just obfuscate the decoder. Are they for some kind of
 *  dithering? */

/** Generate two channels of noise, used in the matrix when
 *  restart sync word == 0x31ea. */

static void generate_2_noise_channels(MLPDecodeContext *m, unsigned int substr)
{
    SubStream *s = &m->substream[substr];
    unsigned int i;
    uint32_t seed = s->noisegen_seed;
    unsigned int maxchan = s->max_matrix_channel;

    for (i = 0; i < s->blockpos; i++) {
        uint16_t seed_shr7 = seed >> 7;
        m->sample_buffer[i][maxchan+1] = ((int8_t)(seed >> 15)) << s->noise_shift;
        m->sample_buffer[i][maxchan+2] = ((int8_t) seed_shr7)   << s->noise_shift;

        seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
    }

    s->noisegen_seed = seed;
}

/** Generate a block of noise, used when restart sync word == 0x31eb. */

static void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr)
{
    SubStream *s = &m->substream[substr];
    unsigned int i;
    uint32_t seed = s->noisegen_seed;

    for (i = 0; i < m->access_unit_size_pow2; i++) {
        uint8_t seed_shr15 = seed >> 15;
        m->noise_buffer[i] = noise_table[seed_shr15];
        seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
    }

    s->noisegen_seed = seed;
}


/** Apply the channel matrices in turn to reconstruct the original audio
 *  samples. */

static void rematrix_channels(MLPDecodeContext *m, unsigned int substr)
{
    SubStream *s = &m->substream[substr];
    unsigned int mat, src_ch, i;
    unsigned int maxchan;

    maxchan = s->max_matrix_channel;
    if (!s->noise_type) {
        generate_2_noise_channels(m, substr);
        maxchan += 2;
    } else {
        fill_noise_buffer(m, substr);
    }

    for (mat = 0; mat < s->num_primitive_matrices; mat++) {
        int matrix_noise_shift = s->matrix_noise_shift[mat];
        unsigned int dest_ch = s->matrix_out_ch[mat];
        int32_t mask = MSB_MASK(s->quant_step_size[dest_ch]);
933
        int32_t *coeffs = s->matrix_coeff[mat];
934 935
        int index  = s->num_primitive_matrices - mat;
        int index2 = 2 * index + 1;
Ramiro Polla's avatar
Ramiro Polla committed
936 937 938 939

        /* TODO: DSPContext? */

        for (i = 0; i < s->blockpos; i++) {
940
            int32_t bypassed_lsb = m->bypassed_lsbs[i][mat];
941
            int32_t *samples = m->sample_buffer[i];
Ramiro Polla's avatar
Ramiro Polla committed
942
            int64_t accum = 0;
943 944 945 946

            for (src_ch = 0; src_ch <= maxchan; src_ch++)
                accum += (int64_t) samples[src_ch] * coeffs[src_ch];

Ramiro Polla's avatar
Ramiro Polla committed
947
            if (matrix_noise_shift) {
948
                index &= m->access_unit_size_pow2 - 1;
Ramiro Polla's avatar
Ramiro Polla committed
949
                accum += m->noise_buffer[index] << (matrix_noise_shift + 7);
950
                index += index2;
Ramiro Polla's avatar
Ramiro Polla committed
951
            }
952

953
            samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
Ramiro Polla's avatar
Ramiro Polla committed
954 955 956 957 958 959
        }
    }
}

/** Write the audio data into the output buffer. */

960
static int output_data(MLPDecodeContext *m, unsigned int substr,
961
                       void *data, int *got_frame_ptr)
Ramiro Polla's avatar
Ramiro Polla committed
962
{
963
    AVCodecContext *avctx = m->avctx;
Ramiro Polla's avatar
Ramiro Polla committed
964
    SubStream *s = &m->substream[substr];
965
    unsigned int i, out_ch = 0;
966 967 968
    int32_t *data_32;
    int16_t *data_16;
    int ret;
969
    int is32 = (m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
Ramiro Polla's avatar
Ramiro Polla committed
970

971 972 973 974 975
    if (m->avctx->channels != s->max_matrix_channel + 1) {
        av_log(m->avctx, AV_LOG_ERROR, "channel count mismatch\n");
        return AVERROR_INVALIDDATA;
    }

976 977 978 979 980 981 982 983
    /* get output buffer */
    m->frame.nb_samples = s->blockpos;
    if ((ret = avctx->get_buffer(avctx, &m->frame)) < 0) {
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
        return ret;
    }
    data_32 = (int32_t *)m->frame.data[0];
    data_16 = (int16_t *)m->frame.data[0];
Ramiro Polla's avatar
Ramiro Polla committed
984 985

    for (i = 0; i < s->blockpos; i++) {
986 987 988 989 990
        for (out_ch = 0; out_ch <= s->max_matrix_channel; out_ch++) {
            int mat_ch = s->ch_assign[out_ch];
            int32_t sample = m->sample_buffer[i][mat_ch]
                          << s->output_shift[mat_ch];
            s->lossless_check_data ^= (sample & 0xffffff) << mat_ch;
Ramiro Polla's avatar
Ramiro Polla committed
991 992 993 994 995
            if (is32) *data_32++ = sample << 8;
            else      *data_16++ = sample >> 8;
        }
    }

996 997
    *got_frame_ptr   = 1;
    *(AVFrame *)data = m->frame;
Ramiro Polla's avatar
Ramiro Polla committed
998 999 1000 1001 1002

    return 0;
}

/** Read an access unit from the stream.
1003 1004
 *  @return negative on error, 0 if not enough data is present in the input stream,
 *  otherwise the number of bytes consumed. */
Ramiro Polla's avatar
Ramiro Polla committed
1005

1006 1007
static int read_access_unit(AVCodecContext *avctx, void* data,
                            int *got_frame_ptr, AVPacket *avpkt)
Ramiro Polla's avatar
Ramiro Polla committed
1008
{
1009 1010
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
Ramiro Polla's avatar
Ramiro Polla committed
1011 1012 1013 1014 1015 1016 1017 1018 1019
    MLPDecodeContext *m = avctx->priv_data;
    GetBitContext gb;
    unsigned int length, substr;
    unsigned int substream_start;
    unsigned int header_size = 4;
    unsigned int substr_header_size = 0;
    uint8_t substream_parity_present[MAX_SUBSTREAMS];
    uint16_t substream_data_len[MAX_SUBSTREAMS];
    uint8_t parity_bits;
1020
    int ret;
Ramiro Polla's avatar
Ramiro Polla committed
1021 1022 1023 1024 1025 1026

    if (buf_size < 4)
        return 0;

    length = (AV_RB16(buf) & 0xfff) * 2;

1027
    if (length < 4 || length > buf_size)
1028
        return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
1029 1030 1031

    init_get_bits(&gb, (buf + 4), (length - 4) * 8);

1032
    m->is_major_sync_unit = 0;
Ramiro Polla's avatar
Ramiro Polla committed
1033 1034 1035
    if (show_bits_long(&gb, 31) == (0xf8726fba >> 1)) {
        if (read_major_sync(m, &gb) < 0)
            goto error;
1036
        m->is_major_sync_unit = 1;
Ramiro Polla's avatar
Ramiro Polla committed
1037 1038 1039 1040 1041
        header_size += 28;
    }

    if (!m->params_valid) {
        av_log(m->avctx, AV_LOG_WARNING,
Diego Biurrun's avatar
Diego Biurrun committed
1042
               "Stream parameters not seen; skipping frame.\n");
1043
        *got_frame_ptr = 0;
Ramiro Polla's avatar
Ramiro Polla committed
1044 1045 1046 1047 1048 1049
        return length;
    }

    substream_start = 0;

    for (substr = 0; substr < m->num_substreams; substr++) {
1050
        int extraword_present, checkdata_present, end, nonrestart_substr;
Ramiro Polla's avatar
Ramiro Polla committed
1051 1052

        extraword_present = get_bits1(&gb);
1053
        nonrestart_substr = get_bits1(&gb);
Ramiro Polla's avatar
Ramiro Polla committed
1054 1055 1056 1057 1058 1059 1060 1061
        checkdata_present = get_bits1(&gb);
        skip_bits1(&gb);

        end = get_bits(&gb, 12) * 2;

        substr_header_size += 2;

        if (extraword_present) {
1062 1063 1064 1065
            if (m->avctx->codec_id == CODEC_ID_MLP) {
                av_log(m->avctx, AV_LOG_ERROR, "There must be no extraword for MLP.\n");
                goto error;
            }
Ramiro Polla's avatar
Ramiro Polla committed
1066 1067 1068 1069
            skip_bits(&gb, 16);
            substr_header_size += 2;
        }

1070 1071 1072 1073 1074
        if (!(nonrestart_substr ^ m->is_major_sync_unit)) {
            av_log(m->avctx, AV_LOG_ERROR, "Invalid nonrestart_substr.\n");
            goto error;
        }

Ramiro Polla's avatar
Ramiro Polla committed
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
        if (end + header_size + substr_header_size > length) {
            av_log(m->avctx, AV_LOG_ERROR,
                   "Indicated length of substream %d data goes off end of "
                   "packet.\n", substr);
            end = length - header_size - substr_header_size;
        }

        if (end < substream_start) {
            av_log(avctx, AV_LOG_ERROR,
                   "Indicated end offset of substream %d data "
                   "is smaller than calculated start offset.\n",
                   substr);
            goto error;
        }

        if (substr > m->max_decoded_substream)
            continue;

        substream_parity_present[substr] = checkdata_present;
        substream_data_len[substr] = end - substream_start;
        substream_start = end;
    }

1098 1099
    parity_bits  = ff_mlp_calculate_parity(buf, 4);
    parity_bits ^= ff_mlp_calculate_parity(buf + header_size, substr_header_size);
Ramiro Polla's avatar
Ramiro Polla committed
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111

    if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
        av_log(avctx, AV_LOG_ERROR, "Parity check failed.\n");
        goto error;
    }

    buf += header_size + substr_header_size;

    for (substr = 0; substr <= m->max_decoded_substream; substr++) {
        SubStream *s = &m->substream[substr];
        init_get_bits(&gb, buf, substream_data_len[substr] * 8);

1112 1113 1114
        m->matrix_changed = 0;
        memset(m->filter_changed, 0, sizeof(m->filter_changed));

Ramiro Polla's avatar
Ramiro Polla committed
1115 1116 1117 1118
        s->blockpos = 0;
        do {
            if (get_bits1(&gb)) {
                if (get_bits1(&gb)) {
Diego Biurrun's avatar
Diego Biurrun committed
1119
                    /* A restart header should be present. */
Ramiro Polla's avatar
Ramiro Polla committed
1120 1121 1122 1123 1124
                    if (read_restart_header(m, &gb, buf, substr) < 0)
                        goto next_substr;
                    s->restart_seen = 1;
                }

1125
                if (!s->restart_seen)
Ramiro Polla's avatar
Ramiro Polla committed
1126 1127 1128 1129 1130
                    goto next_substr;
                if (read_decoding_params(m, &gb, substr) < 0)
                    goto next_substr;
            }

1131
            if (!s->restart_seen)
Ramiro Polla's avatar
Ramiro Polla committed
1132 1133
                goto next_substr;

1134 1135
            if ((ret = read_block_data(m, &gb, substr)) < 0)
                return ret;
Ramiro Polla's avatar
Ramiro Polla committed
1136

1137 1138 1139 1140
            if (get_bits_count(&gb) >= substream_data_len[substr] * 8)
                goto substream_length_mismatch;

        } while (!get_bits1(&gb));
Ramiro Polla's avatar
Ramiro Polla committed
1141 1142

        skip_bits(&gb, (-get_bits_count(&gb)) & 15);
1143

1144 1145 1146 1147
        if (substream_data_len[substr] * 8 - get_bits_count(&gb) >= 32) {
            int shorten_by;

            if (get_bits(&gb, 16) != 0xD234)
1148
                return AVERROR_INVALIDDATA;
1149 1150 1151 1152 1153

            shorten_by = get_bits(&gb, 16);
            if      (m->avctx->codec_id == CODEC_ID_TRUEHD && shorten_by  & 0x2000)
                s->blockpos -= FFMIN(shorten_by & 0x1FFF, s->blockpos);
            else if (m->avctx->codec_id == CODEC_ID_MLP    && shorten_by != 0xD234)
1154
                return AVERROR_INVALIDDATA;
1155

Ramiro Polla's avatar
Ramiro Polla committed
1156
            if (substr == m->max_decoded_substream)
Diego Biurrun's avatar
Diego Biurrun committed
1157
                av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n");
Ramiro Polla's avatar
Ramiro Polla committed
1158
        }
1159

1160
        if (substream_parity_present[substr]) {
Ramiro Polla's avatar
Ramiro Polla committed
1161 1162
            uint8_t parity, checksum;

1163 1164 1165
            if (substream_data_len[substr] * 8 - get_bits_count(&gb) != 16)
                goto substream_length_mismatch;

1166 1167
            parity   = ff_mlp_calculate_parity(buf, substream_data_len[substr] - 2);
            checksum = ff_mlp_checksum8       (buf, substream_data_len[substr] - 2);
Ramiro Polla's avatar
Ramiro Polla committed
1168

1169 1170 1171 1172
            if ((get_bits(&gb, 8) ^ parity) != 0xa9    )
                av_log(m->avctx, AV_LOG_ERROR, "Substream %d parity check failed.\n", substr);
            if ( get_bits(&gb, 8)           != checksum)
                av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n"    , substr);
Ramiro Polla's avatar
Ramiro Polla committed
1173
        }
1174 1175

        if (substream_data_len[substr] * 8 != get_bits_count(&gb))
1176
            goto substream_length_mismatch;
Ramiro Polla's avatar
Ramiro Polla committed
1177 1178

next_substr:
1179
        if (!s->restart_seen)
1180 1181 1182
            av_log(m->avctx, AV_LOG_ERROR,
                   "No restart header present in substream %d.\n", substr);

Ramiro Polla's avatar
Ramiro Polla committed
1183 1184 1185 1186 1187
        buf += substream_data_len[substr];
    }

    rematrix_channels(m, m->max_decoded_substream);

1188
    if ((ret = output_data(m, m->max_decoded_substream, data, got_frame_ptr)) < 0)
1189
        return ret;
Ramiro Polla's avatar
Ramiro Polla committed
1190 1191 1192

    return length;

1193 1194
substream_length_mismatch:
    av_log(m->avctx, AV_LOG_ERROR, "substream %d length mismatch\n", substr);
1195
    return AVERROR_INVALIDDATA;
1196

Ramiro Polla's avatar
Ramiro Polla committed
1197 1198
error:
    m->params_valid = 0;
1199
    return AVERROR_INVALIDDATA;
Ramiro Polla's avatar
Ramiro Polla committed
1200 1201
}

1202
AVCodec ff_mlp_decoder = {
1203 1204 1205 1206 1207 1208
    .name           = "mlp",
    .type           = AVMEDIA_TYPE_AUDIO,
    .id             = CODEC_ID_MLP,
    .priv_data_size = sizeof(MLPDecodeContext),
    .init           = mlp_decode_init,
    .decode         = read_access_unit,
1209
    .capabilities   = CODEC_CAP_DR1,
1210
    .long_name      = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
Ramiro Polla's avatar
Ramiro Polla committed
1211 1212
};

1213
#if CONFIG_TRUEHD_DECODER
1214
AVCodec ff_truehd_decoder = {
1215 1216 1217 1218 1219 1220
    .name           = "truehd",
    .type           = AVMEDIA_TYPE_AUDIO,
    .id             = CODEC_ID_TRUEHD,
    .priv_data_size = sizeof(MLPDecodeContext),
    .init           = mlp_decode_init,
    .decode         = read_access_unit,
1221
    .capabilities   = CODEC_CAP_DR1,
1222
    .long_name      = NULL_IF_CONFIG_SMALL("TrueHD"),
1223 1224
};
#endif /* CONFIG_TRUEHD_DECODER */