[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.2, Sat Oct 5 21:30:50 2002 UTC revision 1.5.2.5, Tue Oct 15 22:26:59 2002 UTC
# Line 25  Line 25 
25                                                                          const uint32_t rounding);                                                                          const uint32_t rounding);
26  typedef INTERPOLATE8X8_AVG4 *INTERPOLATE8X8_AVG4_PTR;  typedef INTERPOLATE8X8_AVG4 *INTERPOLATE8X8_AVG4_PTR;
27    
28  typedef void (INTERPOLATE8X8_LOWPASS) (uint8_t *dst,  typedef void (INTERPOLATE_LOWPASS) (uint8_t *dst,
29                                                                             uint8_t *src,                                                                             uint8_t *src,
30                                                                             int32_t stride,                                                                             int32_t stride,
31                                                                             int32_t rounding);                                                                             int32_t rounding);
32    
33  typedef INTERPOLATE8X8_LOWPASS *INTERPOLATE8X8_LOWPASS_PTR;  typedef INTERPOLATE_LOWPASS *INTERPOLATE_LOWPASS_PTR;
34    
35  typedef void (INTERPOLATE8X8_LOWPASS_HV) (uint8_t *dst1,  typedef void (INTERPOLATE_LOWPASS_HV) (uint8_t *dst1,
36                                                                                    uint8_t *dst2,                                                                                    uint8_t *dst2,
37                                                                                    uint8_t *src,                                                                                    uint8_t *src,
38                                                                                    int32_t stride,                                                                                    int32_t stride,
39                                                                                    int32_t rounding);                                                                                    int32_t rounding);
40    
41  typedef INTERPOLATE8X8_LOWPASS_HV *INTERPOLATE8X8_LOWPASS_HV_PTR;  typedef INTERPOLATE_LOWPASS_HV *INTERPOLATE_LOWPASS_HV_PTR;
42    
43  typedef void (INTERPOLATE8X8_6TAP_LOWPASS) (uint8_t *dst,  typedef void (INTERPOLATE8X8_6TAP_LOWPASS) (uint8_t *dst,
44                                                                                  uint8_t *src,                                                                                  uint8_t *src,
# Line 54  Line 54 
54  extern INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2;  extern INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2;
55  extern INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4;  extern INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4;
56    
57  extern INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_h;  extern INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_h;
58  extern INTERPOLATE8X8_LOWPASS_PTR interpolate8x8_lowpass_v;  extern INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_v;
59    
60  extern INTERPOLATE8X8_LOWPASS_HV_PTR interpolate8x8_lowpass_hv;  extern INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_h;
61    extern INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_v;
62    
63    extern INTERPOLATE_LOWPASS_HV_PTR interpolate8x8_lowpass_hv;
64    extern INTERPOLATE_LOWPASS_HV_PTR interpolate16x16_lowpass_hv;
65    
66  extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;  extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;
67  extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;  extern INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;
# Line 88  Line 92 
92  INTERPOLATE8X8_AVG2 interpolate8x8_avg2_mmx;  INTERPOLATE8X8_AVG2 interpolate8x8_avg2_mmx;
93  INTERPOLATE8X8_AVG4 interpolate8x8_avg4_mmx;  INTERPOLATE8X8_AVG4 interpolate8x8_avg4_mmx;
94    
95  INTERPOLATE8X8_LOWPASS interpolate8x8_lowpass_h_c;  INTERPOLATE_LOWPASS interpolate8x8_lowpass_h_c;
96  INTERPOLATE8X8_LOWPASS interpolate8x8_lowpass_v_c;  INTERPOLATE_LOWPASS interpolate8x8_lowpass_v_c;
97  INTERPOLATE8X8_LOWPASS_HV interpolate8x8_lowpass_hv_c;  
98    INTERPOLATE_LOWPASS interpolate16x16_lowpass_h_c;
99    INTERPOLATE_LOWPASS interpolate16x16_lowpass_v_c;
100    
101    INTERPOLATE_LOWPASS_HV interpolate8x8_lowpass_hv_c;
102    INTERPOLATE_LOWPASS_HV interpolate16x16_lowpass_hv_c;
103    
104  INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_h_c;  INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_h_c;
105  INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_v_c;  INTERPOLATE8X8_6TAP_LOWPASS interpolate8x8_6tap_lowpass_v_c;
# Line 189  Line 198 
198          return buffer;          return buffer;
199  }  }
200    
   
