76
79
/* 16384 entries per table */
77
static uint8_t *linear_to_alaw = NULL;
78
static int linear_to_alaw_ref = 0;
80
static uint8_t *linear_to_ulaw = NULL;
81
static int linear_to_ulaw_ref = 0;
83
static void build_xlaw_table(uint8_t *linear_to_xlaw,
80
static uint8_t linear_to_alaw[16384];
81
static uint8_t linear_to_ulaw[16384];
83
static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw,
84
84
int (*xlaw2linear)(unsigned char),
104
104
linear_to_xlaw[0] = linear_to_xlaw[1];
107
static int pcm_encode_init(AVCodecContext *avctx)
107
static av_cold int pcm_encode_init(AVCodecContext *avctx)
109
109
avctx->frame_size = 1;
110
110
switch(avctx->codec->id) {
111
111
case CODEC_ID_PCM_ALAW:
112
if (linear_to_alaw_ref == 0) {
113
linear_to_alaw = av_malloc(16384);
116
build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
118
linear_to_alaw_ref++;
112
build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
120
114
case CODEC_ID_PCM_MULAW:
121
if (linear_to_ulaw_ref == 0) {
122
linear_to_ulaw = av_malloc(16384);
125
build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
127
linear_to_ulaw_ref++;
115
build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
198
173
static inline void encode_from16(int bps, int le, int us,
199
174
short **samples, uint8_t **dst, int n) {
175
int usum = us ? 0x8000 : 0;
201
177
memset(*dst, 0, n * bps);
202
178
if (le) *dst += bps - 2;
204
180
register int v = *(*samples)++;
182
if (le) AV_WL16(*dst, v);
183
else AV_WB16(*dst, v);
210
186
if (le) *dst -= bps - 2;
275
251
uint32_t tmp = ff_reverse[*samples >> 8] +
276
252
(ff_reverse[*samples & 0xff] << 8);
277
253
tmp <<= 4; // sync flags would go here
254
bytestream_put_be24(&dst, tmp);
286
258
case CODEC_ID_PCM_S16LE:
261
bytestream_put_le16(&dst, v);
294
264
case CODEC_ID_PCM_S16BE:
267
bytestream_put_be16(&dst, v);
302
270
case CODEC_ID_PCM_U16LE:
274
bytestream_put_le16(&dst, v);
311
277
case CODEC_ID_PCM_U16BE:
281
bytestream_put_be16(&dst, v);
320
284
case CODEC_ID_PCM_S8:
327
290
case CODEC_ID_PCM_U8:
330
dst[0] = (v >> 8) + 128;
293
*dst++ = (v >> 8) + 128;
296
case CODEC_ID_PCM_ZORK:
334
304
case CODEC_ID_PCM_ALAW:
337
dst[0] = linear_to_alaw[(v + 32768) >> 2];
307
*dst++ = linear_to_alaw[(v + 32768) >> 2];
341
310
case CODEC_ID_PCM_MULAW:
344
dst[0] = linear_to_ulaw[(v + 32768) >> 2];
313
*dst++ = linear_to_ulaw[(v + 32768) >> 2];
387
355
* \param src_len number of bytes in src
389
357
static inline void decode_to16(int bps, int le, int us,
390
uint8_t **src, short **samples, int src_len)
358
const uint8_t **src, short **samples, int src_len)
360
int usum = us ? -0x8000 : 0;
392
361
register int n = src_len / bps;
393
362
if (le) *src += bps - 2;
395
*(*samples)++ = ((*src)[le] << 8 | (*src)[1 - le]) - (us?0x8000:0);
365
if (le) v = AV_RL16(*src);
366
else v = AV_RB16(*src);
398
371
if (le) *src -= bps - 2;
401
374
static int pcm_decode_frame(AVCodecContext *avctx,
402
375
void *data, int *data_size,
403
uint8_t *buf, int buf_size)
376
const uint8_t *buf, int buf_size)
405
378
PCMDecode *s = avctx->priv_data;
381
const uint8_t *src, *src2[MAX_CHANNELS];
415
388
av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n");
391
if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){
392
av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n");
419
396
buf_size= FFMIN(buf_size, *data_size/2);
399
n = buf_size/avctx->channels;
400
for(c=0;c<avctx->channels;c++)
422
403
switch(avctx->codec->id) {
423
404
case CODEC_ID_PCM_S32LE:
424
405
decode_to16(4, 1, 0, &src, &samples, buf_size);
447
428
case CODEC_ID_PCM_S24DAUD:
448
429
n = buf_size / 3;
450
uint32_t v = src[0] << 16 | src[1] << 8 | src[2];
431
uint32_t v = bytestream_get_be24(&src);
451
432
v >>= 4; // sync flags are here
452
433
*samples++ = ff_reverse[(v >> 8) & 0xff] +
453
434
(ff_reverse[v & 0xff] << 8);
457
437
case CODEC_ID_PCM_S16LE:
458
438
n = buf_size >> 1;
460
*samples++ = src[0] | (src[1] << 8);
440
*samples++ = bytestream_get_le16(&src);
443
case CODEC_ID_PCM_S16LE_PLANAR:
445
for(c=0;c<avctx->channels;c++)
446
*samples++ = bytestream_get_le16(&src2[c]);
447
src = src2[avctx->channels-1];
464
449
case CODEC_ID_PCM_S16BE:
465
450
n = buf_size >> 1;
467
*samples++ = (src[0] << 8) | src[1];
452
*samples++ = bytestream_get_be16(&src);
471
455
case CODEC_ID_PCM_U16LE:
472
456
n = buf_size >> 1;
474
*samples++ = (src[0] | (src[1] << 8)) - 0x8000;
458
*samples++ = bytestream_get_le16(&src) - 0x8000;
478
461
case CODEC_ID_PCM_U16BE:
479
462
n = buf_size >> 1;
481
*samples++ = ((src[0] << 8) | src[1]) - 0x8000;
464
*samples++ = bytestream_get_be16(&src) - 0x8000;
485
467
case CODEC_ID_PCM_S8:
488
*samples++ = src[0] << 8;
470
*samples++ = *src++ << 8;
492
473
case CODEC_ID_PCM_U8:
495
*samples++ = ((int)src[0] - 128) << 8;
476
*samples++ = ((int)*src++ - 128) << 8;
479
case CODEC_ID_PCM_ZORK:
499
488
case CODEC_ID_PCM_ALAW:
500
489
case CODEC_ID_PCM_MULAW:
503
*samples++ = s->table[src[0]];
492
*samples++ = s->table[*src++];
533
528
pcm_decode_frame, \
536
PCM_CODEC(CODEC_ID_PCM_S32LE, pcm_s32le);
537
PCM_CODEC(CODEC_ID_PCM_S32BE, pcm_s32be);
538
PCM_CODEC(CODEC_ID_PCM_U32LE, pcm_u32le);
539
PCM_CODEC(CODEC_ID_PCM_U32BE, pcm_u32be);
540
PCM_CODEC(CODEC_ID_PCM_S24LE, pcm_s24le);
541
PCM_CODEC(CODEC_ID_PCM_S24BE, pcm_s24be);
542
PCM_CODEC(CODEC_ID_PCM_U24LE, pcm_u24le);
543
PCM_CODEC(CODEC_ID_PCM_U24BE, pcm_u24be);
544
PCM_CODEC(CODEC_ID_PCM_S24DAUD, pcm_s24daud);
545
PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le);
546
PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be);
547
PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le);
548
PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be);
549
PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8);
550
PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8);
551
PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw);
552
PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw);
531
#define PCM_DECODER(id,name)
534
#define PCM_CODEC(id, name) \
535
PCM_ENCODER(id,name) PCM_DECODER(id,name)
537
PCM_CODEC (CODEC_ID_PCM_ALAW, pcm_alaw);
538
PCM_CODEC (CODEC_ID_PCM_MULAW, pcm_mulaw);
539
PCM_CODEC (CODEC_ID_PCM_S8, pcm_s8);
540
PCM_CODEC (CODEC_ID_PCM_S16BE, pcm_s16be);
541
PCM_CODEC (CODEC_ID_PCM_S16LE, pcm_s16le);
542
PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR, pcm_s16le_planar);
543
PCM_CODEC (CODEC_ID_PCM_S24BE, pcm_s24be);
544
PCM_CODEC (CODEC_ID_PCM_S24DAUD, pcm_s24daud);
545
PCM_CODEC (CODEC_ID_PCM_S24LE, pcm_s24le);
546
PCM_CODEC (CODEC_ID_PCM_S32BE, pcm_s32be);
547
PCM_CODEC (CODEC_ID_PCM_S32LE, pcm_s32le);
548
PCM_CODEC (CODEC_ID_PCM_U8, pcm_u8);
549
PCM_CODEC (CODEC_ID_PCM_U16BE, pcm_u16be);
550
PCM_CODEC (CODEC_ID_PCM_U16LE, pcm_u16le);
551
PCM_CODEC (CODEC_ID_PCM_U24BE, pcm_u24be);
552
PCM_CODEC (CODEC_ID_PCM_U24LE, pcm_u24le);
553
PCM_CODEC (CODEC_ID_PCM_U32BE, pcm_u32be);
554
PCM_CODEC (CODEC_ID_PCM_U32LE, pcm_u32le);
555
PCM_CODEC (CODEC_ID_PCM_ZORK, pcm_zork);