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

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

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

revision 1.4.2.2, Thu Oct 10 12:14:53 2002 UTC revision 1.11, Tue Mar 4 16:33:41 2003 UTC
# Line 31  Line 31 
31    
32    
33  #include "../portab.h"  #include "../portab.h"
34    #include "../global.h"
35  #include "interpolate8x8.h"  #include "interpolate8x8.h"
36    
37  // function pointers  // function pointers
# Line 53  Line 54 
54  INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;  INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;
55  INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;  INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;
56    
57  void interpolate8x8_avg2_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint32_t stride, const uint32_t rounding)  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)
58  {  {
59      int32_t i;      uint32_t i;
60          const int32_t round = 1 - rounding;          const int32_t round = 1 - rounding;
61    
62      for(i = 0; i < 8; i++)      for(i = 0; i < height; i++)
63      {      {
64          dst[0] = (src1[0] + src2[0] + round) >> 1;          dst[0] = (src1[0] + src2[0] + round) >> 1;
65          dst[1] = (src1[1] + src2[1] + round) >> 1;          dst[1] = (src1[1] + src2[1] + round) >> 1;
# Line 107  Line 108 
108                                                     const uint32_t stride,                                                     const uint32_t stride,
109                                                     const uint32_t rounding)                                                     const uint32_t rounding)
110  {  {
111          uint32_t i, j;          intptr_t j;
   
         for (j = 0; j < 8; j++) {  
                 for (i = 0; i < 8; i++) {  
112    
113                          int16_t tot =          if (rounding)
114                                  (int32_t) src[j * stride + i] + (int32_t) src[j * stride + i +                  for (j = 7*stride; j >= 0; j-=stride)
115                                                                                                                            1];                  {
116                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] )>>1);
117                          tot = (int32_t) ((tot + 1 - rounding) >> 1);                                  dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] )>>1);
118                          dst[j * stride + i] = (uint8_t) tot;                                  dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] )>>1);
119                  }                                  dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] )>>1);
120                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] )>>1);
121                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] )>>1);
122                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] )>>1);
123                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] )>>1);
124                    }
125            else
126                    for (j = 0; j < 8*stride; j+=stride)            /* forward or backwards? Who knows ... */
127                    {
128                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] + 1)>>1);
129                                    dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] + 1)>>1);
130                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] + 1)>>1);
131                                    dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] + 1)>>1);
132                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] + 1)>>1);
133                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] + 1)>>1);
134                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] + 1)>>1);
135                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] + 1)>>1);
136          }          }
137  }  }
138    
# Line 130  Line 144 
144                                                     const uint32_t stride,                                                     const uint32_t stride,
145                                                     const uint32_t rounding)                                                     const uint32_t rounding)
146  {  {
147          uint32_t i, j;          intptr_t j;
148    //      const uint8_t * const src2 = src+stride;                /* using a second pointer is _not_ faster here */
149    
150          for (j = 0; j < 8; j++) {          if (rounding)
151                  for (i = 0; i < 8; i++) {                  for (j = 0; j < 8*stride; j+=stride)            /* forward is better. Some automatic prefetch perhaps. */
152                          int16_t tot = src[j * stride + i] + src[j * stride + i + stride];                  {
153                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] )>>1);
154                          tot = ((tot + 1 - rounding) >> 1);                                  dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] )>>1);
155                          dst[j * stride + i] = (uint8_t) tot;                                  dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] )>>1);
156                  }                                  dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] )>>1);
157                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] )>>1);
158                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] )>>1);
159                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] )>>1);
160                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] )>>1);
161                    }
162            else
163                    for (j = 0; j < 8*stride; j+=stride)
164                    {
165                                    dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] + 1)>>1);
166                                    dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] + 1)>>1);
167                                    dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] + 1)>>1);
168                                    dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] + 1)>>1);
169                                    dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] + 1)>>1);
170                                    dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] + 1)>>1);
171                                    dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] + 1)>>1);
172                                    dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] + 1)>>1);
173          }          }
174  }  }
175    
# Line 149  Line 180 
180                                                          const uint32_t stride,                                                          const uint32_t stride,
181                                                          const uint32_t rounding)                                                          const uint32_t rounding)
182  {  {
183          uint32_t i, j;          intptr_t j;
184    
185          for (j = 0; j < 8; j++) {          if (rounding)
186                  for (i = 0; i < 8; i++) {                  for (j = 7*stride; j >= 0; j-=stride)
187                          int16_t tot =                  {
188                                  src[j * stride + i] + 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);
189                                  src[j * stride + i + stride] + src[j * stride + i + stride +                                  dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +1)>>2);
190                                                                                                     1];                                  dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +1)>>2);
191                          tot = ((tot + 2 - rounding) >> 2);                                  dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +1)>>2);
192                          dst[j * stride + i] = (uint8_t) tot;                                  dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +1)>>2);
193                  }                                  dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +1)>>2);
194                                    dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +1)>>2);
195                                    dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +1)>>2);
196                    }
197            else
198                    for (j = 7*stride; j >= 0; j-=stride)
199                    {
200                                    dst[j + 0] = (uint8_t)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +2)>>2);
201                                    dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +2)>>2);
202                                    dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +2)>>2);
203                                    dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +2)>>2);
204                                    dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +2)>>2);
205                                    dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +2)>>2);
206                                    dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +2)>>2);
207                                    dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +2)>>2);
208          }          }
209  }  }
210    
211    
212    
213    
214  /*************************************************************  /*************************************************************
215   * QPEL STUFF STARTS HERE                                    *   * QPEL STUFF STARTS HERE                                    *
216   *************************************************************/   *************************************************************/
217    
 #define CLIP(X,A,B) (X < A) ? (A) : ((X > B) ? (B) : (X))  
   
218  void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)  void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
219  {  {
220      int32_t i;      int32_t i;
# Line 196  Line 242 
242      int32_t i;      int32_t i;
243          uint8_t round_add = 16 - rounding;          uint8_t round_add = 16 - rounding;
244    
245      for(i = 0; i < 16; i++)      for(i = 0; i < 17; i++)
246      {      {
247    
248          dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) +  23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);          dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) +  23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
# Line 228  Line 274 
274      int32_t i;      int32_t i;
275          uint8_t round_add = 16 - rounding;          uint8_t round_add = 16 - rounding;
276    
277      for(i = 0; i < 8; i++)      for(i = 0; i < 9; i++)
278      {      {
279    
280          dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);          dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
# Line 285  Line 331 
331      int32_t i;      int32_t i;
332          uint8_t round_add = 16 - rounding;          uint8_t round_add = 16 - rounding;
333    
334      for(i = 0; i < 16; i++)      for(i = 0; i < 17; i++)
335      {      {
336          int32_t src0 = src[0];          int32_t src0 = src[0];
337          int32_t src1 = src[stride];          int32_t src1 = src[stride];
# Line 335  Line 381 
381      int32_t i;      int32_t i;
382          uint8_t round_add = 16 - rounding;          uint8_t round_add = 16 - rounding;
383    
384      for(i = 0; i < 8; i++)      for(i = 0; i < 9; i++)
385      {      {
386          int32_t src0 = src[0];          int32_t src0 = src[0];
387          int32_t src1 = src[stride];          int32_t src1 = src[stride];

Legend:
Removed from v.1.4.2.2  
changed lines
  Added in v.1.11

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