wmalosslessdec.c 47.4 KB
Newer Older
1
/*
2
 * Windows Media Audio Lossless decoder
3 4 5
 * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
 * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson
 * Copyright (c) 2011 Andreas Öman
6
 * Copyright (c) 2011 - 2012 Mashiat Sarker Shakkhar
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * 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
 */

25
#include "libavutil/attributes.h"
26 27
#include "libavutil/avassert.h"

28 29 30 31 32
#include "avcodec.h"
#include "internal.h"
#include "get_bits.h"
#include "put_bits.h"
#include "wma.h"
33
#include "wma_common.h"
34 35

/** current decoder limitations */
36 37 38 39
#define WMALL_MAX_CHANNELS      8                       ///< max number of handled channels
#define MAX_SUBFRAMES          32                       ///< max number of subframes per channel
#define MAX_BANDS              29                       ///< max number of scale factor bands
#define MAX_FRAMESIZE       32768                       ///< maximum compressed frame size
40
#define MAX_ORDER             256
41 42

#define WMALL_BLOCK_MIN_BITS    6                       ///< log2 of min block size
43
#define WMALL_BLOCK_MAX_BITS   14                       ///< log2 of max block size
44
#define WMALL_BLOCK_MAX_SIZE (1 << WMALL_BLOCK_MAX_BITS)    ///< maximum block size
45 46 47 48
#define WMALL_BLOCK_SIZES    (WMALL_BLOCK_MAX_BITS - WMALL_BLOCK_MIN_BITS + 1) ///< possible block sizes


/**
49
 * @brief frame-specific decoder context for a single channel
50 51
 */
typedef struct {
52 53 54 55 56 57 58 59 60
    int16_t     prev_block_len;                         ///< length of the previous block
    uint8_t     transmit_coefs;
    uint8_t     num_subframes;
    uint16_t    subframe_len[MAX_SUBFRAMES];            ///< subframe length in samples
    uint16_t    subframe_offsets[MAX_SUBFRAMES];        ///< subframe positions in the current frame
    uint8_t     cur_subframe;                           ///< current subframe number
    uint16_t    decoded_samples;                        ///< number of already processed samples
    int         quant_step;                             ///< quantization step for the current subframe
    int         transient_counter;                      ///< number of transient samples from the beginning of the transient zone
61 62 63 64 65 66 67
} WmallChannelCtx;

/**
 * @brief main decoder context
 */
typedef struct WmallDecodeCtx {
    /* generic decoder variables */
68 69 70 71
    AVCodecContext  *avctx;
    AVFrame         frame;
    uint8_t         frame_data[MAX_FRAMESIZE + FF_INPUT_BUFFER_PADDING_SIZE];  ///< compressed frame data
    PutBitContext   pb;                             ///< context for filling the frame_data buffer
72 73

    /* frame size dependent frame information (set during initialization) */
74 75 76 77 78 79 80 81 82 83 84 85
    uint32_t        decode_flags;                   ///< used compression features
    int             len_prefix;                     ///< frame is prefixed with its length
    int             dynamic_range_compression;      ///< frame contains DRC data
    uint8_t         bits_per_sample;                ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0])
    uint16_t        samples_per_frame;              ///< number of samples to output
    uint16_t        log2_frame_size;
    int8_t          num_channels;                   ///< number of channels in the stream (same as AVCodecContext.num_channels)
    int8_t          lfe_channel;                    ///< lfe channel index
    uint8_t         max_num_subframes;
    uint8_t         subframe_len_bits;              ///< number of bits used for the subframe length
    uint8_t         max_subframe_len_bit;           ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1
    uint16_t        min_samples_per_subframe;
86 87

    /* packet decode state */
88 89 90 91 92 93 94 95 96
    GetBitContext   pgb;                            ///< bitstream reader context for the packet
    int             next_packet_start;              ///< start offset of the next WMA packet in the demuxer packet
    uint8_t         packet_offset;                  ///< offset to the frame in the packet
    uint8_t         packet_sequence_number;         ///< current packet number
    int             num_saved_bits;                 ///< saved number of bits
    int             frame_offset;                   ///< frame offset in the bit reservoir
    int             subframe_offset;                ///< subframe offset in the bit reservoir
    uint8_t         packet_loss;                    ///< set in case of bitstream error
    uint8_t         packet_done;                    ///< set when a packet is fully decoded
97 98

    /* frame decode state */
99 100 101
    uint32_t        frame_num;                      ///< current frame number (not used for decoding)
    GetBitContext   gb;                             ///< bitstream reader context
    int             buf_bit_size;                   ///< buffer size in bits
102 103
    int16_t         *samples_16[WMALL_MAX_CHANNELS]; ///< current samplebuffer pointer (16-bit)
    int32_t         *samples_32[WMALL_MAX_CHANNELS]; ///< current samplebuffer pointer (24-bit)
104 105 106
    uint8_t         drc_gain;                       ///< gain for the DRC tool
    int8_t          skip_frame;                     ///< skip output step
    int8_t          parsed_all_subframes;           ///< all subframes decoded?
107 108

    /* subframe/block decode state */
109 110 111
    int16_t         subframe_len;                   ///< current subframe length
    int8_t          channels_for_cur_subframe;      ///< number of channels that contain the subframe
    int8_t          channel_indexes_for_cur_subframe[WMALL_MAX_CHANNELS];
112

Mashiat Sarker Shakkhar's avatar
Mashiat Sarker Shakkhar committed
113
    WmallChannelCtx channel[WMALL_MAX_CHANNELS];    ///< per channel data
114

115
    // WMA Lossless-specific
116 117 118 119 120 121 122

    uint8_t do_arith_coding;
    uint8_t do_ac_filter;
    uint8_t do_inter_ch_decorr;
    uint8_t do_mclms;
    uint8_t do_lpc;

123 124
    int8_t  acfilter_order;
    int8_t  acfilter_scaling;
125
    int64_t acfilter_coeffs[16];
126
    int     acfilter_prevvalues[WMALL_MAX_CHANNELS][16];
127

128 129
    int8_t  mclms_order;
    int8_t  mclms_scaling;
130 131
    int16_t mclms_coeffs[128];
    int16_t mclms_coeffs_cur[4];
132 133
    int16_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32];
    int16_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32];
134
    int     mclms_recent;
135

136 137
    int     movave_scaling;
    int     quant_stepsize;
138 139

    struct {
140 141 142 143
        int order;
        int scaling;
        int coefsend;
        int bitsend;
144 145 146
        int16_t coefs[MAX_ORDER];
        int16_t lms_prevvalues[MAX_ORDER * 2];
        int16_t lms_updates[MAX_ORDER * 2];
147
        int recent;
148
    } cdlms[WMALL_MAX_CHANNELS][9];
