Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
authorPeter Ross <pross@xvid.org>
Sat, 16 Aug 2008 01:25:12 +0000 (01:25 +0000)
committerPeter Ross <pross@xvid.org>
Sat, 16 Aug 2008 01:25:12 +0000 (01:25 +0000)
Originally committed as revision 14784 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/pcm.c

index de1e6c899fffb5d34739f77924ba9cb66d376b79..85a2d231d6f9ff1e695494937d13c7bc9ec37342 100644 (file)
@@ -172,13 +172,6 @@ static int pcm_encode_frame(AVCodecContext *avctx,
     }
 
     switch(avctx->codec->id) {
-    case CODEC_ID_PCM_F32BE:
-    case CODEC_ID_PCM_S32BE:
-        ENCODE(int32_t, be32, samples, dst, n, 0, 0)
-        break;
-    case CODEC_ID_PCM_S32LE:
-        ENCODE(int32_t, le32, samples, dst, n, 0, 0)
-        break;
     case CODEC_ID_PCM_U32LE:
         ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000)
         break;
@@ -206,12 +199,6 @@ static int pcm_encode_frame(AVCodecContext *avctx,
             samples++;
         }
         break;
-    case CODEC_ID_PCM_S16LE:
-        ENCODE(int16_t, le16, samples, dst, n, 0, 0)
-        break;
-    case CODEC_ID_PCM_S16BE:
-        ENCODE(int16_t, be16, samples, dst, n, 0, 0)
-        break;
     case CODEC_ID_PCM_U16LE:
         ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000)
         break;
@@ -225,9 +212,30 @@ static int pcm_encode_frame(AVCodecContext *avctx,
             *dst++ = v - 128;
         }
         break;
+#if WORDS_BIGENDIAN
+    case CODEC_ID_PCM_S32LE:
+        ENCODE(int32_t, le32, samples, dst, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S16LE:
+        ENCODE(int16_t, le16, samples, dst, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_F32BE:
+    case CODEC_ID_PCM_S32BE:
+    case CODEC_ID_PCM_S16BE:
+#else
+    case CODEC_ID_PCM_F32BE:
+    case CODEC_ID_PCM_S32BE:
+        ENCODE(int32_t, be32, samples, dst, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S16BE:
+        ENCODE(int16_t, be16, samples, dst, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S32LE:
+    case CODEC_ID_PCM_S16LE:
+#endif /* WORDS_BIGENDIAN */
     case CODEC_ID_PCM_U8:
-        memcpy(dst, samples, n);
-        dst += n;
+        memcpy(dst, samples, n*sample_size);
+        dst += n*sample_size;
         break;
     case CODEC_ID_PCM_ZORK:
         for(;n>0;n--) {
@@ -347,13 +355,6 @@ static int pcm_decode_frame(AVCodecContext *avctx,
     n = buf_size/sample_size;
 
     switch(avctx->codec->id) {
-    case CODEC_ID_PCM_F32BE:
-    case CODEC_ID_PCM_S32BE:
-        DECODE(int32_t, be32, src, samples, n, 0, 0)
-        break;
-    case CODEC_ID_PCM_S32LE:
-        DECODE(int32_t, le32, src, samples, n, 0, 0)
-        break;
     case CODEC_ID_PCM_U32LE:
         DECODE(uint32_t, le32, src, samples, n, 0, 0x80000000)
         break;
@@ -380,9 +381,6 @@ static int pcm_decode_frame(AVCodecContext *avctx,
                        (ff_reverse[v & 0xff] << 8);
         }
         break;
-    case CODEC_ID_PCM_S16LE:
-        DECODE(int16_t, le16, src, samples, n, 0, 0)
-        break;
     case CODEC_ID_PCM_S16LE_PLANAR:
         n /= avctx->channels;
         for(c=0;c<avctx->channels;c++)
@@ -392,9 +390,6 @@ static int pcm_decode_frame(AVCodecContext *avctx,
                 *samples++ = bytestream_get_le16(&src2[c]);
         src = src2[avctx->channels-1];
         break;
-    case CODEC_ID_PCM_S16BE:
-        DECODE(int16_t, be16, src, samples, n, 0, 0)
-        break;
     case CODEC_ID_PCM_U16LE:
         DECODE(uint16_t, le16, src, samples, n, 0, 0x8000)
         break;
@@ -408,10 +403,31 @@ static int pcm_decode_frame(AVCodecContext *avctx,
         }
         samples= (short*)dstu8;
         break;
+#if WORDS_BIGENDIAN
+    case CODEC_ID_PCM_S32LE:
+        DECODE(int32_t, le32, src, samples, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S16LE:
+        DECODE(int16_t, le16, src, samples, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_F32BE:
+    case CODEC_ID_PCM_S32BE:
+    case CODEC_ID_PCM_S16BE:
+#else
+    case CODEC_ID_PCM_F32BE:
+    case CODEC_ID_PCM_S32BE:
+        DECODE(int32_t, be32, src, samples, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S16BE:
+        DECODE(int16_t, be16, src, samples, n, 0, 0)
+        break;
+    case CODEC_ID_PCM_S32LE:
+    case CODEC_ID_PCM_S16LE:
+#endif /* WORDS_BIGENDIAN */
     case CODEC_ID_PCM_U8:
-        memcpy(samples, src, n);
-        src += n;
-        samples = (short*)((uint8_t*)data + n);
+        memcpy(samples, src, n*sample_size);
+        src += n*sample_size;
+        samples = (short*)((uint8_t*)data + n*sample_size);
         break;
     case CODEC_ID_PCM_ZORK:
         for(;n>0;n--) {