Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
[ffmpeg.git] / libavcodec / pcm.c
index de1e6c8..85a2d23 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--) {