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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.5, Wed Jul 24 00:50:10 2002 UTC revision 1.5.2.2, Sat Oct 5 21:30:50 2002 UTC
# Line 1  Line 1 
1    #ifndef _INTERPOLATE8X8_H_
2    #define _INTERPOLATE8X8_H_
3    
4  #include "../utils/mem_transfer.h"  #include "../utils/mem_transfer.h"
5    
6  typedef void (INTERPOLATE8X8) (uint8_t * const dst,  typedef void (INTERPOLATE8X8) (uint8_t * const dst,
# Line 6  Line 9 
9                                                             const uint32_t rounding);                                                             const uint32_t rounding);
10  typedef INTERPOLATE8X8 *INTERPOLATE8X8_PTR;  typedef INTERPOLATE8X8 *INTERPOLATE8X8_PTR;
11    
12    typedef void (INTERPOLATE8X8_AVG2) (uint8_t *dst,
13                                                                            const uint8_t *src1,
14                                                                            const uint8_t *src2,
15                                                                            const uint32_t stride,
16                                                                            const uint32_t rounding);
17    typedef INTERPOLATE8X8_AVG2 *INTERPOLATE8X8_AVG2_PTR;
18    
19    typedef void (INTERPOLATE8X8_AVG4) (uint8_t *dst,
20                                                                            const uint8_t *src1,
21                                                                            const uint8_t *src2,
22                                                                            const uint8_t *src3,
23                                                                            const uint8_t *src4,
24                                                                            const uint32_t stride,
25                                                                            const uint32_t rounding);
26    typedef INTERPOLATE8X8_AVG4 *INTERPOLATE8X8_AVG4_PTR;
27    
28    typedef void (INTERPOLATE8X8_LOWPASS) (uint8_t *dst,
29                                                                               uint8_t *src,
30                                                                               int32_t stride,
31                                                                               int32_t rounding);
32    
33    typedef INTERPOLATE8X8_LOWPASS *INTERPOLATE8X8_LOWPASS_PTR;
34    
35    typedef void (INTERPOLATE8X8_LOWPASS_HV) (uint8_t *dst1,
36                                                                                      uint8_t *dst2,
37                                                                                      uint8_t *src,
38                                                                                      int32_t stride,
39                                                                                      int32_t rounding);
40    
41    typedef INTERPOLATE8X8_LOWPASS_HV *INTERPOLATE8X8_LOWPASS_HV_PTR;
42    
43    typedef void (INTERPOLATE8X8_6TAP_LOWPASS) (uint8_t *dst,
44                                                                                    uint8_t *src,
45                                                                                    int32_t stride,
46                                                                                    int32_t rounding);
47    
48    typedef INTERPOLATE8X8_6TAP_LOWPASS *INTERPOLATE8X8_6TAP_LOWPASS_PTR;
49    
50  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_h;  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_h;
51  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;
52  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;  extern INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;
53    
54    extern INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2;
55    extern INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4;
56    
57    extern INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_h;
58    extern INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_v;
59    
60    extern INTERPOLATE8X8_LOWPASS_HV_PTR interpolate8x8_lowpass_hv;
61    
62    extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;
63    extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;
64    
65  INTERPOLATE8X8 interpolate8x8_halfpel_h_c;  INTERPOLATE8X8 interpolate8x8_halfpel_h_c;
66  INTERPOLATE8X8 interpolate8x8_halfpel_v_c;  INTERPOLATE8X8 interpolate8x8_halfpel_v_c;
67  INTERPOLATE8X8 interpolate8x8_halfpel_hv_c;  INTERPOLATE8X8 interpolate8x8_halfpel_hv_c;
# Line 30  Line 82 
82  INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;  INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;
83  INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;  INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;
84    
85  void interpolate8x8_lowpass_h(uint8_t *dst, uint8_t *src, int32_t dst_stride, int32_t src_stride, int32_t rounding);  INTERPOLATE8X8_AVG2 interpolate8x8_avg2_c;
86  void interpolate8x8_lowpass_v(uint8_t *dst, uint8_t *src, int32_t dst_stride, int32_t src_stride, int32_t rounding);  INTERPOLATE8X8_AVG4 interpolate8x8_avg4_c;
 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);  
 void interpolate8x8_bilinear2(uint8_t *dst, uint8_t *src1, uint8_t *src2, int32_t dst_stride, int32_t src_stride, int32_t rounding);  
 void interpolate8x8_bilinear4(uint8_t *dst, uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4, int32_t stride, int32_t rounding);  
