summaryrefslogtreecommitdiff
path: root/apps/codecs/libffmpegFLAC/decoder.c
diff options
context:
space:
mode:
authorMarcoen Hirschberg <marcoen@gmail.com>2007-11-08 14:02:42 +0000
committerMarcoen Hirschberg <marcoen@gmail.com>2007-11-08 14:02:42 +0000
commit6bcd8304902465fc856caebb2a8a004d07a451c2 (patch)
tree136487bf2bdb8cca197f931fad3616c6f58bf2f2 /apps/codecs/libffmpegFLAC/decoder.c
parent49ca667394da5289451477ec71b3769d771641c3 (diff)
downloadrockbox-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.c30
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;