| rev |
line source |
|
nengel@2
|
1 /*
|
|
nengel@2
|
2 * DSP utils
|
|
nengel@2
|
3 * Copyright (c) 2000, 2001 Fabrice Bellard
|
|
nengel@2
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
|
nengel@2
|
5 *
|
|
nengel@2
|
6 * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at>
|
|
nengel@2
|
7 *
|
|
nengel@2
|
8 * This file is part of FFmpeg.
|
|
nengel@2
|
9 *
|
|
nengel@2
|
10 * FFmpeg is free software; you can redistribute it and/or
|
|
nengel@2
|
11 * modify it under the terms of the GNU Lesser General Public
|
|
nengel@2
|
12 * License as published by the Free Software Foundation; either
|
|
nengel@2
|
13 * version 2.1 of the License, or (at your option) any later version.
|
|
nengel@2
|
14 *
|
|
nengel@2
|
15 * FFmpeg is distributed in the hope that it will be useful,
|
|
nengel@2
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
nengel@2
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
nengel@2
|
18 * Lesser General Public License for more details.
|
|
nengel@2
|
19 *
|
|
nengel@2
|
20 * You should have received a copy of the GNU Lesser General Public
|
|
nengel@2
|
21 * License along with FFmpeg; if not, write to the Free Software
|
|
nengel@2
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
nengel@2
|
23 */
|
|
nengel@2
|
24
|
|
nengel@2
|
25 /**
|
|
nengel@2
|
26 * @file
|
|
nengel@2
|
27 * DSP utils
|
|
nengel@2
|
28 */
|
|
nengel@2
|
29
|
|
nengel@2
|
30 #include "libavutil/log.h"
|
|
nengel@2
|
31 #include "dsputil.h"
|
|
nengel@2
|
32 #include "simple_idct.h"
|
|
nengel@2
|
33 #include "mathops.h"
|
|
nengel@2
|
34 #include "config.h"
|
|
nengel@2
|
35
|
|
nengel@2
|
36 uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, };
|
|
nengel@2
|
37 uint32_t ff_squareTbl[512] = {0, };
|
|
nengel@2
|
38
|
|
nengel@2
|
39 const uint8_t ff_zigzag_direct[64] = {
|
|
nengel@2
|
40 0, 1, 8, 16, 9, 2, 3, 10,
|
|
nengel@2
|
41 17, 24, 32, 25, 18, 11, 4, 5,
|
|
nengel@2
|
42 12, 19, 26, 33, 40, 48, 41, 34,
|
|
nengel@2
|
43 27, 20, 13, 6, 7, 14, 21, 28,
|
|
nengel@2
|
44 35, 42, 49, 56, 57, 50, 43, 36,
|
|
nengel@2
|
45 29, 22, 15, 23, 30, 37, 44, 51,
|
|
nengel@2
|
46 58, 59, 52, 45, 38, 31, 39, 46,
|
|
nengel@2
|
47 53, 60, 61, 54, 47, 55, 62, 63
|
|
nengel@2
|
48 };
|
|
nengel@2
|
49
|
|
nengel@2
|
50
|
|
nengel@2
|
51 #define PIXOP2(OPNAME, OP) \
|
|
nengel@2
|
52 static void OPNAME ## _pixels2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
53 int i;\
|
|
nengel@2
|
54 for(i=0; i<h; i++){\
|
|
nengel@2
|
55 OP(*((uint16_t*)(block )), AV_RN16(pixels ));\
|
|
nengel@2
|
56 pixels+=line_size;\
|
|
nengel@2
|
57 block +=line_size;\
|
|
nengel@2
|
58 }\
|
|
nengel@2
|
59 }\
|
|
nengel@2
|
60 static void OPNAME ## _pixels4_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
61 int i;\
|
|
nengel@2
|
62 for(i=0; i<h; i++){\
|
|
nengel@2
|
63 OP(*((uint32_t*)(block )), AV_RN32(pixels ));\
|
|
nengel@2
|
64 pixels+=line_size;\
|
|
nengel@2
|
65 block +=line_size;\
|
|
nengel@2
|
66 }\
|
|
nengel@2
|
67 }\
|
|
nengel@2
|
68 static void OPNAME ## _pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
69 int i;\
|
|
nengel@2
|
70 for(i=0; i<h; i++){\
|
|
nengel@2
|
71 OP(*((uint32_t*)(block )), AV_RN32(pixels ));\
|
|
nengel@2
|
72 OP(*((uint32_t*)(block+4)), AV_RN32(pixels+4));\
|
|
nengel@2
|
73 pixels+=line_size;\
|
|
nengel@2
|
74 block +=line_size;\
|
|
nengel@2
|
75 }\
|
|
nengel@2
|
76 }\
|
|
nengel@2
|
77 static inline void OPNAME ## _no_rnd_pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
78 OPNAME ## _pixels8_c(block, pixels, line_size, h);\
|
|
nengel@2
|
79 }\
|
|
nengel@2
|
80 \
|
|
nengel@2
|
81 static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
82 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
83 int i;\
|
|
nengel@2
|
84 for(i=0; i<h; i++){\
|
|
nengel@2
|
85 uint32_t a,b;\
|
|
nengel@2
|
86 a= AV_RN32(&src1[i*src_stride1 ]);\
|
|
nengel@2
|
87 b= AV_RN32(&src2[i*src_stride2 ]);\
|
|
nengel@2
|
88 OP(*((uint32_t*)&dst[i*dst_stride ]), no_rnd_avg32(a, b));\
|
|
nengel@2
|
89 a= AV_RN32(&src1[i*src_stride1+4]);\
|
|
nengel@2
|
90 b= AV_RN32(&src2[i*src_stride2+4]);\
|
|
nengel@2
|
91 OP(*((uint32_t*)&dst[i*dst_stride+4]), no_rnd_avg32(a, b));\
|
|
nengel@2
|
92 }\
|
|
nengel@2
|
93 }\
|
|
nengel@2
|
94 \
|
|
nengel@2
|
95 static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
96 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
97 int i;\
|
|
nengel@2
|
98 for(i=0; i<h; i++){\
|
|
nengel@2
|
99 uint32_t a,b;\
|
|
nengel@2
|
100 a= AV_RN32(&src1[i*src_stride1 ]);\
|
|
nengel@2
|
101 b= AV_RN32(&src2[i*src_stride2 ]);\
|
|
nengel@2
|
102 OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
|
|
nengel@2
|
103 a= AV_RN32(&src1[i*src_stride1+4]);\
|
|
nengel@2
|
104 b= AV_RN32(&src2[i*src_stride2+4]);\
|
|
nengel@2
|
105 OP(*((uint32_t*)&dst[i*dst_stride+4]), rnd_avg32(a, b));\
|
|
nengel@2
|
106 }\
|
|
nengel@2
|
107 }\
|
|
nengel@2
|
108 \
|
|
nengel@2
|
109 static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
110 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
111 int i;\
|
|
nengel@2
|
112 for(i=0; i<h; i++){\
|
|
nengel@2
|
113 uint32_t a,b;\
|
|
nengel@2
|
114 a= AV_RN32(&src1[i*src_stride1 ]);\
|
|
nengel@2
|
115 b= AV_RN32(&src2[i*src_stride2 ]);\
|
|
nengel@2
|
116 OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
|
|
nengel@2
|
117 }\
|
|
nengel@2
|
118 }\
|
|
nengel@2
|
119 \
|
|
nengel@2
|
120 static inline void OPNAME ## _pixels2_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
121 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
122 int i;\
|
|
nengel@2
|
123 for(i=0; i<h; i++){\
|
|
nengel@2
|
124 uint32_t a,b;\
|
|
nengel@2
|
125 a= AV_RN16(&src1[i*src_stride1 ]);\
|
|
nengel@2
|
126 b= AV_RN16(&src2[i*src_stride2 ]);\
|
|
nengel@2
|
127 OP(*((uint16_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
|
|
nengel@2
|
128 }\
|
|
nengel@2
|
129 }\
|
|
nengel@2
|
130 \
|
|
nengel@2
|
131 static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
132 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
133 OPNAME ## _pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\
|
|
nengel@2
|
134 OPNAME ## _pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\
|
|
nengel@2
|
135 }\
|
|
nengel@2
|
136 \
|
|
nengel@2
|
137 static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
|
|
nengel@2
|
138 int src_stride1, int src_stride2, int h){\
|
|
nengel@2
|
139 OPNAME ## _no_rnd_pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\
|
|
nengel@2
|
140 OPNAME ## _no_rnd_pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\
|
|
nengel@2
|
141 }\
|
|
nengel@2
|
142 \
|
|
nengel@2
|
143 static inline void OPNAME ## _no_rnd_pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
144 OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
|
|
nengel@2
|
145 }\
|
|
nengel@2
|
146 \
|
|
nengel@2
|
147 static inline void OPNAME ## _pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
148 OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
|
|
nengel@2
|
149 }\
|
|
nengel@2
|
150 \
|
|
nengel@2
|
151 static inline void OPNAME ## _no_rnd_pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
152 OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
|
|
nengel@2
|
153 }\
|
|
nengel@2
|
154 \
|
|
nengel@2
|
155 static inline void OPNAME ## _pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
156 OPNAME ## _pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
|
|
nengel@2
|
157 }\
|
|
nengel@2
|
158 \
|
|
nengel@2
|
159 static inline void OPNAME ## _pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
|
|
nengel@2
|
160 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
|
|
nengel@2
|
161 int i;\
|
|
nengel@2
|
162 for(i=0; i<h; i++){\
|
|
nengel@2
|
163 uint32_t a, b, c, d, l0, l1, h0, h1;\
|
|
nengel@2
|
164 a= AV_RN32(&src1[i*src_stride1]);\
|
|
nengel@2
|
165 b= AV_RN32(&src2[i*src_stride2]);\
|
|
nengel@2
|
166 c= AV_RN32(&src3[i*src_stride3]);\
|
|
nengel@2
|
167 d= AV_RN32(&src4[i*src_stride4]);\
|
|
nengel@2
|
168 l0= (a&0x03030303UL)\
|
|
nengel@2
|
169 + (b&0x03030303UL)\
|
|
nengel@2
|
170 + 0x02020202UL;\
|
|
nengel@2
|
171 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
172 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
173 l1= (c&0x03030303UL)\
|
|
nengel@2
|
174 + (d&0x03030303UL);\
|
|
nengel@2
|
175 h1= ((c&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
176 + ((d&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
177 OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
178 a= AV_RN32(&src1[i*src_stride1+4]);\
|
|
nengel@2
|
179 b= AV_RN32(&src2[i*src_stride2+4]);\
|
|
nengel@2
|
180 c= AV_RN32(&src3[i*src_stride3+4]);\
|
|
nengel@2
|
181 d= AV_RN32(&src4[i*src_stride4+4]);\
|
|
nengel@2
|
182 l0= (a&0x03030303UL)\
|
|
nengel@2
|
183 + (b&0x03030303UL)\
|
|
nengel@2
|
184 + 0x02020202UL;\
|
|
nengel@2
|
185 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
186 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
187 l1= (c&0x03030303UL)\
|
|
nengel@2
|
188 + (d&0x03030303UL);\
|
|
nengel@2
|
189 h1= ((c&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
190 + ((d&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
191 OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
192 }\
|
|
nengel@2
|
193 }\
|
|
nengel@2
|
194 \
|
|
nengel@2
|
195 static inline void OPNAME ## _pixels4_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
196 OPNAME ## _pixels4_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
|
|
nengel@2
|
197 }\
|
|
nengel@2
|
198 \
|
|
nengel@2
|
199 static inline void OPNAME ## _pixels4_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
200 OPNAME ## _pixels4_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
|
|
nengel@2
|
201 }\
|
|
nengel@2
|
202 \
|
|
nengel@2
|
203 static inline void OPNAME ## _pixels2_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
204 OPNAME ## _pixels2_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
|
|
nengel@2
|
205 }\
|
|
nengel@2
|
206 \
|
|
nengel@2
|
207 static inline void OPNAME ## _pixels2_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
|
|
nengel@2
|
208 OPNAME ## _pixels2_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
|
|
nengel@2
|
209 }\
|
|
nengel@2
|
210 \
|
|
nengel@2
|
211 static inline void OPNAME ## _no_rnd_pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
|
|
nengel@2
|
212 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
|
|
nengel@2
|
213 int i;\
|
|
nengel@2
|
214 for(i=0; i<h; i++){\
|
|
nengel@2
|
215 uint32_t a, b, c, d, l0, l1, h0, h1;\
|
|
nengel@2
|
216 a= AV_RN32(&src1[i*src_stride1]);\
|
|
nengel@2
|
217 b= AV_RN32(&src2[i*src_stride2]);\
|
|
nengel@2
|
218 c= AV_RN32(&src3[i*src_stride3]);\
|
|
nengel@2
|
219 d= AV_RN32(&src4[i*src_stride4]);\
|
|
nengel@2
|
220 l0= (a&0x03030303UL)\
|
|
nengel@2
|
221 + (b&0x03030303UL)\
|
|
nengel@2
|
222 + 0x01010101UL;\
|
|
nengel@2
|
223 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
224 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
225 l1= (c&0x03030303UL)\
|
|
nengel@2
|
226 + (d&0x03030303UL);\
|
|
nengel@2
|
227 h1= ((c&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
228 + ((d&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
229 OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
230 a= AV_RN32(&src1[i*src_stride1+4]);\
|
|
nengel@2
|
231 b= AV_RN32(&src2[i*src_stride2+4]);\
|
|
nengel@2
|
232 c= AV_RN32(&src3[i*src_stride3+4]);\
|
|
nengel@2
|
233 d= AV_RN32(&src4[i*src_stride4+4]);\
|
|
nengel@2
|
234 l0= (a&0x03030303UL)\
|
|
nengel@2
|
235 + (b&0x03030303UL)\
|
|
nengel@2
|
236 + 0x01010101UL;\
|
|
nengel@2
|
237 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
238 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
239 l1= (c&0x03030303UL)\
|
|
nengel@2
|
240 + (d&0x03030303UL);\
|
|
nengel@2
|
241 h1= ((c&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
242 + ((d&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
243 OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
244 }\
|
|
nengel@2
|
245 }\
|
|
nengel@2
|
246 static inline void OPNAME ## _pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
|
|
nengel@2
|
247 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
|
|
nengel@2
|
248 OPNAME ## _pixels8_l4(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
|
|
nengel@2
|
249 OPNAME ## _pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
|
|
nengel@2
|
250 }\
|
|
nengel@2
|
251 static inline void OPNAME ## _no_rnd_pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
|
|
nengel@2
|
252 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
|
|
nengel@2
|
253 OPNAME ## _no_rnd_pixels8_l4(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
|
|
nengel@2
|
254 OPNAME ## _no_rnd_pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
|
|
nengel@2
|
255 }\
|
|
nengel@2
|
256 \
|
|
nengel@2
|
257 static inline void OPNAME ## _pixels2_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
|
|
nengel@2
|
258 {\
|
|
nengel@2
|
259 int i, a0, b0, a1, b1;\
|
|
nengel@2
|
260 a0= pixels[0];\
|
|
nengel@2
|
261 b0= pixels[1] + 2;\
|
|
nengel@2
|
262 a0 += b0;\
|
|
nengel@2
|
263 b0 += pixels[2];\
|
|
nengel@2
|
264 \
|
|
nengel@2
|
265 pixels+=line_size;\
|
|
nengel@2
|
266 for(i=0; i<h; i+=2){\
|
|
nengel@2
|
267 a1= pixels[0];\
|
|
nengel@2
|
268 b1= pixels[1];\
|
|
nengel@2
|
269 a1 += b1;\
|
|
nengel@2
|
270 b1 += pixels[2];\
|
|
nengel@2
|
271 \
|
|
nengel@2
|
272 block[0]= (a1+a0)>>2; /* FIXME non put */\
|
|
nengel@2
|
273 block[1]= (b1+b0)>>2;\
|
|
nengel@2
|
274 \
|
|
nengel@2
|
275 pixels+=line_size;\
|
|
nengel@2
|
276 block +=line_size;\
|
|
nengel@2
|
277 \
|
|
nengel@2
|
278 a0= pixels[0];\
|
|
nengel@2
|
279 b0= pixels[1] + 2;\
|
|
nengel@2
|
280 a0 += b0;\
|
|
nengel@2
|
281 b0 += pixels[2];\
|
|
nengel@2
|
282 \
|
|
nengel@2
|
283 block[0]= (a1+a0)>>2;\
|
|
nengel@2
|
284 block[1]= (b1+b0)>>2;\
|
|
nengel@2
|
285 pixels+=line_size;\
|
|
nengel@2
|
286 block +=line_size;\
|
|
nengel@2
|
287 }\
|
|
nengel@2
|
288 }\
|
|
nengel@2
|
289 \
|
|
nengel@2
|
290 static inline void OPNAME ## _pixels4_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
|
|
nengel@2
|
291 {\
|
|
nengel@2
|
292 int i;\
|
|
nengel@2
|
293 const uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
294 const uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
295 uint32_t l0= (a&0x03030303UL)\
|
|
nengel@2
|
296 + (b&0x03030303UL)\
|
|
nengel@2
|
297 + 0x02020202UL;\
|
|
nengel@2
|
298 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
299 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
300 uint32_t l1,h1;\
|
|
nengel@2
|
301 \
|
|
nengel@2
|
302 pixels+=line_size;\
|
|
nengel@2
|
303 for(i=0; i<h; i+=2){\
|
|
nengel@2
|
304 uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
305 uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
306 l1= (a&0x03030303UL)\
|
|
nengel@2
|
307 + (b&0x03030303UL);\
|
|
nengel@2
|
308 h1= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
309 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
310 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
311 pixels+=line_size;\
|
|
nengel@2
|
312 block +=line_size;\
|
|
nengel@2
|
313 a= AV_RN32(pixels );\
|
|
nengel@2
|
314 b= AV_RN32(pixels+1);\
|
|
nengel@2
|
315 l0= (a&0x03030303UL)\
|
|
nengel@2
|
316 + (b&0x03030303UL)\
|
|
nengel@2
|
317 + 0x02020202UL;\
|
|
nengel@2
|
318 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
319 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
320 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
321 pixels+=line_size;\
|
|
nengel@2
|
322 block +=line_size;\
|
|
nengel@2
|
323 }\
|
|
nengel@2
|
324 }\
|
|
nengel@2
|
325 \
|
|
nengel@2
|
326 static inline void OPNAME ## _pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
|
|
nengel@2
|
327 {\
|
|
nengel@2
|
328 int j;\
|
|
nengel@2
|
329 for(j=0; j<2; j++){\
|
|
nengel@2
|
330 int i;\
|
|
nengel@2
|
331 const uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
332 const uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
333 uint32_t l0= (a&0x03030303UL)\
|
|
nengel@2
|
334 + (b&0x03030303UL)\
|
|
nengel@2
|
335 + 0x02020202UL;\
|
|
nengel@2
|
336 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
337 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
338 uint32_t l1,h1;\
|
|
nengel@2
|
339 \
|
|
nengel@2
|
340 pixels+=line_size;\
|
|
nengel@2
|
341 for(i=0; i<h; i+=2){\
|
|
nengel@2
|
342 uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
343 uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
344 l1= (a&0x03030303UL)\
|
|
nengel@2
|
345 + (b&0x03030303UL);\
|
|
nengel@2
|
346 h1= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
347 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
348 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
349 pixels+=line_size;\
|
|
nengel@2
|
350 block +=line_size;\
|
|
nengel@2
|
351 a= AV_RN32(pixels );\
|
|
nengel@2
|
352 b= AV_RN32(pixels+1);\
|
|
nengel@2
|
353 l0= (a&0x03030303UL)\
|
|
nengel@2
|
354 + (b&0x03030303UL)\
|
|
nengel@2
|
355 + 0x02020202UL;\
|
|
nengel@2
|
356 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
357 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
358 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
359 pixels+=line_size;\
|
|
nengel@2
|
360 block +=line_size;\
|
|
nengel@2
|
361 }\
|
|
nengel@2
|
362 pixels+=4-line_size*(h+1);\
|
|
nengel@2
|
363 block +=4-line_size*h;\
|
|
nengel@2
|
364 }\
|
|
nengel@2
|
365 }\
|
|
nengel@2
|
366 \
|
|
nengel@2
|
367 static inline void OPNAME ## _no_rnd_pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
|
|
nengel@2
|
368 {\
|
|
nengel@2
|
369 int j;\
|
|
nengel@2
|
370 for(j=0; j<2; j++){\
|
|
nengel@2
|
371 int i;\
|
|
nengel@2
|
372 const uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
373 const uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
374 uint32_t l0= (a&0x03030303UL)\
|
|
nengel@2
|
375 + (b&0x03030303UL)\
|
|
nengel@2
|
376 + 0x01010101UL;\
|
|
nengel@2
|
377 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
378 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
379 uint32_t l1,h1;\
|
|
nengel@2
|
380 \
|
|
nengel@2
|
381 pixels+=line_size;\
|
|
nengel@2
|
382 for(i=0; i<h; i+=2){\
|
|
nengel@2
|
383 uint32_t a= AV_RN32(pixels );\
|
|
nengel@2
|
384 uint32_t b= AV_RN32(pixels+1);\
|
|
nengel@2
|
385 l1= (a&0x03030303UL)\
|
|
nengel@2
|
386 + (b&0x03030303UL);\
|
|
nengel@2
|
387 h1= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
388 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
389 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
390 pixels+=line_size;\
|
|
nengel@2
|
391 block +=line_size;\
|
|
nengel@2
|
392 a= AV_RN32(pixels );\
|
|
nengel@2
|
393 b= AV_RN32(pixels+1);\
|
|
nengel@2
|
394 l0= (a&0x03030303UL)\
|
|
nengel@2
|
395 + (b&0x03030303UL)\
|
|
nengel@2
|
396 + 0x01010101UL;\
|
|
nengel@2
|
397 h0= ((a&0xFCFCFCFCUL)>>2)\
|
|
nengel@2
|
398 + ((b&0xFCFCFCFCUL)>>2);\
|
|
nengel@2
|
399 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
|
|
nengel@2
|
400 pixels+=line_size;\
|
|
nengel@2
|
401 block +=line_size;\
|
|
nengel@2
|
402 }\
|
|
nengel@2
|
403 pixels+=4-line_size*(h+1);\
|
|
nengel@2
|
404 block +=4-line_size*h;\
|
|
nengel@2
|
405 }\
|
|
nengel@2
|
406 }\
|
|
nengel@2
|
407 \
|
|
nengel@2
|
408 CALL_2X_PIXELS(OPNAME ## _pixels16_c , OPNAME ## _pixels8_c , 8)\
|
|
nengel@2
|
409
|
|
nengel@2
|
410 #define op_avg(a, b) a = rnd_avg32(a, b)
|
|
nengel@2
|
411
|
|
nengel@2
|
412 #define op_put(a, b) a = b
|
|
nengel@2
|
413
|
|
nengel@2
|
414 PIXOP2(avg, op_avg)
|
|
nengel@2
|
415 PIXOP2(put, op_put)
|
|
nengel@2
|
416 #undef op_avg
|
|
nengel@2
|
417 #undef op_put
|
|
nengel@2
|
418
|
|
nengel@2
|
419
|
|
nengel@2
|
420 #define H264_CHROMA_MC(OPNAME, OP)\
|
|
nengel@2
|
421 static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
|
|
nengel@2
|
422 const int A=(8-x)*(8-y);\
|
|
nengel@2
|
423 const int B=( x)*(8-y);\
|
|
nengel@2
|
424 const int C=(8-x)*( y);\
|
|
nengel@2
|
425 const int D=( x)*( y);\
|
|
nengel@2
|
426 int i;\
|
|
nengel@2
|
427 \
|
|
nengel@2
|
428 assert(x<8 && y<8 && x>=0 && y>=0);\
|
|
nengel@2
|
429 \
|
|
nengel@2
|
430 if(D){\
|
|
nengel@2
|
431 for(i=0; i<h; i++){\
|
|
nengel@2
|
432 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
|
|
nengel@2
|
433 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
|
|
nengel@2
|
434 dst+= stride;\
|
|
nengel@2
|
435 src+= stride;\
|
|
nengel@2
|
436 }\
|
|
nengel@2
|
437 }else{\
|
|
nengel@2
|
438 const int E= B+C;\
|
|
nengel@2
|
439 const int step= C ? stride : 1;\
|
|
nengel@2
|
440 for(i=0; i<h; i++){\
|
|
nengel@2
|
441 OP(dst[0], (A*src[0] + E*src[step+0]));\
|
|
nengel@2
|
442 OP(dst[1], (A*src[1] + E*src[step+1]));\
|
|
nengel@2
|
443 dst+= stride;\
|
|
nengel@2
|
444 src+= stride;\
|
|
nengel@2
|
445 }\
|
|
nengel@2
|
446 }\
|
|
nengel@2
|
447 }\
|
|
nengel@2
|
448 \
|
|
nengel@2
|
449 static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
|
|
nengel@2
|
450 const int A=(8-x)*(8-y);\
|
|
nengel@2
|
451 const int B=( x)*(8-y);\
|
|
nengel@2
|
452 const int C=(8-x)*( y);\
|
|
nengel@2
|
453 const int D=( x)*( y);\
|
|
nengel@2
|
454 int i;\
|
|
nengel@2
|
455 \
|
|
nengel@2
|
456 assert(x<8 && y<8 && x>=0 && y>=0);\
|
|
nengel@2
|
457 \
|
|
nengel@2
|
458 if(D){\
|
|
nengel@2
|
459 for(i=0; i<h; i++){\
|
|
nengel@2
|
460 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
|
|
nengel@2
|
461 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
|
|
nengel@2
|
462 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
|
|
nengel@2
|
463 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
|
|
nengel@2
|
464 dst+= stride;\
|
|
nengel@2
|
465 src+= stride;\
|
|
nengel@2
|
466 }\
|
|
nengel@2
|
467 }else{\
|
|
nengel@2
|
468 const int E= B+C;\
|
|
nengel@2
|
469 const int step= C ? stride : 1;\
|
|
nengel@2
|
470 for(i=0; i<h; i++){\
|
|
nengel@2
|
471 OP(dst[0], (A*src[0] + E*src[step+0]));\
|
|
nengel@2
|
472 OP(dst[1], (A*src[1] + E*src[step+1]));\
|
|
nengel@2
|
473 OP(dst[2], (A*src[2] + E*src[step+2]));\
|
|
nengel@2
|
474 OP(dst[3], (A*src[3] + E*src[step+3]));\
|
|
nengel@2
|
475 dst+= stride;\
|
|
nengel@2
|
476 src+= stride;\
|
|
nengel@2
|
477 }\
|
|
nengel@2
|
478 }\
|
|
nengel@2
|
479 }\
|
|
nengel@2
|
480 \
|
|
nengel@2
|
481 static void OPNAME ## h264_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
|
|
nengel@2
|
482 const int A=(8-x)*(8-y);\
|
|
nengel@2
|
483 const int B=( x)*(8-y);\
|
|
nengel@2
|
484 const int C=(8-x)*( y);\
|
|
nengel@2
|
485 const int D=( x)*( y);\
|
|
nengel@2
|
486 int i;\
|
|
nengel@2
|
487 \
|
|
nengel@2
|
488 assert(x<8 && y<8 && x>=0 && y>=0);\
|
|
nengel@2
|
489 \
|
|
nengel@2
|
490 if(D){\
|
|
nengel@2
|
491 for(i=0; i<h; i++){\
|
|
nengel@2
|
492 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
|
|
nengel@2
|
493 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
|
|
nengel@2
|
494 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
|
|
nengel@2
|
495 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
|
|
nengel@2
|
496 OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
|
|
nengel@2
|
497 OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
|
|
nengel@2
|
498 OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
|
|
nengel@2
|
499 OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
|
|
nengel@2
|
500 dst+= stride;\
|
|
nengel@2
|
501 src+= stride;\
|
|
nengel@2
|
502 }\
|
|
nengel@2
|
503 }else{\
|
|
nengel@2
|
504 const int E= B+C;\
|
|
nengel@2
|
505 const int step= C ? stride : 1;\
|
|
nengel@2
|
506 for(i=0; i<h; i++){\
|
|
nengel@2
|
507 OP(dst[0], (A*src[0] + E*src[step+0]));\
|
|
nengel@2
|
508 OP(dst[1], (A*src[1] + E*src[step+1]));\
|
|
nengel@2
|
509 OP(dst[2], (A*src[2] + E*src[step+2]));\
|
|
nengel@2
|
510 OP(dst[3], (A*src[3] + E*src[step+3]));\
|
|
nengel@2
|
511 OP(dst[4], (A*src[4] + E*src[step+4]));\
|
|
nengel@2
|
512 OP(dst[5], (A*src[5] + E*src[step+5]));\
|
|
nengel@2
|
513 OP(dst[6], (A*src[6] + E*src[step+6]));\
|
|
nengel@2
|
514 OP(dst[7], (A*src[7] + E*src[step+7]));\
|
|
nengel@2
|
515 dst+= stride;\
|
|
nengel@2
|
516 src+= stride;\
|
|
nengel@2
|
517 }\
|
|
nengel@2
|
518 }\
|
|
nengel@2
|
519 }
|
|
nengel@2
|
520
|
|
nengel@2
|
521 #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
|
|
nengel@2
|
522 #define op_put(a, b) a = (((b) + 32)>>6)
|
|
nengel@2
|
523
|
|
nengel@2
|
524 H264_CHROMA_MC(put_ , op_put)
|
|
nengel@2
|
525 H264_CHROMA_MC(avg_ , op_avg)
|
|
nengel@2
|
526 #undef op_avg
|
|
nengel@2
|
527 #undef op_put
|
|
nengel@2
|
528
|
|
nengel@2
|
529
|
|
nengel@2
|
530 #define H264_LOWPASS(OPNAME, OP, OP2) \
|
|
nengel@2
|
531 static av_unused void OPNAME ## h264_qpel2_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
532 const int h=2;\
|
|
nengel@2
|
533 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
534 int i;\
|
|
nengel@2
|
535 for(i=0; i<h; i++)\
|
|
nengel@2
|
536 {\
|
|
nengel@2
|
537 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));\
|
|
nengel@2
|
538 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));\
|
|
nengel@2
|
539 dst+=dstStride;\
|
|
nengel@2
|
540 src+=srcStride;\
|
|
nengel@2
|
541 }\
|
|
nengel@2
|
542 }\
|
|
nengel@2
|
543 \
|
|
nengel@2
|
544 static av_unused void OPNAME ## h264_qpel2_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
545 const int w=2;\
|
|
nengel@2
|
546 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
547 int i;\
|
|
nengel@2
|
548 for(i=0; i<w; i++)\
|
|
nengel@2
|
549 {\
|
|
nengel@2
|
550 const int srcB= src[-2*srcStride];\
|
|
nengel@2
|
551 const int srcA= src[-1*srcStride];\
|
|
nengel@2
|
552 const int src0= src[0 *srcStride];\
|
|
nengel@2
|
553 const int src1= src[1 *srcStride];\
|
|
nengel@2
|
554 const int src2= src[2 *srcStride];\
|
|
nengel@2
|
555 const int src3= src[3 *srcStride];\
|
|
nengel@2
|
556 const int src4= src[4 *srcStride];\
|
|
nengel@2
|
557 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
|
|
nengel@2
|
558 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
|
|
nengel@2
|
559 dst++;\
|
|
nengel@2
|
560 src++;\
|
|
nengel@2
|
561 }\
|
|
nengel@2
|
562 }\
|
|
nengel@2
|
563 \
|
|
nengel@2
|
564 static av_unused void OPNAME ## h264_qpel2_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
|
|
nengel@2
|
565 const int h=2;\
|
|
nengel@2
|
566 const int w=2;\
|
|
nengel@2
|
567 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
568 int i;\
|
|
nengel@2
|
569 src -= 2*srcStride;\
|
|
nengel@2
|
570 for(i=0; i<h+5; i++)\
|
|
nengel@2
|
571 {\
|
|
nengel@2
|
572 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);\
|
|
nengel@2
|
573 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);\
|
|
nengel@2
|
574 tmp+=tmpStride;\
|
|
nengel@2
|
575 src+=srcStride;\
|
|
nengel@2
|
576 }\
|
|
nengel@2
|
577 tmp -= tmpStride*(h+5-2);\
|
|
nengel@2
|
578 for(i=0; i<w; i++)\
|
|
nengel@2
|
579 {\
|
|
nengel@2
|
580 const int tmpB= tmp[-2*tmpStride];\
|
|
nengel@2
|
581 const int tmpA= tmp[-1*tmpStride];\
|
|
nengel@2
|
582 const int tmp0= tmp[0 *tmpStride];\
|
|
nengel@2
|
583 const int tmp1= tmp[1 *tmpStride];\
|
|
nengel@2
|
584 const int tmp2= tmp[2 *tmpStride];\
|
|
nengel@2
|
585 const int tmp3= tmp[3 *tmpStride];\
|
|
nengel@2
|
586 const int tmp4= tmp[4 *tmpStride];\
|
|
nengel@2
|
587 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
|
|
nengel@2
|
588 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
|
|
nengel@2
|
589 dst++;\
|
|
nengel@2
|
590 tmp++;\
|
|
nengel@2
|
591 }\
|
|
nengel@2
|
592 }\
|
|
nengel@2
|
593 static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
594 const int h=4;\
|
|
nengel@2
|
595 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
596 int i;\
|
|
nengel@2
|
597 for(i=0; i<h; i++)\
|
|
nengel@2
|
598 {\
|
|
nengel@2
|
599 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));\
|
|
nengel@2
|
600 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));\
|
|
nengel@2
|
601 OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]));\
|
|
nengel@2
|
602 OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]));\
|
|
nengel@2
|
603 dst+=dstStride;\
|
|
nengel@2
|
604 src+=srcStride;\
|
|
nengel@2
|
605 }\
|
|
nengel@2
|
606 }\
|
|
nengel@2
|
607 \
|
|
nengel@2
|
608 static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
609 const int w=4;\
|
|
nengel@2
|
610 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
611 int i;\
|
|
nengel@2
|
612 for(i=0; i<w; i++)\
|
|
nengel@2
|
613 {\
|
|
nengel@2
|
614 const int srcB= src[-2*srcStride];\
|
|
nengel@2
|
615 const int srcA= src[-1*srcStride];\
|
|
nengel@2
|
616 const int src0= src[0 *srcStride];\
|
|
nengel@2
|
617 const int src1= src[1 *srcStride];\
|
|
nengel@2
|
618 const int src2= src[2 *srcStride];\
|
|
nengel@2
|
619 const int src3= src[3 *srcStride];\
|
|
nengel@2
|
620 const int src4= src[4 *srcStride];\
|
|
nengel@2
|
621 const int src5= src[5 *srcStride];\
|
|
nengel@2
|
622 const int src6= src[6 *srcStride];\
|
|
nengel@2
|
623 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
|
|
nengel@2
|
624 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
|
|
nengel@2
|
625 OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
|
|
nengel@2
|
626 OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
|
|
nengel@2
|
627 dst++;\
|
|
nengel@2
|
628 src++;\
|
|
nengel@2
|
629 }\
|
|
nengel@2
|
630 }\
|
|
nengel@2
|
631 \
|
|
nengel@2
|
632 static void OPNAME ## h264_qpel4_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
|
|
nengel@2
|
633 const int h=4;\
|
|
nengel@2
|
634 const int w=4;\
|
|
nengel@2
|
635 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
636 int i;\
|
|
nengel@2
|
637 src -= 2*srcStride;\
|
|
nengel@2
|
638 for(i=0; i<h+5; i++)\
|
|
nengel@2
|
639 {\
|
|
nengel@2
|
640 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);\
|
|
nengel@2
|
641 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);\
|
|
nengel@2
|
642 tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]);\
|
|
nengel@2
|
643 tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]);\
|
|
nengel@2
|
644 tmp+=tmpStride;\
|
|
nengel@2
|
645 src+=srcStride;\
|
|
nengel@2
|
646 }\
|
|
nengel@2
|
647 tmp -= tmpStride*(h+5-2);\
|
|
nengel@2
|
648 for(i=0; i<w; i++)\
|
|
nengel@2
|
649 {\
|
|
nengel@2
|
650 const int tmpB= tmp[-2*tmpStride];\
|
|
nengel@2
|
651 const int tmpA= tmp[-1*tmpStride];\
|
|
nengel@2
|
652 const int tmp0= tmp[0 *tmpStride];\
|
|
nengel@2
|
653 const int tmp1= tmp[1 *tmpStride];\
|
|
nengel@2
|
654 const int tmp2= tmp[2 *tmpStride];\
|
|
nengel@2
|
655 const int tmp3= tmp[3 *tmpStride];\
|
|
nengel@2
|
656 const int tmp4= tmp[4 *tmpStride];\
|
|
nengel@2
|
657 const int tmp5= tmp[5 *tmpStride];\
|
|
nengel@2
|
658 const int tmp6= tmp[6 *tmpStride];\
|
|
nengel@2
|
659 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
|
|
nengel@2
|
660 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
|
|
nengel@2
|
661 OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
|
|
nengel@2
|
662 OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
|
|
nengel@2
|
663 dst++;\
|
|
nengel@2
|
664 tmp++;\
|
|
nengel@2
|
665 }\
|
|
nengel@2
|
666 }\
|
|
nengel@2
|
667 \
|
|
nengel@2
|
668 static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
669 const int h=8;\
|
|
nengel@2
|
670 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
671 int i;\
|
|
nengel@2
|
672 for(i=0; i<h; i++)\
|
|
nengel@2
|
673 {\
|
|
nengel@2
|
674 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]));\
|
|
nengel@2
|
675 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]));\
|
|
nengel@2
|
676 OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]));\
|
|
nengel@2
|
677 OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]));\
|
|
nengel@2
|
678 OP(dst[4], (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]));\
|
|
nengel@2
|
679 OP(dst[5], (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]));\
|
|
nengel@2
|
680 OP(dst[6], (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]));\
|
|
nengel@2
|
681 OP(dst[7], (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]));\
|
|
nengel@2
|
682 dst+=dstStride;\
|
|
nengel@2
|
683 src+=srcStride;\
|
|
nengel@2
|
684 }\
|
|
nengel@2
|
685 }\
|
|
nengel@2
|
686 \
|
|
nengel@2
|
687 static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
688 const int w=8;\
|
|
nengel@2
|
689 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
690 int i;\
|
|
nengel@2
|
691 for(i=0; i<w; i++)\
|
|
nengel@2
|
692 {\
|
|
nengel@2
|
693 const int srcB= src[-2*srcStride];\
|
|
nengel@2
|
694 const int srcA= src[-1*srcStride];\
|
|
nengel@2
|
695 const int src0= src[0 *srcStride];\
|
|
nengel@2
|
696 const int src1= src[1 *srcStride];\
|
|
nengel@2
|
697 const int src2= src[2 *srcStride];\
|
|
nengel@2
|
698 const int src3= src[3 *srcStride];\
|
|
nengel@2
|
699 const int src4= src[4 *srcStride];\
|
|
nengel@2
|
700 const int src5= src[5 *srcStride];\
|
|
nengel@2
|
701 const int src6= src[6 *srcStride];\
|
|
nengel@2
|
702 const int src7= src[7 *srcStride];\
|
|
nengel@2
|
703 const int src8= src[8 *srcStride];\
|
|
nengel@2
|
704 const int src9= src[9 *srcStride];\
|
|
nengel@2
|
705 const int src10=src[10*srcStride];\
|
|
nengel@2
|
706 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
|
|
nengel@2
|
707 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
|
|
nengel@2
|
708 OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
|
|
nengel@2
|
709 OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
|
|
nengel@2
|
710 OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7));\
|
|
nengel@2
|
711 OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8));\
|
|
nengel@2
|
712 OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9));\
|
|
nengel@2
|
713 OP(dst[7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10));\
|
|
nengel@2
|
714 dst++;\
|
|
nengel@2
|
715 src++;\
|
|
nengel@2
|
716 }\
|
|
nengel@2
|
717 }\
|
|
nengel@2
|
718 \
|
|
nengel@2
|
719 static void OPNAME ## h264_qpel8_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
|
|
nengel@2
|
720 const int h=8;\
|
|
nengel@2
|
721 const int w=8;\
|
|
nengel@2
|
722 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
|
|
nengel@2
|
723 int i;\
|
|
nengel@2
|
724 src -= 2*srcStride;\
|
|
nengel@2
|
725 for(i=0; i<h+5; i++)\
|
|
nengel@2
|
726 {\
|
|
nengel@2
|
727 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]);\
|
|
nengel@2
|
728 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]);\
|
|
nengel@2
|
729 tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]);\
|
|
nengel@2
|
730 tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]);\
|
|
nengel@2
|
731 tmp[4]= (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]);\
|
|
nengel@2
|
732 tmp[5]= (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]);\
|
|
nengel@2
|
733 tmp[6]= (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]);\
|
|
nengel@2
|
734 tmp[7]= (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]);\
|
|
nengel@2
|
735 tmp+=tmpStride;\
|
|
nengel@2
|
736 src+=srcStride;\
|
|
nengel@2
|
737 }\
|
|
nengel@2
|
738 tmp -= tmpStride*(h+5-2);\
|
|
nengel@2
|
739 for(i=0; i<w; i++)\
|
|
nengel@2
|
740 {\
|
|
nengel@2
|
741 const int tmpB= tmp[-2*tmpStride];\
|
|
nengel@2
|
742 const int tmpA= tmp[-1*tmpStride];\
|
|
nengel@2
|
743 const int tmp0= tmp[0 *tmpStride];\
|
|
nengel@2
|
744 const int tmp1= tmp[1 *tmpStride];\
|
|
nengel@2
|
745 const int tmp2= tmp[2 *tmpStride];\
|
|
nengel@2
|
746 const int tmp3= tmp[3 *tmpStride];\
|
|
nengel@2
|
747 const int tmp4= tmp[4 *tmpStride];\
|
|
nengel@2
|
748 const int tmp5= tmp[5 *tmpStride];\
|
|
nengel@2
|
749 const int tmp6= tmp[6 *tmpStride];\
|
|
nengel@2
|
750 const int tmp7= tmp[7 *tmpStride];\
|
|
nengel@2
|
751 const int tmp8= tmp[8 *tmpStride];\
|
|
nengel@2
|
752 const int tmp9= tmp[9 *tmpStride];\
|
|
nengel@2
|
753 const int tmp10=tmp[10*tmpStride];\
|
|
nengel@2
|
754 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
|
|
nengel@2
|
755 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
|
|
nengel@2
|
756 OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
|
|
nengel@2
|
757 OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
|
|
nengel@2
|
758 OP2(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));\
|
|
nengel@2
|
759 OP2(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));\
|
|
nengel@2
|
760 OP2(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));\
|
|
nengel@2
|
761 OP2(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));\
|
|
nengel@2
|
762 dst++;\
|
|
nengel@2
|
763 tmp++;\
|
|
nengel@2
|
764 }\
|
|
nengel@2
|
765 }\
|
|
nengel@2
|
766 \
|
|
nengel@2
|
767 static void OPNAME ## h264_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
768 OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
|
|
nengel@2
|
769 OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
|
|
nengel@2
|
770 src += 8*srcStride;\
|
|
nengel@2
|
771 dst += 8*dstStride;\
|
|
nengel@2
|
772 OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
|
|
nengel@2
|
773 OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
|
|
nengel@2
|
774 }\
|
|
nengel@2
|
775 \
|
|
nengel@2
|
776 static void OPNAME ## h264_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
|
|
nengel@2
|
777 OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
|
|
nengel@2
|
778 OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
|
|
nengel@2
|
779 src += 8*srcStride;\
|
|
nengel@2
|
780 dst += 8*dstStride;\
|
|
nengel@2
|
781 OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
|
|
nengel@2
|
782 OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
|
|
nengel@2
|
783 }\
|
|
nengel@2
|
784 \
|
|
nengel@2
|
785 static void OPNAME ## h264_qpel16_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
|
|
nengel@2
|
786 OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
|
|
nengel@2
|
787 OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
|
|
nengel@2
|
788 src += 8*srcStride;\
|
|
nengel@2
|
789 dst += 8*dstStride;\
|
|
nengel@2
|
790 OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
|
|
nengel@2
|
791 OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
|
|
nengel@2
|
792 }\
|
|
nengel@2
|
793
|
|
nengel@2
|
794 #define H264_MC(OPNAME, SIZE) \
|
|
nengel@2
|
795 static void OPNAME ## h264_qpel ## SIZE ## _mc00_c (uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
796 OPNAME ## pixels ## SIZE ## _c(dst, src, stride, SIZE);\
|
|
nengel@2
|
797 }\
|
|
nengel@2
|
798 \
|
|
nengel@2
|
799 static void OPNAME ## h264_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
800 uint8_t half[SIZE*SIZE];\
|
|
nengel@2
|
801 put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
|
|
nengel@2
|
802 OPNAME ## pixels ## SIZE ## _l2(dst, src, half, stride, stride, SIZE, SIZE);\
|
|
nengel@2
|
803 }\
|
|
nengel@2
|
804 \
|
|
nengel@2
|
805 static void OPNAME ## h264_qpel ## SIZE ## _mc20_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
806 OPNAME ## h264_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride);\
|
|
nengel@2
|
807 }\
|
|
nengel@2
|
808 \
|
|
nengel@2
|
809 static void OPNAME ## h264_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
810 uint8_t half[SIZE*SIZE];\
|
|
nengel@2
|
811 put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
|
|
nengel@2
|
812 OPNAME ## pixels ## SIZE ## _l2(dst, src+1, half, stride, stride, SIZE, SIZE);\
|
|
nengel@2
|
813 }\
|
|
nengel@2
|
814 \
|
|
nengel@2
|
815 static void OPNAME ## h264_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
816 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
817 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
818 uint8_t half[SIZE*SIZE];\
|
|
nengel@2
|
819 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
820 put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
821 OPNAME ## pixels ## SIZE ## _l2(dst, full_mid, half, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
822 }\
|
|
nengel@2
|
823 \
|
|
nengel@2
|
824 static void OPNAME ## h264_qpel ## SIZE ## _mc02_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
825 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
826 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
827 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
828 OPNAME ## h264_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE);\
|
|
nengel@2
|
829 }\
|
|
nengel@2
|
830 \
|
|
nengel@2
|
831 static void OPNAME ## h264_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
832 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
833 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
834 uint8_t half[SIZE*SIZE];\
|
|
nengel@2
|
835 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
836 put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
837 OPNAME ## pixels ## SIZE ## _l2(dst, full_mid+SIZE, half, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
838 }\
|
|
nengel@2
|
839 \
|
|
nengel@2
|
840 static void OPNAME ## h264_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
841 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
842 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
843 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
844 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
845 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
|
|
nengel@2
|
846 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
847 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
848 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
849 }\
|
|
nengel@2
|
850 \
|
|
nengel@2
|
851 static void OPNAME ## h264_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
852 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
853 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
854 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
855 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
856 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
|
|
nengel@2
|
857 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
858 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
859 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
860 }\
|
|
nengel@2
|
861 \
|
|
nengel@2
|
862 static void OPNAME ## h264_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
863 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
864 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
865 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
866 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
867 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
|
|
nengel@2
|
868 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
869 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
870 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
871 }\
|
|
nengel@2
|
872 \
|
|
nengel@2
|
873 static void OPNAME ## h264_qpel ## SIZE ## _mc33_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
874 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
875 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
876 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
877 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
878 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
|
|
nengel@2
|
879 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
880 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
881 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
882 }\
|
|
nengel@2
|
883 \
|
|
nengel@2
|
884 static void OPNAME ## h264_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
885 int16_t tmp[SIZE*(SIZE+5)];\
|
|
nengel@2
|
886 OPNAME ## h264_qpel ## SIZE ## _hv_lowpass(dst, tmp, src, stride, SIZE, stride);\
|
|
nengel@2
|
887 }\
|
|
nengel@2
|
888 \
|
|
nengel@2
|
889 static void OPNAME ## h264_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
890 int16_t tmp[SIZE*(SIZE+5)];\
|
|
nengel@2
|
891 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
892 uint8_t halfHV[SIZE*SIZE];\
|
|
nengel@2
|
893 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
|
|
nengel@2
|
894 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
|
|
nengel@2
|
895 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
896 }\
|
|
nengel@2
|
897 \
|
|
nengel@2
|
898 static void OPNAME ## h264_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
899 int16_t tmp[SIZE*(SIZE+5)];\
|
|
nengel@2
|
900 uint8_t halfH[SIZE*SIZE];\
|
|
nengel@2
|
901 uint8_t halfHV[SIZE*SIZE];\
|
|
nengel@2
|
902 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
|
|
nengel@2
|
903 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
|
|
nengel@2
|
904 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
905 }\
|
|
nengel@2
|
906 \
|
|
nengel@2
|
907 static void OPNAME ## h264_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
908 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
909 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
910 int16_t tmp[SIZE*(SIZE+5)];\
|
|
nengel@2
|
911 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
912 uint8_t halfHV[SIZE*SIZE];\
|
|
nengel@2
|
913 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
914 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
915 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
|
|
nengel@2
|
916 OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
917 }\
|
|
nengel@2
|
918 \
|
|
nengel@2
|
919 static void OPNAME ## h264_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, int stride){\
|
|
nengel@2
|
920 uint8_t full[SIZE*(SIZE+5)];\
|
|
nengel@2
|
921 uint8_t * const full_mid= full + SIZE*2;\
|
|
nengel@2
|
922 int16_t tmp[SIZE*(SIZE+5)];\
|
|
nengel@2
|
923 uint8_t halfV[SIZE*SIZE];\
|
|
nengel@2
|
924 uint8_t halfHV[SIZE*SIZE];\
|
|
nengel@2
|
925 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
|
|
nengel@2
|
926 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
|
|
nengel@2
|
927 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
|
|
nengel@2
|
928 OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
|
|
nengel@2
|
929 }\
|
|
nengel@2
|
930
|
|
nengel@2
|
931 #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
|
|
nengel@2
|
932 #define op_put(a, b) a = cm[((b) + 16)>>5]
|
|
nengel@2
|
933 #define op2_avg(a, b) a = (((a)+cm[((b) + 512)>>10]+1)>>1)
|
|
nengel@2
|
934 #define op2_put(a, b) a = cm[((b) + 512)>>10]
|
|
nengel@2
|
935
|
|
nengel@2
|
936 H264_LOWPASS(put_ , op_put, op2_put)
|
|
nengel@2
|
937 H264_LOWPASS(avg_ , op_avg, op2_avg)
|
|
nengel@2
|
938 H264_MC(put_, 2)
|
|
nengel@2
|
939 H264_MC(put_, 4)
|
|
nengel@2
|
940 H264_MC(put_, 8)
|
|
nengel@2
|
941 H264_MC(put_, 16)
|
|
nengel@2
|
942 H264_MC(avg_, 4)
|
|
nengel@2
|
943 H264_MC(avg_, 8)
|
|
nengel@2
|
944 H264_MC(avg_, 16)
|
|
nengel@2
|
945
|
|
nengel@2
|
946 #undef op_avg
|
|
nengel@2
|
947 #undef op_put
|
|
nengel@2
|
948 #undef op2_avg
|
|
nengel@2
|
949 #undef op2_put
|
|
nengel@2
|
950
|
|
nengel@2
|
951 static void clear_block_c(DCTELEM *block)
|
|
nengel@2
|
952 {
|
|
nengel@2
|
953 memset(block, 0, sizeof(DCTELEM)*64);
|
|
nengel@2
|
954 }
|
|
nengel@2
|
955
|
|
nengel@2
|
956 /**
|
|
nengel@2
|
957 * memset(blocks, 0, sizeof(DCTELEM)*6*64)
|
|
nengel@2
|
958 */
|
|
nengel@2
|
959 static void clear_blocks_c(DCTELEM *blocks)
|
|
nengel@2
|
960 {
|
|
nengel@2
|
961 memset(blocks, 0, sizeof(DCTELEM)*6*64);
|
|
nengel@2
|
962 }
|
|
nengel@2
|
963
|
|
nengel@2
|
964 static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
|
|
nengel@2
|
965
|
|
nengel@2
|
966 /* init static data */
|
|
nengel@2
|
967 av_cold void dsputil_static_init(void)
|
|
nengel@2
|
968 {
|
|
nengel@2
|
969 int i;
|
|
nengel@2
|
970
|
|
nengel@2
|
971 for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;
|
|
nengel@2
|
972 for(i=0;i<MAX_NEG_CROP;i++) {
|
|
nengel@2
|
973 ff_cropTbl[i] = 0;
|
|
nengel@2
|
974 ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;
|
|
nengel@2
|
975 }
|
|
nengel@2
|
976
|
|
nengel@2
|
977 for(i=0;i<512;i++) {
|
|
nengel@2
|
978 ff_squareTbl[i] = (i - 256) * (i - 256);
|
|
nengel@2
|
979 }
|
|
nengel@2
|
980 }
|
|
nengel@2
|
981
|
|
nengel@2
|
982 int ff_check_alignment(void){
|
|
nengel@2
|
983 static int did_fail=0;
|
|
nengel@2
|
984 DECLARE_ALIGNED(16, int, aligned);
|
|
nengel@2
|
985
|
|
nengel@2
|
986 if((intptr_t)&aligned & 15){
|
|
nengel@2
|
987 if(!did_fail){
|
|
nengel@2
|
988 #if HAVE_MMX || HAVE_ALTIVEC
|
|
nengel@2
|
989 av_log(AV_LOG_ERROR,
|
|
nengel@2
|
990 "Compiler did not align stack variables. Libavcodec has been miscompiled\n"
|
|
nengel@2
|
991 "and may be very slow or crash. This is not a bug in libavcodec,\n"
|
|
nengel@2
|
992 "but in the compiler. You may try recompiling using gcc >= 4.2.\n"
|
|
nengel@2
|
993 "Do not report crashes to FFmpeg developers.\n");
|
|
nengel@2
|
994 #endif
|
|
nengel@2
|
995 did_fail=1;
|
|
nengel@2
|
996 }
|
|
nengel@2
|
997 return -1;
|
|
nengel@2
|
998 }
|
|
nengel@2
|
999 return 0;
|
|
nengel@2
|
1000 }
|
|
nengel@2
|
1001
|
|
nengel@2
|
1002 av_cold void dsputil_init(DSPContext* c)
|
|
nengel@2
|
1003 {
|
|
nengel@2
|
1004 (void) avg_pixels2_c; // kill a warning, avg_pixels2_c is a macro created function.
|
|
nengel@2
|
1005 ff_check_alignment();
|
|
nengel@2
|
1006 dsputil_static_init();
|
|
nengel@2
|
1007
|
|
nengel@2
|
1008 c->idct_put= ff_simple_idct_put;
|
|
nengel@2
|
1009 c->idct_add= ff_simple_idct_add;
|
|
nengel@2
|
1010 c->idct = ff_simple_idct;
|
|
nengel@2
|
1011
|
|
nengel@2
|
1012 c->clear_block = clear_block_c;
|
|
nengel@2
|
1013 c->clear_blocks = clear_blocks_c;
|
|
nengel@2
|
1014
|
|
nengel@2
|
1015 #define dspfunc(PFX, IDX, NUM) \
|
|
nengel@2
|
1016 c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_c; \
|
|
nengel@2
|
1017 c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_c; \
|
|
nengel@2
|
1018 c->PFX ## _pixels_tab[IDX][ 2] = PFX ## NUM ## _mc20_c; \
|
|
nengel@2
|
1019 c->PFX ## _pixels_tab[IDX][ 3] = PFX ## NUM ## _mc30_c; \
|
|
nengel@2
|
1020 c->PFX ## _pixels_tab[IDX][ 4] = PFX ## NUM ## _mc01_c; \
|
|
nengel@2
|
1021 c->PFX ## _pixels_tab[IDX][ 5] = PFX ## NUM ## _mc11_c; \
|
|
nengel@2
|
1022 c->PFX ## _pixels_tab[IDX][ 6] = PFX ## NUM ## _mc21_c; \
|
|
nengel@2
|
1023 c->PFX ## _pixels_tab[IDX][ 7] = PFX ## NUM ## _mc31_c; \
|
|
nengel@2
|
1024 c->PFX ## _pixels_tab[IDX][ 8] = PFX ## NUM ## _mc02_c; \
|
|
nengel@2
|
1025 c->PFX ## _pixels_tab[IDX][ 9] = PFX ## NUM ## _mc12_c; \
|
|
nengel@2
|
1026 c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_c; \
|
|
nengel@2
|
1027 c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_c; \
|
|
nengel@2
|
1028 c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_c; \
|
|
nengel@2
|
1029 c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_c; \
|
|
nengel@2
|
1030 c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_c; \
|
|
nengel@2
|
1031 c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_c
|
|
nengel@2
|
1032
|
|
nengel@2
|
1033
|
|
nengel@2
|
1034 dspfunc(put_h264_qpel, 0, 16);
|
|
nengel@2
|
1035 dspfunc(put_h264_qpel, 1, 8);
|
|
nengel@2
|
1036 dspfunc(put_h264_qpel, 2, 4);
|
|
nengel@2
|
1037 dspfunc(put_h264_qpel, 3, 2);
|
|
nengel@2
|
1038 dspfunc(avg_h264_qpel, 0, 16);
|
|
nengel@2
|
1039 dspfunc(avg_h264_qpel, 1, 8);
|
|
nengel@2
|
1040 dspfunc(avg_h264_qpel, 2, 4);
|
|
nengel@2
|
1041
|
|
nengel@2
|
1042 #undef dspfunc
|
|
nengel@2
|
1043 c->put_h264_chroma_pixels_tab[0]= put_h264_chroma_mc8_c;
|
|
nengel@2
|
1044 c->put_h264_chroma_pixels_tab[1]= put_h264_chroma_mc4_c;
|
|
nengel@2
|
1045 c->put_h264_chroma_pixels_tab[2]= put_h264_chroma_mc2_c;
|
|
nengel@2
|
1046 c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_c;
|
|
nengel@2
|
1047 c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_c;
|
|
nengel@2
|
1048 c->avg_h264_chroma_pixels_tab[2]= avg_h264_chroma_mc2_c;
|
|
nengel@2
|
1049
|
|
nengel@2
|
1050
|
|
nengel@2
|
1051 c->prefetch= just_return;
|
|
nengel@2
|
1052
|
|
nengel@2
|
1053 if (HAVE_MMX) dsputil_init_mmx (c);
|
|
nengel@2
|
1054 if (ARCH_ARM) dsputil_init_arm (c);
|
|
nengel@2
|
1055 if (HAVE_ALTIVEC) dsputil_init_ppc (c); //fixme PPC prefetch
|
|
nengel@2
|
1056 }
|
|
nengel@2
|
1057
|