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 }