pixel.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:30k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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_ARM
  31. #   include "arm/pixel.h"
  32. #endif
  33. #ifdef ARCH_UltraSparc
  34. #   include "sparc/pixel.h"
  35. #endif
  36. /****************************************************************************
  37.  * pixel_sad_WxH
  38.  ****************************************************************************/
  39. #define PIXEL_SAD_C( name, lx, ly ) 
  40. static int name( uint8_t *pix1, int i_stride_pix1,  
  41.                  uint8_t *pix2, int i_stride_pix2 ) 
  42. {                                                   
  43.     int i_sum = 0;                                  
  44.     int x, y;                                       
  45.     for( y = 0; y < ly; y++ )                       
  46.     {                                               
  47.         for( x = 0; x < lx; x++ )                   
  48.         {                                           
  49.             i_sum += abs( pix1[x] - pix2[x] );      
  50.         }                                           
  51.         pix1 += i_stride_pix1;                      
  52.         pix2 += i_stride_pix2;                      
  53.     }                                               
  54.     return i_sum;                                   
  55. }
  56. PIXEL_SAD_C( x264_pixel_sad_16x16, 16, 16 )
  57. PIXEL_SAD_C( x264_pixel_sad_16x8,  16,  8 )
  58. PIXEL_SAD_C( x264_pixel_sad_8x16,   8, 16 )
  59. PIXEL_SAD_C( x264_pixel_sad_8x8,    8,  8 )
  60. PIXEL_SAD_C( x264_pixel_sad_8x4,    8,  4 )
  61. PIXEL_SAD_C( x264_pixel_sad_4x8,    4,  8 )
  62. PIXEL_SAD_C( x264_pixel_sad_4x4,    4,  4 )
  63. /****************************************************************************
  64.  * pixel_ssd_WxH
  65.  ****************************************************************************/
  66. #define PIXEL_SSD_C( name, lx, ly ) 
  67. static int name( uint8_t *pix1, int i_stride_pix1,  
  68.                  uint8_t *pix2, int i_stride_pix2 ) 
  69. {                                                   
  70.     int i_sum = 0;                                  
  71.     int x, y;                                       
  72.     for( y = 0; y < ly; y++ )                       
  73.     {                                               
  74.         for( x = 0; x < lx; x++ )                   
  75.         {                                           
  76.             int d = pix1[x] - pix2[x];              
  77.             i_sum += d*d;                           
  78.         }                                           
  79.         pix1 += i_stride_pix1;                      
  80.         pix2 += i_stride_pix2;                      
  81.     }                                               
  82.     return i_sum;                                   
  83. }
  84. PIXEL_SSD_C( x264_pixel_ssd_16x16, 16, 16 )
  85. PIXEL_SSD_C( x264_pixel_ssd_16x8,  16,  8 )
  86. PIXEL_SSD_C( x264_pixel_ssd_8x16,   8, 16 )
  87. PIXEL_SSD_C( x264_pixel_ssd_8x8,    8,  8 )
  88. PIXEL_SSD_C( x264_pixel_ssd_8x4,    8,  4 )
  89. PIXEL_SSD_C( x264_pixel_ssd_4x8,    4,  8 )
  90. PIXEL_SSD_C( x264_pixel_ssd_4x4,    4,  4 )
  91. 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 )
  92. {
  93.     int64_t i_ssd = 0;
  94.     int x, y;
  95.     int align = !(((intptr_t)pix1 | (intptr_t)pix2 | i_pix1 | i_pix2) & 15);
  96. #define SSD(size) i_ssd += pf->ssd[size]( pix1 + y*i_pix1 + x, i_pix1, 
  97.                                           pix2 + y*i_pix2 + x, i_pix2 );
  98.     for( y = 0; y < i_height-15; y += 16 )
  99.     {
  100.         x = 0;
  101.         if( align )
  102.             for( ; x < i_width-15; x += 16 )
  103.                 SSD(PIXEL_16x16);
  104.         for( ; x < i_width-7; x += 8 )
  105.             SSD(PIXEL_8x16);
  106.     }
  107.     if( y < i_height-7 )
  108.         for( x = 0; x < i_width-7; x += 8 )
  109.             SSD(PIXEL_8x8);
  110. #undef SSD
  111. #define SSD1 { int d = pix1[y*i_pix1+x] - pix2[y*i_pix2+x]; i_ssd += d*d; }
  112.     if( i_width % 8 != 0 )
  113.     {
  114.         for( y = 0; y < (i_height & ~7); y++ )
  115.             for( x = i_width & ~7; x < i_width; x++ )
  116.                 SSD1;
  117.     }
  118.     if( i_height % 8 != 0 )
  119.     {
  120.         for( y = i_height & ~7; y < i_height; y++ )
  121.             for( x = 0; x < i_width; x++ )
  122.                 SSD1;
  123.     }
  124. #undef SSD1
  125.     return i_ssd;
  126. }
  127. /****************************************************************************
  128.  * pixel_var_wxh
  129.  ****************************************************************************/
  130. #define PIXEL_VAR_C( name, w, shift ) 
  131. static int name( uint8_t *pix, int i_stride ) 
  132. {                                             
  133.     uint32_t var = 0, sum = 0, sqr = 0;       
  134.     int x, y;                                 
  135.     for( y = 0; y < w; y++ )                  
  136.     {                                         
  137.         for( x = 0; x < w; x++ )              
  138.         {                                     
  139.             sum += pix[x];                    
  140.             sqr += pix[x] * pix[x];           
  141.         }                                     
  142.         pix += i_stride;                      
  143.     }                                         
  144.     var = sqr - (sum * sum >> shift);         
  145.     return var;                               
  146. }
  147. PIXEL_VAR_C( x264_pixel_var_16x16, 16, 8 )
  148. PIXEL_VAR_C( x264_pixel_var_8x8,    8, 6 )
  149. /****************************************************************************
  150.  * pixel_var2_wxh
  151.  ****************************************************************************/
  152. static int pixel_var2_8x8( uint8_t *pix1, int i_stride1, uint8_t *pix2, int i_stride2, int *ssd )
  153. {
  154.     uint32_t var = 0, sum = 0, sqr = 0;
  155.     int x, y;
  156.     for( y = 0; y < 8; y++ )
  157.     {
  158.         for( x = 0; x < 8; x++ )
  159.         {
  160.             int diff = pix1[x] - pix2[x];
  161.             sum += diff;
  162.             sqr += diff * diff;
  163.         }
  164.         pix1 += i_stride1;
  165.         pix2 += i_stride2;
  166.     }
  167.     sum = abs(sum);
  168.     var = sqr - (sum * sum >> 6);
  169.     *ssd = sqr;
  170.     return var;
  171. }
  172. #define HADAMARD4(d0,d1,d2,d3,s0,s1,s2,s3) {
  173.     int t0 = s0 + s1;
  174.     int t1 = s0 - s1;
  175.     int t2 = s2 + s3;
  176.     int t3 = s2 - s3;
  177.     d0 = t0 + t2;
  178.     d2 = t0 - t2;
  179.     d1 = t1 + t3;
  180.     d3 = t1 - t3;
  181. }
  182. // in: a pseudo-simd number of the form x+(y<<16)
  183. // return: abs(x)+(abs(y)<<16)
  184. static ALWAYS_INLINE uint32_t abs2( uint32_t a )
  185. {
  186.     uint32_t s = ((a>>15)&0x10001)*0xffff;
  187.     return (a+s)^s;
  188. }
  189. /****************************************************************************
  190.  * pixel_satd_WxH: sum of 4x4 Hadamard transformed differences
  191.  ****************************************************************************/
  192. static NOINLINE int x264_pixel_satd_4x4( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  193. {
  194.     uint32_t tmp[4][2];
  195.     uint32_t a0,a1,a2,a3,b0,b1;
  196.     int sum=0, i;
  197.     for( i=0; i<4; i++, pix1+=i_pix1, pix2+=i_pix2 )
  198.     {
  199.         a0 = pix1[0] - pix2[0];
  200.         a1 = pix1[1] - pix2[1];
  201.         b0 = (a0+a1) + ((a0-a1)<<16);
  202.         a2 = pix1[2] - pix2[2];
  203.         a3 = pix1[3] - pix2[3];
  204.         b1 = (a2+a3) + ((a2-a3)<<16);
  205.         tmp[i][0] = b0 + b1;
  206.         tmp[i][1] = b0 - b1;
  207.     }
  208.     for( i=0; i<2; i++ )
  209.     {
  210.         HADAMARD4( a0,a1,a2,a3, tmp[0][i], tmp[1][i], tmp[2][i], tmp[3][i] );
  211.         a0 = abs2(a0) + abs2(a1) + abs2(a2) + abs2(a3);
  212.         sum += ((uint16_t)a0) + (a0>>16);
  213.     }
  214.     return sum >> 1;
  215. }
  216. static NOINLINE int x264_pixel_satd_8x4( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  217. {
  218.     uint32_t tmp[4][4];
  219.     uint32_t a0,a1,a2,a3;
  220.     int sum=0, i;
  221.     for( i=0; i<4; i++, pix1+=i_pix1, pix2+=i_pix2 )
  222.     {
  223.         a0 = (pix1[0] - pix2[0]) + ((pix1[4] - pix2[4]) << 16);
  224.         a1 = (pix1[1] - pix2[1]) + ((pix1[5] - pix2[5]) << 16);
  225.         a2 = (pix1[2] - pix2[2]) + ((pix1[6] - pix2[6]) << 16);
  226.         a3 = (pix1[3] - pix2[3]) + ((pix1[7] - pix2[7]) << 16);
  227.         HADAMARD4( tmp[i][0], tmp[i][1], tmp[i][2], tmp[i][3], a0,a1,a2,a3 );
  228.     }
  229.     for( i=0; i<4; i++ )
  230.     {
  231.         HADAMARD4( a0,a1,a2,a3, tmp[0][i], tmp[1][i], tmp[2][i], tmp[3][i] );
  232.         sum += abs2(a0) + abs2(a1) + abs2(a2) + abs2(a3);
  233.     }
  234.     return (((uint16_t)sum) + ((uint32_t)sum>>16)) >> 1;
  235. }
  236. #define PIXEL_SATD_C( w, h, sub )
  237. static int x264_pixel_satd_##w##x##h( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  238. {
  239.     int sum = sub( pix1, i_pix1, pix2, i_pix2 )
  240.             + sub( pix1+4*i_pix1, i_pix1, pix2+4*i_pix2, i_pix2 );
  241.     if( w==16 )
  242.         sum+= sub( pix1+8, i_pix1, pix2+8, i_pix2 )
  243.             + sub( pix1+8+4*i_pix1, i_pix1, pix2+8+4*i_pix2, i_pix2 );
  244.     if( h==16 )
  245.         sum+= sub( pix1+8*i_pix1, i_pix1, pix2+8*i_pix2, i_pix2 )
  246.             + sub( pix1+12*i_pix1, i_pix1, pix2+12*i_pix2, i_pix2 );
  247.     if( w==16 && h==16 )
  248.         sum+= sub( pix1+8+8*i_pix1, i_pix1, pix2+8+8*i_pix2, i_pix2 )
  249.             + sub( pix1+8+12*i_pix1, i_pix1, pix2+8+12*i_pix2, i_pix2 );
  250.     return sum;
  251. }
  252. PIXEL_SATD_C( 16, 16, x264_pixel_satd_8x4 )
  253. PIXEL_SATD_C( 16, 8,  x264_pixel_satd_8x4 )
  254. PIXEL_SATD_C( 8,  16, x264_pixel_satd_8x4 )
  255. PIXEL_SATD_C( 8,  8,  x264_pixel_satd_8x4 )
  256. PIXEL_SATD_C( 4,  8,  x264_pixel_satd_4x4 )
  257. static NOINLINE int sa8d_8x8( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  258. {
  259.     uint32_t tmp[8][4];
  260.     uint32_t a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3;
  261.     int sum=0, i;
  262.     for( i=0; i<8; i++, pix1+=i_pix1, pix2+=i_pix2 )
  263.     {
  264.         a0 = pix1[0] - pix2[0];
  265.         a1 = pix1[1] - pix2[1];
  266.         b0 = (a0+a1) + ((a0-a1)<<16);
  267.         a2 = pix1[2] - pix2[2];
  268.         a3 = pix1[3] - pix2[3];
  269.         b1 = (a2+a3) + ((a2-a3)<<16);
  270.         a4 = pix1[4] - pix2[4];
  271.         a5 = pix1[5] - pix2[5];
  272.         b2 = (a4+a5) + ((a4-a5)<<16);
  273.         a6 = pix1[6] - pix2[6];
  274.         a7 = pix1[7] - pix2[7];
  275.         b3 = (a6+a7) + ((a6-a7)<<16);
  276.         HADAMARD4( tmp[i][0], tmp[i][1], tmp[i][2], tmp[i][3], b0,b1,b2,b3 );
  277.     }
  278.     for( i=0; i<4; i++ )
  279.     {
  280.         HADAMARD4( a0,a1,a2,a3, tmp[0][i], tmp[1][i], tmp[2][i], tmp[3][i] );
  281.         HADAMARD4( a4,a5,a6,a7, tmp[4][i], tmp[5][i], tmp[6][i], tmp[7][i] );
  282.         b0  = abs2(a0+a4) + abs2(a0-a4);
  283.         b0 += abs2(a1+a5) + abs2(a1-a5);
  284.         b0 += abs2(a2+a6) + abs2(a2-a6);
  285.         b0 += abs2(a3+a7) + abs2(a3-a7);
  286.         sum += (uint16_t)b0 + (b0>>16);
  287.     }
  288.     return sum;
  289. }
  290. static int x264_pixel_sa8d_8x8( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  291. {
  292.     int sum = sa8d_8x8( pix1, i_pix1, pix2, i_pix2 );
  293.     return (sum+2)>>2;
  294. }
  295. static int x264_pixel_sa8d_16x16( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  296. {
  297.     int sum = sa8d_8x8( pix1, i_pix1, pix2, i_pix2 )
  298.             + sa8d_8x8( pix1+8, i_pix1, pix2+8, i_pix2 )
  299.             + sa8d_8x8( pix1+8*i_pix1, i_pix1, pix2+8*i_pix2, i_pix2 )
  300.             + sa8d_8x8( pix1+8+8*i_pix1, i_pix1, pix2+8+8*i_pix2, i_pix2 );
  301.     return (sum+2)>>2;
  302. }
  303. static NOINLINE uint64_t pixel_hadamard_ac( uint8_t *pix, int stride )
  304. {
  305.     uint32_t tmp[32];
  306.     uint32_t a0,a1,a2,a3,dc;
  307.     int sum4=0, sum8=0, i;
  308.     for( i=0; i<8; i++, pix+=stride )
  309.     {
  310.         uint32_t *t = tmp + (i&3) + (i&4)*4;
  311.         a0 = (pix[0]+pix[1]) + ((pix[0]-pix[1])<<16);
  312.         a1 = (pix[2]+pix[3]) + ((pix[2]-pix[3])<<16);
  313.         t[0] = a0 + a1;
  314.         t[4] = a0 - a1;
  315.         a2 = (pix[4]+pix[5]) + ((pix[4]-pix[5])<<16);
  316.         a3 = (pix[6]+pix[7]) + ((pix[6]-pix[7])<<16);
  317.         t[8] = a2 + a3;
  318.         t[12] = a2 - a3;
  319.     }
  320.     for( i=0; i<8; i++ )
  321.     {
  322.         HADAMARD4( a0,a1,a2,a3, tmp[i*4+0], tmp[i*4+1], tmp[i*4+2], tmp[i*4+3] );
  323.         tmp[i*4+0] = a0;
  324.         tmp[i*4+1] = a1;
  325.         tmp[i*4+2] = a2;
  326.         tmp[i*4+3] = a3;
  327.         sum4 += abs2(a0) + abs2(a1) + abs2(a2) + abs2(a3);
  328.     }
  329.     for( i=0; i<8; i++ )
  330.     {
  331.         HADAMARD4( a0,a1,a2,a3, tmp[i], tmp[8+i], tmp[16+i], tmp[24+i] );
  332.         sum8 += abs2(a0) + abs2(a1) + abs2(a2) + abs2(a3);
  333.     }
  334.     dc = (uint16_t)(tmp[0] + tmp[8] + tmp[16] + tmp[24]);
  335.     sum4 = (uint16_t)sum4 + ((uint32_t)sum4>>16) - dc;
  336.     sum8 = (uint16_t)sum8 + ((uint32_t)sum8>>16) - dc;
  337.     return ((uint64_t)sum8<<32) + sum4;
  338. }
  339. #define HADAMARD_AC(w,h) 
  340. static uint64_t x264_pixel_hadamard_ac_##w##x##h( uint8_t *pix, int stride )
  341. {
  342.     uint64_t sum = pixel_hadamard_ac( pix, stride );
  343.     if( w==16 )
  344.         sum += pixel_hadamard_ac( pix+8, stride );
  345.     if( h==16 )
  346.         sum += pixel_hadamard_ac( pix+8*stride, stride );
  347.     if( w==16 && h==16 )
  348.         sum += pixel_hadamard_ac( pix+8*stride+8, stride );
  349.     return ((sum>>34)<<32) + ((uint32_t)sum>>1);
  350. }
  351. HADAMARD_AC( 16, 16 )
  352. HADAMARD_AC( 16, 8 )
  353. HADAMARD_AC( 8, 16 )
  354. HADAMARD_AC( 8, 8 )
  355. /****************************************************************************
  356.  * pixel_sad_x4
  357.  ****************************************************************************/
  358. #define SAD_X( size ) 
  359. 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] )
  360. {
  361.     scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );
  362.     scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );
  363.     scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );
  364. }
  365. 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] )
  366. {
  367.     scores[0] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix0, i_stride );
  368.     scores[1] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix1, i_stride );
  369.     scores[2] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix2, i_stride );
  370.     scores[3] = x264_pixel_sad_##size( fenc, FENC_STRIDE, pix3, i_stride );
  371. }
  372. SAD_X( 16x16 )
  373. SAD_X( 16x8 )
  374. SAD_X( 8x16 )
  375. SAD_X( 8x8 )
  376. SAD_X( 8x4 )
  377. SAD_X( 4x8 )
  378. SAD_X( 4x4 )
  379. #ifdef ARCH_UltraSparc
  380. SAD_X( 16x16_vis )
  381. SAD_X( 16x8_vis )
  382. SAD_X( 8x16_vis )
  383. SAD_X( 8x8_vis )
  384. #endif
  385. /****************************************************************************
  386.  * pixel_satd_x4
  387.  * no faster than single satd, but needed for satd to be a drop-in replacement for sad
  388.  ****************************************************************************/
  389. #define SATD_X( size, cpu ) 
  390. 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] )
  391. {
  392.     scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );
  393.     scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );
  394.     scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );
  395. }
  396. 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] )
  397. {
  398.     scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );
  399.     scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );
  400.     scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );
  401.     scores[3] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix3, i_stride );
  402. }
  403. #define SATD_X_DECL6( cpu )
  404. SATD_X( 16x16, cpu )
  405. SATD_X( 16x8, cpu )
  406. SATD_X( 8x16, cpu )
  407. SATD_X( 8x8, cpu )
  408. SATD_X( 8x4, cpu )
  409. SATD_X( 4x8, cpu )
  410. #define SATD_X_DECL7( cpu )
  411. SATD_X_DECL6( cpu )
  412. SATD_X( 4x4, cpu )
  413. SATD_X_DECL7()
  414. #ifdef HAVE_MMX
  415. SATD_X_DECL7( _mmxext )
  416. SATD_X_DECL6( _sse2 )
  417. SATD_X_DECL7( _ssse3 )
  418. SATD_X_DECL7( _sse4 )
  419. #endif
  420. #ifdef HAVE_ARMV6
  421. SATD_X_DECL7( _neon )
  422. #endif
  423. /****************************************************************************
  424.  * structural similarity metric
  425.  ****************************************************************************/
  426. static void ssim_4x4x2_core( const uint8_t *pix1, int stride1,
  427.                              const uint8_t *pix2, int stride2,
  428.                              int sums[2][4])
  429. {
  430.     int x, y, z;
  431.     for(z=0; z<2; z++)
  432.     {
  433.         uint32_t s1=0, s2=0, ss=0, s12=0;
  434.         for(y=0; y<4; y++)
  435.             for(x=0; x<4; x++)
  436.             {
  437.                 int a = pix1[x+y*stride1];
  438.                 int b = pix2[x+y*stride2];
  439.                 s1  += a;
  440.                 s2  += b;
  441.                 ss  += a*a;
  442.                 ss  += b*b;
  443.                 s12 += a*b;
  444.             }
  445.         sums[z][0] = s1;
  446.         sums[z][1] = s2;
  447.         sums[z][2] = ss;
  448.         sums[z][3] = s12;
  449.         pix1 += 4;
  450.         pix2 += 4;
  451.     }
  452. }
  453. static float ssim_end1( int s1, int s2, int ss, int s12 )
  454. {
  455.     static const int ssim_c1 = (int)(.01*.01*255*255*64 + .5);
  456.     static const int ssim_c2 = (int)(.03*.03*255*255*64*63 + .5);
  457.     int vars = ss*64 - s1*s1 - s2*s2;
  458.     int covar = s12*64 - s1*s2;
  459.     return (float)(2*s1*s2 + ssim_c1) * (float)(2*covar + ssim_c2)
  460.            / ((float)(s1*s1 + s2*s2 + ssim_c1) * (float)(vars + ssim_c2));
  461. }
  462. static float ssim_end4( int sum0[5][4], int sum1[5][4], int width )
  463. {
  464.     int i;
  465.     float ssim = 0.0;
  466.     for( i = 0; i < width; i++ )
  467.         ssim += ssim_end1( sum0[i][0] + sum0[i+1][0] + sum1[i][0] + sum1[i+1][0],
  468.                            sum0[i][1] + sum0[i+1][1] + sum1[i][1] + sum1[i+1][1],
  469.                            sum0[i][2] + sum0[i+1][2] + sum1[i][2] + sum1[i+1][2],
  470.                            sum0[i][3] + sum0[i+1][3] + sum1[i][3] + sum1[i+1][3] );
  471.     return ssim;
  472. }
  473. float x264_pixel_ssim_wxh( x264_pixel_function_t *pf,
  474.                            uint8_t *pix1, int stride1,
  475.                            uint8_t *pix2, int stride2,
  476.                            int width, int height, void *buf )
  477. {
  478.     int x, y, z;
  479.     float ssim = 0.0;
  480.     int (*sum0)[4] = buf;
  481.     int (*sum1)[4] = sum0 + width/4+3;
  482.     width >>= 2;
  483.     height >>= 2;
  484.     z = 0;
  485.     for( y = 1; y < height; y++ )
  486.     {
  487.         for( ; z <= y; z++ )
  488.         {
  489.             XCHG( void*, sum0, sum1 );
  490.             for( x = 0; x < width; x+=2 )
  491.                 pf->ssim_4x4x2_core( &pix1[4*(x+z*stride1)], stride1, &pix2[4*(x+z*stride2)], stride2, &sum0[x] );
  492.         }
  493.         for( x = 0; x < width-1; x += 4 )
  494.             ssim += pf->ssim_end4( sum0+x, sum1+x, X264_MIN(4,width-x-1) );
  495.     }
  496.     return ssim;
  497. }
  498. /****************************************************************************
  499.  * successive elimination
  500.  ****************************************************************************/
  501. static int x264_pixel_ads4( int enc_dc[4], uint16_t *sums, int delta,
  502.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  503. {
  504.     int nmv=0, i;
  505.     for( i=0; i<width; i++, sums++ )
  506.     {
  507.         int ads = abs( enc_dc[0] - sums[0] )
  508.                 + abs( enc_dc[1] - sums[8] )
  509.                 + abs( enc_dc[2] - sums[delta] )
  510.                 + abs( enc_dc[3] - sums[delta+8] )
  511.                 + cost_mvx[i];
  512.         if( ads < thresh )
  513.             mvs[nmv++] = i;
  514.     }
  515.     return nmv;
  516. }
  517. static int x264_pixel_ads2( int enc_dc[2], uint16_t *sums, int delta,
  518.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  519. {
  520.     int nmv=0, i;
  521.     for( i=0; i<width; i++, sums++ )
  522.     {
  523.         int ads = abs( enc_dc[0] - sums[0] )
  524.                 + abs( enc_dc[1] - sums[delta] )
  525.                 + cost_mvx[i];
  526.         if( ads < thresh )
  527.             mvs[nmv++] = i;
  528.     }
  529.     return nmv;
  530. }
  531. static int x264_pixel_ads1( int enc_dc[1], uint16_t *sums, int delta,
  532.                             uint16_t *cost_mvx, int16_t *mvs, int width, int thresh )
  533. {
  534.     int nmv=0, i;
  535.     for( i=0; i<width; i++, sums++ )
  536.     {
  537.         int ads = abs( enc_dc[0] - sums[0] )
  538.                 + cost_mvx[i];
  539.         if( ads < thresh )
  540.             mvs[nmv++] = i;
  541.     }
  542.     return nmv;
  543. }
  544. /****************************************************************************
  545.  * x264_pixel_init:
  546.  ****************************************************************************/
  547. void x264_pixel_init( int cpu, x264_pixel_function_t *pixf )
  548. {
  549.     memset( pixf, 0, sizeof(*pixf) );
  550. #define INIT2_NAME( name1, name2, cpu ) 
  551.     pixf->name1[PIXEL_16x16] = x264_pixel_##name2##_16x16##cpu;
  552.     pixf->name1[PIXEL_16x8]  = x264_pixel_##name2##_16x8##cpu;
  553. #define INIT4_NAME( name1, name2, cpu ) 
  554.     INIT2_NAME( name1, name2, cpu ) 
  555.     pixf->name1[PIXEL_8x16]  = x264_pixel_##name2##_8x16##cpu;
  556.     pixf->name1[PIXEL_8x8]   = x264_pixel_##name2##_8x8##cpu;
  557. #define INIT5_NAME( name1, name2, cpu ) 
  558.     INIT4_NAME( name1, name2, cpu ) 
  559.     pixf->name1[PIXEL_8x4]   = x264_pixel_##name2##_8x4##cpu;
  560. #define INIT6_NAME( name1, name2, cpu ) 
  561.     INIT5_NAME( name1, name2, cpu ) 
  562.     pixf->name1[PIXEL_4x8]   = x264_pixel_##name2##_4x8##cpu;
  563. #define INIT7_NAME( name1, name2, cpu ) 
  564.     INIT6_NAME( name1, name2, cpu ) 
  565.     pixf->name1[PIXEL_4x4]   = x264_pixel_##name2##_4x4##cpu;
  566. #define INIT2( name, cpu ) INIT2_NAME( name, name, cpu )
  567. #define INIT4( name, cpu ) INIT4_NAME( name, name, cpu )
  568. #define INIT5( name, cpu ) INIT5_NAME( name, name, cpu )
  569. #define INIT6( name, cpu ) INIT6_NAME( name, name, cpu )
  570. #define INIT7( name, cpu ) INIT7_NAME( name, name, cpu )
  571. #define INIT_ADS( cpu ) 
  572.     pixf->ads[PIXEL_16x16] = x264_pixel_ads4##cpu;
  573.     pixf->ads[PIXEL_16x8] = x264_pixel_ads2##cpu;
  574.     pixf->ads[PIXEL_8x8] = x264_pixel_ads1##cpu;
  575.     INIT7( sad, );
  576.     INIT7_NAME( sad_aligned, sad, );
  577.     INIT7( sad_x3, );
  578.     INIT7( sad_x4, );
  579.     INIT7( ssd, );
  580.     INIT7( satd, );
  581.     INIT7( satd_x3, );
  582.     INIT7( satd_x4, );
  583.     INIT4( hadamard_ac, );
  584.     INIT_ADS( );
  585.     pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16;
  586.     pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8;
  587.     pixf->var[PIXEL_16x16] = x264_pixel_var_16x16;
  588.     pixf->var[PIXEL_8x8]   = x264_pixel_var_8x8;
  589.     pixf->ssim_4x4x2_core = ssim_4x4x2_core;
  590.     pixf->ssim_end4 = ssim_end4;
  591.     pixf->var2_8x8 = pixel_var2_8x8;
  592. #ifdef HAVE_MMX
  593.     if( cpu&X264_CPU_MMX )
  594.     {
  595.         INIT7( ssd, _mmx );
  596.     }
  597.     if( cpu&X264_CPU_MMXEXT )
  598.     {
  599.         INIT7( sad, _mmxext );
  600.         INIT7_NAME( sad_aligned, sad, _mmxext );
  601.         INIT7( sad_x3, _mmxext );
  602.         INIT7( sad_x4, _mmxext );
  603.         INIT7( satd, _mmxext );
  604.         INIT7( satd_x3, _mmxext );
  605.         INIT7( satd_x4, _mmxext );
  606.         INIT4( hadamard_ac, _mmxext );
  607.         INIT_ADS( _mmxext );
  608.         pixf->var[PIXEL_16x16] = x264_pixel_var_16x16_mmxext;
  609.         pixf->var[PIXEL_8x8]   = x264_pixel_var_8x8_mmxext;
  610. #ifdef ARCH_X86
  611.         pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_mmxext;
  612.         pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_mmxext;
  613.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_mmxext;
  614.         pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_mmxext;
  615.         pixf->var2_8x8 = x264_pixel_var2_8x8_mmxext;
  616.         if( cpu&X264_CPU_CACHELINE_32 )
  617.         {
  618.             INIT5( sad, _cache32_mmxext );
  619.             INIT4( sad_x3, _cache32_mmxext );
  620.             INIT4( sad_x4, _cache32_mmxext );
  621.         }
  622.         else if( cpu&X264_CPU_CACHELINE_64 )
  623.         {
  624.             INIT5( sad, _cache64_mmxext );
  625.             INIT4( sad_x3, _cache64_mmxext );
  626.             INIT4( sad_x4, _cache64_mmxext );
  627.         }
  628. #else
  629.         if( cpu&X264_CPU_CACHELINE_64 )
  630.         {
  631.             pixf->sad[PIXEL_8x16] = x264_pixel_sad_8x16_cache64_mmxext;
  632.             pixf->sad[PIXEL_8x8]  = x264_pixel_sad_8x8_cache64_mmxext;
  633.             pixf->sad[PIXEL_8x4]  = x264_pixel_sad_8x4_cache64_mmxext;
  634.             pixf->sad_x3[PIXEL_8x16] = x264_pixel_sad_x3_8x16_cache64_mmxext;
  635.             pixf->sad_x3[PIXEL_8x8]  = x264_pixel_sad_x3_8x8_cache64_mmxext;
  636.             pixf->sad_x4[PIXEL_8x16] = x264_pixel_sad_x4_8x16_cache64_mmxext;
  637.             pixf->sad_x4[PIXEL_8x8]  = x264_pixel_sad_x4_8x8_cache64_mmxext;
  638.         }
  639. #endif
  640.         pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16_mmxext;
  641.         pixf->intra_sad_x3_16x16  = x264_intra_sad_x3_16x16_mmxext;
  642.         pixf->intra_satd_x3_8x8c  = x264_intra_satd_x3_8x8c_mmxext;
  643.         pixf->intra_sad_x3_8x8c   = x264_intra_sad_x3_8x8c_mmxext;
  644.         pixf->intra_sad_x3_8x8    = x264_intra_sad_x3_8x8_mmxext;
  645.         pixf->intra_satd_x3_4x4   = x264_intra_satd_x3_4x4_mmxext;
  646.         pixf->intra_sad_x3_4x4    = x264_intra_sad_x3_4x4_mmxext;
  647.     }
  648.     if( cpu&X264_CPU_SSE2 )
  649.     {
  650.         INIT5( ssd, _sse2slow );
  651.         INIT2_NAME( sad_aligned, sad, _sse2_aligned );
  652.         pixf->var[PIXEL_16x16] = x264_pixel_var_16x16_sse2;
  653.         pixf->ssim_4x4x2_core  = x264_pixel_ssim_4x4x2_core_sse2;
  654.         pixf->ssim_end4        = x264_pixel_ssim_end4_sse2;
  655.         pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_sse2;
  656.         pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_sse2;
  657. #ifdef ARCH_X86_64
  658.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_sse2;
  659. #endif
  660.         pixf->var2_8x8 = x264_pixel_var2_8x8_sse2;
  661.     }
  662.     if( (cpu&X264_CPU_SSE2) && !(cpu&X264_CPU_SSE2_IS_SLOW) )
  663.     {
  664.         INIT2( sad, _sse2 );
  665.         INIT2( sad_x3, _sse2 );
  666.         INIT2( sad_x4, _sse2 );
  667.         INIT6( satd, _sse2 );
  668.         INIT6( satd_x3, _sse2 );
  669.         INIT6( satd_x4, _sse2 );
  670.         if( !(cpu&X264_CPU_STACK_MOD4) )
  671.         {
  672.             INIT4( hadamard_ac, _sse2 );
  673.         }
  674.         INIT_ADS( _sse2 );
  675.         pixf->var[PIXEL_8x8] = x264_pixel_var_8x8_sse2;
  676.         pixf->intra_sad_x3_16x16 = x264_intra_sad_x3_16x16_sse2;
  677.         if( cpu&X264_CPU_CACHELINE_64 )
  678.         {
  679.             INIT2( ssd, _sse2); /* faster for width 16 on p4 */
  680. #ifdef ARCH_X86
  681.             INIT2( sad, _cache64_sse2 );
  682.             INIT2( sad_x3, _cache64_sse2 );
  683.             INIT2( sad_x4, _cache64_sse2 );
  684. #endif
  685.            if( cpu&X264_CPU_SSE2_IS_FAST )
  686.            {
  687.                pixf->sad_x3[PIXEL_8x16] = x264_pixel_sad_x3_8x16_cache64_sse2;
  688.                pixf->sad_x4[PIXEL_8x16] = x264_pixel_sad_x4_8x16_cache64_sse2;
  689.            }
  690.         }
  691.         if( cpu&X264_CPU_SSE_MISALIGN )
  692.         {
  693.             INIT2( sad_x3, _sse2_misalign );
  694.             INIT2( sad_x4, _sse2_misalign );
  695.         }
  696.     }
  697.     if( cpu&X264_CPU_SSE2_IS_FAST && !(cpu&X264_CPU_CACHELINE_64) )
  698.     {
  699.         pixf->sad_aligned[PIXEL_8x16] = x264_pixel_sad_8x16_sse2;
  700.         pixf->sad[PIXEL_8x16] = x264_pixel_sad_8x16_sse2;
  701.         pixf->sad_x3[PIXEL_8x16] = x264_pixel_sad_x3_8x16_sse2;
  702.         pixf->sad_x3[PIXEL_8x8] = x264_pixel_sad_x3_8x8_sse2;
  703.         pixf->sad_x3[PIXEL_8x4] = x264_pixel_sad_x3_8x4_sse2;
  704.         pixf->sad_x4[PIXEL_8x16] = x264_pixel_sad_x4_8x16_sse2;
  705.         pixf->sad_x4[PIXEL_8x8] = x264_pixel_sad_x4_8x8_sse2;
  706.         pixf->sad_x4[PIXEL_8x4] = x264_pixel_sad_x4_8x4_sse2;
  707.     }
  708.     if( (cpu&X264_CPU_SSE3) && (cpu&X264_CPU_CACHELINE_64) )
  709.     {
  710.         INIT2( sad, _sse3 );
  711.         INIT2( sad_x3, _sse3 );
  712.         INIT2( sad_x4, _sse3 );
  713.     }
  714.     if( cpu&X264_CPU_SSSE3 )
  715.     {
  716.         INIT7( ssd, _ssse3 );
  717.         INIT7( satd, _ssse3 );
  718.         INIT7( satd_x3, _ssse3 );
  719.         INIT7( satd_x4, _ssse3 );
  720.         if( !(cpu&X264_CPU_STACK_MOD4) )
  721.         {
  722.             INIT4( hadamard_ac, _ssse3 );
  723.         }
  724.         INIT_ADS( _ssse3 );
  725.         pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16_ssse3;
  726.         pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8_ssse3;
  727.         pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16_ssse3;
  728.         pixf->intra_sad_x3_16x16  = x264_intra_sad_x3_16x16_ssse3;
  729.         pixf->intra_satd_x3_8x8c  = x264_intra_satd_x3_8x8c_ssse3;
  730.         pixf->intra_sad_x3_8x8c   = x264_intra_sad_x3_8x8c_ssse3;
  731.         pixf->intra_satd_x3_4x4   = x264_intra_satd_x3_4x4_ssse3;
  732. #ifdef ARCH_X86_64
  733.         pixf->intra_sa8d_x3_8x8 = x264_intra_sa8d_x3_8x8_ssse3;
  734. #endif
  735.         pixf->var2_8x8 = x264_pixel_var2_8x8_ssse3;
  736.         if( cpu&X264_CPU_CACHELINE_64 )
  737.         {
  738.             INIT2( sad, _cache64_ssse3 );
  739.             INIT2( sad_x3, _cache64_ssse3 );
  740.             INIT2( sad_x4, _cache64_ssse3 );
  741.         }
  742.         if( !(cpu&X264_CPU_SHUFFLE_IS_FAST) )
  743.         {
  744.             INIT5( ssd, _sse2 ); /* on conroe, sse2 is faster for width8/16 */
  745.         }
  746.     }
  747.     if( cpu&X264_CPU_SSE4 )
  748.     {
  749.         INIT7( satd, _sse4 );
  750.         INIT7( satd_x3, _sse4 );
  751.         INIT7( satd_x4, _sse4 );
  752.         if( !(cpu&X264_CPU_STACK_MOD4) )
  753.         {
  754.             INIT4( hadamard_ac, _sse4 );
  755.         }
  756.         pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16_sse4;
  757.         pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8_sse4;
  758.     }
  759. #endif //HAVE_MMX
  760. #ifdef HAVE_ARMV6
  761.     if( cpu&X264_CPU_ARMV6 )
  762.     {
  763.         pixf->sad[PIXEL_4x8] = x264_pixel_sad_4x8_armv6;
  764.         pixf->sad[PIXEL_4x4] = x264_pixel_sad_4x4_armv6;
  765.         pixf->sad_aligned[PIXEL_4x8] = x264_pixel_sad_4x8_armv6;
  766.         pixf->sad_aligned[PIXEL_4x4] = x264_pixel_sad_4x4_armv6;
  767.     }
  768.     if( cpu&X264_CPU_NEON )
  769.     {
  770.         INIT5( sad, _neon );
  771.         INIT5( sad_aligned, _neon );
  772.         INIT7( sad_x3, _neon );
  773.         INIT7( sad_x4, _neon );
  774.         INIT7( ssd, _neon );
  775.         INIT7( satd, _neon );
  776.         INIT7( satd_x3, _neon );
  777.         INIT7( satd_x4, _neon );
  778.         INIT4( hadamard_ac, _neon );
  779.         pixf->sa8d[PIXEL_8x8]   = x264_pixel_sa8d_8x8_neon;
  780.         pixf->sa8d[PIXEL_16x16] = x264_pixel_sa8d_16x16_neon;
  781.         pixf->var[PIXEL_8x8]    = x264_pixel_var_8x8_neon;
  782.         pixf->var[PIXEL_16x16]  = x264_pixel_var_16x16_neon;
  783.         pixf->var2_8x8          = x264_pixel_var2_8x8_neon;
  784.         pixf->ssim_4x4x2_core   = x264_pixel_ssim_4x4x2_core_neon;
  785.         pixf->ssim_end4         = x264_pixel_ssim_end4_neon;
  786.         if( cpu&X264_CPU_FAST_NEON_MRC )
  787.         {
  788.             pixf->sad[PIXEL_4x8] = x264_pixel_sad_4x8_neon;
  789.             pixf->sad[PIXEL_4x4] = x264_pixel_sad_4x4_neon;
  790.             pixf->sad_aligned[PIXEL_4x8] = x264_pixel_sad_aligned_4x8_neon;
  791.             pixf->sad_aligned[PIXEL_4x4] = x264_pixel_sad_aligned_4x4_neon;
  792.         }
  793.         else    // really just scheduled for dual issue / A8
  794.         {
  795.             INIT5( sad_aligned, _neon_dual );
  796.         }
  797.     }
  798. #endif
  799. #ifdef ARCH_PPC
  800.     if( cpu&X264_CPU_ALTIVEC )
  801.     {
  802.         x264_pixel_altivec_init( pixf );
  803.     }
  804. #endif
  805. #ifdef ARCH_UltraSparc
  806.     INIT4( sad, _vis );
  807.     INIT4( sad_x3, _vis );
  808.     INIT4( sad_x4, _vis );
  809. #endif
  810.     pixf->ads[PIXEL_8x16] =
  811.     pixf->ads[PIXEL_8x4] =
  812.     pixf->ads[PIXEL_4x8] = pixf->ads[PIXEL_16x8];
  813.     pixf->ads[PIXEL_4x4] = pixf->ads[PIXEL_8x8];
  814. }