Mercurial > libavcodec.hg
comparison dpcm.c @ 5523:c2ab2ac31edb libavcodec
use av_clip_int16() where it makes sense
author | aurel |
---|---|
date | Sat, 11 Aug 2007 22:48:55 +0000 |
parents | 05e932ddaaa9 |
children | a3fec73667af |
comparison
equal
deleted
inserted
replaced
5522:acaaff7b6fb8 | 5523:c2ab2ac31edb |
---|---|
44 short roq_square_array[256]; | 44 short roq_square_array[256]; |
45 long sample[2];//for SOL_DPCM | 45 long sample[2];//for SOL_DPCM |
46 const int *sol_table;//for SOL_DPCM | 46 const int *sol_table;//for SOL_DPCM |
47 } DPCMContext; | 47 } DPCMContext; |
48 | 48 |
49 #define SATURATE_S16(x) if (x < -32768) x = -32768; \ | |
50 else if (x > 32767) x = 32767; | |
51 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000; | 49 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000; |
52 | 50 |
53 static int interplay_delta_table[] = { | 51 static int interplay_delta_table[] = { |
54 0, 1, 2, 3, 4, 5, 6, 7, | 52 0, 1, 2, 3, 4, 5, 6, 7, |
55 8, 9, 10, 11, 12, 13, 14, 15, | 53 8, 9, 10, 11, 12, 13, 14, 15, |
188 SE_16BIT(predictor[1]); | 186 SE_16BIT(predictor[1]); |
189 | 187 |
190 /* decode the samples */ | 188 /* decode the samples */ |
191 for (in = 8, out = 0; in < buf_size; in++, out++) { | 189 for (in = 8, out = 0; in < buf_size; in++, out++) { |
192 predictor[channel_number] += s->roq_square_array[buf[in]]; | 190 predictor[channel_number] += s->roq_square_array[buf[in]]; |
193 SATURATE_S16(predictor[channel_number]); | 191 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
194 output_samples[out] = predictor[channel_number]; | 192 output_samples[out] = predictor[channel_number]; |
195 | 193 |
196 /* toggle channel */ | 194 /* toggle channel */ |
197 channel_number ^= s->channels - 1; | 195 channel_number ^= s->channels - 1; |
198 } | 196 } |
211 output_samples[out++] = predictor[1]; | 209 output_samples[out++] = predictor[1]; |
212 } | 210 } |
213 | 211 |
214 while (in < buf_size) { | 212 while (in < buf_size) { |
215 predictor[channel_number] += interplay_delta_table[buf[in++]]; | 213 predictor[channel_number] += interplay_delta_table[buf[in++]]; |
216 SATURATE_S16(predictor[channel_number]); | 214 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
217 output_samples[out++] = predictor[channel_number]; | 215 output_samples[out++] = predictor[channel_number]; |
218 | 216 |
219 /* toggle channel */ | 217 /* toggle channel */ |
220 channel_number ^= s->channels - 1; | 218 channel_number ^= s->channels - 1; |
221 } | 219 } |
246 shift[channel_number] = 0; | 244 shift[channel_number] = 0; |
247 | 245 |
248 diff >>= shift[channel_number]; | 246 diff >>= shift[channel_number]; |
249 predictor[channel_number] += diff; | 247 predictor[channel_number] += diff; |
250 | 248 |
251 SATURATE_S16(predictor[channel_number]); | 249 predictor[channel_number] = av_clip_int16(predictor[channel_number]); |
252 output_samples[out++] = predictor[channel_number]; | 250 output_samples[out++] = predictor[channel_number]; |
253 | 251 |
254 /* toggle channel */ | 252 /* toggle channel */ |
255 channel_number ^= s->channels - 1; | 253 channel_number ^= s->channels - 1; |
256 } | 254 } |
275 while (in < buf_size) { | 273 while (in < buf_size) { |
276 int n; | 274 int n; |
277 n = buf[in++]; | 275 n = buf[in++]; |
278 if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F]; | 276 if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F]; |
279 else s->sample[channel_number] += s->sol_table[n & 0x7F]; | 277 else s->sample[channel_number] += s->sol_table[n & 0x7F]; |
280 SATURATE_S16(s->sample[channel_number]); | 278 s->sample[channel_number] = av_clip_int16(s->sample[channel_number]); |
281 output_samples[out++] = s->sample[channel_number]; | 279 output_samples[out++] = s->sample[channel_number]; |
282 /* toggle channel */ | 280 /* toggle channel */ |
283 channel_number ^= s->channels - 1; | 281 channel_number ^= s->channels - 1; |
284 } | 282 } |
285 } | 283 } |