from ffmpeg: replace FIR with finite differences.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15530 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marcoen Hirschberg 2007-11-08 14:02:42 +00:00
parent 49ca667394
commit 6bcd830490

View file

@ -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) ICODE_ATTR_FLAC;
static int decode_subframe_fixed(FLACContext *s, int32_t* decoded, int pred_order) 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 */ /* warm up samples */
for (i = 0; i < pred_order; i++) 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) if (decode_residuals(s, decoded, pred_order) < 0)
return -4; 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) switch(pred_order)
{ {
case 0: case 0:
break; break;
case 1: case 1:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < blocksize; i++)
decoded[i] += decoded[i-1]; decoded[i] = a += decoded[i];
break; break;
case 2: case 2:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < blocksize; i++)
decoded[i] += 2*decoded[i-1] decoded[i] = a += b += decoded[i];
- decoded[i-2];
break; break;
case 3: case 3:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < blocksize; i++)
decoded[i] += 3*decoded[i-1] decoded[i] = a += b += c += decoded[i];
- 3*decoded[i-2]
+ decoded[i-3];
break; break;
case 4: case 4:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < blocksize; i++)
decoded[i] += 4*decoded[i-1] decoded[i] = a += b += c += d += decoded[i];
- 6*decoded[i-2]
+ 4*decoded[i-3]
- decoded[i-4];
break; break;
default: default:
return -5; return -5;