Mercurial > libavcodec.hg
annotate alpha/simple_idct_alpha.c @ 12494:94eaea836bf4 libavcodec
Check avctx width/height more thoroughly (e.g. all values 0 except width would
have been accepted before).
Also do not fail if they are invalid but instead override them to 0.
This allows decoding e.g. MPEG video when only the container values are corrupted.
For encoding a value of 0,0 of course makes no sense, but was allowed
through before and will be caught by an extra check in the encode function.
author | reimar |
---|---|
date | Wed, 15 Sep 2010 04:46:55 +0000 |
parents | 9e7d38743146 |
children |
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 | 6 * based upon some outcommented C code from mpeg2dec (idct_mmx.c |
7 * written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) | |
8 * | |
5220 | 9 * Alpha optimizations by Måns Rullgård <mans@mansr.com> |
5214 | 10 * and Falk Hueffner <falk@debian.org> |
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 | 29 #include "libavcodec/dsputil.h" |
11396 | 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 | 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 | 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 | 61 t2 = (uint16_t) a0; |
62 t2 |= t2 << 16; | |
63 t2 |= t2 << 32; | |
2967 | 64 |
1077 | 65 stq(t2, row); |
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 | 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 | 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 | 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 | 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 | 296 ff_simple_idct_axp(block); |
897 | 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 | 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 | 302 ff_simple_idct_axp(block); |
897 | 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 } |