149

150
    int cdlms_ttl[WMALL_MAX_CHANNELS];
151 152 153

    int bV3RTM;

154 155
    int is_channel_coded[WMALL_MAX_CHANNELS];
    int update_speed[WMALL_MAX_CHANNELS];
156

157 158
    int transient[WMALL_MAX_CHANNELS];
    int transient_pos[WMALL_MAX_CHANNELS];
159 160
    int seekable_tile;

161
    int ave_sum[WMALL_MAX_CHANNELS];
162

163
    int channel_residues[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE];
164

165
    int lpc_coefs[WMALL_MAX_CHANNELS][40];
166 167 168 169
    int lpc_order;
    int lpc_scaling;
    int lpc_intbits;

170
    int channel_coeffs[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE];
171 172 173 174 175
} WmallDecodeCtx;


static av_cold int decode_init(AVCodecContext *avctx)
{
176
    WmallDecodeCtx *s  = avctx->priv_data;
177 178
    uint8_t *edata_ptr = avctx->extradata;
    unsigned int channel_mask;
179
    int i, log2_max_num_subframes;
180 181 182 183 184

    s->avctx = avctx;
    init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);

    if (avctx->extradata_size >= 18) {
185 186
        s->decode_flags    = AV_RL16(edata_ptr + 14);
        channel_mask       = AV_RL32(edata_ptr +  2);
187
        s->bits_per_sample = AV_RL16(edata_ptr);
188
        if (s->bits_per_sample == 16)
189
            avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
190
        else if (s->bits_per_sample == 24) {
191
            avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
192
            av_log_missing_feature(avctx, "Bit-depth higher than 16", 0);
193 194
            return AVERROR_PATCHWELCOME;
        } else {
195 196 197 198
            av_log(avctx, AV_LOG_ERROR, "Unknown bit-depth: %d\n",
                   s->bits_per_sample);
            return AVERROR_INVALIDDATA;
        }
199
        /* dump the extradata */
200
        for (i = 0; i < avctx->extradata_size; i++)
201 202
            av_dlog(avctx, "[%x] ", avctx->extradata[i]);
        av_dlog(avctx, "\n");
203 204

    } else {
205
        av_log_ask_for_sample(avctx, "Unsupported extradata size\n");
206
        return AVERROR_PATCHWELCOME;
207 208
    }

209
    /* generic init */
210 211
    s->log2_frame_size = av_log2(avctx->block_align) + 4;

212
    /* frame info */
213 214
    s->skip_frame  = 1; /* skip first frame */
    s->packet_loss = 1;
215
    s->len_prefix  = s->decode_flags & 0x40;
216

217 218 219
    /* get frame len */
    s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate,
                                                          3, s->decode_flags);
220
    av_assert0(s->samples_per_frame <= WMALL_BLOCK_MAX_SIZE);
221

222
    /* init previous block len */
223 224 225
    for (i = 0; i < avctx->channels; i++)
        s->channel[i].prev_block_len = s->samples_per_frame;

226 227
    /* subframe info */
    log2_max_num_subframes  = (s->decode_flags & 0x38) >> 3;
Mashiat Sarker Shakkhar's avatar
Mashiat Sarker Shakkhar committed
228
    s->max_num_subframes    = 1 << log2_max_num_subframes;
229
    s->max_subframe_len_bit = 0;
Mashiat Sarker Shakkhar's avatar
Mashiat Sarker Shakkhar committed
230
    s->subframe_len_bits    = av_log2(log2_max_num_subframes) + 1;
231 232

    s->min_samples_per_subframe  = s->samples_per_frame / s->max_num_subframes;
233 234
    s->dynamic_range_compression = s->decode_flags & 0x80;
    s->bV3RTM                    = s->decode_flags & 0x100;
235 236 237 238 239 240 241 242 243

    if (s->max_num_subframes > MAX_SUBFRAMES) {
        av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %i\n",
               s->max_num_subframes);
        return AVERROR_INVALIDDATA;
    }

    s->num_channels = avctx->channels;

244
    /* extract lfe channel position */
245 246 247 248
    s->lfe_channel = -1;

    if (channel_mask & 8) {
        unsigned int mask;
249
        for (mask = 1; mask < 16; mask <<= 1)
250 251 252 253 254
            if (channel_mask & mask)
                ++s->lfe_channel;
    }

    if (s->num_channels < 0) {
255 256
        av_log(avctx, AV_LOG_ERROR, "invalid number of channels %d\n",
               s->num_channels);
257 258 259 260 261 262
        return AVERROR_INVALIDDATA;
    } else if (s->num_channels > WMALL_MAX_CHANNELS) {
        av_log_ask_for_sample(avctx, "unsupported number of channels\n");
        return AVERROR_PATCHWELCOME;
    }

263
    avcodec_get_frame_defaults(&s->frame);
264
    avctx->coded_frame    = &s->frame;
265 266 267 268 269
    avctx->channel_layout = channel_mask;
    return 0;
}

/**
270 271 272 273
 * @brief Decode the subframe length.
 * @param s      context
 * @param offset sample offset in the frame
 * @return decoded subframe length on success, < 0 in case of an error
274 275 276
 */
static int decode_subframe_length(WmallDecodeCtx *s, int offset)
{
277
    int frame_len_ratio, subframe_len, len;
278

279
    /* no need to read from the bitstream when only one length is possible */
280 281 282
    if (offset == s->samples_per_frame - s->min_samples_per_subframe)
        return s->min_samples_per_subframe;

283
    len             = av_log2(s->max_num_subframes - 1) + 1;
284
    frame_len_ratio = get_bits(&s->gb, len);
285
    subframe_len    = s->min_samples_per_subframe * (frame_len_ratio + 1);
286

287
    /* sanity check the length */
288 289 290 291 292 293 294 295 296 297
    if (subframe_len < s->min_samples_per_subframe ||
        subframe_len > s->samples_per_frame) {
        av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n",
               subframe_len);
        return AVERROR_INVALIDDATA;
    }
    return subframe_len;
}

/**
298
 * @brief Decode how the data in the frame is split into subframes.
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
 *       Every WMA frame contains the encoded data for a fixed number of
 *       samples per channel. The data for every channel might be split
 *       into several subframes. This function will reconstruct the list of
 *       subframes for every channel.
 *
 *       If the subframes are not evenly split, the algorithm estimates the
 *       channels with the lowest number of total samples.
 *       Afterwards, for each of these channels a bit is read from the
 *       bitstream that indicates if the channel contains a subframe with the
 *       next subframe size that is going to be read from the bitstream or not.
 *       If a channel contains such a subframe, the subframe size gets added to
 *       the channel's subframe list.
 *       The algorithm repeats these steps until the frame is properly divided
 *       between the individual channels.
 *
314 315
 * @param s context
 * @return 0 on success, < 0 in case of an error
316
 */
