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 }