diff options
author | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-01-01 20:04:54 +0000 |
---|---|---|
committer | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-01-01 20:04:54 +0000 |
commit | 9505de02504cf9d3ce28425f615533eafd4d4fc1 (patch) | |
tree | cd0ca0bf93e2f6cbcdb48ff41fa7b80b6c5d5d13 /adpcm.c | |
parent | 33089e2179a8ea2b1547608af64ba4994adf70c6 (diff) | |
download | mpv-9505de02504cf9d3ce28425f615533eafd4d4fc1.tar.bz2 mpv-9505de02504cf9d3ce28425f615533eafd4d4fc1.tar.xz |
added initial support for format 0x61 ADPCM (sounds good, but still pops)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3934 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'adpcm.c')
-rw-r--r-- | adpcm.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -298,6 +298,68 @@ int ms_adpcm_decode_block(unsigned short *output, unsigned char *input, return (block_size - (MS_ADPCM_PREAMBLE_SIZE * channels)) * 2; } +// note: This decoder assumes the format 0x61 data always comes in +// mono flavor +int fox61_adpcm_decode_block(unsigned short *output, unsigned char *input) +{ + int i; + int out_ptr = 0; + + int predictor; + int index; + int nibble; + int sign; + int delta; + int diff; + int step; + + predictor = output[out_ptr++] = LE_16(&input[0]); + index = input[2]; + + // iterate through and decode the rest of the bytes + for (i = 4; i < FOX61_ADPCM_BLOCK_SIZE; i++) + { + nibble = (input[i] >> 4) & 0x0F; + + step = adpcm_step[index]; + sign = nibble & 8; + delta = nibble & 7; + diff = step >> 3; + if (delta & 4) diff += step; + if (delta & 2) diff += step >> 1; + if (delta & 1) diff += step >> 2; + if (sign) + predictor -= diff; + else + predictor += diff; + CLAMP_S16(predictor); + output[out_ptr++] = predictor; + index += adpcm_index[nibble]; + CLAMP_0_TO_88(index); + + nibble = input[i] & 0x0F; + + step = adpcm_step[index]; + sign = nibble & 8; + delta = nibble & 7; + diff = step >> 3; + if (delta & 4) diff += step; + if (delta & 2) diff += step >> 1; + if (delta & 1) diff += step >> 2; + if (sign) + predictor -= diff; + else + predictor += diff; + CLAMP_S16(predictor); + output[out_ptr++] = predictor; + index += adpcm_index[nibble]; + CLAMP_0_TO_88(index); + } + + return FOX61_ADPCM_SAMPLES_PER_BLOCK; +} + + // note: This decoder assumes the format 0x62 data always comes in // stereo flavor int fox62_adpcm_decode_block(unsigned short *output, unsigned char *input, |