317
static int decode_tilehdr(WmallDecodeCtx *s)
318
{
319 320 321 322 323 324 325 326
    uint16_t num_samples[WMALL_MAX_CHANNELS] = { 0 }; /* sum of samples for all currently known subframes of a channel */
    uint8_t  contains_subframe[WMALL_MAX_CHANNELS];   /* flag indicating if a channel contains the current subframe */
    int channels_for_cur_subframe = s->num_channels;  /* number of channels that contain the current subframe */
    int fixed_channel_layout = 0;                     /* flag indicating that all channels use the same subfra2me offsets and sizes */
    int min_channel_len = 0;                          /* smallest sum of samples (channels with this length will be processed first) */
    int c, tile_aligned;

    /* reset tiling information */
327 328 329
    for (c = 0; c < s->num_channels; c++)
        s->channel[c].num_subframes = 0;

330 331
    tile_aligned = get_bits1(&s->gb);
    if (s->max_num_subframes == 1 || tile_aligned)
332
        fixed_channel_layout = 1;
333

334
    /* loop until the frame data is split between the subframes */
335
    do {
336
        int subframe_len, in_use = 0;
337

338
        /* check which channels contain the subframe */
339 340 341
        for (c = 0; c < s->num_channels; c++) {
            if (num_samples[c] == min_channel_len) {
                if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
342
                   (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe)) {
343
                    contains_subframe[c] = in_use = 1;
344
                } else {
345 346
                    if (get_bits1(&s->gb))
                        contains_subframe[c] = in_use = 1;
347
                }
348 349 350 351
            } else
                contains_subframe[c] = 0;
        }

352 353 354 355 356 357
        if (!in_use) {
            av_log(s->avctx, AV_LOG_ERROR,
                   "Found empty subframe\n");
            return AVERROR_INVALIDDATA;
        }

358
        /* get subframe length, subframe_len == 0 is not allowed */
359
        if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
360
            return AVERROR_INVALIDDATA;
361
        /* add subframes to the individual channels and find new min_channel_len */
362 363
        min_channel_len += subframe_len;
        for (c = 0; c < s->num_channels; c++) {
364
            WmallChannelCtx *chan = &s->channel[c];
365 366 367 368 369 370 371 372 373 374 375 376 377

            if (contains_subframe[c]) {
                if (chan->num_subframes >= MAX_SUBFRAMES) {
                    av_log(s->avctx, AV_LOG_ERROR,
                           "broken frame: num subframes > 31\n");
                    return AVERROR_INVALIDDATA;
                }
                chan->subframe_len[chan->num_subframes] = subframe_len;
                num_samples[c] += subframe_len;
                ++chan->num_subframes;
                if (num_samples[c] > s->samples_per_frame) {
                    av_log(s->avctx, AV_LOG_ERROR, "broken frame: "
                           "channel len(%d) > samples_per_frame(%d)\n",
378
                           num_samples[c], s->samples_per_frame);
379 380 381 382 383 384 385 386 387 388 389 390 391
                    return AVERROR_INVALIDDATA;
                }
            } else if (num_samples[c] <= min_channel_len) {
                if (num_samples[c] < min_channel_len) {
                    channels_for_cur_subframe = 0;
                    min_channel_len = num_samples[c];
                }
                ++channels_for_cur_subframe;
            }
        }
    } while (min_channel_len < s->samples_per_frame);

    for (c = 0; c < s->num_channels; c++) {
392
        int i, offset = 0;
393
        for (i = 0; i < s->channel[c].num_subframes; i++) {
394
            s->channel[c].subframe_offsets[i] = offset;
395 396 397 398 399 400 401 402 403 404
            offset += s->channel[c].subframe_len[i];
        }
    }

    return 0;
}

static void decode_ac_filter(WmallDecodeCtx *s)
{
    int i;
405
    s->acfilter_order   = get_bits(&s->gb, 4) + 1;
406 407
    s->acfilter_scaling = get_bits(&s->gb, 4);

408
    for (i = 0; i < s->acfilter_order; i++)
409 410
        s->acfilter_coeffs[i] = (s->acfilter_scaling ?
                                 get_bits(&s->gb, s->acfilter_scaling) : 0) + 1;
411 412 413 414
}

static void decode_mclms(WmallDecodeCtx *s)
{
415
    s->mclms_order   = (get_bits(&s->gb, 4) + 1) * 2;
416
    s->mclms_scaling = get_bits(&s->gb, 4);
417 418
    if (get_bits1(&s->gb)) {
        int i, send_coef_bits;
419
        int cbits = av_log2(s->mclms_scaling + 1);
420
        if (1 << cbits < s->mclms_scaling + 1)
421 422 423 424
            cbits++;

        send_coef_bits = (cbits ? get_bits(&s->gb, cbits) : 0) + 2;

425
        for (i = 0; i < s->mclms_order * s->num_channels * s->num_channels; i++)
426 427
            s->mclms_coeffs[i] = get_bits(&s->gb, send_coef_bits);

428
        for (i = 0; i < s->num_channels; i++) {
429
            int c;
430
            for (c = 0; c < i; c++)
431 432
                s->mclms_coeffs_cur[i * s->num_channels + c] = get_bits(&s->gb, send_coef_bits);
        }
433 434 435
    }
}

436
static int decode_cdlms(WmallDecodeCtx *s)
437 438 439 440
{
    int c, i;
    int cdlms_send_coef = get_bits1(&s->gb);

441
    for (c = 0; c < s->num_channels; c++) {
442
        s->cdlms_ttl[c] = get_bits(&s->gb, 3) + 1;
443
        for (i = 0; i < s->cdlms_ttl[c]; i++) {
444
            s->cdlms[c][i].order = (get_bits(&s->gb, 7) + 1) * 8;
445 446 447 448 449 450 451 452
            if (s->cdlms[c][i].order > MAX_ORDER) {
                av_log(s->avctx, AV_LOG_ERROR,
                       "Order[%d][%d] %d > max (%d), not supported\n",
                       c, i, s->cdlms[c][i].order, MAX_ORDER);
                s->cdlms[0][0].order = 0;
                return AVERROR_INVALIDDATA;
            }
        }
453

454
        for (i = 0; i < s->cdlms_ttl[c]; i++)
455 456
            s->cdlms[c][i].scaling = get_bits(&s->gb, 4);

457 458
        if (cdlms_send_coef) {
            for (i = 0; i < s->cdlms_ttl[c]; i++) {
459 460
                int cbits, shift_l, shift_r, j;
                cbits = av_log2(s->cdlms[c][i].order);
461
                if ((1 << cbits) < s->cdlms[c][i].order)
462 463 464 465
                    cbits++;
                s->cdlms[c][i].coefsend = get_bits(&s->gb, cbits) + 1;

                cbits = av_log2(s->cdlms[c][i].scaling + 1);
466
                if ((1 << cbits) < s->cdlms[c][i].scaling + 1)
467 468 469 470
                    cbits++;

                s->cdlms[c][i].bitsend = get_bits(&s->gb, cbits) + 2;
                shift_l = 32 - s->cdlms[c][i].bitsend;
471 472
                shift_r = 32 - s->cdlms[c][i].scaling - 2;
                for (j = 0; j < s->cdlms[c][i].coefsend; j++)
473 474 475 476
                    s->cdlms[c][i].coefs[j] =
                        (get_bits(&s->gb, s->cdlms[c][i].bitsend) << shift_l) >> shift_r;
            }
        }
477
    }
478 479

    return 0;
480 481 482 483 484 485 486
}

