123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
-
- #include "coder.h"
- #include "assembly.h"
- #define COS0_0 0x4013c251
- #define COS0_1 0x40b345bd
- #define COS0_2 0x41fa2d6d
- #define COS0_3 0x43f93421
- #define COS0_4 0x46cc1bc4
- #define COS0_5 0x4a9d9cf0
- #define COS0_6 0x4fae3711
- #define COS0_7 0x56601ea7
- #define COS0_8 0x5f4cf6eb
- #define COS0_9 0x6b6fcf26
- #define COS0_10 0x7c7d1db3
- #define COS0_11 0x4ad81a97
- #define COS0_12 0x5efc8d96
- #define COS0_13 0x41d95790
- #define COS0_14 0x6d0b20cf
- #define COS0_15 0x518522fb
- #define COS1_0 0x404f4672
- #define COS1_1 0x42e13c10
- #define COS1_2 0x48919f44
- #define COS1_3 0x52cb0e63
- #define COS1_4 0x64e2402e
- #define COS1_5 0x43e224a9
- #define COS1_6 0x6e3c92c1
- #define COS1_7 0x519e4e04
- #define COS2_0 0x4140fb46
- #define COS2_1 0x4cf8de88
- #define COS2_2 0x73326bbf
- #define COS2_3 0x52036742
- #define COS3_0 0x4545e9ef
- #define COS3_1 0x539eba45
- #define COS4_0 0x5a82799a
- static const int dcttab[48] PROGMEM = {
-
- COS0_0, COS0_15, COS1_0,
- COS0_1, COS0_14, COS1_1,
- COS0_2, COS0_13, COS1_2,
- COS0_3, COS0_12, COS1_3,
- COS0_4, COS0_11, COS1_4,
- COS0_5, COS0_10, COS1_5,
- COS0_6, COS0_9, COS1_6,
- COS0_7, COS0_8, COS1_7,
-
- COS2_0, COS2_3, COS3_0,
- COS2_1, COS2_2, COS3_1,
- -COS2_0, -COS2_3, COS3_0,
- -COS2_1, -COS2_2, COS3_1,
- COS2_0, COS2_3, COS3_0,
- COS2_1, COS2_2, COS3_1,
- -COS2_0, -COS2_3, COS3_0,
- -COS2_1, -COS2_2, COS3_1,
- };
- #define D32FP(i, s0, s1, s2) { \
- a0 = buf[i]; a3 = buf[31-i]; \
- a1 = buf[15-i]; a2 = buf[16+i]; \
- b0 = a0 + a3; b3 = MULSHIFT32(*cptr++, a0 - a3) << (s0); \
- b1 = a1 + a2; b2 = MULSHIFT32(*cptr++, a1 - a2) << (s1); \
- buf[i] = b0 + b1; buf[15-i] = MULSHIFT32(*cptr, b0 - b1) << (s2); \
- buf[16+i] = b2 + b3; buf[31-i] = MULSHIFT32(*cptr++, b3 - b2) << (s2); \
- }
- void FDCT32(int *buf, int *dest, int offset, int oddBlock, int gb)
- {
- int i, s, tmp, es;
- const int *cptr = dcttab;
- int a0, a1, a2, a3, a4, a5, a6, a7;
- int b0, b1, b2, b3, b4, b5, b6, b7;
- int *d;
-
- es = 0;
- if (gb < 6) {
- es = 6 - gb;
- for (i = 0; i < 32; i++)
- buf[i] >>= es;
- }
-
- D32FP(0, 1, 5, 1);
- D32FP(1, 1, 3, 1);
- D32FP(2, 1, 3, 1);
- D32FP(3, 1, 2, 1);
- D32FP(4, 1, 2, 1);
- D32FP(5, 1, 1, 2);
- D32FP(6, 1, 1, 2);
- D32FP(7, 1, 1, 4);
-
- for (i = 4; i > 0; i--) {
- a0 = buf[0]; a7 = buf[7]; a3 = buf[3]; a4 = buf[4];
- b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
- b3 = a3 + a4; b4 = MULSHIFT32(*cptr++, a3 - a4) << 3;
- a0 = b0 + b3; a3 = MULSHIFT32(*cptr, b0 - b3) << 1;
- a4 = b4 + b7; a7 = MULSHIFT32(*cptr++, b7 - b4) << 1;
- a1 = buf[1]; a6 = buf[6]; a2 = buf[2]; a5 = buf[5];
- b1 = a1 + a6; b6 = MULSHIFT32(*cptr++, a1 - a6) << 1;
- b2 = a2 + a5; b5 = MULSHIFT32(*cptr++, a2 - a5) << 1;
- a1 = b1 + b2; a2 = MULSHIFT32(*cptr, b1 - b2) << 2;
- a5 = b5 + b6; a6 = MULSHIFT32(*cptr++, b6 - b5) << 2;
- b0 = a0 + a1; b1 = MULSHIFT32(COS4_0, a0 - a1) << 1;
- b2 = a2 + a3; b3 = MULSHIFT32(COS4_0, a3 - a2) << 1;
- buf[0] = b0; buf[1] = b1;
- buf[2] = b2 + b3; buf[3] = b3;
- b4 = a4 + a5; b5 = MULSHIFT32(COS4_0, a4 - a5) << 1;
- b6 = a6 + a7; b7 = MULSHIFT32(COS4_0, a7 - a6) << 1;
- b6 += b7;
- buf[4] = b4 + b6; buf[5] = b5 + b7;
- buf[6] = b5 + b6; buf[7] = b7;
- buf += 8;
- }
- buf -= 32;
-
- d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
- s = buf[ 0]; d[0] = d[8] = s;
-
-
- d = dest + offset + (oddBlock ? VBUF_LENGTH : 0);
- s = buf[ 1]; d[0] = d[8] = s; d += 64;
- tmp = buf[25] + buf[29];
- s = buf[17] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[ 9] + buf[13]; d[0] = d[8] = s; d += 64;
- s = buf[21] + tmp; d[0] = d[8] = s; d += 64;
- tmp = buf[29] + buf[27];
- s = buf[ 5]; d[0] = d[8] = s; d += 64;
- s = buf[21] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[13] + buf[11]; d[0] = d[8] = s; d += 64;
- s = buf[19] + tmp; d[0] = d[8] = s; d += 64;
- tmp = buf[27] + buf[31];
- s = buf[ 3]; d[0] = d[8] = s; d += 64;
- s = buf[19] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[11] + buf[15]; d[0] = d[8] = s; d += 64;
- s = buf[23] + tmp; d[0] = d[8] = s; d += 64;
- tmp = buf[31];
- s = buf[ 7]; d[0] = d[8] = s; d += 64;
- s = buf[23] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[15]; d[0] = d[8] = s; d += 64;
- s = tmp; d[0] = d[8] = s;
-
- d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
- s = buf[ 1]; d[0] = d[8] = s; d += 64;
- tmp = buf[30] + buf[25];
- s = buf[17] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[14] + buf[ 9]; d[0] = d[8] = s; d += 64;
- s = buf[22] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[ 6]; d[0] = d[8] = s; d += 64;
- tmp = buf[26] + buf[30];
- s = buf[22] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[10] + buf[14]; d[0] = d[8] = s; d += 64;
- s = buf[18] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[ 2]; d[0] = d[8] = s; d += 64;
- tmp = buf[28] + buf[26];
- s = buf[18] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[12] + buf[10]; d[0] = d[8] = s; d += 64;
- s = buf[20] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[ 4]; d[0] = d[8] = s; d += 64;
- tmp = buf[24] + buf[28];
- s = buf[20] + tmp; d[0] = d[8] = s; d += 64;
- s = buf[ 8] + buf[12]; d[0] = d[8] = s; d += 64;
- s = buf[16] + tmp; d[0] = d[8] = s;
-
- if (es) {
- d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
- s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es);
-
- d = dest + offset + (oddBlock ? VBUF_LENGTH : 0);
- for (i = 16; i <= 31; i++) {
- s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64;
- }
- d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
- for (i = 15; i >= 0; i--) {
- s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64;
- }
- }
- }
|