libavcodec/dpcm.c
Go to the documentation of this file.
00001 /*
00002  * Assorted DPCM codecs
00003  * Copyright (c) 2003 The ffmpeg Project
00004  *
00005  * This file is part of Libav.
00006  *
00007  * Libav is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * Libav is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with Libav; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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         /* initialize square table */
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     /* calculate output size */
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     /* get output buffer */
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         /* decode the samples */
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             /* toggle channel */
00242             ch ^= stereo;
00243         }
00244         break;
00245 
00246     case CODEC_ID_INTERPLAY_DPCM:
00247         buf += 6;  /* skip over the stream mask and stream length */
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             /* toggle channel */
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             /* saturate the shifter to a lower limit of 0 */
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             /* toggle channel */
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                 /* toggle channel */
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");