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 "internal.h"
00043 #include "bytestream.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 const uint8_t *buf = avpkt->data;
00178 int buf_size = avpkt->size;
00179 const uint8_t *buf_end = buf + buf_size;
00180 DPCMContext *s = avctx->priv_data;
00181 int out = 0, ret;
00182 int predictor[2];
00183 int ch = 0;
00184 int stereo = s->channels - 1;
00185 int16_t *output_samples;
00186
00187 if (stereo && (buf_size & 1)) {
00188 buf_size--;
00189 buf_end--;
00190 }
00191
00192
00193 switch(avctx->codec->id) {
00194 case CODEC_ID_ROQ_DPCM:
00195 out = buf_size - 8;
00196 break;
00197 case CODEC_ID_INTERPLAY_DPCM:
00198 out = buf_size - 6 - s->channels;
00199 break;
00200 case CODEC_ID_XAN_DPCM:
00201 out = buf_size - 2 * s->channels;
00202 break;
00203 case CODEC_ID_SOL_DPCM:
00204 if (avctx->codec_tag != 3)
00205 out = buf_size * 2;
00206 else
00207 out = buf_size;
00208 break;
00209 }
00210 if (out <= 0) {
00211 av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
00212 return AVERROR(EINVAL);
00213 }
00214
00215
00216 s->frame.nb_samples = out / s->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
00223 switch(avctx->codec->id) {
00224
00225 case CODEC_ID_ROQ_DPCM:
00226 buf += 6;
00227
00228 if (stereo) {
00229 predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8);
00230 predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8);
00231 } else {
00232 predictor[0] = (int16_t)bytestream_get_le16(&buf);
00233 }
00234
00235
00236 while (buf < buf_end) {
00237 predictor[ch] += s->roq_square_array[*buf++];
00238 predictor[ch] = av_clip_int16(predictor[ch]);
00239 *output_samples++ = predictor[ch];
00240
00241
00242 ch ^= stereo;
00243 }
00244 break;
00245
00246 case CODEC_ID_INTERPLAY_DPCM:
00247 buf += 6;
00248
00249 for (ch = 0; ch < s->channels; ch++) {
00250 predictor[ch] = (int16_t)bytestream_get_le16(&buf);
00251 *output_samples++ = predictor[ch];
00252 }
00253
00254 ch = 0;
00255 while (buf < buf_end) {
00256 predictor[ch] += interplay_delta_table[*buf++];
00257 predictor[ch] = av_clip_int16(predictor[ch]);
00258 *output_samples++ = predictor[ch];
00259
00260
00261 ch ^= stereo;
00262 }
00263 break;
00264
00265 case CODEC_ID_XAN_DPCM:
00266 {
00267 int shift[2] = { 4, 4 };
00268
00269 for (ch = 0; ch < s->channels; ch++)
00270 predictor[ch] = (int16_t)bytestream_get_le16(&buf);
00271
00272 ch = 0;
00273 while (buf < buf_end) {
00274 uint8_t n = *buf++;
00275 int16_t diff = (n & 0xFC) << 8;
00276 if ((n & 0x03) == 3)
00277 shift[ch]++;
00278 else
00279 shift[ch] -= (2 * (n & 3));
00280
00281 if (shift[ch] < 0)
00282 shift[ch] = 0;
00283
00284 diff >>= shift[ch];
00285 predictor[ch] += diff;
00286
00287 predictor[ch] = av_clip_int16(predictor[ch]);
00288 *output_samples++ = predictor[ch];
00289
00290
00291 ch ^= stereo;
00292 }
00293 break;
00294 }
00295 case CODEC_ID_SOL_DPCM:
00296 if (avctx->codec_tag != 3) {
00297 uint8_t *output_samples_u8 = s->frame.data[0];
00298 while (buf < buf_end) {
00299 uint8_t n = *buf++;
00300
00301 s->sample[0] += s->sol_table[n >> 4];
00302 s->sample[0] = av_clip_uint8(s->sample[0]);
00303 *output_samples_u8++ = s->sample[0];
00304
00305 s->sample[stereo] += s->sol_table[n & 0x0F];
00306 s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
00307 *output_samples_u8++ = s->sample[stereo];
00308 }
00309 } else {
00310 while (buf < buf_end) {
00311 uint8_t n = *buf++;
00312 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
00313 else s->sample[ch] += sol_table_16[n & 0x7F];
00314 s->sample[ch] = av_clip_int16(s->sample[ch]);
00315 *output_samples++ = s->sample[ch];
00316
00317 ch ^= stereo;
00318 }
00319 }
00320 break;
00321 }
00322
00323 *got_frame_ptr = 1;
00324 *(AVFrame *)data = s->frame;
00325
00326 return avpkt->size;
00327 }
00328
00329 #define DPCM_DECODER(id_, name_, long_name_) \
00330 AVCodec ff_ ## name_ ## _decoder = { \
00331 .name = #name_, \
00332 .type = AVMEDIA_TYPE_AUDIO, \
00333 .id = id_, \
00334 .priv_data_size = sizeof(DPCMContext), \
00335 .init = dpcm_decode_init, \
00336 .decode = dpcm_decode_frame, \
00337 .capabilities = CODEC_CAP_DR1, \
00338 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
00339 }
00340
00341 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
00342 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
00343 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
00344 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");