adpcm.c 71.6 KB
Newer Older
1
/*
2
 * Copyright (c) 2001-2003 The FFmpeg project
3
 *
4 5 6 7 8 9 10 11 12 13 14 15
 * first version by Francois Revol (revol@free.fr)
 * fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
 *   by Mike Melanson (melanson@pcisys.net)
 * CD-ROM XA ADPCM codec by BERO
 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
 * EA ADPCM R1/R2/R3 decoder by Peter Ross (pross@xvid.org)
 * EA IMA EACS decoder by Peter Ross (pross@xvid.org)
 * EA IMA SEAD decoder by Peter Ross (pross@xvid.org)
 * EA ADPCM XAS decoder by Peter Ross (pross@xvid.org)
 * MAXIS EA ADPCM decoder by Robert Marston (rmarston@gmail.com)
 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
 *
16 17 18
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
19 20
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
21
 * version 2.1 of the License, or (at your option) any later version.
22
 *
23
 * FFmpeg is distributed in the hope that it will be useful,
24 25 26 27 28
 * 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
29
 * License along with FFmpeg; if not, write to the Free Software
30
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 32
 */
#include "avcodec.h"
33
#include "get_bits.h"
34
#include "bytestream.h"
35 36
#include "adpcm.h"
#include "adpcm_data.h"
37
#include "internal.h"
38

Michael Niedermayer's avatar
Michael Niedermayer committed
39
/**
40
 * @file
41
 * ADPCM decoders
42 43 44
 * Features and limitations:
 *
 * Reference documents:
45 46 47 48 49 50 51
 * http://wiki.multimedia.cx/index.php?title=Category:ADPCM_Audio_Codecs
 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html [dead]
 * http://www.geocities.com/SiliconValley/8682/aud3.txt [dead]
 * http://openquicktime.sourceforge.net/
 * XAnim sources (xa_codec.c) http://xanim.polter.net/
 * http://www.cs.ucla.edu/~leec/mediabench/applications.html [dead]
 * SoX source code http://sox.sourceforge.net/
52 53
 *
 * CD-ROM XA:
54 55
 * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html [dead]
 * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html [dead]
56
 * readstr http://www.geocities.co.jp/Playtown/2004/
57 58
 */

59
/* These are for CD-ROM XA ADPCM */
60
static const int8_t xa_adpcm_table[5][2] = {
61 62 63 64 65
    {   0,   0 },
    {  60,   0 },
    { 115, -52 },
    {  98, -55 },
    { 122, -60 }
66 67
};

68
static const int16_t ea_adpcm_table[] = {
69 70 71 72 73
    0,  240,  460,  392,
    0,    0, -208, -220,
    0,    1,    3,    4,
    7,    8,   10,   11,
    0,   -1,   -3,   -4
74 75
};

76
// padded to zero where table size is less then 16
77
static const int8_t swf_index_tables[4][16] = {
78 79 80 81 82 83
    /*2*/ { -1, 2 },
    /*3*/ { -1, -1, 2, 4 },
    /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
    /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
};

84 85
/* end of tables */

86
typedef struct ADPCMDecodeContext {
87
    ADPCMChannelStatus status[14];
88
    int vqa_version;                /**< VQA version. Used for ADPCM_IMA_WS */
89
    int has_status;
90
} ADPCMDecodeContext;
91

92
static av_cold int adpcm_decode_init(AVCodecContext * avctx)
93
{
94
    ADPCMDecodeContext *c = avctx->priv_data;
95
    unsigned int min_channels = 1;
Baptiste Coudurier's avatar
Baptiste Coudurier committed
96
    unsigned int max_channels = 2;
97

98
    switch(avctx->codec->id) {
James Almer's avatar
James Almer committed
99
    case AV_CODEC_ID_ADPCM_DTK:
100
    case AV_CODEC_ID_ADPCM_EA:
101 102
        min_channels = 2;
        break;
103
    case AV_CODEC_ID_ADPCM_AFC:
104 105 106 107
    case AV_CODEC_ID_ADPCM_EA_R1:
    case AV_CODEC_ID_ADPCM_EA_R2:
    case AV_CODEC_ID_ADPCM_EA_R3:
    case AV_CODEC_ID_ADPCM_EA_XAS:
108
    case AV_CODEC_ID_ADPCM_MS:
109 110
        max_channels = 6;
        break;
111 112 113
    case AV_CODEC_ID_ADPCM_MTAF:
        min_channels = 2;
        max_channels = 8;
114 115 116 117
        if (avctx->channels & 1) {
            avpriv_request_sample(avctx, "channel count %d\n", avctx->channels);
            return AVERROR_PATCHWELCOME;
        }
118
        break;
119 120 121
    case AV_CODEC_ID_ADPCM_PSX:
        max_channels = 8;
        break;
122
    case AV_CODEC_ID_ADPCM_IMA_DAT4:
123
    case AV_CODEC_ID_ADPCM_THP:
124
    case AV_CODEC_ID_ADPCM_THP_LE:
125
        max_channels = 14;
126 127
        break;
    }
128
    if (avctx->channels < min_channels || avctx->channels > max_channels) {
129 130
        av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
        return AVERROR(EINVAL);
131 132
    }

133
    switch(avctx->codec->id) {
134
    case AV_CODEC_ID_ADPCM_CT:
135 136
        c->status[0].step = c->status[1].step = 511;
        break;
137
    case AV_CODEC_ID_ADPCM_IMA_WAV:
138 139
        if (avctx->bits_per_coded_sample < 2 || avctx->bits_per_coded_sample > 5)
            return AVERROR_INVALIDDATA;
140
        break;
141
    case AV_CODEC_ID_ADPCM_IMA_APC:
142
        if (avctx->extradata && avctx->extradata_size >= 8) {
Anssi Hannula's avatar
Anssi Hannula committed
143 144 145 146
            c->status[0].predictor = AV_RL32(avctx->extradata);
            c->status[1].predictor = AV_RL32(avctx->extradata + 4);
        }
        break;
147
    case AV_CODEC_ID_ADPCM_IMA_WS:
148
        if (avctx->extradata && avctx->extradata_size >= 2)
149 150
            c->vqa_version = AV_RL16(avctx->extradata);
        break;
151 152 153
    default:
        break;
    }
154 155

    switch(avctx->codec->id) {
156
        case AV_CODEC_ID_ADPCM_AICA:
157
        case AV_CODEC_ID_ADPCM_IMA_DAT4:
158
        case AV_CODEC_ID_ADPCM_IMA_QT:
159
        case AV_CODEC_ID_ADPCM_IMA_WAV:
160
        case AV_CODEC_ID_ADPCM_4XM:
161
        case AV_CODEC_ID_ADPCM_XA:
162 163 164
        case AV_CODEC_ID_ADPCM_EA_R1:
        case AV_CODEC_ID_ADPCM_EA_R2:
        case AV_CODEC_ID_ADPCM_EA_R3:
165
        case AV_CODEC_ID_ADPCM_EA_XAS:
166
        case AV_CODEC_ID_ADPCM_THP:
167
        case AV_CODEC_ID_ADPCM_THP_LE:
Paul B Mahol's avatar
Paul B Mahol committed
168
        case AV_CODEC_ID_ADPCM_AFC:
James Almer's avatar
James Almer committed
169
        case AV_CODEC_ID_ADPCM_DTK:
170
        case AV_CODEC_ID_ADPCM_PSX:
171
        case AV_CODEC_ID_ADPCM_MTAF:
172 173
            avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
            break;
174 175 176 177
        case AV_CODEC_ID_ADPCM_IMA_WS:
            avctx->sample_fmt = c->vqa_version == 3 ? AV_SAMPLE_FMT_S16P :
                                                      AV_SAMPLE_FMT_S16;
            break;
178 179 180 181
        case AV_CODEC_ID_ADPCM_MS:
            avctx->sample_fmt = avctx->channels > 2 ? AV_SAMPLE_FMT_S16P :
                                                      AV_SAMPLE_FMT_S16;
            break;
182 183 184
        default:
            avctx->sample_fmt = AV_SAMPLE_FMT_S16;
    }
185

186 187 188
    return 0;
}

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
static inline int16_t adpcm_agm_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
{
    int delta, pred, step, add;

    pred = c->predictor;
    delta = nibble & 7;
    step = c->step;
    add = (delta * 2 + 1) * step;
    if (add < 0)
        add = add + 7;

    if ((nibble & 8) == 0)
        pred = av_clip(pred + (add >> 3), -32767, 32767);
    else
        pred = av_clip(pred - (add >> 3), -32767, 32767);

    switch (delta) {
    case 7:
        step *= 0x99;
        break;
    case 6:
        c->step = av_clip(c->step * 2, 127, 24576);
        c->predictor = pred;
        return pred;
    case 5:
        step *= 0x66;
        break;
    case 4:
        step *= 0x4d;
        break;
    default:
        step *= 0x39;
        break;
    }

    if (step < 0)
        step += 0x3f;

    c->step = step >> 6;
    c->step = av_clip(c->step, 127, 24576);
    c->predictor = pred;
    return pred;
}

233
static inline int16_t adpcm_ima_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
234 235 236 237 238
{
    int step_index;
    int predictor;
    int sign, delta, diff, step;

239 240
    step = ff_adpcm_step_table[c->step_index];
    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
241
    step_index = av_clip(step_index, 0, 88);
242 243 244

    sign = nibble & 8;
    delta = nibble & 7;
245 246 247
    /* perform direct multiplication instead of series of jumps proposed by
     * the reference ADPCM implementation since modern CPUs can do the mults
     * quickly enough */
Michael Niedermayer's avatar
Michael Niedermayer committed
248
    diff = ((2 * delta + 1) * step) >> shift;
Michael Niedermayer's avatar
Michael Niedermayer committed
249 250 251 252
    predictor = c->predictor;
    if (sign) predictor -= diff;
    else predictor += diff;

253
    c->predictor = av_clip_int16(predictor);
Michael Niedermayer's avatar
Michael Niedermayer committed
254 255
    c->step_index = step_index;

256
    return (int16_t)c->predictor;
Michael Niedermayer's avatar
Michael Niedermayer committed
257 258
}

