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 "mathops.h"
00044
00045 typedef struct DPCMContext {
00046 AVFrame frame;
00047 int channels;
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_INFO, "invalid number of channels\n");
00123 return AVERROR(EINVAL);
00124 }
00125
00126 s->channels = avctx->channels;
00127 s->sample[0] = s->sample[1] = 0;
00128
00129 switch(avctx->codec->id) {
00130
00131 case CODEC_ID_ROQ_DPCM:
00132
00133 for (i = 0; i < 128; i++) {
00134 int16_t square = i * i;
00135 s->roq_square_array[i ] = square;
00136 s->roq_square_array[i + 128] = -square;
00137 }
00138 break;
00139
00140 case CODEC_ID_SOL_DPCM:
00141 switch(avctx->codec_tag){
00142 case 1:
00143 s->sol_table = sol_table_old;
00144 s->sample[0] = s->sample[1] = 0x80;
00145 break;
00146 case 2:
00147 s->sol_table = sol_table_new;
00148 s->sample[0] = s->sample[1] = 0x80;
00149 break;
00150 case 3:
00151 break;
00152 default:
00153 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
00154 return -1;
00155 }
00156 break;
00157
00158 default:
00159 break;
00160 }
00161
00162 if (avctx->codec->id == CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
00163 avctx->sample_fmt = AV_SAMPLE_FMT_U8;
00164 else
00165 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
00166
00167 avcodec_get_frame_defaults(&s->frame);
00168 avctx->coded_frame = &s->frame;
00169
00170 return 0;
00171 }
00172
00173
00174 static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
00175 int *got_frame_ptr, AVPacket *avpkt)
00176 {
00177 int buf_size = avpkt->size;
00178 DPCMContext *s = avctx->priv_data;
00179 int out = 0, ret;
00180 int predictor[2];
00181 int ch = 0;
00182 int stereo = s->channels - 1;
00183 int16_t *output_samples, *samples_end;
00184 GetByteContext gb;
00185
00186 if (stereo && (buf_size & 1))
00187 buf_size--;
00188 bytestream2_init(&gb, avpkt->data, buf_size);
00189
00190
00191 switch(avctx->codec->id) {
00192 case CODEC_ID_ROQ_DPCM:
00193 out = buf_size - 8;
00194 break;
00195 case CODEC_ID_INTERPLAY_DPCM:
00196 out = buf_size - 6 - s->channels;
00197 break;
00198 case CODEC_ID_XAN_DPCM:
00199 out = buf_size - 2 * s->channels;
00200 break;
00201 case CODEC_ID_SOL_DPCM:
00202 if (avctx->codec_tag != 3)
00203 out = buf_size * 2;
00204 else
00205 out = buf_size;
00206 break;
00207 }
00208 if (out <= 0) {
00209 av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
00210 return AVERROR(EINVAL);
00211 }
00212 if (out % s->channels) {
00213 av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n");
00214 }
00215
00216
00217 s->frame.nb_samples = (out + s->channels - 1) / s->channels;
00218 if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
00219 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00220 return ret;
00221 }
00222 output_samples = (int16_t *)s->frame.data[0];
00223 samples_end = output_samples + out;
00224
00225 switch(avctx->codec->id) {
00226
00227 case CODEC_ID_ROQ_DPCM:
00228 bytestream2_skipu(&gb, 6);
00229
00230 if (stereo) {
00231 predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
00232 predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
00233 } else {
00234 predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
00235 }
00236
00237
00238 while (output_samples < samples_end) {
00239 predictor[ch] += s->roq_square_array[bytestream2_get_byteu(&gb)];
00240 predictor[ch] = av_clip_int16(predictor[ch]);
00241 *output_samples++ = predictor[ch];
00242
00243
00244 ch ^= stereo;
00245 }
00246 break;
00247
00248 case CODEC_ID_INTERPLAY_DPCM:
00249 bytestream2_skipu(&gb, 6);
00250
00251 for (ch = 0; ch < s->channels; ch++) {
00252 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
00253 *output_samples++ = predictor[ch];
00254 }
00255
00256 ch = 0;
00257 while (output_samples < samples_end) {
00258 predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
00259 predictor[ch] = av_clip_int16(predictor[ch]);
00260 *output_samples++ = predictor[ch];
00261
00262
00263 ch ^= stereo;
00264 }
00265 break;
00266
00267 case CODEC_ID_XAN_DPCM:
00268 {
00269 int shift[2] = { 4, 4 };
00270
00271 for (ch = 0; ch < s->channels; ch++)
00272 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
00273
00274 ch = 0;
00275 while (output_samples < samples_end) {
00276 int diff = bytestream2_get_byteu(&gb);
00277 int n = diff & 3;
00278
00279 if (n == 3)
00280 shift[ch]++;
00281 else
00282 shift[ch] -= (2 * n);
00283 diff = sign_extend((diff &~ 3) << 8, 16);
00284
00285
00286 if (shift[ch] < 0)
00287 shift[ch] = 0;
00288
00289 diff >>= shift[ch];
00290 predictor[ch] += diff;
00291
00292 predictor[ch] = av_clip_int16(predictor[ch]);
00293 *output_samples++ = predictor[ch];
00294
00295
00296 ch ^= stereo;
00297 }
00298 break;
00299 }
00300 case CODEC_ID_SOL_DPCM:
00301 if (avctx->codec_tag != 3) {
00302 uint8_t *output_samples_u8 = s->frame.data[0],
00303 *samples_end_u8 = output_samples_u8 + out;
00304 while (output_samples_u8 < samples_end_u8) {
00305 int n = bytestream2_get_byteu(&gb);
00306
00307 s->sample[0] += s->sol_table[n >> 4];
00308 s->sample[0] = av_clip_uint8(s->sample[0]);
00309 *output_samples_u8++ = s->sample[0];
00310
00311 s->sample[stereo] += s->sol_table[n & 0x0F];
00312 s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
00313 *output_samples_u8++ = s->sample[stereo];
00314 }
00315 } else {
00316 while (output_samples < samples_end) {
00317 int n = bytestream2_get_byteu(&gb);
00318 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
00319 else s->sample[ch] += sol_table_16[n & 0x7F];
00320 s->sample[ch] = av_clip_int16(s->sample[ch]);
00321 *output_samples++ = s->sample[ch];
00322
00323 ch ^= stereo;
00324 }
00325 }
00326 break;
00327 }
00328
00329 *got_frame_ptr = 1;
00330 *(AVFrame *)data = s->frame;
00331
00332 return avpkt->size;
00333 }
00334
00335 #define DPCM_DECODER(id_, name_, long_name_) \
00336 AVCodec ff_ ## name_ ## _decoder = { \
00337 .name = #name_, \
00338 .type = AVMEDIA_TYPE_AUDIO, \
00339 .id = id_, \
00340 .priv_data_size = sizeof(DPCMContext), \
00341 .init = dpcm_decode_init, \
00342 .decode = dpcm_decode_frame, \
00343 .capabilities = CODEC_CAP_DR1, \
00344 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
00345 }
00346
00347 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
00348 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
00349 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
00350 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");