00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "dsp.h"
00049
00050
00051
00052
00053
00054 #define ADPCM_IMA_DECODE_NIBBLE(v_nibble, v_step_index, v_predicted_value) \
00055 step = adpcm_ima_step_table[v_step_index]; \
00056 \
00057 v_step_index += adpcm_ima_index_table[v_nibble]; \
00058 \
00059 if (v_step_index < 0) \
00060 v_step_index = 0; \
00061 else if (v_step_index > 88) \
00062 v_step_index = 88; \
00063 \
00064 diff = step >> 3; \
00065 \
00066 if (nibble & 4) \
00067 diff += step; \
00068 if (nibble & 2) \
00069 diff += step >> 1; \
00070 if (nibble & 1) \
00071 diff += step >> 2; \
00072 if (nibble & 8) \
00073 v_predicted_value -= diff; \
00074 else \
00075 v_predicted_value += diff; \
00076 \
00077 if ((v_predicted_value) < -0x8000) \
00078 (v_predicted_value) = -0x8000; \
00079 else if ((v_predicted_value) > 0x7fff) \
00080 (v_predicted_value) = 0x7fff;
00081
00082
00083
00084
00085
00086
00087 #define ADPCM_IMA_ENCODE_NIBBLE(v_out, v_nibble, v_step_index, v_predicted_value) \
00088 step = adpcm_ima_step_table[v_step_index]; \
00089 \
00090 diff = v_nibble - v_predicted_value; \
00091 sign = (diff < 0)?8:0; \
00092 if (sign) \
00093 diff = -diff; \
00094 \
00095 v_out = 0; \
00096 vpdiff = (step >> 3); \
00097 \
00098 if (diff >= step) \
00099 { \
00100 v_out = 4; \
00101 diff -= step; \
00102 vpdiff += step; \
00103 } \
00104 step >>= 1; \
00105 if (diff >= step) \
00106 { \
00107 v_out |= 2; \
00108 diff -= step; \
00109 vpdiff += step; \
00110 } \
00111 step >>= 1; \
00112 if ( diff >= step ) \
00113 { \
00114 v_out |= 1; \
00115 vpdiff += step; \
00116 } \
00117 \
00118 if (sign) \
00119 v_predicted_value -= vpdiff; \
00120 else \
00121 v_predicted_value += vpdiff; \
00122 \
00123 if ((v_predicted_value) < -0x8000) \
00124 (v_predicted_value) = -0x8000; \
00125 else if ((v_predicted_value) > 0x7fff) \
00126 (v_predicted_value) = 0x7fff; \
00127 \
00128 v_step_index += adpcm_ima_index_table[v_out]; \
00129 \
00130 v_out |= sign; \
00131 \
00132 if (v_step_index < 0) \
00133 v_step_index = 0; \
00134 else if (v_step_index > 88) \
00135 v_step_index = 88;
00136
00137
00138
00139
00140 static int adpcm_ima_step_table[89] = {
00141 7, 8, 9, 10, 11, 12, 13, 14,
00142 16, 17, 19, 21, 23, 25, 28, 31,
00143 34, 37, 41, 45, 50, 55, 60, 66,
00144 73, 80, 88, 97, 107, 118, 130, 143,
00145 157, 173, 190, 209, 230, 253, 279, 307,
00146 337, 371, 408, 449, 494, 544, 598, 658,
00147 724, 796, 876, 963, 1060, 1166, 1282, 1411,
00148 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
00149 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,
00150 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
00151 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
00152 };
00153
00154
00155 static int adpcm_ima_index_table[16] = {
00156 -1, -1, -1, -1, 2, 4, 6, 8,
00157 -1, -1, -1, -1, 2, 4, 6, 8
00158 };
00159
00160
00161 S16 dsp_adpcm_ima_decode_nibble(S8 nibble, S16 *step_index, S16 *predicted_value)
00162 {
00163 int diff, step;
00164 int int_predicted_value, int_step_index;
00165
00166
00167 int_predicted_value = (int) *predicted_value;
00168 int_step_index = (int) *step_index;
00169
00170
00171 ADPCM_IMA_DECODE_NIBBLE(((int) nibble), int_step_index, int_predicted_value);
00172
00173
00174 *predicted_value = (S16) int_predicted_value;
00175 *step_index = (S16) int_step_index;
00176
00177
00178 return int_predicted_value;
00179 }
00180
00181
00182 void dsp_adpcm_ima_decode(S16 *out, void *in, int size, S16 *step_index, S16 *predicted_value)
00183 {
00184 U8 *c_in = in;
00185 int i, nibble, step, diff;
00186 int int_predicted_value, int_step_index;
00187
00188
00189 int_predicted_value = *predicted_value;
00190 int_step_index = *step_index;
00191
00192
00193 for(i=0; i<size; i+=2)
00194 {
00195
00196 nibble = ((int) *c_in)&0xF;
00197
00198 ADPCM_IMA_DECODE_NIBBLE(nibble, int_step_index, int_predicted_value);
00199
00200 out[i] = (S16) int_predicted_value;
00201
00202
00203 nibble = (((int) *c_in) >> 4)&0xF;
00204
00205 ADPCM_IMA_DECODE_NIBBLE(nibble, int_step_index, int_predicted_value);
00206
00207 out[i + 1] = (S16) int_predicted_value;
00208
00209 c_in++;
00210 }
00211
00212
00213 *predicted_value = int_predicted_value;
00214 *step_index = int_step_index;
00215 }
00216
00217
00218 S8 dsp_adpcm_ima_encode_nibble(S16 nibble, S16 *step_index, S16 *predicted_value)
00219 {
00220 int int_predicted_value, int_step_index;
00221 int diff, step, delta, sign, vpdiff;
00222
00223
00224 int_predicted_value = (int) *predicted_value;
00225 int_step_index = (int) *step_index;
00226
00227
00228 ADPCM_IMA_ENCODE_NIBBLE(delta, ((int) nibble), int_step_index, int_predicted_value);
00229
00230
00231 *predicted_value = (S16) int_predicted_value;
00232 *step_index = (S16) int_step_index;
00233
00234
00235 return (S8) delta;
00236 }
00237
00238
00239 void dsp_adpcm_ima_encode(void *out, S16 *in, int size, S16 *step_index, S16 *predicted_value)
00240 {
00241 U8 *c_out = out;
00242 int i;
00243 int int_predicted_value, int_step_index;
00244 int nibble, diff, step, delta, sign, vpdiff;
00245
00246
00247 int_predicted_value = *predicted_value;
00248 int_step_index = *step_index;
00249
00250
00251 for(i=0; i<size; i+=2)
00252 {
00253
00254 nibble = in[i];
00255
00256 ADPCM_IMA_ENCODE_NIBBLE(delta, nibble, int_step_index, int_predicted_value);
00257
00258 *c_out = delta;
00259
00260
00261 nibble = in[i + 1];
00262
00263 ADPCM_IMA_ENCODE_NIBBLE(delta, nibble, int_step_index, int_predicted_value);
00264
00265 *c_out |= delta << 4;
00266
00267 c_out++;
00268 }
00269
00270
00271 *predicted_value = int_predicted_value;
00272 *step_index = int_step_index;
00273 }