diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 8153e416ced1451bba81a8dd10c5923828ad1316..6a944e14aeb97110845eaaf76cfbdb500cd85c71 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 3e18ca0d41ffc5c1e75a31e812f34ec95c3a1c70..98721ace5c72fea66afed0d1672dc75658b2c3b3 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 1fd891caa124f80b1b1cb9b8b234d0181ee0565a..57bffbbda051aa1b4054b6b4a362618c8cd8a70d 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 2551d12b65d2da9728c34a0891594cb1b46519c3..c0383adabc5d4fa6a3c504d363453382e59dae8d 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 0cb9e32419ae5abc368ce2ecb94ca56e6b41c531..4ad732daba7b3fc8dddc8a8d789762eea147e264 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