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