1/* 2 * Assorted DPCM codecs 3 * Copyright (c) 2003 The FFmpeg project 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22/** 23 * @file 24 * Assorted DPCM (differential pulse code modulation) audio codecs 25 * by Mike Melanson (melanson@pcisys.net) 26 * Xan DPCM decoder by Mario Brito (mbrito@student.dei.uc.pt) 27 * for more information on the specific data formats, visit: 28 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html 29 * SOL DPCMs implemented by Konstantin Shishkov 30 * 31 * Note about using the Xan DPCM decoder: Xan DPCM is used in AVI files 32 * found in the Wing Commander IV computer game. These AVI files contain 33 * WAVEFORMAT headers which report the audio format as 0x01: raw PCM. 34 * Clearly incorrect. To detect Xan DPCM, you will probably have to 35 * special-case your AVI demuxer to use Xan DPCM if the file uses 'Xxan' 36 * (Xan video) for its video codec. Alternately, such AVI files also contain 37 * the fourcc 'Axan' in the 'auds' chunk of the AVI header. 38 */ 39 40#include "libavutil/intreadwrite.h" 41#include "avcodec.h" 42#include "bytestream.h" 43#include "codec_internal.h" 44#include "internal.h" 45#include "mathops.h" 46 47typedef struct DPCMContext { 48 int16_t array[256]; 49 int sample[2]; ///< previous sample (for SOL_DPCM) 50 const int8_t *sol_table; ///< delta table for SOL_DPCM 51} DPCMContext; 52 53static const int32_t derf_steps[96] = { 54 0, 1, 2, 3, 4, 5, 6, 7, 55 8, 9, 10, 11, 12, 13, 14, 16, 56 17, 19, 21, 23, 25, 28, 31, 34, 57 37, 41, 45, 50, 55, 60, 66, 73, 58 80, 88, 97, 107, 118, 130, 143, 157, 59 173, 190, 209, 230, 253, 279, 307, 337, 60 371, 408, 449, 494, 544, 598, 658, 724, 61 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 62 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 63 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 64 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 65 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767, 66}; 67 68static const int16_t interplay_delta_table[] = { 69 0, 1, 2, 3, 4, 5, 6, 7, 70 8, 9, 10, 11, 12, 13, 14, 15, 71 16, 17, 18, 19, 20, 21, 22, 23, 72 24, 25, 26, 27, 28, 29, 30, 31, 73 32, 33, 34, 35, 36, 37, 38, 39, 74 40, 41, 42, 43, 47, 51, 56, 61, 75 66, 72, 79, 86, 94, 102, 112, 122, 76 133, 145, 158, 173, 189, 206, 225, 245, 77 267, 292, 318, 348, 379, 414, 452, 493, 78 538, 587, 640, 699, 763, 832, 908, 991, 79 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993, 80 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008, 81 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059, 82 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206, 83 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589, 84 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1, 85 1, 1, 5481, 10503, 15105, 19322, 23186, 26728, 86 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298, 87 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597, 88 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772, 89 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373, 90 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180, 91 -1081, -991, -908, -832, -763, -699, -640, -587, 92 -538, -493, -452, -414, -379, -348, -318, -292, 93 -267, -245, -225, -206, -189, -173, -158, -145, 94 -133, -122, -112, -102, -94, -86, -79, -72, 95 -66, -61, -56, -51, -47, -43, -42, -41, 96 -40, -39, -38, -37, -36, -35, -34, -33, 97 -32, -31, -30, -29, -28, -27, -26, -25, 98 -24, -23, -22, -21, -20, -19, -18, -17, 99 -16, -15, -14, -13, -12, -11, -10, -9, 100 -8, -7, -6, -5, -4, -3, -2, -1 101 102}; 103 104static const int8_t sol_table_old[16] = { 105 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15, 106 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0 107}; 108 109static const int8_t sol_table_new[16] = { 110 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15, 111 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15 112}; 113 114static const int16_t sol_table_16[128] = { 115 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080, 116 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120, 117 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0, 118 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230, 119 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280, 120 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0, 121 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320, 122 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370, 123 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0, 124 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480, 125 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700, 126 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00, 127 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000 128}; 129 130 131static av_cold int dpcm_decode_init(AVCodecContext *avctx) 132{ 133 DPCMContext *s = avctx->priv_data; 134 int i; 135 136 if (avctx->ch_layout.nb_channels < 1 || avctx->ch_layout.nb_channels > 2) { 137 av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n"); 138 return AVERROR(EINVAL); 139 } 140 141 s->sample[0] = s->sample[1] = 0; 142 143 switch(avctx->codec->id) { 144 145 case AV_CODEC_ID_ROQ_DPCM: 146 /* initialize square table */ 147 for (i = 0; i < 128; i++) { 148 int16_t square = i * i; 149 s->array[i ] = square; 150 s->array[i + 128] = -square; 151 } 152 break; 153 154 case AV_CODEC_ID_SOL_DPCM: 155 switch(avctx->codec_tag){ 156 case 1: 157 s->sol_table = sol_table_old; 158 s->sample[0] = s->sample[1] = 0x80; 159 break; 160 case 2: 161 s->sol_table = sol_table_new; 162 s->sample[0] = s->sample[1] = 0x80; 163 break; 164 case 3: 165 break; 166 default: 167 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n"); 168 return -1; 169 } 170 break; 171 172 case AV_CODEC_ID_SDX2_DPCM: 173 for (i = -128; i < 128; i++) { 174 int16_t square = i * i * 2; 175 s->array[i+128] = i < 0 ? -square: square; 176 } 177 break; 178 179 case AV_CODEC_ID_GREMLIN_DPCM: { 180 int delta = 0; 181 int code = 64; 182 int step = 45; 183 184 s->array[0] = 0; 185 for (i = 0; i < 127; i++) { 186 delta += (code >> 5); 187 code += step; 188 step += 2; 189 190 s->array[i*2 + 1] = delta; 191 s->array[i*2 + 2] = -delta; 192 } 193 s->array[255] = delta + (code >> 5); 194 } 195 break; 196 197 default: 198 break; 199 } 200 201 if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3) 202 avctx->sample_fmt = AV_SAMPLE_FMT_U8; 203 else 204 avctx->sample_fmt = AV_SAMPLE_FMT_S16; 205 206 return 0; 207} 208 209 210static int dpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, 211 int *got_frame_ptr, AVPacket *avpkt) 212{ 213 int buf_size = avpkt->size; 214 DPCMContext *s = avctx->priv_data; 215 int out = 0, ret; 216 int predictor[2]; 217 int ch = 0; 218 int stereo = avctx->ch_layout.nb_channels - 1; 219 int16_t *output_samples, *samples_end; 220 GetByteContext gb; 221 222 if (stereo && (buf_size & 1)) 223 buf_size--; 224 bytestream2_init(&gb, avpkt->data, buf_size); 225 226 /* calculate output size */ 227 switch(avctx->codec->id) { 228 case AV_CODEC_ID_ROQ_DPCM: 229 out = buf_size - 8; 230 break; 231 case AV_CODEC_ID_INTERPLAY_DPCM: 232 out = buf_size - 6 - avctx->ch_layout.nb_channels; 233 break; 234 case AV_CODEC_ID_XAN_DPCM: 235 out = buf_size - 2 * avctx->ch_layout.nb_channels; 236 break; 237 case AV_CODEC_ID_SOL_DPCM: 238 if (avctx->codec_tag != 3) 239 out = buf_size * 2; 240 else 241 out = buf_size; 242 break; 243 case AV_CODEC_ID_DERF_DPCM: 244 case AV_CODEC_ID_GREMLIN_DPCM: 245 case AV_CODEC_ID_SDX2_DPCM: 246 out = buf_size; 247 break; 248 } 249 if (out <= 0) { 250 av_log(avctx, AV_LOG_ERROR, "packet is too small\n"); 251 return AVERROR(EINVAL); 252 } 253 if (out % avctx->ch_layout.nb_channels) { 254 av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n"); 255 } 256 257 /* get output buffer */ 258 frame->nb_samples = (out + avctx->ch_layout.nb_channels - 1) / avctx->ch_layout.nb_channels; 259 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 260 return ret; 261 output_samples = (int16_t *)frame->data[0]; 262 samples_end = output_samples + out; 263 264 switch(avctx->codec->id) { 265 266 case AV_CODEC_ID_ROQ_DPCM: 267 bytestream2_skipu(&gb, 6); 268 269 if (stereo) { 270 predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16); 271 predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16); 272 } else { 273 predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16); 274 } 275 276 /* decode the samples */ 277 while (output_samples < samples_end) { 278 predictor[ch] += s->array[bytestream2_get_byteu(&gb)]; 279 predictor[ch] = av_clip_int16(predictor[ch]); 280 *output_samples++ = predictor[ch]; 281 282 /* toggle channel */ 283 ch ^= stereo; 284 } 285 break; 286 287 case AV_CODEC_ID_INTERPLAY_DPCM: 288 bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */ 289 290 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { 291 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); 292 *output_samples++ = predictor[ch]; 293 } 294 295 ch = 0; 296 while (output_samples < samples_end) { 297 predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)]; 298 predictor[ch] = av_clip_int16(predictor[ch]); 299 *output_samples++ = predictor[ch]; 300 301 /* toggle channel */ 302 ch ^= stereo; 303 } 304 break; 305 306 case AV_CODEC_ID_XAN_DPCM: 307 { 308 int shift[2] = { 4, 4 }; 309 310 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) 311 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); 312 313 ch = 0; 314 while (output_samples < samples_end) { 315 int diff = bytestream2_get_byteu(&gb); 316 int n = diff & 3; 317 318 if (n == 3) 319 shift[ch]++; 320 else 321 shift[ch] -= (2 * n); 322 diff = sign_extend((diff &~ 3) << 8, 16); 323 324 /* saturate the shifter to 0..31 */ 325 shift[ch] = av_clip_uintp2(shift[ch], 5); 326 327 diff >>= shift[ch]; 328 predictor[ch] += diff; 329 330 predictor[ch] = av_clip_int16(predictor[ch]); 331 *output_samples++ = predictor[ch]; 332 333 /* toggle channel */ 334 ch ^= stereo; 335 } 336 break; 337 } 338 case AV_CODEC_ID_SOL_DPCM: 339 if (avctx->codec_tag != 3) { 340 uint8_t *output_samples_u8 = frame->data[0], 341 *samples_end_u8 = output_samples_u8 + out; 342 while (output_samples_u8 < samples_end_u8) { 343 int n = bytestream2_get_byteu(&gb); 344 345 s->sample[0] += s->sol_table[n >> 4]; 346 s->sample[0] = av_clip_uint8(s->sample[0]); 347 *output_samples_u8++ = s->sample[0]; 348 349 s->sample[stereo] += s->sol_table[n & 0x0F]; 350 s->sample[stereo] = av_clip_uint8(s->sample[stereo]); 351 *output_samples_u8++ = s->sample[stereo]; 352 } 353 } else { 354 while (output_samples < samples_end) { 355 int n = bytestream2_get_byteu(&gb); 356 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F]; 357 else s->sample[ch] += sol_table_16[n & 0x7F]; 358 s->sample[ch] = av_clip_int16(s->sample[ch]); 359 *output_samples++ = s->sample[ch]; 360 /* toggle channel */ 361 ch ^= stereo; 362 } 363 } 364 break; 365 366 case AV_CODEC_ID_SDX2_DPCM: 367 while (output_samples < samples_end) { 368 int8_t n = bytestream2_get_byteu(&gb); 369 370 if (!(n & 1)) 371 s->sample[ch] = 0; 372 s->sample[ch] += s->array[n + 128]; 373 s->sample[ch] = av_clip_int16(s->sample[ch]); 374 *output_samples++ = s->sample[ch]; 375 ch ^= stereo; 376 } 377 break; 378 379 case AV_CODEC_ID_GREMLIN_DPCM: { 380 int idx = 0; 381 382 while (output_samples < samples_end) { 383 uint8_t n = bytestream2_get_byteu(&gb); 384 385 *output_samples++ = s->sample[idx] += (unsigned)s->array[n]; 386 idx ^= 1; 387 } 388 } 389 break; 390 391 case AV_CODEC_ID_DERF_DPCM: { 392 int idx = 0; 393 394 while (output_samples < samples_end) { 395 uint8_t n = bytestream2_get_byteu(&gb); 396 int index = FFMIN(n & 0x7f, 95); 397 398 s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index]; 399 s->sample[idx] = av_clip_int16(s->sample[idx]); 400 *output_samples++ = s->sample[idx]; 401 idx ^= stereo; 402 } 403 } 404 break; 405 } 406 407 *got_frame_ptr = 1; 408 409 return avpkt->size; 410} 411 412#define DPCM_DECODER(id_, name_, long_name_) \ 413const FFCodec ff_ ## name_ ## _decoder = { \ 414 .p.name = #name_, \ 415 .p.long_name = NULL_IF_CONFIG_SMALL(long_name_), \ 416 .p.type = AVMEDIA_TYPE_AUDIO, \ 417 .p.id = id_, \ 418 .p.capabilities = AV_CODEC_CAP_DR1, \ 419 .priv_data_size = sizeof(DPCMContext), \ 420 .init = dpcm_decode_init, \ 421 FF_CODEC_DECODE_CB(dpcm_decode_frame), \ 422 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ 423} 424 425DPCM_DECODER(AV_CODEC_ID_DERF_DPCM, derf_dpcm, "DPCM Xilam DERF"); 426DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, "DPCM Gremlin"); 427DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay"); 428DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ"); 429DPCM_DECODER(AV_CODEC_ID_SDX2_DPCM, sdx2_dpcm, "DPCM Squareroot-Delta-Exact"); 430DPCM_DECODER(AV_CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol"); 431DPCM_DECODER(AV_CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan"); 432