changeset 7409:21770337ff2d libavcodec

add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
author pross
date Sat, 26 Jul 2008 07:08:15 +0000
parents f25c192ce081
children 4c68f77c49ee
files allcodecs.c avcodec.h pcm.c utils.c
diffstat 4 files changed, 39 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/allcodecs.c	Sat Jul 26 02:31:19 2008 +0000
+++ b/allcodecs.c	Sat Jul 26 07:08:15 2008 +0000
@@ -218,6 +218,7 @@
     /* PCM codecs */
     REGISTER_ENCDEC  (PCM_ALAW, pcm_alaw);
     REGISTER_DECODER (PCM_DVD, pcm_dvd);
+    REGISTER_ENCDEC  (PCM_F32BE, pcm_f32be);
     REGISTER_ENCDEC  (PCM_MULAW, pcm_mulaw);
     REGISTER_ENCDEC  (PCM_S8, pcm_s8);
     REGISTER_ENCDEC  (PCM_S16BE, pcm_s16be);
--- a/avcodec.h	Sat Jul 26 02:31:19 2008 +0000
+++ b/avcodec.h	Sat Jul 26 07:08:15 2008 +0000
@@ -30,7 +30,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 51
-#define LIBAVCODEC_VERSION_MINOR 60
+#define LIBAVCODEC_VERSION_MINOR 61
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -210,6 +210,7 @@
     CODEC_ID_PCM_ZORK,
     CODEC_ID_PCM_S16LE_PLANAR,
     CODEC_ID_PCM_DVD,
+    CODEC_ID_PCM_F32BE,
 
     /* various ADPCM codecs */
     CODEC_ID_ADPCM_IMA_QT= 0x11000,
--- a/pcm.c	Sat Jul 26 02:31:19 2008 +0000
+++ b/pcm.c	Sat Jul 26 07:08:15 2008 +0000
@@ -107,6 +107,9 @@
 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 @@
     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 @@
     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 @@
     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 @@
     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 @@
         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 @@
 /* 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");
--- a/utils.c	Sat Jul 26 02:31:19 2008 +0000
+++ b/utils.c	Sat Jul 26 07:08:15 2008 +0000
@@ -1155,6 +1155,7 @@
         case CODEC_ID_PCM_S32BE:
         case CODEC_ID_PCM_U32LE:
         case CODEC_ID_PCM_U32BE:
+        case CODEC_ID_PCM_F32BE:
             bitrate = enc->sample_rate * enc->channels * 32;
             break;
         case CODEC_ID_PCM_S24LE:
@@ -1301,6 +1302,7 @@
     case CODEC_ID_PCM_S32LE:
     case CODEC_ID_PCM_U32BE:
     case CODEC_ID_PCM_U32LE:
+    case CODEC_ID_PCM_F32BE:
         return 32;
     default:
         return 0;