]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
support silly PCM variant used by zork nemesis
authormichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 30 Jul 2007 02:05:16 +0000 (02:05 +0000)
committermichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 30 Jul 2007 02:05:16 +0000 (02:05 +0000)
fixes audio decoding of T000A11C.AVI

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@9831 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

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

index 8153e416ced1451bba81a8dd10c5923828ad1316..6a944e14aeb97110845eaaf76cfbdb500cd85c71 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 3e18ca0d41ffc5c1e75a31e812f34ec95c3a1c70..98721ace5c72fea66afed0d1672dc75658b2c3b3 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 1fd891caa124f80b1b1cb9b8b234d0181ee0565a..57bffbbda051aa1b4054b6b4a362618c8cd8a70d 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 2551d12b65d2da9728c34a0891594cb1b46519c3..c0383adabc5d4fa6a3c504d363453382e59dae8d 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 0cb9e32419ae5abc368ce2ecb94ca56e6b41c531..4ad732daba7b3fc8dddc8a8d789762eea147e264 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