annotate alpha/simple_idct_alpha.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 9e7d38743146
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
1 /*
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
2 * Simple IDCT (Alpha optimized)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
3 *
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
4 * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at>
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
5 *
5214
470601203f44 Group all copyright and author notices together.
diego
parents: 5010
diff changeset
6 * based upon some outcommented C code from mpeg2dec (idct_mmx.c
470601203f44 Group all copyright and author notices together.
diego
parents: 5010
diff changeset
7 * written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>)
470601203f44 Group all copyright and author notices together.
diego
parents: 5010
diff changeset
8 *
5220
744e91a36a23 update my email address
mru
parents: 5216
diff changeset
9 * Alpha optimizations by Måns Rullgård <mans@mansr.com>
5214
470601203f44 Group all copyright and author notices together.
diego
parents: 5010
diff changeset
10 * and Falk Hueffner <falk@debian.org>
470601203f44 Group all copyright and author notices together.
diego
parents: 5010
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
13 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
14 * FFmpeg is free software; you can redistribute it and/or
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
15 * modify it under the terms of the GNU Lesser General Public
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
16 * 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
17 * version 2.1 of the License, or (at your option) any later version.
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
18 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
19 * FFmpeg is distributed in the hope that it will be useful,
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
22 * Lesser General Public License for more details.
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
23 *
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
24 * 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
25 * 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
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
27 */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
28
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 5220
diff changeset
29 #include "libavcodec/dsputil.h"
11396
9e7d38743146 Alpha: move dsputil prototypes to a header file
mru
parents: 8621
diff changeset
30 #include "dsputil_alpha.h"
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
31 #include "asm.h"
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
32
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
33 // cos(i * M_PI / 16) * sqrt(2) * (1 << 14)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
34 // W4 is actually exactly 16384, but using 16383 works around
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
35 // accumulating rounding errors for some encoders
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
36 #define W1 ((int_fast32_t) 22725)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
37 #define W2 ((int_fast32_t) 21407)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
38 #define W3 ((int_fast32_t) 19266)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
39 #define W4 ((int_fast32_t) 16383)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
40 #define W5 ((int_fast32_t) 12873)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
41 #define W6 ((int_fast32_t) 8867)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
42 #define W7 ((int_fast32_t) 4520)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
43 #define ROW_SHIFT 11
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
44 #define COL_SHIFT 20
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
45
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
46 /* 0: all entries 0, 1: only first entry nonzero, 2: otherwise */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
47 static inline int idct_row(DCTELEM *row)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
48 {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
49 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3, t;
1077
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
50 uint64_t l, r, t2;
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
51 l = ldq(row);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
52 r = ldq(row + 4);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
53
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
54 if (l == 0 && r == 0)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
55 return 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2765
diff changeset
56
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
57 a0 = W4 * sextw(l) + (1 << (ROW_SHIFT - 1));
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
58
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
59 if (((l & ~0xffffUL) | r) == 0) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
60 a0 >>= ROW_SHIFT;
1077
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
61 t2 = (uint16_t) a0;
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
62 t2 |= t2 << 16;
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
63 t2 |= t2 << 32;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2765
diff changeset
64
1077
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
65 stq(t2, row);
296c7fc8358f 32 vs. 64bit bugfix by (Dave Huang (dahanc))
michaelni
parents: 897
diff changeset
66 stq(t2, row + 4);
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
67 return 1;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
68 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
69
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
70 a1 = a0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
71 a2 = a0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
72 a3 = a0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
73
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
74 t = extwl(l, 4); /* row[2] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
75 if (t != 0) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
76 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
77 a0 += W2 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
78 a1 += W6 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
79 a2 -= W6 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
80 a3 -= W2 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
81 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
82
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
83 t = extwl(r, 0); /* row[4] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
84 if (t != 0) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
85 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
86 a0 += W4 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
87 a1 -= W4 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
88 a2 -= W4 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
89 a3 += W4 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
90 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
91
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
92 t = extwl(r, 4); /* row[6] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
93 if (t != 0) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
94 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
95 a0 += W6 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
96 a1 -= W2 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
97 a2 += W2 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
98 a3 -= W6 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
99 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
100
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
101 t = extwl(l, 2); /* row[1] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
102 if (t != 0) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
103 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
104 b0 = W1 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
105 b1 = W3 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
106 b2 = W5 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
107 b3 = W7 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
108 } else {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
109 b0 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
110 b1 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
111 b2 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
112 b3 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
113 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
114
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
115 t = extwl(l, 6); /* row[3] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
116 if (t) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
117 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
118 b0 += W3 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
119 b1 -= W7 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
120 b2 -= W1 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
121 b3 -= W5 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
122 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
123
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2765
diff changeset
124
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
125 t = extwl(r, 2); /* row[5] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
126 if (t) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
127 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
128 b0 += W5 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
129 b1 -= W1 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
130 b2 += W7 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
131 b3 += W3 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
132 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
133
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
134 t = extwl(r, 6); /* row[7] */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
135 if (t) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
136 t = sextw(t);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
137 b0 += W7 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
138 b1 -= W5 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
139 b2 += W3 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
140 b3 -= W1 * t;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
141 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
142
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
143 row[0] = (a0 + b0) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
144 row[1] = (a1 + b1) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
145 row[2] = (a2 + b2) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
146 row[3] = (a3 + b3) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
147 row[4] = (a3 - b3) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
148 row[5] = (a2 - b2) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
149 row[6] = (a1 - b1) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
150 row[7] = (a0 - b0) >> ROW_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
151
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
152 return 2;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
153 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
154
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
155 static inline void idct_col(DCTELEM *col)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
156 {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
157 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
158
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
159 col[0] += (1 << (COL_SHIFT - 1)) / W4;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
160
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
161 a0 = W4 * col[8 * 0];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
162 a1 = W4 * col[8 * 0];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
163 a2 = W4 * col[8 * 0];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
164 a3 = W4 * col[8 * 0];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
165
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
166 if (col[8 * 2]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
167 a0 += W2 * col[8 * 2];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
168 a1 += W6 * col[8 * 2];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
169 a2 -= W6 * col[8 * 2];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
170 a3 -= W2 * col[8 * 2];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
171 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
172
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
173 if (col[8 * 4]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
174 a0 += W4 * col[8 * 4];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
175 a1 -= W4 * col[8 * 4];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
176 a2 -= W4 * col[8 * 4];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
177 a3 += W4 * col[8 * 4];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
178 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
179
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
180 if (col[8 * 6]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
181 a0 += W6 * col[8 * 6];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
182 a1 -= W2 * col[8 * 6];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
183 a2 += W2 * col[8 * 6];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
184 a3 -= W6 * col[8 * 6];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
185 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
186
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
187 if (col[8 * 1]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
188 b0 = W1 * col[8 * 1];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
189 b1 = W3 * col[8 * 1];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
190 b2 = W5 * col[8 * 1];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
191 b3 = W7 * col[8 * 1];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
192 } else {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
193 b0 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
194 b1 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
195 b2 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
196 b3 = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
197 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
198
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
199 if (col[8 * 3]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
200 b0 += W3 * col[8 * 3];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
201 b1 -= W7 * col[8 * 3];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
202 b2 -= W1 * col[8 * 3];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
203 b3 -= W5 * col[8 * 3];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
204 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
205
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
206 if (col[8 * 5]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
207 b0 += W5 * col[8 * 5];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
208 b1 -= W1 * col[8 * 5];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
209 b2 += W7 * col[8 * 5];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
210 b3 += W3 * col[8 * 5];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
211 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
212
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
213 if (col[8 * 7]) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
214 b0 += W7 * col[8 * 7];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
215 b1 -= W5 * col[8 * 7];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
216 b2 += W3 * col[8 * 7];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
217 b3 -= W1 * col[8 * 7];
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
218 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
219
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
220 col[8 * 0] = (a0 + b0) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
221 col[8 * 7] = (a0 - b0) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
222 col[8 * 1] = (a1 + b1) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
223 col[8 * 6] = (a1 - b1) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
224 col[8 * 2] = (a2 + b2) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
225 col[8 * 5] = (a2 - b2) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
226 col[8 * 3] = (a3 + b3) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
227 col[8 * 4] = (a3 - b3) >> COL_SHIFT;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
228 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
229
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
230 /* If all rows but the first one are zero after row transformation,
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
231 all rows will be identical after column transformation. */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
232 static inline void idct_col2(DCTELEM *col)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
233 {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
234 int i;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
235 uint64_t l, r;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
236
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
237 for (i = 0; i < 8; ++i) {
2765
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
238 int_fast32_t a0 = col[i] + (1 << (COL_SHIFT - 1)) / W4;
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
239
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
240 a0 *= W4;
2765
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
241 col[i] = a0 >> COL_SHIFT;
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
242 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
243
2765
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
244 l = ldq(col + 0 * 4); r = ldq(col + 1 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
245 stq(l, col + 2 * 4); stq(r, col + 3 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
246 stq(l, col + 4 * 4); stq(r, col + 5 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
247 stq(l, col + 6 * 4); stq(r, col + 7 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
248 stq(l, col + 8 * 4); stq(r, col + 9 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
249 stq(l, col + 10 * 4); stq(r, col + 11 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
250 stq(l, col + 12 * 4); stq(r, col + 13 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
251 stq(l, col + 14 * 4); stq(r, col + 15 * 4);
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
252 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
253
8621
72e109759617 Alpha: add ff_ prefix to idct functions
mru
parents: 6763
diff changeset
254 void ff_simple_idct_axp(DCTELEM *block)
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
255 {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
256
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
257 int i;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
258 int rowsZero = 1; /* all rows except row 0 zero */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
259 int rowsConstant = 1; /* all rows consist of a constant value */
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
260
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
261 for (i = 0; i < 8; i++) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
262 int sparseness = idct_row(block + 8 * i);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
263
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
264 if (i > 0 && sparseness > 0)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
265 rowsZero = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
266 if (sparseness == 2)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
267 rowsConstant = 0;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
268 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
269
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
270 if (rowsZero) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
271 idct_col2(block);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
272 } else if (rowsConstant) {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
273 idct_col(block);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
274 for (i = 0; i < 8; i += 2) {
2765
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
275 uint64_t v = (uint16_t) block[0];
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
276 uint64_t w = (uint16_t) block[8];
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
277
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
278 v |= v << 16;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
279 w |= w << 16;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
280 v |= v << 32;
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
281 w |= w << 32;
2765
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
282 stq(v, block + 0 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
283 stq(v, block + 1 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
284 stq(w, block + 2 * 4);
e44ff53b1c85 Communicate proper aliasing to gcc (needed for 4.1).
mellum
parents: 1077
diff changeset
285 stq(w, block + 3 * 4);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
286 block += 4 * 4;
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
287 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
288 } else {
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
289 for (i = 0; i < 8; i++)
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
290 idct_col(block + i);
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
291 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
292 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
293
8621
72e109759617 Alpha: add ff_ prefix to idct functions
mru
parents: 6763
diff changeset
294 void ff_simple_idct_put_axp(uint8_t *dest, int line_size, DCTELEM *block)
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
295 {
8621
72e109759617 Alpha: add ff_ prefix to idct functions
mru
parents: 6763
diff changeset
296 ff_simple_idct_axp(block);
897
3dbbdc2f8bd3 Kludge around compilation failure on Alpha.
mellum
parents: 744
diff changeset
297 put_pixels_clamped_axp_p(block, dest, line_size);
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
298 }
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
299
8621
72e109759617 Alpha: add ff_ prefix to idct functions
mru
parents: 6763
diff changeset
300 void ff_simple_idct_add_axp(uint8_t *dest, int line_size, DCTELEM *block)
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
301 {
8621
72e109759617 Alpha: add ff_ prefix to idct functions
mru
parents: 6763
diff changeset
302 ff_simple_idct_axp(block);
897
3dbbdc2f8bd3 Kludge around compilation failure on Alpha.
mellum
parents: 744
diff changeset
303 add_pixels_clamped_axp_p(block, dest, line_size);
744
2f7da29ede37 Move Alpha optimized IDCT to own file. Based on a patch by Mns
mellum
parents:
diff changeset
304 }