static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
{
    int i = 0;
    unsigned int ave_mean;
    s->transient[ch] = get_bits1(&s->gb);
487 488
    if (s->transient[ch]) {
        s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size));
489
        if (s->transient_pos[ch])
490 491 492 493 494
            s->transient[ch] = 0;
        s->channel[ch].transient_counter =
            FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2);
    } else if (s->channel[ch].transient_counter)
        s->transient[ch] = 1;
495

496
    if (s->seekable_tile) {
497 498
        ave_mean = get_bits(&s->gb, s->bits_per_sample);
        s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1);
499 500
    }

501 502
    if (s->seekable_tile) {
        if (s->do_inter_ch_decorr)
503
            s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample + 1);
504
        else
505
            s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample);
506
        i++;
507
    }
508
    for (; i < tile_size; i++) {
509
        int quo = 0, rem, rem_bits, residue;
510
        while(get_bits1(&s->gb)) {
511
            quo++;
512 513 514
            if (get_bits_left(&s->gb) <= 0)
                return -1;
        }
515
        if (quo >= 32)
516
            quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1);
517

518 519 520 521 522
        ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1);
        if (ave_mean <= 1)
            residue = quo;
        else {
            rem_bits = av_ceil_log2(ave_mean);
523
            rem      = get_bits_long(&s->gb, rem_bits);
524 525
            residue  = (quo << rem_bits) + rem;
        }
526

527 528
        s->ave_sum[ch] = residue + s->ave_sum[ch] -
                         (s->ave_sum[ch] >> s->movave_scaling);
529

530
        if (residue & 1)
531 532 533 534
            residue = -(residue >> 1) - 1;
        else
            residue = residue >> 1;
        s->channel_residues[ch][i] = residue;
535 536 537 538 539 540
    }

    return 0;

}

541
static void decode_lpc(WmallDecodeCtx *s)
542 543
{
    int ch, i, cbits;
544
    s->lpc_order   = get_bits(&s->gb, 5) + 1;
545 546 547
    s->lpc_scaling = get_bits(&s->gb, 4);
    s->lpc_intbits = get_bits(&s->gb, 3) + 1;
    cbits = s->lpc_scaling + s->lpc_intbits;
548 549
    for (ch = 0; ch < s->num_channels; ch++)
        for (i = 0; i < s->lpc_order; i++)
550
            s->lpc_coefs[ch][i] = get_sbits(&s->gb, cbits);
551 552
}

553 554 555 556
static void clear_codec_buffers(WmallDecodeCtx *s)
{
    int ich, ilms;

557 558 559
    memset(s->acfilter_coeffs,     0, sizeof(s->acfilter_coeffs));
    memset(s->acfilter_prevvalues, 0, sizeof(s->acfilter_prevvalues));
    memset(s->lpc_coefs,           0, sizeof(s->lpc_coefs));
560

561 562 563 564
    memset(s->mclms_coeffs,     0, sizeof(s->mclms_coeffs));
    memset(s->mclms_coeffs_cur, 0, sizeof(s->mclms_coeffs_cur));
    memset(s->mclms_prevvalues, 0, sizeof(s->mclms_prevvalues));
    memset(s->mclms_updates,    0, sizeof(s->mclms_updates));
565 566 567

    for (ich = 0; ich < s->num_channels; ich++) {
        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) {
568 569 570 571 572 573
            memset(s->cdlms[ich][ilms].coefs, 0,
                   sizeof(s->cdlms[ich][ilms].coefs));
            memset(s->cdlms[ich][ilms].lms_prevvalues, 0,
                   sizeof(s->cdlms[ich][ilms].lms_prevvalues));
            memset(s->cdlms[ich][ilms].lms_updates, 0,
                   sizeof(s->cdlms[ich][ilms].lms_updates));
574 575 576 577
        }
        s->ave_sum[ich] = 0;
    }
}
578

579
/**
580
 * @brief Reset filter parameters and transient area at new seekable tile.
581
 */
582 583 584 585
static void reset_codec(WmallDecodeCtx *s)
{
    int ich, ilms;
    s->mclms_recent = s->mclms_order * s->num_channels;
586
    for (ich = 0; ich < s->num_channels; ich++) {
587
        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++)
588
            s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order;
589
        /* first sample of a seekable subframe is considered as the starting of
590
            a transient area which is samples_per_frame samples long */
591
        s->channel[ich].transient_counter = s->samples_per_frame;
592
        s->transient[ich]     = 1;
593
        s->transient_pos[ich] = 0;
594
    }
595 596
}

