summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Ross <pross@xvid.org>2008-08-16 01:25:12 +0000
committerPeter Ross <pross@xvid.org>2008-08-16 01:25:12 +0000
commit38a1c7f2be4e0599c4c47c0b7eb55caa09c67fd4 (patch)
tree6044ad15aaaec87be1a2e7c4e39830782706a104
parent4c00864f311fbf771241e2fdbff91f688bc4a7f5 (diff)
downloadffmpeg-38a1c7f2be4e0599c4c47c0b7eb55caa09c67fd4.tar.gz
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
Originally committed as revision 14784 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/pcm.c78
1 files changed, 47 insertions, 31 deletions
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index de1e6c899f..85a2d231d6 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcm.c
@@ -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--) {