259 260 261 262 263 264 265 266 267 268 269
static inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c, GetBitContext *gb, int bps)
{
    int nibble, step_index, predictor, sign, delta, diff, step, shift;

    shift = bps - 1;
    nibble = get_bits_le(gb, bps),
    step = ff_adpcm_step_table[c->step_index];
    step_index = c->step_index + ff_adpcm_index_tables[bps - 2][nibble];
    step_index = av_clip(step_index, 0, 88);

    sign = nibble & (1 << shift);
270
    delta = av_mod_uintp2(nibble, shift);
271 272 273 274 275 276 277 278 279 280 281
    diff = ((2 * delta + 1) * step) >> shift;
    predictor = c->predictor;
    if (sign) predictor -= diff;
    else predictor += diff;

    c->predictor = av_clip_int16(predictor);
    c->step_index = step_index;

    return (int16_t)c->predictor;
}

282 283 284 285 286 287
static inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble, int shift)
{
    int step_index;
    int predictor;
    int diff, step;

288 289
    step = ff_adpcm_step_table[c->step_index];
    step_index = c->step_index + ff_adpcm_index_table[nibble];
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
    step_index = av_clip(step_index, 0, 88);

    diff = step >> 3;
    if (nibble & 4) diff += step;
    if (nibble & 2) diff += step >> 1;
    if (nibble & 1) diff += step >> 2;

    if (nibble & 8)
        predictor = c->predictor - diff;
    else
        predictor = c->predictor + diff;

    c->predictor = av_clip_int16(predictor);
    c->step_index = step_index;

    return c->predictor;
}

308
static inline int16_t adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
309 310 311
{
    int predictor;

312
    predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64;
313
    predictor += ((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
314 315

    c->sample2 = c->sample1;
316
    c->sample1 = av_clip_int16(predictor);
317
    c->idelta = (ff_adpcm_AdaptationTable[(int)nibble] * c->idelta) >> 8;
318
    if (c->idelta < 16) c->idelta = 16;
319 320 321 322
    if (c->idelta > INT_MAX/768) {
        av_log(NULL, AV_LOG_WARNING, "idelta overflow\n");
        c->idelta = INT_MAX/768;
    }
323

324
    return c->sample1;
325 326
}

327
static inline int16_t adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nibble)
328 329 330 331 332 333 334 335 336 337 338 339 340 341
{
    int step_index, predictor, sign, delta, diff, step;

    step = ff_adpcm_oki_step_table[c->step_index];
    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
    step_index = av_clip(step_index, 0, 48);

    sign = nibble & 8;
    delta = nibble & 7;
    diff = ((2 * delta + 1) * step) >> 3;
    predictor = c->predictor;
    if (sign) predictor -= diff;
    else predictor += diff;

342
    c->predictor = av_clip_intp2(predictor, 11);
343 344 345 346 347
    c->step_index = step_index;

    return c->predictor << 4;
}

348
static inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
349 350 351 352 353 354 355 356 357 358 359
{
    int sign, delta, diff;
    int new_step;

    sign = nibble & 8;
    delta = nibble & 7;
    /* perform direct multiplication instead of series of jumps proposed by
     * the reference ADPCM implementation since modern CPUs can do the mults
     * quickly enough */
    diff = ((2 * delta + 1) * c->step) >> 3;
    /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */
360 361
    c->predictor = ((c->predictor * 254) >> 8) + (sign ? -diff : diff);
    c->predictor = av_clip_int16(c->predictor);
362
    /* calculate new step and clamp it to range 511..32767 */
363
    new_step = (ff_adpcm_AdaptationTable[nibble & 7] * c->step) >> 8;
364
    c->step = av_clip(new_step, 511, 32767);
365

366
    return (int16_t)c->predictor;
367 368
}

369
static inline int16_t adpcm_sbpro_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int size, int shift)
370 371 372 373 374 375 376 377
{
    int sign, delta, diff;

    sign = nibble & (1<<(size-1));
    delta = nibble & ((1<<(size-1))-1);
    diff = delta << (7 + c->step + shift);

    /* clamp result */
378
    c->predictor = av_clip(c->predictor + (sign ? -diff : diff), -16384,16256);
379 380 381 382 383 384 385

    /* calculate new step */
    if (delta >= (2*size - 3) && c->step < 3)
        c->step++;
    else if (delta == 0 && c->step > 0)
        c->step--;

386
    return (int16_t) c->predictor;
387 388
}

389
static inline int16_t adpcm_yamaha_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
390 391 392 393 394 395
{
    if(!c->step) {
        c->predictor = 0;
        c->step = 127;
    }

396
    c->predictor += (c->step * ff_adpcm_yamaha_difflookup[nibble]) / 8;
397
    c->predictor = av_clip_int16(c->predictor);
398
    c->step = (c->step * ff_adpcm_yamaha_indexscale[nibble]) >> 8;
399
    c->step = av_clip(c->step, 127, 24576);
400 401 402
    return c->predictor;
}

403 404 405 406 407 408 409 410 411
static inline int16_t adpcm_mtaf_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
{
    c->predictor += ff_adpcm_mtaf_stepsize[c->step][nibble];
    c->predictor = av_clip_int16(c->predictor);
    c->step += ff_adpcm_index_table[nibble];
    c->step = av_clip_uintp2(c->step, 5);
    return c->predictor;
}

412 413 414
static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
                     const uint8_t *in, ADPCMChannelStatus *left,
                     ADPCMChannelStatus *right, int channels, int sample_offset)
415 416 417 418 419 420
{
    int i, j;
    int shift,filter,f0,f1;
    int s_1,s_2;
    int d,s,t;

421 422 423 424 425
    out0 += sample_offset;
    if (channels == 1)
        out1 = out0 + 28;
    else
        out1 += sample_offset;
426

427
    for(i=0;i<4;i++) {
428 429
        shift  = 12 - (in[4+i*2] & 15);
        filter = in[4+i*2] >> 4;
430
        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
431
            avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
432 433
            filter=0;
        }
434 435 436 437 438 439 440 441 442
        f0 = xa_adpcm_table[filter][0];
        f1 = xa_adpcm_table[filter][1];

        s_1 = left->sample1;
        s_2 = left->sample2;

        for(j=0;j<28;j++) {
            d = in[16+i+j*4];

443
            t = sign_extend(d, 4);
444 445
            s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
            s_2 = s_1;
446
            s_1 = av_clip_int16(s);
447
            out0[j] = s_1;
448 449
        }

450
        if (channels == 2) {
451 452 453 454 455 456 457 458
            left->sample1 = s_1;
            left->sample2 = s_2;
            s_1 = right->sample1;
            s_2 = right->sample2;
        }

        shift  = 12 - (in[5+i*2] & 15);
        filter = in[5+i*2] >> 4;
459
        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
460
            avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
461 462
            filter=0;
        }
463 464 465 466 467 468 469

        f0 = xa_adpcm_table[filter][0];
        f1 = xa_adpcm_table[filter][1];

        for(j=0;j<28;j++) {
            d = in[16+i+j*4];

470
            t = sign_extend(d >> 4, 4);
471 472
            s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
            s_2 = s_1;
473
            s_1 = av_clip_int16(s);
474
            out1[j] = s_1;
475 476
        }

477
        if (channels == 2) {
478 479 480 481 482 483
            right->sample1 = s_1;
            right->sample2 = s_2;
        } else {
            left->sample1 = s_1;
            left->sample2 = s_2;
        }
484 485 486

        out0 += 28 * (3 - channels);
        out1 += 28 * (3 - channels);
487
    }
488 489

    return 0;
490 491
}

492 493 494 495
static void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_size, int16_t *samples)
{
    ADPCMDecodeContext *c = avctx->priv_data;
    GetBitContext gb;
496
    const int8_t *table;
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
    int k0, signmask, nb_bits, count;
    int size = buf_size*8;
    int i;

    init_get_bits(&gb, buf, size);

    //read bits & initial values
    nb_bits = get_bits(&gb, 2)+2;
    table = swf_index_tables[nb_bits-2];
    k0 = 1 << (nb_bits-2);
    signmask = 1 << (nb_bits-1);

    while (get_bits_count(&gb) <= size - 22*avctx->channels) {
        for (i = 0; i < avctx->channels; i++) {
            *samples++ = c->status[i].predictor = get_sbits(&gb, 16);
            c->status[i].step_index = get_bits(&gb, 6);
        }

        for (count = 0; get_bits_count(&gb) <= size - nb_bits*avctx->channels && count < 4095; count++) {
            int i;

            for (i = 0; i < avctx->channels; i++) {
                // similar to IMA adpcm
                int delta = get_bits(&gb, nb_bits);
                int step = ff_adpcm_step_table[c->status[i].step_index];
522
                int vpdiff = 0; // vpdiff = (delta+0.5)*step/4
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
                int k = k0;

                do {
                    if (delta & k)
                        vpdiff += step;
                    step >>= 1;
                    k >>= 1;
                } while(k);
                vpdiff += step;

                if (delta & signmask)
                    c->status[i].predictor -= vpdiff;
                else
                    c->status[i].predictor += vpdiff;

                c->status[i].step_index += table[delta & (~signmask)];

                c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88);
                c->status[i].predictor = av_clip_int16(c->status[i].predictor);

                *samples++ = c->status[i].predictor;
            }
        }
    }
}

