annotate ffmpeg/libavcodec/adpcm.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (c) 2001-2003 The ffmpeg Project
yading@10 3 *
yading@10 4 * first version by Francois Revol (revol@free.fr)
yading@10 5 * fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
yading@10 6 * by Mike Melanson (melanson@pcisys.net)
yading@10 7 * CD-ROM XA ADPCM codec by BERO
yading@10 8 * EA ADPCM decoder by Robin Kay (komadori@myrealbox.com)
yading@10 9 * EA ADPCM R1/R2/R3 decoder by Peter Ross (pross@xvid.org)
yading@10 10 * EA IMA EACS decoder by Peter Ross (pross@xvid.org)
yading@10 11 * EA IMA SEAD decoder by Peter Ross (pross@xvid.org)
yading@10 12 * EA ADPCM XAS decoder by Peter Ross (pross@xvid.org)
yading@10 13 * MAXIS EA ADPCM decoder by Robert Marston (rmarston@gmail.com)
yading@10 14 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
yading@10 15 *
yading@10 16 * This file is part of FFmpeg.
yading@10 17 *
yading@10 18 * FFmpeg is free software; you can redistribute it and/or
yading@10 19 * modify it under the terms of the GNU Lesser General Public
yading@10 20 * License as published by the Free Software Foundation; either
yading@10 21 * version 2.1 of the License, or (at your option) any later version.
yading@10 22 *
yading@10 23 * FFmpeg is distributed in the hope that it will be useful,
yading@10 24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 26 * Lesser General Public License for more details.
yading@10 27 *
yading@10 28 * You should have received a copy of the GNU Lesser General Public
yading@10 29 * License along with FFmpeg; if not, write to the Free Software
yading@10 30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 31 */
yading@10 32 #include "avcodec.h"
yading@10 33 #include "get_bits.h"
yading@10 34 #include "put_bits.h"
yading@10 35 #include "bytestream.h"
yading@10 36 #include "adpcm.h"
yading@10 37 #include "adpcm_data.h"
yading@10 38 #include "internal.h"
yading@10 39
yading@10 40 /**
yading@10 41 * @file
yading@10 42 * ADPCM decoders
yading@10 43 * Features and limitations:
yading@10 44 *
yading@10 45 * Reference documents:
yading@10 46 * http://wiki.multimedia.cx/index.php?title=Category:ADPCM_Audio_Codecs
yading@10 47 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html [dead]
yading@10 48 * http://www.geocities.com/SiliconValley/8682/aud3.txt [dead]
yading@10 49 * http://openquicktime.sourceforge.net/
yading@10 50 * XAnim sources (xa_codec.c) http://xanim.polter.net/
yading@10 51 * http://www.cs.ucla.edu/~leec/mediabench/applications.html [dead]
yading@10 52 * SoX source code http://sox.sourceforge.net/
yading@10 53 *
yading@10 54 * CD-ROM XA:
yading@10 55 * http://ku-www.ss.titech.ac.jp/~yatsushi/xaadpcm.html [dead]
yading@10 56 * vagpack & depack http://homepages.compuserve.de/bITmASTER32/psx-index.html [dead]
yading@10 57 * readstr http://www.geocities.co.jp/Playtown/2004/
yading@10 58 */
yading@10 59
yading@10 60 /* These are for CD-ROM XA ADPCM */
yading@10 61 static const int xa_adpcm_table[5][2] = {
yading@10 62 { 0, 0 },
yading@10 63 { 60, 0 },
yading@10 64 { 115, -52 },
yading@10 65 { 98, -55 },
yading@10 66 { 122, -60 }
yading@10 67 };
yading@10 68
yading@10 69 static const int ea_adpcm_table[] = {
yading@10 70 0, 240, 460, 392,
yading@10 71 0, 0, -208, -220,
yading@10 72 0, 1, 3, 4,
yading@10 73 7, 8, 10, 11,
yading@10 74 0, -1, -3, -4
yading@10 75 };
yading@10 76
yading@10 77 // padded to zero where table size is less then 16
yading@10 78 static const int swf_index_tables[4][16] = {
yading@10 79 /*2*/ { -1, 2 },
yading@10 80 /*3*/ { -1, -1, 2, 4 },
yading@10 81 /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
yading@10 82 /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
yading@10 83 };
yading@10 84
yading@10 85 /* end of tables */
yading@10 86
yading@10 87 typedef struct ADPCMDecodeContext {
yading@10 88 ADPCMChannelStatus status[6];
yading@10 89 int vqa_version; /**< VQA version. Used for ADPCM_IMA_WS */
yading@10 90 } ADPCMDecodeContext;
yading@10 91
yading@10 92 static av_cold int adpcm_decode_init(AVCodecContext * avctx)
yading@10 93 {
yading@10 94 ADPCMDecodeContext *c = avctx->priv_data;
yading@10 95 unsigned int min_channels = 1;
yading@10 96 unsigned int max_channels = 2;
yading@10 97
yading@10 98 switch(avctx->codec->id) {
yading@10 99 case AV_CODEC_ID_ADPCM_EA:
yading@10 100 min_channels = 2;
yading@10 101 break;
yading@10 102 case AV_CODEC_ID_ADPCM_AFC:
yading@10 103 case AV_CODEC_ID_ADPCM_EA_R1:
yading@10 104 case AV_CODEC_ID_ADPCM_EA_R2:
yading@10 105 case AV_CODEC_ID_ADPCM_EA_R3:
yading@10 106 case AV_CODEC_ID_ADPCM_EA_XAS:
yading@10 107 case AV_CODEC_ID_ADPCM_THP:
yading@10 108 max_channels = 6;
yading@10 109 break;
yading@10 110 }
yading@10 111 if (avctx->channels < min_channels || avctx->channels > max_channels) {
yading@10 112 av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
yading@10 113 return AVERROR(EINVAL);
yading@10 114 }
yading@10 115
yading@10 116 switch(avctx->codec->id) {
yading@10 117 case AV_CODEC_ID_ADPCM_CT:
yading@10 118 c->status[0].step = c->status[1].step = 511;
yading@10 119 break;
yading@10 120 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 121 if (avctx->bits_per_coded_sample != 4) {
yading@10 122 av_log(avctx, AV_LOG_ERROR, "Only 4-bit ADPCM IMA WAV files are supported\n");
yading@10 123 return -1;
yading@10 124 }
yading@10 125 break;
yading@10 126 case AV_CODEC_ID_ADPCM_IMA_APC:
yading@10 127 if (avctx->extradata && avctx->extradata_size >= 8) {
yading@10 128 c->status[0].predictor = AV_RL32(avctx->extradata);
yading@10 129 c->status[1].predictor = AV_RL32(avctx->extradata + 4);
yading@10 130 }
yading@10 131 break;
yading@10 132 case AV_CODEC_ID_ADPCM_IMA_WS:
yading@10 133 if (avctx->extradata && avctx->extradata_size >= 2)
yading@10 134 c->vqa_version = AV_RL16(avctx->extradata);
yading@10 135 break;
yading@10 136 default:
yading@10 137 break;
yading@10 138 }
yading@10 139
yading@10 140 switch(avctx->codec->id) {
yading@10 141 case AV_CODEC_ID_ADPCM_IMA_QT:
yading@10 142 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 143 case AV_CODEC_ID_ADPCM_4XM:
yading@10 144 case AV_CODEC_ID_ADPCM_XA:
yading@10 145 case AV_CODEC_ID_ADPCM_EA_R1:
yading@10 146 case AV_CODEC_ID_ADPCM_EA_R2:
yading@10 147 case AV_CODEC_ID_ADPCM_EA_R3:
yading@10 148 case AV_CODEC_ID_ADPCM_EA_XAS:
yading@10 149 case AV_CODEC_ID_ADPCM_THP:
yading@10 150 case AV_CODEC_ID_ADPCM_AFC:
yading@10 151 avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
yading@10 152 break;
yading@10 153 case AV_CODEC_ID_ADPCM_IMA_WS:
yading@10 154 avctx->sample_fmt = c->vqa_version == 3 ? AV_SAMPLE_FMT_S16P :
yading@10 155 AV_SAMPLE_FMT_S16;
yading@10 156 break;
yading@10 157 default:
yading@10 158 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
yading@10 159 }
yading@10 160
yading@10 161 return 0;
yading@10 162 }
yading@10 163
yading@10 164 static inline short adpcm_ima_expand_nibble(ADPCMChannelStatus *c, char nibble, int shift)
yading@10 165 {
yading@10 166 int step_index;
yading@10 167 int predictor;
yading@10 168 int sign, delta, diff, step;
yading@10 169
yading@10 170 step = ff_adpcm_step_table[c->step_index];
yading@10 171 step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
yading@10 172 step_index = av_clip(step_index, 0, 88);
yading@10 173
yading@10 174 sign = nibble & 8;
yading@10 175 delta = nibble & 7;
yading@10 176 /* perform direct multiplication instead of series of jumps proposed by
yading@10 177 * the reference ADPCM implementation since modern CPUs can do the mults
yading@10 178 * quickly enough */
yading@10 179 diff = ((2 * delta + 1) * step) >> shift;
yading@10 180 predictor = c->predictor;
yading@10 181 if (sign) predictor -= diff;
yading@10 182 else predictor += diff;
yading@10 183
yading@10 184 c->predictor = av_clip_int16(predictor);
yading@10 185 c->step_index = step_index;
yading@10 186
yading@10 187 return (short)c->predictor;
yading@10 188 }
yading@10 189
yading@10 190 static inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble, int shift)
yading@10 191 {
yading@10 192 int step_index;
yading@10 193 int predictor;
yading@10 194 int diff, step;
yading@10 195
yading@10 196 step = ff_adpcm_step_table[c->step_index];
yading@10 197 step_index = c->step_index + ff_adpcm_index_table[nibble];
yading@10 198 step_index = av_clip(step_index, 0, 88);
yading@10 199
yading@10 200 diff = step >> 3;
yading@10 201 if (nibble & 4) diff += step;
yading@10 202 if (nibble & 2) diff += step >> 1;
yading@10 203 if (nibble & 1) diff += step >> 2;
yading@10 204
yading@10 205 if (nibble & 8)
yading@10 206 predictor = c->predictor - diff;
yading@10 207 else
yading@10 208 predictor = c->predictor + diff;
yading@10 209
yading@10 210 c->predictor = av_clip_int16(predictor);
yading@10 211 c->step_index = step_index;
yading@10 212
yading@10 213 return c->predictor;
yading@10 214 }
yading@10 215
yading@10 216 static inline short adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
yading@10 217 {
yading@10 218 int predictor;
yading@10 219
yading@10 220 predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64;
yading@10 221 predictor += ((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
yading@10 222
yading@10 223 c->sample2 = c->sample1;
yading@10 224 c->sample1 = av_clip_int16(predictor);
yading@10 225 c->idelta = (ff_adpcm_AdaptationTable[(int)nibble] * c->idelta) >> 8;
yading@10 226 if (c->idelta < 16) c->idelta = 16;
yading@10 227
yading@10 228 return c->sample1;
yading@10 229 }
yading@10 230
yading@10 231 static inline short adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nibble)
yading@10 232 {
yading@10 233 int step_index, predictor, sign, delta, diff, step;
yading@10 234
yading@10 235 step = ff_adpcm_oki_step_table[c->step_index];
yading@10 236 step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
yading@10 237 step_index = av_clip(step_index, 0, 48);
yading@10 238
yading@10 239 sign = nibble & 8;
yading@10 240 delta = nibble & 7;
yading@10 241 diff = ((2 * delta + 1) * step) >> 3;
yading@10 242 predictor = c->predictor;
yading@10 243 if (sign) predictor -= diff;
yading@10 244 else predictor += diff;
yading@10 245
yading@10 246 c->predictor = av_clip(predictor, -2048, 2047);
yading@10 247 c->step_index = step_index;
yading@10 248
yading@10 249 return c->predictor << 4;
yading@10 250 }
yading@10 251
yading@10 252 static inline short adpcm_ct_expand_nibble(ADPCMChannelStatus *c, char nibble)
yading@10 253 {
yading@10 254 int sign, delta, diff;
yading@10 255 int new_step;
yading@10 256
yading@10 257 sign = nibble & 8;
yading@10 258 delta = nibble & 7;
yading@10 259 /* perform direct multiplication instead of series of jumps proposed by
yading@10 260 * the reference ADPCM implementation since modern CPUs can do the mults
yading@10 261 * quickly enough */
yading@10 262 diff = ((2 * delta + 1) * c->step) >> 3;
yading@10 263 /* predictor update is not so trivial: predictor is multiplied on 254/256 before updating */
yading@10 264 c->predictor = ((c->predictor * 254) >> 8) + (sign ? -diff : diff);
yading@10 265 c->predictor = av_clip_int16(c->predictor);
yading@10 266 /* calculate new step and clamp it to range 511..32767 */
yading@10 267 new_step = (ff_adpcm_AdaptationTable[nibble & 7] * c->step) >> 8;
yading@10 268 c->step = av_clip(new_step, 511, 32767);
yading@10 269
yading@10 270 return (short)c->predictor;
yading@10 271 }
yading@10 272
yading@10 273 static inline short adpcm_sbpro_expand_nibble(ADPCMChannelStatus *c, char nibble, int size, int shift)
yading@10 274 {
yading@10 275 int sign, delta, diff;
yading@10 276
yading@10 277 sign = nibble & (1<<(size-1));
yading@10 278 delta = nibble & ((1<<(size-1))-1);
yading@10 279 diff = delta << (7 + c->step + shift);
yading@10 280
yading@10 281 /* clamp result */
yading@10 282 c->predictor = av_clip(c->predictor + (sign ? -diff : diff), -16384,16256);
yading@10 283
yading@10 284 /* calculate new step */
yading@10 285 if (delta >= (2*size - 3) && c->step < 3)
yading@10 286 c->step++;
yading@10 287 else if (delta == 0 && c->step > 0)
yading@10 288 c->step--;
yading@10 289
yading@10 290 return (short) c->predictor;
yading@10 291 }
yading@10 292
yading@10 293 static inline short adpcm_yamaha_expand_nibble(ADPCMChannelStatus *c, unsigned char nibble)
yading@10 294 {
yading@10 295 if(!c->step) {
yading@10 296 c->predictor = 0;
yading@10 297 c->step = 127;
yading@10 298 }
yading@10 299
yading@10 300 c->predictor += (c->step * ff_adpcm_yamaha_difflookup[nibble]) / 8;
yading@10 301 c->predictor = av_clip_int16(c->predictor);
yading@10 302 c->step = (c->step * ff_adpcm_yamaha_indexscale[nibble]) >> 8;
yading@10 303 c->step = av_clip(c->step, 127, 24567);
yading@10 304 return c->predictor;
yading@10 305 }
yading@10 306
yading@10 307 static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
yading@10 308 const uint8_t *in, ADPCMChannelStatus *left,
yading@10 309 ADPCMChannelStatus *right, int channels, int sample_offset)
yading@10 310 {
yading@10 311 int i, j;
yading@10 312 int shift,filter,f0,f1;
yading@10 313 int s_1,s_2;
yading@10 314 int d,s,t;
yading@10 315
yading@10 316 out0 += sample_offset;
yading@10 317 if (channels == 1)
yading@10 318 out1 = out0 + 28;
yading@10 319 else
yading@10 320 out1 += sample_offset;
yading@10 321
yading@10 322 for(i=0;i<4;i++) {
yading@10 323 shift = 12 - (in[4+i*2] & 15);
yading@10 324 filter = in[4+i*2] >> 4;
yading@10 325 if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
yading@10 326 avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
yading@10 327 filter=0;
yading@10 328 }
yading@10 329 f0 = xa_adpcm_table[filter][0];
yading@10 330 f1 = xa_adpcm_table[filter][1];
yading@10 331
yading@10 332 s_1 = left->sample1;
yading@10 333 s_2 = left->sample2;
yading@10 334
yading@10 335 for(j=0;j<28;j++) {
yading@10 336 d = in[16+i+j*4];
yading@10 337
yading@10 338 t = sign_extend(d, 4);
yading@10 339 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
yading@10 340 s_2 = s_1;
yading@10 341 s_1 = av_clip_int16(s);
yading@10 342 out0[j] = s_1;
yading@10 343 }
yading@10 344
yading@10 345 if (channels == 2) {
yading@10 346 left->sample1 = s_1;
yading@10 347 left->sample2 = s_2;
yading@10 348 s_1 = right->sample1;
yading@10 349 s_2 = right->sample2;
yading@10 350 }
yading@10 351
yading@10 352 shift = 12 - (in[5+i*2] & 15);
yading@10 353 filter = in[5+i*2] >> 4;
yading@10 354 if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
yading@10 355 avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
yading@10 356 filter=0;
yading@10 357 }
yading@10 358
yading@10 359 f0 = xa_adpcm_table[filter][0];
yading@10 360 f1 = xa_adpcm_table[filter][1];
yading@10 361
yading@10 362 for(j=0;j<28;j++) {
yading@10 363 d = in[16+i+j*4];
yading@10 364
yading@10 365 t = sign_extend(d >> 4, 4);
yading@10 366 s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
yading@10 367 s_2 = s_1;
yading@10 368 s_1 = av_clip_int16(s);
yading@10 369 out1[j] = s_1;
yading@10 370 }
yading@10 371
yading@10 372 if (channels == 2) {
yading@10 373 right->sample1 = s_1;
yading@10 374 right->sample2 = s_2;
yading@10 375 } else {
yading@10 376 left->sample1 = s_1;
yading@10 377 left->sample2 = s_2;
yading@10 378 }
yading@10 379
yading@10 380 out0 += 28 * (3 - channels);
yading@10 381 out1 += 28 * (3 - channels);
yading@10 382 }
yading@10 383
yading@10 384 return 0;
yading@10 385 }
yading@10 386
yading@10 387 static void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_size, int16_t *samples)
yading@10 388 {
yading@10 389 ADPCMDecodeContext *c = avctx->priv_data;
yading@10 390 GetBitContext gb;
yading@10 391 const int *table;
yading@10 392 int k0, signmask, nb_bits, count;
yading@10 393 int size = buf_size*8;
yading@10 394 int i;
yading@10 395
yading@10 396 init_get_bits(&gb, buf, size);
yading@10 397
yading@10 398 //read bits & initial values
yading@10 399 nb_bits = get_bits(&gb, 2)+2;
yading@10 400 table = swf_index_tables[nb_bits-2];
yading@10 401 k0 = 1 << (nb_bits-2);
yading@10 402 signmask = 1 << (nb_bits-1);
yading@10 403
yading@10 404 while (get_bits_count(&gb) <= size - 22*avctx->channels) {
yading@10 405 for (i = 0; i < avctx->channels; i++) {
yading@10 406 *samples++ = c->status[i].predictor = get_sbits(&gb, 16);
yading@10 407 c->status[i].step_index = get_bits(&gb, 6);
yading@10 408 }
yading@10 409
yading@10 410 for (count = 0; get_bits_count(&gb) <= size - nb_bits*avctx->channels && count < 4095; count++) {
yading@10 411 int i;
yading@10 412
yading@10 413 for (i = 0; i < avctx->channels; i++) {
yading@10 414 // similar to IMA adpcm
yading@10 415 int delta = get_bits(&gb, nb_bits);
yading@10 416 int step = ff_adpcm_step_table[c->status[i].step_index];
yading@10 417 long vpdiff = 0; // vpdiff = (delta+0.5)*step/4
yading@10 418 int k = k0;
yading@10 419
yading@10 420 do {
yading@10 421 if (delta & k)
yading@10 422 vpdiff += step;
yading@10 423 step >>= 1;
yading@10 424 k >>= 1;
yading@10 425 } while(k);
yading@10 426 vpdiff += step;
yading@10 427
yading@10 428 if (delta & signmask)
yading@10 429 c->status[i].predictor -= vpdiff;
yading@10 430 else
yading@10 431 c->status[i].predictor += vpdiff;
yading@10 432
yading@10 433 c->status[i].step_index += table[delta & (~signmask)];
yading@10 434
yading@10 435 c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88);
yading@10 436 c->status[i].predictor = av_clip_int16(c->status[i].predictor);
yading@10 437
yading@10 438 *samples++ = c->status[i].predictor;
yading@10 439 }
yading@10 440 }
yading@10 441 }
yading@10 442 }
yading@10 443
yading@10 444 /**
yading@10 445 * Get the number of samples that will be decoded from the packet.
yading@10 446 * In one case, this is actually the maximum number of samples possible to
yading@10 447 * decode with the given buf_size.
yading@10 448 *
yading@10 449 * @param[out] coded_samples set to the number of samples as coded in the
yading@10 450 * packet, or 0 if the codec does not encode the
yading@10 451 * number of samples in each frame.
yading@10 452 */
yading@10 453 static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
yading@10 454 int buf_size, int *coded_samples)
yading@10 455 {
yading@10 456 ADPCMDecodeContext *s = avctx->priv_data;
yading@10 457 int nb_samples = 0;
yading@10 458 int ch = avctx->channels;
yading@10 459 int has_coded_samples = 0;
yading@10 460 int header_size;
yading@10 461
yading@10 462 *coded_samples = 0;
yading@10 463
yading@10 464 if(ch <= 0)
yading@10 465 return 0;
yading@10 466
yading@10 467 switch (avctx->codec->id) {
yading@10 468 /* constant, only check buf_size */
yading@10 469 case AV_CODEC_ID_ADPCM_EA_XAS:
yading@10 470 if (buf_size < 76 * ch)
yading@10 471 return 0;
yading@10 472 nb_samples = 128;
yading@10 473 break;
yading@10 474 case AV_CODEC_ID_ADPCM_IMA_QT:
yading@10 475 if (buf_size < 34 * ch)
yading@10 476 return 0;
yading@10 477 nb_samples = 64;
yading@10 478 break;
yading@10 479 /* simple 4-bit adpcm */
yading@10 480 case AV_CODEC_ID_ADPCM_CT:
yading@10 481 case AV_CODEC_ID_ADPCM_IMA_APC:
yading@10 482 case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
yading@10 483 case AV_CODEC_ID_ADPCM_IMA_OKI:
yading@10 484 case AV_CODEC_ID_ADPCM_IMA_WS:
yading@10 485 case AV_CODEC_ID_ADPCM_YAMAHA:
yading@10 486 nb_samples = buf_size * 2 / ch;
yading@10 487 break;
yading@10 488 }
yading@10 489 if (nb_samples)
yading@10 490 return nb_samples;
yading@10 491
yading@10 492 /* simple 4-bit adpcm, with header */
yading@10 493 header_size = 0;
yading@10 494 switch (avctx->codec->id) {
yading@10 495 case AV_CODEC_ID_ADPCM_4XM:
yading@10 496 case AV_CODEC_ID_ADPCM_IMA_ISS: header_size = 4 * ch; break;
yading@10 497 case AV_CODEC_ID_ADPCM_IMA_AMV: header_size = 8; break;
yading@10 498 case AV_CODEC_ID_ADPCM_IMA_SMJPEG: header_size = 4 * ch; break;
yading@10 499 }
yading@10 500 if (header_size > 0)
yading@10 501 return (buf_size - header_size) * 2 / ch;
yading@10 502
yading@10 503 /* more complex formats */
yading@10 504 switch (avctx->codec->id) {
yading@10 505 case AV_CODEC_ID_ADPCM_EA:
yading@10 506 has_coded_samples = 1;
yading@10 507 *coded_samples = bytestream2_get_le32(gb);
yading@10 508 *coded_samples -= *coded_samples % 28;
yading@10 509 nb_samples = (buf_size - 12) / 30 * 28;
yading@10 510 break;
yading@10 511 case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
yading@10 512 has_coded_samples = 1;
yading@10 513 *coded_samples = bytestream2_get_le32(gb);
yading@10 514 nb_samples = (buf_size - (4 + 8 * ch)) * 2 / ch;
yading@10 515 break;
yading@10 516 case AV_CODEC_ID_ADPCM_EA_MAXIS_XA:
yading@10 517 nb_samples = (buf_size - ch) / ch * 2;
yading@10 518 break;
yading@10 519 case AV_CODEC_ID_ADPCM_EA_R1:
yading@10 520 case AV_CODEC_ID_ADPCM_EA_R2:
yading@10 521 case AV_CODEC_ID_ADPCM_EA_R3:
yading@10 522 /* maximum number of samples */
yading@10 523 /* has internal offsets and a per-frame switch to signal raw 16-bit */
yading@10 524 has_coded_samples = 1;
yading@10 525 switch (avctx->codec->id) {
yading@10 526 case AV_CODEC_ID_ADPCM_EA_R1:
yading@10 527 header_size = 4 + 9 * ch;
yading@10 528 *coded_samples = bytestream2_get_le32(gb);
yading@10 529 break;
yading@10 530 case AV_CODEC_ID_ADPCM_EA_R2:
yading@10 531 header_size = 4 + 5 * ch;
yading@10 532 *coded_samples = bytestream2_get_le32(gb);
yading@10 533 break;
yading@10 534 case AV_CODEC_ID_ADPCM_EA_R3:
yading@10 535 header_size = 4 + 5 * ch;
yading@10 536 *coded_samples = bytestream2_get_be32(gb);
yading@10 537 break;
yading@10 538 }
yading@10 539 *coded_samples -= *coded_samples % 28;
yading@10 540 nb_samples = (buf_size - header_size) * 2 / ch;
yading@10 541 nb_samples -= nb_samples % 28;
yading@10 542 break;
yading@10 543 case AV_CODEC_ID_ADPCM_IMA_DK3:
yading@10 544 if (avctx->block_align > 0)
yading@10 545 buf_size = FFMIN(buf_size, avctx->block_align);
yading@10 546 nb_samples = ((buf_size - 16) * 2 / 3 * 4) / ch;
yading@10 547 break;
yading@10 548 case AV_CODEC_ID_ADPCM_IMA_DK4:
yading@10 549 if (avctx->block_align > 0)
yading@10 550 buf_size = FFMIN(buf_size, avctx->block_align);
yading@10 551 nb_samples = 1 + (buf_size - 4 * ch) * 2 / ch;
yading@10 552 break;
yading@10 553 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 554 if (avctx->block_align > 0)
yading@10 555 buf_size = FFMIN(buf_size, avctx->block_align);
yading@10 556 nb_samples = 1 + (buf_size - 4 * ch) / (4 * ch) * 8;
yading@10 557 break;
yading@10 558 case AV_CODEC_ID_ADPCM_MS:
yading@10 559 if (avctx->block_align > 0)
yading@10 560 buf_size = FFMIN(buf_size, avctx->block_align);
yading@10 561 nb_samples = 2 + (buf_size - 7 * ch) * 2 / ch;
yading@10 562 break;
yading@10 563 case AV_CODEC_ID_ADPCM_SBPRO_2:
yading@10 564 case AV_CODEC_ID_ADPCM_SBPRO_3:
yading@10 565 case AV_CODEC_ID_ADPCM_SBPRO_4:
yading@10 566 {
yading@10 567 int samples_per_byte;
yading@10 568 switch (avctx->codec->id) {
yading@10 569 case AV_CODEC_ID_ADPCM_SBPRO_2: samples_per_byte = 4; break;
yading@10 570 case AV_CODEC_ID_ADPCM_SBPRO_3: samples_per_byte = 3; break;
yading@10 571 case AV_CODEC_ID_ADPCM_SBPRO_4: samples_per_byte = 2; break;
yading@10 572 }
yading@10 573 if (!s->status[0].step_index) {
yading@10 574 nb_samples++;
yading@10 575 buf_size -= ch;
yading@10 576 }
yading@10 577 nb_samples += buf_size * samples_per_byte / ch;
yading@10 578 break;
yading@10 579 }
yading@10 580 case AV_CODEC_ID_ADPCM_SWF:
yading@10 581 {
yading@10 582 int buf_bits = buf_size * 8 - 2;
yading@10 583 int nbits = (bytestream2_get_byte(gb) >> 6) + 2;
yading@10 584 int block_hdr_size = 22 * ch;
yading@10 585 int block_size = block_hdr_size + nbits * ch * 4095;
yading@10 586 int nblocks = buf_bits / block_size;
yading@10 587 int bits_left = buf_bits - nblocks * block_size;
yading@10 588 nb_samples = nblocks * 4096;
yading@10 589 if (bits_left >= block_hdr_size)
yading@10 590 nb_samples += 1 + (bits_left - block_hdr_size) / (nbits * ch);
yading@10 591 break;
yading@10 592 }
yading@10 593 case AV_CODEC_ID_ADPCM_THP:
yading@10 594 has_coded_samples = 1;
yading@10 595 bytestream2_skip(gb, 4); // channel size
yading@10 596 *coded_samples = bytestream2_get_be32(gb);
yading@10 597 *coded_samples -= *coded_samples % 14;
yading@10 598 nb_samples = (buf_size - (8 + 36 * ch)) / (8 * ch) * 14;
yading@10 599 break;
yading@10 600 case AV_CODEC_ID_ADPCM_AFC:
yading@10 601 nb_samples = buf_size / (9 * ch) * 16;
yading@10 602 break;
yading@10 603 case AV_CODEC_ID_ADPCM_XA:
yading@10 604 nb_samples = (buf_size / 128) * 224 / ch;
yading@10 605 break;
yading@10 606 }
yading@10 607
yading@10 608 /* validate coded sample count */
yading@10 609 if (has_coded_samples && (*coded_samples <= 0 || *coded_samples > nb_samples))
yading@10 610 return AVERROR_INVALIDDATA;
yading@10 611
yading@10 612 return nb_samples;
yading@10 613 }
yading@10 614
yading@10 615 static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
yading@10 616 int *got_frame_ptr, AVPacket *avpkt)
yading@10 617 {
yading@10 618 AVFrame *frame = data;
yading@10 619 const uint8_t *buf = avpkt->data;
yading@10 620 int buf_size = avpkt->size;
yading@10 621 ADPCMDecodeContext *c = avctx->priv_data;
yading@10 622 ADPCMChannelStatus *cs;
yading@10 623 int n, m, channel, i;
yading@10 624 short *samples;
yading@10 625 int16_t **samples_p;
yading@10 626 int st; /* stereo */
yading@10 627 int count1, count2;
yading@10 628 int nb_samples, coded_samples, ret;
yading@10 629 GetByteContext gb;
yading@10 630
yading@10 631 bytestream2_init(&gb, buf, buf_size);
yading@10 632 nb_samples = get_nb_samples(avctx, &gb, buf_size, &coded_samples);
yading@10 633 if (nb_samples <= 0) {
yading@10 634 av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
yading@10 635 return AVERROR_INVALIDDATA;
yading@10 636 }
yading@10 637
yading@10 638 /* get output buffer */
yading@10 639 frame->nb_samples = nb_samples;
yading@10 640 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
yading@10 641 return ret;
yading@10 642 samples = (short *)frame->data[0];
yading@10 643 samples_p = (int16_t **)frame->extended_data;
yading@10 644
yading@10 645 /* use coded_samples when applicable */
yading@10 646 /* it is always <= nb_samples, so the output buffer will be large enough */
yading@10 647 if (coded_samples) {
yading@10 648 if (coded_samples != nb_samples)
yading@10 649 av_log(avctx, AV_LOG_WARNING, "mismatch in coded sample count\n");
yading@10 650 frame->nb_samples = nb_samples = coded_samples;
yading@10 651 }
yading@10 652
yading@10 653 st = avctx->channels == 2 ? 1 : 0;
yading@10 654
yading@10 655 switch(avctx->codec->id) {
yading@10 656 case AV_CODEC_ID_ADPCM_IMA_QT:
yading@10 657 /* In QuickTime, IMA is encoded by chunks of 34 bytes (=64 samples).
yading@10 658 Channel data is interleaved per-chunk. */
yading@10 659 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 660 int predictor;
yading@10 661 int step_index;
yading@10 662 cs = &(c->status[channel]);
yading@10 663 /* (pppppp) (piiiiiii) */
yading@10 664
yading@10 665 /* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
yading@10 666 predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
yading@10 667 step_index = predictor & 0x7F;
yading@10 668 predictor &= ~0x7F;
yading@10 669
yading@10 670 if (cs->step_index == step_index) {
yading@10 671 int diff = predictor - cs->predictor;
yading@10 672 if (diff < 0)
yading@10 673 diff = - diff;
yading@10 674 if (diff > 0x7f)
yading@10 675 goto update;
yading@10 676 } else {
yading@10 677 update:
yading@10 678 cs->step_index = step_index;
yading@10 679 cs->predictor = predictor;
yading@10 680 }
yading@10 681
yading@10 682 if (cs->step_index > 88u){
yading@10 683 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 684 channel, cs->step_index);
yading@10 685 return AVERROR_INVALIDDATA;
yading@10 686 }
yading@10 687
yading@10 688 samples = samples_p[channel];
yading@10 689
yading@10 690 for (m = 0; m < 64; m += 2) {
yading@10 691 int byte = bytestream2_get_byteu(&gb);
yading@10 692 samples[m ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F, 3);
yading@10 693 samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4 , 3);
yading@10 694 }
yading@10 695 }
yading@10 696 break;
yading@10 697 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 698 for(i=0; i<avctx->channels; i++){
yading@10 699 cs = &(c->status[i]);
yading@10 700 cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 701
yading@10 702 cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 703 if (cs->step_index > 88u){
yading@10 704 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 705 i, cs->step_index);
yading@10 706 return AVERROR_INVALIDDATA;
yading@10 707 }
yading@10 708 }
yading@10 709
yading@10 710 for (n = 0; n < (nb_samples - 1) / 8; n++) {
yading@10 711 for (i = 0; i < avctx->channels; i++) {
yading@10 712 cs = &c->status[i];
yading@10 713 samples = &samples_p[i][1 + n * 8];
yading@10 714 for (m = 0; m < 8; m += 2) {
yading@10 715 int v = bytestream2_get_byteu(&gb);
yading@10 716 samples[m ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
yading@10 717 samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
yading@10 718 }
yading@10 719 }
yading@10 720 }
yading@10 721 break;
yading@10 722 case AV_CODEC_ID_ADPCM_4XM:
yading@10 723 for (i = 0; i < avctx->channels; i++)
yading@10 724 c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 725
yading@10 726 for (i = 0; i < avctx->channels; i++) {
yading@10 727 c->status[i].step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 728 if (c->status[i].step_index > 88u) {
yading@10 729 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 730 i, c->status[i].step_index);
yading@10 731 return AVERROR_INVALIDDATA;
yading@10 732 }
yading@10 733 }
yading@10 734
yading@10 735 for (i = 0; i < avctx->channels; i++) {
yading@10 736 samples = (int16_t *)frame->data[i];
yading@10 737 cs = &c->status[i];
yading@10 738 for (n = nb_samples >> 1; n > 0; n--) {
yading@10 739 int v = bytestream2_get_byteu(&gb);
yading@10 740 *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
yading@10 741 *samples++ = adpcm_ima_expand_nibble(cs, v >> 4 , 4);
yading@10 742 }
yading@10 743 }
yading@10 744 break;
yading@10 745 case AV_CODEC_ID_ADPCM_MS:
yading@10 746 {
yading@10 747 int block_predictor;
yading@10 748
yading@10 749 block_predictor = bytestream2_get_byteu(&gb);
yading@10 750 if (block_predictor > 6) {
yading@10 751 av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
yading@10 752 block_predictor);
yading@10 753 return AVERROR_INVALIDDATA;
yading@10 754 }
yading@10 755 c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
yading@10 756 c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
yading@10 757 if (st) {
yading@10 758 block_predictor = bytestream2_get_byteu(&gb);
yading@10 759 if (block_predictor > 6) {
yading@10 760 av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
yading@10 761 block_predictor);
yading@10 762 return AVERROR_INVALIDDATA;
yading@10 763 }
yading@10 764 c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
yading@10 765 c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
yading@10 766 }
yading@10 767 c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 768 if (st){
yading@10 769 c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 770 }
yading@10 771
yading@10 772 c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 773 if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 774 c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 775 if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 776
yading@10 777 *samples++ = c->status[0].sample2;
yading@10 778 if (st) *samples++ = c->status[1].sample2;
yading@10 779 *samples++ = c->status[0].sample1;
yading@10 780 if (st) *samples++ = c->status[1].sample1;
yading@10 781 for(n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
yading@10 782 int byte = bytestream2_get_byteu(&gb);
yading@10 783 *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4 );
yading@10 784 *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
yading@10 785 }
yading@10 786 break;
yading@10 787 }
yading@10 788 case AV_CODEC_ID_ADPCM_IMA_DK4:
yading@10 789 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 790 cs = &c->status[channel];
yading@10 791 cs->predictor = *samples++ = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 792 cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 793 if (cs->step_index > 88u){
yading@10 794 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 795 channel, cs->step_index);
yading@10 796 return AVERROR_INVALIDDATA;
yading@10 797 }
yading@10 798 }
yading@10 799 for (n = (nb_samples - 1) >> (1 - st); n > 0; n--) {
yading@10 800 int v = bytestream2_get_byteu(&gb);
yading@10 801 *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4 , 3);
yading@10 802 *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
yading@10 803 }
yading@10 804 break;
yading@10 805 case AV_CODEC_ID_ADPCM_IMA_DK3:
yading@10 806 {
yading@10 807 int last_byte = 0;
yading@10 808 int nibble;
yading@10 809 int decode_top_nibble_next = 0;
yading@10 810 int diff_channel;
yading@10 811 const int16_t *samples_end = samples + avctx->channels * nb_samples;
yading@10 812
yading@10 813 bytestream2_skipu(&gb, 10);
yading@10 814 c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 815 c->status[1].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 816 c->status[0].step_index = bytestream2_get_byteu(&gb);
yading@10 817 c->status[1].step_index = bytestream2_get_byteu(&gb);
yading@10 818 if (c->status[0].step_index > 88u || c->status[1].step_index > 88u){
yading@10 819 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i/%i\n",
yading@10 820 c->status[0].step_index, c->status[1].step_index);
yading@10 821 return AVERROR_INVALIDDATA;
yading@10 822 }
yading@10 823 /* sign extend the predictors */
yading@10 824 diff_channel = c->status[1].predictor;
yading@10 825
yading@10 826 /* DK3 ADPCM support macro */
yading@10 827 #define DK3_GET_NEXT_NIBBLE() \
yading@10 828 if (decode_top_nibble_next) { \
yading@10 829 nibble = last_byte >> 4; \
yading@10 830 decode_top_nibble_next = 0; \
yading@10 831 } else { \
yading@10 832 last_byte = bytestream2_get_byteu(&gb); \
yading@10 833 nibble = last_byte & 0x0F; \
yading@10 834 decode_top_nibble_next = 1; \
yading@10 835 }
yading@10 836
yading@10 837 while (samples < samples_end) {
yading@10 838
yading@10 839 /* for this algorithm, c->status[0] is the sum channel and
yading@10 840 * c->status[1] is the diff channel */
yading@10 841
yading@10 842 /* process the first predictor of the sum channel */
yading@10 843 DK3_GET_NEXT_NIBBLE();
yading@10 844 adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
yading@10 845
yading@10 846 /* process the diff channel predictor */
yading@10 847 DK3_GET_NEXT_NIBBLE();
yading@10 848 adpcm_ima_expand_nibble(&c->status[1], nibble, 3);
yading@10 849
yading@10 850 /* process the first pair of stereo PCM samples */
yading@10 851 diff_channel = (diff_channel + c->status[1].predictor) / 2;
yading@10 852 *samples++ = c->status[0].predictor + c->status[1].predictor;
yading@10 853 *samples++ = c->status[0].predictor - c->status[1].predictor;
yading@10 854
yading@10 855 /* process the second predictor of the sum channel */
yading@10 856 DK3_GET_NEXT_NIBBLE();
yading@10 857 adpcm_ima_expand_nibble(&c->status[0], nibble, 3);
yading@10 858
yading@10 859 /* process the second pair of stereo PCM samples */
yading@10 860 diff_channel = (diff_channel + c->status[1].predictor) / 2;
yading@10 861 *samples++ = c->status[0].predictor + c->status[1].predictor;
yading@10 862 *samples++ = c->status[0].predictor - c->status[1].predictor;
yading@10 863 }
yading@10 864 break;
yading@10 865 }
yading@10 866 case AV_CODEC_ID_ADPCM_IMA_ISS:
yading@10 867 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 868 cs = &c->status[channel];
yading@10 869 cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 870 cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 871 if (cs->step_index > 88u){
yading@10 872 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 873 channel, cs->step_index);
yading@10 874 return AVERROR_INVALIDDATA;
yading@10 875 }
yading@10 876 }
yading@10 877
yading@10 878 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 879 int v1, v2;
yading@10 880 int v = bytestream2_get_byteu(&gb);
yading@10 881 /* nibbles are swapped for mono */
yading@10 882 if (st) {
yading@10 883 v1 = v >> 4;
yading@10 884 v2 = v & 0x0F;
yading@10 885 } else {
yading@10 886 v2 = v >> 4;
yading@10 887 v1 = v & 0x0F;
yading@10 888 }
yading@10 889 *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v1, 3);
yading@10 890 *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
yading@10 891 }
yading@10 892 break;
yading@10 893 case AV_CODEC_ID_ADPCM_IMA_APC:
yading@10 894 while (bytestream2_get_bytes_left(&gb) > 0) {
yading@10 895 int v = bytestream2_get_byteu(&gb);
yading@10 896 *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4 , 3);
yading@10 897 *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
yading@10 898 }
yading@10 899 break;
yading@10 900 case AV_CODEC_ID_ADPCM_IMA_OKI:
yading@10 901 while (bytestream2_get_bytes_left(&gb) > 0) {
yading@10 902 int v = bytestream2_get_byteu(&gb);
yading@10 903 *samples++ = adpcm_ima_oki_expand_nibble(&c->status[0], v >> 4 );
yading@10 904 *samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F);
yading@10 905 }
yading@10 906 break;
yading@10 907 case AV_CODEC_ID_ADPCM_IMA_WS:
yading@10 908 if (c->vqa_version == 3) {
yading@10 909 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 910 int16_t *smp = samples_p[channel];
yading@10 911
yading@10 912 for (n = nb_samples / 2; n > 0; n--) {
yading@10 913 int v = bytestream2_get_byteu(&gb);
yading@10 914 *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
yading@10 915 *smp++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
yading@10 916 }
yading@10 917 }
yading@10 918 } else {
yading@10 919 for (n = nb_samples / 2; n > 0; n--) {
yading@10 920 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 921 int v = bytestream2_get_byteu(&gb);
yading@10 922 *samples++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
yading@10 923 samples[st] = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
yading@10 924 }
yading@10 925 samples += avctx->channels;
yading@10 926 }
yading@10 927 }
yading@10 928 bytestream2_seek(&gb, 0, SEEK_END);
yading@10 929 break;
yading@10 930 case AV_CODEC_ID_ADPCM_XA:
yading@10 931 {
yading@10 932 int16_t *out0 = samples_p[0];
yading@10 933 int16_t *out1 = samples_p[1];
yading@10 934 int samples_per_block = 28 * (3 - avctx->channels) * 4;
yading@10 935 int sample_offset = 0;
yading@10 936 while (bytestream2_get_bytes_left(&gb) >= 128) {
yading@10 937 if ((ret = xa_decode(avctx, out0, out1, buf + bytestream2_tell(&gb),
yading@10 938 &c->status[0], &c->status[1],
yading@10 939 avctx->channels, sample_offset)) < 0)
yading@10 940 return ret;
yading@10 941 bytestream2_skipu(&gb, 128);
yading@10 942 sample_offset += samples_per_block;
yading@10 943 }
yading@10 944 break;
yading@10 945 }
yading@10 946 case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
yading@10 947 for (i=0; i<=st; i++) {
yading@10 948 c->status[i].step_index = bytestream2_get_le32u(&gb);
yading@10 949 if (c->status[i].step_index > 88u) {
yading@10 950 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
yading@10 951 i, c->status[i].step_index);
yading@10 952 return AVERROR_INVALIDDATA;
yading@10 953 }
yading@10 954 }
yading@10 955 for (i=0; i<=st; i++)
yading@10 956 c->status[i].predictor = bytestream2_get_le32u(&gb);
yading@10 957
yading@10 958 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 959 int byte = bytestream2_get_byteu(&gb);
yading@10 960 *samples++ = adpcm_ima_expand_nibble(&c->status[0], byte >> 4, 3);
yading@10 961 *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 3);
yading@10 962 }
yading@10 963 break;
yading@10 964 case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
yading@10 965 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 966 int byte = bytestream2_get_byteu(&gb);
yading@10 967 *samples++ = adpcm_ima_expand_nibble(&c->status[0], byte >> 4, 6);
yading@10 968 *samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 6);
yading@10 969 }
yading@10 970 break;
yading@10 971 case AV_CODEC_ID_ADPCM_EA:
yading@10 972 {
yading@10 973 int previous_left_sample, previous_right_sample;
yading@10 974 int current_left_sample, current_right_sample;
yading@10 975 int next_left_sample, next_right_sample;
yading@10 976 int coeff1l, coeff2l, coeff1r, coeff2r;
yading@10 977 int shift_left, shift_right;
yading@10 978
yading@10 979 /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces,
yading@10 980 each coding 28 stereo samples. */
yading@10 981
yading@10 982 if(avctx->channels != 2)
yading@10 983 return AVERROR_INVALIDDATA;
yading@10 984
yading@10 985 current_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 986 previous_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 987 current_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 988 previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 989
yading@10 990 for (count1 = 0; count1 < nb_samples / 28; count1++) {
yading@10 991 int byte = bytestream2_get_byteu(&gb);
yading@10 992 coeff1l = ea_adpcm_table[ byte >> 4 ];
yading@10 993 coeff2l = ea_adpcm_table[(byte >> 4 ) + 4];
yading@10 994 coeff1r = ea_adpcm_table[ byte & 0x0F];
yading@10 995 coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
yading@10 996
yading@10 997 byte = bytestream2_get_byteu(&gb);
yading@10 998 shift_left = 20 - (byte >> 4);
yading@10 999 shift_right = 20 - (byte & 0x0F);
yading@10 1000
yading@10 1001 for (count2 = 0; count2 < 28; count2++) {
yading@10 1002 byte = bytestream2_get_byteu(&gb);
yading@10 1003 next_left_sample = sign_extend(byte >> 4, 4) << shift_left;
yading@10 1004 next_right_sample = sign_extend(byte, 4) << shift_right;
yading@10 1005
yading@10 1006 next_left_sample = (next_left_sample +
yading@10 1007 (current_left_sample * coeff1l) +
yading@10 1008 (previous_left_sample * coeff2l) + 0x80) >> 8;
yading@10 1009 next_right_sample = (next_right_sample +
yading@10 1010 (current_right_sample * coeff1r) +
yading@10 1011 (previous_right_sample * coeff2r) + 0x80) >> 8;
yading@10 1012
yading@10 1013 previous_left_sample = current_left_sample;
yading@10 1014 current_left_sample = av_clip_int16(next_left_sample);
yading@10 1015 previous_right_sample = current_right_sample;
yading@10 1016 current_right_sample = av_clip_int16(next_right_sample);
yading@10 1017 *samples++ = current_left_sample;
yading@10 1018 *samples++ = current_right_sample;
yading@10 1019 }
yading@10 1020 }
yading@10 1021
yading@10 1022 bytestream2_skip(&gb, 2); // Skip terminating 0x0000
yading@10 1023
yading@10 1024 break;
yading@10 1025 }
yading@10 1026 case AV_CODEC_ID_ADPCM_EA_MAXIS_XA:
yading@10 1027 {
yading@10 1028 int coeff[2][2], shift[2];
yading@10 1029
yading@10 1030 for(channel = 0; channel < avctx->channels; channel++) {
yading@10 1031 int byte = bytestream2_get_byteu(&gb);
yading@10 1032 for (i=0; i<2; i++)
yading@10 1033 coeff[channel][i] = ea_adpcm_table[(byte >> 4) + 4*i];
yading@10 1034 shift[channel] = 20 - (byte & 0x0F);
yading@10 1035 }
yading@10 1036 for (count1 = 0; count1 < nb_samples / 2; count1++) {
yading@10 1037 int byte[2];
yading@10 1038
yading@10 1039 byte[0] = bytestream2_get_byteu(&gb);
yading@10 1040 if (st) byte[1] = bytestream2_get_byteu(&gb);
yading@10 1041 for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
yading@10 1042 for(channel = 0; channel < avctx->channels; channel++) {
yading@10 1043 int sample = sign_extend(byte[channel] >> i, 4) << shift[channel];
yading@10 1044 sample = (sample +
yading@10 1045 c->status[channel].sample1 * coeff[channel][0] +
yading@10 1046 c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
yading@10 1047 c->status[channel].sample2 = c->status[channel].sample1;
yading@10 1048 c->status[channel].sample1 = av_clip_int16(sample);
yading@10 1049 *samples++ = c->status[channel].sample1;
yading@10 1050 }
yading@10 1051 }
yading@10 1052 }
yading@10 1053 bytestream2_seek(&gb, 0, SEEK_END);
yading@10 1054 break;
yading@10 1055 }
yading@10 1056 case AV_CODEC_ID_ADPCM_EA_R1:
yading@10 1057 case AV_CODEC_ID_ADPCM_EA_R2:
yading@10 1058 case AV_CODEC_ID_ADPCM_EA_R3: {
yading@10 1059 /* channel numbering
yading@10 1060 2chan: 0=fl, 1=fr
yading@10 1061 4chan: 0=fl, 1=rl, 2=fr, 3=rr
yading@10 1062 6chan: 0=fl, 1=c, 2=fr, 3=rl, 4=rr, 5=sub */
yading@10 1063 const int big_endian = avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R3;
yading@10 1064 int previous_sample, current_sample, next_sample;
yading@10 1065 int coeff1, coeff2;
yading@10 1066 int shift;
yading@10 1067 unsigned int channel;
yading@10 1068 uint16_t *samplesC;
yading@10 1069 int count = 0;
yading@10 1070 int offsets[6];
yading@10 1071
yading@10 1072 for (channel=0; channel<avctx->channels; channel++)
yading@10 1073 offsets[channel] = (big_endian ? bytestream2_get_be32(&gb) :
yading@10 1074 bytestream2_get_le32(&gb)) +
yading@10 1075 (avctx->channels + 1) * 4;
yading@10 1076
yading@10 1077 for (channel=0; channel<avctx->channels; channel++) {
yading@10 1078 bytestream2_seek(&gb, offsets[channel], SEEK_SET);
yading@10 1079 samplesC = samples_p[channel];
yading@10 1080
yading@10 1081 if (avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R1) {
yading@10 1082 current_sample = sign_extend(bytestream2_get_le16(&gb), 16);
yading@10 1083 previous_sample = sign_extend(bytestream2_get_le16(&gb), 16);
yading@10 1084 } else {
yading@10 1085 current_sample = c->status[channel].predictor;
yading@10 1086 previous_sample = c->status[channel].prev_sample;
yading@10 1087 }
yading@10 1088
yading@10 1089 for (count1 = 0; count1 < nb_samples / 28; count1++) {
yading@10 1090 int byte = bytestream2_get_byte(&gb);
yading@10 1091 if (byte == 0xEE) { /* only seen in R2 and R3 */
yading@10 1092 current_sample = sign_extend(bytestream2_get_be16(&gb), 16);
yading@10 1093 previous_sample = sign_extend(bytestream2_get_be16(&gb), 16);
yading@10 1094
yading@10 1095 for (count2=0; count2<28; count2++)
yading@10 1096 *samplesC++ = sign_extend(bytestream2_get_be16(&gb), 16);
yading@10 1097 } else {
yading@10 1098 coeff1 = ea_adpcm_table[ byte >> 4 ];
yading@10 1099 coeff2 = ea_adpcm_table[(byte >> 4) + 4];
yading@10 1100 shift = 20 - (byte & 0x0F);
yading@10 1101
yading@10 1102 for (count2=0; count2<28; count2++) {
yading@10 1103 if (count2 & 1)
yading@10 1104 next_sample = sign_extend(byte, 4) << shift;
yading@10 1105 else {
yading@10 1106 byte = bytestream2_get_byte(&gb);
yading@10 1107 next_sample = sign_extend(byte >> 4, 4) << shift;
yading@10 1108 }
yading@10 1109
yading@10 1110 next_sample += (current_sample * coeff1) +
yading@10 1111 (previous_sample * coeff2);
yading@10 1112 next_sample = av_clip_int16(next_sample >> 8);
yading@10 1113
yading@10 1114 previous_sample = current_sample;
yading@10 1115 current_sample = next_sample;
yading@10 1116 *samplesC++ = current_sample;
yading@10 1117 }
yading@10 1118 }
yading@10 1119 }
yading@10 1120 if (!count) {
yading@10 1121 count = count1;
yading@10 1122 } else if (count != count1) {
yading@10 1123 av_log(avctx, AV_LOG_WARNING, "per-channel sample count mismatch\n");
yading@10 1124 count = FFMAX(count, count1);
yading@10 1125 }
yading@10 1126
yading@10 1127 if (avctx->codec->id != AV_CODEC_ID_ADPCM_EA_R1) {
yading@10 1128 c->status[channel].predictor = current_sample;
yading@10 1129 c->status[channel].prev_sample = previous_sample;
yading@10 1130 }
yading@10 1131 }
yading@10 1132
yading@10 1133 frame->nb_samples = count * 28;
yading@10 1134 bytestream2_seek(&gb, 0, SEEK_END);
yading@10 1135 break;
yading@10 1136 }
yading@10 1137 case AV_CODEC_ID_ADPCM_EA_XAS:
yading@10 1138 for (channel=0; channel<avctx->channels; channel++) {
yading@10 1139 int coeff[2][4], shift[4];
yading@10 1140 int16_t *s = samples_p[channel];
yading@10 1141 for (n = 0; n < 4; n++, s += 32) {
yading@10 1142 int val = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 1143 for (i=0; i<2; i++)
yading@10 1144 coeff[i][n] = ea_adpcm_table[(val&0x0F)+4*i];
yading@10 1145 s[0] = val & ~0x0F;
yading@10 1146
yading@10 1147 val = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 1148 shift[n] = 20 - (val & 0x0F);
yading@10 1149 s[1] = val & ~0x0F;
yading@10 1150 }
yading@10 1151
yading@10 1152 for (m=2; m<32; m+=2) {
yading@10 1153 s = &samples_p[channel][m];
yading@10 1154 for (n = 0; n < 4; n++, s += 32) {
yading@10 1155 int level, pred;
yading@10 1156 int byte = bytestream2_get_byteu(&gb);
yading@10 1157
yading@10 1158 level = sign_extend(byte >> 4, 4) << shift[n];
yading@10 1159 pred = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
yading@10 1160 s[0] = av_clip_int16((level + pred + 0x80) >> 8);
yading@10 1161
yading@10 1162 level = sign_extend(byte, 4) << shift[n];
yading@10 1163 pred = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
yading@10 1164 s[1] = av_clip_int16((level + pred + 0x80) >> 8);
yading@10 1165 }
yading@10 1166 }
yading@10 1167 }
yading@10 1168 break;
yading@10 1169 case AV_CODEC_ID_ADPCM_IMA_AMV:
yading@10 1170 c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
yading@10 1171 c->status[0].step_index = bytestream2_get_le16u(&gb);
yading@10 1172 bytestream2_skipu(&gb, 4);
yading@10 1173 if (c->status[0].step_index > 88u) {
yading@10 1174 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
yading@10 1175 c->status[0].step_index);
yading@10 1176 return AVERROR_INVALIDDATA;
yading@10 1177 }
yading@10 1178
yading@10 1179 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 1180 int v = bytestream2_get_byteu(&gb);
yading@10 1181
yading@10 1182 *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
yading@10 1183 *samples++ = adpcm_ima_expand_nibble(&c->status[0], v & 0xf, 3);
yading@10 1184 }
yading@10 1185 break;
yading@10 1186 case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
yading@10 1187 for (i = 0; i < avctx->channels; i++) {
yading@10 1188 c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
yading@10 1189 c->status[i].step_index = bytestream2_get_byteu(&gb);
yading@10 1190 bytestream2_skipu(&gb, 1);
yading@10 1191 if (c->status[i].step_index > 88u) {
yading@10 1192 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
yading@10 1193 c->status[i].step_index);
yading@10 1194 return AVERROR_INVALIDDATA;
yading@10 1195 }
yading@10 1196 }
yading@10 1197
yading@10 1198 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 1199 int v = bytestream2_get_byteu(&gb);
yading@10 1200
yading@10 1201 *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4, 3);
yading@10 1202 *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf, 3);
yading@10 1203 }
yading@10 1204 break;
yading@10 1205 case AV_CODEC_ID_ADPCM_CT:
yading@10 1206 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 1207 int v = bytestream2_get_byteu(&gb);
yading@10 1208 *samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4 );
yading@10 1209 *samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
yading@10 1210 }
yading@10 1211 break;
yading@10 1212 case AV_CODEC_ID_ADPCM_SBPRO_4:
yading@10 1213 case AV_CODEC_ID_ADPCM_SBPRO_3:
yading@10 1214 case AV_CODEC_ID_ADPCM_SBPRO_2:
yading@10 1215 if (!c->status[0].step_index) {
yading@10 1216 /* the first byte is a raw sample */
yading@10 1217 *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
yading@10 1218 if (st)
yading@10 1219 *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
yading@10 1220 c->status[0].step_index = 1;
yading@10 1221 nb_samples--;
yading@10 1222 }
yading@10 1223 if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_4) {
yading@10 1224 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 1225 int byte = bytestream2_get_byteu(&gb);
yading@10 1226 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1227 byte >> 4, 4, 0);
yading@10 1228 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
yading@10 1229 byte & 0x0F, 4, 0);
yading@10 1230 }
yading@10 1231 } else if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_3) {
yading@10 1232 for (n = nb_samples / 3; n > 0; n--) {
yading@10 1233 int byte = bytestream2_get_byteu(&gb);
yading@10 1234 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1235 byte >> 5 , 3, 0);
yading@10 1236 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1237 (byte >> 2) & 0x07, 3, 0);
yading@10 1238 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1239 byte & 0x03, 2, 0);
yading@10 1240 }
yading@10 1241 } else {
yading@10 1242 for (n = nb_samples >> (2 - st); n > 0; n--) {
yading@10 1243 int byte = bytestream2_get_byteu(&gb);
yading@10 1244 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1245 byte >> 6 , 2, 2);
yading@10 1246 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
yading@10 1247 (byte >> 4) & 0x03, 2, 2);
yading@10 1248 *samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
yading@10 1249 (byte >> 2) & 0x03, 2, 2);
yading@10 1250 *samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
yading@10 1251 byte & 0x03, 2, 2);
yading@10 1252 }
yading@10 1253 }
yading@10 1254 break;
yading@10 1255 case AV_CODEC_ID_ADPCM_SWF:
yading@10 1256 adpcm_swf_decode(avctx, buf, buf_size, samples);
yading@10 1257 bytestream2_seek(&gb, 0, SEEK_END);
yading@10 1258 break;
yading@10 1259 case AV_CODEC_ID_ADPCM_YAMAHA:
yading@10 1260 for (n = nb_samples >> (1 - st); n > 0; n--) {
yading@10 1261 int v = bytestream2_get_byteu(&gb);
yading@10 1262 *samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
yading@10 1263 *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4 );
yading@10 1264 }
yading@10 1265 break;
yading@10 1266 case AV_CODEC_ID_ADPCM_AFC:
yading@10 1267 {
yading@10 1268 int samples_per_block;
yading@10 1269 int blocks;
yading@10 1270
yading@10 1271 if (avctx->extradata && avctx->extradata_size == 1 && avctx->extradata[0]) {
yading@10 1272 samples_per_block = avctx->extradata[0] / 16;
yading@10 1273 blocks = nb_samples / avctx->extradata[0];
yading@10 1274 } else {
yading@10 1275 samples_per_block = nb_samples / 16;
yading@10 1276 blocks = 1;
yading@10 1277 }
yading@10 1278
yading@10 1279 for (m = 0; m < blocks; m++) {
yading@10 1280 for (channel = 0; channel < avctx->channels; channel++) {
yading@10 1281 int prev1 = c->status[channel].sample1;
yading@10 1282 int prev2 = c->status[channel].sample2;
yading@10 1283
yading@10 1284 samples = samples_p[channel] + m * 16;
yading@10 1285 /* Read in every sample for this channel. */
yading@10 1286 for (i = 0; i < samples_per_block; i++) {
yading@10 1287 int byte = bytestream2_get_byteu(&gb);
yading@10 1288 int scale = 1 << (byte >> 4);
yading@10 1289 int index = byte & 0xf;
yading@10 1290 int factor1 = ff_adpcm_afc_coeffs[0][index];
yading@10 1291 int factor2 = ff_adpcm_afc_coeffs[1][index];
yading@10 1292
yading@10 1293 /* Decode 16 samples. */
yading@10 1294 for (n = 0; n < 16; n++) {
yading@10 1295 int32_t sampledat;
yading@10 1296
yading@10 1297 if (n & 1) {
yading@10 1298 sampledat = sign_extend(byte, 4);
yading@10 1299 } else {
yading@10 1300 byte = bytestream2_get_byteu(&gb);
yading@10 1301 sampledat = sign_extend(byte >> 4, 4);
yading@10 1302 }
yading@10 1303
yading@10 1304 sampledat = ((prev1 * factor1 + prev2 * factor2) +
yading@10 1305 ((sampledat * scale) << 11)) >> 11;
yading@10 1306 *samples = av_clip_int16(sampledat);
yading@10 1307 prev2 = prev1;
yading@10 1308 prev1 = *samples++;
yading@10 1309 }
yading@10 1310 }
yading@10 1311
yading@10 1312 c->status[channel].sample1 = prev1;
yading@10 1313 c->status[channel].sample2 = prev2;
yading@10 1314 }
yading@10 1315 }
yading@10 1316 bytestream2_seek(&gb, 0, SEEK_END);
yading@10 1317 break;
yading@10 1318 }
yading@10 1319 case AV_CODEC_ID_ADPCM_THP:
yading@10 1320 {
yading@10 1321 int table[6][16];
yading@10 1322 int ch;
yading@10 1323
yading@10 1324 for (i = 0; i < avctx->channels; i++)
yading@10 1325 for (n = 0; n < 16; n++)
yading@10 1326 table[i][n] = sign_extend(bytestream2_get_be16u(&gb), 16);
yading@10 1327
yading@10 1328 /* Initialize the previous sample. */
yading@10 1329 for (i = 0; i < avctx->channels; i++) {
yading@10 1330 c->status[i].sample1 = sign_extend(bytestream2_get_be16u(&gb), 16);
yading@10 1331 c->status[i].sample2 = sign_extend(bytestream2_get_be16u(&gb), 16);
yading@10 1332 }
yading@10 1333
yading@10 1334 for (ch = 0; ch < avctx->channels; ch++) {
yading@10 1335 samples = samples_p[ch];
yading@10 1336
yading@10 1337 /* Read in every sample for this channel. */
yading@10 1338 for (i = 0; i < nb_samples / 14; i++) {
yading@10 1339 int byte = bytestream2_get_byteu(&gb);
yading@10 1340 int index = (byte >> 4) & 7;
yading@10 1341 unsigned int exp = byte & 0x0F;
yading@10 1342 int factor1 = table[ch][index * 2];
yading@10 1343 int factor2 = table[ch][index * 2 + 1];
yading@10 1344
yading@10 1345 /* Decode 14 samples. */
yading@10 1346 for (n = 0; n < 14; n++) {
yading@10 1347 int32_t sampledat;
yading@10 1348
yading@10 1349 if (n & 1) {
yading@10 1350 sampledat = sign_extend(byte, 4);
yading@10 1351 } else {
yading@10 1352 byte = bytestream2_get_byteu(&gb);
yading@10 1353 sampledat = sign_extend(byte >> 4, 4);
yading@10 1354 }
yading@10 1355
yading@10 1356 sampledat = ((c->status[ch].sample1 * factor1
yading@10 1357 + c->status[ch].sample2 * factor2) >> 11) + (sampledat << exp);
yading@10 1358 *samples = av_clip_int16(sampledat);
yading@10 1359 c->status[ch].sample2 = c->status[ch].sample1;
yading@10 1360 c->status[ch].sample1 = *samples++;
yading@10 1361 }
yading@10 1362 }
yading@10 1363 }
yading@10 1364 break;
yading@10 1365 }
yading@10 1366
yading@10 1367 default:
yading@10 1368 return -1;
yading@10 1369 }
yading@10 1370
yading@10 1371 if (avpkt->size && bytestream2_tell(&gb) == 0) {
yading@10 1372 av_log(avctx, AV_LOG_ERROR, "Nothing consumed\n");
yading@10 1373 return AVERROR_INVALIDDATA;
yading@10 1374 }
yading@10 1375
yading@10 1376 *got_frame_ptr = 1;
yading@10 1377
yading@10 1378 return bytestream2_tell(&gb);
yading@10 1379 }
yading@10 1380
yading@10 1381
yading@10 1382 static const enum AVSampleFormat sample_fmts_s16[] = { AV_SAMPLE_FMT_S16,
yading@10 1383 AV_SAMPLE_FMT_NONE };
yading@10 1384 static const enum AVSampleFormat sample_fmts_s16p[] = { AV_SAMPLE_FMT_S16,
yading@10 1385 AV_SAMPLE_FMT_NONE };
yading@10 1386 static const enum AVSampleFormat sample_fmts_both[] = { AV_SAMPLE_FMT_S16,
yading@10 1387 AV_SAMPLE_FMT_S16P,
yading@10 1388 AV_SAMPLE_FMT_NONE };
yading@10 1389
yading@10 1390 #define ADPCM_DECODER(id_, sample_fmts_, name_, long_name_) \
yading@10 1391 AVCodec ff_ ## name_ ## _decoder = { \
yading@10 1392 .name = #name_, \
yading@10 1393 .type = AVMEDIA_TYPE_AUDIO, \
yading@10 1394 .id = id_, \
yading@10 1395 .priv_data_size = sizeof(ADPCMDecodeContext), \
yading@10 1396 .init = adpcm_decode_init, \
yading@10 1397 .decode = adpcm_decode_frame, \
yading@10 1398 .capabilities = CODEC_CAP_DR1, \
yading@10 1399 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
yading@10 1400 .sample_fmts = sample_fmts_, \
yading@10 1401 }
yading@10 1402
yading@10 1403 /* Note: Do not forget to add new entries to the Makefile as well. */
yading@10 1404 ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM, sample_fmts_s16p, adpcm_4xm, "ADPCM 4X Movie");
yading@10 1405 ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC, sample_fmts_s16p, adpcm_afc, "ADPCM Nintendo Gamecube AFC");
yading@10 1406 ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT, sample_fmts_s16, adpcm_ct, "ADPCM Creative Technology");
yading@10 1407 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA, sample_fmts_s16, adpcm_ea, "ADPCM Electronic Arts");
yading@10 1408 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_MAXIS_XA, sample_fmts_s16, adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA");
yading@10 1409 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R1, sample_fmts_s16p, adpcm_ea_r1, "ADPCM Electronic Arts R1");
yading@10 1410 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R2, sample_fmts_s16p, adpcm_ea_r2, "ADPCM Electronic Arts R2");
yading@10 1411 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R3, sample_fmts_s16p, adpcm_ea_r3, "ADPCM Electronic Arts R3");
yading@10 1412 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS, sample_fmts_s16p, adpcm_ea_xas, "ADPCM Electronic Arts XAS");
yading@10 1413 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV, sample_fmts_s16, adpcm_ima_amv, "ADPCM IMA AMV");
yading@10 1414 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC, sample_fmts_s16, adpcm_ima_apc, "ADPCM IMA CRYO APC");
yading@10 1415 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA Duck DK3");
yading@10 1416 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4");
yading@10 1417 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS");
yading@10 1418 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD");
yading@10 1419 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS");
yading@10 1420 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_OKI, sample_fmts_s16, adpcm_ima_oki, "ADPCM IMA Dialogic OKI");
yading@10 1421 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT, sample_fmts_s16p, adpcm_ima_qt, "ADPCM IMA QuickTime");
yading@10 1422 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG, sample_fmts_s16, adpcm_ima_smjpeg, "ADPCM IMA Loki SDL MJPEG");
yading@10 1423 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV, sample_fmts_s16p, adpcm_ima_wav, "ADPCM IMA WAV");
yading@10 1424 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA Westwood");
yading@10 1425 ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS, sample_fmts_s16, adpcm_ms, "ADPCM Microsoft");
yading@10 1426 ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_2, sample_fmts_s16, adpcm_sbpro_2, "ADPCM Sound Blaster Pro 2-bit");
yading@10 1427 ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_3, sample_fmts_s16, adpcm_sbpro_3, "ADPCM Sound Blaster Pro 2.6-bit");
yading@10 1428 ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_4, sample_fmts_s16, adpcm_sbpro_4, "ADPCM Sound Blaster Pro 4-bit");
yading@10 1429 ADPCM_DECODER(AV_CODEC_ID_ADPCM_SWF, sample_fmts_s16, adpcm_swf, "ADPCM Shockwave Flash");
yading@10 1430 ADPCM_DECODER(AV_CODEC_ID_ADPCM_THP, sample_fmts_s16p, adpcm_thp, "ADPCM Nintendo Gamecube THP");
yading@10 1431 ADPCM_DECODER(AV_CODEC_ID_ADPCM_XA, sample_fmts_s16p, adpcm_xa, "ADPCM CDROM XA");
yading@10 1432 ADPCM_DECODER(AV_CODEC_ID_ADPCM_YAMAHA, sample_fmts_s16, adpcm_yamaha, "ADPCM Yamaha");