597
static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred)
598
{
599 600
    int i, j, ich, pred_error;
    int order        = s->mclms_order;
601
    int num_channels = s->num_channels;
602
    int range        = 1 << (s->bits_per_sample - 1);
603 604

    for (ich = 0; ich < num_channels; ich++) {
605
        pred_error = s->channel_residues[ich][icoef] - pred[ich];
606 607 608 609
        if (pred_error > 0) {
            for (i = 0; i < order * num_channels; i++)
                s->mclms_coeffs[i + ich * order * num_channels] +=
                    s->mclms_updates[s->mclms_recent + i];
610 611
            for (j = 0; j < ich; j++) {
                if (s->channel_residues[j][icoef] > 0)
612
                    s->mclms_coeffs_cur[ich * num_channels + j] += 1;
613
                else if (s->channel_residues[j][icoef] < 0)
614 615 616 617 618 619
                    s->mclms_coeffs_cur[ich * num_channels + j] -= 1;
            }
        } else if (pred_error < 0) {
            for (i = 0; i < order * num_channels; i++)
                s->mclms_coeffs[i + ich * order * num_channels] -=
                    s->mclms_updates[s->mclms_recent + i];
620 621
            for (j = 0; j < ich; j++) {
                if (s->channel_residues[j][icoef] > 0)
622
                    s->mclms_coeffs_cur[ich * num_channels + j] -= 1;
623
                else if (s->channel_residues[j][icoef] < 0)
624 625 626 627 628 629 630
                    s->mclms_coeffs_cur[ich * num_channels + j] += 1;
            }
        }
    }

    for (ich = num_channels - 1; ich >= 0; ich--) {
        s->mclms_recent--;
631 632
        s->mclms_prevvalues[s->mclms_recent] = s->channel_residues[ich][icoef];
        if (s->channel_residues[ich][icoef] > range - 1)
633
            s->mclms_prevvalues[s->mclms_recent] = range - 1;
634
        else if (s->channel_residues[ich][icoef] < -range)
635 636
            s->mclms_prevvalues[s->mclms_recent] = -range;

637 638 639 640 641
        s->mclms_updates[s->mclms_recent] = 0;
        if (s->channel_residues[ich][icoef] > 0)
            s->mclms_updates[s->mclms_recent] = 1;
        else if (s->channel_residues[ich][icoef] < 0)
            s->mclms_updates[s->mclms_recent] = -1;
642 643 644
    }

    if (s->mclms_recent == 0) {
645
        memcpy(&s->mclms_prevvalues[order * num_channels],
646
               s->mclms_prevvalues,
647
               2 * order * num_channels);
648
        memcpy(&s->mclms_updates[order * num_channels],
649
               s->mclms_updates,
650
               2 * order * num_channels);
651 652 653
        s->mclms_recent = num_channels * order;
    }
}
654 655

static void mclms_predict(WmallDecodeCtx *s, int icoef, int *pred)
656 657
{
    int ich, i;
658
    int order        = s->mclms_order;
659 660 661
    int num_channels = s->num_channels;

    for (ich = 0; ich < num_channels; ich++) {
662
        pred[ich] = 0;
663 664 665
        if (!s->is_channel_coded[ich])
            continue;
        for (i = 0; i < order * num_channels; i++)
666 667
            pred[ich] += s->mclms_prevvalues[i + s->mclms_recent] *
                         s->mclms_coeffs[i + order * num_channels * ich];
668
        for (i = 0; i < ich; i++)
669 670 671 672 673
            pred[ich] += s->channel_residues[i][icoef] *
                         s->mclms_coeffs_cur[i + num_channels * ich];
        pred[ich] += 1 << s->mclms_scaling - 1;
        pred[ich] >>= s->mclms_scaling;
        s->channel_residues[ich][icoef] += pred[ich];
674 675 676 677 678
    }
}

static void revert_mclms(WmallDecodeCtx *s, int tile_size)
{
679
    int icoef, pred[WMALL_MAX_CHANNELS] = { 0 };
680
    for (icoef = 0; icoef < tile_size; icoef++) {
681 682
        mclms_predict(s, icoef, pred);
        mclms_update(s, icoef, pred);
683 684 685
    }
}

686 687
static int lms_predict(WmallDecodeCtx *s, int ich, int ilms)
{
688
    int pred = 0, icoef;
689 690 691 692
    int recent = s->cdlms[ich][ilms].recent;

    for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
        pred += s->cdlms[ich][ilms].coefs[icoef] *
693
                s->cdlms[ich][ilms].lms_prevvalues[icoef + recent];
694 695 696 697

    return pred;
}

698 699
static void lms_update(WmallDecodeCtx *s, int ich, int ilms,
                       int input, int residue)
700
{
701
    int icoef;
702
    int recent = s->cdlms[ich][ilms].recent;
703
    int range  = 1 << s->bits_per_sample - 1;
704

705
    if (residue < 0) {
706
        for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
707
            s->cdlms[ich][ilms].coefs[icoef] -=
708
                s->cdlms[ich][ilms].lms_updates[icoef + recent];
709
    } else if (residue > 0) {
710
        for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
711
            s->cdlms[ich][ilms].coefs[icoef] +=
712
                s->cdlms[ich][ilms].lms_updates[icoef + recent];
713 714
    }

715 716 717 718 719
    if (recent)
        recent--;
    else {
        memcpy(&s->cdlms[ich][ilms].lms_prevvalues[s->cdlms[ich][ilms].order],
               s->cdlms[ich][ilms].lms_prevvalues,
720
               2 * s->cdlms[ich][ilms].order);
721 722
        memcpy(&s->cdlms[ich][ilms].lms_updates[s->cdlms[ich][ilms].order],
               s->cdlms[ich][ilms].lms_updates,
723
               2 * s->cdlms[ich][ilms].order);
724 725 726 727 728 729 730
        recent = s->cdlms[ich][ilms].order - 1;
    }

    s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip(input, -range, range - 1);
    if (!input)
        s->cdlms[ich][ilms].lms_updates[recent] = 0;
    else if (input < 0)
731
        s->cdlms[ich][ilms].lms_updates[recent] = -s->update_speed[ich];
732 733
    else
        s->cdlms[ich][ilms].lms_updates[recent] = s->update_speed[ich];
734

735 736 737
    s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 4)] >>= 2;
    s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 3)] >>= 1;
    s->cdlms[ich][ilms].recent = recent;
738 739
}

740 741 742
static void use_high_update_speed(WmallDecodeCtx *s, int ich)
{
    int ilms, recent, icoef;
743
    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
744
        recent = s->cdlms[ich][ilms].recent;
745 746
        if (s->update_speed[ich] == 16)
            continue;
747 748 749 750 751 752 753 754
        if (s->bV3RTM) {
            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
                s->cdlms[ich][ilms].lms_updates[icoef + recent] *= 2;
        } else {
            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
                s->cdlms[ich][ilms].lms_updates[icoef] *= 2;
        }
    }
755
    s->update_speed[ich] = 16;
756 757 758 759 760
}

static void use_normal_update_speed(WmallDecodeCtx *s, int ich)
{
    int ilms, recent, icoef;
761
    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
762
        recent = s->cdlms[ich][ilms].recent;
763 764
        if (s->update_speed[ich] == 8)
            continue;
765
        if (s->bV3RTM)
766 767
            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
                s->cdlms[ich][ilms].lms_updates[icoef + recent] /= 2;
768
        else
769 770 771
            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
                s->cdlms[ich][ilms].lms_updates[icoef] /= 2;
    }
772
    s->update_speed[ich] = 8;
773 774
}

775 776
static void revert_cdlms(WmallDecodeCtx *s, int ch,
                         int coef_begin, int coef_end)
