support silly PCM variant used by zork nemesis
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 30 Jul 2007 02:05:16 +0000 (02:05 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 30 Jul 2007 02:05:16 +0000 (02:05 +0000)
fixes audio decoding of T000A11C.AVI

Originally committed as revision 9831 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/allcodecs.c
libavcodec/allcodecs.h
libavcodec/avcodec.h
libavcodec/pcm.c
libavformat/riff.c

index 8153e41..6a944e1 100644 (file)
@@ -225,6 +225,7 @@ void avcodec_register_all(void)
     REGISTER_ENCDEC (PCM_U24LE, pcm_u24le);
     REGISTER_ENCDEC (PCM_U32BE, pcm_u32be);
     REGISTER_ENCDEC (PCM_U32LE, pcm_u32le);
+    REGISTER_ENCDEC (PCM_ZORK , pcm_zork);
 
     /* dpcm codecs */
     REGISTER_DECODER(INTERPLAY_DPCM, interplay_dpcm);
index 3e18ca0..98721ac 100644 (file)
@@ -228,6 +228,7 @@ PCM_CODEC(CODEC_ID_PCM_U24BE,   pcm_u24be);
 PCM_CODEC(CODEC_ID_PCM_U24LE,   pcm_u24le);
 PCM_CODEC(CODEC_ID_PCM_U32BE,   pcm_u32be);
 PCM_CODEC(CODEC_ID_PCM_U32LE,   pcm_u32le);
+PCM_CODEC(CODEC_ID_PCM_ZORK,    pcm_zork);
 
 /* ADPCM codecs */
 
index 1fd891c..57bffbb 100644 (file)
@@ -185,6 +185,7 @@ enum CodecID {
     CODEC_ID_PCM_U24LE,
     CODEC_ID_PCM_U24BE,
     CODEC_ID_PCM_S24DAUD,
+    CODEC_ID_PCM_ZORK,
 
     /* various ADPCM codecs */
     CODEC_ID_ADPCM_IMA_QT= 0x11000,
index 2551d12..c0383ad 100644 (file)
@@ -291,6 +291,14 @@ static int pcm_encode_frame(AVCodecContext *avctx,
             *dst++ = (v >> 8) + 128;
         }
         break;
+    case CODEC_ID_PCM_ZORK:
+        for(;n>0;n--) {
+            v= *samples++ >> 8;
+            if(v<0)   v = -v;
+            else      v+= 128;
+            *dst++ = v;
+        }
+        break;
     case CODEC_ID_PCM_ALAW:
         for(;n>0;n--) {
             v = *samples++;
@@ -452,6 +460,15 @@ static int pcm_decode_frame(AVCodecContext *avctx,
             *samples++ = ((int)*src++ - 128) << 8;
         }
         break;
+    case CODEC_ID_PCM_ZORK:
+        n = buf_size;
+        for(;n>0;n--) {
+            int x= *src++;
+            if(x&128) x-= 128;
+            else      x = -x;
+            *samples++ = x << 8;
+        }
+        break;
     case CODEC_ID_PCM_ALAW:
     case CODEC_ID_PCM_MULAW:
         n = buf_size;
@@ -505,5 +522,6 @@ PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8);
 PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8);
 PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw);
 PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw);
+PCM_CODEC(CODEC_ID_PCM_ZORK, pcm_zork);
 
 #undef PCM_CODEC
index 0cb9e32..4ad732d 100644 (file)
@@ -415,6 +415,8 @@ int wav_codec_get_id(unsigned int tag, int bps)
         id = CODEC_ID_PCM_S24LE;
     if (id == CODEC_ID_PCM_S16LE && bps == 32)
         id = CODEC_ID_PCM_S32LE;
+    if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8)
+        id = CODEC_ID_PCM_ZORK;
     return id;
 }
 #endif // CONFIG_DEMUXERS