1/* 2 * Assorted DPCM codecs 3 * Copyright (c) 2003 The ffmpeg Project 4 * 5 * This file is part of Libav. 6 * 7 * Libav 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 * Libav 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 Libav; 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 44typedef struct DPCMContext { 45 AVFrame frame; 46 int channels; 47 int16_t roq_square_array[256]; 48 int sample[2]; ///< previous sample (for SOL_DPCM) 49 const int8_t *sol_table; ///< delta table for SOL_DPCM 50} DPCMContext; 51 52static const int16_t interplay_delta_table[] = { 53 0, 1, 2, 3, 4, 5, 6, 7, 54 8, 9, 10, 11, 12, 13, 14, 15, 55 16, 17, 18, 19, 20, 21, 22, 23, 56 24, 25, 26, 27, 28, 29, 30, 31, 57 32, 33, 34, 35, 36, 37, 38, 39, 58 40, 41, 42, 43, 47, 51, 56, 61, 59 66, 72, 79, 86, 94, 102, 112, 122, 60 133, 145, 158, 173, 189, 206, 225, 245, 61 267, 292, 318, 348, 379, 414, 452, 493, 62 538, 587, 640, 699, 763, 832, 908, 991, 63 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993, 64 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008, 65 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059, 66 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206, 67 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589, 68 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1, 69 1, 1, 5481, 10503, 15105, 19322, 23186, 26728, 70 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298, 71 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597, 72 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772, 73 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373, 74 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180, 75 -1081, -991, -908, -832, -763, -699, -640, -587, 76 -538, -493, -452, -414, -379, -348, -318, -292, 77 -267, -245, -225, -206, -189, -173, -158, -145, 78 -133, -122, -112, -102, -94, -86, -79, -72, 79 -66, -61, -56, -51, -47, -43, -42, -41, 80 -40, -39, -38, -37, -36, -35, -34, -33, 81 -32, -31, -30, -29, -28, -27, -26, -25, 82 -24, -23, -22, -21, -20, -19, -18, -17, 83 -16, -15, -14, -13, -12, -11, -10, -9, 84 -8, -7, -6, -5, -4, -3, -2, -1 85 86}; 87 88static const int8_t sol_table_old[16] = { 89 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15, 90 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0 91}; 92 93static const int8_t sol_table_new[16] = { 94 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15, 95 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15 96}; 97 98static const int16_t sol_table_16[128] = { 99 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080, 100 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120, 101 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0, 102 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230, 103 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280, 104 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0, 105 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320, 106 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370, 107 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0, 108 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480, 109 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700, 110 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00, 111 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000 112}; 113 114 115static av_cold int dpcm_decode_init(AVCodecContext *avctx) 116{ 117 DPCMContext *s = avctx->priv_data; 118 int i; 119 120 if (avctx->channels < 1 || avctx->channels > 2) { 121 av_log(avctx, AV_LOG_INFO, "invalid number of channels\n"); 122 return AVERROR(EINVAL); 123 } 124 125 s->channels = avctx->channels; 126 s->sample[0] = s->sample[1] = 0; 127 128 switch(avctx->codec->id) { 129 130 case CODEC_ID_ROQ_DPCM: 131 /* initialize square table */ 132 for (i = 0; i < 128; i++) { 133 int16_t square = i * i; 134 s->roq_square_array[i ] = square; 135 s->roq_square_array[i + 128] = -square; 136 } 137 break; 138 139 case CODEC_ID_SOL_DPCM: 140 switch(avctx->codec_tag){ 141 case 1: 142 s->sol_table = sol_table_old; 143 s->sample[0] = s->sample[1] = 0x80; 144 break; 145 case 2: 146 s->sol_table = sol_table_new; 147 s->sample[0] = s->sample[1] = 0x80; 148 break; 149 case 3: 150 break; 151 default: 152 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n"); 153 return -1; 154 } 155 break; 156 157 default: 158 break; 159 } 160 161 if (avctx->codec->id == CODEC_ID_SOL_DPCM && avctx->codec_tag != 3) 162 avctx->sample_fmt = AV_SAMPLE_FMT_U8; 163 else 164 avctx->sample_fmt = AV_SAMPLE_FMT_S16; 165 166 avcodec_get_frame_defaults(&s->frame); 167 avctx->coded_frame = &s->frame; 168 169 return 0; 170} 171 172 173static int dpcm_decode_frame(AVCodecContext *avctx, void *data, 174 int *got_frame_ptr, AVPacket *avpkt) 175{ 176 const uint8_t *buf = avpkt->data; 177 int buf_size = avpkt->size; 178 const uint8_t *buf_end = buf + buf_size; 179 DPCMContext *s = avctx->priv_data; 180 int out = 0, ret; 181 int predictor[2]; 182 int ch = 0; 183 int stereo = s->channels - 1; 184 int16_t *output_samples; 185 186 if (stereo && (buf_size & 1)) { 187 buf_size--; 188 buf_end--; 189 } 190 191 /* calculate output size */ 192 switch(avctx->codec->id) { 193 case CODEC_ID_ROQ_DPCM: 194 out = buf_size - 8; 195 break; 196 case CODEC_ID_INTERPLAY_DPCM: 197 out = buf_size - 6 - s->channels; 198 break; 199 case CODEC_ID_XAN_DPCM: 200 out = buf_size - 2 * s->channels; 201 break; 202 case CODEC_ID_SOL_DPCM: 203 if (avctx->codec_tag != 3) 204 out = buf_size * 2; 205 else 206 out = buf_size; 207 break; 208 } 209 if (out <= 0) { 210 av_log(avctx, AV_LOG_ERROR, "packet is too small\n"); 211 return AVERROR(EINVAL); 212 } 213 214 /* get output buffer */ 215 s->frame.nb_samples = out / s->channels; 216 if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { 217 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); 218 return ret; 219 } 220 output_samples = (int16_t *)s->frame.data[0]; 221 222 switch(avctx->codec->id) { 223 224 case CODEC_ID_ROQ_DPCM: 225 buf += 6; 226 227 if (stereo) { 228 predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8); 229 predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8); 230 } else { 231 predictor[0] = (int16_t)bytestream_get_le16(&buf); 232 } 233 234 /* decode the samples */ 235 while (buf < buf_end) { 236 predictor[ch] += s->roq_square_array[*buf++]; 237 predictor[ch] = av_clip_int16(predictor[ch]); 238 *output_samples++ = predictor[ch]; 239 240 /* toggle channel */ 241 ch ^= stereo; 242 } 243 break; 244 245 case CODEC_ID_INTERPLAY_DPCM: 246 buf += 6; /* skip over the stream mask and stream length */ 247 248 for (ch = 0; ch < s->channels; ch++) { 249 predictor[ch] = (int16_t)bytestream_get_le16(&buf); 250 *output_samples++ = predictor[ch]; 251 } 252 253 ch = 0; 254 while (buf < buf_end) { 255 predictor[ch] += interplay_delta_table[*buf++]; 256 predictor[ch] = av_clip_int16(predictor[ch]); 257 *output_samples++ = predictor[ch]; 258 259 /* toggle channel */ 260 ch ^= stereo; 261 } 262 break; 263 264 case CODEC_ID_XAN_DPCM: 265 { 266 int shift[2] = { 4, 4 }; 267 268 for (ch = 0; ch < s->channels; ch++) 269 predictor[ch] = (int16_t)bytestream_get_le16(&buf); 270 271 ch = 0; 272 while (buf < buf_end) { 273 uint8_t n = *buf++; 274 int16_t diff = (n & 0xFC) << 8; 275 if ((n & 0x03) == 3) 276 shift[ch]++; 277 else 278 shift[ch] -= (2 * (n & 3)); 279 /* saturate the shifter to a lower limit of 0 */ 280 if (shift[ch] < 0) 281 shift[ch] = 0; 282 283 diff >>= shift[ch]; 284 predictor[ch] += diff; 285 286 predictor[ch] = av_clip_int16(predictor[ch]); 287 *output_samples++ = predictor[ch]; 288 289 /* toggle channel */ 290 ch ^= stereo; 291 } 292 break; 293 } 294 case CODEC_ID_SOL_DPCM: 295 if (avctx->codec_tag != 3) { 296 uint8_t *output_samples_u8 = s->frame.data[0]; 297 while (buf < buf_end) { 298 uint8_t n = *buf++; 299 300 s->sample[0] += s->sol_table[n >> 4]; 301 s->sample[0] = av_clip_uint8(s->sample[0]); 302 *output_samples_u8++ = s->sample[0]; 303 304 s->sample[stereo] += s->sol_table[n & 0x0F]; 305 s->sample[stereo] = av_clip_uint8(s->sample[stereo]); 306 *output_samples_u8++ = s->sample[stereo]; 307 } 308 } else { 309 while (buf < buf_end) { 310 uint8_t n = *buf++; 311 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F]; 312 else s->sample[ch] += sol_table_16[n & 0x7F]; 313 s->sample[ch] = av_clip_int16(s->sample[ch]); 314 *output_samples++ = s->sample[ch]; 315 /* toggle channel */ 316 ch ^= stereo; 317 } 318 } 319 break; 320 } 321 322 *got_frame_ptr = 1; 323 *(AVFrame *)data = s->frame; 324 325 return avpkt->size; 326} 327 328#define DPCM_DECODER(id_, name_, long_name_) \ 329AVCodec ff_ ## name_ ## _decoder = { \ 330 .name = #name_, \ 331 .type = AVMEDIA_TYPE_AUDIO, \ 332 .id = id_, \ 333 .priv_data_size = sizeof(DPCMContext), \ 334 .init = dpcm_decode_init, \ 335 .decode = dpcm_decode_frame, \ 336 .capabilities = CODEC_CAP_DR1, \ 337 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ 338} 339 340DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay"); 341DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ"); 342DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol"); 343DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan"); 344