Mercurial > libavcodec.hg
comparison pcm.c @ 5940:d63186919b60 libavcodec
add pcm_s16le_planar support for electronicarts files
author | aurel |
---|---|
date | Sun, 25 Nov 2007 16:32:47 +0000 |
parents | 6814207ffb27 |
children | 0203d969bcd5 |
comparison
equal
deleted
inserted
replaced
5939:b47573cb7401 | 5940:d63186919b60 |
---|---|
25 */ | 25 */ |
26 | 26 |
27 #include "avcodec.h" | 27 #include "avcodec.h" |
28 #include "bitstream.h" // for ff_reverse | 28 #include "bitstream.h" // for ff_reverse |
29 #include "bytestream.h" | 29 #include "bytestream.h" |
30 | |
31 #define MAX_CHANNELS 64 | |
30 | 32 |
31 /* from g711.c by SUN microsystems (unrestricted use) */ | 33 /* from g711.c by SUN microsystems (unrestricted use) */ |
32 | 34 |
33 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ | 35 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ |
34 #define QUANT_MASK (0xf) /* Quantization field mask. */ | 36 #define QUANT_MASK (0xf) /* Quantization field mask. */ |
372 static int pcm_decode_frame(AVCodecContext *avctx, | 374 static int pcm_decode_frame(AVCodecContext *avctx, |
373 void *data, int *data_size, | 375 void *data, int *data_size, |
374 uint8_t *buf, int buf_size) | 376 uint8_t *buf, int buf_size) |
375 { | 377 { |
376 PCMDecode *s = avctx->priv_data; | 378 PCMDecode *s = avctx->priv_data; |
377 int n; | 379 int c, n; |
378 short *samples; | 380 short *samples; |
379 uint8_t *src; | 381 uint8_t *src, *src2[MAX_CHANNELS]; |
380 | 382 |
381 samples = data; | 383 samples = data; |
382 src = buf; | 384 src = buf; |
383 | 385 |
384 n= av_get_bits_per_sample(avctx->codec_id)/8; | 386 n= av_get_bits_per_sample(avctx->codec_id)/8; |
385 if(n && buf_size % n){ | 387 if((n && buf_size % n) || avctx->channels > MAX_CHANNELS){ |
386 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n"); | 388 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n"); |
387 return -1; | 389 return -1; |
388 } | 390 } |
389 | 391 |
390 buf_size= FFMIN(buf_size, *data_size/2); | 392 buf_size= FFMIN(buf_size, *data_size/2); |
391 *data_size=0; | 393 *data_size=0; |
394 | |
395 n = buf_size/avctx->channels; | |
396 for(c=0;c<avctx->channels;c++) | |
397 src2[c] = &src[c*n]; | |
392 | 398 |
393 switch(avctx->codec->id) { | 399 switch(avctx->codec->id) { |
394 case CODEC_ID_PCM_S32LE: | 400 case CODEC_ID_PCM_S32LE: |
395 decode_to16(4, 1, 0, &src, &samples, buf_size); | 401 decode_to16(4, 1, 0, &src, &samples, buf_size); |
396 break; | 402 break; |
427 case CODEC_ID_PCM_S16LE: | 433 case CODEC_ID_PCM_S16LE: |
428 n = buf_size >> 1; | 434 n = buf_size >> 1; |
429 for(;n>0;n--) { | 435 for(;n>0;n--) { |
430 *samples++ = bytestream_get_le16(&src); | 436 *samples++ = bytestream_get_le16(&src); |
431 } | 437 } |
438 break; | |
439 case CODEC_ID_PCM_S16LE_PLANAR: | |
440 for(n>>=1;n>0;n--) | |
441 for(c=0;c<avctx->channels;c++) | |
442 *samples++ = bytestream_get_le16(&src2[c]); | |
443 src = src2[avctx->channels-1]; | |
432 break; | 444 break; |
433 case CODEC_ID_PCM_S16BE: | 445 case CODEC_ID_PCM_S16BE: |
434 n = buf_size >> 1; | 446 n = buf_size >> 1; |
435 for(;n>0;n--) { | 447 for(;n>0;n--) { |
436 *samples++ = bytestream_get_be16(&src); | 448 *samples++ = bytestream_get_be16(&src); |
526 PCM_CODEC(CODEC_ID_PCM_S24BE, pcm_s24be); | 538 PCM_CODEC(CODEC_ID_PCM_S24BE, pcm_s24be); |
527 PCM_CODEC(CODEC_ID_PCM_U24LE, pcm_u24le); | 539 PCM_CODEC(CODEC_ID_PCM_U24LE, pcm_u24le); |
528 PCM_CODEC(CODEC_ID_PCM_U24BE, pcm_u24be); | 540 PCM_CODEC(CODEC_ID_PCM_U24BE, pcm_u24be); |
529 PCM_CODEC(CODEC_ID_PCM_S24DAUD, pcm_s24daud); | 541 PCM_CODEC(CODEC_ID_PCM_S24DAUD, pcm_s24daud); |
530 PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le); | 542 PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le); |
543 PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR, pcm_s16le_planar); | |
531 PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be); | 544 PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be); |
532 PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le); | 545 PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le); |
533 PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be); | 546 PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be); |
534 PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8); | 547 PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8); |
535 PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8); | 548 PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8); |