549 550 551 552 553 554 555 556
/**
 * Get the number of samples that will be decoded from the packet.
 * In one case, this is actually the maximum number of samples possible to
 * decode with the given buf_size.
 *
 * @param[out] coded_samples set to the number of samples as coded in the
 *                           packet, or 0 if the codec does not encode the
 *                           number of samples in each frame.
557 558
 * @param[out] approx_nb_samples set to non-zero if the number of samples
 *                               returned is an approximation.
559
 */
560
static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
561
                          int buf_size, int *coded_samples, int *approx_nb_samples)
562 563 564 565 566 567 568 569
{
    ADPCMDecodeContext *s = avctx->priv_data;
    int nb_samples        = 0;
    int ch                = avctx->channels;
    int has_coded_samples = 0;
    int header_size;

    *coded_samples = 0;
570
    *approx_nb_samples = 0;
571

572 573 574
    if(ch <= 0)
        return 0;

575 576
    switch (avctx->codec->id) {
    /* constant, only check buf_size */
577
    case AV_CODEC_ID_ADPCM_EA_XAS:
578 579 580 581
        if (buf_size < 76 * ch)
            return 0;
        nb_samples = 128;
        break;
582
    case AV_CODEC_ID_ADPCM_IMA_QT:
583 584 585 586 587
        if (buf_size < 34 * ch)
            return 0;
        nb_samples = 64;
        break;
    /* simple 4-bit adpcm */
588 589 590
    case AV_CODEC_ID_ADPCM_CT:
    case AV_CODEC_ID_ADPCM_IMA_APC:
    case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
591
    case AV_CODEC_ID_ADPCM_IMA_OKI:
592 593
    case AV_CODEC_ID_ADPCM_IMA_WS:
    case AV_CODEC_ID_ADPCM_YAMAHA:
594
    case AV_CODEC_ID_ADPCM_AICA:
595 596 597 598 599 600 601 602 603
        nb_samples = buf_size * 2 / ch;
        break;
    }
    if (nb_samples)
        return nb_samples;

    /* simple 4-bit adpcm, with header */
    header_size = 0;
    switch (avctx->codec->id) {
604
        case AV_CODEC_ID_ADPCM_4XM:
605
        case AV_CODEC_ID_ADPCM_AGM:
606
        case AV_CODEC_ID_ADPCM_IMA_DAT4:
607 608
        case AV_CODEC_ID_ADPCM_IMA_ISS:     header_size = 4 * ch;      break;
        case AV_CODEC_ID_ADPCM_IMA_AMV:     header_size = 8;           break;
609
        case AV_CODEC_ID_ADPCM_IMA_SMJPEG:  header_size = 4 * ch;      break;
610 611 612 613 614 615
    }
    if (header_size > 0)
        return (buf_size - header_size) * 2 / ch;

    /* more complex formats */
    switch (avctx->codec->id) {
616
    case AV_CODEC_ID_ADPCM_EA:
617
        has_coded_samples = 1;
618
        *coded_samples  = bytestream2_get_le32(gb);
619 620 621
        *coded_samples -= *coded_samples % 28;
        nb_samples      = (buf_size - 12) / 30 * 28;
        break;
622
    case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
623
        has_coded_samples = 1;
624
        *coded_samples = bytestream2_get_le32(gb);
625 626
        nb_samples     = (buf_size - (4 + 8 * ch)) * 2 / ch;
        break;
627
    case AV_CODEC_ID_ADPCM_EA_MAXIS_XA:
628
        nb_samples = (buf_size - ch) / ch * 2;
629
        break;
630 631 632
    case AV_CODEC_ID_ADPCM_EA_R1:
    case AV_CODEC_ID_ADPCM_EA_R2:
    case AV_CODEC_ID_ADPCM_EA_R3:
633 634 635 636
        /* maximum number of samples */
        /* has internal offsets and a per-frame switch to signal raw 16-bit */
        has_coded_samples = 1;
        switch (avctx->codec->id) {
637
        case AV_CODEC_ID_ADPCM_EA_R1:
638
            header_size    = 4 + 9 * ch;
639
            *coded_samples = bytestream2_get_le32(gb);
640
            break;
641
        case AV_CODEC_ID_ADPCM_EA_R2:
642
            header_size    = 4 + 5 * ch;
643
            *coded_samples = bytestream2_get_le32(gb);
644
            break;
645
        case AV_CODEC_ID_ADPCM_EA_R3:
646
            header_size    = 4 + 5 * ch;
647
            *coded_samples = bytestream2_get_be32(gb);
648 649 650 651 652
            break;
        }
        *coded_samples -= *coded_samples % 28;
        nb_samples      = (buf_size - header_size) * 2 / ch;
        nb_samples     -= nb_samples % 28;
653
        *approx_nb_samples = 1;
654
        break;
655
    case AV_CODEC_ID_ADPCM_IMA_DK3:
656 657
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
658
        nb_samples = ((buf_size - 16) * 2 / 3 * 4) / ch;
659
        break;
660
    case AV_CODEC_ID_ADPCM_IMA_DK4:
661 662
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
663 664
        if (buf_size < 4 * ch)
            return AVERROR_INVALIDDATA;
665 666
        nb_samples = 1 + (buf_size - 4 * ch) * 2 / ch;
        break;
James Almer's avatar
James Almer committed
667 668 669 670 671
    case AV_CODEC_ID_ADPCM_IMA_RAD:
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
        nb_samples = (buf_size - 4 * ch) * 2 / ch;
        break;
672
    case AV_CODEC_ID_ADPCM_IMA_WAV:
673 674 675
    {
        int bsize = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
        int bsamples = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
676 677
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
678 679
        if (buf_size < 4 * ch)
            return AVERROR_INVALIDDATA;
680
        nb_samples = 1 + (buf_size - 4 * ch) / (bsize * ch) * bsamples;
681
        break;
682
    }
683
    case AV_CODEC_ID_ADPCM_MS:
684 685
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
686
        nb_samples = (buf_size - 6 * ch) * 2 / ch;
687
        break;
688 689 690 691 692
    case AV_CODEC_ID_ADPCM_MTAF:
        if (avctx->block_align > 0)
            buf_size = FFMIN(buf_size, avctx->block_align);
        nb_samples = (buf_size - 16 * (ch / 2)) * 2 / ch;
        break;
693 694 695
    case AV_CODEC_ID_ADPCM_SBPRO_2:
    case AV_CODEC_ID_ADPCM_SBPRO_3:
    case AV_CODEC_ID_ADPCM_SBPRO_4:
696 697 698
    {
        int samples_per_byte;
        switch (avctx->codec->id) {
699 700 701
        case AV_CODEC_ID_ADPCM_SBPRO_2: samples_per_byte = 4; break;
        case AV_CODEC_ID_ADPCM_SBPRO_3: samples_per_byte = 3; break;
        case AV_CODEC_ID_ADPCM_SBPRO_4: samples_per_byte = 2; break;
702 703
        }
        if (!s->status[0].step_index) {
704 705
            if (buf_size < ch)
                return AVERROR_INVALIDDATA;
706 707 708 709 710 711
            nb_samples++;
            buf_size -= ch;
        }
        nb_samples += buf_size * samples_per_byte / ch;
        break;
    }
712
    case AV_CODEC_ID_ADPCM_SWF:
713 714
    {
        int buf_bits       = buf_size * 8 - 2;
715
        int nbits          = (bytestream2_get_byte(gb) >> 6) + 2;
716 717 718 719 720 721 722 723 724
        int block_hdr_size = 22 * ch;
        int block_size     = block_hdr_size + nbits * ch * 4095;
        int nblocks        = buf_bits / block_size;
        int bits_left      = buf_bits - nblocks * block_size;
        nb_samples         = nblocks * 4096;
        if (bits_left >= block_hdr_size)
            nb_samples += 1 + (bits_left - block_hdr_size) / (nbits * ch);
        break;
    }
725
    case AV_CODEC_ID_ADPCM_THP:
726
    case AV_CODEC_ID_ADPCM_THP_LE:
727
        if (avctx->extradata) {
728
            nb_samples = buf_size * 14 / (8 * ch);
729 730
            break;
        }
731
        has_coded_samples = 1;
732
        bytestream2_skip(gb, 4); // channel size
733 734 735
        *coded_samples  = (avctx->codec->id == AV_CODEC_ID_ADPCM_THP_LE) ?
                          bytestream2_get_le32(gb) :
                          bytestream2_get_be32(gb);
736 737 738
        buf_size       -= 8 + 36 * ch;
        buf_size       /= ch;
        nb_samples      = buf_size / 8 * 14;
739
        if (buf_size % 8 > 1)
740
            nb_samples     += (buf_size % 8 - 1) * 2;
741
        *approx_nb_samples = 1;
742
        break;
Paul B Mahol's avatar
Paul B Mahol committed
743 744 745
    case AV_CODEC_ID_ADPCM_AFC:
        nb_samples = buf_size / (9 * ch) * 16;
        break;
746
    case AV_CODEC_ID_ADPCM_XA:
747 748
        nb_samples = (buf_size / 128) * 224 / ch;
        break;
James Almer's avatar
James Almer committed
749
    case AV_CODEC_ID_ADPCM_DTK:
750
    case AV_CODEC_ID_ADPCM_PSX:
James Almer's avatar
James Almer committed
751 752
        nb_samples = buf_size / (16 * ch) * 28;
        break;
753 754 755 756 757 758 759 760
    }

    /* validate coded sample count */
    if (has_coded_samples && (*coded_samples <= 0 || *coded_samples > nb_samples))
        return AVERROR_INVALIDDATA;

    return nb_samples;
}
761

762 763
static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
                              int *got_frame_ptr, AVPacket *avpkt)
