diff options
| author | Marcoen Hirschberg <marcoen@gmail.com> | 2007-11-08 14:02:42 +0000 |
|---|---|---|
| committer | Marcoen Hirschberg <marcoen@gmail.com> | 2007-11-08 14:02:42 +0000 |
| commit | 6bcd8304902465fc856caebb2a8a004d07a451c2 (patch) | |
| tree | 136487bf2bdb8cca197f931fad3616c6f58bf2f2 /apps/codecs/libffmpegFLAC/decoder.c | |
| parent | 49ca667394da5289451477ec71b3769d771641c3 (diff) | |
| download | rockbox-6bcd8304902465fc856caebb2a8a004d07a451c2.zip rockbox-6bcd8304902465fc856caebb2a8a004d07a451c2.tar.gz rockbox-6bcd8304902465fc856caebb2a8a004d07a451c2.tar.bz2 rockbox-6bcd8304902465fc856caebb2a8a004d07a451c2.tar.xz | |
from ffmpeg: replace FIR with finite differences.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15530 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libffmpegFLAC/decoder.c')
| -rw-r--r-- | apps/codecs/libffmpegFLAC/decoder.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/apps/codecs/libffmpegFLAC/decoder.c b/apps/codecs/libffmpegFLAC/decoder.c index 7bbd6f5..aa3ce30 100644 --- a/apps/codecs/libffmpegFLAC/decoder.c +++ b/apps/codecs/libffmpegFLAC/decoder.c @@ -180,7 +180,8 @@ static int decode_residuals(FLACContext *s, int32_t* decoded, int pred_order) static int decode_subframe_fixed(FLACContext *s, int32_t* decoded, int pred_order) ICODE_ATTR_FLAC; static int decode_subframe_fixed(FLACContext *s, int32_t* decoded, int pred_order) { - int i; + const int blocksize = s->blocksize; + int a, b, c, d, i; /* warm up samples */ for (i = 0; i < pred_order; i++) @@ -191,31 +192,30 @@ static int decode_subframe_fixed(FLACContext *s, int32_t* decoded, int pred_orde if (decode_residuals(s, decoded, pred_order) < 0) return -4; + a = decoded[pred_order-1]; + b = a - decoded[pred_order-2]; + c = b - decoded[pred_order-2] + decoded[pred_order-3]; + d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4]; + switch(pred_order) { case 0: break; case 1: - for (i = pred_order; i < s->blocksize; i++) - decoded[i] += decoded[i-1]; + for (i = pred_order; i < blocksize; i++) + decoded[i] = a += decoded[i]; break; case 2: - for (i = pred_order; i < s->blocksize; i++) - decoded[i] += 2*decoded[i-1] - - decoded[i-2]; + for (i = pred_order; i < blocksize; i++) + decoded[i] = a += b += decoded[i]; break; case 3: - for (i = pred_order; i < s->blocksize; i++) - decoded[i] += 3*decoded[i-1] - - 3*decoded[i-2] - + decoded[i-3]; + for (i = pred_order; i < blocksize; i++) + decoded[i] = a += b += c += decoded[i]; break; case 4: - for (i = pred_order; i < s->blocksize; i++) - decoded[i] += 4*decoded[i-1] - - 6*decoded[i-2] - + 4*decoded[i-3] - - decoded[i-4]; + for (i = pred_order; i < blocksize; i++) + decoded[i] = a += b += c += d += decoded[i]; break; default: return -5; |