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