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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
31
3945
9544ad38f02a fix a warning
lu_zero
parents: 3546
diff changeset
32 void put_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h);
9544ad38f02a fix a warning
lu_zero
parents: 3546
diff changeset
33
9544ad38f02a fix a warning
lu_zero
parents: 3546
diff changeset
34 void avg_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h);
9544ad38f02a fix a warning
lu_zero
parents: 3546
diff changeset
35
981
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
36 // used to build registers permutation vectors (vcprm)
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
37 // the 's' are for words in the _s_econd vector
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
38 #define WORD_0 0x00,0x01,0x02,0x03
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
39 #define WORD_1 0x04,0x05,0x06,0x07
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
40 #define WORD_2 0x08,0x09,0x0a,0x0b
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
41 #define WORD_3 0x0c,0x0d,0x0e,0x0f
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
42 #define WORD_s0 0x10,0x11,0x12,0x13
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
43 #define WORD_s1 0x14,0x15,0x16,0x17
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
44 #define WORD_s2 0x18,0x19,0x1a,0x1b
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
45 #define WORD_s3 0x1c,0x1d,0x1e,0x1f
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
46
1033
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1024
diff changeset
47 #ifdef CONFIG_DARWIN
981
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
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
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
52
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
53 // vcprmle is used to keep the same index as in the SSE version.
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
54 // it's the same as vcprm, with the index inversed
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
55 // ('le' is Little Endian)
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
56 #define vcprmle(a,b,c,d) vcprm(d,c,b,a)
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
57
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
58 // used to build inverse/identity vectors (vcii)
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
59 // n is _n_egative, p is _p_ositive
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
60 #define FLOAT_n -1.
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
61 #define FLOAT_p 1.
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
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
8bec850dc9c7 altivec patches by Romain Dolbeau
bellard
parents: 978
diff changeset
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
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
70 // Transpose 8x8 matrix of 16-bit elements (in-place)
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
71 #define TRANSPOSE8(a,b,c,d,e,f,g,h) \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
72 do { \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
73 vector signed short A1, B1, C1, D1, E1, F1, G1, H1; \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
74 vector signed short A2, B2, C2, D2, E2, F2, G2, H2; \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
75 \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
76 A1 = vec_mergeh (a, e); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
77 B1 = vec_mergel (a, e); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
78 C1 = vec_mergeh (b, f); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
79 D1 = vec_mergel (b, f); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
80 E1 = vec_mergeh (c, g); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
81 F1 = vec_mergel (c, g); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
82 G1 = vec_mergeh (d, h); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
83 H1 = vec_mergel (d, h); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
84 \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
85 A2 = vec_mergeh (A1, E1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
86 B2 = vec_mergel (A1, E1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
87 C2 = vec_mergeh (B1, F1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
88 D2 = vec_mergel (B1, F1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
89 E2 = vec_mergeh (C1, G1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
90 F2 = vec_mergel (C1, G1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
91 G2 = vec_mergeh (D1, H1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
92 H2 = vec_mergel (D1, H1); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
93 \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
94 a = vec_mergeh (A2, E2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
95 b = vec_mergel (A2, E2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
96 c = vec_mergeh (B2, F2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
97 d = vec_mergel (B2, F2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
98 e = vec_mergeh (C2, G2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
99 f = vec_mergel (C2, G2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
100 g = vec_mergeh (D2, H2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
101 h = vec_mergel (D2, H2); \
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
102 } while (0)
fec25fd9febf Move TRANSPOSE8 macro to dsputil_altivec.h.
gpoirier
parents: 3973
diff changeset
103
5119
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
104
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
105 /** \brief loads unaligned vector \a *src with offset \a offset
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
106 and returns it */
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
107 static inline vector unsigned char unaligned_load(int offset, uint8_t *src)
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
108 {
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
109 register vector unsigned char first = vec_ld(offset, src);
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
110 register vector unsigned char second = vec_ld(offset+15, src);
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
111 register vector unsigned char mask = vec_lvsl(offset, src);
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
112 return vec_perm(first, second, mask);
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
113 }
ad0c45e0008c Altivec version of h264_(h|v)_loop_filter_luma
gpoirier
parents: 3983
diff changeset
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_ */