[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.2.7, Wed Nov 20 20:11:49 2002 UTC revision 1.10.2.3, Sun Jul 13 10:01:00 2003 UTC
# Line 1  Line 1 
1    /*****************************************************************************
2     *
3     *  XVID MPEG-4 VIDEO CODEC
4     *  - Interpolation related header  -
5     *
6     *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7     *
8     *  This program is free software ; you can redistribute it and/or modify
9     *  it under the terms of the GNU General Public License as published by
10     *  the Free Software Foundation ; either version 2 of the License, or
11     *  (at your option) any later version.
12     *
13     *  This program is distributed in the hope that it will be useful,
14     *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
15     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     *  GNU General Public License for more details.
17     *
18     *  You should have received a copy of the GNU General Public License
19     *  along with this program ; if not, write to the Free Software
20     *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21     *
22     * $Id$
23     *
24     ****************************************************************************/
25    
26  #ifndef _INTERPOLATE8X8_H_  #ifndef _INTERPOLATE8X8_H_
27  #define _INTERPOLATE8X8_H_  #define _INTERPOLATE8X8_H_
28    
# Line 83  Line 108 
108  INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;  INTERPOLATE8X8 interpolate8x8_halfpel_v_3dn;
109  INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;  INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dn;
110    
111    INTERPOLATE8X8 interpolate8x8_halfpel_h_3dne;
112    INTERPOLATE8X8 interpolate8x8_halfpel_v_3dne;
113    INTERPOLATE8X8 interpolate8x8_halfpel_hv_3dne;
114    
115  INTERPOLATE8X8 interpolate8x8_halfpel_h_ia64;  INTERPOLATE8X8 interpolate8x8_halfpel_h_ia64;
116  INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;  INTERPOLATE8X8 interpolate8x8_halfpel_v_ia64;
117  INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;  INTERPOLATE8X8 interpolate8x8_halfpel_hv_ia64;
# Line 118  Line 147 
147                                            const uint32_t stride,                                            const uint32_t stride,
148                                            const uint32_t rounding)                                            const uint32_t rounding)
149  {  {
         int32_t ddx, ddy;  
150    
151          switch (((dx & 1) << 1) + (dy & 1))     // ((dx%2)?2:0)+((dy%2)?1:0)          const uint8_t * const src = refn + (y + (dy>>1)) * stride + x + (dx>>1);
152          {          uint8_t * const dst = cur + y * stride + x;
153    
154            switch (((dx & 1) << 1) + (dy & 1))     { /* ((dx%2)?2:0)+((dy%2)?1:0) */
155          case 0:          case 0:
156                  ddx = dx / 2;                  transfer8x8_copy(dst, src, stride);
                 ddy = dy / 2;  
                 transfer8x8_copy(cur + y * stride + x,  
                                                  refn + (int)((y + ddy) * stride + x + ddx), stride);  
157                  break;                  break;
   
158          case 1:          case 1:
159                  ddx = dx / 2;                  interpolate8x8_halfpel_v(dst, src, stride, rounding);
                 ddy = (dy - 1) / 2;  
                 interpolate8x8_halfpel_v(cur + y * stride + x,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                  rounding);  
160                  break;                  break;
   
161          case 2:          case 2:
162                  ddx = (dx - 1) / 2;                  interpolate8x8_halfpel_h(dst, src, stride, rounding);
                 ddy = dy / 2;  
                 interpolate8x8_halfpel_h(cur + y * stride + x,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                  rounding);  
163                  break;                  break;
   
164          default:          default:
165                  ddx = (dx - 1) / 2;                  interpolate8x8_halfpel_hv(dst, src, stride, rounding);
                 ddy = (dy - 1) / 2;  
                 interpolate8x8_halfpel_hv(cur + y * stride + x,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                   rounding);  
166                  break;                  break;
167          }          }
168  }  }
169    
170  static __inline uint8_t *  
171  interpolate8x8_switch2(uint8_t * const buffer,  static __inline void
172    interpolate16x16_switch(uint8_t * const cur,
173                                            const uint8_t * const refn,                                            const uint8_t * const refn,
174                                            const uint32_t x,                                            const uint32_t x,
175                                            const uint32_t y,                                            const uint32_t y,
# Line 165  Line 178 
178                                            const uint32_t stride,                                            const uint32_t stride,
179                                            const uint32_t rounding)                                            const uint32_t rounding)
180  {  {
181          int32_t ddx, ddy;          interpolate8x8_switch(cur, refn, x,   y,   dx, dy, stride, rounding);
182            interpolate8x8_switch(cur, refn, x+8, y,   dx, dy, stride, rounding);
183            interpolate8x8_switch(cur, refn, x,   y+8, dx, dy, stride, rounding);
184            interpolate8x8_switch(cur, refn, x+8, y+8, dx, dy, stride, rounding);
185    }
186    
187          switch (((dx & 1) << 1) + (dy & 1))     // ((dx%2)?2:0)+((dy%2)?1:0)  
188    static __inline void
189    interpolate32x32_switch(uint8_t * const cur,
190                                              const uint8_t * const refn,
191                                              const uint32_t x,
192                                              const uint32_t y,
193                                              const int32_t dx,
194                                              const int dy,
195                                              const uint32_t stride,
196                                              const uint32_t rounding)
197          {          {
198          case 0:          interpolate16x16_switch(cur, refn, x,    y,    dx, dy, stride, rounding);
199                  return (uint8_t *)refn + (int)((y + dy/2) * stride + x + dx/2);          interpolate16x16_switch(cur, refn, x+16, y,    dx, dy, stride, rounding);
200            interpolate16x16_switch(cur, refn, x,    y+16, dx, dy, stride, rounding);
201            interpolate16x16_switch(cur, refn, x+16, y+16, dx, dy, stride, rounding);
202    }
203    
204    
205    static __inline uint8_t *
206    interpolate8x8_switch2(uint8_t * const buffer,
207                                              const uint8_t * const refn,
208                                              const int x,
209                                              const int y,
210                                              const int dx,
211                                              const int dy,
212                                              const uint32_t stride,
213                                              const uint32_t rounding)
214    {
215    
216            const uint8_t * const src = refn + (y + (dy>>1)) * stride + x + (dx>>1);
217    
218            switch (((dx & 1) << 1) + (dy & 1))     { /* ((dx%2)?2:0)+((dy%2)?1:0) */
219            case 0:
220                    return (uint8_t *)src;
221          case 1:          case 1:
222                  ddx = dx / 2;                  interpolate8x8_halfpel_v(buffer, src, stride, rounding);
                 ddy = (dy - 1) / 2;  
                 interpolate8x8_halfpel_v(buffer,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                  rounding);  
223                  break;                  break;
   
224          case 2:          case 2:
225                  ddx = (dx - 1) / 2;                  interpolate8x8_halfpel_h(buffer, src, stride, rounding);
                 ddy = dy / 2;  
                 interpolate8x8_halfpel_h(buffer,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                  rounding);  
226                  break;                  break;
   
227          default:          default:
228                  ddx = (dx - 1) / 2;                  interpolate8x8_halfpel_hv(buffer, src, stride, rounding);
                 ddy = (dy - 1) / 2;  
                 interpolate8x8_halfpel_hv(buffer,  
                                                                  refn + (int)((y + ddy) * stride + x + ddx), stride,  
                                                                   rounding);  
229                  break;                  break;
230          }          }
231          return buffer;          return buffer;
# Line 364  Line 396 
396          switch((y_frac << 2) | (x_frac)) {          switch((y_frac << 2) | (x_frac)) {
397    
398          case 0:          case 0:
399                  transfer8x8_copy(dst, src, stride);                  transfer16x16_copy(dst, src, stride);
                 transfer8x8_copy(dst+8, src+8, stride);  
                 transfer8x8_copy(dst+8*stride, src+8*stride, stride);  
                 transfer8x8_copy(dst+8*stride+8, src+8*stride+8, stride);  
400                  break;                  break;
401    
402          case 1:          case 1:
# Line 505  Line 534 
534                  break;                  break;
535          }          }
536  }  }
537    
538  #endif  #endif

Legend:
Removed from v.1.5.2.7  
changed lines
  Added in v.1.10.2.3

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