summaryrefslogtreecommitdiffstats
path: root/adpcm.c
diff options
context:
space:
mode:
authormelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-01 20:04:54 +0000
committermelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-01 20:04:54 +0000
commit9505de02504cf9d3ce28425f615533eafd4d4fc1 (patch)
treecd0ca0bf93e2f6cbcdb48ff41fa7b80b6c5d5d13 /adpcm.c
parent33089e2179a8ea2b1547608af64ba4994adf70c6 (diff)
downloadmpv-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.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/adpcm.c b/adpcm.c
index 37bbd64461..8239dfd9c5 100644
--- a/adpcm.c
+++ b/adpcm.c
@@ -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,