764
{
765
    AVFrame *frame     = data;
766 767
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
768
    ADPCMDecodeContext *c = avctx->priv_data;
769
    ADPCMChannelStatus *cs;
Michael Niedermayer's avatar
Michael Niedermayer committed
770
    int n, m, channel, i;
771
    int16_t *samples;
772
    int16_t **samples_p;
773
    int st; /* stereo */
774
    int count1, count2;
775
    int nb_samples, coded_samples, approx_nb_samples, ret;
776
    GetByteContext gb;
777

778
    bytestream2_init(&gb, buf, buf_size);
779
    nb_samples = get_nb_samples(avctx, &gb, buf_size, &coded_samples, &approx_nb_samples);
780 781 782 783
    if (nb_samples <= 0) {
        av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
        return AVERROR_INVALIDDATA;
    }
Mike Melanson's avatar
Mike Melanson committed
784

785
    /* get output buffer */
786
    frame->nb_samples = nb_samples;
787
    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
788
        return ret;
789
    samples = (int16_t *)frame->data[0];
790
    samples_p = (int16_t **)frame->extended_data;
791

792 793 794
    /* use coded_samples when applicable */
    /* it is always <= nb_samples, so the output buffer will be large enough */
    if (coded_samples) {
795
        if (!approx_nb_samples && coded_samples != nb_samples)
796
            av_log(avctx, AV_LOG_WARNING, "mismatch in coded sample count\n");
797
        frame->nb_samples = nb_samples = coded_samples;
798
    }
799

800
    st = avctx->channels == 2 ? 1 : 0;
801 802

    switch(avctx->codec->id) {
803
    case AV_CODEC_ID_ADPCM_IMA_QT:
804 805
        /* In QuickTime, IMA is encoded by chunks of 34 bytes (=64 samples).
           Channel data is interleaved per-chunk. */
806
        for (channel = 0; channel < avctx->channels; channel++) {
807
            int predictor;
808
            int step_index;
Baptiste Coudurier's avatar
Baptiste Coudurier committed
809 810
            cs = &(c->status[channel]);
            /* (pppppp) (piiiiiii) */
811

Baptiste Coudurier's avatar
Baptiste Coudurier committed
812
            /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
813
            predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
814
            step_index = predictor & 0x7F;
815
            predictor &= ~0x7F;
816 817

            if (cs->step_index == step_index) {
818
                int diff = predictor - cs->predictor;
819 820 821 822 823 824 825 826 827
                if (diff < 0)
                    diff = - diff;
                if (diff > 0x7f)
                    goto update;
            } else {
            update:
                cs->step_index = step_index;
                cs->predictor = predictor;
            }
828

829 830 831 832
            if (cs->step_index > 88u){
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       channel, cs->step_index);
                return AVERROR_INVALIDDATA;
Baptiste Coudurier's avatar
Baptiste Coudurier committed
833
            }
834

835
            samples = samples_p[channel];
836

837
            for (m = 0; m < 64; m += 2) {
838
                int byte = bytestream2_get_byteu(&gb);
839 840
                samples[m    ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F, 3);
                samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4  , 3);
Baptiste Coudurier's avatar
Baptiste Coudurier committed
841
            }
842 843
        }
        break;
844
    case AV_CODEC_ID_ADPCM_IMA_WAV:
Michael Niedermayer's avatar
Michael Niedermayer committed
845 846
        for(i=0; i<avctx->channels; i++){
            cs = &(c->status[i]);
847
            cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(&gb), 16);
848

849 850 851 852 853
            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (cs->step_index > 88u){
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       i, cs->step_index);
                return AVERROR_INVALIDDATA;
854
            }
855 856
        }

857 858
        if (avctx->bits_per_coded_sample != 4) {
            int samples_per_block = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
859
            int block_size = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
860
            uint8_t temp[20 + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
861 862 863 864
            GetBitContext g;

            for (n = 0; n < (nb_samples - 1) / samples_per_block; n++) {
                for (i = 0; i < avctx->channels; i++) {
865 866
                    int j;

867 868
                    cs = &c->status[i];
                    samples = &samples_p[i][1 + n * samples_per_block];
869 870 871 872 873 874 875
                    for (j = 0; j < block_size; j++) {
                        temp[j] = buf[4 * avctx->channels + block_size * n * avctx->channels +
                                        (j % 4) + (j / 4) * (avctx->channels * 4) + i * 4];
                    }
                    ret = init_get_bits8(&g, (const uint8_t *)&temp, block_size);
                    if (ret < 0)
                        return ret;
876 877 878 879 880 881 882 883
                    for (m = 0; m < samples_per_block; m++) {
                        samples[m] = adpcm_ima_wav_expand_nibble(cs, &g,
                                          avctx->bits_per_coded_sample);
                    }
                }
            }
            bytestream2_skip(&gb, avctx->block_align - avctx->channels * 4);
        } else {
884
        for (n = 0; n < (nb_samples - 1) / 8; n++) {
885 886
            for (i = 0; i < avctx->channels; i++) {
                cs = &c->status[i];
887 888
                samples = &samples_p[i][1 + n * 8];
                for (m = 0; m < 8; m += 2) {
889
                    int v = bytestream2_get_byteu(&gb);
890 891
                    samples[m    ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
                    samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4  , 3);
892
                }
893 894
            }
        }
895
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
896
        break;
897
    case AV_CODEC_ID_ADPCM_4XM:
898
        for (i = 0; i < avctx->channels; i++)
899
            c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
Michael Niedermayer's avatar
Michael Niedermayer committed
900

901
        for (i = 0; i < avctx->channels; i++) {
902 903 904 905 906 907
            c->status[i].step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (c->status[i].step_index > 88u) {
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       i, c->status[i].step_index);
                return AVERROR_INVALIDDATA;
            }
908
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
909

910
        for (i = 0; i < avctx->channels; i++) {
911
            samples = (int16_t *)frame->data[i];
912
            cs = &c->status[i];
913 914
            for (n = nb_samples >> 1; n > 0; n--) {
                int v = bytestream2_get_byteu(&gb);
915 916
                *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
                *samples++ = adpcm_ima_expand_nibble(cs, v >> 4  , 4);
917 918
            }
        }
919
        break;
920 921 922 923 924 925 926 927 928 929 930 931
    case AV_CODEC_ID_ADPCM_AGM:
        for (i = 0; i < avctx->channels; i++)
            c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
        for (i = 0; i < avctx->channels; i++)
            c->status[i].step = sign_extend(bytestream2_get_le16u(&gb), 16);

        for (n = 0; n < nb_samples >> (1 - st); n++) {
            int v = bytestream2_get_byteu(&gb);
            *samples++ = adpcm_agm_expand_nibble(&c->status[0], v & 0xF);
            *samples++ = adpcm_agm_expand_nibble(&c->status[st], v >> 4 );
        }
        break;
932
    case AV_CODEC_ID_ADPCM_MS:
933 934 935
    {
        int block_predictor;

936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958
        if (avctx->channels > 2) {
            for (channel = 0; channel < avctx->channels; channel++) {
                samples = samples_p[channel];
                block_predictor = bytestream2_get_byteu(&gb);
                if (block_predictor > 6) {
                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[%d] = %d\n",
                           channel, block_predictor);
                    return AVERROR_INVALIDDATA;
                }
                c->status[channel].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
                c->status[channel].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
                c->status[channel].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
                c->status[channel].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
                c->status[channel].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
                *samples++ = c->status[channel].sample2;
                *samples++ = c->status[channel].sample1;
                for(n = (nb_samples - 2) >> 1; n > 0; n--) {
                    int byte = bytestream2_get_byteu(&gb);
                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte >> 4  );
                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte & 0x0F);
                }
            }
        } else {
959 960
            block_predictor = bytestream2_get_byteu(&gb);
            if (block_predictor > 6) {
961
                av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
962 963 964
                       block_predictor);
                return AVERROR_INVALIDDATA;
            }
965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980
            c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
            c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
            if (st) {
                block_predictor = bytestream2_get_byteu(&gb);
                if (block_predictor > 6) {
                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
                           block_predictor);
                    return AVERROR_INVALIDDATA;
                }
                c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
                c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
            }
            c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (st){
                c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
            }
981

982 983 984 985 986 987 988 989 990 991 992 993 994 995
            c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
            c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);

            *samples++ = c->status[0].sample2;
            if (st) *samples++ = c->status[1].sample2;
            *samples++ = c->status[0].sample1;
            if (st) *samples++ = c->status[1].sample1;
            for(n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
                int byte = bytestream2_get_byteu(&gb);
                *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4  );
                *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
            }
996
        }
997
        break;
998
    }
999 1000 1001
    case AV_CODEC_ID_ADPCM_MTAF:
        for (channel = 0; channel < avctx->channels; channel+=2) {
            bytestream2_skipu(&gb, 4);
1002 1003
            c->status[channel    ].step      = bytestream2_get_le16u(&gb) & 0x1f;
            c->status[channel + 1].step      = bytestream2_get_le16u(&gb) & 0x1f;
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
            c->status[channel    ].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
            bytestream2_skipu(&gb, 2);
            c->status[channel + 1].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
            bytestream2_skipu(&gb, 2);
            for (n = 0; n < nb_samples; n+=2) {
                int v = bytestream2_get_byteu(&gb);
                samples_p[channel][n    ] = adpcm_mtaf_expand_nibble(&c->status[channel], v & 0x0F);
                samples_p[channel][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel], v >> 4  );
            }
            for (n = 0; n < nb_samples; n+=2) {
                int v = bytestream2_get_byteu(&gb);
                samples_p[channel + 1][n    ] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v & 0x0F);
                samples_p[channel + 1][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v >> 4  );
            }
        }
        break;
