00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00025 #include "avcodec.h"
00026
00027
00028
00029 #define SIGN_BIT (0x80)
00030 #define QUANT_MASK (0xf)
00031 #define NSEGS (8)
00032 #define SEG_SHIFT (4)
00033 #define SEG_MASK (0x70)
00034
00035 #define BIAS (0x84)
00036
00037
00038
00039
00040
00041 static int alaw2linear(unsigned char a_val)
00042 {
00043 int t;
00044 int seg;
00045
00046 a_val ^= 0x55;
00047
00048 t = a_val & QUANT_MASK;
00049 seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
00050 if(seg) t= (t + t + 1 + 32) << (seg + 2);
00051 else t= (t + t + 1 ) << 3;
00052
00053 return ((a_val & SIGN_BIT) ? t : -t);
00054 }
00055
00056 static int ulaw2linear(unsigned char u_val)
00057 {
00058 int t;
00059
00060
00061 u_val = ~u_val;
00062
00063
00064
00065
00066
00067 t = ((u_val & QUANT_MASK) << 3) + BIAS;
00068 t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
00069
00070 return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
00071 }
00072
00073
00074 static uint8_t *linear_to_alaw = NULL;
00075 static int linear_to_alaw_ref = 0;
00076
00077 static uint8_t *linear_to_ulaw = NULL;
00078 static int linear_to_ulaw_ref = 0;
00079
00080 static void build_xlaw_table(uint8_t *linear_to_xlaw,
00081 int (*xlaw2linear)(unsigned char),
00082 int mask)
00083 {
00084 int i, j, v, v1, v2;
00085
00086 j = 0;
00087 for(i=0;i<128;i++) {
00088 if (i != 127) {
00089 v1 = xlaw2linear(i ^ mask);
00090 v2 = xlaw2linear((i + 1) ^ mask);
00091 v = (v1 + v2 + 4) >> 3;
00092 } else {
00093 v = 8192;
00094 }
00095 for(;j<v;j++) {
00096 linear_to_xlaw[8192 + j] = (i ^ mask);
00097 if (j > 0)
00098 linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80));
00099 }
00100 }
00101 linear_to_xlaw[0] = linear_to_xlaw[1];
00102 }
00103
00104 static int pcm_encode_init(AVCodecContext *avctx)
00105 {
00106 avctx->frame_size = 1;
00107 switch(avctx->codec->id) {
00108 case CODEC_ID_PCM_ALAW:
00109 if (linear_to_alaw_ref == 0) {
00110 linear_to_alaw = av_malloc(16384);
00111 if (!linear_to_alaw)
00112 return -1;
00113 build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
00114 }
00115 linear_to_alaw_ref++;
00116 break;
00117 case CODEC_ID_PCM_MULAW:
00118 if (linear_to_ulaw_ref == 0) {
00119 linear_to_ulaw = av_malloc(16384);
00120 if (!linear_to_ulaw)
00121 return -1;
00122 build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
00123 }
00124 linear_to_ulaw_ref++;
00125 break;
00126 default:
00127 break;
00128 }
00129
00130 switch(avctx->codec->id) {
00131 case CODEC_ID_PCM_S16LE:
00132 case CODEC_ID_PCM_S16BE:
00133 case CODEC_ID_PCM_U16LE:
00134 case CODEC_ID_PCM_U16BE:
00135 avctx->block_align = 2 * avctx->channels;
00136 break;
00137 case CODEC_ID_PCM_S8:
00138 case CODEC_ID_PCM_U8:
00139 case CODEC_ID_PCM_MULAW:
00140 case CODEC_ID_PCM_ALAW:
00141 avctx->block_align = avctx->channels;
00142 break;
00143 default:
00144 break;
00145 }
00146
00147 avctx->coded_frame= avcodec_alloc_frame();
00148 avctx->coded_frame->key_frame= 1;
00149
00150 return 0;
00151 }
00152
00153 static int pcm_encode_close(AVCodecContext *avctx)
00154 {
00155 av_freep(&avctx->coded_frame);
00156
00157 switch(avctx->codec->id) {
00158 case CODEC_ID_PCM_ALAW:
00159 if (--linear_to_alaw_ref == 0)
00160 av_free(linear_to_alaw);
00161 break;
00162 case CODEC_ID_PCM_MULAW:
00163 if (--linear_to_ulaw_ref == 0)
00164 av_free(linear_to_ulaw);
00165 break;
00166 default:
00167
00168 break;
00169 }
00170 return 0;
00171 }
00172
00173 static int pcm_encode_frame(AVCodecContext *avctx,
00174 unsigned char *frame, int buf_size, void *data)
00175 {
00176 int n, sample_size, v;
00177 short *samples;
00178 unsigned char *dst;
00179
00180 switch(avctx->codec->id) {
00181 case CODEC_ID_PCM_S16LE:
00182 case CODEC_ID_PCM_S16BE:
00183 case CODEC_ID_PCM_U16LE:
00184 case CODEC_ID_PCM_U16BE:
00185 sample_size = 2;
00186 break;
00187 default:
00188 sample_size = 1;
00189 break;
00190 }
00191 n = buf_size / sample_size;
00192 samples = data;
00193 dst = frame;
00194
00195 switch(avctx->codec->id) {
00196 case CODEC_ID_PCM_S16LE:
00197 for(;n>0;n--) {
00198 v = *samples++;
00199 dst[0] = v & 0xff;
00200 dst[1] = v >> 8;
00201 dst += 2;
00202 }
00203 break;
00204 case CODEC_ID_PCM_S16BE:
00205 for(;n>0;n--) {
00206 v = *samples++;
00207 dst[0] = v >> 8;
00208 dst[1] = v;
00209 dst += 2;
00210 }
00211 break;
00212 case CODEC_ID_PCM_U16LE:
00213 for(;n>0;n--) {
00214 v = *samples++;
00215 v += 0x8000;
00216 dst[0] = v & 0xff;
00217 dst[1] = v >> 8;
00218 dst += 2;
00219 }
00220 break;
00221 case CODEC_ID_PCM_U16BE:
00222 for(;n>0;n--) {
00223 v = *samples++;
00224 v += 0x8000;
00225 dst[0] = v >> 8;
00226 dst[1] = v;
00227 dst += 2;
00228 }
00229 break;
00230 case CODEC_ID_PCM_S8:
00231 for(;n>0;n--) {
00232 v = *samples++;
00233 dst[0] = v >> 8;
00234 dst++;
00235 }
00236 break;
00237 case CODEC_ID_PCM_U8:
00238 for(;n>0;n--) {
00239 v = *samples++;
00240 dst[0] = (v >> 8) + 128;
00241 dst++;
00242 }
00243 break;
00244 case CODEC_ID_PCM_ALAW:
00245 for(;n>0;n--) {
00246 v = *samples++;
00247 dst[0] = linear_to_alaw[(v + 32768) >> 2];
00248 dst++;
00249 }
00250 break;
00251 case CODEC_ID_PCM_MULAW:
00252 for(;n>0;n--) {
00253 v = *samples++;
00254 dst[0] = linear_to_ulaw[(v + 32768) >> 2];
00255 dst++;
00256 }
00257 break;
00258 default:
00259 return -1;
00260 }
00261
00262
00263 return dst - frame;
00264 }
00265
00266 typedef struct PCMDecode {
00267 short table[256];
00268 } PCMDecode;
00269
00270 static int pcm_decode_init(AVCodecContext * avctx)
00271 {
00272 PCMDecode *s = avctx->priv_data;
00273 int i;
00274
00275 switch(avctx->codec->id) {
00276 case CODEC_ID_PCM_ALAW:
00277 for(i=0;i<256;i++)
00278 s->table[i] = alaw2linear(i);
00279 break;
00280 case CODEC_ID_PCM_MULAW:
00281 for(i=0;i<256;i++)
00282 s->table[i] = ulaw2linear(i);
00283 break;
00284 default:
00285 break;
00286 }
00287 return 0;
00288 }
00289
00290 static int pcm_decode_frame(AVCodecContext *avctx,
00291 void *data, int *data_size,
00292 uint8_t *buf, int buf_size)
00293 {
00294 PCMDecode *s = avctx->priv_data;
00295 int n;
00296 short *samples;
00297 uint8_t *src;
00298
00299 samples = data;
00300 src = buf;
00301
00302 if(buf_size > AVCODEC_MAX_AUDIO_FRAME_SIZE/2)
00303 buf_size = AVCODEC_MAX_AUDIO_FRAME_SIZE/2;
00304
00305 switch(avctx->codec->id) {
00306 case CODEC_ID_PCM_S16LE:
00307 n = buf_size >> 1;
00308 for(;n>0;n--) {
00309 *samples++ = src[0] | (src[1] << 8);
00310 src += 2;
00311 }
00312 break;
00313 case CODEC_ID_PCM_S16BE:
00314 n = buf_size >> 1;
00315 for(;n>0;n--) {
00316 *samples++ = (src[0] << 8) | src[1];
00317 src += 2;
00318 }
00319 break;
00320 case CODEC_ID_PCM_U16LE:
00321 n = buf_size >> 1;
00322 for(;n>0;n--) {
00323 *samples++ = (src[0] | (src[1] << 8)) - 0x8000;
00324 src += 2;
00325 }
00326 break;
00327 case CODEC_ID_PCM_U16BE:
00328 n = buf_size >> 1;
00329 for(;n>0;n--) {
00330 *samples++ = ((src[0] << 8) | src[1]) - 0x8000;
00331 src += 2;
00332 }
00333 break;
00334 case CODEC_ID_PCM_S8:
00335 n = buf_size;
00336 for(;n>0;n--) {
00337 *samples++ = src[0] << 8;
00338 src++;
00339 }
00340 break;
00341 case CODEC_ID_PCM_U8:
00342 n = buf_size;
00343 for(;n>0;n--) {
00344 *samples++ = ((int)src[0] - 128) << 8;
00345 src++;
00346 }
00347 break;
00348 case CODEC_ID_PCM_ALAW:
00349 case CODEC_ID_PCM_MULAW:
00350 n = buf_size;
00351 for(;n>0;n--) {
00352 *samples++ = s->table[src[0]];
00353 src++;
00354 }
00355 break;
00356 default:
00357 return -1;
00358 }
00359 *data_size = (uint8_t *)samples - (uint8_t *)data;
00360 return src - buf;
00361 }
00362
00363 #define PCM_CODEC(id, name) \
00364 AVCodec name ## _encoder = { \
00365 #name, \
00366 CODEC_TYPE_AUDIO, \
00367 id, \
00368 0, \
00369 pcm_encode_init, \
00370 pcm_encode_frame, \
00371 pcm_encode_close, \
00372 NULL, \
00373 }; \
00374 AVCodec name ## _decoder = { \
00375 #name, \
00376 CODEC_TYPE_AUDIO, \
00377 id, \
00378 sizeof(PCMDecode), \
00379 pcm_decode_init, \
00380 NULL, \
00381 NULL, \
00382 pcm_decode_frame, \
00383 }
00384
00385 PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le);
00386 PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be);
00387 PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le);
00388 PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be);
00389 PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8);
00390 PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8);
00391 PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw);
00392 PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw);
00393
00394 #undef PCM_CODEC