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");