1020
    case AV_CODEC_ID_ADPCM_IMA_DK4:
1021 1022
        for (channel = 0; channel < avctx->channels; channel++) {
            cs = &c->status[channel];
1023 1024 1025 1026 1027 1028 1029
            cs->predictor  = *samples++ = sign_extend(bytestream2_get_le16u(&gb), 16);
            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (cs->step_index > 88u){
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       channel, cs->step_index);
                return AVERROR_INVALIDDATA;
            }
1030
        }
1031
        for (n = (nb_samples - 1) >> (1 - st); n > 0; n--) {
1032
            int v = bytestream2_get_byteu(&gb);
1033 1034
            *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4  , 3);
            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
1035 1036
        }
        break;
1037
    case AV_CODEC_ID_ADPCM_IMA_DK3:
1038
    {
1039 1040
        int last_byte = 0;
        int nibble;
1041 1042
        int decode_top_nibble_next = 0;
        int diff_channel;
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
        const int16_t *samples_end = samples + avctx->channels * nb_samples;

        bytestream2_skipu(&gb, 10);
        c->status[0].predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
        c->status[1].predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
        c->status[0].step_index = bytestream2_get_byteu(&gb);
        c->status[1].step_index = bytestream2_get_byteu(&gb);
        if (c->status[0].step_index > 88u || c->status[1].step_index > 88u){
            av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i/%i\n",
                   c->status[0].step_index, c->status[1].step_index);
            return AVERROR_INVALIDDATA;
        }
1055 1056 1057
        /* sign extend the predictors */
        diff_channel = c->status[1].predictor;

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
        /* DK3 ADPCM support macro */
#define DK3_GET_NEXT_NIBBLE() \
    if (decode_top_nibble_next) { \
        nibble = last_byte >> 4; \
        decode_top_nibble_next = 0; \
    } else { \
        last_byte = bytestream2_get_byteu(&gb); \
        nibble = last_byte & 0x0F; \
        decode_top_nibble_next = 1; \
    }

        while (samples < samples_end) {
1070 1071 1072 1073 1074 1075

            /* for this algorithm, c->status[0] is the sum channel and
             * c->status[1] is the diff channel */

            /* process the first predictor of the sum channel */
            DK3_GET_NEXT_NIBBLE();
Michael Niedermayer's avatar
Michael Niedermayer committed
1076
            adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1077 1078 1079

            /* process the diff channel predictor */
            DK3_GET_NEXT_NIBBLE();
Michael Niedermayer's avatar
Michael Niedermayer committed
1080
            adpcm_ima_expand_nibble(&c->status[1], nibble, 3);
1081 1082 1083 1084 1085 1086 1087 1088

            /* process the first pair of stereo PCM samples */
            diff_channel = (diff_channel + c->status[1].predictor) / 2;
            *samples++ = c->status[0].predictor + c->status[1].predictor;
            *samples++ = c->status[0].predictor - c->status[1].predictor;

            /* process the second predictor of the sum channel */
            DK3_GET_NEXT_NIBBLE();
Michael Niedermayer's avatar
Michael Niedermayer committed
1089
            adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
1090 1091 1092 1093 1094 1095

            /* process the second pair of stereo PCM samples */
            diff_channel = (diff_channel + c->status[1].predictor) / 2;
            *samples++ = c->status[0].predictor + c->status[1].predictor;
            *samples++ = c->status[0].predictor - c->status[1].predictor;
        }
1096 1097 1098

        if ((bytestream2_tell(&gb) & 1))
            bytestream2_skip(&gb, 1);
1099
        break;
1100
    }
1101
    case AV_CODEC_ID_ADPCM_IMA_ISS:
1102 1103
        for (channel = 0; channel < avctx->channels; channel++) {
            cs = &c->status[channel];
1104 1105 1106 1107 1108 1109 1110
            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (cs->step_index > 88u){
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       channel, cs->step_index);
                return AVERROR_INVALIDDATA;
            }
1111 1112
        }

1113 1114 1115
        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int v1, v2;
            int v = bytestream2_get_byteu(&gb);
1116
            /* nibbles are swapped for mono */
1117
            if (st) {
1118 1119
                v1 = v >> 4;
                v2 = v & 0x0F;
1120
            } else {
1121 1122
                v2 = v >> 4;
                v1 = v & 0x0F;
1123
            }
1124 1125
            *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v1, 3);
            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
1126 1127
        }
        break;
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
    case AV_CODEC_ID_ADPCM_IMA_DAT4:
        for (channel = 0; channel < avctx->channels; channel++) {
            cs = &c->status[channel];
            samples = samples_p[channel];
            bytestream2_skip(&gb, 4);
            for (n = 0; n < nb_samples; n += 2) {
                int v = bytestream2_get_byteu(&gb);
                *samples++ = adpcm_ima_expand_nibble(cs, v >> 4  , 3);
                *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
            }
        }
        break;
1140
    case AV_CODEC_ID_ADPCM_IMA_APC:
1141 1142
        while (bytestream2_get_bytes_left(&gb) > 0) {
            int v = bytestream2_get_byteu(&gb);
1143 1144
            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  v >> 4  , 3);
            *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
1145 1146
        }
        break;
1147 1148 1149 1150 1151 1152 1153
    case AV_CODEC_ID_ADPCM_IMA_OKI:
        while (bytestream2_get_bytes_left(&gb) > 0) {
            int v = bytestream2_get_byteu(&gb);
            *samples++ = adpcm_ima_oki_expand_nibble(&c->status[0],  v >> 4  );
            *samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F);
        }
        break;
James Almer's avatar
James Almer committed
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
    case AV_CODEC_ID_ADPCM_IMA_RAD:
        for (channel = 0; channel < avctx->channels; channel++) {
            cs = &c->status[channel];
            cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
            cs->predictor  = sign_extend(bytestream2_get_le16u(&gb), 16);
            if (cs->step_index > 88u){
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       channel, cs->step_index);
                return AVERROR_INVALIDDATA;
            }
        }
        for (n = 0; n < nb_samples / 2; n++) {
            int byte[2];

            byte[0] = bytestream2_get_byteu(&gb);
            if (st)
                byte[1] = bytestream2_get_byteu(&gb);
            for(channel = 0; channel < avctx->channels; channel++) {
                *samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] & 0x0F, 3);
            }
            for(channel = 0; channel < avctx->channels; channel++) {
                *samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] >> 4  , 3);
            }
        }
        break;
1179
    case AV_CODEC_ID_ADPCM_IMA_WS:
1180 1181
        if (c->vqa_version == 3) {
            for (channel = 0; channel < avctx->channels; channel++) {
1182
                int16_t *smp = samples_p[channel];
1183

1184 1185
                for (n = nb_samples / 2; n > 0; n--) {
                    int v = bytestream2_get_byteu(&gb);
1186 1187
                    *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
                    *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
1188
                }
1189
            }
1190
        } else {
1191
            for (n = nb_samples / 2; n > 0; n--) {
1192 1193 1194 1195 1196 1197
                for (channel = 0; channel < avctx->channels; channel++) {
                    int v = bytestream2_get_byteu(&gb);
                    *samples++  = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
                    samples[st] = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
                }
                samples += avctx->channels;
1198 1199
            }
        }
1200
        bytestream2_seek(&gb, 0, SEEK_END);
1201
        break;
1202
    case AV_CODEC_ID_ADPCM_XA:
1203 1204 1205 1206 1207
    {
        int16_t *out0 = samples_p[0];
        int16_t *out1 = samples_p[1];
        int samples_per_block = 28 * (3 - avctx->channels) * 4;
        int sample_offset = 0;
1208
        int bytes_remaining;
1209
        while (bytestream2_get_bytes_left(&gb) >= 128) {
1210 1211 1212
            if ((ret = xa_decode(avctx, out0, out1, buf + bytestream2_tell(&gb),
                                 &c->status[0], &c->status[1],
                                 avctx->channels, sample_offset)) < 0)
1213
                return ret;
1214
            bytestream2_skipu(&gb, 128);
1215
            sample_offset += samples_per_block;
1216
        }
1217 1218 1219 1220 1221 1222
        /* Less than a full block of data left, e.g. when reading from
         * 2324 byte per sector XA; the remainder is padding */
        bytes_remaining = bytestream2_get_bytes_left(&gb);
        if (bytes_remaining > 0) {
            bytestream2_skip(&gb, bytes_remaining);
        }
1223
        break;
1224
    }
1225
    case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
1226 1227 1228 1229 1230 1231 1232 1233
        for (i=0; i<=st; i++) {
            c->status[i].step_index = bytestream2_get_le32u(&gb);
            if (c->status[i].step_index > 88u) {
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
                       i, c->status[i].step_index);
                return AVERROR_INVALIDDATA;
            }
        }
Peter Ross's avatar
Peter Ross committed
1234
        for (i=0; i<=st; i++)
1235
            c->status[i].predictor  = bytestream2_get_le32u(&gb);
Peter Ross's avatar
Peter Ross committed
1236

1237 1238 1239 1240
        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int byte   = bytestream2_get_byteu(&gb);
            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  byte >> 4,   3);
            *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 3);
Peter Ross's avatar
Peter Ross committed
1241 1242
        }
        break;
1243
    case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
1244 1245 1246 1247
        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int byte = bytestream2_get_byteu(&gb);
            *samples++ = adpcm_ima_expand_nibble(&c->status[0],  byte >> 4,   6);
            *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 6);
Peter Ross's avatar
Peter Ross committed
1248 1249
        }
        break;
1250
    case AV_CODEC_ID_ADPCM_EA:
