summaryrefslogtreecommitdiff
path: root/libavcodec/pcm.c
diff options
context:
space:
mode:
authorPeter Ross <pross@xvid.org>2008-07-26 07:08:15 +0000
committerPeter Ross <pross@xvid.org>2008-07-26 07:08:15 +0000
commitaa29709ec8f42616ccc6ef0fda95a1a134c21ca5 (patch)
treec6155ff3cc6ff0a02feaf79e6dd25adf1af44183 /libavcodec/pcm.c
parentfef744d4042403fdecb436e9c72279624d21200a (diff)
add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
Originally committed as revision 14409 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/pcm.c')
-rw-r--r--libavcodec/pcm.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index 29779c5ba0..8f02fda7e3 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcm.c
@@ -107,6 +107,9 @@ static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw,
static av_cold int pcm_encode_init(AVCodecContext *avctx)
{
avctx->frame_size = 1;
+ if (avctx->codec->id==CODEC_ID_PCM_F32BE && avctx->sample_fmt!=SAMPLE_FMT_FLT) {
+ return -1;
+ }
switch(avctx->codec->id) {
case CODEC_ID_PCM_ALAW:
build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
@@ -123,6 +126,7 @@ static av_cold int pcm_encode_init(AVCodecContext *avctx)
case CODEC_ID_PCM_S32BE:
case CODEC_ID_PCM_U32LE:
case CODEC_ID_PCM_U32BE:
+ case CODEC_ID_PCM_F32BE:
avctx->block_align = 4 * avctx->channels;
break;
case CODEC_ID_PCM_S24LE:
@@ -198,6 +202,7 @@ static int pcm_encode_frame(AVCodecContext *avctx,
case CODEC_ID_PCM_S32BE:
case CODEC_ID_PCM_U32LE:
case CODEC_ID_PCM_U32BE:
+ case CODEC_ID_PCM_F32BE:
sample_size = 4;
break;
case CODEC_ID_PCM_S24LE:
@@ -222,6 +227,16 @@ static int pcm_encode_frame(AVCodecContext *avctx,
dst = frame;
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;
+ }
+ break;
case CODEC_ID_PCM_S32LE:
encode_from16(4, 1, 0, &samples, &dst, n);
break;
@@ -342,6 +357,15 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx)
default:
break;
}
+
+ switch(avctx->codec->id) {
+ case CODEC_ID_PCM_F32BE:
+ avctx->sample_fmt = SAMPLE_FMT_FLT;
+ break;
+ default:
+ avctx->sample_fmt = SAMPLE_FMT_S16;
+ break;
+ }
return 0;
}
@@ -407,6 +431,15 @@ static int pcm_decode_frame(AVCodecContext *avctx,
src2[c] = &src[c*n];
switch(avctx->codec->id) {
+ case CODEC_ID_PCM_F32BE:
+ {
+ float *fsamples = data;
+ n = buf_size >> 2;
+ for(;n>0;n--)
+ *fsamples++ = av_int2flt(bytestream_get_be32(&src));
+ samples = (void*)fsamples;
+ break;
+ }
case CODEC_ID_PCM_S32LE:
decode_to16(4, 1, 0, &src, &samples, buf_size);
break;
@@ -559,6 +592,7 @@ AVCodec name ## _decoder = { \
/* Note: Do not forget to add new entries to the Makefile as well. */
PCM_CODEC (CODEC_ID_PCM_ALAW, pcm_alaw, "A-law PCM");
PCM_CODEC (CODEC_ID_PCM_DVD, pcm_dvd, "signed 16|20|24-bit big-endian PCM");
+PCM_CODEC (CODEC_ID_PCM_F32BE, pcm_f32be, "32-bit floating point big-endian PCM");
PCM_CODEC (CODEC_ID_PCM_MULAW, pcm_mulaw, "mu-law PCM");
PCM_CODEC (CODEC_ID_PCM_S8, pcm_s8, "signed 8-bit PCM");
PCM_CODEC (CODEC_ID_PCM_S16BE, pcm_s16be, "signed 16-bit big-endian PCM");