annotate ppc/mpegvideo_altivec.c @ 10936:b2ea6b0d17bf libavcodec

Update libx264.c to use new libx264 features With b_keyframe instead of IDR for detecting keyframes, ffmpeg should now support periodic encoding with periodic intra refresh (although there is no interface option for it yet). Set the new timebase values for full VFR input support. Bump configure to check for API version 83.
author darkshikari
date Tue, 19 Jan 2010 04:00:08 +0000
parents 71ead14665e3
children 98970e51365a
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:
diff changeset
1 /*
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
2 * Copyright (c) 2002 Dieter Shirley
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
3 *
1942
9241d99f7443 forgotten copyright & dct_quantize_altivec disabled patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 1839
diff changeset
4 * dct_unquantize_h263_altivec:
9241d99f7443 forgotten copyright & dct_quantize_altivec disabled patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 1839
diff changeset
5 * Copyright (c) 2003 Romain Dolbeau <romain@dolbeau.org>
9241d99f7443 forgotten copyright & dct_quantize_altivec disabled patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 1839
diff changeset
6 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
8 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
9 * 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:
diff changeset
10 * 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:
diff changeset
11 * 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: 3036
diff changeset
12 * 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:
diff changeset
13 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
14 * 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:
diff changeset
15 * 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:
diff changeset
16 * 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:
diff changeset
17 * Lesser General Public License for more details.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
18 *
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
19 * 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: 3036
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
21 * 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:
diff changeset
22 */
1277
f3152eb76f1a altivec gcc-3 fixes by (Magnus Damm <damm at opensource dot se>)
michaelni
parents: 1107
diff changeset
23
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
24 #include <stdlib.h>
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
25 #include <stdio.h>
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6486
diff changeset
26 #include "libavcodec/dsputil.h"
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6486
diff changeset
27 #include "libavcodec/mpegvideo.h"
1277
f3152eb76f1a altivec gcc-3 fixes by (Magnus Damm <damm at opensource dot se>)
michaelni
parents: 1107
diff changeset
28
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents: 5746
diff changeset
29 #include "dsputil_ppc.h"
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents: 5746
diff changeset
30 #include "util_altivec.h"
10079
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
31 #include "types_altivec.h"
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
32
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
33 // Swaps two variables (used for altivec registers)
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
34 #define SWAP(a,b) \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
35 do { \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
36 __typeof__(a) swap_temp=a; \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
37 a=b; \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
38 b=swap_temp; \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
39 } while (0)
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
40
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
41 // transposes a matrix consisting of four vectors with four elements each
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
42 #define TRANSPOSE4(a,b,c,d) \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
43 do { \
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
44 __typeof__(a) _trans_ach = vec_mergeh(a, c); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
45 __typeof__(a) _trans_acl = vec_mergel(a, c); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
46 __typeof__(a) _trans_bdh = vec_mergeh(b, d); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
47 __typeof__(a) _trans_bdl = vec_mergel(b, d); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
48 \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
49 a = vec_mergeh(_trans_ach, _trans_bdh); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
50 b = vec_mergel(_trans_ach, _trans_bdh); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
51 c = vec_mergeh(_trans_acl, _trans_bdl); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
52 d = vec_mergel(_trans_acl, _trans_bdl); \
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
53 } while (0)
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
54
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
55
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
56 // Loads a four-byte value (int or float) from the target address
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
57 // into every element in the target vector. Only works if the
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
58 // target address is four-byte aligned (which should be always).
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
59 #define LOAD4(vec, address) \
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
60 { \
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
61 __typeof__(vec)* _load_addr = (__typeof__(vec)*)(address); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
62 vector unsigned char _perm_vec = vec_lvsl(0,(address)); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
63 vec = vec_ld(0, _load_addr); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
64 vec = vec_perm(vec, vec, _perm_vec); \
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
65 vec = vec_splat(vec, 0); \
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
66 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
67
1033
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
68
7373
266d4949aa15 Remove AltiVec vector declaration compiler compatibility macros.
diego
parents: 7333
diff changeset
69 #define FOUROF(a) {a,a,a,a}
6367
f02434b252ce Refactor the FOUROF macro using the AVV macro.
diego
parents: 6366
diff changeset
70
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
71 int dct_quantize_altivec(MpegEncContext* s,
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
72 DCTELEM* data, int n,
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
73 int qscale, int* overflow)
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
74 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
75 int lastNonZero;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
76 vector float row0, row1, row2, row3, row4, row5, row6, row7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
77 vector float alt0, alt1, alt2, alt3, alt4, alt5, alt6, alt7;
5746
55ed6dc5d476 Remove const vector macro indirection that is useless and obfuscating
diego
parents: 5579
diff changeset
78 const vector float zero = (const vector float)FOUROF(0.);
5963
80103098c797 spelling
vitor
parents: 5761
diff changeset
79 // used after quantize step
1839
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
80 int oldBaseValue = 0;
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
81
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
82 // Load the data into the row/alt vectors
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
83 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
84 vector signed short data0, data1, data2, data3, data4, data5, data6, data7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
85
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
86 data0 = vec_ld(0, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
87 data1 = vec_ld(16, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
88 data2 = vec_ld(32, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
89 data3 = vec_ld(48, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
90 data4 = vec_ld(64, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
91 data5 = vec_ld(80, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
92 data6 = vec_ld(96, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
93 data7 = vec_ld(112, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
94
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
95 // Transpose the data before we start
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
96 TRANSPOSE8(data0, data1, data2, data3, data4, data5, data6, data7);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
97
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
98 // load the data into floating point vectors. We load
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
99 // the high half of each row into the main row vectors
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
100 // and the low half into the alt vectors.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
101 row0 = vec_ctf(vec_unpackh(data0), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
102 alt0 = vec_ctf(vec_unpackl(data0), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
103 row1 = vec_ctf(vec_unpackh(data1), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
104 alt1 = vec_ctf(vec_unpackl(data1), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
105 row2 = vec_ctf(vec_unpackh(data2), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
106 alt2 = vec_ctf(vec_unpackl(data2), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
107 row3 = vec_ctf(vec_unpackh(data3), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
108 alt3 = vec_ctf(vec_unpackl(data3), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
109 row4 = vec_ctf(vec_unpackh(data4), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
110 alt4 = vec_ctf(vec_unpackl(data4), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
111 row5 = vec_ctf(vec_unpackh(data5), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
112 alt5 = vec_ctf(vec_unpackl(data5), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
113 row6 = vec_ctf(vec_unpackh(data6), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
114 alt6 = vec_ctf(vec_unpackl(data6), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
115 row7 = vec_ctf(vec_unpackh(data7), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
116 alt7 = vec_ctf(vec_unpackl(data7), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
117 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
118
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
119 // The following block could exist as a separate an altivec dct
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 // function. However, if we put it inline, the DCT data can remain
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 // in the vector local variables, as floats, which we'll use during the
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 // quantize step...
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
123 {
1033
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
124 const vector float vec_0_298631336 = (vector float)FOUROF(0.298631336f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
125 const vector float vec_0_390180644 = (vector float)FOUROF(-0.390180644f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
126 const vector float vec_0_541196100 = (vector float)FOUROF(0.541196100f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
127 const vector float vec_0_765366865 = (vector float)FOUROF(0.765366865f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
128 const vector float vec_0_899976223 = (vector float)FOUROF(-0.899976223f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
129 const vector float vec_1_175875602 = (vector float)FOUROF(1.175875602f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
130 const vector float vec_1_501321110 = (vector float)FOUROF(1.501321110f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
131 const vector float vec_1_847759065 = (vector float)FOUROF(-1.847759065f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
132 const vector float vec_1_961570560 = (vector float)FOUROF(-1.961570560f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
133 const vector float vec_2_053119869 = (vector float)FOUROF(2.053119869f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
134 const vector float vec_2_562915447 = (vector float)FOUROF(-2.562915447f);
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
135 const vector float vec_3_072711026 = (vector float)FOUROF(3.072711026f);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
136
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
137
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
138 int whichPass, whichHalf;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
139
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
140 for(whichPass = 1; whichPass<=2; whichPass++) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
141 for(whichHalf = 1; whichHalf<=2; whichHalf++) {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
142 vector float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
143 vector float tmp10, tmp11, tmp12, tmp13;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
144 vector float z1, z2, z3, z4, z5;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
145
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
146 tmp0 = vec_add(row0, row7); // tmp0 = dataptr[0] + dataptr[7];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
147 tmp7 = vec_sub(row0, row7); // tmp7 = dataptr[0] - dataptr[7];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
148 tmp3 = vec_add(row3, row4); // tmp3 = dataptr[3] + dataptr[4];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
149 tmp4 = vec_sub(row3, row4); // tmp4 = dataptr[3] - dataptr[4];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
150 tmp1 = vec_add(row1, row6); // tmp1 = dataptr[1] + dataptr[6];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
151 tmp6 = vec_sub(row1, row6); // tmp6 = dataptr[1] - dataptr[6];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
152 tmp2 = vec_add(row2, row5); // tmp2 = dataptr[2] + dataptr[5];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
153 tmp5 = vec_sub(row2, row5); // tmp5 = dataptr[2] - dataptr[5];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
154
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
155 tmp10 = vec_add(tmp0, tmp3); // tmp10 = tmp0 + tmp3;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
156 tmp13 = vec_sub(tmp0, tmp3); // tmp13 = tmp0 - tmp3;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
157 tmp11 = vec_add(tmp1, tmp2); // tmp11 = tmp1 + tmp2;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
158 tmp12 = vec_sub(tmp1, tmp2); // tmp12 = tmp1 - tmp2;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
159
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
160
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
161 // dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
162 row0 = vec_add(tmp10, tmp11);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
163
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
164 // dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
165 row4 = vec_sub(tmp10, tmp11);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
166
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
167
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
168 // z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
169 z1 = vec_madd(vec_add(tmp12, tmp13), vec_0_541196100, (vector float)zero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
170
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
171 // dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
172 // CONST_BITS-PASS1_BITS);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
173 row2 = vec_madd(tmp13, vec_0_765366865, z1);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
174
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
175 // dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
176 // CONST_BITS-PASS1_BITS);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
177 row6 = vec_madd(tmp12, vec_1_847759065, z1);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
178
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
179 z1 = vec_add(tmp4, tmp7); // z1 = tmp4 + tmp7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
180 z2 = vec_add(tmp5, tmp6); // z2 = tmp5 + tmp6;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
181 z3 = vec_add(tmp4, tmp6); // z3 = tmp4 + tmp6;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
182 z4 = vec_add(tmp5, tmp7); // z4 = tmp5 + tmp7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
183
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
184 // z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
185 z5 = vec_madd(vec_add(z3, z4), vec_1_175875602, (vector float)zero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
186
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
187 // z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
188 z3 = vec_madd(z3, vec_1_961570560, z5);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
189
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
190 // z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
191 z4 = vec_madd(z4, vec_0_390180644, z5);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
192
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
193 // The following adds are rolled into the multiplies above
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
194 // z3 = vec_add(z3, z5); // z3 += z5;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
195 // z4 = vec_add(z4, z5); // z4 += z5;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
196
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
197 // z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
6486
3f96dc62c4b9 misc spelling fixes
diego
parents: 6371
diff changeset
198 // Wow! It's actually more efficient to roll this multiply
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
199 // into the adds below, even thought the multiply gets done twice!
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
200 // z2 = vec_madd(z2, vec_2_562915447, (vector float)zero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
201
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
202 // z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
203 // Same with this one...
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
204 // z1 = vec_madd(z1, vec_0_899976223, (vector float)zero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
205
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
206 // tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
207 // dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
208 row7 = vec_madd(tmp4, vec_0_298631336, vec_madd(z1, vec_0_899976223, z3));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
209
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
210 // tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
211 // dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
212 row5 = vec_madd(tmp5, vec_2_053119869, vec_madd(z2, vec_2_562915447, z4));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
213
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
214 // tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
215 // dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
216 row3 = vec_madd(tmp6, vec_3_072711026, vec_madd(z2, vec_2_562915447, z3));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
217
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
218 // tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
219 // dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
220 row1 = vec_madd(z1, vec_0_899976223, vec_madd(tmp7, vec_1_501321110, z4));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
221
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
222 // Swap the row values with the alts. If this is the first half,
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
223 // this sets up the low values to be acted on in the second half.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
224 // If this is the second half, it puts the high values back in
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
225 // the row values where they are expected to be when we're done.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
226 SWAP(row0, alt0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
227 SWAP(row1, alt1);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
228 SWAP(row2, alt2);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
229 SWAP(row3, alt3);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
230 SWAP(row4, alt4);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
231 SWAP(row5, alt5);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
232 SWAP(row6, alt6);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
233 SWAP(row7, alt7);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
234 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
235
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
236 if (whichPass == 1) {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
237 // transpose the data for the second pass
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
238
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
239 // First, block transpose the upper right with lower left.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
240 SWAP(row4, alt0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
241 SWAP(row5, alt1);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
242 SWAP(row6, alt2);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
243 SWAP(row7, alt3);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
244
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
245 // Now, transpose each block of four
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
246 TRANSPOSE4(row0, row1, row2, row3);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
247 TRANSPOSE4(row4, row5, row6, row7);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
248 TRANSPOSE4(alt0, alt1, alt2, alt3);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
249 TRANSPOSE4(alt4, alt5, alt6, alt7);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
250 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
251 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
252 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
253
5963
80103098c797 spelling
vitor
parents: 5761
diff changeset
254 // perform the quantize step, using the floating point data
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
255 // still in the row/alt registers
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
256 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
257 const int* biasAddr;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
258 const vector signed int* qmat;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
259 vector float bias, negBias;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
260
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
261 if (s->mb_intra) {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
262 vector signed int baseVector;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
263
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
264 // We must cache element 0 in the intra case
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
265 // (it needs special handling).
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
266 baseVector = vec_cts(vec_splat(row0, 0), 0);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
267 vec_ste(baseVector, 0, &oldBaseValue);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
268
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
269 qmat = (vector signed int*)s->q_intra_matrix[qscale];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
270 biasAddr = &(s->intra_quant_bias);
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
271 } else {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
272 qmat = (vector signed int*)s->q_inter_matrix[qscale];
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
273 biasAddr = &(s->inter_quant_bias);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
274 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
275
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
276 // Load the bias vector (We add 0.5 to the bias so that we're
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
277 // rounding when we convert to int, instead of flooring.)
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
278 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
279 vector signed int biasInt;
1033
b4172ff70d27 Altivec on non darwin systems patch by Romain Dolbeau
bellard
parents: 1015
diff changeset
280 const vector float negOneFloat = (vector float)FOUROF(-1.0f);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
281 LOAD4(biasInt, biasAddr);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
282 bias = vec_ctf(biasInt, QUANT_BIAS_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
283 negBias = vec_madd(bias, negOneFloat, zero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
284 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
285
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
286 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
287 vector float q0, q1, q2, q3, q4, q5, q6, q7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
288
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
289 q0 = vec_ctf(qmat[0], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
290 q1 = vec_ctf(qmat[2], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
291 q2 = vec_ctf(qmat[4], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
292 q3 = vec_ctf(qmat[6], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
293 q4 = vec_ctf(qmat[8], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
294 q5 = vec_ctf(qmat[10], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
295 q6 = vec_ctf(qmat[12], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
296 q7 = vec_ctf(qmat[14], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
297
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
298 row0 = vec_sel(vec_madd(row0, q0, negBias), vec_madd(row0, q0, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
299 vec_cmpgt(row0, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
300 row1 = vec_sel(vec_madd(row1, q1, negBias), vec_madd(row1, q1, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
301 vec_cmpgt(row1, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
302 row2 = vec_sel(vec_madd(row2, q2, negBias), vec_madd(row2, q2, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
303 vec_cmpgt(row2, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
304 row3 = vec_sel(vec_madd(row3, q3, negBias), vec_madd(row3, q3, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
305 vec_cmpgt(row3, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
306 row4 = vec_sel(vec_madd(row4, q4, negBias), vec_madd(row4, q4, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
307 vec_cmpgt(row4, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
308 row5 = vec_sel(vec_madd(row5, q5, negBias), vec_madd(row5, q5, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
309 vec_cmpgt(row5, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
310 row6 = vec_sel(vec_madd(row6, q6, negBias), vec_madd(row6, q6, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
311 vec_cmpgt(row6, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
312 row7 = vec_sel(vec_madd(row7, q7, negBias), vec_madd(row7, q7, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
313 vec_cmpgt(row7, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
314
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
315 q0 = vec_ctf(qmat[1], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
316 q1 = vec_ctf(qmat[3], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
317 q2 = vec_ctf(qmat[5], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
318 q3 = vec_ctf(qmat[7], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
319 q4 = vec_ctf(qmat[9], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
320 q5 = vec_ctf(qmat[11], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
321 q6 = vec_ctf(qmat[13], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
322 q7 = vec_ctf(qmat[15], QMAT_SHIFT);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
323
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
324 alt0 = vec_sel(vec_madd(alt0, q0, negBias), vec_madd(alt0, q0, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
325 vec_cmpgt(alt0, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
326 alt1 = vec_sel(vec_madd(alt1, q1, negBias), vec_madd(alt1, q1, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
327 vec_cmpgt(alt1, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
328 alt2 = vec_sel(vec_madd(alt2, q2, negBias), vec_madd(alt2, q2, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
329 vec_cmpgt(alt2, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
330 alt3 = vec_sel(vec_madd(alt3, q3, negBias), vec_madd(alt3, q3, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
331 vec_cmpgt(alt3, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
332 alt4 = vec_sel(vec_madd(alt4, q4, negBias), vec_madd(alt4, q4, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
333 vec_cmpgt(alt4, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
334 alt5 = vec_sel(vec_madd(alt5, q5, negBias), vec_madd(alt5, q5, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
335 vec_cmpgt(alt5, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
336 alt6 = vec_sel(vec_madd(alt6, q6, negBias), vec_madd(alt6, q6, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
337 vec_cmpgt(alt6, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
338 alt7 = vec_sel(vec_madd(alt7, q7, negBias), vec_madd(alt7, q7, bias),
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
339 vec_cmpgt(alt7, zero));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
340 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
341
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
342
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
343 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
344
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
345 // Store the data back into the original block
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
346 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
347 vector signed short data0, data1, data2, data3, data4, data5, data6, data7;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
348
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
349 data0 = vec_pack(vec_cts(row0, 0), vec_cts(alt0, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
350 data1 = vec_pack(vec_cts(row1, 0), vec_cts(alt1, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
351 data2 = vec_pack(vec_cts(row2, 0), vec_cts(alt2, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
352 data3 = vec_pack(vec_cts(row3, 0), vec_cts(alt3, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
353 data4 = vec_pack(vec_cts(row4, 0), vec_cts(alt4, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
354 data5 = vec_pack(vec_cts(row5, 0), vec_cts(alt5, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
355 data6 = vec_pack(vec_cts(row6, 0), vec_cts(alt6, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
356 data7 = vec_pack(vec_cts(row7, 0), vec_cts(alt7, 0));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
357
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
358 {
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
359 // Clamp for overflow
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
360 vector signed int max_q_int, min_q_int;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
361 vector signed short max_q, min_q;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
362
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
363 LOAD4(max_q_int, &(s->max_qcoeff));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
364 LOAD4(min_q_int, &(s->min_qcoeff));
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
365
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
366 max_q = vec_pack(max_q_int, max_q_int);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
367 min_q = vec_pack(min_q_int, min_q_int);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
368
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
369 data0 = vec_max(vec_min(data0, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
370 data1 = vec_max(vec_min(data1, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
371 data2 = vec_max(vec_min(data2, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
372 data4 = vec_max(vec_min(data4, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
373 data5 = vec_max(vec_min(data5, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
374 data6 = vec_max(vec_min(data6, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
375 data7 = vec_max(vec_min(data7, max_q), min_q);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
376 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
377
1839
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
378 {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
379 vector bool char zero_01, zero_23, zero_45, zero_67;
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
380 vector signed char scanIndexes_01, scanIndexes_23, scanIndexes_45, scanIndexes_67;
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
381 vector signed char negOne = vec_splat_s8(-1);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
382 vector signed char* scanPtr =
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
383 (vector signed char*)(s->intra_scantable.inverse);
1839
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
384 signed char lastNonZeroChar;
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
385
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
386 // Determine the largest non-zero index.
1839
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
387 zero_01 = vec_pack(vec_cmpeq(data0, (vector signed short)zero),
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
388 vec_cmpeq(data1, (vector signed short)zero));
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
389 zero_23 = vec_pack(vec_cmpeq(data2, (vector signed short)zero),
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
390 vec_cmpeq(data3, (vector signed short)zero));
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
391 zero_45 = vec_pack(vec_cmpeq(data4, (vector signed short)zero),
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
392 vec_cmpeq(data5, (vector signed short)zero));
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
393 zero_67 = vec_pack(vec_cmpeq(data6, (vector signed short)zero),
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
394 vec_cmpeq(data7, (vector signed short)zero));
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
395
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
396 // 64 biggest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
397 scanIndexes_01 = vec_sel(scanPtr[0], negOne, zero_01);
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
398 scanIndexes_23 = vec_sel(scanPtr[1], negOne, zero_23);
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
399 scanIndexes_45 = vec_sel(scanPtr[2], negOne, zero_45);
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
400 scanIndexes_67 = vec_sel(scanPtr[3], negOne, zero_67);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
401
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
402 // 32 largest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
403 scanIndexes_01 = vec_max(scanIndexes_01, scanIndexes_23);
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
404 scanIndexes_45 = vec_max(scanIndexes_45, scanIndexes_67);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
405
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
406 // 16 largest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
407 scanIndexes_01 = vec_max(scanIndexes_01, scanIndexes_45);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
408
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
409 // 8 largest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
410 scanIndexes_01 = vec_max(vec_mergeh(scanIndexes_01, negOne),
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
411 vec_mergel(scanIndexes_01, negOne));
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
412
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
413 // 4 largest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
414 scanIndexes_01 = vec_max(vec_mergeh(scanIndexes_01, negOne),
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
415 vec_mergel(scanIndexes_01, negOne));
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
416
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
417 // 2 largest values
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
418 scanIndexes_01 = vec_max(vec_mergeh(scanIndexes_01, negOne),
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
419 vec_mergel(scanIndexes_01, negOne));
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
420
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
421 // largest value
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
422 scanIndexes_01 = vec_max(vec_mergeh(scanIndexes_01, negOne),
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
423 vec_mergel(scanIndexes_01, negOne));
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
424
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
425 scanIndexes_01 = vec_splat(scanIndexes_01, 0);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
426
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
427
6905
d163c4f3f4ab consistency cosmetics: indices --> indexes in variable names
diego
parents: 6763
diff changeset
428 vec_ste(scanIndexes_01, 0, &lastNonZeroChar);
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
429
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
430 lastNonZero = lastNonZeroChar;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
431
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
432 // While the data is still in vectors we check for the transpose IDCT permute
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
433 // and handle it using the vector unit if we can. This is the permute used
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
434 // by the altivec idct, so it is common when using the altivec dct.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
435
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
436 if ((lastNonZero > 0) && (s->dsp.idct_permutation_type == FF_TRANSPOSE_IDCT_PERM)) {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
437 TRANSPOSE8(data0, data1, data2, data3, data4, data5, data6, data7);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
438 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
439
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
440 vec_st(data0, 0, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
441 vec_st(data1, 16, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
442 vec_st(data2, 32, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
443 vec_st(data3, 48, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
444 vec_st(data4, 64, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
445 vec_st(data5, 80, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
446 vec_st(data6, 96, data);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
447 vec_st(data7, 112, data);
1839
b370288f004d Metrowerks CodeWarrior patches by (John Dalgliesh <johnd at defyne dot org>)
michael
parents: 1352
diff changeset
448 }
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
449 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
450
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
451 // special handling of block[0]
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
452 if (s->mb_intra) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
453 if (!s->h263_aic) {
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
454 if (n < 4)
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
455 oldBaseValue /= s->y_dc_scale;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
456 else
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
457 oldBaseValue /= s->c_dc_scale;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
458 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
459
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
460 // Divide by 8, rounding the result
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
461 data[0] = (oldBaseValue + 4) >> 3;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
462 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
463
5963
80103098c797 spelling
vitor
parents: 5761
diff changeset
464 // We handled the transpose permutation above and we don't
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
465 // need to permute the "no" permutation case.
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
466 if ((lastNonZero > 0) &&
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1033
diff changeset
467 (s->dsp.idct_permutation_type != FF_TRANSPOSE_IDCT_PERM) &&
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
468 (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)) {
1107
28f0e53706a7 altivec compilation fixes by (Magnus Damm <damm at opensource dot se>)
michaelni
parents: 1092
diff changeset
469 ff_block_permute(data, s->dsp.idct_permutation,
828
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
470 s->intra_scantable.scantable, lastNonZero);
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
471 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
472
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
473 return lastNonZero;
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
474 }
ace3ccd18dd2 Altivec Patch (Mark III) by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents:
diff changeset
475
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
476 /* AltiVec version of dct_unquantize_h263
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
477 this code assumes `block' is 16 bytes-aligned */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
478 void dct_unquantize_h263_altivec(MpegEncContext *s,
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
479 DCTELEM *block, int n, int qscale)
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
480 {
1352
e8ff4783f188 1) remove TBL support in PPC performance. It's much more useful to use the
michaelni
parents: 1277
diff changeset
481 POWERPC_PERF_DECLARE(altivec_dct_unquantize_h263_num, 1);
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
482 int i, level, qmul, qadd;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
483 int nCoeffs;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
484
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
485 assert(s->block_last_index[n]>=0);
1009
3b7cc8e4b83f AltiVec perf (take 2), plus a couple AltiVec functions by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents: 1001
diff changeset
486
1352
e8ff4783f188 1) remove TBL support in PPC performance. It's much more useful to use the
michaelni
parents: 1277
diff changeset
487 POWERPC_PERF_START_COUNT(altivec_dct_unquantize_h263_num, 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
488
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
489 qadd = (qscale - 1) | 1;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
490 qmul = qscale << 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
491
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
492 if (s->mb_intra) {
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
493 if (!s->h263_aic) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
494 if (n < 4)
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
495 block[0] = block[0] * s->y_dc_scale;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
496 else
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
497 block[0] = block[0] * s->c_dc_scale;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
498 }else
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
499 qadd = 0;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
500 i = 1;
4795
522e52c630bd typos/grammar
diego
parents: 3983
diff changeset
501 nCoeffs= 63; //does not always use zigzag table
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
502 } else {
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
503 i = 0;
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
504 nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ];
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
505 }
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
506
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
507 {
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
508 register const vector signed short vczero = (const vector signed short)vec_splat_s16(0);
10079
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
509 DECLARE_ALIGNED_16(short, qmul8) = qmul;
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
510 DECLARE_ALIGNED_16(short, qadd8) = qadd;
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
511 register vector signed short blockv, qmulv, qaddv, nqaddv, temp1;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
512 register vector bool short blockv_null, blockv_neg;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
513 register short backup_0 = block[0];
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
514 register int j = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
515
10079
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
516 qmulv = vec_splat((vec_s16)vec_lde(0, &qmul8), 0);
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
517 qaddv = vec_splat((vec_s16)vec_lde(0, &qadd8), 0);
71ead14665e3 PPC: simplify loading some values into altivec registers
mru
parents: 9421
diff changeset
518 nqaddv = vec_sub(vczero, qaddv);
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
519
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
520 #if 0 // block *is* 16 bytes-aligned, it seems.
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
521 // first make sure block[j] is 16 bytes-aligned
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
522 for(j = 0; (j <= nCoeffs) && ((((unsigned long)block) + (j << 1)) & 0x0000000F) ; j++) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
523 level = block[j];
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
524 if (level) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
525 if (level < 0) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
526 level = level * qmul - qadd;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
527 } else {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
528 level = level * qmul + qadd;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
529 }
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
530 block[j] = level;
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
531 }
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
532 }
1009
3b7cc8e4b83f AltiVec perf (take 2), plus a couple AltiVec functions by (Romain Dolbeau <dolbeau at irisa dot fr>)
michaelni
parents: 1001
diff changeset
533 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
534
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
535 // vectorize all the 16 bytes-aligned blocks
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
536 // of 8 elements
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
537 for(; (j + 7) <= nCoeffs ; j+=8) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
538 blockv = vec_ld(j << 1, block);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
539 blockv_neg = vec_cmplt(blockv, vczero);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
540 blockv_null = vec_cmpeq(blockv, vczero);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
541 // choose between +qadd or -qadd as the third operand
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
542 temp1 = vec_sel(qaddv, nqaddv, blockv_neg);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
543 // multiply & add (block{i,i+7} * qmul [+-] qadd)
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
544 temp1 = vec_mladd(blockv, qmulv, temp1);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
545 // put 0 where block[{i,i+7} used to have 0
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
546 blockv = vec_sel(temp1, blockv, blockv_null);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
547 vec_st(blockv, j << 1, block);
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
548 }
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
549
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
550 // if nCoeffs isn't a multiple of 8, finish the job
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
551 // using good old scalar units.
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
552 // (we could do it using a truncated vector,
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
553 // but I'm not sure it's worth the hassle)
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
554 for(; j <= nCoeffs ; j++) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
555 level = block[j];
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
556 if (level) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
557 if (level < 0) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
558 level = level * qmul - qadd;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
559 } else {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
560 level = level * qmul + qadd;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
561 }
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
562 block[j] = level;
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
563 }
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
564 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1942
diff changeset
565
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
566 if (i == 1) {
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
567 // cheat. this avoid special-casing the first iteration
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
568 block[0] = backup_0;
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
569 }
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
570 }
1352
e8ff4783f188 1) remove TBL support in PPC performance. It's much more useful to use the
michaelni
parents: 1277
diff changeset
571 POWERPC_PERF_STOP_COUNT(altivec_dct_unquantize_h263_num, nCoeffs == 63);
1001
95cbffdc98a9 dct_unquantize_h263_altivec by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michaelni
parents: 995
diff changeset
572 }
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
573
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
574
8250
cf4d575b1982 Delete unnecessary 'extern' keywords.
diego
parents: 8104
diff changeset
575 void idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
cf4d575b1982 Delete unnecessary 'extern' keywords.
diego
parents: 8104
diff changeset
576 void idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
577
5761
72b59f7613af Rename MPV_common_init_ppc to MPV_common_init_altivec, the function is
diego
parents: 5751
diff changeset
578 void MPV_common_init_altivec(MpegEncContext *s)
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
579 {
8104
0d108ec85620 Remove duplicated MM_* macros for CPU capabilities from dsputil.h.
rathann
parents: 7373
diff changeset
580 if ((mm_flags & FF_MM_ALTIVEC) == 0) return;
6365
80c7e9c015c6 fix crash on non-AltiVec powered machines: MPV_common_init_altivec doesn't check mm_flags
gpoirier
parents: 5963
diff changeset
581
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
582 if (s->avctx->lowres==0) {
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
583 if ((s->avctx->idct_algo == FF_IDCT_AUTO) ||
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
584 (s->avctx->idct_algo == FF_IDCT_ALTIVEC)) {
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
585 s->dsp.idct_put = idct_put_altivec;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
586 s->dsp.idct_add = idct_add_altivec;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
587 s->dsp.idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
588 }
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
589 }
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
590
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
591 // Test to make sure that the dct required alignments are met.
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
592 if ((((long)(s->q_intra_matrix) & 0x0f) != 0) ||
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
593 (((long)(s->q_inter_matrix) & 0x0f) != 0)) {
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
594 av_log(s->avctx, AV_LOG_INFO, "Internal Error: q-matrix blocks must be 16-byte aligned "
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
595 "to use AltiVec DCT. Reverting to non-AltiVec version.\n");
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
596 return;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
597 }
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
598
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
599 if (((long)(s->intra_scantable.inverse) & 0x0f) != 0) {
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
600 av_log(s->avctx, AV_LOG_INFO, "Internal Error: scan table blocks must be 16-byte aligned "
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
601 "to use AltiVec DCT. Reverting to non-AltiVec version.\n");
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
602 return;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
603 }
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
604
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
605
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
606 if ((s->avctx->dct_algo == FF_DCT_AUTO) ||
7333
a8a79f5385f6 cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents: 6905
diff changeset
607 (s->avctx->dct_algo == FF_DCT_ALTIVEC)) {
5751
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
608 #if 0 /* seems to cause trouble under some circumstances */
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
609 s->dct_quantize = dct_quantize_altivec;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
610 #endif
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
611 s->dct_unquantize_h263_intra = dct_unquantize_h263_altivec;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
612 s->dct_unquantize_h263_inter = dct_unquantize_h263_altivec;
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
613 }
3260fa3c89eb Merge mpegvideo AltiVec code into mpegvideo_altivec.c where it belongs.
diego
parents: 5750
diff changeset
614 }