1251
    {
1252 1253 1254 1255 1256
        int previous_left_sample, previous_right_sample;
        int current_left_sample, current_right_sample;
        int next_left_sample, next_right_sample;
        int coeff1l, coeff2l, coeff1r, coeff2r;
        int shift_left, shift_right;
1257

1258 1259
        /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces,
           each coding 28 stereo samples. */
1260

Michael Niedermayer's avatar
Michael Niedermayer committed
1261 1262 1263
        if(avctx->channels != 2)
            return AVERROR_INVALIDDATA;

1264 1265 1266 1267
        current_left_sample   = sign_extend(bytestream2_get_le16u(&gb), 16);
        previous_left_sample  = sign_extend(bytestream2_get_le16u(&gb), 16);
        current_right_sample  = sign_extend(bytestream2_get_le16u(&gb), 16);
        previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
1268

1269
        for (count1 = 0; count1 < nb_samples / 28; count1++) {
1270 1271 1272 1273 1274
            int byte = bytestream2_get_byteu(&gb);
            coeff1l = ea_adpcm_table[ byte >> 4       ];
            coeff2l = ea_adpcm_table[(byte >> 4  ) + 4];
            coeff1r = ea_adpcm_table[ byte & 0x0F];
            coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
1275

1276 1277 1278
            byte = bytestream2_get_byteu(&gb);
            shift_left  = 20 - (byte >> 4);
            shift_right = 20 - (byte & 0x0F);
1279 1280

            for (count2 = 0; count2 < 28; count2++) {
1281 1282 1283
                byte = bytestream2_get_byteu(&gb);
                next_left_sample  = sign_extend(byte >> 4, 4) << shift_left;
                next_right_sample = sign_extend(byte,      4) << shift_right;
1284

1285 1286
                next_left_sample = (next_left_sample +
                    (current_left_sample * coeff1l) +
1287
                    (previous_left_sample * coeff2l) + 0x80) >> 8;
1288 1289
                next_right_sample = (next_right_sample +
                    (current_right_sample * coeff1r) +
1290 1291 1292
                    (previous_right_sample * coeff2r) + 0x80) >> 8;

                previous_left_sample = current_left_sample;
1293
                current_left_sample = av_clip_int16(next_left_sample);
1294
                previous_right_sample = current_right_sample;
1295
                current_right_sample = av_clip_int16(next_right_sample);
1296 1297
                *samples++ = current_left_sample;
                *samples++ = current_right_sample;
1298 1299
            }
        }
1300

1301
        bytestream2_skip(&gb, 2); // Skip terminating 0x0000
1302

1303
        break;
1304
    }
1305
    case AV_CODEC_ID_ADPCM_EA_MAXIS_XA:
1306 1307 1308
    {
        int coeff[2][2], shift[2];

1309
        for(channel = 0; channel < avctx->channels; channel++) {
1310
            int byte = bytestream2_get_byteu(&gb);
1311
            for (i=0; i<2; i++)
1312 1313
                coeff[channel][i] = ea_adpcm_table[(byte >> 4) + 4*i];
            shift[channel] = 20 - (byte & 0x0F);
1314
        }
1315
        for (count1 = 0; count1 < nb_samples / 2; count1++) {
1316 1317 1318 1319
            int byte[2];

            byte[0] = bytestream2_get_byteu(&gb);
            if (st) byte[1] = bytestream2_get_byteu(&gb);
1320 1321
            for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
                for(channel = 0; channel < avctx->channels; channel++) {
1322
                    int sample = sign_extend(byte[channel] >> i, 4) << shift[channel];
1323 1324 1325 1326 1327 1328 1329 1330 1331
                    sample = (sample +
                             c->status[channel].sample1 * coeff[channel][0] +
                             c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
                    c->status[channel].sample2 = c->status[channel].sample1;
                    c->status[channel].sample1 = av_clip_int16(sample);
                    *samples++ = c->status[channel].sample1;
                }
            }
        }
1332
        bytestream2_seek(&gb, 0, SEEK_END);
1333
        break;
1334
    }
1335 1336 1337
    case AV_CODEC_ID_ADPCM_EA_R1:
    case AV_CODEC_ID_ADPCM_EA_R2:
    case AV_CODEC_ID_ADPCM_EA_R3: {
1338 1339 1340 1341
        /* channel numbering
           2chan: 0=fl, 1=fr
           4chan: 0=fl, 1=rl, 2=fr, 3=rr
           6chan: 0=fl, 1=c,  2=fr, 3=rl,  4=rr, 5=sub */
1342
        const int big_endian = avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R3;
1343 1344 1345
        int previous_sample, current_sample, next_sample;
        int coeff1, coeff2;
        int shift;
1346 1347
        unsigned int channel;
        uint16_t *samplesC;
1348
        int count = 0;
1349
        int offsets[6];
1350

1351 1352 1353 1354
        for (channel=0; channel<avctx->channels; channel++)
            offsets[channel] = (big_endian ? bytestream2_get_be32(&gb) :
                                             bytestream2_get_le32(&gb)) +
                               (avctx->channels + 1) * 4;
1355 1356

        for (channel=0; channel<avctx->channels; channel++) {
1357
            bytestream2_seek(&gb, offsets[channel], SEEK_SET);
1358
            samplesC = samples_p[channel];
1359

1360
            if (avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R1) {
1361 1362
                current_sample  = sign_extend(bytestream2_get_le16(&gb), 16);
                previous_sample = sign_extend(bytestream2_get_le16(&gb), 16);
1363 1364 1365 1366 1367
            } else {
                current_sample  = c->status[channel].predictor;
                previous_sample = c->status[channel].prev_sample;
            }

1368
            for (count1 = 0; count1 < nb_samples / 28; count1++) {
1369 1370 1371 1372
                int byte = bytestream2_get_byte(&gb);
                if (byte == 0xEE) {  /* only seen in R2 and R3 */
                    current_sample  = sign_extend(bytestream2_get_be16(&gb), 16);
                    previous_sample = sign_extend(bytestream2_get_be16(&gb), 16);
1373

1374 1375
                    for (count2=0; count2<28; count2++)
                        *samplesC++ = sign_extend(bytestream2_get_be16(&gb), 16);
1376
                } else {
1377 1378 1379
                    coeff1 = ea_adpcm_table[ byte >> 4     ];
                    coeff2 = ea_adpcm_table[(byte >> 4) + 4];
                    shift = 20 - (byte & 0x0F);
1380 1381 1382

                    for (count2=0; count2<28; count2++) {
                        if (count2 & 1)
1383 1384 1385 1386 1387
                            next_sample = sign_extend(byte,    4) << shift;
                        else {
                            byte = bytestream2_get_byte(&gb);
                            next_sample = sign_extend(byte >> 4, 4) << shift;
                        }
1388 1389 1390 1391 1392 1393 1394

                        next_sample += (current_sample  * coeff1) +
                                       (previous_sample * coeff2);
                        next_sample = av_clip_int16(next_sample >> 8);

                        previous_sample = current_sample;
                        current_sample  = next_sample;
1395
                        *samplesC++ = current_sample;
1396 1397 1398
                    }
                }
            }
1399 1400 1401 1402 1403 1404
            if (!count) {
                count = count1;
            } else if (count != count1) {
                av_log(avctx, AV_LOG_WARNING, "per-channel sample count mismatch\n");
                count = FFMAX(count, count1);
            }
1405

1406
            if (avctx->codec->id != AV_CODEC_ID_ADPCM_EA_R1) {
1407 1408 1409 1410 1411
                c->status[channel].predictor   = current_sample;
                c->status[channel].prev_sample = previous_sample;
            }
        }

1412
        frame->nb_samples = count * 28;
1413
        bytestream2_seek(&gb, 0, SEEK_END);
1414 1415
        break;
    }
1416
    case AV_CODEC_ID_ADPCM_EA_XAS:
1417 1418
        for (channel=0; channel<avctx->channels; channel++) {
            int coeff[2][4], shift[4];
1419 1420
            int16_t *s = samples_p[channel];
            for (n = 0; n < 4; n++, s += 32) {
1421
                int val = sign_extend(bytestream2_get_le16u(&gb), 16);
1422
                for (i=0; i<2; i++)
1423 1424 1425 1426 1427
                    coeff[i][n] = ea_adpcm_table[(val&0x0F)+4*i];
                s[0] = val & ~0x0F;

                val = sign_extend(bytestream2_get_le16u(&gb), 16);
                shift[n] = 20 - (val & 0x0F);
1428
                s[1] = val & ~0x0F;
1429 1430 1431
            }

            for (m=2; m<32; m+=2) {
1432 1433 1434
                s = &samples_p[channel][m];
                for (n = 0; n < 4; n++, s += 32) {
                    int level, pred;
1435
                    int byte = bytestream2_get_byteu(&gb);
1436 1437 1438 1439 1440 1441 1442 1443

                    level = sign_extend(byte >> 4, 4) << shift[n];
                    pred  = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
                    s[0]  = av_clip_int16((level + pred + 0x80) >> 8);

                    level = sign_extend(byte, 4) << shift[n];
                    pred  = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
                    s[1]  = av_clip_int16((level + pred + 0x80) >> 8);
1444 1445 1446 1447
                }
            }
        }
        break;
1448
    case AV_CODEC_ID_ADPCM_IMA_AMV:
1449
        c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
1450 1451
        c->status[0].step_index = bytestream2_get_byteu(&gb);
        bytestream2_skipu(&gb, 5);
1452 1453 1454 1455
        if (c->status[0].step_index > 88u) {
            av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
                   c->status[0].step_index);
            return AVERROR_INVALIDDATA;
1456
        }
Vitor Sessak's avatar
Vitor Sessak committed
1457

