changeset 7583:2a3f40605dec libavcodec

Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
author pross
date Sat, 16 Aug 2008 01:25:12 +0000
parents 30dbefc2d3a5
children d8717018ac03
files pcm.c
diffstat 1 files changed, 47 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/pcm.c	Fri Aug 15 10:31:11 2008 +0000
+++ b/pcm.c	Sat Aug 16 01:25:12 2008 +0000
@@ -172,13 +172,6 @@
     }
 
     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 @@
             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 @@
             *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 @@
     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 @@
                        (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 @@
                 *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 @@
         }
         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--) {