From a11c2a2c66c6e74f4af366995704a3819466f3a8 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 30 Jul 2007 02:05:16 +0000 Subject: [PATCH] support silly PCM variant used by zork nemesis fixes audio decoding of T000A11C.AVI Originally committed as revision 9831 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/allcodecs.c | 1 + libavcodec/allcodecs.h | 1 + libavcodec/avcodec.h | 1 + libavcodec/pcm.c | 18 ++++++++++++++++++ libavformat/riff.c | 2 ++ 5 files changed, 23 insertions(+) diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 8153e416ce..6a944e14ae 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -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); diff --git a/libavcodec/allcodecs.h b/libavcodec/allcodecs.h index 3e18ca0d41..98721ace5c 100644 --- a/libavcodec/allcodecs.h +++ b/libavcodec/allcodecs.h @@ -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 */ diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 1fd891caa1..57bffbbda0 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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, diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 2551d12b65..c0383adabc 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -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 diff --git a/libavformat/riff.c b/libavformat/riff.c index 0cb9e32419..4ad732daba 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -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 -- GitLab