201  static __inline void interpolate8x8_quarterpel(uint8_t * const cur,  static __inline void interpolate8x8_quarterpel(uint8_t * const cur,
202                                       uint8_t * const refn,                                       uint8_t * const refn,
203                                           uint8_t * const refh,                                           uint8_t * const refh,
# Line 252  Line 260 
260                  break;                  break;
261    
262          case 5:          case 5:
263                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
264                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
265                  interpolate8x8_avg4(dst, src, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
266                    interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);
267                  break;                  break;
268    
269          case 6:          case 6:
# Line 263  Line 272 
272                  break;                  break;
273    
274          case 7:          case 7:
275                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
276                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding);
277                  interpolate8x8_avg4(dst, src+1, halfpel_h, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
278                    interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);
279                  break;                  break;
280    
281          case 8:          case 8:
# Line 273  Line 283 
283                  break;                  break;
284    
285          case 9:          case 9:
286                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
287                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
288                  interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(dst, halfpel_v, stride, rounding);
289                  break;                  break;
290    
291          case 10:          case 10:
# Line 283  Line 293 
293                  break;                  break;
294    
295          case 11:          case 11:
296                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
297                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding);
298                  interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(dst, halfpel_v, stride, rounding);
299                  break;                  break;
300    
301          case 12:          case 12:
# Line 294  Line 304 
304                  break;                  break;
305    
306          case 13:          case 13:
307                  interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
308                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
309                  interpolate8x8_avg4(dst, src+stride, halfpel_h+stride, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
310                    interpolate8x8_avg2(dst, halfpel_v+stride, halfpel_hv, stride, rounding);
311                  break;                  break;
312    
313          case 14:          case 14:
# Line 305  Line 316 
316                  break;                  break;
317    
318          case 15:          case 15:
319                  interpolate8x8_lowpass_v(halfpel_v, src+1, stride, rounding);                  interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding);
320                  interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);                  interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding);
321                  interpolate8x8_avg4(dst, src+stride+1, halfpel_h+stride, halfpel_v, halfpel_hv, stride, rounding);                  interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
322                    interpolate8x8_avg2(dst, halfpel_hv, halfpel_v + stride, stride, rounding);
323                  break;                  break;
324          }          }
325  }  }
326    
327    static __inline void interpolate16x16_quarterpel(uint8_t * const cur,
328                                         uint8_t * const refn,
329                                             uint8_t * const refh,
330                                             uint8_t * const refv,
331                                             uint8_t * const refhv,
332                                         const uint32_t x, const uint32_t y,
333                                             const int32_t dx,  const int dy,
334                                             const uint32_t stride,
335                                             const uint32_t rounding)
336    {
337            const int32_t xRef = x*4 + dx;
338            const int32_t yRef = y*4 + dy;
339    
340            uint8_t *src, *dst;
341            uint8_t *halfpel_h, *halfpel_v, *halfpel_hv;
342            int32_t x_int, y_int, x_frac, y_frac;
343    
344            x_int = xRef/4;
345            if (xRef < 0 && xRef % 4)
346                    x_int--;
347    
348            x_frac = xRef - (4*x_int);
349    
350            y_int  = yRef/4;
351            if (yRef < 0 && yRef % 4)
352                    y_int--;
353    
354            y_frac = yRef - (4*y_int);
355    
356            src = refn + y_int * stride + x_int;
357            halfpel_h = refh;
358            halfpel_v = refv;
359            halfpel_hv = refhv;
360    
361            dst = cur + y * stride + x;
362    
363            switch((y_frac << 2) | (x_frac)) {
364    
365            case 0:
366                    transfer8x8_copy(dst, src, stride);
367                    transfer8x8_copy(dst+8, src+8, stride);
368                    transfer8x8_copy(dst+8*stride, src+8*stride, stride);
369                    transfer8x8_copy(dst+8*stride+8, src+8*stride+8, stride);
370                    break;
371    
372            case 1:
373                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
374                    interpolate8x8_avg2(dst, src, halfpel_h, stride, rounding);
375                    interpolate8x8_avg2(dst+8, src+8, halfpel_h+8, stride, rounding);
376                    interpolate8x8_avg2(dst+8*stride, src+8*stride, halfpel_h+8*stride, stride, rounding);
377                    interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
378                    break;
379    
380            case 2:
381                interpolate16x16_lowpass_h(dst, src, stride, rounding);
382                    break;
383    
384            case 3:
385                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
386                    interpolate8x8_avg2(dst, src + 1, halfpel_h, stride, rounding);
387                    interpolate8x8_avg2(dst+8, src + 8 + 1, halfpel_h+8, stride, rounding);
388                    interpolate8x8_avg2(dst+8*stride, src + 8*stride + 1, halfpel_h+8*stride, stride, rounding);
389                    interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8 + 1, halfpel_h+8*stride+8, stride, rounding);
390                    break;
391    
392            case 4:
393                    interpolate16x16_lowpass_v(halfpel_v, src, stride, rounding);
394                    interpolate8x8_avg2(dst, src, halfpel_v, stride, rounding);
395                    interpolate8x8_avg2(dst+8, src+8, halfpel_v+8, stride, rounding);
396                    interpolate8x8_avg2(dst+8*stride, src+8*stride, halfpel_v+8*stride, stride, rounding);
397                    interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8, halfpel_v+8*stride+8, stride, rounding);
398                    break;
399    
400            case 5:
401                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
402                    interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
403                    interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding);
404                    interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding);
405                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
406    
407                    interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
408                    interpolate8x8_avg2(dst, halfpel_hv, halfpel_v, stride, rounding);
409                    interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+8, stride, rounding);
410                    interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+8*stride, stride, rounding);
411                    interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+8*stride+8, stride, rounding);
412                    break;
413    
414            case 6:
415                    interpolate16x16_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
416                    interpolate8x8_avg2(dst, halfpel_h, halfpel_hv, stride, rounding);
417                    interpolate8x8_avg2(dst+8, halfpel_h+8, halfpel_hv+8, stride, rounding);
418                    interpolate8x8_avg2(dst+8*stride, halfpel_h+8*stride, halfpel_hv+8*stride, stride, rounding);
419                    interpolate8x8_avg2(dst+8*stride+8, halfpel_h+8*stride+8, halfpel_hv+8*stride+8, stride, rounding);
420                    break;
421    
422            case 7:
423                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
424                    interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding);
425                    interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding);
426                    interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding);
427                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
428    
429                    interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
430                    interpolate8x8_avg2(dst, halfpel_hv, halfpel_v, stride, rounding);
431                    interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+8, stride, rounding);
432                    interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+8*stride, stride, rounding);
433                    interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+8*stride+8, stride, rounding);
434                    break;
435    
436            case 8:
437                interpolate16x16_lowpass_v(dst, src, stride, rounding);
438                    break;
439    
440            case 9:
441                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
442                    interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
443                    interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding);
444                    interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding);
445                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
446                    interpolate16x16_lowpass_v(dst, halfpel_v, stride, rounding);
447                    break;
448    
449            case 10:
450                    interpolate16x16_lowpass_hv(dst, halfpel_h, src, stride, rounding);
451                    break;
452    
453            case 11:
454                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
455                    interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding);
456                    interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding);
457                    interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding);
458                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
459                    interpolate16x16_lowpass_v(dst, halfpel_v, stride, rounding);
460                    break;
461    
462            case 12:
463                    interpolate16x16_lowpass_v(halfpel_v, src, stride, rounding);
464                    interpolate8x8_avg2(dst, src+stride, halfpel_v, stride, rounding);
465                    interpolate8x8_avg2(dst+8, src+stride+8, halfpel_v+8, stride, rounding);
466                    interpolate8x8_avg2(dst+8*stride, src+stride+8*stride, halfpel_v+8*stride, stride, rounding);
467                    interpolate8x8_avg2(dst+8*stride+8, src+stride+8*stride+8, halfpel_v+8*stride+8, stride, rounding);
468                    break;
469    
470            case 13:
471                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
472                    interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding);
473                    interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding);
474                    interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding);
475                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
476    
477                    interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
478                    interpolate8x8_avg2(dst, halfpel_hv, halfpel_v+stride, stride, rounding);
479                    interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+stride+8, stride, rounding);
480                    interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+stride+8*stride, stride, rounding);
481                    interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+stride+8*stride+8, stride, rounding);
482                    break;
483    
484            case 14:
485                    interpolate16x16_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding);
486                    interpolate8x8_avg2(dst, halfpel_h+stride, halfpel_hv, stride, rounding);
487                    interpolate8x8_avg2(dst+8, halfpel_h+stride+8, halfpel_hv+8, stride, rounding);
488                    interpolate8x8_avg2(dst+8*stride, halfpel_h+stride+8*stride, halfpel_hv+8*stride, stride, rounding);
489                    interpolate8x8_avg2(dst+8*stride+8, halfpel_h+stride+8*stride+8, halfpel_hv+8*stride+8, stride, rounding);
490                    break;
491    
492            case 15:
493                    interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding);
494                    interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding);
495                    interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding);
496                    interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding);
497                    interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding);
498    
499                    interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding);
500                    interpolate8x8_avg2(dst, halfpel_hv, halfpel_v+stride, stride, rounding);
501                    interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+stride+8, stride, rounding);
502                    interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+stride+8*stride, stride, rounding);
503                    interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+stride+8*stride+8, stride, rounding);
504                    break;
505            }
506    }
507  #endif  #endif

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

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