Skip to content
Snippets Groups Projects
Commit a11c2a2c authored by Michael Niedermayer's avatar Michael Niedermayer
Browse files

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
parent 2711cb28
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
......@@ -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 */
......
......@@ -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,
......
......@@ -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
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment