Mercurial > libavcodec.hg
annotate ppc/dsputil_altivec.h @ 5310:9aa9197034d7 libavcodec
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
More code cleanup.
Window is now runtime generated.
Fixed the bugs in rematrixing routine and
in Decoding AC3 Bitstreams when coupling is in use.
Still struggling to find out what affects the quality of
the produced sound. Can anybody have a look at the
imdct routines do_imdct_256 and do_imdct_512 and tell me
whether it is the correctly implemented as described in
standard.
author | jbr |
---|---|
date | Sat, 14 Jul 2007 15:57:51 +0000 |
parents | ad0c45e0008c |
children | 35cc7c922a76 |
rev | line source |
---|---|
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
1 /* |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
2 * Copyright (c) 2002 Brian Foley |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
3 * Copyright (c) 2002 Dieter Shirley |
1949
66215baae7b9
hadamard8_diff8x8 in AltiVec, the 16bits edition by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
1708
diff
changeset
|
4 * Copyright (c) 2003-2004 Romain Dolbeau <romain@dolbeau.org> |
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
16 * Lesser General Public License for more details. |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
17 * |
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3945
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2057
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
828
ace3ccd18dd2
Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
638
diff
changeset
|
21 */ |
878
6ea69518e5f7
altivec optimizations patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
828
diff
changeset
|
22 |
1015
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
23 #ifndef _DSPUTIL_ALTIVEC_ |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
24 #define _DSPUTIL_ALTIVEC_ |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
25 |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
26 #include "dsputil_ppc.h" |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
27 |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
28 #ifdef HAVE_ALTIVEC |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
29 |
638
0012f75c92bb
altivec build tidyup patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
diff
changeset
|
30 extern int has_altivec(void); |
981 | 31 |
3945 | 32 void put_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h); |
33 | |
34 void avg_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h); | |
35 | |
981 | 36 // used to build registers permutation vectors (vcprm) |
37 // the 's' are for words in the _s_econd vector | |
38 #define WORD_0 0x00,0x01,0x02,0x03 | |
39 #define WORD_1 0x04,0x05,0x06,0x07 | |
40 #define WORD_2 0x08,0x09,0x0a,0x0b | |
41 #define WORD_3 0x0c,0x0d,0x0e,0x0f | |
42 #define WORD_s0 0x10,0x11,0x12,0x13 | |
43 #define WORD_s1 0x14,0x15,0x16,0x17 | |
44 #define WORD_s2 0x18,0x19,0x1a,0x1b | |
45 #define WORD_s3 0x1c,0x1d,0x1e,0x1f | |
46 | |
1033
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
47 #ifdef CONFIG_DARWIN |
981 | 48 #define vcprm(a,b,c,d) (const vector unsigned char)(WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d) |
1033
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
49 #else |
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
50 #define vcprm(a,b,c,d) (const vector unsigned char){WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d} |
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
51 #endif |
981 | 52 |
53 // vcprmle is used to keep the same index as in the SSE version. | |
54 // it's the same as vcprm, with the index inversed | |
55 // ('le' is Little Endian) | |
56 #define vcprmle(a,b,c,d) vcprm(d,c,b,a) | |
57 | |
58 // used to build inverse/identity vectors (vcii) | |
59 // n is _n_egative, p is _p_ositive | |
60 #define FLOAT_n -1. | |
61 #define FLOAT_p 1. | |
62 | |
1033
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
63 |
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
64 #ifdef CONFIG_DARWIN |
981 | 65 #define vcii(a,b,c,d) (const vector float)(FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d) |
1033
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
66 #else |
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
67 #define vcii(a,b,c,d) (const vector float){FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d} |
b4172ff70d27
Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents:
1024
diff
changeset
|
68 #endif |
1009
3b7cc8e4b83f
AltiVec perf (take 2), plus a couple AltiVec functions by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
995
diff
changeset
|
69 |
3983 | 70 // Transpose 8x8 matrix of 16-bit elements (in-place) |
71 #define TRANSPOSE8(a,b,c,d,e,f,g,h) \ | |
72 do { \ | |
73 vector signed short A1, B1, C1, D1, E1, F1, G1, H1; \ | |
74 vector signed short A2, B2, C2, D2, E2, F2, G2, H2; \ | |
75 \ | |
76 A1 = vec_mergeh (a, e); \ | |
77 B1 = vec_mergel (a, e); \ | |
78 C1 = vec_mergeh (b, f); \ | |
79 D1 = vec_mergel (b, f); \ | |
80 E1 = vec_mergeh (c, g); \ | |
81 F1 = vec_mergel (c, g); \ | |
82 G1 = vec_mergeh (d, h); \ | |
83 H1 = vec_mergel (d, h); \ | |
84 \ | |
85 A2 = vec_mergeh (A1, E1); \ | |
86 B2 = vec_mergel (A1, E1); \ | |
87 C2 = vec_mergeh (B1, F1); \ | |
88 D2 = vec_mergel (B1, F1); \ | |
89 E2 = vec_mergeh (C1, G1); \ | |
90 F2 = vec_mergel (C1, G1); \ | |
91 G2 = vec_mergeh (D1, H1); \ | |
92 H2 = vec_mergel (D1, H1); \ | |
93 \ | |
94 a = vec_mergeh (A2, E2); \ | |
95 b = vec_mergel (A2, E2); \ | |
96 c = vec_mergeh (B2, F2); \ | |
97 d = vec_mergel (B2, F2); \ | |
98 e = vec_mergeh (C2, G2); \ | |
99 f = vec_mergel (C2, G2); \ | |
100 g = vec_mergeh (D2, H2); \ | |
101 h = vec_mergel (D2, H2); \ | |
102 } while (0) | |
103 | |
5119 | 104 |
105 /** \brief loads unaligned vector \a *src with offset \a offset | |
106 and returns it */ | |
107 static inline vector unsigned char unaligned_load(int offset, uint8_t *src) | |
108 { | |
109 register vector unsigned char first = vec_ld(offset, src); | |
110 register vector unsigned char second = vec_ld(offset+15, src); | |
111 register vector unsigned char mask = vec_lvsl(offset, src); | |
112 return vec_perm(first, second, mask); | |
113 } | |
114 | |
1009
3b7cc8e4b83f
AltiVec perf (take 2), plus a couple AltiVec functions by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
995
diff
changeset
|
115 #endif /* HAVE_ALTIVEC */ |
1015
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
116 |
35cf2f4a0f8c
PPC perf, PPC clear_block, AltiVec put_pixels8_xy2 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents:
1009
diff
changeset
|
117 #endif /* _DSPUTIL_ALTIVEC_ */ |