diff options
author | Peter Ross <pross@xvid.org> | 2008-08-07 09:23:56 +0000 |
---|---|---|
committer | Peter Ross <pross@xvid.org> | 2008-08-07 09:23:56 +0000 |
commit | ff66caab402c2768017dfad8979afb0e79a70a7a (patch) | |
tree | 05fdf483dd7c7caa2f01cb5c1192df438b4ebc54 /libavcodec/pcm.c | |
parent | 13dbd9b705f016926e25261064463968c78ca93d (diff) | |
download | ffmpeg-ff66caab402c2768017dfad8979afb0e79a70a7a.tar.gz |
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
Originally committed as revision 14659 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/pcm.c')
-rw-r--r-- | libavcodec/pcm.c | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 3b61518509..930242ea96 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -339,7 +339,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { PCMDecode *s = avctx->priv_data; - int c, n; + int sample_size, c, n; short *samples; const uint8_t *src, *src2[MAX_CHANNELS]; @@ -351,7 +351,9 @@ static int pcm_decode_frame(AVCodecContext *avctx, return -1; } - n = avctx->channels * av_get_bits_per_sample(avctx->codec_id)/8; + sample_size = av_get_bits_per_sample(avctx->codec_id)/8; + + n = avctx->channels * sample_size; /* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */ if (CODEC_ID_PCM_DVD == avctx->codec_id) /* 2 samples are interleaved per block in PCM_DVD */ @@ -365,15 +367,12 @@ static int pcm_decode_frame(AVCodecContext *avctx, buf_size= FFMIN(buf_size, *data_size/2); *data_size=0; - n = buf_size/avctx->channels; - for(c=0;c<avctx->channels;c++) - src2[c] = &src[c*n]; + n = buf_size/sample_size; switch(avctx->codec->id) { case CODEC_ID_PCM_F32BE: { float *fsamples = data; - n = buf_size >> 2; for(;n>0;n--) *fsamples++ = av_int2flt(bytestream_get_be32(&src)); samples = (void*)fsamples; @@ -404,7 +403,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, decode_to16(3, 0, 1, &src, &samples, buf_size); break; case CODEC_ID_PCM_S24DAUD: - n = buf_size / 3; for(;n>0;n--) { uint32_t v = bytestream_get_be24(&src); v >>= 4; // sync flags are here @@ -413,49 +411,45 @@ static int pcm_decode_frame(AVCodecContext *avctx, } break; case CODEC_ID_PCM_S16LE: - n = buf_size >> 1; for(;n>0;n--) { *samples++ = bytestream_get_le16(&src); } break; case CODEC_ID_PCM_S16LE_PLANAR: + n /= avctx->channels; + for(c=0;c<avctx->channels;c++) + src2[c] = &src[c*n]; for(n>>=1;n>0;n--) for(c=0;c<avctx->channels;c++) *samples++ = bytestream_get_le16(&src2[c]); src = src2[avctx->channels-1]; break; case CODEC_ID_PCM_S16BE: - n = buf_size >> 1; for(;n>0;n--) { *samples++ = bytestream_get_be16(&src); } break; case CODEC_ID_PCM_U16LE: - n = buf_size >> 1; for(;n>0;n--) { *samples++ = bytestream_get_le16(&src) - 0x8000; } break; case CODEC_ID_PCM_U16BE: - n = buf_size >> 1; for(;n>0;n--) { *samples++ = bytestream_get_be16(&src) - 0x8000; } break; case CODEC_ID_PCM_S8: - n = buf_size; for(;n>0;n--) { *samples++ = *src++ << 8; } break; case CODEC_ID_PCM_U8: - n = buf_size; for(;n>0;n--) { *samples++ = ((int)*src++ - 128) << 8; } break; case CODEC_ID_PCM_ZORK: - n = buf_size; for(;n>0;n--) { int x= *src++; if(x&128) x-= 128; @@ -465,7 +459,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, break; case CODEC_ID_PCM_ALAW: case CODEC_ID_PCM_MULAW: - n = buf_size; for(;n>0;n--) { *samples++ = s->table[*src++]; } |