1458
        for (n = nb_samples >> (1 - st); n > 0; n--) {
1459
            int v = bytestream2_get_byteu(&gb);
Vitor Sessak's avatar
Vitor Sessak committed
1460

1461 1462 1463 1464 1465
            *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
            *samples++ = adpcm_ima_expand_nibble(&c->status[0], v & 0xf, 3);
        }
        break;
    case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
1466
        for (i = 0; i < avctx->channels; i++) {
1467 1468 1469 1470 1471 1472 1473 1474
            c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
            c->status[i].step_index = bytestream2_get_byteu(&gb);
            bytestream2_skipu(&gb, 1);
            if (c->status[i].step_index > 88u) {
                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
                       c->status[i].step_index);
                return AVERROR_INVALIDDATA;
            }
1475
        }
1476 1477 1478

        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int v = bytestream2_get_byteu(&gb);
Vitor Sessak's avatar
Vitor Sessak committed
1479

1480 1481
            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4, 3);
            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf, 3);
1482 1483
        }
        break;
1484
    case AV_CODEC_ID_ADPCM_CT:
1485 1486
        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int v = bytestream2_get_byteu(&gb);
1487 1488
            *samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4  );
            *samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
1489 1490
        }
        break;
1491 1492 1493
    case AV_CODEC_ID_ADPCM_SBPRO_4:
    case AV_CODEC_ID_ADPCM_SBPRO_3:
    case AV_CODEC_ID_ADPCM_SBPRO_2:
1494 1495
        if (!c->status[0].step_index) {
            /* the first byte is a raw sample */
1496
            *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
1497
            if (st)
1498
                *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
1499
            c->status[0].step_index = 1;
1500
            nb_samples--;
1501
        }
1502
        if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_4) {
1503 1504
            for (n = nb_samples >> (1 - st); n > 0; n--) {
                int byte = bytestream2_get_byteu(&gb);
1505
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1506
                                                       byte >> 4,   4, 0);
1507
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1508
                                                       byte & 0x0F, 4, 0);
1509
            }
1510
        } else if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_3) {
1511
            for (n = (nb_samples<<st) / 3; n > 0; n--) {
1512
                int byte = bytestream2_get_byteu(&gb);
1513
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1514
                                                        byte >> 5        , 3, 0);
1515
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1516
                                                       (byte >> 2) & 0x07, 3, 0);
1517
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1518
                                                        byte & 0x03,       2, 0);
1519 1520
            }
        } else {
1521 1522
            for (n = nb_samples >> (2 - st); n > 0; n--) {
                int byte = bytestream2_get_byteu(&gb);
1523
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1524
                                                        byte >> 6        , 2, 2);
1525
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1526
                                                       (byte >> 4) & 0x03, 2, 2);
1527
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
1528
                                                       (byte >> 2) & 0x03, 2, 2);
1529
                *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
1530
                                                        byte & 0x03,       2, 2);
1531 1532 1533
            }
        }
        break;
1534
    case AV_CODEC_ID_ADPCM_SWF:
1535 1536
        adpcm_swf_decode(avctx, buf, buf_size, samples);
        bytestream2_seek(&gb, 0, SEEK_END);
1537
        break;
1538
    case AV_CODEC_ID_ADPCM_YAMAHA:
1539 1540
        for (n = nb_samples >> (1 - st); n > 0; n--) {
            int v = bytestream2_get_byteu(&gb);
1541 1542
            *samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
            *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4  );
1543 1544
        }
        break;
1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
    case AV_CODEC_ID_ADPCM_AICA:
        if (!c->has_status) {
            for (channel = 0; channel < avctx->channels; channel++)
                c->status[channel].step = 0;
            c->has_status = 1;
        }
        for (channel = 0; channel < avctx->channels; channel++) {
            samples = samples_p[channel];
            for (n = nb_samples >> 1; n > 0; n--) {
                int v = bytestream2_get_byteu(&gb);
                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v & 0x0F);
                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v >> 4  );
            }
        }
        break;
Paul B Mahol's avatar
Paul B Mahol committed
1560
    case AV_CODEC_ID_ADPCM_AFC:
Paul B Mahol's avatar
Paul B Mahol committed
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
    {
        int samples_per_block;
        int blocks;

        if (avctx->extradata && avctx->extradata_size == 1 && avctx->extradata[0]) {
            samples_per_block = avctx->extradata[0] / 16;
            blocks = nb_samples / avctx->extradata[0];
        } else {
            samples_per_block = nb_samples / 16;
            blocks = 1;
        }

        for (m = 0; m < blocks; m++) {
Paul B Mahol's avatar
Paul B Mahol committed
1574 1575 1576 1577
        for (channel = 0; channel < avctx->channels; channel++) {
            int prev1 = c->status[channel].sample1;
            int prev2 = c->status[channel].sample2;

Paul B Mahol's avatar
Paul B Mahol committed
1578
            samples = samples_p[channel] + m * 16;
Paul B Mahol's avatar
Paul B Mahol committed
1579
            /* Read in every sample for this channel.  */
Paul B Mahol's avatar
Paul B Mahol committed
1580
            for (i = 0; i < samples_per_block; i++) {
Paul B Mahol's avatar
Paul B Mahol committed
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608
                int byte = bytestream2_get_byteu(&gb);
                int scale = 1 << (byte >> 4);
                int index = byte & 0xf;
                int factor1 = ff_adpcm_afc_coeffs[0][index];
                int factor2 = ff_adpcm_afc_coeffs[1][index];

                /* Decode 16 samples.  */
                for (n = 0; n < 16; n++) {
                    int32_t sampledat;

                    if (n & 1) {
                        sampledat = sign_extend(byte, 4);
                    } else {
                        byte = bytestream2_get_byteu(&gb);
                        sampledat = sign_extend(byte >> 4, 4);
                    }

                    sampledat = ((prev1 * factor1 + prev2 * factor2) +
                                 ((sampledat * scale) << 11)) >> 11;
                    *samples = av_clip_int16(sampledat);
                    prev2 = prev1;
                    prev1 = *samples++;
                }
            }

            c->status[channel].sample1 = prev1;
            c->status[channel].sample2 = prev2;
        }
Paul B Mahol's avatar
Paul B Mahol committed
1609
        }
Paul B Mahol's avatar
Paul B Mahol committed
1610 1611
        bytestream2_seek(&gb, 0, SEEK_END);
        break;
Paul B Mahol's avatar
Paul B Mahol committed
1612
    }
1613
    case AV_CODEC_ID_ADPCM_THP:
1614
    case AV_CODEC_ID_ADPCM_THP_LE:
1615
    {
1616
        int table[14][16];
1617 1618
        int ch;

1619 1620 1621 1622 1623 1624
#define THP_GET16(g) \
    sign_extend( \
        avctx->codec->id == AV_CODEC_ID_ADPCM_THP_LE ? \
        bytestream2_get_le16u(&(g)) : \
        bytestream2_get_be16u(&(g)), 16)

1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
        if (avctx->extradata) {
            GetByteContext tb;
            if (avctx->extradata_size < 32 * avctx->channels) {
                av_log(avctx, AV_LOG_ERROR, "Missing coeff table\n");
                return AVERROR_INVALIDDATA;
            }

            bytestream2_init(&tb, avctx->extradata, avctx->extradata_size);
            for (i = 0; i < avctx->channels; i++)
                for (n = 0; n < 16; n++)
1635
                    table[i][n] = THP_GET16(tb);
1636
        } else {
1637 1638 1639
            for (i = 0; i < avctx->channels; i++)
                for (n = 0; n < 16; n++)
                    table[i][n] = THP_GET16(gb);
1640

1641 1642 1643 1644 1645 1646 1647 1648 1649
            if (!c->has_status) {
                /* Initialize the previous sample.  */
                for (i = 0; i < avctx->channels; i++) {
                    c->status[i].sample1 = THP_GET16(gb);
                    c->status[i].sample2 = THP_GET16(gb);
                }
                c->has_status = 1;
            } else {
                bytestream2_skip(&gb, avctx->channels * 4);
1650
            }
1651
        }
1652

1653
        for (ch = 0; ch < avctx->channels; ch++) {
1654
            samples = samples_p[ch];
1655 1656

            /* Read in every sample for this channel.  */
1657
            for (i = 0; i < (nb_samples + 13) / 14; i++) {
1658 1659 1660
                int byte = bytestream2_get_byteu(&gb);
                int index = (byte >> 4) & 7;
                unsigned int exp = byte & 0x0F;
1661 1662
                int factor1 = table[ch][index * 2];
                int factor2 = table[ch][index * 2 + 1];
1663 1664

                /* Decode 14 samples.  */
1665
                for (n = 0; n < 14 && (i * 14 + n < nb_samples); n++) {
1666
                    int32_t sampledat;
1667 1668 1669 1670 1671 1672 1673

                    if (n & 1) {
                        sampledat = sign_extend(byte, 4);
                    } else {
                        byte = bytestream2_get_byteu(&gb);
                        sampledat = sign_extend(byte >> 4, 4);
                    }
1674

1675 1676
                    sampledat = ((c->status[ch].sample1 * factor1
                                + c->status[ch].sample2 * factor2) >> 11) + (sampledat << exp);
1677
                    *samples = av_clip_int16(sampledat);
1678 1679
                    c->status[ch].sample2 = c->status[ch].sample1;
                    c->status[ch].sample1 = *samples++;
1680 1681 1682 1683
                }
            }
        }
        break;
1684
    }
