From ff66caab402c2768017dfad8979afb0e79a70a7a Mon Sep 17 00:00:00 2001
From: Peter Ross <pross@xvid.org>
Date: Thu, 7 Aug 2008 09:23:56 +0000
Subject: [PATCH] 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
---
 libavcodec/pcm.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index 3b615185091..930242ea963 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++];
         }
-- 
GitLab