777
{
778
    int icoef, pred, ilms, num_lms, residue, input;
779 780 781 782 783 784 785 786 787 788

    num_lms = s->cdlms_ttl[ch];
    for (ilms = num_lms - 1; ilms >= 0; ilms--) {
        for (icoef = coef_begin; icoef < coef_end; icoef++) {
            pred = 1 << (s->cdlms[ch][ilms].scaling - 1);
            residue = s->channel_residues[ch][icoef];
            pred += lms_predict(s, ch, ilms);
            input = residue + (pred >> s->cdlms[ch][ilms].scaling);
            lms_update(s, ch, ilms, input, residue);
            s->channel_residues[ch][icoef] = input;
789 790 791 792
        }
    }
}

793 794 795 796
static void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size)
{
    if (s->num_channels != 2)
        return;
797
    else if (s->is_channel_coded[0] || s->is_channel_coded[1]) {
798
        int icoef;
799 800 801 802 803 804
        for (icoef = 0; icoef < tile_size; icoef++) {
            s->channel_residues[0][icoef] -= s->channel_residues[1][icoef] >> 1;
            s->channel_residues[1][icoef] += s->channel_residues[0][icoef];
        }
    }
}
805

806 807
static void revert_acfilter(WmallDecodeCtx *s, int tile_size)
{
808
    int ich, pred, i, j;
809
    int64_t *filter_coeffs = s->acfilter_coeffs;
810 811
    int scaling            = s->acfilter_scaling;
    int order              = s->acfilter_order;
812

813
    for (ich = 0; ich < s->num_channels; ich++) {
814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
        int *prevvalues = s->acfilter_prevvalues[ich];
        for (i = 0; i < order; i++) {
            pred = 0;
            for (j = 0; j < order; j++) {
                if (i <= j)
                    pred += filter_coeffs[j] * prevvalues[j - i];
                else
                    pred += s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
            }
            pred >>= scaling;
            s->channel_residues[ich][i] += pred;
        }
        for (i = order; i < tile_size; i++) {
            pred = 0;
            for (j = 0; j < order; j++)
                pred += s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
830
            pred >>= scaling;
831
            s->channel_residues[ich][i] += pred;
832
        }
833 834
        for (j = 0; j < order; j++)
            prevvalues[j] = s->channel_residues[ich][tile_size - j - 1];
835 836
    }
}
837

838 839
static int decode_subframe(WmallDecodeCtx *s)
{
840 841 842
    int offset        = s->samples_per_frame;
    int subframe_len  = s->samples_per_frame;
    int total_samples = s->samples_per_frame * s->num_channels;
843
    int i, j, rawpcm_tile, padding_zeroes, res;
844 845 846

    s->subframe_offset = get_bits_count(&s->gb);

847
    /* reset channel context and find the next block offset and size
848
        == the next block of the channel with the smallest number of
849
        decoded samples */
850 851 852 853 854 855 856 857
    for (i = 0; i < s->num_channels; i++) {
        if (offset > s->channel[i].decoded_samples) {
            offset = s->channel[i].decoded_samples;
            subframe_len =
                s->channel[i].subframe_len[s->channel[i].cur_subframe];
        }
    }

858
    /* get a list of all channels that contain the estimated block */
859 860 861
    s->channels_for_cur_subframe = 0;
    for (i = 0; i < s->num_channels; i++) {
        const int cur_subframe = s->channel[i].cur_subframe;
862
        /* subtract already processed samples */
863 864
        total_samples -= s->channel[i].decoded_samples;

865
        /* and count if there are multiple subframes that match our profile */
866 867 868 869 870 871 872 873 874 875
        if (offset == s->channel[i].decoded_samples &&
            subframe_len == s->channel[i].subframe_len[cur_subframe]) {
            total_samples -= s->channel[i].subframe_len[cur_subframe];
            s->channel[i].decoded_samples +=
                s->channel[i].subframe_len[cur_subframe];
            s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
            ++s->channels_for_cur_subframe;
        }
    }

876
    /* check if the frame will be complete after processing the
877 878 879 880 881 882
        estimated block */
    if (!total_samples)
        s->parsed_all_subframes = 1;


    s->seekable_tile = get_bits1(&s->gb);
883
    if (s->seekable_tile) {
884
        clear_codec_buffers(s);
885

886
        s->do_arith_coding    = get_bits1(&s->gb);
887
        if (s->do_arith_coding) {
888
            av_log_missing_feature(s->avctx, "Arithmetic coding", 1);
889
            return AVERROR_PATCHWELCOME;
890 891 892 893
        }
        s->do_ac_filter       = get_bits1(&s->gb);
        s->do_inter_ch_decorr = get_bits1(&s->gb);
        s->do_mclms           = get_bits1(&s->gb);
894

895
        if (s->do_ac_filter)
896
            decode_ac_filter(s);
897

898
        if (s->do_mclms)
899
            decode_mclms(s);
900

901 902
        if ((res = decode_cdlms(s)) < 0)
            return res;
903 904
        s->movave_scaling = get_bits(&s->gb, 3);
        s->quant_stepsize = get_bits(&s->gb, 8) + 1;
905

906
        reset_codec(s);
907 908 909
    } else if (!s->cdlms[0][0].order) {
        av_log(s->avctx, AV_LOG_DEBUG,
               "Waiting for seekable tile\n");
Ronald S. Bultje's avatar
Ronald S. Bultje committed
910
        s->frame.nb_samples = 0;
911
        return -1;
912 913 914 915
    }

    rawpcm_tile = get_bits1(&s->gb);

916
    for (i = 0; i < s->num_channels; i++)
917
        s->is_channel_coded[i] = 1;
918

919 920
    if (!rawpcm_tile) {
        for (i = 0; i < s->num_channels; i++)
921 922
            s->is_channel_coded[i] = get_bits1(&s->gb);

923
        if (s->bV3RTM) {
924 925
            // LPC
            s->do_lpc = get_bits1(&s->gb);
926
            if (s->do_lpc) {
927
                decode_lpc(s);
928 929
                av_log_ask_for_sample(s->avctx, "Inverse LPC filter not "
                                      "implemented. Expect wrong output.\n");
930
            }
931
        } else
932
            s->do_lpc = 0;
933 934 935
    }


936
    if (get_bits1(&s->gb))
937
        padding_zeroes = get_bits(&s->gb, 5);
938
    else
939
        padding_zeroes = 0;
940

941
    if (rawpcm_tile) {
942
        int bits = s->bits_per_sample - padding_zeroes;
943 944 945 946
        if (bits <= 0) {
            av_log(s->avctx, AV_LOG_ERROR,
                   "Invalid number of padding bits in raw PCM tile\n");
            return AVERROR_INVALIDDATA;
947
        }
948
        av_dlog(s->avctx, "RAWPCM %d bits per sample. "
949
                "total %d bits, remain=%d\n", bits,
950
                bits * s->num_channels * subframe_len, get_bits_count(&s->gb));
951 952
        for (i = 0; i < s->num_channels; i++)
            for (j = 0; j < subframe_len; j++)
953
                s->channel_coeffs[i][j] = get_sbits_long(&s->gb, bits);
954
    } else {
955 956 957 958 959 960 961 962
        for (i = 0; i < s->num_channels; i++)
            if (s->is_channel_coded[i]) {
                decode_channel_residues(s, i, subframe_len);
                if (s->seekable_tile)
                    use_high_update_speed(s, i);
                else
                    use_normal_update_speed(s, i);
                revert_cdlms(s, i, 0, subframe_len);
963 964
            } else {
                memset(s->channel_residues[i], 0, sizeof(**s->channel_residues) * subframe_len);
965
            }
966
    }
967 968
    if (s->do_mclms)
        revert_mclms(s, subframe_len);
969 970
    if (s->do_inter_ch_decorr)
        revert_inter_ch_decorr(s, subframe_len);
971
    if (s->do_ac_filter)
972
        revert_acfilter(s, subframe_len);
973

974
    /* Dequantize */
975 976 977 978
    if (s->quant_stepsize != 1)
        for (i = 0; i < s->num_channels; i++)
            for (j = 0; j < subframe_len; j++)
                s->channel_residues[i][j] *= s->quant_stepsize;
979

980
    /* Write to proper output buffer depending on bit-depth */
981 982 983 984 985 986
    for (i = 0; i < s->channels_for_cur_subframe; i++) {
        int c = s->channel_indexes_for_cur_subframe[i];
        int subframe_len = s->channel[c].subframe_len[s->channel[c].cur_subframe];

        for (j = 0; j < subframe_len; j++) {
            if (s->bits_per_sample == 16) {
987
                *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] << padding_zeroes;
988
            } else {
989
                *s->samples_32[c]++ = s->channel_residues[c][j] << padding_zeroes;
990
            }
991
        }
992
    }
