[svn] / trunk / xvidcore / src / image / interpolate8x8.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/image/interpolate8x8.c

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

revision 830, Tue Feb 11 21:56:31 2003 UTC revision 1382, Mon Mar 22 22:36:25 2004 UTC
# Line 3  Line 3 
3   *  XVID MPEG-4 VIDEO CODEC   *  XVID MPEG-4 VIDEO CODEC
4   *  - 8x8 block-based halfpel interpolation -   *  - 8x8 block-based halfpel interpolation -
5   *   *
6   *  Copyright(C) 2002 Peter Ross <pross@xvid.org>   *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
  *  Copyright(C) 2002 MinChen <chenm002@163.com>  
7   *   *
8   *  This file is part of XviD, a free MPEG-4 video encoder/decoder   *  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
  *  XviD is free software; you can redistribute it and/or modify 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   *  the Free Software Foundation; either version 2 of the License, or
11   *  (at your option) any later version.   *  (at your option) any later version.
12   *   *
# Line 22  Line 19 
19   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   *  Under section 8 of the GNU General Public License, the copyright   * $Id: interpolate8x8.c,v 1.12 2004-03-22 22:36:23 edgomez Exp $
  *  holders of XVID explicitly forbid distribution in the following  
  *  countries:  
  *  
  *    - Japan  
  *    - United States of America  
  *  
  *  Linking XviD statically or dynamically with other modules is making a  
  *  combined work based on XviD.  Thus, the terms and conditions of the  
  *  GNU General Public License cover the whole combination.  
  *  
  *  As a special exception, the copyright holders of XviD give you  
  *  permission to link XviD with independent modules that communicate with  
  *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the  
  *  license terms of these independent modules, and to copy and distribute  
  *  the resulting combined work under terms of your choice, provided that  
  *  every copy of the combined work is accompanied by a complete copy of  
  *  the source code of XviD (the version of XviD used to produce the  
  *  combined work), being distributed under the terms of the GNU General  
  *  Public License plus this exception.  An independent module is a module  
  *  which is not derived from or based on XviD.  
  *  
  *  Note that people who make modified versions of XviD are not obligated  
  *  to grant this special exception for their modified versions; it is  
  *  their choice whether to do so.  The GNU General Public License gives  
  *  permission to release a modified version without this exception; this  
  *  exception also makes it possible to release a modified version which  
  *  carries forward this exception.  
  *  
  * $Id: interpolate8x8.c,v 1.9 2003-02-11 21:56:31 edgomez Exp $  
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
26  #include "../portab.h"  #include "../portab.h"
27    #include "../global.h"
28  #include "interpolate8x8.h"  #include "interpolate8x8.h"
29    
30  /* function pointers */  /* function pointers */
# Line 63  Line 32 
32  INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;  INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;
33  INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;  INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;
34    
35    INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2;
36    INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4;
37    
38    INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_h;
39    INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_v;
40    
41    INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_h;
42    INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_v;
43    
44    INTERPOLATE_LOWPASS_HV_PTR interpolate8x8_lowpass_hv;
45    INTERPOLATE_LOWPASS_HV_PTR interpolate16x16_lowpass_hv;
46    
47    INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;
48    INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;
49    
50    void interpolate8x8_avg2_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint32_t stride, const uint32_t rounding, const uint32_t height)
51    {
52        uint32_t i;
53            const int32_t round = 1 - rounding;
54    
55        for(i = 0; i < height; i++)
56        {
57            dst[0] = (src1[0] + src2[0] + round) >> 1;
58            dst[1] = (src1[1] + src2[1] + round) >> 1;
59            dst[2] = (src1[2] + src2[2] + round) >> 1;
60            dst[3] = (src1[3] + src2[3] + round) >> 1;
61            dst[4] = (src1[4] + src2[4] + round) >> 1;
62            dst[5] = (src1[5] + src2[5] + round) >> 1;
63            dst[6] = (src1[6] + src2[6] + round) >> 1;
64            dst[7] = (src1[7] + src2[7] + round) >> 1;
65    
66            dst += stride;
67            src1 += stride;
68            src2 += stride;
69        }
70    }
71    
72    void interpolate8x8_avg4_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, const uint8_t *src4, const uint32_t stride, const uint32_t rounding)
73    {
74        int32_t i;
75            const int32_t round = 2 - rounding;
76    
77        for(i = 0; i < 8; i++)
78        {
79            dst[0] = (src1[0] + src2[0] + src3[0] + src4[0] + round) >> 2;
80            dst[1] = (src1[1] + src2[1] + src3[1] + src4[1] + round) >> 2;
81            dst[2] = (src1[2] + src2[2] + src3[2] + src4[2] + round) >> 2;
82            dst[3] = (src1[3] + src2[3] + src3[3] + src4[3] + round) >> 2;
83            dst[4] = (src1[4] + src2[4] + src3[4] + src4[4] + round) >> 2;
84            dst[5] = (src1[5] + src2[5] + src3[5] + src4[5] + round) >> 2;
85            dst[6] = (src1[6] + src2[6] + src3[6] + src4[6] + round) >> 2;
86            dst[7] = (src1[7] + src2[7] + src3[7] + src4[7] + round) >> 2;
87    
88                    dst += stride;
89            src1 += stride;
90            src2 += stride;
91            src3 += stride;
92            src4 += stride;
93        }
94    }
95    
96  /* dst = interpolate(src) */  /* dst = interpolate(src) */
97    
# Line 72  Line 101 
101                                                     const uint32_t stride,                                                     const uint32_t stride,
102                                                     const uint32_t rounding)                                                     const uint32_t rounding)
103  {  {
104          uint32_t i, j;          uintptr_t j;
105    
106          for (j = 0; j < 8; j++) {          if (rounding)
107                  for (i = 0; i < 8; i++) {                  for (j = 0; j < 8*stride; j+=stride)
108                    {
109                          int32_t tot =                                  dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] )>>1);
110                                  (int32_t) src[j * stride + i] + (int32_t) src[j * stride + i + 1];                                  dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] )>>1);
111                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] )>>1);
112                          tot = (tot + 1 - rounding) >> 1;                                  dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] )>>1);
113                          dst[j * stride + i] = (uint8_t) tot;                                  dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] )>>1);
114                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] )>>1);
115                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] )>>1);
116                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] )>>1);
117                  }                  }
118            else
119                    for (j = 0; j < 8*stride; j+=stride)            /* forward or backwards? Who knows ... */
120                    {
121                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] + 1)>>1);
122                                    dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] + 1)>>1);
123                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] + 1)>>1);
124                                    dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] + 1)>>1);
125                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] + 1)>>1);
126                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] + 1)>>1);
127                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] + 1)>>1);
128                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] + 1)>>1);
129          }          }
130  }  }
131    
# Line 94  Line 137 
137                                                     const uint32_t stride,                                                     const uint32_t stride,
138                                                     const uint32_t rounding)                                                     const uint32_t rounding)
139  {  {
140          uint32_t i, j;          uintptr_t j;
141    
         for (j = 0; j < 8; j++) {  
                 for (i = 0; i < 8; i++) {  
                         int32_t tot =  
                                 (int32_t)src[j * stride + i] + (int32_t)src[j * stride + i + stride];  
142    
143                          tot = ((tot + 1 - rounding) >> 1);          if (rounding)
144                          dst[j * stride + i] = (uint8_t) tot;                  for (j = 0; j < 8*stride; j+=stride)            /* forward is better. Some automatic prefetch perhaps. */
145                    {
146                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] )>>1);
147                                    dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] )>>1);
148                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] )>>1);
149                                    dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] )>>1);
150                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] )>>1);
151                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] )>>1);
152                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] )>>1);
153                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] )>>1);
154                  }                  }
155            else
156                    for (j = 0; j < 8*stride; j+=stride)
157                    {
158                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] + 1)>>1);
159                                    dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] + 1)>>1);
160                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] + 1)>>1);
161                                    dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] + 1)>>1);
162                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] + 1)>>1);
163                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] + 1)>>1);
164                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] + 1)>>1);
165                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] + 1)>>1);
166          }          }
167  }  }
168    
# Line 114  Line 173 
173                                                          const uint32_t stride,                                                          const uint32_t stride,
174                                                          const uint32_t rounding)                                                          const uint32_t rounding)
175  {  {
176          uint32_t i, j;          uintptr_t j;
177    
178          for (j = 0; j < 8; j++) {          if (rounding)
179                  for (i = 0; i < 8; i++) {                  for (j = 0; j < 8*stride; j+=stride)
180                          int32_t tot =                  {
181                                  (int32_t)src[j * stride + i] + (int32_t)src[j * stride + i + 1] +                                  dst[j + 0] = (uint8_t)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +1)>>2);
182                                  (int32_t)src[j * stride + i + stride] + (int32_t)src[j * stride + i + stride + 1];                                  dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +1)>>2);
183                          tot = ((tot + 2 - rounding) >> 2);                                  dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +1)>>2);
184                          dst[j * stride + i] = (uint8_t) tot;                                  dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +1)>>2);
185                                    dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +1)>>2);
186                                    dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +1)>>2);
187                                    dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +1)>>2);
188                                    dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +1)>>2);
189                  }                  }
190            else
191                    for (j = 0; j < 8*stride; j+=stride)
192                    {
193                                    dst[j + 0] = (uint8_t)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +2)>>2);
194                                    dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +2)>>2);
195                                    dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +2)>>2);
196                                    dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +2)>>2);
197                                    dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +2)>>2);
198                                    dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +2)>>2);
199                                    dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +2)>>2);
200                                    dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +2)>>2);
201          }          }
202  }  }
203    
204  /* add by MinChen <chenm001@163.com> */  /*************************************************************
205  /* interpolate8x8 two pred block */   * QPEL STUFF STARTS HERE                                    *
206  void   *************************************************************/
207  interpolate8x8_c(uint8_t * const dst,  
208                                   const uint8_t * const src,  void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
209                                   const uint32_t x,  {
210                                   const uint32_t y,      int32_t i;
211                                   const uint32_t stride)          uint8_t round_add = 16 - rounding;
212  {  
213          uint32_t i, j;      for(i = 0; i < 8; i++)
214        {
215          for (j = 0; j < 8; j++) {  
216                  for (i = 0; i < 8; i++) {          dst[0] = CLIP((((src[-2] + src[3]) + 5 * (((src[0] + src[1])<<2) - (src[-1] + src[2])) + round_add) >> 5), 0, 255);
217                          int32_t tot =          dst[1] = CLIP((((src[-1] + src[4]) + 5 * (((src[1] + src[2])<<2) - (src[0] + src[3])) + round_add) >> 5), 0, 255);
218                                  (((int32_t)src[(y + j) * stride + x + i] +          dst[2] = CLIP((((src[0] + src[5]) + 5 * (((src[2] + src[3])<<2) - (src[1] + src[4])) + round_add) >> 5), 0, 255);
219                                    (int32_t)dst[(y + j) * stride + x + i] + 1) >> 1);          dst[3] = CLIP((((src[1] + src[6]) + 5 * (((src[3] + src[4])<<2) - (src[2] + src[5])) + round_add) >> 5), 0, 255);
220                          dst[(y + j) * stride + x + i] = (uint8_t) tot;          dst[4] = CLIP((((src[2] + src[7]) + 5 * (((src[4] + src[5])<<2) - (src[3] + src[6])) + round_add) >> 5), 0, 255);
221            dst[5] = CLIP((((src[3] + src[8]) + 5 * (((src[5] + src[6])<<2) - (src[4] + src[7])) + round_add) >> 5), 0, 255);
222            dst[6] = CLIP((((src[4] + src[9]) + 5 * (((src[6] + src[7])<<2) - (src[5] + src[8])) + round_add) >> 5), 0, 255);
223            dst[7] = CLIP((((src[5] + src[10]) + 5 * (((src[7] + src[8])<<2) - (src[6] + src[9])) + round_add) >> 5), 0, 255);
224    
225            dst += stride;
226            src += stride;
227        }
228    }
229    
230    void interpolate16x16_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
231    {
232        int32_t i;
233            uint8_t round_add = 16 - rounding;
234    
235        for(i = 0; i < 17; i++)
236        {
237    
238            dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) +  23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
239            dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
240            dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
241    
242            dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
243            dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
244            dst[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255);
245            dst[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255);
246            dst[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255);
247            dst[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255);
248            dst[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255);
249            dst[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255);
250            dst[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255);
251            dst[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255);
252    
253            dst[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255);
254            dst[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255);
255            dst[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255);
256    
257            dst += stride;
258            src += stride;
259        }
260    }
261    
262    void interpolate8x8_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
263    {
264        int32_t i;
265            uint8_t round_add = 16 - rounding;
266    
267        for(i = 0; i < 9; i++)
268        {
269    
270            dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
271            dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
272            dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
273            dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
274            dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
275            dst[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255);
276            dst[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255);
277            dst[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255);
278    
279            dst += stride;
280            src += stride;
281        }
282    }
283    
284    void interpolate8x8_6tap_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
285    {
286        int32_t i;
287            uint8_t round_add = 16 - rounding;
288    
289        for(i = 0; i < 8; i++)
290        {
291            int32_t src_2 = src[-2*stride];
292            int32_t src_1 = src[-stride];
293            int32_t src0 = src[0];
294            int32_t src1 = src[stride];
295            int32_t src2 = src[2 * stride];
296            int32_t src3 = src[3 * stride];
297            int32_t src4 = src[4 * stride];
298            int32_t src5 = src[5 * stride];
299            int32_t src6 = src[6 * stride];
300            int32_t src7 = src[7 * stride];
301            int32_t src8 = src[8 * stride];
302            int32_t src9 = src[9 * stride];
303            int32_t src10 = src[10 * stride];
304    
305            dst[0]                  = CLIP((((src_2 + src3) + 5 * (((src0 + src1)<<2) - (src_1 + src2)) + round_add) >> 5), 0, 255);
306            dst[stride]             = CLIP((((src_1 + src4) + 5 * (((src1 + src2)<<2) - (src0 + src3)) + round_add) >> 5), 0, 255);
307            dst[2 * stride] = CLIP((((src0 + src5) + 5 * (((src2 + src3)<<2) - (src1 + src4)) + round_add) >> 5), 0, 255);
308            dst[3 * stride] = CLIP((((src1 + src6) + 5 * (((src3 + src4)<<2) - (src2 + src5)) + round_add) >> 5), 0, 255);
309            dst[4 * stride] = CLIP((((src2 + src7) + 5 * (((src4 + src5)<<2) - (src3 + src6)) + round_add) >> 5), 0, 255);
310            dst[5 * stride] = CLIP((((src3 + src8) + 5 * (((src5 + src6)<<2) - (src4 + src7)) + round_add) >> 5), 0, 255);
311            dst[6 * stride] = CLIP((((src4 + src9) + 5 * (((src6 + src7)<<2) - (src5 + src8)) + round_add) >> 5), 0, 255);
312            dst[7 * stride] = CLIP((((src5 + src10) + 5 * (((src7 + src8)<<2) - (src6 + src9)) + round_add) >> 5), 0, 255);
313    
314                    dst++;
315            src++;
316        }
317    }
318    
319    void interpolate16x16_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
320    {
321        int32_t i;
322            uint8_t round_add = 16 - rounding;
323    
324        for(i = 0; i < 17; i++)
325        {
326            int32_t src0 = src[0];
327            int32_t src1 = src[stride];
328            int32_t src2 = src[2 * stride];
329            int32_t src3 = src[3 * stride];
330            int32_t src4 = src[4 * stride];
331            int32_t src5 = src[5 * stride];
332            int32_t src6 = src[6 * stride];
333            int32_t src7 = src[7 * stride];
334            int32_t src8 = src[8 * stride];
335            int32_t src9 = src[9 * stride];
336            int32_t src10 = src[10 * stride];
337            int32_t src11 = src[11 * stride];
338            int32_t src12 = src[12 * stride];
339            int32_t src13 = src[13 * stride];
340            int32_t src14 = src[14 * stride];
341            int32_t src15 = src[15 * stride];
342            int32_t src16 = src[16 * stride];
343    
344    
345            dst[0] = CLIP(((7 * ((src0<<1) - src2) +  23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255);
346            dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3<<1)) + round_add) >> 5), 0, 255);
347            dst[2*stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4)<<1)) - src6 + round_add) >> 5), 0, 255);
348    
349            dst[3*stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255);
350            dst[4*stride] = CLIP(((20 * (src4 + src5) - 3 * (((src3 + src6)<<1) - (src2 + src7)) - (src1 + src8) + round_add) >> 5), 0, 255);
351            dst[5*stride] = CLIP(((20 * (src5 + src6) - 3 * (((src4 + src7)<<1) - (src3 + src8)) - (src2 + src9) + round_add) >> 5), 0, 255);
352            dst[6*stride] = CLIP(((20 * (src6 + src7) - 3 * (((src5 + src8)<<1) - (src4 + src9)) - (src3 + src10) + round_add) >> 5), 0, 255);
353            dst[7*stride] = CLIP(((20 * (src7 + src8) - 3 * (((src6 + src9)<<1) - (src5 + src10)) - (src4 + src11) + round_add) >> 5), 0, 255);
354            dst[8*stride] = CLIP(((20 * (src8 + src9) - 3 * (((src7 + src10)<<1) - (src6 + src11)) - (src5 + src12) + round_add) >> 5), 0, 255);
355            dst[9*stride] = CLIP(((20 * (src9 + src10) - 3 * (((src8 + src11)<<1) - (src7 + src12)) - (src6 + src13) + round_add) >> 5), 0, 255);
356            dst[10*stride] = CLIP(((20 * (src10 + src11) - 3 * (((src9 + src12)<<1) - (src8 + src13)) - (src7 + src14) + round_add) >> 5), 0, 255);
357            dst[11*stride] = CLIP(((20 * (src11 + src12) - 3 * (((src10 + src13)<<1) - (src9 + src14)) - (src8 + src15) + round_add) >> 5), 0, 255);
358            dst[12*stride] = CLIP(((20 * (src12 + src13) - 3 * (((src11 + src14)<<1) - (src10 + src15)) - (src9 + src16) + round_add) >> 5), 0, 255);
359    
360            dst[13*stride] = CLIP(((20 * (src13 + src14) + (src16<<1) + 3 * (src11 - ((src12 + src15) << 1)) - src10 + round_add) >> 5), 0, 255);
361            dst[14*stride] = CLIP(((19 * src15 + 20 * src14 + 3 * (src12 - src16 - (src13 << 1)) - src11 + round_add) >> 5), 0, 255);
362            dst[15*stride] = CLIP(((23 * src15 + 7 * ((src16<<1) - src14) + 3 * src13 - src12 + round_add) >> 5), 0, 255);
363    
364                    dst++;
365            src++;
366        }
367    }
368    
369    void interpolate8x8_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
370    {
371        int32_t i;
372            uint8_t round_add = 16 - rounding;
373    
374        for(i = 0; i < 9; i++)
375        {
376            int32_t src0 = src[0];
377            int32_t src1 = src[stride];
378            int32_t src2 = src[2 * stride];
379            int32_t src3 = src[3 * stride];
380            int32_t src4 = src[4 * stride];
381            int32_t src5 = src[5 * stride];
382            int32_t src6 = src[6 * stride];
383            int32_t src7 = src[7 * stride];
384            int32_t src8 = src[8 * stride];
385    
386            dst[0]                  = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255);
387            dst[stride]             = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3 << 1)) + round_add) >> 5), 0, 255);
388            dst[2 * stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4) <<1 )) - src6 + round_add) >> 5), 0, 255);
389            dst[3 * stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255);
390            dst[4 * stride] = CLIP(((20 * (src4 + src5) + 3 * ((src2 + src7) - ((src3 + src6)<<1)) - (src1 + src8) + round_add) >> 5), 0, 255);
391            dst[5 * stride] = CLIP(((20 * (src5 + src6) + (src8<<1) + 3 * (src3 - ((src4 + src7) << 1)) - src2 + round_add) >> 5), 0, 255);
392            dst[6 * stride] = CLIP(((19 * src7 + 20 * src6 - src3 + 3 * (src4 - src8 - (src5 << 1)) + round_add) >> 5), 0, 255);
393            dst[7 * stride] = CLIP(((7 * ((src8<<1) - src6) + 23 * src7 + 3 * src5 - src4 + round_add) >> 5), 0, 255);
394    
395                    dst++;
396            src++;
397        }
398                  }                  }
399    
400    void interpolate16x16_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding)
401    {
402            int32_t i;
403            uint8_t round_add = 16 - rounding;
404            uint8_t *h_ptr = dst2;
405    
406        for(i = 0; i < 17; i++)
407        {
408    
409            h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) +  23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
410            h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
411            h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
412    
413            h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
414            h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
415            h_ptr[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255);
416            h_ptr[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255);
417            h_ptr[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255);
418            h_ptr[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255);
419            h_ptr[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255);
420            h_ptr[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255);
421            h_ptr[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255);
422            h_ptr[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255);
423    
424            h_ptr[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255);
425            h_ptr[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255);
426            h_ptr[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255);
427    
428            h_ptr += stride;
429            src += stride;
430          }          }
431    
432            interpolate16x16_lowpass_v_c(dst1, dst2, stride, rounding);
433    
434    }
435    
436    void interpolate8x8_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding)
437    {
438            int32_t i;
439            uint8_t round_add = 16 - rounding;
440            uint8_t *h_ptr = dst2;
441    
442        for(i = 0; i < 9; i++)
443        {
444    
445            h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
446            h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
447            h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
448            h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
449            h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
450            h_ptr[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255);
451            h_ptr[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255);
452            h_ptr[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255);
453    
454            h_ptr += stride;
455            src += stride;
456        }
457    
458            interpolate8x8_lowpass_v_c(dst1, dst2, stride, rounding);
459    
460  }  }

Legend:
Removed from v.830  
changed lines
  Added in v.1382

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