James Almer's avatar
James Almer committed
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714
    case AV_CODEC_ID_ADPCM_DTK:
        for (channel = 0; channel < avctx->channels; channel++) {
            samples = samples_p[channel];

            /* Read in every sample for this channel.  */
            for (i = 0; i < nb_samples / 28; i++) {
                int byte, header;
                if (channel)
                    bytestream2_skipu(&gb, 1);
                header = bytestream2_get_byteu(&gb);
                bytestream2_skipu(&gb, 3 - channel);

                /* Decode 28 samples.  */
                for (n = 0; n < 28; n++) {
                    int32_t sampledat, prev;

                    switch (header >> 4) {
                    case 1:
                        prev = (c->status[channel].sample1 * 0x3c);
                        break;
                    case 2:
                        prev = (c->status[channel].sample1 * 0x73) - (c->status[channel].sample2 * 0x34);
                        break;
                    case 3:
                        prev = (c->status[channel].sample1 * 0x62) - (c->status[channel].sample2 * 0x37);
                        break;
                    default:
                        prev = 0;
                    }

1715
                    prev = av_clip_intp2((prev + 0x20) >> 6, 21);
James Almer's avatar
James Almer committed
1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732

                    byte = bytestream2_get_byteu(&gb);
                    if (!channel)
                        sampledat = sign_extend(byte, 4);
                    else
                        sampledat = sign_extend(byte >> 4, 4);

                    sampledat = (((sampledat << 12) >> (header & 0xf)) << 6) + prev;
                    *samples++ = av_clip_int16(sampledat >> 6);
                    c->status[channel].sample2 = c->status[channel].sample1;
                    c->status[channel].sample1 = sampledat;
                }
            }
            if (!channel)
                bytestream2_seek(&gb, 0, SEEK_SET);
        }
        break;
1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
    case AV_CODEC_ID_ADPCM_PSX:
        for (channel = 0; channel < avctx->channels; channel++) {
            samples = samples_p[channel];

            /* Read in every sample for this channel.  */
            for (i = 0; i < nb_samples / 28; i++) {
                int filter, shift, flag, byte;

                filter = bytestream2_get_byteu(&gb);
                shift  = filter & 0xf;
                filter = filter >> 4;
                if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table))
                    return AVERROR_INVALIDDATA;
                flag   = bytestream2_get_byteu(&gb);

                /* Decode 28 samples.  */
                for (n = 0; n < 28; n++) {
                    int sample = 0, scale;

                    if (flag < 0x07) {
                        if (n & 1) {
                            scale = sign_extend(byte >> 4, 4);
                        } else {
                            byte  = bytestream2_get_byteu(&gb);
                            scale = sign_extend(byte, 4);
                        }

                        scale  = scale << 12;
                        sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
                    }
                    *samples++ = av_clip_int16(sample);
                    c->status[channel].sample2 = c->status[channel].sample1;
                    c->status[channel].sample1 = sample;
                }
            }
        }
        break;
1770

1771
    default:
1772
        av_assert0(0); // unsupported codec_id should not happen
1773
    }
1774

1775 1776 1777 1778 1779
    if (avpkt->size && bytestream2_tell(&gb) == 0) {
        av_log(avctx, AV_LOG_ERROR, "Nothing consumed\n");
        return AVERROR_INVALIDDATA;
    }

1780
    *got_frame_ptr = 1;
1781

1782 1783 1784 1785 1786
    if (avpkt->size < bytestream2_tell(&gb)) {
        av_log(avctx, AV_LOG_ERROR, "Overread of %d < %d\n", avpkt->size, bytestream2_tell(&gb));
        return avpkt->size;
    }

1787
    return bytestream2_tell(&gb);
1788 1789
}

1790 1791 1792 1793 1794 1795
static void adpcm_flush(AVCodecContext *avctx)
{
    ADPCMDecodeContext *c = avctx->priv_data;
    c->has_status = 0;
}

1796

1797 1798
static const enum AVSampleFormat sample_fmts_s16[]  = { AV_SAMPLE_FMT_S16,
                                                        AV_SAMPLE_FMT_NONE };
1799
static const enum AVSampleFormat sample_fmts_s16p[] = { AV_SAMPLE_FMT_S16P,
1800
                                                        AV_SAMPLE_FMT_NONE };
1801 1802 1803
static const enum AVSampleFormat sample_fmts_both[] = { AV_SAMPLE_FMT_S16,
                                                        AV_SAMPLE_FMT_S16P,
                                                        AV_SAMPLE_FMT_NONE };
1804 1805

#define ADPCM_DECODER(id_, sample_fmts_, name_, long_name_) \
1806 1807
AVCodec ff_ ## name_ ## _decoder = {                        \
    .name           = #name_,                               \
1808
    .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
1809 1810 1811 1812 1813
    .type           = AVMEDIA_TYPE_AUDIO,                   \
    .id             = id_,                                  \
    .priv_data_size = sizeof(ADPCMDecodeContext),           \
    .init           = adpcm_decode_init,                    \
    .decode         = adpcm_decode_frame,                   \
1814
    .flush          = adpcm_flush,                          \
1815
    .capabilities   = AV_CODEC_CAP_DR1,                     \
1816
    .sample_fmts    = sample_fmts_,                         \
1817
}
1818

1819
/* Note: Do not forget to add new entries to the Makefile as well. */
1820
ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM,         sample_fmts_s16p, adpcm_4xm,         "ADPCM 4X Movie");
Paul B Mahol's avatar
Paul B Mahol committed
1821
ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC,         sample_fmts_s16p, adpcm_afc,         "ADPCM Nintendo Gamecube AFC");
1822
ADPCM_DECODER(AV_CODEC_ID_ADPCM_AGM,         sample_fmts_s16,  adpcm_agm,         "ADPCM AmuseGraphics Movie");
1823
ADPCM_DECODER(AV_CODEC_ID_ADPCM_AICA,        sample_fmts_s16p, adpcm_aica,        "ADPCM Yamaha AICA");
1824
ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT,          sample_fmts_s16,  adpcm_ct,          "ADPCM Creative Technology");
James Almer's avatar
James Almer committed
1825
ADPCM_DECODER(AV_CODEC_ID_ADPCM_DTK,         sample_fmts_s16p, adpcm_dtk,         "ADPCM Nintendo Gamecube DTK");
1826 1827
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA,          sample_fmts_s16,  adpcm_ea,          "ADPCM Electronic Arts");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_MAXIS_XA, sample_fmts_s16,  adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA");
1828 1829 1830
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R1,       sample_fmts_s16p, adpcm_ea_r1,       "ADPCM Electronic Arts R1");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R2,       sample_fmts_s16p, adpcm_ea_r2,       "ADPCM Electronic Arts R2");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R3,       sample_fmts_s16p, adpcm_ea_r3,       "ADPCM Electronic Arts R3");
1831
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS,      sample_fmts_s16p, adpcm_ea_xas,      "ADPCM Electronic Arts XAS");
1832 1833
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV,     sample_fmts_s16,  adpcm_ima_amv,     "ADPCM IMA AMV");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC,     sample_fmts_s16,  adpcm_ima_apc,     "ADPCM IMA CRYO APC");
1834
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DAT4,    sample_fmts_s16,  adpcm_ima_dat4,    "ADPCM IMA Eurocom DAT4");
1835 1836 1837 1838 1839
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3,     sample_fmts_s16,  adpcm_ima_dk3,     "ADPCM IMA Duck DK3");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4,     sample_fmts_s16,  adpcm_ima_dk4,     "ADPCM IMA Duck DK4");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_EACS, sample_fmts_s16,  adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_SEAD, sample_fmts_s16,  adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ISS,     sample_fmts_s16,  adpcm_ima_iss,     "ADPCM IMA Funcom ISS");
1840
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_OKI,     sample_fmts_s16,  adpcm_ima_oki,     "ADPCM IMA Dialogic OKI");
1841
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT,      sample_fmts_s16p, adpcm_ima_qt,      "ADPCM IMA QuickTime");
James Almer's avatar
James Almer committed
1842
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_RAD,     sample_fmts_s16,  adpcm_ima_rad,     "ADPCM IMA Radical");
1843
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG,  sample_fmts_s16,  adpcm_ima_smjpeg,  "ADPCM IMA Loki SDL MJPEG");
1844
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV,     sample_fmts_s16p, adpcm_ima_wav,     "ADPCM IMA WAV");
1845
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS,      sample_fmts_both, adpcm_ima_ws,      "ADPCM IMA Westwood");
1846
ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS,          sample_fmts_both, adpcm_ms,          "ADPCM Microsoft");
1847
ADPCM_DECODER(AV_CODEC_ID_ADPCM_MTAF,        sample_fmts_s16p, adpcm_mtaf,        "ADPCM MTAF");
1848
ADPCM_DECODER(AV_CODEC_ID_ADPCM_PSX,         sample_fmts_s16p, adpcm_psx,         "ADPCM Playstation");
1849 1850 1851 1852
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_2,     sample_fmts_s16,  adpcm_sbpro_2,     "ADPCM Sound Blaster Pro 2-bit");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_3,     sample_fmts_s16,  adpcm_sbpro_3,     "ADPCM Sound Blaster Pro 2.6-bit");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_4,     sample_fmts_s16,  adpcm_sbpro_4,     "ADPCM Sound Blaster Pro 4-bit");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SWF,         sample_fmts_s16,  adpcm_swf,         "ADPCM Shockwave Flash");
1853 1854
ADPCM_DECODER(AV_CODEC_ID_ADPCM_THP_LE,      sample_fmts_s16p, adpcm_thp_le,      "ADPCM Nintendo THP (little-endian)");
ADPCM_DECODER(AV_CODEC_ID_ADPCM_THP,         sample_fmts_s16p, adpcm_thp,         "ADPCM Nintendo THP");
1855
ADPCM_DECODER(AV_CODEC_ID_ADPCM_XA,          sample_fmts_s16p, adpcm_xa,          "ADPCM CDROM XA");
1856
ADPCM_DECODER(AV_CODEC_ID_ADPCM_YAMAHA,      sample_fmts_s16,  adpcm_yamaha,      "ADPCM Yamaha");