993

994
    /* handled one subframe */
995 996 997 998 999 1000
    for (i = 0; i < s->channels_for_cur_subframe; i++) {
        int c = s->channel_indexes_for_cur_subframe[i];
        if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
            av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
            return AVERROR_INVALIDDATA;
        }
1001
        ++s->channel[c].cur_subframe;
1002 1003 1004 1005 1006
    }
    return 0;
}

/**
1007 1008 1009 1010
 * @brief Decode one WMA frame.
 * @param s codec context
 * @return 0 if the trailer bit indicates that this is the last frame,
 *         1 if there are additional frames
1011 1012 1013 1014
 */
static int decode_frame(WmallDecodeCtx *s)
{
    GetBitContext* gb = &s->gb;
1015
    int more_frames = 0, len = 0, i, ret;
1016

1017
    s->frame.nb_samples = s->samples_per_frame;
1018
    if ((ret = ff_get_buffer(s->avctx, &s->frame)) < 0) {
1019
        /* return an error if no frame could be decoded at all */
1020 1021 1022
        av_log(s->avctx, AV_LOG_ERROR,
               "not enough space for the output samples\n");
        s->packet_loss = 1;
1023
        return ret;
1024
    }
1025
    for (i = 0; i < s->num_channels; i++) {
1026 1027
        s->samples_16[i] = (int16_t *)s->frame.extended_data[i];
        s->samples_32[i] = (int32_t *)s->frame.extended_data[i];
1028
    }
1029

1030
    /* get frame length */
1031
    if (s->len_prefix)
1032
        len = get_bits(gb, s->log2_frame_size);
1033

1034
    /* decode tile information */
1035
    if (decode_tilehdr(s)) {
1036 1037 1038 1039
        s->packet_loss = 1;
        return 0;
    }

1040 1041
    /* read drc info */
    if (s->dynamic_range_compression)
1042
        s->drc_gain = get_bits(gb, 8);
1043

1044 1045
    /* no idea what these are for, might be the number of samples
       that need to be skipped at the beginning or end of a stream */
1046
    if (get_bits1(gb)) {
1047
        int av_unused skip;
1048

1049
        /* usually true for the first frame */
1050 1051
        if (get_bits1(gb)) {
            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
1052
            av_dlog(s->avctx, "start skip: %i\n", skip);
1053 1054
        }

1055
        /* sometimes true for the last frame */
1056 1057
        if (get_bits1(gb)) {
            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
1058
            av_dlog(s->avctx, "end skip: %i\n", skip);
1059 1060 1061 1062
        }

    }

1063
    /* reset subframe states */
1064 1065 1066 1067 1068 1069
    s->parsed_all_subframes = 0;
    for (i = 0; i < s->num_channels; i++) {
        s->channel[i].decoded_samples = 0;
        s->channel[i].cur_subframe    = 0;
    }

1070
    /* decode all subframes */
1071 1072 1073 1074 1075 1076 1077
    while (!s->parsed_all_subframes) {
        if (decode_subframe(s) < 0) {
            s->packet_loss = 1;
            return 0;
        }
    }

1078
    av_dlog(s->avctx, "Frame done\n");
1079

1080
    if (s->skip_frame)
1081 1082 1083 1084
        s->skip_frame = 0;

    if (s->len_prefix) {
        if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
1085
            /* FIXME: not sure if this is always an error */
1086 1087 1088 1089 1090 1091 1092
            av_log(s->avctx, AV_LOG_ERROR,
                   "frame[%i] would have to skip %i bits\n", s->frame_num,
                   len - (get_bits_count(gb) - s->frame_offset) - 1);
            s->packet_loss = 1;
            return 0;
        }

1093
        /* skip the rest of the frame data */
1094 1095 1096
        skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
    }

1097
    /* decode trailer bit */
1098 1099 1100 1101 1102 1103
    more_frames = get_bits1(gb);
    ++s->frame_num;
    return more_frames;
}

/**
1104 1105 1106 1107
 * @brief Calculate remaining input buffer length.
 * @param s  codec context
 * @param gb bitstream reader context
 * @return remaining size in bits
1108 1109 1110 1111 1112 1113 1114
 */
static int remaining_bits(WmallDecodeCtx *s, GetBitContext *gb)
{
    return s->buf_bit_size - get_bits_count(gb);
}

/**
1115 1116 1117 1118 1119
 * @brief Fill the bit reservoir with a (partial) frame.
 * @param s      codec context
 * @param gb     bitstream reader context
 * @param len    length of the partial frame
 * @param append decides whether to reset the buffer or not
1120 1121 1122 1123 1124
 */
