00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include "avcodec.h"
00028 #include "bitstream.h"
00029 #include "bytestream.h"
00030
00031
00032
00033 #define SIGN_BIT (0x80)
00034 #define QUANT_MASK (0xf)
00035 #define NSEGS (8)
00036 #define SEG_SHIFT (4)
00037 #define SEG_MASK (0x70)
00038
00039 #define BIAS (0x84)
00040
00041
00042
00043
00044
00045 static int alaw2linear(unsigned char a_val)
00046 {
00047 int t;
00048 int seg;
00049
00050 a_val ^= 0x55;
00051
00052 t = a_val & QUANT_MASK;
00053 seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
00054 if(seg) t= (t + t + 1 + 32) << (seg + 2);
00055 else t= (t + t + 1 ) << 3;
00056
00057 return ((a_val & SIGN_BIT) ? t : -t);
00058 }
00059
00060 static int ulaw2linear(unsigned char u_val)
00061 {
00062 int t;
00063
00064
00065 u_val = ~u_val;
00066
00067
00068
00069
00070
00071 t = ((u_val & QUANT_MASK) << 3) + BIAS;
00072 t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
00073
00074 return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
00075 }
00076
00077
00078 static uint8_t linear_to_alaw[16384];
00079 static uint8_t linear_to_ulaw[16384];
00080
00081 static void build_xlaw_table(uint8_t *linear_to_xlaw,
00082 int (*xlaw2linear)(unsigned char),
00083 int mask)
00084 {
00085 int i, j, v, v1, v2;
00086
00087 j = 0;
00088 for(i=0;i<128;i++) {
00089 if (i != 127) {
00090 v1 = xlaw2linear(i ^ mask);
00091 v2 = xlaw2linear((i + 1) ^ mask);
00092 v = (v1 + v2 + 4) >> 3;
00093 } else {
00094 v = 8192;
00095 }
00096 for(;j<v;j++) {
00097 linear_to_xlaw[8192 + j] = (i ^ mask);
00098 if (j > 0)
00099 linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80));
00100 }
00101 }
00102 linear_to_xlaw[0] = linear_to_xlaw[1];
00103 }
00104
00105 static int pcm_encode_init(AVCodecContext *avctx)
00106 {
00107 avctx->frame_size = 1;
00108 switch(avctx->codec->id) {
00109 case CODEC_ID_PCM_ALAW:
00110 build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
00111 break;
00112 case CODEC_ID_PCM_MULAW:
00113 build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
00114 break;
00115 default:
00116 break;
00117 }
00118
00119 switch(avctx->codec->id) {
00120 case CODEC_ID_PCM_S32LE:
00121 case CODEC_ID_PCM_S32BE:
00122 case CODEC_ID_PCM_U32LE:
00123 case CODEC_ID_PCM_U32BE:
00124 avctx->block_align = 4 * avctx->channels;
00125 break;
00126 case CODEC_ID_PCM_S24LE:
00127 case CODEC_ID_PCM_S24BE:
00128 case CODEC_ID_PCM_U24LE:
00129 case CODEC_ID_PCM_U24BE:
00130 case CODEC_ID_PCM_S24DAUD:
00131 avctx->block_align = 3 * avctx->channels;
00132 break;
00133 case CODEC_ID_PCM_S16LE:
00134 case CODEC_ID_PCM_S16BE:
00135 case CODEC_ID_PCM_U16LE:
00136 case CODEC_ID_PCM_U16BE:
00137 avctx->block_align = 2 * avctx->channels;
00138 break;
00139 case CODEC_ID_PCM_S8:
00140 case CODEC_ID_PCM_U8:
00141 case CODEC_ID_PCM_MULAW:
00142 case CODEC_ID_PCM_ALAW:
00143 avctx->block_align = avctx->channels;
00144 break;
00145 default:
00146 break;
00147 }
00148
00149 avctx->coded_frame= avcodec_alloc_frame();
00150 avctx->coded_frame->key_frame= 1;
00151
00152 return 0;
00153 }
00154
00155 static int pcm_encode_close(AVCodecContext *avctx)
00156 {
00157 av_freep(&avctx->coded_frame);
00158
00159 return 0;
00160 }
00161
00171 static inline void encode_from16(int bps, int le, int us,
00172 short **samples, uint8_t **dst, int n) {
00173 int usum = us ? 0x8000 : 0;
00174 if (bps > 2)
00175 memset(*dst, 0, n * bps);
00176 if (le) *dst += bps - 2;
00177 for(;n>0;n--) {
00178 register int v = *(*samples)++;
00179 v += usum;
00180 if (le) AV_WL16(*dst, v);
00181 else AV_WB16(*dst, v);
00182 *dst += bps;
00183 }
00184 if (le) *dst -= bps - 2;
00185 }
00186
00187 static int pcm_encode_frame(AVCodecContext *avctx,
00188 unsigned char *frame, int buf_size, void *data)
00189 {
00190 int n, sample_size, v;
00191 short *samples;
00192 unsigned char *dst;
00193
00194 switch(avctx->codec->id) {
00195 case CODEC_ID_PCM_S32LE:
00196 case CODEC_ID_PCM_S32BE:
00197 case CODEC_ID_PCM_U32LE:
00198 case CODEC_ID_PCM_U32BE:
00199 sample_size = 4;
00200 break;
00201 case CODEC_ID_PCM_S24LE:
00202 case CODEC_ID_PCM_S24BE:
00203 case CODEC_ID_PCM_U24LE:
00204 case CODEC_ID_PCM_U24BE:
00205 case CODEC_ID_PCM_S24DAUD:
00206 sample_size = 3;
00207 break;
00208 case CODEC_ID_PCM_S16LE:
00209 case CODEC_ID_PCM_S16BE:
00210 case CODEC_ID_PCM_U16LE:
00211 case CODEC_ID_PCM_U16BE:
00212 sample_size = 2;
00213 break;
00214 default:
00215 sample_size = 1;
00216 break;
00217 }
00218 n = buf_size / sample_size;
00219 samples = data;
00220 dst = frame;
00221
00222 switch(avctx->codec->id) {
00223 case CODEC_ID_PCM_S32LE:
00224 encode_from16(4, 1, 0, &samples, &dst, n);
00225 break;
00226 case CODEC_ID_PCM_S32BE:
00227 encode_from16(4, 0, 0, &samples, &dst, n);
00228 break;
00229 case CODEC_ID_PCM_U32LE:
00230 encode_from16(4, 1, 1, &samples, &dst, n);
00231 break;
00232 case CODEC_ID_PCM_U32BE:
00233 encode_from16(4, 0, 1, &samples, &dst, n);
00234 break;
00235 case CODEC_ID_PCM_S24LE:
00236 encode_from16(3, 1, 0, &samples, &dst, n);
00237 break;
00238 case CODEC_ID_PCM_S24BE:
00239 encode_from16(3, 0, 0, &samples, &dst, n);
00240 break;
00241 case CODEC_ID_PCM_U24LE:
00242 encode_from16(3, 1, 1, &samples, &dst, n);
00243 break;
00244 case CODEC_ID_PCM_U24BE:
00245 encode_from16(3, 0, 1, &samples, &dst, n);
00246 break;
00247 case CODEC_ID_PCM_S24DAUD:
00248 for(;n>0;n--) {
00249 uint32_t tmp = ff_reverse[*samples >> 8] +
00250 (ff_reverse[*samples & 0xff] << 8);
00251 tmp <<= 4;
00252 bytestream_put_be24(&dst, tmp);
00253 samples++;
00254 }
00255 break;
00256 case CODEC_ID_PCM_S16LE:
00257 for(;n>0;n--) {
00258 v = *samples++;
00259 bytestream_put_le16(&dst, v);
00260 }
00261 break;
00262 case CODEC_ID_PCM_S16BE:
00263 for(;n>0;n--) {
00264 v = *samples++;
00265 bytestream_put_be16(&dst, v);
00266 }
00267 break;
00268 case CODEC_ID_PCM_U16LE:
00269 for(;n>0;n--) {
00270 v = *samples++;
00271 v += 0x8000;
00272 bytestream_put_le16(&dst, v);
00273 }
00274 break;
00275 case CODEC_ID_PCM_U16BE:
00276 for(;n>0;n--) {
00277 v = *samples++;
00278 v += 0x8000;
00279 bytestream_put_be16(&dst, v);
00280 }
00281 break;
00282 case CODEC_ID_PCM_S8:
00283 for(;n>0;n--) {
00284 v = *samples++;
00285 *dst++ = v >> 8;
00286 }
00287 break;
00288 case CODEC_ID_PCM_U8:
00289 for(;n>0;n--) {
00290 v = *samples++;
00291 *dst++ = (v >> 8) + 128;
00292 }
00293 break;
00294 case CODEC_ID_PCM_ZORK:
00295 for(;n>0;n--) {
00296 v= *samples++ >> 8;
00297 if(v<0) v = -v;
00298 else v+= 128;
00299 *dst++ = v;
00300 }
00301 break;
00302 case CODEC_ID_PCM_ALAW:
00303 for(;n>0;n--) {
00304 v = *samples++;
00305 *dst++ = linear_to_alaw[(v + 32768) >> 2];
00306 }
00307 break;
00308 case CODEC_ID_PCM_MULAW:
00309 for(;n>0;n--) {
00310 v = *samples++;
00311 *dst++ = linear_to_ulaw[(v + 32768) >> 2];
00312 }
00313 break;
00314 default:
00315 return -1;
00316 }
00317
00318
00319 return dst - frame;
00320 }
00321
00322 typedef struct PCMDecode {
00323 short table[256];
00324 } PCMDecode;
00325
00326 static int pcm_decode_init(AVCodecContext * avctx)
00327 {
00328 PCMDecode *s = avctx->priv_data;
00329 int i;
00330
00331 switch(avctx->codec->id) {
00332 case CODEC_ID_PCM_ALAW:
00333 for(i=0;i<256;i++)
00334 s->table[i] = alaw2linear(i);
00335 break;
00336 case CODEC_ID_PCM_MULAW:
00337 for(i=0;i<256;i++)
00338 s->table[i] = ulaw2linear(i);
00339 break;
00340 default:
00341 break;
00342 }
00343 return 0;
00344 }
00345
00355 static inline void decode_to16(int bps, int le, int us,
00356 uint8_t **src, short **samples, int src_len)
00357 {
00358 int usum = us ? -0x8000 : 0;
00359 register int n = src_len / bps;
00360 if (le) *src += bps - 2;
00361 for(;n>0;n--) {
00362 register int v;
00363 if (le) v = AV_RL16(*src);
00364 else v = AV_RB16(*src);
00365 v += usum;
00366 *(*samples)++ = v;
00367 *src += bps;
00368 }
00369 if (le) *src -= bps - 2;
00370 }
00371
00372 static int pcm_decode_frame(AVCodecContext *avctx,
00373 void *data, int *data_size,
00374 uint8_t *buf, int buf_size)
00375 {
00376 PCMDecode *s = avctx->priv_data;
00377 int n;
00378 short *samples;
00379 uint8_t *src;
00380
00381 samples = data;
00382 src = buf;
00383
00384 n= av_get_bits_per_sample(avctx->codec_id)/8;
00385 if(n && buf_size % n){
00386 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n");
00387 return -1;
00388 }
00389
00390 buf_size= FFMIN(buf_size, *data_size/2);
00391 *data_size=0;
00392
00393 switch(avctx->codec->id) {
00394 case CODEC_ID_PCM_S32LE:
00395 decode_to16(4, 1, 0, &src, &samples, buf_size);
00396 break;
00397 case CODEC_ID_PCM_S32BE:
00398 decode_to16(4, 0, 0, &src, &samples, buf_size);
00399 break;
00400 case CODEC_ID_PCM_U32LE:
00401 decode_to16(4, 1, 1, &src, &samples, buf_size);
00402 break;
00403 case CODEC_ID_PCM_U32BE:
00404 decode_to16(4, 0, 1, &src, &samples, buf_size);
00405 break;
00406 case CODEC_ID_PCM_S24LE:
00407 decode_to16(3, 1, 0, &src, &samples, buf_size);
00408 break;
00409 case CODEC_ID_PCM_S24BE:
00410 decode_to16(3, 0, 0, &src, &samples, buf_size);
00411 break;
00412 case CODEC_ID_PCM_U24LE:
00413 decode_to16(3, 1, 1, &src, &samples, buf_size);
00414 break;
00415 case CODEC_ID_PCM_U24BE:
00416 decode_to16(3, 0, 1, &src, &samples, buf_size);
00417 break;
00418 case CODEC_ID_PCM_S24DAUD:
00419 n = buf_size / 3;
00420 for(;n>0;n--) {
00421 uint32_t v = bytestream_get_be24(&src);
00422 v >>= 4;
00423 *samples++ = ff_reverse[(v >> 8) & 0xff] +
00424 (ff_reverse[v & 0xff] << 8);
00425 }
00426 break;
00427 case CODEC_ID_PCM_S16LE:
00428 n = buf_size >> 1;
00429 for(;n>0;n--) {
00430 *samples++ = bytestream_get_le16(&src);
00431 }
00432 break;
00433 case CODEC_ID_PCM_S16BE:
00434 n = buf_size >> 1;
00435 for(;n>0;n--) {
00436 *samples++ = bytestream_get_be16(&src);
00437 }
00438 break;
00439 case CODEC_ID_PCM_U16LE:
00440 n = buf_size >> 1;
00441 for(;n>0;n--) {
00442 *samples++ = bytestream_get_le16(&src) - 0x8000;
00443 }
00444 break;
00445 case CODEC_ID_PCM_U16BE:
00446 n = buf_size >> 1;
00447 for(;n>0;n--) {
00448 *samples++ = bytestream_get_be16(&src) - 0x8000;
00449 }
00450 break;
00451 case CODEC_ID_PCM_S8:
00452 n = buf_size;
00453 for(;n>0;n--) {
00454 *samples++ = *src++ << 8;
00455 }
00456 break;
00457 case CODEC_ID_PCM_U8:
00458 n = buf_size;
00459 for(;n>0;n--) {
00460 *samples++ = ((int)*src++ - 128) << 8;
00461 }
00462 break;
00463 case CODEC_ID_PCM_ZORK:
00464 n = buf_size;
00465 for(;n>0;n--) {
00466 int x= *src++;
00467 if(x&128) x-= 128;
00468 else x = -x;
00469 *samples++ = x << 8;
00470 }
00471 break;
00472 case CODEC_ID_PCM_ALAW:
00473 case CODEC_ID_PCM_MULAW:
00474 n = buf_size;
00475 for(;n>0;n--) {
00476 *samples++ = s->table[*src++];
00477 }
00478 break;
00479 default:
00480 return -1;
00481 }
00482 *data_size = (uint8_t *)samples - (uint8_t *)data;
00483 return src - buf;
00484 }
00485
00486 #ifdef CONFIG_ENCODERS
00487 #define PCM_ENCODER(id,name) \
00488 AVCodec name ## _encoder = { \
00489 #name, \
00490 CODEC_TYPE_AUDIO, \
00491 id, \
00492 0, \
00493 pcm_encode_init, \
00494 pcm_encode_frame, \
00495 pcm_encode_close, \
00496 NULL, \
00497 };
00498 #else
00499 #define PCM_ENCODER(id,name)
00500 #endif
00501
00502 #ifdef CONFIG_DECODERS
00503 #define PCM_DECODER(id,name) \
00504 AVCodec name ## _decoder = { \
00505 #name, \
00506 CODEC_TYPE_AUDIO, \
00507 id, \
00508 sizeof(PCMDecode), \
00509 pcm_decode_init, \
00510 NULL, \
00511 NULL, \
00512 pcm_decode_frame, \
00513 };
00514 #else
00515 #define PCM_DECODER(id,name)
00516 #endif
00517
00518 #define PCM_CODEC(id, name) \
00519 PCM_ENCODER(id,name) PCM_DECODER(id,name)
00520
00521 PCM_CODEC(CODEC_ID_PCM_S32LE, pcm_s32le);
00522 PCM_CODEC(CODEC_ID_PCM_S32BE, pcm_s32be);
00523 PCM_CODEC(CODEC_ID_PCM_U32LE, pcm_u32le);
00524 PCM_CODEC(CODEC_ID_PCM_U32BE, pcm_u32be);
00525 PCM_CODEC(CODEC_ID_PCM_S24LE, pcm_s24le);
00526 PCM_CODEC(CODEC_ID_PCM_S24BE, pcm_s24be);
00527 PCM_CODEC(CODEC_ID_PCM_U24LE, pcm_u24le);
00528 PCM_CODEC(CODEC_ID_PCM_U24BE, pcm_u24be);
00529 PCM_CODEC(CODEC_ID_PCM_S24DAUD, pcm_s24daud);
00530 PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le);
00531 PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be);
00532 PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le);
00533 PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be);
00534 PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8);
00535 PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8);
00536 PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw);
00537 PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw);
00538 PCM_CODEC(CODEC_ID_PCM_ZORK, pcm_zork);