[FFmpeg-cvslog] r14660 - trunk/libavcodec/pcm.c
pross
subversion
Thu Aug 7 11:32:10 CEST 2008
Author: pross
Date: Thu Aug 7 11:32:10 2008
New Revision: 14660
Log:
Add simpler/cleaner/faster F32BE encoding/decoding.
Modified:
trunk/libavcodec/pcm.c
Modified: trunk/libavcodec/pcm.c
==============================================================================
--- trunk/libavcodec/pcm.c (original)
+++ trunk/libavcodec/pcm.c Thu Aug 7 11:32:10 2008
@@ -160,6 +160,24 @@ static inline void encode_from16(int bps
if (le) *dst -= bps - 2;
}
+/**
+ * Write PCM samples macro
+ * @param type Datatype of native machine format
+ * @param endian bytestream_put_xxx() suffix
+ * @param src Source pointer (variable name)
+ * @param dst Destination pointer (variable name)
+ * @param n Total number of samples (variable name)
+ * @param offset Sample value offset
+ */
+#define ENCODE(type, endian, src, dst, n, offset) \
+{ \
+ type *samples = src; \
+ for(;n>0;n--) { \
+ register type v = *samples++ + offset; \
+ bytestream_put_##endian(&dst, v); \
+ } \
+}
+
static int pcm_encode_frame(AVCodecContext *avctx,
unsigned char *frame, int buf_size, void *data)
{
@@ -174,14 +192,7 @@ static int pcm_encode_frame(AVCodecConte
switch(avctx->codec->id) {
case CODEC_ID_PCM_F32BE:
- {
- float *fsamples = data;
- for(;n>0;n--) {
- float fv = *fsamples++;
- bytestream_put_be32(&dst, av_flt2int(fv));
- }
- samples = (void*)fsamples;
- }
+ ENCODE(int32_t, be32, samples, dst, n, 0)
break;
case CODEC_ID_PCM_S32LE:
encode_from16(4, 1, 0, &samples, &dst, n);
@@ -334,6 +345,25 @@ static inline void decode_to16(int bps,
if (le) *src -= bps - 2;
}
+/**
+ * Read PCM samples macro
+ * @param type Datatype of native machine format
+ * @param endian bytestream_get_xxx() endian suffix
+ * @param src Source pointer (variable name)
+ * @param dst Destination pointer (variable name)
+ * @param n Total number of samples (variable name)
+ * @param offset Sample value offset
+ */
+#define DECODE(type, endian, src, dst, n, offset) \
+{ \
+ type *dst2 = (type*)dst; \
+ for(;n>0;n--) { \
+ register type v = bytestream_get_##endian(&src); \
+ *dst2++ = v - offset; \
+ } \
+ dst = (short*)dst2; \
+}
+
static int pcm_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
const uint8_t *buf, int buf_size)
@@ -371,13 +401,8 @@ static int pcm_decode_frame(AVCodecConte
switch(avctx->codec->id) {
case CODEC_ID_PCM_F32BE:
- {
- float *fsamples = data;
- for(;n>0;n--)
- *fsamples++ = av_int2flt(bytestream_get_be32(&src));
- samples = (void*)fsamples;
+ DECODE(int32_t, be32, src, samples, n, 0)
break;
- }
case CODEC_ID_PCM_S32LE:
decode_to16(4, 1, 0, &src, &samples, buf_size);
break;
More information about the ffmpeg-cvslog
mailing list