static void save_bits(WmallDecodeCtx *s, GetBitContext* gb, int len,
                      int append)
{
    int buflen;
1125
    PutBitContext tmp;
1126

1127 1128
    /* when the frame data does not need to be concatenated, the input buffer
        is reset and additional bits from the previous frame are copied
1129 1130 1131
        and skipped later so that a fast byte copy is possible */

    if (!append) {
1132
        s->frame_offset   = get_bits_count(gb) & 7;
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
        s->num_saved_bits = s->frame_offset;
        init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
    }

    buflen = (s->num_saved_bits + len + 8) >> 3;

    if (len <= 0 || buflen > MAX_FRAMESIZE) {
        av_log_ask_for_sample(s->avctx, "input buffer too small\n");
        s->packet_loss = 1;
        return;
    }

    s->num_saved_bits += len;
    if (!append) {
        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
1148
                         s->num_saved_bits);
1149 1150 1151 1152 1153 1154 1155 1156 1157
    } else {
        int align = 8 - (get_bits_count(gb) & 7);
        align = FFMIN(align, len);
        put_bits(&s->pb, align, get_bits(gb, align));
        len -= align;
        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
    }
    skip_bits_long(gb, len);

1158 1159
    tmp = s->pb;
    flush_put_bits(&tmp);
1160 1161 1162 1163 1164

    init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
    skip_bits(&s->gb, s->frame_offset);
}

1165 1166
static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr,
                         AVPacket* avpkt)
1167 1168 1169 1170 1171
{
    WmallDecodeCtx *s = avctx->priv_data;
    GetBitContext* gb  = &s->pgb;
    const uint8_t* buf = avpkt->data;
    int buf_size       = avpkt->size;
1172
    int num_bits_prev_frame, packet_sequence_number, spliced_packet;
1173

1174 1175
    s->frame.nb_samples = 0;

1176 1177 1178
    if (s->packet_done || s->packet_loss) {
        s->packet_done = 0;

1179
        /* sanity check for the buffer length */
1180 1181 1182 1183
        if (buf_size < avctx->block_align)
            return 0;

        s->next_packet_start = buf_size - avctx->block_align;
1184 1185
        buf_size             = avctx->block_align;
        s->buf_bit_size      = buf_size << 3;
1186

1187
        /* parse packet header */
1188
        init_get_bits(gb, buf, s->buf_bit_size);
1189
        packet_sequence_number = get_bits(gb, 4);
1190
        skip_bits(gb, 1);   // Skip seekable_frame_in_packet, currently ununused
1191
        spliced_packet = get_bits1(gb);
1192 1193
        if (spliced_packet)
            av_log_missing_feature(avctx, "Bitstream splicing", 1);
1194

1195
        /* get number of bits that need to be added to the previous frame */
1196 1197
        num_bits_prev_frame = get_bits(gb, s->log2_frame_size);

1198
        /* check for packet loss */
1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
        if (!s->packet_loss &&
            ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
            s->packet_loss = 1;
            av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
                   s->packet_sequence_number, packet_sequence_number);
        }
        s->packet_sequence_number = packet_sequence_number;

        if (num_bits_prev_frame > 0) {
            int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb);
            if (num_bits_prev_frame >= remaining_packet_bits) {
                num_bits_prev_frame = remaining_packet_bits;
                s->packet_done = 1;
            }

1214 1215
            /* Append the previous frame data to the remaining data from the
             * previous packet to create a full frame. */
1216 1217
            save_bits(s, gb, num_bits_prev_frame, 1);

1218
            /* decode the cross packet frame if it is valid */
1219
            if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss)
1220
                decode_frame(s);
1221
        } else if (s->num_saved_bits - s->frame_offset) {
1222
            av_dlog(avctx, "ignoring %x previously saved bits\n",
1223 1224 1225 1226
                    s->num_saved_bits - s->frame_offset);
        }

        if (s->packet_loss) {
1227 1228
            /* Reset number of saved bits so that the decoder does not start
             * to decode incomplete frames in the s->len_prefix == 0 case. */
1229
            s->num_saved_bits = 0;
1230
            s->packet_loss    = 0;
1231
            init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247
        }

    } else {
        int frame_size;

        s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3;
        init_get_bits(gb, avpkt->data, s->buf_bit_size);
        skip_bits(gb, s->packet_offset);

        if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size &&
            (frame_size = show_bits(gb, s->log2_frame_size)) &&
            frame_size <= remaining_bits(s, gb)) {
            save_bits(s, gb, frame_size, 0);
            s->packet_done = !decode_frame(s);
        } else if (!s->len_prefix
                   && s->num_saved_bits > get_bits_count(&s->gb)) {
1248 1249 1250 1251 1252 1253
            /* when the frames do not have a length prefix, we don't know the
             * compressed length of the individual frames however, we know what
             * part of a new packet belongs to the previous frame therefore we
             * save the incoming packet first, then we append the "previous
             * frame" data from the next packet so that we get a buffer that
             * only contains full frames */
1254 1255 1256
            s->packet_done = !decode_frame(s);
        } else {
            s->packet_done = 1;
1257
        }
1258 1259 1260 1261
    }

    if (s->packet_done && !s->packet_loss &&
        remaining_bits(s, gb) > 0) {
1262 1263
        /* save the rest of the data so that it can be decoded
         * with the next packet */
1264 1265 1266
        save_bits(s, gb, remaining_bits(s, gb), 0);
    }

1267
    *(AVFrame *)data = s->frame;
1268
    *got_frame_ptr   = s->frame.nb_samples > 0;
1269 1270 1271 1272 1273
    s->packet_offset = get_bits_count(gb) & 7;

    return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3;
}

Ronald S. Bultje's avatar
Ronald S. Bultje committed
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
static void flush(AVCodecContext *avctx)
{
    WmallDecodeCtx *s    = avctx->priv_data;
    s->packet_loss       = 1;
    s->packet_done       = 0;
    s->num_saved_bits    = 0;
    s->frame_offset      = 0;
    s->next_packet_start = 0;
    s->cdlms[0][0].order = 0;
    s->frame.nb_samples  = 0;
1284
    init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
1285
}
1286 1287

AVCodec ff_wmalossless_decoder = {
1288 1289
    .name           = "wmalossless",
    .type           = AVMEDIA_TYPE_AUDIO,
1290
    .id             = AV_CODEC_ID_WMALOSSLESS,
1291 1292 1293
    .priv_data_size = sizeof(WmallDecodeCtx),
    .init           = decode_init,
    .decode         = decode_packet,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
1294
    .flush          = flush,
1295
    .capabilities   = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1296
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"),
1297 1298 1299
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
                                                      AV_SAMPLE_FMT_S32P,
                                                      AV_SAMPLE_FMT_NONE },
1300
};