00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00038 #include "avcodec.h"
00039
00040 typedef struct DPCMContext {
00041 int channels;
00042 short roq_square_array[256];
00043 long sample[2];
00044 int *sol_table;
00045 } DPCMContext;
00046
00047 #define SATURATE_S16(x) if (x < -32768) x = -32768; \
00048 else if (x > 32767) x = 32767;
00049 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
00050
00051 static int interplay_delta_table[] = {
00052 0, 1, 2, 3, 4, 5, 6, 7,
00053 8, 9, 10, 11, 12, 13, 14, 15,
00054 16, 17, 18, 19, 20, 21, 22, 23,
00055 24, 25, 26, 27, 28, 29, 30, 31,
00056 32, 33, 34, 35, 36, 37, 38, 39,
00057 40, 41, 42, 43, 47, 51, 56, 61,
00058 66, 72, 79, 86, 94, 102, 112, 122,
00059 133, 145, 158, 173, 189, 206, 225, 245,
00060 267, 292, 318, 348, 379, 414, 452, 493,
00061 538, 587, 640, 699, 763, 832, 908, 991,
00062 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
00063 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
00064 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
00065 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
00066 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
00067 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
00068 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
00069 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
00070 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
00071 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
00072 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
00073 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
00074 -1081, -991, -908, -832, -763, -699, -640, -587,
00075 -538, -493, -452, -414, -379, -348, -318, -292,
00076 -267, -245, -225, -206, -189, -173, -158, -145,
00077 -133, -122, -112, -102, -94, -86, -79, -72,
00078 -66, -61, -56, -51, -47, -43, -42, -41,
00079 -40, -39, -38, -37, -36, -35, -34, -33,
00080 -32, -31, -30, -29, -28, -27, -26, -25,
00081 -24, -23, -22, -21, -20, -19, -18, -17,
00082 -16, -15, -14, -13, -12, -11, -10, -9,
00083 -8, -7, -6, -5, -4, -3, -2, -1
00084
00085 };
00086
00087 static int sol_table_old[16] =
00088 { 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15,
00089 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
00090
00091 static int sol_table_new[16] =
00092 { 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
00093 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
00094
00095 static int sol_table_16[128] = {
00096 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
00097 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
00098 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
00099 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
00100 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
00101 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
00102 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
00103 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
00104 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
00105 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
00106 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
00107 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
00108 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
00109 };
00110
00111
00112
00113 static int dpcm_decode_init(AVCodecContext *avctx)
00114 {
00115 DPCMContext *s = avctx->priv_data;
00116 int i;
00117 short square;
00118
00119 s->channels = avctx->channels;
00120 s->sample[0] = s->sample[1] = 0;
00121
00122 switch(avctx->codec->id) {
00123
00124 case CODEC_ID_ROQ_DPCM:
00125
00126 for (i = 0; i < 128; i++) {
00127 square = i * i;
00128 s->roq_square_array[i] = square;
00129 s->roq_square_array[i + 128] = -square;
00130 }
00131 break;
00132
00133
00134 case CODEC_ID_SOL_DPCM:
00135 switch(avctx->codec_tag){
00136 case 1:
00137 s->sol_table=sol_table_old;
00138 s->sample[0] = s->sample[1] = 0x80;
00139 break;
00140 case 2:
00141 s->sol_table=sol_table_new;
00142 s->sample[0] = s->sample[1] = 0x80;
00143 break;
00144 case 3:
00145 s->sol_table=sol_table_16;
00146 break;
00147 default:
00148 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
00149 return -1;
00150 }
00151 break;
00152
00153 default:
00154 break;
00155 }
00156
00157 return 0;
00158 }
00159
00160 static int dpcm_decode_frame(AVCodecContext *avctx,
00161 void *data, int *data_size,
00162 uint8_t *buf, int buf_size)
00163 {
00164 DPCMContext *s = avctx->priv_data;
00165 int in, out = 0;
00166 int predictor[2];
00167 int channel_number = 0;
00168 short *output_samples = data;
00169 int shift[2];
00170 unsigned char byte;
00171 short diff;
00172
00173 if (!buf_size)
00174 return 0;
00175
00176 switch(avctx->codec->id) {
00177
00178 case CODEC_ID_ROQ_DPCM:
00179 if (s->channels == 1)
00180 predictor[0] = LE_16(&buf[6]);
00181 else {
00182 predictor[0] = buf[7] << 8;
00183 predictor[1] = buf[6] << 8;
00184 }
00185 SE_16BIT(predictor[0]);
00186 SE_16BIT(predictor[1]);
00187
00188
00189 for (in = 8, out = 0; in < buf_size; in++, out++) {
00190 predictor[channel_number] += s->roq_square_array[buf[in]];
00191 SATURATE_S16(predictor[channel_number]);
00192 output_samples[out] = predictor[channel_number];
00193
00194
00195 channel_number ^= s->channels - 1;
00196 }
00197 break;
00198
00199 case CODEC_ID_INTERPLAY_DPCM:
00200 in = 6;
00201 predictor[0] = LE_16(&buf[in]);
00202 in += 2;
00203 SE_16BIT(predictor[0])
00204 output_samples[out++] = predictor[0];
00205 if (s->channels == 2) {
00206 predictor[1] = LE_16(&buf[in]);
00207 in += 2;
00208 SE_16BIT(predictor[1])
00209 output_samples[out++] = predictor[1];
00210 }
00211
00212 while (in < buf_size) {
00213 predictor[channel_number] += interplay_delta_table[buf[in++]];
00214 SATURATE_S16(predictor[channel_number]);
00215 output_samples[out++] = predictor[channel_number];
00216
00217
00218 channel_number ^= s->channels - 1;
00219 }
00220
00221 break;
00222
00223 case CODEC_ID_XAN_DPCM:
00224 in = 0;
00225 shift[0] = shift[1] = 4;
00226 predictor[0] = LE_16(&buf[in]);
00227 in += 2;
00228 SE_16BIT(predictor[0]);
00229 if (s->channels == 2) {
00230 predictor[1] = LE_16(&buf[in]);
00231 in += 2;
00232 SE_16BIT(predictor[1]);
00233 }
00234
00235 while (in < buf_size) {
00236 byte = buf[in++];
00237 diff = (byte & 0xFC) << 8;
00238 if ((byte & 0x03) == 3)
00239 shift[channel_number]++;
00240 else
00241 shift[channel_number] -= (2 * (byte & 3));
00242
00243 if (shift[channel_number] < 0)
00244 shift[channel_number] = 0;
00245
00246 diff >>= shift[channel_number];
00247 predictor[channel_number] += diff;
00248
00249 SATURATE_S16(predictor[channel_number]);
00250 output_samples[out++] = predictor[channel_number];
00251
00252
00253 channel_number ^= s->channels - 1;
00254 }
00255 break;
00256 case CODEC_ID_SOL_DPCM:
00257 in = 0;
00258 if (avctx->codec_tag != 3) {
00259 while (in < buf_size) {
00260 int n1, n2;
00261 n1 = (buf[in] >> 4) & 0xF;
00262 n2 = buf[in++] & 0xF;
00263 s->sample[0] += s->sol_table[n1];
00264 if (s->sample[0] < 0) s->sample[0] = 0;
00265 if (s->sample[0] > 255) s->sample[0] = 255;
00266 output_samples[out++] = (s->sample[0] - 128) << 8;
00267 s->sample[s->channels - 1] += s->sol_table[n2];
00268 if (s->sample[s->channels - 1] < 0) s->sample[s->channels - 1] = 0;
00269 if (s->sample[s->channels - 1] > 255) s->sample[s->channels - 1] = 255;
00270 output_samples[out++] = (s->sample[s->channels - 1] - 128) << 8;
00271 }
00272 } else {
00273 while (in < buf_size) {
00274 int n;
00275 n = buf[in++];
00276 if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F];
00277 else s->sample[channel_number] += s->sol_table[n & 0x7F];
00278 SATURATE_S16(s->sample[channel_number]);
00279 output_samples[out++] = s->sample[channel_number];
00280
00281 channel_number ^= s->channels - 1;
00282 }
00283 }
00284 break;
00285 }
00286
00287 *data_size = out * sizeof(short);
00288 return buf_size;
00289 }
00290
00291 AVCodec roq_dpcm_decoder = {
00292 "roq_dpcm",
00293 CODEC_TYPE_AUDIO,
00294 CODEC_ID_ROQ_DPCM,
00295 sizeof(DPCMContext),
00296 dpcm_decode_init,
00297 NULL,
00298 NULL,
00299 dpcm_decode_frame,
00300 };
00301
00302 AVCodec interplay_dpcm_decoder = {
00303 "interplay_dpcm",
00304 CODEC_TYPE_AUDIO,
00305 CODEC_ID_INTERPLAY_DPCM,
00306 sizeof(DPCMContext),
00307 dpcm_decode_init,
00308 NULL,
00309 NULL,
00310 dpcm_decode_frame,
00311 };
00312
00313 AVCodec xan_dpcm_decoder = {
00314 "xan_dpcm",
00315 CODEC_TYPE_AUDIO,
00316 CODEC_ID_XAN_DPCM,
00317 sizeof(DPCMContext),
00318 dpcm_decode_init,
00319 NULL,
00320 NULL,
00321 dpcm_decode_frame,
00322 };
00323
00324 AVCodec sol_dpcm_decoder = {
00325 "sol_dpcm",
00326 CODEC_TYPE_AUDIO,
00327 CODEC_ID_SOL_DPCM,
00328 sizeof(DPCMContext),
00329 dpcm_decode_init,
00330 NULL,
00331 NULL,
00332 dpcm_decode_frame,
00333 };