87    
88  void interpolate8x8_c(uint8_t * const dst,  INTERPOLATE8X8_AVG2 interpolate8x8_avg2_mmx;
89                                            const uint8_t * const src,  INTERPOLATE8X8_AVG4 interpolate8x8_avg4_mmx;
90                                            const uint32_t x,  
91                                            const uint32_t y,  INTERPOLATE8X8_LOWPASS interpolate8x8_lowpass_h_c;
92                                            const uint32_t stride);  INTERPOLATE8X8_LOWPASS interpolate8x8_lowpass_v_c;
93    INTERPOLATE8X8_LOWPASS_HV interpolate8x8_lowpass_hv_c;
94    
95    INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_h_c;
96    INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_v_c;
97    
98    INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_h_mmx;
99    INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_v_mmx;
100    
101  static __inline void  static __inline void
102  interpolate8x8_switch(uint8_t * const cur,  interpolate8x8_switch(uint8_t * const cur,
# Line 89  Line 145 
145          }          }
146  }  }
147    
148    static __inline uint8_t *
149    interpolate8x8_switch2(uint8_t * const buffer,
150                                              const uint8_t * const refn,
151                                              const uint32_t x,
152                                              const uint32_t y,
153                                              const int32_t dx,
154                                              const int dy,
155                                              const uint32_t stride,
156                                              const uint32_t rounding)
157    {
158            int32_t ddx, ddy;
159    
160            switch (((dx & 1) << 1) + (dy & 1))     // ((dx%2)?2:0)+((dy%2)?1:0)
161            {
162            case 0:
163                    return (uint8_t *)refn + (int)((y + dy/2) * stride + x + dx/2);
164    
165            case 1:
166                    ddx = dx / 2;
167                    ddy = (dy - 1) / 2;
168                    interpolate8x8_halfpel_v(buffer,
169                                                                     refn + (int)((y + ddy) * stride + x + ddx), stride,
170                                                                     rounding);
171                    break;
172    
173            case 2:
174                    ddx = (dx - 1) / 2;
175                    ddy = dy / 2;
176                    interpolate8x8_halfpel_h(buffer,
177                                                                     refn + (int)((y + ddy) * stride + x + ddx), stride,
178                                                                     rounding);
179                    break;
180    
181            default:
182                    ddx = (dx - 1) / 2;
183                    ddy = (dy - 1) / 2;
184                    interpolate8x8_halfpel_hv(buffer,
185                                                                     refn + (int)((y + ddy) * stride + x + ddx), stride,
186                                                                      rounding);
187                    break;
188            }
189            return buffer;
190    }
191    
192    
193  static __inline void interpolate8x8_quarterpel(uint8_t * const cur,  static __inline void interpolate8x8_quarterpel(uint8_t * const cur,
194                                       uint8_t * const refn,                                       uint8_t * const refn,
195                                             uint8_t * const refh,
196                                             uint8_t * const refv,
197                                             uint8_t * const refhv,
198                                       const uint32_t x, const uint32_t y,                                       const uint32_t x, const uint32_t y,
199                                           const int32_t dx,  const int dy,                                           const int32_t dx,  const int dy,
200                                           const uint32_t stride,                                           const uint32_t stride,
# Line 101  Line 204 
204          const int32_t yRef = y*4 + dy;          const int32_t yRef = y*4 + dy;
205    
206          uint8_t *src, *dst;          uint8_t *src, *dst;
207            uint8_t *halfpel_h, *halfpel_v, *halfpel_hv;
208          int32_t x_int, y_int, x_frac, y_frac;          int32_t x_int, y_int, x_frac, y_frac;
209    
         uint8_t halfpel_h[72];  
         uint8_t halfpel_v[64];  
         uint8_t halfpel_hv[64];  
   
210          x_int = xRef/4;          x_int = xRef/4;
211          if (xRef < 0 && xRef % 4)          if (xRef < 0 && xRef % 4)
212                  x_int--;                  x_int--;
# Line 120  Line 220 
220          y_frac = yRef - (4*y_int);          y_frac = yRef - (4*y_int);
221    
222          src = refn + y_int * stride + x_int;          src = refn + y_int * stride + x_int;
223            halfpel_h = refh;
224            halfpel_v = refv;
225            halfpel_hv = refhv;
226    
227          dst = cur + y * stride + x;          dst = cur + y * stride + x;
228    
229          switch((y_frac << 2) | (x_frac)) {          switch((y_frac << 2) | (x_frac)) {
# Line 129  Line 233 
233                  break;                  break;
234    
235          case 1:          case 1:
236                  interpolate8x8_lowpass_h(halfpel_h, src, 8, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
237                  interpolate8x8_bilinear2(dst, src, halfpel_h, stride, stride, rounding);                  interpolate8x8_avg2(dst, src, halfpel_h, stride, rounding);
238                  break;                  break;
239    
240          case 2:          case 2:
241              interpolate8x8_lowpass_h(dst, src, stride, stride, rounding);              interpolate8x8_lowpass_h(dst, src, stride, rounding);
242                  break;                  break;
243    
244          case 3:          case 3:
245                  interpolate8x8_lowpass_h(halfpel_h, src, 8, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
246                  interpolate8x8_bilinear2(dst, src+1, halfpel_h, stride, stride, rounding);                  interpolate8x8_avg2(dst, src + 1, halfpel_h, stride, rounding);
247                  break;                  break;
248    
249          case 4:          case 4:
250                  interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);
251                  interpolate8x8_bilinear2(dst, src, halfpel_v, stride, stride, rounding);                  interpolate8x8_avg2(dst, src, halfpel_v, stride, rounding);
252                  break;                  break;
253    
254          case 5:          case 5:
255                  interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);
256                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
257                  interpolate8x8_bilinear4(dst, src, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_avg4(dst, src, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);
258                  break;                  break;
259    
260          case 6:          case 6:
261                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
262                  interpolate8x8_bilinear2(dst, halfpel_h, halfpel_hv, stride, 8, 1-rounding);                  interpolate8x8_avg2(dst, halfpel_h, halfpel_hv, stride, rounding);
263                  break;                  break;
264    
265          case 7:          case 7:
266                  interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, 16-rounding);                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);
267                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
268                  interpolate8x8_bilinear4(dst, src+1, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_avg4(dst, src+1, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);
269                  break;                  break;
270    
271          case 8:          case 8:
272              interpolate8x8_lowpass_v(dst, src, stride, stride, rounding);              interpolate8x8_lowpass_v(dst, src, stride, rounding);
273                  break;                  break;
274    
275          case 9:          case 9:
276                  interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, 16-rounding);                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);
277                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
278                  interpolate8x8_bilinear2(dst, halfpel_v, halfpel_hv, stride, 8, rounding);                  interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);
279                  break;                  break;
280    
281          case 10:          case 10:
282                  interpolate8x8_lowpass_hv(dst, halfpel_h, src, stride, 8, stride, rounding);                  interpolate8x8_lowpass_hv(dst, halfpel_h, src, stride, rounding);
283                  break;                  break;
284    
285          case 11:          case 11:
286                  interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, 16-rounding);                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);
287                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
288                  interpolate8x8_bilinear2(dst, halfpel_v, halfpel_hv, stride, 8, rounding);                  interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);
289                  break;                  break;
290    
291          case 12:          case 12:
292                  interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);
293                  interpolate8x8_bilinear2(dst, src+stride, halfpel_v, stride, stride, rounding);                  interpolate8x8_avg2(dst, src+stride, halfpel_v, stride, rounding);
294                  break;                  break;
295    
296          case 13:          case 13:
297                  interpolate8x8_lowpass_v(halfpel_v, src, 8, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);
298                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
299                  interpolate8x8_bilinear4(dst, src+stride, halfpel_h+8, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_avg4(dst, src+stride, halfpel_h+stride, halfpel_v, halfpel_hv, stride, rounding);
300                  break;                  break;
301    
302          case 14:          case 14:
303                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
304                  interpolate8x8_bilinear2(dst, halfpel_h+8, halfpel_hv, stride, 8, rounding);                  interpolate8x8_avg2(dst, halfpel_h+stride, halfpel_hv, stride, rounding);
305                  break;                  break;
306    
307          case 15:          case 15:
308                  interpolate8x8_lowpass_v(halfpel_v, src+1, 8, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);
309                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, 8, 8, stride, rounding);                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
310                  interpolate8x8_bilinear4(dst, src+stride+1, halfpel_h+8, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_avg4(dst, src+stride+1, halfpel_h+stride, halfpel_v, halfpel_hv, stride, rounding);
311                  break;                  break;
312          }          }
313  }  }
314    
315    #endif

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.5.2.2

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