summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2007-07-30 02:05:16 +0000
committerMichael Niedermayer <michaelni@gmx.at>2007-07-30 02:05:16 +0000
commita11c2a2c66c6e74f4af366995704a3819466f3a8 (patch)
treedfa723f995dd35b7b120f027dc041ec3195ce82d
parent2711cb28f46463760f0326d806fe5ef9551ade2c (diff)
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
-rw-r--r--libavcodec/allcodecs.c1
-rw-r--r--libavcodec/allcodecs.h1
-rw-r--r--libavcodec/avcodec.h1
-rw-r--r--libavcodec/pcm.c18
-rw-r--r--libavformat/riff.c2
5 files changed, 23 insertions, 0 deletions
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