pixel.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:25k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * pixel.c: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: pixel.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6.  *
  7.  * Authors: Eric Petit <titer@m0k.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifdef SYS_LINUX
  24. #include <altivec.h>
  25. #endif
  26. #include "common/common.h"
  27. #include "ppccommon.h"
  28. /***********************************************************************
  29.  * SAD routines
  30.  **********************************************************************/
  31. #define PIXEL_SAD_ALTIVEC( name, lx, ly, a, b )        
  32. static int name( uint8_t *pix1, int i_pix1,            
  33.                  uint8_t *pix2, int i_pix2 )           
  34. {                                                      
  35.     int y;                                             
  36.     DECLARE_ALIGNED( int, sum, 16 );                   
  37.                                                        
  38.     LOAD_ZERO;                                         
  39.     PREP_LOAD;                                         
  40.     vec_u8_t  pix1v, pix2v;                            
  41.     vec_s32_t sumv = zero_s32v;                        
  42.     for( y = 0; y < ly; y++ )                          
  43.     {                                                  
  44.         VEC_LOAD( pix1, pix1v, lx, vec_u8_t );         
  45.         VEC_LOAD( pix2, pix2v, lx, vec_u8_t );         
  46.         sumv = (vec_s32_t) vec_sum4s(                  
  47.                    vec_sub( vec_max( pix1v, pix2v ),   
  48.                             vec_min( pix1v, pix2v ) ), 
  49.                    (vec_u32_t) sumv );                 
  50.         pix1 += i_pix1;                                
  51.         pix2 += i_pix2;                                
  52.     }                                                  
  53.     sumv = vec_sum##a( sumv, zero_s32v );              
  54.     sumv = vec_splat( sumv, b );                       
  55.     vec_ste( sumv, 0, &sum );                          
  56.     return sum;                                        
  57. }
  58. PIXEL_SAD_ALTIVEC( pixel_sad_16x16_altivec, 16, 16, s,  3 )
  59. PIXEL_SAD_ALTIVEC( pixel_sad_8x16_altivec,  8,  16, 2s, 1 )
  60. PIXEL_SAD_ALTIVEC( pixel_sad_16x8_altivec,  16, 8,  s,  3 )
  61. PIXEL_SAD_ALTIVEC( pixel_sad_8x8_altivec,   8,  8,  2s, 1 )
  62. /***********************************************************************
  63.  * SATD routines
  64.  **********************************************************************/
  65. /***********************************************************************
  66.  * VEC_HADAMAR
  67.  ***********************************************************************
  68.  * b[0] = a[0] + a[1] + a[2] + a[3]
  69.  * b[1] = a[0] + a[1] - a[2] - a[3]
  70.  * b[2] = a[0] - a[1] - a[2] + a[3]
  71.  * b[3] = a[0] - a[1] + a[2] - a[3]
  72.  **********************************************************************/
  73. #define VEC_HADAMAR(a0,a1,a2,a3,b0,b1,b2,b3) 
  74.     b2 = vec_add( a0, a1 ); 
  75.     b3 = vec_add( a2, a3 ); 
  76.     a0 = vec_sub( a0, a1 ); 
  77.     a2 = vec_sub( a2, a3 ); 
  78.     b0 = vec_add( b2, b3 ); 
  79.     b1 = vec_sub( b2, b3 ); 
  80.     b2 = vec_sub( a0, a2 ); 
  81.     b3 = vec_add( a0, a2 )
  82. /***********************************************************************
  83.  * VEC_ABS
  84.  ***********************************************************************
  85.  * a: s16v
  86.  *
  87.  * a = abs(a)
  88.  * 
  89.  * Call vec_sub()/vec_max() instead of vec_abs() because vec_abs()
  90.  * actually also calls vec_splat(0), but we already have a null vector.
  91.  **********************************************************************/
  92. #define VEC_ABS(a) 
  93.     pix1v = vec_sub( zero_s16v, a ); 
  94.     a     = vec_max( a, pix1v ); 
  95. /***********************************************************************
  96.  * VEC_ADD_ABS
  97.  ***********************************************************************
  98.  * a:    s16v
  99.  * b, c: s32v
  100.  *
  101.  * c[i] = abs(a[2*i]) + abs(a[2*i+1]) + [bi]
  102.  **********************************************************************/
  103. #define VEC_ADD_ABS(a,b,c) 
  104.     VEC_ABS( a ); 
  105.     c = vec_sum4s( a, b )
  106. /***********************************************************************
  107.  * SATD 4x4
  108.  **********************************************************************/
  109. static int pixel_satd_4x4_altivec( uint8_t *pix1, int i_pix1,
  110.                                    uint8_t *pix2, int i_pix2 )
  111. {
  112.     DECLARE_ALIGNED( int, i_satd, 16 );
  113.     PREP_DIFF;
  114.     vec_s16_t diff0v, diff1v, diff2v, diff3v;
  115.     vec_s16_t temp0v, temp1v, temp2v, temp3v;
  116.     vec_s32_t satdv;
  117.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  118.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  119.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  120.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  121.     /* Hadamar H */
  122.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  123.                  temp0v, temp1v, temp2v, temp3v );
  124.     
  125.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  126.                      diff0v, diff1v, diff2v, diff3v );
  127.     /* Hadamar V */
  128.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  129.                  temp0v, temp1v, temp2v, temp3v );
  130.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  131.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  132.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  133.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  134.     satdv = vec_sum2s( satdv, zero_s32v );
  135.     satdv = vec_splat( satdv, 1 );
  136.     vec_ste( satdv, 0, &i_satd );
  137.     return i_satd / 2;
  138. }
  139. /***********************************************************************
  140.  * SATD 4x8
  141.  **********************************************************************/
  142. static int pixel_satd_4x8_altivec( uint8_t *pix1, int i_pix1,
  143.                                    uint8_t *pix2, int i_pix2 )
  144. {
  145.     DECLARE_ALIGNED( int, i_satd, 16 );
  146.     PREP_DIFF;
  147.     vec_s16_t diff0v, diff1v, diff2v, diff3v;
  148.     vec_s16_t temp0v, temp1v, temp2v, temp3v;
  149.     vec_s32_t satdv;
  150.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  151.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  152.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  153.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  154.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  155.                  temp0v, temp1v, temp2v, temp3v );
  156.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  157.                      diff0v, diff1v, diff2v, diff3v );
  158.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  159.                  temp0v, temp1v, temp2v, temp3v );
  160.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  161.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  162.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  163.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  164.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  165.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  166.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  167.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  168.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  169.                  temp0v, temp1v, temp2v, temp3v );
  170.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  171.                      diff0v, diff1v, diff2v, diff3v );
  172.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  173.                  temp0v, temp1v, temp2v, temp3v );
  174.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  175.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  176.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  177.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  178.     satdv = vec_sum2s( satdv, zero_s32v );
  179.     satdv = vec_splat( satdv, 1 );
  180.     vec_ste( satdv, 0, &i_satd );
  181.     return i_satd / 2;
  182. }
  183. /***********************************************************************
  184.  * SATD 8x4
  185.  **********************************************************************/
  186. static int pixel_satd_8x4_altivec( uint8_t *pix1, int i_pix1,
  187.                                    uint8_t *pix2, int i_pix2 )
  188. {
  189.     DECLARE_ALIGNED( int, i_satd, 16 );
  190.     PREP_DIFF;
  191.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  192.               diff4v, diff5v, diff6v, diff7v;
  193.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  194.               temp4v, temp5v, temp6v, temp7v;
  195.     vec_s32_t satdv;
  196.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  197.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  198.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  199.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  200.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  201.                  temp0v, temp1v, temp2v, temp3v );
  202.     /* This causes warnings because temp4v...temp7v haven't be set,
  203.        but we don't care */
  204.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  205.                      temp4v, temp5v, temp6v, temp7v,
  206.                      diff0v, diff1v, diff2v, diff3v,
  207.                      diff4v, diff5v, diff6v, diff7v );
  208.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  209.                  temp0v, temp1v, temp2v, temp3v );
  210.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  211.                  temp4v, temp5v, temp6v, temp7v );
  212.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  213.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  214.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  215.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  216.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  217.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  218.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  219.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  220.     satdv = vec_sum2s( satdv, zero_s32v );
  221.     satdv = vec_splat( satdv, 1 );
  222.     vec_ste( satdv, 0, &i_satd );
  223.     return i_satd / 2;
  224. }
  225. /***********************************************************************
  226.  * SATD 8x8
  227.  **********************************************************************/
  228. static int pixel_satd_8x8_altivec( uint8_t *pix1, int i_pix1,
  229.                                    uint8_t *pix2, int i_pix2 )
  230. {
  231.     DECLARE_ALIGNED( int, i_satd, 16 );
  232.     PREP_DIFF;
  233.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  234.               diff4v, diff5v, diff6v, diff7v;
  235.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  236.               temp4v, temp5v, temp6v, temp7v;
  237.     vec_s32_t satdv;
  238.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  239.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  240.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  241.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  242.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  243.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  244.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  245.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  246.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  247.                  temp0v, temp1v, temp2v, temp3v );
  248.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  249.                  temp4v, temp5v, temp6v, temp7v );
  250.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  251.                      temp4v, temp5v, temp6v, temp7v,
  252.                      diff0v, diff1v, diff2v, diff3v,
  253.                      diff4v, diff5v, diff6v, diff7v );
  254.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  255.                  temp0v, temp1v, temp2v, temp3v );
  256.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  257.                  temp4v, temp5v, temp6v, temp7v );
  258.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  259.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  260.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  261.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  262.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  263.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  264.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  265.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  266.     satdv = vec_sums( satdv, zero_s32v );
  267.     satdv = vec_splat( satdv, 3 );
  268.     vec_ste( satdv, 0, &i_satd );
  269.     return i_satd / 2;
  270. }
  271. /***********************************************************************
  272.  * SATD 8x16
  273.  **********************************************************************/
  274. static int pixel_satd_8x16_altivec( uint8_t *pix1, int i_pix1,
  275.                                     uint8_t *pix2, int i_pix2 )
  276. {
  277.     DECLARE_ALIGNED( int, i_satd, 16 );
  278.     PREP_DIFF;
  279.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  280.               diff4v, diff5v, diff6v, diff7v;
  281.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  282.               temp4v, temp5v, temp6v, temp7v;
  283.     vec_s32_t satdv;
  284.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  285.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  286.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  287.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  288.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  289.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  290.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  291.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  292.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  293.                  temp0v, temp1v, temp2v, temp3v );
  294.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  295.                  temp4v, temp5v, temp6v, temp7v );
  296.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  297.                      temp4v, temp5v, temp6v, temp7v,
  298.                      diff0v, diff1v, diff2v, diff3v,
  299.                      diff4v, diff5v, diff6v, diff7v );
  300.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  301.                  temp0v, temp1v, temp2v, temp3v );
  302.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  303.                  temp4v, temp5v, temp6v, temp7v );
  304.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  305.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  306.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  307.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  308.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  309.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  310.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  311.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  312.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  313.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  314.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  315.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  316.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  317.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  318.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  319.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  320.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  321.                  temp0v, temp1v, temp2v, temp3v );
  322.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  323.                  temp4v, temp5v, temp6v, temp7v );
  324.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  325.                      temp4v, temp5v, temp6v, temp7v,
  326.                      diff0v, diff1v, diff2v, diff3v,
  327.                      diff4v, diff5v, diff6v, diff7v );
  328.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  329.                  temp0v, temp1v, temp2v, temp3v );
  330.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  331.                  temp4v, temp5v, temp6v, temp7v );
  332.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  333.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  334.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  335.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  336.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  337.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  338.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  339.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  340.     satdv = vec_sums( satdv, zero_s32v );
  341.     satdv = vec_splat( satdv, 3 );
  342.     vec_ste( satdv, 0, &i_satd );
  343.     return i_satd / 2;
  344. }
  345. /***********************************************************************
  346.  * SATD 16x8
  347.  **********************************************************************/
  348. static int pixel_satd_16x8_altivec( uint8_t *pix1, int i_pix1,
  349.                                     uint8_t *pix2, int i_pix2 )
  350. {
  351.     DECLARE_ALIGNED( int, i_satd, 16 );
  352.     LOAD_ZERO;
  353.     PREP_LOAD;
  354.     vec_s32_t satdv;
  355.     vec_s16_t pix1v, pix2v;
  356.     vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,
  357.               diffh4v, diffh5v, diffh6v, diffh7v;
  358.     vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,
  359.               diffl4v, diffl5v, diffl6v, diffl7v;
  360.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  361.               temp4v, temp5v, temp6v, temp7v;
  362.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  363.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  364.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  365.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  366.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  367.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  368.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  369.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  370.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  371.                  temp0v, temp1v, temp2v, temp3v );
  372.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  373.                  temp4v, temp5v, temp6v, temp7v );
  374.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  375.                      temp4v, temp5v, temp6v, temp7v,
  376.                      diffh0v, diffh1v, diffh2v, diffh3v,
  377.                      diffh4v, diffh5v, diffh6v, diffh7v );
  378.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  379.                  temp0v, temp1v, temp2v, temp3v );
  380.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  381.                  temp4v, temp5v, temp6v, temp7v );
  382.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  383.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  384.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  385.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  386.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  387.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  388.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  389.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  390.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  391.                  temp0v, temp1v, temp2v, temp3v );
  392.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  393.                  temp4v, temp5v, temp6v, temp7v );
  394.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  395.                      temp4v, temp5v, temp6v, temp7v,
  396.                      diffl0v, diffl1v, diffl2v, diffl3v,
  397.                      diffl4v, diffl5v, diffl6v, diffl7v );
  398.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  399.                  temp0v, temp1v, temp2v, temp3v );
  400.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  401.                  temp4v, temp5v, temp6v, temp7v );
  402.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  403.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  404.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  405.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  406.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  407.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  408.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  409.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  410.     satdv = vec_sums( satdv, zero_s32v );
  411.     satdv = vec_splat( satdv, 3 );
  412.     vec_ste( satdv, 0, &i_satd );
  413.     return i_satd / 2;
  414. }
  415. /***********************************************************************
  416.  * SATD 16x16
  417.  **********************************************************************/
  418. static int pixel_satd_16x16_altivec( uint8_t *pix1, int i_pix1,
  419.                                      uint8_t *pix2, int i_pix2 )
  420. {
  421.     DECLARE_ALIGNED( int, i_satd, 16 );
  422.     LOAD_ZERO;
  423.     PREP_LOAD;
  424.     vec_s32_t satdv;
  425.     vec_s16_t pix1v, pix2v;
  426.     vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,
  427.               diffh4v, diffh5v, diffh6v, diffh7v;
  428.     vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,
  429.               diffl4v, diffl5v, diffl6v, diffl7v;
  430.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  431.               temp4v, temp5v, temp6v, temp7v;
  432.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  433.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  434.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  435.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  436.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  437.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  438.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  439.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  440.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  441.                  temp0v, temp1v, temp2v, temp3v );
  442.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  443.                  temp4v, temp5v, temp6v, temp7v );
  444.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  445.                      temp4v, temp5v, temp6v, temp7v,
  446.                      diffh0v, diffh1v, diffh2v, diffh3v,
  447.                      diffh4v, diffh5v, diffh6v, diffh7v );
  448.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  449.                  temp0v, temp1v, temp2v, temp3v );
  450.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  451.                  temp4v, temp5v, temp6v, temp7v );
  452.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  453.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  454.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  455.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  456.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  457.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  458.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  459.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  460.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  461.                  temp0v, temp1v, temp2v, temp3v );
  462.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  463.                  temp4v, temp5v, temp6v, temp7v );
  464.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  465.                      temp4v, temp5v, temp6v, temp7v,
  466.                      diffl0v, diffl1v, diffl2v, diffl3v,
  467.                      diffl4v, diffl5v, diffl6v, diffl7v );
  468.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  469.                  temp0v, temp1v, temp2v, temp3v );
  470.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  471.                  temp4v, temp5v, temp6v, temp7v );
  472.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  473.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  474.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  475.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  476.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  477.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  478.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  479.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  480.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  481.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  482.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  483.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  484.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  485.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  486.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  487.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  488.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  489.                  temp0v, temp1v, temp2v, temp3v );
  490.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  491.                  temp4v, temp5v, temp6v, temp7v );
  492.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  493.                      temp4v, temp5v, temp6v, temp7v,
  494.                      diffh0v, diffh1v, diffh2v, diffh3v,
  495.                      diffh4v, diffh5v, diffh6v, diffh7v );
  496.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  497.                  temp0v, temp1v, temp2v, temp3v );
  498.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  499.                  temp4v, temp5v, temp6v, temp7v );
  500.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  501.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  502.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  503.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  504.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  505.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  506.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  507.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  508.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  509.                  temp0v, temp1v, temp2v, temp3v );
  510.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  511.                  temp4v, temp5v, temp6v, temp7v );
  512.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  513.                      temp4v, temp5v, temp6v, temp7v,
  514.                      diffl0v, diffl1v, diffl2v, diffl3v,
  515.                      diffl4v, diffl5v, diffl6v, diffl7v );
  516.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  517.                  temp0v, temp1v, temp2v, temp3v );
  518.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  519.                  temp4v, temp5v, temp6v, temp7v );
  520.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  521.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  522.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  523.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  524.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  525.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  526.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  527.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  528.     satdv = vec_sums( satdv, zero_s32v );
  529.     satdv = vec_splat( satdv, 3 );
  530.     vec_ste( satdv, 0, &i_satd );
  531.     return i_satd / 2;
  532. }
  533. /****************************************************************************
  534.  * x264_pixel_init:
  535.  ****************************************************************************/
  536. void x264_pixel_altivec_init( x264_pixel_function_t *pixf )
  537. {
  538.     pixf->sad[PIXEL_16x16]  = pixel_sad_16x16_altivec;
  539.     pixf->sad[PIXEL_8x16]   = pixel_sad_8x16_altivec;
  540.     pixf->sad[PIXEL_16x8]   = pixel_sad_16x8_altivec;
  541.     pixf->sad[PIXEL_8x8]    = pixel_sad_8x8_altivec;
  542.     pixf->satd[PIXEL_16x16] = pixel_satd_16x16_altivec;
  543.     pixf->satd[PIXEL_8x16]  = pixel_satd_8x16_altivec;
  544.     pixf->satd[PIXEL_16x8]  = pixel_satd_16x8_altivec;
  545.     pixf->satd[PIXEL_8x8]   = pixel_satd_8x8_altivec;
  546.     pixf->satd[PIXEL_8x4]   = pixel_satd_8x4_altivec;
  547.     pixf->satd[PIXEL_4x8]   = pixel_satd_4x8_altivec;
  548.     pixf->satd[PIXEL_4x4]   = pixel_satd_4x4_altivec;
  549. }