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
This commit is contained in:
Michael Niedermayer 2007-07-30 02:05:16 +00:00
parent 2711cb28f4
commit a11c2a2c66
5 changed files with 23 additions and 0 deletions

View 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);

View 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 */

View 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,

View 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

View 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