Mercurial > libavcodec.hg
comparison flac.c @ 5740:4d62c0055174 libavcodec
replace FIR with finite differences.
3x faster decode_subframe_fixed().
overall flac decoding: 10% faster if file was encoded with fixed predictors.
author | lorenm |
---|---|
date | Sun, 30 Sep 2007 02:12:03 +0000 |
parents | 0c92562f1330 |
children | 154b02065699 |
comparison
equal
deleted
inserted
replaced
5739:832a3152d38e | 5740:4d62c0055174 |
---|---|
257 return 0; | 257 return 0; |
258 } | 258 } |
259 | 259 |
260 static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) | 260 static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) |
261 { | 261 { |
262 int i; | 262 const int blocksize = s->blocksize; |
263 int32_t *decoded = s->decoded[channel]; | |
264 int a, b, c, d, i; | |
263 | 265 |
264 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n"); | 266 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n"); |
265 | 267 |
266 /* warm up samples */ | 268 /* warm up samples */ |
267 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); | 269 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); |
268 | 270 |
269 for (i = 0; i < pred_order; i++) | 271 for (i = 0; i < pred_order; i++) |
270 { | 272 { |
271 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); | 273 decoded[i] = get_sbits(&s->gb, s->curr_bps); |
272 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]); | 274 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]); |
273 } | 275 } |
274 | 276 |
275 if (decode_residuals(s, channel, pred_order) < 0) | 277 if (decode_residuals(s, channel, pred_order) < 0) |
276 return -1; | 278 return -1; |
279 | |
280 a = decoded[pred_order-1]; | |
281 b = a - decoded[pred_order-2]; | |
282 c = b - decoded[pred_order-2] + decoded[pred_order-3]; | |
283 d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4]; | |
277 | 284 |
278 switch(pred_order) | 285 switch(pred_order) |
279 { | 286 { |
280 case 0: | 287 case 0: |
281 break; | 288 break; |
282 case 1: | 289 case 1: |
283 for (i = pred_order; i < s->blocksize; i++) | 290 for (i = pred_order; i < blocksize; i++) |
284 s->decoded[channel][i] += s->decoded[channel][i-1]; | 291 decoded[i] = a += decoded[i]; |
285 break; | 292 break; |
286 case 2: | 293 case 2: |
287 for (i = pred_order; i < s->blocksize; i++) | 294 for (i = pred_order; i < blocksize; i++) |
288 s->decoded[channel][i] += 2*s->decoded[channel][i-1] | 295 decoded[i] = a += b += decoded[i]; |
289 - s->decoded[channel][i-2]; | |
290 break; | 296 break; |
291 case 3: | 297 case 3: |
292 for (i = pred_order; i < s->blocksize; i++) | 298 for (i = pred_order; i < blocksize; i++) |
293 s->decoded[channel][i] += 3*s->decoded[channel][i-1] | 299 decoded[i] = a += b += c += decoded[i]; |
294 - 3*s->decoded[channel][i-2] | |
295 + s->decoded[channel][i-3]; | |
296 break; | 300 break; |
297 case 4: | 301 case 4: |
298 for (i = pred_order; i < s->blocksize; i++) | 302 for (i = pred_order; i < blocksize; i++) |
299 s->decoded[channel][i] += 4*s->decoded[channel][i-1] | 303 decoded[i] = a += b += c += d += decoded[i]; |
300 - 6*s->decoded[channel][i-2] | |
301 + 4*s->decoded[channel][i-3] | |
302 - s->decoded[channel][i-4]; | |
303 break; | 304 break; |
304 default: | 305 default: |
305 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); | 306 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); |
306 return -1; | 307 return -1; |
307 } | 308 } |