[cvs] / xvidcore / src / image / interpolate8x8.h Repository:
ViewVC logotype

Annotation of /xvidcore/src/image/interpolate8x8.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5.2.1 - (view) (download)

1 : Isibaar 1.1 #include "../utils/mem_transfer.h"
2 :    
3 : edgomez 1.3 typedef void (INTERPOLATE8X8) (uint8_t * const dst,
4 :     const uint8_t * const src,
5 :     const uint32_t stride,
6 :     const uint32_t rounding);
7 :     typedef INTERPOLATE8X8 *INTERPOLATE8X8_PTR;
8 : Isibaar 1.1
9 :     extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_h;
10 :     extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;
11 :     extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;
12 :    
13 :     INTERPOLATE8X8 interpolate8x8_halfpel_h_c;
14 :     INTERPOLATE8X8 interpolate8x8_halfpel_v_c;
15 :     INTERPOLATE8X8 interpolate8x8_halfpel_hv_c;
16 :    
17 :     INTERPOLATE8X8 interpolate8x8_halfpel_h_mmx;
18 :     INTERPOLATE8X8 interpolate8x8_halfpel_v_mmx;
19 :     INTERPOLATE8X8 interpolate8x8_halfpel_hv_mmx;
20 :    
21 :     INTERPOLATE8X8 interpolate8x8_halfpel_h_xmm;
22 :     INTERPOLATE8X8 interpolate8x8_halfpel_v_xmm;
23 :     INTERPOLATE8X8 interpolate8x8_halfpel_hv_xmm;
24 :    
25 :     INTERPOLATE8X8 interpolate8x8_halfpel_h_3dn;
26 :     INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;
27 :     INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;
28 :    
29 : Isibaar 1.4 INTERPOLATE8X8 interpolate8x8_halfpel_h_ia64;
30 :     INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;
31 :     INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;
32 :    
33 : Isibaar 1.5 void interpolate8x8_lowpass_h(uint8_t *dst, uint8_t *src, int32_t dst_stride, int32_t src_stride, int32_t rounding);
34 :     void interpolate8x8_lowpass_v(uint8_t *dst, uint8_t *src, int32_t dst_stride, int32_t src_stride, int32_t rounding);
35 :     void interpolate8x8_lowpass_hv(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t dst1_stride, int32_t dst2_stride, int32_t src_stride, int32_t rounding);
36 :     void interpolate8x8_bilinear2(uint8_t *dst, uint8_t *src1, uint8_t *src2, int32_t dst_stride, int32_t src_stride, int32_t rounding);
37 :     void interpolate8x8_bilinear4(uint8_t *dst, uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4, int32_t stride, int32_t rounding);
38 :    
39 :     void interpolate8x8_c(uint8_t * const dst,
40 :     const uint8_t * const src,
41 :     const uint32_t x,
42 :     const uint32_t y,
43 :     const uint32_t stride);
44 :    
45 : edgomez 1.3 static __inline void
46 :     interpolate8x8_switch(uint8_t * const cur,
47 :     const uint8_t * const refn,
48 :     const uint32_t x,
49 :     const uint32_t y,
50 :     const int32_t dx,
51 :     const int dy,
52 :     const uint32_t stride,
53 :     const uint32_t rounding)
54 : Isibaar 1.1 {
55 :     int32_t ddx, ddy;
56 :    
57 : edgomez 1.3 switch (((dx & 1) << 1) + (dy & 1)) // ((dx%2)?2:0)+((dy%2)?1:0)
58 :     {
59 :     case 0:
60 :     ddx = dx / 2;
61 :     ddy = dy / 2;
62 :     transfer8x8_copy(cur + y * stride + x,
63 : Isibaar 1.4 refn + (int)((y + ddy) * stride + x + ddx), stride);
64 : Isibaar 1.1 break;
65 :    
66 : edgomez 1.3 case 1:
67 :     ddx = dx / 2;
68 :     ddy = (dy - 1) / 2;
69 :     interpolate8x8_halfpel_v(cur + y * stride + x,
70 : Isibaar 1.4 refn + (int)((y + ddy) * stride + x + ddx), stride,
71 : edgomez 1.3 rounding);
72 : Isibaar 1.1 break;
73 :    
74 : edgomez 1.3 case 2:
75 :     ddx = (dx - 1) / 2;
76 :     ddy = dy / 2;
77 :     interpolate8x8_halfpel_h(cur + y * stride + x,
78 : Isibaar 1.4 refn + (int)((y + ddy) * stride + x + ddx), stride,
79 : edgomez 1.3 rounding);
80 : Isibaar 1.1 break;
81 :    
82 : edgomez 1.3 default:
83 :     ddx = (dx - 1) / 2;
84 :     ddy = (dy - 1) / 2;
85 :     interpolate8x8_halfpel_hv(cur + y * stride + x,
86 : Isibaar 1.4 refn + (int)((y + ddy) * stride + x + ddx), stride,
87 : edgomez 1.3 rounding);
88 : Isibaar 1.1 break;
89 : edgomez 1.3 }
90 : Isibaar 1.1 }
91 : chenm001 1.2
92 : chl 1.5.2.1 static __inline uint8_t *
93 :     interpolate8x8_switch2(uint8_t * const buffer,
94 :     const uint8_t * const refn,
95 :     const uint32_t x,
96 :     const uint32_t y,
97 :     const int32_t dx,
98 :     const int dy,
99 :     const uint32_t stride,
100 :     const uint32_t rounding)
101 :     {
102 :     int32_t ddx, ddy;
103 : chenm001 1.2
104 : chl 1.5.2.1 switch (((dx & 1) << 1) + (dy & 1)) // ((dx%2)?2:0)+((dy%2)?1:0)
105 :     {
106 :     case 0:
107 :     return (uint8_t *)refn + (int)((y + dy/2) * stride + x + dx/2);
108 :    
109 :     case 1:
110 :     ddx = dx / 2;
111 :     ddy = (dy - 1) / 2;
112 :     interpolate8x8_halfpel_v(buffer,
113 :     refn + (int)((y + ddy) * stride + x + ddx), stride,
114 :     rounding);
115 :     break;
116 :    
117 :     case 2:
118 :     ddx = (dx - 1) / 2;
119 :     ddy = dy / 2;
120 :     interpolate8x8_halfpel_h(buffer,
121 :     refn + (int)((y + ddy) * stride + x + ddx), stride,
122 :     rounding);
123 :     break;
124 :    
125 :     default:
126 :     ddx = (dx - 1) / 2;
127 :     ddy = (dy - 1) / 2;
128 :     interpolate8x8_halfpel_hv(buffer,
129 :     refn + (int)((y + ddy) * stride + x + ddx), stride,
130 :     rounding);
131 :     break;
132 :     }
133 :     return buffer;
134 :     }
135 :    
136 :    
137 :    
138 :     static void
139 :     interpolate8x8_quarterpel(uint8_t * const cur,
140 : Isibaar 1.5 uint8_t * const refn,
141 :     const uint32_t x, const uint32_t y,
142 :     const int32_t dx, const int dy,
143 :     const uint32_t stride,
144 :     const uint32_t rounding)
145 :     {
146 :     const int32_t xRef = x*4 + dx;
147 :     const int32_t yRef = y*4 + dy;
148 :    
149 :     uint8_t *src, *dst;
150 :     int32_t x_int, y_int, x_frac, y_frac;
151 :    
152 :     uint8_t halfpel_h[72];
153 :     uint8_t halfpel_v[64];
154 :     uint8_t halfpel_hv[64];
155 :    
156 :     x_int = xRef/4;
157 :     if (xRef < 0 && xRef % 4)
158 :     x_int--;
159 :    
160 :     x_frac = xRef - (4*x_int);
161 :    
162 :     y_int = yRef/4;
163 :     if (yRef < 0 && yRef % 4)
164 :     y_int--;
165 :    
166 :     y_frac = yRef - (4*y_int);
167 :    
168 :     src = refn + y_int * stride + x_int;
169 :     dst = cur + y * stride + x;
170 :    
171 :     switch((y_frac << 2) | (x_frac)) {
172 :    
173 :     case 0:
174 :     transfer8x8_copy(dst, src, stride);
175 :     break;
176 :    
177 :     case 1:
178 :     interpolate8x8_lowpass_h(halfpel_h, src, 8, stride, rounding);
179 :     interpolate8x8_bilinear2(dst, src, halfpel_h, stride, stride, rounding);
180 :     break;
181 :    
182 :     case 2:
183 :     interpolate8x8_lowpass_h(dst, src, stride, stride, rounding);
184 :     break;
185 :    
186 :     case 3:
187 :     interpolate8x8_lowpass_h(halfpel_h, src, 8, stride, rounding);
188 :     interpolate8x8_bilinear2(dst, src+1, halfpel_h, stride, stride, rounding);
189 :     break;
190 :    
191 :     case 4:
192 :     interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);
193 :     interpolate8x8_bilinear2(dst, src, halfpel_v, stride, stride, rounding);
194 :     break;
195 :    
196 :     case 5:
197 :     interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);
198 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
199 :     interpolate8x8_bilinear4(dst, src, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);
200 :     break;
201 :    
202 :     case 6:
203 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
204 :     interpolate8x8_bilinear2(dst, halfpel_h, halfpel_hv, stride, 8, 1-rounding);
205 :     break;
206 :    
207 :     case 7:
208 :     interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, 16-rounding);
209 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
210 :     interpolate8x8_bilinear4(dst, src+1, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);
211 :     break;
212 :    
213 :     case 8:
214 :     interpolate8x8_lowpass_v(dst, src, stride, stride, rounding);
215 :     break;
216 :    
217 :     case 9:
218 :     interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, 16-rounding);
219 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
220 :     interpolate8x8_bilinear2(dst, halfpel_v, halfpel_hv, stride, 8, rounding);
221 :     break;
222 :    
223 :     case 10:
224 :     interpolate8x8_lowpass_hv(dst, halfpel_h, src, stride, 8, stride, rounding);
225 :     break;
226 :    
227 :     case 11:
228 :     interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, 16-rounding);
229 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
230 :     interpolate8x8_bilinear2(dst, halfpel_v, halfpel_hv, stride, 8, rounding);
231 :     break;
232 :    
233 :     case 12:
234 :     interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);
235 :     interpolate8x8_bilinear2(dst, src+stride, halfpel_v, stride, stride, rounding);
236 :     break;
237 :    
238 :     case 13:
239 :     interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);
240 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
241 :     interpolate8x8_bilinear4(dst, src+stride, halfpel_h+8, halfpel_v, halfpel_hv, stride, rounding);
242 :     break;
243 :    
244 :     case 14:
245 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
246 :     interpolate8x8_bilinear2(dst, halfpel_h+8, halfpel_hv, stride, 8, rounding);
247 :     break;
248 :    
249 :     case 15:
250 :     interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, rounding);
251 :     interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);
252 :     interpolate8x8_bilinear4(dst, src+stride+1, halfpel_h+8, halfpel_v, halfpel_hv, stride, rounding);
253 :     break;
254 :     }
255 :     }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4