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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * pixel.c: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2008 x264 project
  5.  *
  6.  * Authors: Loren Merritt <lorenm@u.washington.edu>
  7.  *          Laurent Aimar <fenrir@via.ecp.fr>
  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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include "common.h"
  24. #ifdef HAVE_MMX
  25. #   include "x86/pixel.h"
  26. #endif
  27. #ifdef ARCH_PPC
  28. #   include "ppc/pixel.h"
  29. #endif
  30. #ifdef ARCH_UltraSparc
  31. #   include "sparc/pixel.h"
  32. #endif
  33. /****************************************************************************
  34.  * pixel_sad_WxH
  35.  ****************************************************************************/
  36. #define PIXEL_SAD_C( name, lx, ly ) 
  37. static int name( uint8_t *pix1, int i_stride_pix1,  
  38.                  uint8_t *pix2, int i_stride_pix2 ) 
  39. {                                                   
  40.     int i_sum = 0;                                  
  41.     int x, y;                                       
  42.     for( y = 0; y < ly; y++ )                       
  43.     {                                               
  44.         for( x = 0; x < lx; x++ )                   
  45.         {                                           
  46.             i_sum += abs( pix1[x] - pix2[x] );      
  47.         }                                           
  48.         pix1 += i_stride_pix1;                      
  49.         pix2 += i_stride_pix2;                      
  50.     }                                               
  51.     return i_sum;                                   
  52. }
  53. PIXEL_SAD_C( x264_pixel_sad_16x16, 16, 16 )
  54. PIXEL_SAD_C( x264_pixel_sad_16x8,  16,  8 )
  55. PIXEL_SAD_C( x264_pixel_sad_8x16,   8, 16 )
  56. PIXEL_SAD_C( x264_pixel_sad_8x8,    8,  8 )
  57. PIXEL_SAD_C( x264_pixel_sad_8x4,    8,  4 )
  58. PIXEL_SAD_C( x264_pixel_sad_4x8,    4,  8 )
  59. PIXEL_SAD_C( x264_pixel_sad_4x4,    4,  4 )
  60. /****************************************************************************
  61.  * pixel_ssd_WxH
  62.  ****************************************************************************/
  63. #define PIXEL_SSD_C( name, lx, ly ) 
  64. static int name( uint8_t *pix1, int i_stride_pix1,  
  65.                  uint8_t *pix2, int i_stride_pix2 ) 
  66. {                                                   
  67.     int i_sum = 0;                                  
  68.     int x, y;                                       
  69.     for( y = 0; y < ly; y++ )                       
  70.     {                                               
  71.         for( x = 0; x < lx; x++ )                   
  72.         {                                           
  73.             int d = pix1[x] - pix2[x];              
  74.             i_sum += d*d;                           
  75.         }                                           
  76.         pix1 += i_stride_pix1;                      
  77.         pix2 += i_stride_pix2;                      
  78.     }                                               
  79.     return i_sum;                                   
  80. }
  81. PIXEL_SSD_C( x264_pixel_ssd_16x16, 16, 16 )
  82. PIXEL_SSD_C( x264_pixel_ssd_16x8,  16,  8 )
  83. PIXEL_SSD_C( x264_pixel_ssd_8x16,   8, 16 )
  84. PIXEL_SSD_C( x264_pixel_ssd_8x8,    8,  8 )
  85. PIXEL_SSD_C( x264_pixel_ssd_8x4,    8,  4 )
  86. PIXEL_SSD_C( x264_pixel_ssd_4x8,    4,  8 )
  87. PIXEL_SSD_C( x264_pixel_ssd_4x4,    4,  4 )
  88. int64_t x264_pixel_ssd_wxh( x264_pixel_function_t *pf, uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2, int i_width, int i_height )
  89. {
  90.     int64_t i_ssd = 0;
  91.     int x, y;
  92.     int align = !(((long)pix1 | (long)pix2 | i_pix1 | i_pix2) & 15);
  93. #define SSD(size) i_ssd += pf->ssd[size]( pix1 + y*i_pix1 + x, i_pix1, 
  94.                                           pix2 + y*i_pix2 + x, i_pix2 );
  95.     for( y = 0; y < i_height-15; y += 16 )
  96.     {
  97.         x = 0;
  98.         if( align )
  99.             for( ; x < i_width-15; x += 16 )
  100.                 SSD(PIXEL_16x16);
  101.         for( ; x < i_width-7; x += 8 )
  102.             SSD(PIXEL_8x16);
  103.     }
  104.     if( y < i_height-7 )
  105.         for( x = 0; x < i_width-7; x += 8 )
  106.             SSD(PIXEL_8x8);
  107. #undef SSD
  108. #define SSD1 { int d = pix1[y*i_pix1+x] - pix2[y*i_pix2+x]; i_ssd += d*d; }
  109.     if( i_width % 8 != 0 )
  110.     {
  111.         for( y = 0; y < (i_height & ~7); y++ )
  112.             for( x = i_width & ~7; x < i_width; x++ )
  113.                 SSD1;
  114.     }
  115.     if( i_height % 8 != 0 )
  116.     {
  117.         for( y = i_height & ~7; y < i_height; y++ )
  118.             for( x = 0; x < i_width; x++ )
  119.                 SSD1;
  120.     }
  121. #undef SSD1
  122.     return i_ssd;
  123. }
  124. static inline void pixel_sub_wxh( int16_t *diff, int i_size,
  125.                                   uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  126. {
  127.     int y, x;
  128.     for( y = 0; y < i_size; y++ )
  129.     {
  130.         for( x = 0; x < i_size; x++ )
  131.         {
  132.             diff[x + y*i_size] = pix1[x] - pix2[x];
  133.         }
  134.         pix1 += i_pix1;
  135.         pix2 += i_pix2;
  136.     }
  137. }
  138. /****************************************************************************
  139.  * pixel_var_wxh
  140.  ****************************************************************************/
  141. #define PIXEL_VAR_C( name, w, shift ) 
  142. static int name( uint8_t *pix, int i_stride, uint32_t *sad ) 
  143. {                                             
  144.     uint32_t var = 0, sum = 0, sqr = 0;       
  145.     int x, y;                                 
  146.     for( y = 0; y < w; y++ )                  
  147.     {                                         
  148.         for( x = 0; x < w; x++ )              
  149.         {                                     
  150.             sum += pix[x];                    
  151.             sqr += pix[x] * pix[x];           
  152.         }                                     
  153.         pix += i_stride;                      
  154.     }                                         
  155.     var = sqr - (sum * sum >> shift);         
  156.     *sad = sum;                               
  157.     return var;                               
  158. }
  159. PIXEL_VAR_C( x264_pixel_var_16x16, 16, 8 )
  160. PIXEL_VAR_C( x264_pixel_var_8x8,    8, 6 )
  161. /****************************************************************************
  162.  * pixel_satd_WxH: sum of 4x4 Hadamard transformed differences
  163.  ****************************************************************************/
  164. static int pixel_satd_wxh( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2, int i_width, int i_height )
  165. {
  166.     int16_t tmp[4][4];
  167.     int16_t diff[4][4];
  168.     int x, y;
  169.     int i_satd = 0;
  170.     for( y = 0; y < i_height; y += 4 )
  171.     {
  172.         for( x = 0; x < i_width; x += 4 )
  173.         {
  174.             int d;
  175.             pixel_sub_wxh( (int16_t*)diff, 4, &pix1[x], i_pix1, &pix2[x], i_pix2 );
  176.             for( d = 0; d < 4; d++ )
  177.             {
  178.                 int s01, s23;
  179.                 int d01, d23;
  180.                 s01 = diff[d][0] + diff[d][1]; s23 = diff[d][2] + diff[d][3];
  181.                 d01 = diff[d][0] - diff[d][1]; d23 = diff[d][2] - diff[d][3];
  182.                 tmp[d][0] = s01 + s23;
  183.                 tmp[d][1] = s01 - s23;
  184.                 tmp[d][2] = d01 - d23;
  185.                 tmp[d][3] = d01 + d23;
  186.             }
  187.             for( d = 0; d < 4; d++ )
  188.             {
  189.                 int s01, s23;
  190.                 int d01, d23;
  191.                 s01 = tmp[0][d] + tmp[1][d]; s23 = tmp[2][d] + tmp[3][d];
  192.                 d01 = tmp[0][d] - tmp[1][d]; d23 = tmp[2][d] - tmp[3][d];
  193.                 i_satd += abs( s01 + s23 ) + abs( s01 - s23 ) + abs( d01 - d23 ) + abs( d01 + d23 );
  194.             }
  195.         }
  196.         pix1 += 4 * i_pix1;
  197.         pix2 += 4 * i_pix2;
  198.     }
  199.     return i_satd / 2;
  200. }
  201. #define PIXEL_SATD_C( name, width, height ) 
  202. static int name( uint8_t *pix1, int i_stride_pix1, 
  203.                  uint8_t *pix2, int i_stride_pix2 ) 
  204.     return pixel_satd_wxh( pix1, i_stride_pix1, pix2, i_stride_pix2, width, height ); 
  205. }
  206. PIXEL_SATD_C( x264_pixel_satd_16x16, 16, 16 )
  207. PIXEL_SATD_C( x264_pixel_satd_16x8,  16, 8 )
  208. PIXEL_SATD_C( x264_pixel_satd_8x16,  8, 16 )
  209. PIXEL_SATD_C( x264_pixel_satd_8x8,   8, 8 )
  210. PIXEL_SATD_C( x264_pixel_satd_8x4,   8, 4 )
  211. PIXEL_SATD_C( x264_pixel_satd_4x8,   4, 8 )
  212. PIXEL_SATD_C( x264_pixel_satd_4x4,   4, 4 )
  213. /****************************************************************************
  214.  * pixel_sa8d_WxH: sum of 8x8 Hadamard transformed differences
  215.  ****************************************************************************/
  216. #define SA8D_1D {
  217.     const int a0 = SRC(0) + SRC(4);
  218.     const int a4 = SRC(0) - SRC(4);
  219.     const int a1 = SRC(1) + SRC(5);
  220.     const int a5 = SRC(1) - SRC(5);
  221.     const int a2 = SRC(2) + SRC(6);
  222.     const int a6 = SRC(2) - SRC(6);
  223.     const int a3 = SRC(3) + SRC(7);
  224.     const int a7 = SRC(3) - SRC(7);
  225.     const int b0 = a0 + a2;
  226.     const int b2 = a0 - a2;
  227.     const int b1 = a1 + a3;
  228.     const int b3 = a1 - a3;
  229.     const int b4 = a4 + a6;
  230.     const int b6 = a4 - a6;
  231.     const int b5 = a5 + a7;
  232.     const int b7 = a5 - a7;
  233.     DST(0, b0 + b1);
  234.     DST(1, b0 - b1);
  235.     DST(2, b2 + b3);
  236.     DST(3, b2 - b3);
  237.     DST(4, b4 + b5);
  238.     DST(5, b4 - b5);
  239.     DST(6, b6 + b7);
  240.     DST(7, b6 - b7);
  241. }
  242. static inline int pixel_sa8d_wxh( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2,
  243.                                   int i_width, int i_height )
  244. {
  245.     int16_t diff[8][8];
  246.     int i_satd = 0;
  247.     int x, y;
  248.     for( y = 0; y < i_height; y += 8 )
  249.     {
  250.         for( x = 0; x < i_width; x += 8 )
  251.         {
  252.             int i;
  253.             pixel_sub_wxh( (int16_t*)diff, 8, pix1+x, i_pix1, pix2+x, i_pix2 );
  254. #define SRC(x)     diff[i][x]
  255. #define DST(x,rhs) diff[i][x] = (rhs)
  256.             for( i = 0; i < 8; i++ )
  257.                 SA8D_1D
  258. #undef SRC
  259. #undef DST
  260. #define SRC(x)     diff[x][i]
  261. #define DST(x,rhs) i_satd += abs(rhs)
  262.             for( i = 0; i < 8; i++ )
  263.                 SA8D_1D
  264. #undef SRC
  265. #undef DST
  266.         }
  267.         pix1 += 8 * i_pix1;
  268.         pix2 += 8 * i_pix2;
  269.     }
  270.     return i_satd;
  271. }
  272. #define PIXEL_SA8D_C( width, height ) 
  273. static int x264_pixel_sa8d_##width##x##height( uint8_t *pix1, int i_stride_pix1, 
  274.                                                uint8_t *pix2, int i_stride_pix2 ) 
  275.     return ( pixel_sa8d_wxh( pix1, i_stride_pix1, pix2, i_stride_pix2, width, height ) + 2 ) >> 2; 
  276. }
  277. PIXEL_SA8D_C( 16, 16 )
  278. PIXEL_SA8D_C( 16, 8 )
  279. PIXEL_SA8D_C( 8, 16 )
  280. PIXEL_SA8D_C( 8, 8 )
  281. /****************************************************************************
  282.  * pixel_sad_x4
  283.  ****************************************************************************/
  284. #define SAD_X( size ) 
  285. static void x264_pixel_sad_x3_##size( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  286. {
  287.     scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );
  288.     scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );
  289.     scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );
  290. }
  291. static void x264_pixel_sad_x4_##size( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  292. {
  293.     scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );
  294.     scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );
  295.     scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );
  296.     scores[3] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix3, i_stride );
  297. }
  298. SAD_X( 16x16 )
  299. SAD_X( 16x8 )
  300. SAD_X( 8x16 )
  301. SAD_X( 8x8 )
  302. SAD_X( 8x4 )
  303. SAD_X( 4x8 )
  304. SAD_X( 4x4 )
  305. #ifdef ARCH_UltraSparc
  306. SAD_X( 16x16_vis )
  307. SAD_X( 16x8_vis )
  308. SAD_X( 8x16_vis )
  309. SAD_X( 8x8_vis )
  310. #endif
  311. /****************************************************************************
  312.  * pixel_satd_x4
  313.  * no faster than single satd, but needed for satd to be a drop-in replacement for sad
  314.  ****************************************************************************/
  315. #define SATD_X( size, cpu ) 
  316. static void x264_pixel_satd_x3_##size##cpu( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  317. {
  318.     scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );
  319.     scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );
  320.     scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );
  321. }
  322. static void x264_pixel_satd_x4_##size##cpu( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  323. {
  324.     scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );
  325.     scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );
  326.     scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );
  327.     scores[3] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix3, i_stride );
  328. }
  329. #define SATD_X_DECL5( cpu )
  330. SATD_X( 16x16, cpu )
  331. SATD_X( 16x8, cpu )
  332. SATD_X( 8x16, cpu )
  333. SATD_X( 8x8, cpu )
  334. SATD_X( 8x4, cpu )
  335. #define SATD_X_DECL7( cpu )
  336. SATD_X_DECL5( cpu )
  337. SATD_X( 4x8, cpu )
  338. SATD_X( 4x4, cpu )
  339. SATD_X_DECL7()
  340. #ifdef HAVE_MMX
  341. SATD_X_DECL7( _mmxext )
  342. SATD_X_DECL5( _sse2 )
  343. SATD_X_DECL7( _ssse3 )
  344. SATD_X_DECL5( _ssse3_phadd )
  345. #endif
  346. /****************************************************************************
  347.  * structural similarity metric
  348.  ****************************************************************************/
  349. static void ssim_4x4x2_core( const uint8_t *pix1, int stride1,
  350.                              const uint8_t *pix2, int stride2,
  351.                              int sums[2][4])
  352. {
  353.     int x, y, z;
  354.     for(z=0; z<2; z++)
  355.     {
  356.         uint32_t s1=0, s2=0, ss=0, s12=0;
  357.         for(y=0; y<4; y++)
  358.             for(x=0; x<4; x++)
  359.             {
  360.                 int a = pix1[x+y*stride1];
  361.                 int b = pix2[x+y*stride2];
  362.                 s1  += a;
  363.                 s2  += b;
  364.                 ss  += a*a;
  365.                 ss  += b*b;
  366.                 s12 += a*b;
  367.             }
  368.         sums[z][0] = s1;
  369.         sums[z][1] = s2;
  370.         sums[z][2] = ss;
  371.         sums[z][3] = s12;
  372.         pix1 += 4;
  373.         pix2 += 4;
  374.     }
  375. }
  376. static float ssim_end1( int s1, int s2, int ss, int s12 )
  377. {
  378.     static const int ssim_c1 = (int)(.01*.01*255*255*64 + .5);
  379.     static const int ssim_c2 = (int)(.03*.03*255*255*64*63 + .5);
  380.     int vars = ss*64 - s1*s1 - s2*s2;
  381.     int covar = s12*64 - s1*s2;
  382.     return (float)(2*s1*s2 + ssim_c1) * (float)(2*covar + ssim_c2)
  383.            / ((float)(s1*s1 + s2*s2 + ssim_c1) * (float)(vars + ssim_c2));
  384. }
  385. static float ssim_end4( int sum0[5][4], int sum1[5][4], int width )
  386. {
  387.     int i;
  388.     float ssim = 0.0;
  389.     for( i = 0; i < width; i++ )
  390.         ssim += ssim_end1( sum0[i][0] + sum0[i+1][0] + sum1[i][0] + sum1[i+1][0],
  391.                            sum0[i][1] + sum0[i+1][1] + sum1[i][1] + sum1[i+1][1],
  392.                            sum0[i][2] + sum0[i+1][2] + sum1[i][2] + sum1[i+1][2],
  393.                            sum0[i][3] + sum0[i+1][3] + sum1[i][3] + sum1[i+1][3] );
  394.     return ssim;
  395. }
  396. float x264_pixel_ssim_wxh( x264_pixel_function_t *pf,
  397.                            uint8_t *pix1, int stride1,
  398.                            uint8_t *pix2, int stride2,
  399.                            int width, int height )
  400. {
  401.     int x, y, z;
  402.     float ssim = 0.0;
  403.     int (*sum0)[4] = x264_malloc(4 * (width/4+3) * sizeof(int));
  404.     int (*sum1)[4] = x264_malloc(4 * (width/4+3) * sizeof(int));
  405.     width >>= 2;
  406.     height >>= 2;
  407.     z = 0;
  408.     for( y = 1; y < height; y++ )
  409.     {
  410.         for( ; z <= y; z++ )
  411.         {
  412.             XCHG( void*, sum0, sum1 );
  413.             for( x = 0; x < width; x+=2 )
  414.                 pf->ssim_4x4x2_core( &pix1[4*(x+z*stride1)], stride1, &pix2[4*(x+z*stride2)], stride2, &sum0[x] );
  415.         }
  416.         for( x = 0; x < width-1; x += 4 )
  417.             ssim += pf->ssim_end4( sum0+x, sum1+x, X264_MIN(4,width-x-1) );
  418.     }
  419.     x264_free(sum0);
  420.     x264_free(sum1);
  421.     return ssim;
  422. }
  423. /****************************************************************************
  424.  * successive elimination
  425.  ****************************************************************************/
  426. static int x264_pixel_ads4( int enc_dc[4], uint16_t *sums, int delta,
  427.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  428. {
  429.     int nmv=0, i;
  430.     for( i=0; i<width; i++, sums++ )
  431.     {
  432.         int ads = abs( enc_dc[0] - sums[0] )
  433.                 + abs( enc_dc[1] - sums[8] )
  434.                 + abs( enc_dc[2] - sums[delta] )
  435.                 + abs( enc_dc[3] - sums[delta+8] )
  436.                 + cost_mvx[i];
  437.         if( ads < thresh )
  438.             mvs[nmv++] = i;
  439.     }
  440.     return nmv;
  441. }
  442. static int x264_pixel_ads2( int enc_dc[2], uint16_t *sums, int delta,
  443.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  444. {
  445.     int nmv=0, i;
  446.     for( i=0; i<width; i++, sums++ )
  447.     {
  448.         int ads = abs( enc_dc[0] - sums[0] )
  449.                 + abs( enc_dc[1] - sums[delta] )
  450.                 + cost_mvx[i];
  451.         if( ads < thresh )
  452.             mvs[nmv++] = i;
  453.     }
  454.     return nmv;
  455. }
  456. static int x264_pixel_ads1( int enc_dc[1], uint16_t *sums, int delta,
  457.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  458. {
  459.     int nmv=0, i;
  460.     for( i=0; i<width; i++, sums++ )
  461.     {
  462.         int ads = abs( enc_dc[0] - sums[0] )
  463.                 + cost_mvx[i];
  464.         if( ads < thresh )
  465.             mvs[nmv++] = i;
  466.     }
  467.     return nmv;
  468. }
  469. /****************************************************************************
  470.  * x264_pixel_init:
  471.  ****************************************************************************/
  472. void x264_pixel_init( int cpu, x264_pixel_function_t *pixf )
  473. {
  474.     memset( pixf, 0, sizeof(*pixf) );
  475. #define INIT2_NAME( name1, name2, cpu ) 
  476.     pixf->name1[PIXEL_16x16] = x264_pixel_##name2##_16x16##cpu;
  477.     pixf->name1[PIXEL_16x8]  = x264_pixel_##name2##_16x8##cpu;
  478. #define INIT4_NAME( name1, name2, cpu ) 
  479.     INIT2_NAME( name1, name2, cpu ) 
  480.     pixf->name1[PIXEL_8x16]  = x264_pixel_##name2##_8x16##cpu;
  481.     pixf->name1[PIXEL_8x8]   = x264_pixel_##name2##_8x8##cpu;
  482. #define INIT5_NAME( name1, name2, cpu ) 
  483.     INIT4_NAME( name1, name2, cpu ) 
  484.     pixf->name1[PIXEL_8x4]   = x264_pixel_##name2##_8x4##cpu;
  485. #define INIT7_NAME( name1, name2, cpu ) 
  486.     INIT5_NAME( name1, name2, cpu ) 
  487.     pixf->name1[PIXEL_4x8]   = x264_pixel_##name2##_4x8##cpu;
  488.     pixf->name1[PIXEL_4x4]   = x264_pixel_##name2##_4x4##cpu;
  489. #define INIT2( name, cpu ) INIT2_NAME( name, name, cpu )
  490. #define INIT4( name, cpu ) INIT4_NAME( name, name, cpu )
  491. #define INIT5( name, cpu ) INIT5_NAME( name, name, cpu )
  492. #define INIT7( name, cpu ) INIT7_NAME( name, name, cpu )
  493. #define INIT_ADS( cpu ) 
  494.     pixf->ads[PIXEL_16x16] = x264_pixel_ads4##cpu;
  495.     pixf->ads[PIXEL_16x8] = x264_pixel_ads2##cpu;
  496.     pixf->ads[PIXEL_8x8] = x264_pixel_ads1##cpu;
  497.     INIT7( sad, );
  498.     INIT7_NAME( sad_aligned, sad, );
  499.     INIT7( sad_x3, );
  500.     INIT7( sad_x4, );
  501.     INIT7( ssd, );
  502.     INIT7( satd, );
  503.     INIT7( satd_x3, );
  504.     INIT7( satd_x4, );
  505.     INIT4( sa8d, );
  506.     INIT_ADS( );
  507.     pixf->var[PIXEL_16x16] = x264_pixel_var_16x16;
  508.     pixf->var[PIXEL_8x8]   = x264_pixel_var_8x8;
  509.     pixf->ssim_4x4x2_core = ssim_4x4x2_core;
  510.     pixf->ssim_end4 = ssim_end4;
  511. #ifdef HAVE_MMX
  512.     if( cpu&X264_CPU_MMX )
  513.     {
  514.         INIT7( ssd, _mmx );
  515.     }
  516.     if( cpu&X264_CPU_MMXEXT )
  517.     {
  518.         INIT7( sad, _mmxext );
  519.         INIT7_NAME( sad_aligned, sad, _mmxext );
  520.         INIT7( sad_x3, _mmxext );
  521.         INIT7( sad_x4, _mmxext );
  522.         INIT7( satd, _mmxext );
  523.         INIT7( satd_x3, _mmxext );
  524.         INIT7( satd_x4, _mmxext );
  525.         INIT_ADS( _mmxext );
  526.         pixf->var[PIXEL_16x16] = x264_pixel_var_16x16_mmxext;
  527.         pixf->var[PIXEL_8x8]   = x264_pixel_var_8x8_mmxext;
  528. #ifdef ARCH_X86
  529.         pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_mmxext;
  530.         pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_mmxext;
  531.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_mmxext;
  532.         pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_mmxext;
  533.         if( cpu&X264_CPU_CACHELINE_32 )
  534.         {
  535.             INIT5( sad, _cache32_mmxext );
  536.             INIT4( sad_x3, _cache32_mmxext );
  537.             INIT4( sad_x4, _cache32_mmxext );
  538.         }
  539.         else if( cpu&X264_CPU_CACHELINE_64 )
  540.         {
  541.             INIT5( sad, _cache64_mmxext );
  542.             INIT4( sad_x3, _cache64_mmxext );
  543.             INIT4( sad_x4, _cache64_mmxext );
  544.         }
  545. #else
  546.         if( cpu&X264_CPU_CACHELINE_64 )
  547.         {
  548.             pixf->sad[PIXEL_8x16] = x264_pixel_sad_8x16_cache64_mmxext;
  549.             pixf->sad[PIXEL_8x8]  = x264_pixel_sad_8x8_cache64_mmxext;
  550.             pixf->sad[PIXEL_8x4]  = x264_pixel_sad_8x4_cache64_mmxext;
  551.             pixf->sad_x3[PIXEL_8x16] = x264_pixel_sad_x3_8x16_cache64_mmxext;
  552.             pixf->sad_x3[PIXEL_8x8]  = x264_pixel_sad_x3_8x8_cache64_mmxext;
  553.             pixf->sad_x4[PIXEL_8x16] = x264_pixel_sad_x4_8x16_cache64_mmxext;
  554.             pixf->sad_x4[PIXEL_8x8]  = x264_pixel_sad_x4_8x8_cache64_mmxext;
  555.         }
  556. #endif
  557.         pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16_mmxext;
  558.         pixf->intra_sad_x3_16x16 = x264_intra_sad_x3_16x16_mmxext;
  559.         pixf->intra_satd_x3_8x8c  = x264_intra_satd_x3_8x8c_mmxext;
  560.         pixf->intra_satd_x3_4x4   = x264_intra_satd_x3_4x4_mmxext;
  561.     }
  562.     if( (cpu&X264_CPU_SSE2) && !(cpu&X264_CPU_SSE2_IS_SLOW) )
  563.     {
  564.         INIT2( sad, _sse2 );
  565.         INIT2( sad_x3, _sse2 );
  566.         INIT2( sad_x4, _sse2 );
  567.         INIT_ADS( _sse2 );
  568.         pixf->var[PIXEL_8x8] = x264_pixel_var_8x8_sse2;
  569.         pixf->intra_sad_x3_16x16 = x264_intra_sad_x3_16x16_sse2;
  570. #ifdef ARCH_X86
  571.         if( cpu&X264_CPU_CACHELINE_64 )
  572.         {
  573.             INIT2( sad, _cache64_sse2 );
  574.             INIT2( sad_x3, _cache64_sse2 );
  575.             INIT2( sad_x4, _cache64_sse2 );
  576.         }
  577. #endif
  578.     }
  579.     if( cpu&X264_CPU_SSE2 )
  580.     {
  581.         INIT5( ssd, _sse2 );
  582.         INIT5( satd, _sse2 );
  583.         INIT5( satd_x3, _sse2 );
  584.         INIT5( satd_x4, _sse2 );
  585.         INIT2_NAME( sad_aligned, sad, _sse2_aligned );
  586.         pixf->var[PIXEL_16x16] = x264_pixel_var_16x16_sse2;
  587.         pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_sse2;
  588.         pixf->ssim_end4        = x264_pixel_ssim_end4_sse2;
  589.         pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_sse2;
  590.         pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_sse2;
  591. #ifdef ARCH_X86_64
  592.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_sse2;
  593. #endif
  594.     }
  595.     if( (cpu&X264_CPU_SSE3) && (cpu&X264_CPU_CACHELINE_64) )
  596.     {
  597.         INIT2( sad, _sse3 );
  598.         INIT2( sad_x3, _sse3 );
  599.         INIT2( sad_x4, _sse3 );
  600.     }
  601.     if( cpu&X264_CPU_SSSE3 )
  602.     {
  603.         INIT7( satd, _ssse3 );
  604.         INIT7( satd_x3, _ssse3 );
  605.         INIT7( satd_x4, _ssse3 );
  606.         INIT_ADS( _ssse3 );
  607.         pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16_ssse3;
  608.         pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8_ssse3;
  609.         pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16_ssse3;
  610.         pixf->intra_sad_x3_16x16  = x264_intra_sad_x3_16x16_ssse3;
  611.         pixf->intra_satd_x3_8x8c  = x264_intra_satd_x3_8x8c_ssse3;
  612.         pixf->intra_satd_x3_4x4   = x264_intra_satd_x3_4x4_ssse3;
  613. #ifdef ARCH_X86_64
  614.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_ssse3;
  615. #endif
  616.         if( cpu&X264_CPU_CACHELINE_64 )
  617.         {
  618.             INIT2( sad, _cache64_ssse3 );
  619.             INIT2( sad_x3, _cache64_ssse3 );
  620.             INIT2( sad_x4, _cache64_ssse3 );
  621.         }
  622.         if( cpu&X264_CPU_PHADD_IS_FAST )
  623.         {
  624.             INIT5( satd, _ssse3_phadd );
  625.             INIT5( satd_x3, _ssse3_phadd );
  626.             INIT5( satd_x4, _ssse3_phadd );
  627.         }
  628.     }
  629. #endif //HAVE_MMX
  630. #ifdef ARCH_PPC
  631.     if( cpu&X264_CPU_ALTIVEC )
  632.     {
  633.         x264_pixel_altivec_init( pixf );
  634.     }
  635. #endif
  636. #ifdef ARCH_UltraSparc
  637.     INIT4( sad, _vis );
  638.     INIT4( sad_x3, _vis );
  639.     INIT4( sad_x4, _vis );
  640. #endif
  641.     pixf->ads[PIXEL_8x16] =
  642.     pixf->ads[PIXEL_8x4] =
  643.     pixf->ads[PIXEL_4x8] = pixf->ads[PIXEL_16x8];
  644.     pixf->ads[PIXEL_4x4] = pixf->ads[PIXEL_8x8];
  645. }