00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00040 #include "avcodec.h"
00041
00042 typedef struct DPCMContext {
00043 int channels;
00044 short roq_square_array[256];
00045 long sample[2];
00046 const int *sol_table;
00047 } DPCMContext;
00048
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 const 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 const 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 const 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 const 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
00177 if(*data_size/2 < buf_size)
00178 return -1;
00179
00180 switch(avctx->codec->id) {
00181
00182 case CODEC_ID_ROQ_DPCM:
00183 if (s->channels == 1)
00184 predictor[0] = AV_RL16(&buf[6]);
00185 else {
00186 predictor[0] = buf[7] << 8;
00187 predictor[1] = buf[6] << 8;
00188 }
00189 SE_16BIT(predictor[0]);
00190 SE_16BIT(predictor[1]);
00191
00192
00193 for (in = 8, out = 0; in < buf_size; in++, out++) {
00194 predictor[channel_number] += s->roq_square_array[buf[in]];
00195 predictor[channel_number] = av_clip_int16(predictor[channel_number]);
00196 output_samples[out] = predictor[channel_number];
00197
00198
00199 channel_number ^= s->channels - 1;
00200 }
00201 break;
00202
00203 case CODEC_ID_INTERPLAY_DPCM:
00204 in = 6;
00205 predictor[0] = AV_RL16(&buf[in]);
00206 in += 2;
00207 SE_16BIT(predictor[0])
00208 output_samples[out++] = predictor[0];
00209 if (s->channels == 2) {
00210 predictor[1] = AV_RL16(&buf[in]);
00211 in += 2;
00212 SE_16BIT(predictor[1])
00213 output_samples[out++] = predictor[1];
00214 }
00215
00216 while (in < buf_size) {
00217 predictor[channel_number] += interplay_delta_table[buf[in++]];
00218 predictor[channel_number] = av_clip_int16(predictor[channel_number]);
00219 output_samples[out++] = predictor[channel_number];
00220
00221
00222 channel_number ^= s->channels - 1;
00223 }
00224
00225 break;
00226
00227 case CODEC_ID_XAN_DPCM:
00228 in = 0;
00229 shift[0] = shift[1] = 4;
00230 predictor[0] = AV_RL16(&buf[in]);
00231 in += 2;
00232 SE_16BIT(predictor[0]);
00233 if (s->channels == 2) {
00234 predictor[1] = AV_RL16(&buf[in]);
00235 in += 2;
00236 SE_16BIT(predictor[1]);
00237 }
00238
00239 while (in < buf_size) {
00240 byte = buf[in++];
00241 diff = (byte & 0xFC) << 8;
00242 if ((byte & 0x03) == 3)
00243 shift[channel_number]++;
00244 else
00245 shift[channel_number] -= (2 * (byte & 3));
00246
00247 if (shift[channel_number] < 0)
00248 shift[channel_number] = 0;
00249
00250 diff >>= shift[channel_number];
00251 predictor[channel_number] += diff;
00252
00253 predictor[channel_number] = av_clip_int16(predictor[channel_number]);
00254 output_samples[out++] = predictor[channel_number];
00255
00256
00257 channel_number ^= s->channels - 1;
00258 }
00259 break;
00260 case CODEC_ID_SOL_DPCM:
00261 in = 0;
00262 if (avctx->codec_tag != 3) {
00263 if(*data_size/4 < buf_size)
00264 return -1;
00265 while (in < buf_size) {
00266 int n1, n2;
00267 n1 = (buf[in] >> 4) & 0xF;
00268 n2 = buf[in++] & 0xF;
00269 s->sample[0] += s->sol_table[n1];
00270 if (s->sample[0] < 0) s->sample[0] = 0;
00271 if (s->sample[0] > 255) s->sample[0] = 255;
00272 output_samples[out++] = (s->sample[0] - 128) << 8;
00273 s->sample[s->channels - 1] += s->sol_table[n2];
00274 if (s->sample[s->channels - 1] < 0) s->sample[s->channels - 1] = 0;
00275 if (s->sample[s->channels - 1] > 255) s->sample[s->channels - 1] = 255;
00276 output_samples[out++] = (s->sample[s->channels - 1] - 128) << 8;
00277 }
00278 } else {
00279 while (in < buf_size) {
00280 int n;
00281 n = buf[in++];
00282 if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F];
00283 else s->sample[channel_number] += s->sol_table[n & 0x7F];
00284 s->sample[channel_number] = av_clip_int16(s->sample[channel_number]);
00285 output_samples[out++] = s->sample[channel_number];
00286
00287 channel_number ^= s->channels - 1;
00288 }
00289 }
00290 break;
00291 }
00292
00293 *data_size = out * sizeof(short);
00294 return buf_size;
00295 }
00296
00297 #define DPCM_DECODER(id, name) \
00298 AVCodec name ## _decoder = { \
00299 #name, \
00300 CODEC_TYPE_AUDIO, \
00301 id, \
00302 sizeof(DPCMContext), \
00303 dpcm_decode_init, \
00304 NULL, \
00305 NULL, \
00306 dpcm_decode_frame, \
00307 };
00308
00309 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm);
00310 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm);
00311 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm);
00312 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm);