[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.3, Wed Jun 12 20:38:40 2002 UTC revision 1.5.2.1, Mon Sep 23 20:36:01 2002 UTC
# Line 26  Line 26 
26  INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;  INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;
27  INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;  INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;
28    
29    INTERPOLATE8X8 interpolate8x8_halfpel_h_ia64;
30    INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;
31    INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;
32    
33    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  static __inline void  static __inline void
46  interpolate8x8_switch(uint8_t * const cur,  interpolate8x8_switch(uint8_t * const cur,
47                                            const uint8_t * const refn,                                            const uint8_t * const refn,
# Line 44  Line 60 
60                  ddx = dx / 2;                  ddx = dx / 2;
61                  ddy = dy / 2;                  ddy = dy / 2;
62                  transfer8x8_copy(cur + y * stride + x,                  transfer8x8_copy(cur + y * stride + x,
63                                                   refn + (y + ddy) * stride + x + ddx, stride);                                                   refn + (int)((y + ddy) * stride + x + ddx), stride);
64                  break;                  break;
65    
66          case 1:          case 1:
67                  ddx = dx / 2;                  ddx = dx / 2;
68                  ddy = (dy - 1) / 2;                  ddy = (dy - 1) / 2;
69                  interpolate8x8_halfpel_v(cur + y * stride + x,                  interpolate8x8_halfpel_v(cur + y * stride + x,
70                                                                   refn + (y + ddy) * stride + x + ddx, stride,                                                                   refn + (int)((y + ddy) * stride + x + ddx), stride,
71                                                                   rounding);                                                                   rounding);
72                  break;                  break;
73    
# Line 59  Line 75 
75                  ddx = (dx - 1) / 2;                  ddx = (dx - 1) / 2;
76                  ddy = dy / 2;                  ddy = dy / 2;
77                  interpolate8x8_halfpel_h(cur + y * stride + x,                  interpolate8x8_halfpel_h(cur + y * stride + x,
78                                                                   refn + (y + ddy) * stride + x + ddx, stride,                                                                   refn + (int)((y + ddy) * stride + x + ddx), stride,
79                                                                   rounding);                                                                   rounding);
80                  break;                  break;
81    
# Line 67  Line 83 
83                  ddx = (dx - 1) / 2;                  ddx = (dx - 1) / 2;
84                  ddy = (dy - 1) / 2;                  ddy = (dy - 1) / 2;
85                  interpolate8x8_halfpel_hv(cur + y * stride + x,                  interpolate8x8_halfpel_hv(cur + y * stride + x,
86                                                                    refn + (y + ddy) * stride + x + ddx, stride,                                                                   refn + (int)((y + ddy) * stride + x + ddx), stride,
87                                                                    rounding);                                                                    rounding);
88                  break;                  break;
89          }          }
90  }  }
91    
92    static __inline uint8_t *
93  void interpolate8x8_c(uint8_t * const dst,  interpolate8x8_switch2(uint8_t * const buffer,
94                                            const uint8_t * const src,                                            const uint8_t * const refn,
95                                            const uint32_t x,                                            const uint32_t x,
96                                            const uint32_t y,                                            const uint32_t y,
97                                            const uint32_t stride);                                            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    
104            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                                         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    }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.5.2.1

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