Mercurial > libavcodec.hg
comparison pcm.c @ 6821:1b9c458d6d60 libavcodec
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
author | diego |
---|---|
date | Sat, 17 May 2008 11:42:03 +0000 |
parents | 021d6167cc11 |
children | e943e1409077 |
comparison
equal
deleted
inserted
replaced
6820:6e7d36c1f94a | 6821:1b9c458d6d60 |
---|---|
381 const uint8_t *src, *src2[MAX_CHANNELS]; | 381 const uint8_t *src, *src2[MAX_CHANNELS]; |
382 | 382 |
383 samples = data; | 383 samples = data; |
384 src = buf; | 384 src = buf; |
385 | 385 |
386 n= av_get_bits_per_sample(avctx->codec_id)/8; | 386 if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){ |
387 av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); | |
388 return -1; | |
389 } | |
390 | |
391 n = avctx->channels * av_get_bits_per_sample(avctx->codec_id)/8; | |
392 /* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */ | |
393 if (CODEC_ID_PCM_DVD == avctx->codec_id) | |
394 /* 2 samples are interleaved per block in PCM_DVD */ | |
395 n = 2 * avctx->channels * avctx->bits_per_sample/8; | |
396 | |
387 if(n && buf_size % n){ | 397 if(n && buf_size % n){ |
388 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n"); | 398 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n"); |
389 return -1; | |
390 } | |
391 if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){ | |
392 av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); | |
393 return -1; | 399 return -1; |
394 } | 400 } |
395 | 401 |
396 buf_size= FFMIN(buf_size, *data_size/2); | 402 buf_size= FFMIN(buf_size, *data_size/2); |
397 *data_size=0; | 403 *data_size=0; |
488 case CODEC_ID_PCM_ALAW: | 494 case CODEC_ID_PCM_ALAW: |
489 case CODEC_ID_PCM_MULAW: | 495 case CODEC_ID_PCM_MULAW: |
490 n = buf_size; | 496 n = buf_size; |
491 for(;n>0;n--) { | 497 for(;n>0;n--) { |
492 *samples++ = s->table[*src++]; | 498 *samples++ = s->table[*src++]; |
499 } | |
500 break; | |
501 case CODEC_ID_PCM_DVD: | |
502 if(avctx->bits_per_sample != 20 && avctx->bits_per_sample != 24) { | |
503 av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n"); | |
504 return -1; | |
505 } else { | |
506 int jump = avctx->channels * (avctx->bits_per_sample-16) / 4; | |
507 n = buf_size / (avctx->channels * 2 * avctx->bits_per_sample / 8); | |
508 while (n--) { | |
509 for (c=0; c < 2*avctx->channels; c++) | |
510 *samples++ = bytestream_get_be16(&src); | |
511 src += jump; | |
512 } | |
493 } | 513 } |
494 break; | 514 break; |
495 default: | 515 default: |
496 return -1; | 516 return -1; |
497 } | 517 } |
535 | 555 |
536 #define PCM_CODEC(id, name, long_name_) \ | 556 #define PCM_CODEC(id, name, long_name_) \ |
537 PCM_ENCODER(id,name,long_name_) PCM_DECODER(id,name,long_name_) | 557 PCM_ENCODER(id,name,long_name_) PCM_DECODER(id,name,long_name_) |
538 | 558 |
539 PCM_CODEC (CODEC_ID_PCM_ALAW, pcm_alaw, "A-law PCM"); | 559 PCM_CODEC (CODEC_ID_PCM_ALAW, pcm_alaw, "A-law PCM"); |
560 PCM_CODEC (CODEC_ID_PCM_DVD, pcm_dvd, "signed 16|20|24-bit big-endian PCM"); | |
540 PCM_CODEC (CODEC_ID_PCM_MULAW, pcm_mulaw, "mu-law PCM"); | 561 PCM_CODEC (CODEC_ID_PCM_MULAW, pcm_mulaw, "mu-law PCM"); |
541 PCM_CODEC (CODEC_ID_PCM_S8, pcm_s8, "signed 8-bit PCM"); | 562 PCM_CODEC (CODEC_ID_PCM_S8, pcm_s8, "signed 8-bit PCM"); |
542 PCM_CODEC (CODEC_ID_PCM_S16BE, pcm_s16be, "signed 16-bit big-endian PCM"); | 563 PCM_CODEC (CODEC_ID_PCM_S16BE, pcm_s16be, "signed 16-bit big-endian PCM"); |
543 PCM_CODEC (CODEC_ID_PCM_S16LE, pcm_s16le, "signed 16-bit little-endian PCM"); | 564 PCM_CODEC (CODEC_ID_PCM_S16LE, pcm_s16le, "signed 16-bit little-endian PCM"); |
544 PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR, pcm_s16le_planar, "16-bit little-endian planar PCM"); | 565 PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR, pcm_s16le_planar, "16-bit little-endian planar PCM"); |