Lines 101-124
static const int16_t adaptationTable[] =
Link Here
|
101 |
768, 614, 512, 409, 307, 230, 230, 230 |
101 |
768, 614, 512, 409, 307, 230, 230, 230 |
102 |
}; |
102 |
}; |
103 |
|
103 |
|
|
|
104 |
int firstBitSet(int x) |
105 |
{ |
106 |
int position=0; |
107 |
while (x!=0) |
108 |
{ |
109 |
x>>=1; |
110 |
++position; |
111 |
} |
112 |
return position; |
113 |
} |
114 |
|
115 |
#ifndef __has_builtin |
116 |
#define __has_builtin(x) 0 |
117 |
#endif |
118 |
|
119 |
int multiplyCheckOverflow(int a, int b, int *result) |
120 |
{ |
121 |
#if (defined __GNUC__ && __GNUC__ >= 5) || ( __clang__ && __has_builtin(__builtin_mul_overflow)) |
122 |
return __builtin_mul_overflow(a, b, result); |
123 |
#else |
124 |
if (firstBitSet(a)+firstBitSet(b)>31) // int is signed, so we can't use 32 bits |
125 |
return true; |
126 |
*result = a * b; |
127 |
return false; |
128 |
#endif |
129 |
} |
130 |
|
131 |
|
104 |
// Compute a linear PCM value from the given differential coded value. |
132 |
// Compute a linear PCM value from the given differential coded value. |
105 |
static int16_t decodeSample(ms_adpcm_state &state, |
133 |
static int16_t decodeSample(ms_adpcm_state &state, |
106 |
uint8_t code, const int16_t *coefficient) |
134 |
uint8_t code, const int16_t *coefficient, bool *ok=NULL) |
107 |
{ |
135 |
{ |
108 |
int linearSample = (state.sample1 * coefficient[0] + |
136 |
int linearSample = (state.sample1 * coefficient[0] + |
109 |
state.sample2 * coefficient[1]) >> 8; |
137 |
state.sample2 * coefficient[1]) >> 8; |
|
|
138 |
int delta; |
110 |
|
139 |
|
111 |
linearSample += ((code & 0x08) ? (code - 0x10) : code) * state.delta; |
140 |
linearSample += ((code & 0x08) ? (code - 0x10) : code) * state.delta; |
112 |
|
141 |
|
113 |
linearSample = clamp(linearSample, MIN_INT16, MAX_INT16); |
142 |
linearSample = clamp(linearSample, MIN_INT16, MAX_INT16); |
114 |
|
143 |
|
115 |
int delta = (state.delta * adaptationTable[code]) >> 8; |
144 |
if (multiplyCheckOverflow(state.delta, adaptationTable[code], &delta)) |
|
|
145 |
{ |
146 |
if (ok) *ok=false; |
147 |
_af_error(AF_BAD_COMPRESSION, "Error decoding sample"); |
148 |
return 0; |
149 |
} |
150 |
delta >>= 8; |
116 |
if (delta < 16) |
151 |
if (delta < 16) |
117 |
delta = 16; |
152 |
delta = 16; |
118 |
|
153 |
|
119 |
state.delta = delta; |
154 |
state.delta = delta; |
120 |
state.sample2 = state.sample1; |
155 |
state.sample2 = state.sample1; |
121 |
state.sample1 = linearSample; |
156 |
state.sample1 = linearSample; |
|
|
157 |
if (ok) *ok=true; |
122 |
|
158 |
|
123 |
return static_cast<int16_t>(linearSample); |
159 |
return static_cast<int16_t>(linearSample); |
124 |
} |
160 |
} |
Lines 212-224
int MSADPCM::decodeBlock(const uint8_t *encoded, int16_t *decoded)
Link Here
|
212 |
{ |
248 |
{ |
213 |
uint8_t code; |
249 |
uint8_t code; |
214 |
int16_t newSample; |
250 |
int16_t newSample; |
|
|
251 |
bool ok; |
215 |
|
252 |
|
216 |
code = *encoded >> 4; |
253 |
code = *encoded >> 4; |
217 |
newSample = decodeSample(*state[0], code, coefficient[0]); |
254 |
newSample = decodeSample(*state[0], code, coefficient[0], &ok); |
|
|
255 |
if (!ok) return 0; |
218 |
*decoded++ = newSample; |
256 |
*decoded++ = newSample; |
219 |
|
257 |
|
220 |
code = *encoded & 0x0f; |
258 |
code = *encoded & 0x0f; |
221 |
newSample = decodeSample(*state[1], code, coefficient[1]); |
259 |
newSample = decodeSample(*state[1], code, coefficient[1], &ok); |
|
|
260 |
if (!ok) return 0; |
222 |
*decoded++ = newSample; |
261 |
*decoded++ = newSample; |
223 |
|
262 |
|
224 |
encoded++; |
263 |
encoded++; |
225 |
-- |
|
|
226 |
libaudiofile/WAVE.cpp | 6 ++++++ |
264 |
libaudiofile/WAVE.cpp | 6 ++++++ |
227 |
1 file changed, 6 insertions(+) |
265 |
1 file changed, 6 insertions(+) |