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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * predict.c: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: predict.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Loren Merritt <lorenm@u.washington.edu>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /* predict4x4 are inspired from ffmpeg h264 decoder */
  25. #include "common.h"
  26. #include "clip1.h"
  27. #ifdef _MSC_VER
  28. #undef HAVE_MMXEXT  /* not finished now */
  29. #endif
  30. #ifdef HAVE_MMXEXT
  31. #   include "i386/predict.h"
  32. #endif
  33. /****************************************************************************
  34.  * 16x16 prediction for intra luma block
  35.  ****************************************************************************/
  36. #define PREDICT_16x16_DC(v) 
  37.     for( i = 0; i < 16; i++ )
  38.     {
  39.         uint32_t *p = (uint32_t*)src;
  40.         *p++ = v;
  41.         *p++ = v;
  42.         *p++ = v;
  43.         *p++ = v;
  44.         src += FDEC_STRIDE;
  45.     }
  46. static void predict_16x16_dc( uint8_t *src )
  47. {
  48.     uint32_t dc = 0;
  49.     int i;
  50.     for( i = 0; i < 16; i++ )
  51.     {
  52.         dc += src[-1 + i * FDEC_STRIDE];
  53.         dc += src[i - FDEC_STRIDE];
  54.     }
  55.     dc = (( dc + 16 ) >> 5) * 0x01010101;
  56.     PREDICT_16x16_DC(dc);
  57. }
  58. static void predict_16x16_dc_left( uint8_t *src )
  59. {
  60.     uint32_t dc = 0;
  61.     int i;
  62.     for( i = 0; i < 16; i++ )
  63.     {
  64.         dc += src[-1 + i * FDEC_STRIDE];
  65.     }
  66.     dc = (( dc + 8 ) >> 4) * 0x01010101;
  67.     PREDICT_16x16_DC(dc);
  68. }
  69. static void predict_16x16_dc_top( uint8_t *src )
  70. {
  71.     uint32_t dc = 0;
  72.     int i;
  73.     for( i = 0; i < 16; i++ )
  74.     {
  75.         dc += src[i - FDEC_STRIDE];
  76.     }
  77.     dc = (( dc + 8 ) >> 4) * 0x01010101;
  78.     PREDICT_16x16_DC(dc);
  79. }
  80. static void predict_16x16_dc_128( uint8_t *src )
  81. {
  82.     int i;
  83.     PREDICT_16x16_DC(0x80808080);
  84. }
  85. static void predict_16x16_h( uint8_t *src )
  86. {
  87.     int i;
  88.     for( i = 0; i < 16; i++ )
  89.     {
  90.         const uint32_t v = 0x01010101 * src[-1];
  91.         uint32_t *p = (uint32_t*)src;
  92.         *p++ = v;
  93.         *p++ = v;
  94.         *p++ = v;
  95.         *p++ = v;
  96.         src += FDEC_STRIDE;
  97.     }
  98. }
  99. static void predict_16x16_v( uint8_t *src )
  100. {
  101.     uint32_t v0 = *(uint32_t*)&src[ 0-FDEC_STRIDE];
  102.     uint32_t v1 = *(uint32_t*)&src[ 4-FDEC_STRIDE];
  103.     uint32_t v2 = *(uint32_t*)&src[ 8-FDEC_STRIDE];
  104.     uint32_t v3 = *(uint32_t*)&src[12-FDEC_STRIDE];
  105.     int i;
  106.     for( i = 0; i < 16; i++ )
  107.     {
  108.         uint32_t *p = (uint32_t*)src;
  109.         *p++ = v0;
  110.         *p++ = v1;
  111.         *p++ = v2;
  112.         *p++ = v3;
  113.         src += FDEC_STRIDE;
  114.     }
  115. }
  116. static void predict_16x16_p( uint8_t *src )
  117. {
  118.     int x, y, i;
  119.     int a, b, c;
  120.     int H = 0;
  121.     int V = 0;
  122.     int i00;
  123.     /* calcule H and V */
  124.     for( i = 0; i <= 7; i++ )
  125.     {
  126.         H += ( i + 1 ) * ( src[ 8 + i - FDEC_STRIDE ] - src[6 -i -FDEC_STRIDE] );
  127.         V += ( i + 1 ) * ( src[-1 + (8+i)*FDEC_STRIDE] - src[-1 + (6-i)*FDEC_STRIDE] );
  128.     }
  129.     a = 16 * ( src[-1 + 15*FDEC_STRIDE] + src[15 - FDEC_STRIDE] );
  130.     b = ( 5 * H + 32 ) >> 6;
  131.     c = ( 5 * V + 32 ) >> 6;
  132.     i00 = a - b * 7 - c * 7 + 16;
  133.     for( y = 0; y < 16; y++ )
  134.     {
  135.         int pix = i00;
  136.         for( x = 0; x < 16; x++ )
  137.         {
  138.             src[x] = x264_clip_uint8( pix>>5 );
  139.             pix += b;
  140.         }
  141.         src += FDEC_STRIDE;
  142.         i00 += c;
  143.     }
  144. }
  145. /****************************************************************************
  146.  * 8x8 prediction for intra chroma block
  147.  ****************************************************************************/
  148. static void predict_8x8c_dc_128( uint8_t *src )
  149. {
  150.     int y;
  151.     for( y = 0; y < 8; y++ )
  152.     {
  153.         uint32_t *p = (uint32_t*)src;
  154.         *p++ = 0x80808080;
  155.         *p++ = 0x80808080;
  156.         src += FDEC_STRIDE;
  157.     }
  158. }
  159. static void predict_8x8c_dc_left( uint8_t *src )
  160. {
  161.     int y;
  162.     uint32_t dc0 = 0, dc1 = 0;
  163.     for( y = 0; y < 4; y++ )
  164.     {
  165.         dc0 += src[y * FDEC_STRIDE     - 1];
  166.         dc1 += src[(y+4) * FDEC_STRIDE - 1];
  167.     }
  168.     dc0 = (( dc0 + 2 ) >> 2)*0x01010101;
  169.     dc1 = (( dc1 + 2 ) >> 2)*0x01010101;
  170.     for( y = 0; y < 4; y++ )
  171.     {
  172.         uint32_t *p = (uint32_t*)src;
  173.         *p++ = dc0;
  174.         *p++ = dc0;
  175.         src += FDEC_STRIDE;
  176.     }
  177.     for( y = 0; y < 4; y++ )
  178.     {
  179.         uint32_t *p = (uint32_t*)src;
  180.         *p++ = dc1;
  181.         *p++ = dc1;
  182.         src += FDEC_STRIDE;
  183.     }
  184. }
  185. static void predict_8x8c_dc_top( uint8_t *src )
  186. {
  187.     int y, x;
  188.     uint32_t dc0 = 0, dc1 = 0;
  189.     for( x = 0; x < 4; x++ )
  190.     {
  191.         dc0 += src[x     - FDEC_STRIDE];
  192.         dc1 += src[x + 4 - FDEC_STRIDE];
  193.     }
  194.     dc0 = (( dc0 + 2 ) >> 2)*0x01010101;
  195.     dc1 = (( dc1 + 2 ) >> 2)*0x01010101;
  196.     for( y = 0; y < 8; y++ )
  197.     {
  198.         uint32_t *p = (uint32_t*)src;
  199.         *p++ = dc0;
  200.         *p++ = dc1;
  201.         src += FDEC_STRIDE;
  202.     }
  203. }
  204. static void predict_8x8c_dc( uint8_t *src )
  205. {
  206.     int y;
  207.     int s0 = 0, s1 = 0, s2 = 0, s3 = 0;
  208.     uint32_t dc0, dc1, dc2, dc3;
  209.     int i;
  210.     /*
  211.           s0 s1
  212.        s2
  213.        s3
  214.     */
  215.     for( i = 0; i < 4; i++ )
  216.     {
  217.         s0 += src[i - FDEC_STRIDE];
  218.         s1 += src[i + 4 - FDEC_STRIDE];
  219.         s2 += src[-1 + i * FDEC_STRIDE];
  220.         s3 += src[-1 + (i+4)*FDEC_STRIDE];
  221.     }
  222.     /*
  223.        dc0 dc1
  224.        dc2 dc3
  225.      */
  226.     dc0 = (( s0 + s2 + 4 ) >> 3)*0x01010101;
  227.     dc1 = (( s1 + 2 ) >> 2)*0x01010101;
  228.     dc2 = (( s3 + 2 ) >> 2)*0x01010101;
  229.     dc3 = (( s1 + s3 + 4 ) >> 3)*0x01010101;
  230.     for( y = 0; y < 4; y++ )
  231.     {
  232.         uint32_t *p = (uint32_t*)src;
  233.         *p++ = dc0;
  234.         *p++ = dc1;
  235.         src += FDEC_STRIDE;
  236.     }
  237.     for( y = 0; y < 4; y++ )
  238.     {
  239.         uint32_t *p = (uint32_t*)src;
  240.         *p++ = dc2;
  241.         *p++ = dc3;
  242.         src += FDEC_STRIDE;
  243.     }
  244. }
  245. static void predict_8x8c_h( uint8_t *src )
  246. {
  247.     int i;
  248.     for( i = 0; i < 8; i++ )
  249.     {
  250.         uint32_t v = 0x01010101 * src[-1];
  251.         uint32_t *p = (uint32_t*)src;
  252.         *p++ = v;
  253.         *p++ = v;
  254.         src += FDEC_STRIDE;
  255.     }
  256. }
  257. static void predict_8x8c_v( uint8_t *src )
  258. {
  259.     uint32_t v0 = *(uint32_t*)&src[0-FDEC_STRIDE];
  260.     uint32_t v1 = *(uint32_t*)&src[4-FDEC_STRIDE];
  261.     int i;
  262.     for( i = 0; i < 8; i++ )
  263.     {
  264.         uint32_t *p = (uint32_t*)src;
  265.         *p++ = v0;
  266.         *p++ = v1;
  267.         src += FDEC_STRIDE;
  268.     }
  269. }
  270. static void predict_8x8c_p( uint8_t *src )
  271. {
  272.     int i;
  273.     int x,y;
  274.     int a, b, c;
  275.     int H = 0;
  276.     int V = 0;
  277.     int i00;
  278.     for( i = 0; i < 4; i++ )
  279.     {
  280.         H += ( i + 1 ) * ( src[4+i - FDEC_STRIDE] - src[2 - i -FDEC_STRIDE] );
  281.         V += ( i + 1 ) * ( src[-1 +(i+4)*FDEC_STRIDE] - src[-1+(2-i)*FDEC_STRIDE] );
  282.     }
  283.     a = 16 * ( src[-1+7*FDEC_STRIDE] + src[7 - FDEC_STRIDE] );
  284.     b = ( 17 * H + 16 ) >> 5;
  285.     c = ( 17 * V + 16 ) >> 5;
  286.     i00 = a -3*b -3*c + 16;
  287.     for( y = 0; y < 8; y++ )
  288.     {
  289.         int pix = i00;
  290.         for( x = 0; x < 8; x++ )
  291.         {
  292.             src[x] = x264_clip_uint8( pix>>5 );
  293.             pix += b;
  294.         }
  295.         src += FDEC_STRIDE;
  296.         i00 += c;
  297.     }
  298. }
  299. /****************************************************************************
  300.  * 4x4 prediction for intra luma block
  301.  ****************************************************************************/
  302. #define PREDICT_4x4_DC(v) 
  303. {
  304.     *(uint32_t*)&src[0*FDEC_STRIDE] =
  305.     *(uint32_t*)&src[1*FDEC_STRIDE] =
  306.     *(uint32_t*)&src[2*FDEC_STRIDE] =
  307.     *(uint32_t*)&src[3*FDEC_STRIDE] = v;
  308. }
  309. static void predict_4x4_dc_128( uint8_t *src )
  310. {
  311.     PREDICT_4x4_DC(0x80808080);
  312. }
  313. static void predict_4x4_dc_left( uint8_t *src )
  314. {
  315.     uint32_t dc = (( src[-1+0*FDEC_STRIDE] + src[-1+FDEC_STRIDE]+
  316.                      src[-1+2*FDEC_STRIDE] + src[-1+3*FDEC_STRIDE] + 2 ) >> 2)*0x01010101;
  317.     PREDICT_4x4_DC(dc);
  318. }
  319. static void predict_4x4_dc_top( uint8_t *src )
  320. {
  321.     uint32_t dc = (( src[0 - FDEC_STRIDE] + src[1 - FDEC_STRIDE] +
  322.                      src[2 - FDEC_STRIDE] + src[3 - FDEC_STRIDE] + 2 ) >> 2)*0x01010101;
  323.     PREDICT_4x4_DC(dc);
  324. }
  325. static void predict_4x4_dc( uint8_t *src )
  326. {
  327.     uint32_t dc = (( src[-1+0*FDEC_STRIDE] + src[-1+FDEC_STRIDE] +
  328.                      src[-1+2*FDEC_STRIDE] + src[-1+3*FDEC_STRIDE] +
  329.                      src[0 - FDEC_STRIDE]  + src[1 - FDEC_STRIDE] +
  330.                      src[2 - FDEC_STRIDE]  + src[3 - FDEC_STRIDE] + 4 ) >> 3)*0x01010101;
  331.     PREDICT_4x4_DC(dc);
  332. }
  333. static void predict_4x4_h( uint8_t *src )
  334. {
  335.     *(uint32_t*)&src[0*FDEC_STRIDE] = src[0*FDEC_STRIDE-1] * 0x01010101;
  336.     *(uint32_t*)&src[1*FDEC_STRIDE] = src[1*FDEC_STRIDE-1] * 0x01010101;
  337.     *(uint32_t*)&src[2*FDEC_STRIDE] = src[2*FDEC_STRIDE-1] * 0x01010101;
  338.     *(uint32_t*)&src[3*FDEC_STRIDE] = src[3*FDEC_STRIDE-1] * 0x01010101;
  339. }
  340. static void predict_4x4_v( uint8_t *src )
  341. {
  342.     uint32_t top = *((uint32_t*)&src[-FDEC_STRIDE]);
  343.     PREDICT_4x4_DC(top);
  344. }
  345. #define PREDICT_4x4_LOAD_LEFT 
  346.     const int l0 = src[-1+0*FDEC_STRIDE];   
  347.     const int l1 = src[-1+1*FDEC_STRIDE];   
  348.     const int l2 = src[-1+2*FDEC_STRIDE];   
  349.     UNUSED const int l3 = src[-1+3*FDEC_STRIDE];
  350. #define PREDICT_4x4_LOAD_TOP 
  351.     const int t0 = src[0-1*FDEC_STRIDE];   
  352.     const int t1 = src[1-1*FDEC_STRIDE];   
  353.     const int t2 = src[2-1*FDEC_STRIDE];   
  354.     UNUSED const int t3 = src[3-1*FDEC_STRIDE];
  355. #define PREDICT_4x4_LOAD_TOP_RIGHT 
  356.     const int t4 = src[4-1*FDEC_STRIDE];   
  357.     const int t5 = src[5-1*FDEC_STRIDE];   
  358.     const int t6 = src[6-1*FDEC_STRIDE];   
  359.     UNUSED const int t7 = src[7-1*FDEC_STRIDE];
  360. static void predict_4x4_ddl( uint8_t *src )
  361. {
  362.     PREDICT_4x4_LOAD_TOP
  363.     PREDICT_4x4_LOAD_TOP_RIGHT
  364.     src[0*FDEC_STRIDE+0] = ( t0 + 2*t1 + t2 + 2 ) >> 2;
  365.     src[0*FDEC_STRIDE+1] =
  366.     src[1*FDEC_STRIDE+0] = ( t1 + 2*t2 + t3 + 2 ) >> 2;
  367.     src[0*FDEC_STRIDE+2] =
  368.     src[1*FDEC_STRIDE+1] =
  369.     src[2*FDEC_STRIDE+0] = ( t2 + 2*t3 + t4 + 2 ) >> 2;
  370.     src[0*FDEC_STRIDE+3] =
  371.     src[1*FDEC_STRIDE+2] =
  372.     src[2*FDEC_STRIDE+1] =
  373.     src[3*FDEC_STRIDE+0] = ( t3 + 2*t4 + t5 + 2 ) >> 2;
  374.     src[1*FDEC_STRIDE+3] =
  375.     src[2*FDEC_STRIDE+2] =
  376.     src[3*FDEC_STRIDE+1] = ( t4 + 2*t5 + t6 + 2 ) >> 2;
  377.     src[2*FDEC_STRIDE+3] =
  378.     src[3*FDEC_STRIDE+2] = ( t5 + 2*t6 + t7 + 2 ) >> 2;
  379.     src[3*FDEC_STRIDE+3] = ( t6 + 3*t7 + 2 ) >> 2;
  380. }
  381. static void predict_4x4_ddr( uint8_t *src )
  382. {
  383.     const int lt = src[-1-FDEC_STRIDE];
  384.     PREDICT_4x4_LOAD_LEFT
  385.     PREDICT_4x4_LOAD_TOP
  386.     src[0*FDEC_STRIDE+0] =
  387.     src[1*FDEC_STRIDE+1] =
  388.     src[2*FDEC_STRIDE+2] =
  389.     src[3*FDEC_STRIDE+3] = ( t0 + 2 * lt + l0 + 2 ) >> 2;
  390.     src[0*FDEC_STRIDE+1] =
  391.     src[1*FDEC_STRIDE+2] =
  392.     src[2*FDEC_STRIDE+3] = ( lt + 2 * t0 + t1 + 2 ) >> 2;
  393.     src[0*FDEC_STRIDE+2] =
  394.     src[1*FDEC_STRIDE+3] = ( t0 + 2 * t1 + t2 + 2 ) >> 2;
  395.     src[0*FDEC_STRIDE+3] = ( t1 + 2 * t2 + t3 + 2 ) >> 2;
  396.     src[1*FDEC_STRIDE+0] =
  397.     src[2*FDEC_STRIDE+1] =
  398.     src[3*FDEC_STRIDE+2] = ( lt + 2 * l0 + l1 + 2 ) >> 2;
  399.     src[2*FDEC_STRIDE+0] =
  400.     src[3*FDEC_STRIDE+1] = ( l0 + 2 * l1 + l2 + 2 ) >> 2;
  401.     src[3*FDEC_STRIDE+0] = ( l1 + 2 * l2 + l3 + 2 ) >> 2;
  402. }
  403. static void predict_4x4_vr( uint8_t *src )
  404. {
  405.     const int lt = src[-1-FDEC_STRIDE];
  406.     PREDICT_4x4_LOAD_LEFT
  407.     PREDICT_4x4_LOAD_TOP
  408.     src[0*FDEC_STRIDE+0]=
  409.     src[2*FDEC_STRIDE+1]= ( lt + t0 + 1 ) >> 1;
  410.     src[0*FDEC_STRIDE+1]=
  411.     src[2*FDEC_STRIDE+2]= ( t0 + t1 + 1 ) >> 1;
  412.     src[0*FDEC_STRIDE+2]=
  413.     src[2*FDEC_STRIDE+3]= ( t1 + t2 + 1 ) >> 1;
  414.     src[0*FDEC_STRIDE+3]= ( t2 + t3 + 1 ) >> 1;
  415.     src[1*FDEC_STRIDE+0]=
  416.     src[3*FDEC_STRIDE+1]= ( l0 + 2 * lt + t0 + 2 ) >> 2;
  417.     src[1*FDEC_STRIDE+1]=
  418.     src[3*FDEC_STRIDE+2]= ( lt + 2 * t0 + t1 + 2 ) >> 2;
  419.     src[1*FDEC_STRIDE+2]=
  420.     src[3*FDEC_STRIDE+3]= ( t0 + 2 * t1 + t2 + 2) >> 2;
  421.     src[1*FDEC_STRIDE+3]= ( t1 + 2 * t2 + t3 + 2 ) >> 2;
  422.     src[2*FDEC_STRIDE+0]= ( lt + 2 * l0 + l1 + 2 ) >> 2;
  423.     src[3*FDEC_STRIDE+0]= ( l0 + 2 * l1 + l2 + 2 ) >> 2;
  424. }
  425. static void predict_4x4_hd( uint8_t *src )
  426. {
  427.     const int lt= src[-1-1*FDEC_STRIDE];
  428.     PREDICT_4x4_LOAD_LEFT
  429.     PREDICT_4x4_LOAD_TOP
  430.     src[0*FDEC_STRIDE+0]=
  431.     src[1*FDEC_STRIDE+2]= ( lt + l0 + 1 ) >> 1;
  432.     src[0*FDEC_STRIDE+1]=
  433.     src[1*FDEC_STRIDE+3]= ( l0 + 2 * lt + t0 + 2 ) >> 2;
  434.     src[0*FDEC_STRIDE+2]= ( lt + 2 * t0 + t1 + 2 ) >> 2;
  435.     src[0*FDEC_STRIDE+3]= ( t0 + 2 * t1 + t2 + 2 ) >> 2;
  436.     src[1*FDEC_STRIDE+0]=
  437.     src[2*FDEC_STRIDE+2]= ( l0 + l1 + 1 ) >> 1;
  438.     src[1*FDEC_STRIDE+1]=
  439.     src[2*FDEC_STRIDE+3]= ( lt + 2 * l0 + l1 + 2 ) >> 2;
  440.     src[2*FDEC_STRIDE+0]=
  441.     src[3*FDEC_STRIDE+2]= ( l1 + l2+ 1 ) >> 1;
  442.     src[2*FDEC_STRIDE+1]=
  443.     src[3*FDEC_STRIDE+3]= ( l0 + 2 * l1 + l2 + 2 ) >> 2;
  444.     src[3*FDEC_STRIDE+0]= ( l2 + l3 + 1 ) >> 1;
  445.     src[3*FDEC_STRIDE+1]= ( l1 + 2 * l2 + l3 + 2 ) >> 2;
  446. }
  447. static void predict_4x4_vl( uint8_t *src )
  448. {
  449.     PREDICT_4x4_LOAD_TOP
  450.     PREDICT_4x4_LOAD_TOP_RIGHT
  451.     src[0*FDEC_STRIDE+0]= ( t0 + t1 + 1 ) >> 1;
  452.     src[0*FDEC_STRIDE+1]=
  453.     src[2*FDEC_STRIDE+0]= ( t1 + t2 + 1 ) >> 1;
  454.     src[0*FDEC_STRIDE+2]=
  455.     src[2*FDEC_STRIDE+1]= ( t2 + t3 + 1 ) >> 1;
  456.     src[0*FDEC_STRIDE+3]=
  457.     src[2*FDEC_STRIDE+2]= ( t3 + t4 + 1 ) >> 1;
  458.     src[2*FDEC_STRIDE+3]= ( t4 + t5 + 1 ) >> 1;
  459.     src[1*FDEC_STRIDE+0]= ( t0 + 2 * t1 + t2 + 2 ) >> 2;
  460.     src[1*FDEC_STRIDE+1]=
  461.     src[3*FDEC_STRIDE+0]= ( t1 + 2 * t2 + t3 + 2 ) >> 2;
  462.     src[1*FDEC_STRIDE+2]=
  463.     src[3*FDEC_STRIDE+1]= ( t2 + 2 * t3 + t4 + 2 ) >> 2;
  464.     src[1*FDEC_STRIDE+3]=
  465.     src[3*FDEC_STRIDE+2]= ( t3 + 2 * t4 + t5 + 2 ) >> 2;
  466.     src[3*FDEC_STRIDE+3]= ( t4 + 2 * t5 + t6 + 2 ) >> 2;
  467. }
  468. static void predict_4x4_hu( uint8_t *src )
  469. {
  470.     PREDICT_4x4_LOAD_LEFT
  471.     src[0*FDEC_STRIDE+0]= ( l0 + l1 + 1 ) >> 1;
  472.     src[0*FDEC_STRIDE+1]= ( l0 + 2 * l1 + l2 + 2 ) >> 2;
  473.     src[0*FDEC_STRIDE+2]=
  474.     src[1*FDEC_STRIDE+0]= ( l1 + l2 + 1 ) >> 1;
  475.     src[0*FDEC_STRIDE+3]=
  476.     src[1*FDEC_STRIDE+1]= ( l1 + 2*l2 + l3 + 2 ) >> 2;
  477.     src[1*FDEC_STRIDE+2]=
  478.     src[2*FDEC_STRIDE+0]= ( l2 + l3 + 1 ) >> 1;
  479.     src[1*FDEC_STRIDE+3]=
  480.     src[2*FDEC_STRIDE+1]= ( l2 + 2 * l3 + l3 + 2 ) >> 2;
  481.     src[2*FDEC_STRIDE+3]=
  482.     src[3*FDEC_STRIDE+1]=
  483.     src[3*FDEC_STRIDE+0]=
  484.     src[2*FDEC_STRIDE+2]=
  485.     src[3*FDEC_STRIDE+2]=
  486.     src[3*FDEC_STRIDE+3]= l3;
  487. }
  488. /****************************************************************************
  489.  * 8x8 prediction for intra luma block
  490.  ****************************************************************************/
  491. #define SRC(x,y) src[(x)+(y)*FDEC_STRIDE]
  492. #define PL(y) 
  493.     const int l##y = (SRC(-1,y-1) + 2*SRC(-1,y) + SRC(-1,y+1) + 2) >> 2;
  494. #define PREDICT_8x8_LOAD_LEFT(have_tl) 
  495.     const int l0 = ((have_tl || (i_neighbor&MB_TOPLEFT) ? SRC(-1,-1) : SRC(-1,0)) 
  496.                      + 2*SRC(-1,0) + SRC(-1,1) + 2) >> 2; 
  497.     PL(1) PL(2) PL(3) PL(4) PL(5) PL(6) 
  498.     UNUSED const int l7 = (SRC(-1,6) + 3*SRC(-1,7) + 2) >> 2;
  499. #define PT(x) 
  500.     const int t##x = (SRC(x-1,-1) + 2*SRC(x,-1) + SRC(x+1,-1) + 2) >> 2;
  501. #define PREDICT_8x8_LOAD_TOP(have_tl) 
  502.     const int t0 = ((have_tl || (i_neighbor&MB_TOPLEFT) ? SRC(-1,-1) : SRC(0,-1)) 
  503.                      + 2*SRC(0,-1) + SRC(1,-1) + 2) >> 2; 
  504.     PT(1) PT(2) PT(3) PT(4) PT(5) PT(6) 
  505.     UNUSED const int t7 = ((i_neighbor&MB_TOPRIGHT ? SRC(8,-1) : SRC(7,-1)) 
  506.                      + 2*SRC(7,-1) + SRC(6,-1) + 2) >> 2; 
  507. #define PTR(x) 
  508.     t##x = (SRC(x-1,-1) + 2*SRC(x,-1) + SRC(x+1,-1) + 2) >> 2;
  509. #define PREDICT_8x8_LOAD_TOPRIGHT 
  510.     int t8, t9, t10, t11, t12, t13, t14, t15; 
  511.     if(i_neighbor&MB_TOPRIGHT) { 
  512.         PTR(8) PTR(9) PTR(10) PTR(11) PTR(12) PTR(13) PTR(14) 
  513.         t15 = (SRC(14,-1) + 3*SRC(15,-1) + 2) >> 2; 
  514.     } else t8=t9=t10=t11=t12=t13=t14=t15= SRC(7,-1);
  515. #define PREDICT_8x8_LOAD_TOPLEFT 
  516.     const int lt = (SRC(-1,0) + 2*SRC(-1,-1) + SRC(0,-1) + 2) >> 2;
  517. #define PREDICT_8x8_DC(v) 
  518.     int y; 
  519.     for( y = 0; y < 8; y++ ) { 
  520.         ((uint32_t*)src)[0] = 
  521.         ((uint32_t*)src)[1] = v; 
  522.         src += FDEC_STRIDE; 
  523.     }
  524. static void predict_8x8_dc_128( uint8_t *src, int i_neighbor )
  525. {
  526.     PREDICT_8x8_DC(0x80808080);
  527. }
  528. static void predict_8x8_dc_left( uint8_t *src, int i_neighbor )
  529. {
  530.     PREDICT_8x8_LOAD_LEFT(0)
  531.     const uint32_t dc = ((l0+l1+l2+l3+l4+l5+l6+l7+4) >> 3) * 0x01010101;
  532.     PREDICT_8x8_DC(dc);
  533. }
  534. static void predict_8x8_dc_top( uint8_t *src, int i_neighbor )
  535. {
  536.     PREDICT_8x8_LOAD_TOP(0)
  537.     const uint32_t dc = ((t0+t1+t2+t3+t4+t5+t6+t7+4) >> 3) * 0x01010101;
  538.     PREDICT_8x8_DC(dc);
  539. }
  540. static void predict_8x8_dc( uint8_t *src, int i_neighbor )
  541. {
  542.     PREDICT_8x8_LOAD_LEFT(0)
  543.     PREDICT_8x8_LOAD_TOP(0)
  544.     const uint32_t dc = ((l0+l1+l2+l3+l4+l5+l6+l7
  545.                          +t0+t1+t2+t3+t4+t5+t6+t7+8) >> 4) * 0x01010101;
  546.     PREDICT_8x8_DC(dc);
  547. }
  548. static void predict_8x8_h( uint8_t *src, int i_neighbor )
  549. {
  550.     PREDICT_8x8_LOAD_LEFT(0)
  551. #define ROW(y) ((uint32_t*)(src+y*FDEC_STRIDE))[0] =
  552.                ((uint32_t*)(src+y*FDEC_STRIDE))[1] = 0x01010101U * l##y
  553.     ROW(0); ROW(1); ROW(2); ROW(3); ROW(4); ROW(5); ROW(6); ROW(7);
  554. #undef ROW
  555. }
  556. static void predict_8x8_v( uint8_t *src, int i_neighbor )
  557. {
  558.     int y;
  559.     PREDICT_8x8_LOAD_TOP(0);
  560.     src[0] = t0;
  561.     src[1] = t1;
  562.     src[2] = t2;
  563.     src[3] = t3;
  564.     src[4] = t4;
  565.     src[5] = t5;
  566.     src[6] = t6;
  567.     src[7] = t7;
  568.     for( y = 1; y < 8; y++ )
  569.         *(uint64_t*)(src+y*FDEC_STRIDE) = *(uint64_t*)src;
  570. }
  571. static void predict_8x8_ddl( uint8_t *src, int i_neighbor )
  572. {
  573.     PREDICT_8x8_LOAD_TOP(0)
  574.     PREDICT_8x8_LOAD_TOPRIGHT
  575.     SRC(0,0)= (t0 + 2*t1 + t2 + 2) >> 2;
  576.     SRC(0,1)=SRC(1,0)= (t1 + 2*t2 + t3 + 2) >> 2;
  577.     SRC(0,2)=SRC(1,1)=SRC(2,0)= (t2 + 2*t3 + t4 + 2) >> 2;
  578.     SRC(0,3)=SRC(1,2)=SRC(2,1)=SRC(3,0)= (t3 + 2*t4 + t5 + 2) >> 2;
  579.     SRC(0,4)=SRC(1,3)=SRC(2,2)=SRC(3,1)=SRC(4,0)= (t4 + 2*t5 + t6 + 2) >> 2;
  580.     SRC(0,5)=SRC(1,4)=SRC(2,3)=SRC(3,2)=SRC(4,1)=SRC(5,0)= (t5 + 2*t6 + t7 + 2) >> 2;
  581.     SRC(0,6)=SRC(1,5)=SRC(2,4)=SRC(3,3)=SRC(4,2)=SRC(5,1)=SRC(6,0)= (t6 + 2*t7 + t8 + 2) >> 2;
  582.     SRC(0,7)=SRC(1,6)=SRC(2,5)=SRC(3,4)=SRC(4,3)=SRC(5,2)=SRC(6,1)=SRC(7,0)= (t7 + 2*t8 + t9 + 2) >> 2;
  583.     SRC(1,7)=SRC(2,6)=SRC(3,5)=SRC(4,4)=SRC(5,3)=SRC(6,2)=SRC(7,1)= (t8 + 2*t9 + t10 + 2) >> 2;
  584.     SRC(2,7)=SRC(3,6)=SRC(4,5)=SRC(5,4)=SRC(6,3)=SRC(7,2)= (t9 + 2*t10 + t11 + 2) >> 2;
  585.     SRC(3,7)=SRC(4,6)=SRC(5,5)=SRC(6,4)=SRC(7,3)= (t10 + 2*t11 + t12 + 2) >> 2;
  586.     SRC(4,7)=SRC(5,6)=SRC(6,5)=SRC(7,4)= (t11 + 2*t12 + t13 + 2) >> 2;
  587.     SRC(5,7)=SRC(6,6)=SRC(7,5)= (t12 + 2*t13 + t14 + 2) >> 2;
  588.     SRC(6,7)=SRC(7,6)= (t13 + 2*t14 + t15 + 2) >> 2;
  589.     SRC(7,7)= (t14 + 3*t15 + 2) >> 2;
  590. }
  591. static void predict_8x8_ddr( uint8_t *src, int i_neighbor )
  592. {
  593.     PREDICT_8x8_LOAD_TOP(1)
  594.     PREDICT_8x8_LOAD_LEFT(1)
  595.     PREDICT_8x8_LOAD_TOPLEFT
  596.     SRC(0,7)= (l7 + 2*l6 + l5 + 2) >> 2;
  597.     SRC(0,6)=SRC(1,7)= (l6 + 2*l5 + l4 + 2) >> 2;
  598.     SRC(0,5)=SRC(1,6)=SRC(2,7)= (l5 + 2*l4 + l3 + 2) >> 2;
  599.     SRC(0,4)=SRC(1,5)=SRC(2,6)=SRC(3,7)= (l4 + 2*l3 + l2 + 2) >> 2;
  600.     SRC(0,3)=SRC(1,4)=SRC(2,5)=SRC(3,6)=SRC(4,7)= (l3 + 2*l2 + l1 + 2) >> 2;
  601.     SRC(0,2)=SRC(1,3)=SRC(2,4)=SRC(3,5)=SRC(4,6)=SRC(5,7)= (l2 + 2*l1 + l0 + 2) >> 2;
  602.     SRC(0,1)=SRC(1,2)=SRC(2,3)=SRC(3,4)=SRC(4,5)=SRC(5,6)=SRC(6,7)= (l1 + 2*l0 + lt + 2) >> 2;
  603.     SRC(0,0)=SRC(1,1)=SRC(2,2)=SRC(3,3)=SRC(4,4)=SRC(5,5)=SRC(6,6)=SRC(7,7)= (l0 + 2*lt + t0 + 2) >> 2;
  604.     SRC(1,0)=SRC(2,1)=SRC(3,2)=SRC(4,3)=SRC(5,4)=SRC(6,5)=SRC(7,6)= (lt + 2*t0 + t1 + 2) >> 2;
  605.     SRC(2,0)=SRC(3,1)=SRC(4,2)=SRC(5,3)=SRC(6,4)=SRC(7,5)= (t0 + 2*t1 + t2 + 2) >> 2;
  606.     SRC(3,0)=SRC(4,1)=SRC(5,2)=SRC(6,3)=SRC(7,4)= (t1 + 2*t2 + t3 + 2) >> 2;
  607.     SRC(4,0)=SRC(5,1)=SRC(6,2)=SRC(7,3)= (t2 + 2*t3 + t4 + 2) >> 2;
  608.     SRC(5,0)=SRC(6,1)=SRC(7,2)= (t3 + 2*t4 + t5 + 2) >> 2;
  609.     SRC(6,0)=SRC(7,1)= (t4 + 2*t5 + t6 + 2) >> 2;
  610.     SRC(7,0)= (t5 + 2*t6 + t7 + 2) >> 2;
  611.   
  612. }
  613. static void predict_8x8_vr( uint8_t *src, int i_neighbor )
  614. {
  615.     PREDICT_8x8_LOAD_TOP(1)
  616.     PREDICT_8x8_LOAD_LEFT(1)
  617.     PREDICT_8x8_LOAD_TOPLEFT
  618.     SRC(0,6)= (l5 + 2*l4 + l3 + 2) >> 2;
  619.     SRC(0,7)= (l6 + 2*l5 + l4 + 2) >> 2;
  620.     SRC(0,4)=SRC(1,6)= (l3 + 2*l2 + l1 + 2) >> 2;
  621.     SRC(0,5)=SRC(1,7)= (l4 + 2*l3 + l2 + 2) >> 2;
  622.     SRC(0,2)=SRC(1,4)=SRC(2,6)= (l1 + 2*l0 + lt + 2) >> 2;
  623.     SRC(0,3)=SRC(1,5)=SRC(2,7)= (l2 + 2*l1 + l0 + 2) >> 2;
  624.     SRC(0,1)=SRC(1,3)=SRC(2,5)=SRC(3,7)= (l0 + 2*lt + t0 + 2) >> 2;
  625.     SRC(0,0)=SRC(1,2)=SRC(2,4)=SRC(3,6)= (lt + t0 + 1) >> 1;
  626.     SRC(1,1)=SRC(2,3)=SRC(3,5)=SRC(4,7)= (lt + 2*t0 + t1 + 2) >> 2;
  627.     SRC(1,0)=SRC(2,2)=SRC(3,4)=SRC(4,6)= (t0 + t1 + 1) >> 1;
  628.     SRC(2,1)=SRC(3,3)=SRC(4,5)=SRC(5,7)= (t0 + 2*t1 + t2 + 2) >> 2;
  629.     SRC(2,0)=SRC(3,2)=SRC(4,4)=SRC(5,6)= (t1 + t2 + 1) >> 1;
  630.     SRC(3,1)=SRC(4,3)=SRC(5,5)=SRC(6,7)= (t1 + 2*t2 + t3 + 2) >> 2;
  631.     SRC(3,0)=SRC(4,2)=SRC(5,4)=SRC(6,6)= (t2 + t3 + 1) >> 1;
  632.     SRC(4,1)=SRC(5,3)=SRC(6,5)=SRC(7,7)= (t2 + 2*t3 + t4 + 2) >> 2;
  633.     SRC(4,0)=SRC(5,2)=SRC(6,4)=SRC(7,6)= (t3 + t4 + 1) >> 1;
  634.     SRC(5,1)=SRC(6,3)=SRC(7,5)= (t3 + 2*t4 + t5 + 2) >> 2;
  635.     SRC(5,0)=SRC(6,2)=SRC(7,4)= (t4 + t5 + 1) >> 1;
  636.     SRC(6,1)=SRC(7,3)= (t4 + 2*t5 + t6 + 2) >> 2;
  637.     SRC(6,0)=SRC(7,2)= (t5 + t6 + 1) >> 1;
  638.     SRC(7,1)= (t5 + 2*t6 + t7 + 2) >> 2;
  639.     SRC(7,0)= (t6 + t7 + 1) >> 1;
  640. }
  641. static void predict_8x8_hd( uint8_t *src, int i_neighbor )
  642. {
  643.     PREDICT_8x8_LOAD_TOP(1)
  644.     PREDICT_8x8_LOAD_LEFT(1)
  645.     PREDICT_8x8_LOAD_TOPLEFT
  646.     SRC(0,7)= (l6 + l7 + 1) >> 1;
  647.     SRC(1,7)= (l5 + 2*l6 + l7 + 2) >> 2;
  648.     SRC(0,6)=SRC(2,7)= (l5 + l6 + 1) >> 1;
  649.     SRC(1,6)=SRC(3,7)= (l4 + 2*l5 + l6 + 2) >> 2;
  650.     SRC(0,5)=SRC(2,6)=SRC(4,7)= (l4 + l5 + 1) >> 1;
  651.     SRC(1,5)=SRC(3,6)=SRC(5,7)= (l3 + 2*l4 + l5 + 2) >> 2;
  652.     SRC(0,4)=SRC(2,5)=SRC(4,6)=SRC(6,7)= (l3 + l4 + 1) >> 1;
  653.     SRC(1,4)=SRC(3,5)=SRC(5,6)=SRC(7,7)= (l2 + 2*l3 + l4 + 2) >> 2;
  654.     SRC(0,3)=SRC(2,4)=SRC(4,5)=SRC(6,6)= (l2 + l3 + 1) >> 1;
  655.     SRC(1,3)=SRC(3,4)=SRC(5,5)=SRC(7,6)= (l1 + 2*l2 + l3 + 2) >> 2;
  656.     SRC(0,2)=SRC(2,3)=SRC(4,4)=SRC(6,5)= (l1 + l2 + 1) >> 1;
  657.     SRC(1,2)=SRC(3,3)=SRC(5,4)=SRC(7,5)= (l0 + 2*l1 + l2 + 2) >> 2;
  658.     SRC(0,1)=SRC(2,2)=SRC(4,3)=SRC(6,4)= (l0 + l1 + 1) >> 1;
  659.     SRC(1,1)=SRC(3,2)=SRC(5,3)=SRC(7,4)= (lt + 2*l0 + l1 + 2) >> 2;
  660.     SRC(0,0)=SRC(2,1)=SRC(4,2)=SRC(6,3)= (lt + l0 + 1) >> 1;
  661.     SRC(1,0)=SRC(3,1)=SRC(5,2)=SRC(7,3)= (l0 + 2*lt + t0 + 2) >> 2;
  662.     SRC(2,0)=SRC(4,1)=SRC(6,2)= (t1 + 2*t0 + lt + 2) >> 2;
  663.     SRC(3,0)=SRC(5,1)=SRC(7,2)= (t2 + 2*t1 + t0 + 2) >> 2;
  664.     SRC(4,0)=SRC(6,1)= (t3 + 2*t2 + t1 + 2) >> 2;
  665.     SRC(5,0)=SRC(7,1)= (t4 + 2*t3 + t2 + 2) >> 2;
  666.     SRC(6,0)= (t5 + 2*t4 + t3 + 2) >> 2;
  667.     SRC(7,0)= (t6 + 2*t5 + t4 + 2) >> 2;
  668. }
  669. static void predict_8x8_vl( uint8_t *src, int i_neighbor )
  670. {
  671.     PREDICT_8x8_LOAD_TOP(0)
  672.     PREDICT_8x8_LOAD_TOPRIGHT
  673.     SRC(0,0)= (t0 + t1 + 1) >> 1;
  674.     SRC(0,1)= (t0 + 2*t1 + t2 + 2) >> 2;
  675.     SRC(0,2)=SRC(1,0)= (t1 + t2 + 1) >> 1;
  676.     SRC(0,3)=SRC(1,1)= (t1 + 2*t2 + t3 + 2) >> 2;
  677.     SRC(0,4)=SRC(1,2)=SRC(2,0)= (t2 + t3 + 1) >> 1;
  678.     SRC(0,5)=SRC(1,3)=SRC(2,1)= (t2 + 2*t3 + t4 + 2) >> 2;
  679.     SRC(0,6)=SRC(1,4)=SRC(2,2)=SRC(3,0)= (t3 + t4 + 1) >> 1;
  680.     SRC(0,7)=SRC(1,5)=SRC(2,3)=SRC(3,1)= (t3 + 2*t4 + t5 + 2) >> 2;
  681.     SRC(1,6)=SRC(2,4)=SRC(3,2)=SRC(4,0)= (t4 + t5 + 1) >> 1;
  682.     SRC(1,7)=SRC(2,5)=SRC(3,3)=SRC(4,1)= (t4 + 2*t5 + t6 + 2) >> 2;
  683.     SRC(2,6)=SRC(3,4)=SRC(4,2)=SRC(5,0)= (t5 + t6 + 1) >> 1;
  684.     SRC(2,7)=SRC(3,5)=SRC(4,3)=SRC(5,1)= (t5 + 2*t6 + t7 + 2) >> 2;
  685.     SRC(3,6)=SRC(4,4)=SRC(5,2)=SRC(6,0)= (t6 + t7 + 1) >> 1;
  686.     SRC(3,7)=SRC(4,5)=SRC(5,3)=SRC(6,1)= (t6 + 2*t7 + t8 + 2) >> 2;
  687.     SRC(4,6)=SRC(5,4)=SRC(6,2)=SRC(7,0)= (t7 + t8 + 1) >> 1;
  688.     SRC(4,7)=SRC(5,5)=SRC(6,3)=SRC(7,1)= (t7 + 2*t8 + t9 + 2) >> 2;
  689.     SRC(5,6)=SRC(6,4)=SRC(7,2)= (t8 + t9 + 1) >> 1;
  690.     SRC(5,7)=SRC(6,5)=SRC(7,3)= (t8 + 2*t9 + t10 + 2) >> 2;
  691.     SRC(6,6)=SRC(7,4)= (t9 + t10 + 1) >> 1;
  692.     SRC(6,7)=SRC(7,5)= (t9 + 2*t10 + t11 + 2) >> 2;
  693.     SRC(7,6)= (t10 + t11 + 1) >> 1;
  694.     SRC(7,7)= (t10 + 2*t11 + t12 + 2) >> 2;
  695. }
  696. static void predict_8x8_hu( uint8_t *src, int i_neighbor )
  697. {
  698.     PREDICT_8x8_LOAD_LEFT(0)
  699.     SRC(0,0)= (l0 + l1 + 1) >> 1;
  700.     SRC(1,0)= (l0 + 2*l1 + l2 + 2) >> 2;
  701.     SRC(0,1)=SRC(2,0)= (l1 + l2 + 1) >> 1;
  702.     SRC(1,1)=SRC(3,0)= (l1 + 2*l2 + l3 + 2) >> 2;
  703.     SRC(0,2)=SRC(2,1)=SRC(4,0)= (l2 + l3 + 1) >> 1;
  704.     SRC(1,2)=SRC(3,1)=SRC(5,0)= (l2 + 2*l3 + l4 + 2) >> 2;
  705.     SRC(0,3)=SRC(2,2)=SRC(4,1)=SRC(6,0)= (l3 + l4 + 1) >> 1;
  706.     SRC(1,3)=SRC(3,2)=SRC(5,1)=SRC(7,0)= (l3 + 2*l4 + l5 + 2) >> 2;
  707.     SRC(0,4)=SRC(2,3)=SRC(4,2)=SRC(6,1)= (l4 + l5 + 1) >> 1;
  708.     SRC(1,4)=SRC(3,3)=SRC(5,2)=SRC(7,1)= (l4 + 2*l5 + l6 + 2) >> 2;
  709.     SRC(0,5)=SRC(2,4)=SRC(4,3)=SRC(6,2)= (l5 + l6 + 1) >> 1;
  710.     SRC(1,5)=SRC(3,4)=SRC(5,3)=SRC(7,2)= (l5 + 2*l6 + l7 + 2) >> 2;
  711.     SRC(0,6)=SRC(2,5)=SRC(4,4)=SRC(6,3)= (l6 + l7 + 1) >> 1;
  712.     SRC(1,6)=SRC(3,5)=SRC(5,4)=SRC(7,3)= (l6 + 3*l7 + 2) >> 2;
  713.     SRC(0,7)=SRC(1,7)=SRC(2,6)=SRC(2,7)=SRC(3,6)=
  714.     SRC(3,7)=SRC(4,5)=SRC(4,6)=SRC(4,7)=SRC(5,5)=
  715.     SRC(5,6)=SRC(5,7)=SRC(6,4)=SRC(6,5)=SRC(6,6)=
  716.     SRC(6,7)=SRC(7,4)=SRC(7,5)=SRC(7,6)=SRC(7,7)= l7;
  717. }
  718. /****************************************************************************
  719.  * Exported functions:
  720.  ****************************************************************************/
  721. void x264_predict_16x16_init( int cpu, x264_predict_t pf[7] )
  722. {
  723.     pf[I_PRED_16x16_V ]     = predict_16x16_v;
  724.     pf[I_PRED_16x16_H ]     = predict_16x16_h;
  725.     pf[I_PRED_16x16_DC]     = predict_16x16_dc;
  726.     pf[I_PRED_16x16_P ]     = predict_16x16_p;
  727.     pf[I_PRED_16x16_DC_LEFT]= predict_16x16_dc_left;
  728.     pf[I_PRED_16x16_DC_TOP ]= predict_16x16_dc_top;
  729.     pf[I_PRED_16x16_DC_128 ]= predict_16x16_dc_128;
  730. #ifdef HAVE_MMXEXT
  731.     if( cpu&X264_CPU_MMXEXT )
  732.     {
  733.         x264_predict_16x16_init_mmxext( pf );
  734.     }
  735. #endif
  736. }
  737. void x264_predict_8x8c_init( int cpu, x264_predict_t pf[7] )
  738. {
  739.     pf[I_PRED_CHROMA_V ]     = predict_8x8c_v;
  740.     pf[I_PRED_CHROMA_H ]     = predict_8x8c_h;
  741.     pf[I_PRED_CHROMA_DC]     = predict_8x8c_dc;
  742.     pf[I_PRED_CHROMA_P ]     = predict_8x8c_p;
  743.     pf[I_PRED_CHROMA_DC_LEFT]= predict_8x8c_dc_left;
  744.     pf[I_PRED_CHROMA_DC_TOP ]= predict_8x8c_dc_top;
  745.     pf[I_PRED_CHROMA_DC_128 ]= predict_8x8c_dc_128;
  746. #ifdef HAVE_MMXEXT
  747.     if( cpu&X264_CPU_MMXEXT )
  748.     {
  749.         x264_predict_8x8c_init_mmxext( pf );
  750.     }
  751. #endif
  752. }
  753. void x264_predict_8x8_init( int cpu, x264_predict8x8_t pf[12] )
  754. {
  755.     pf[I_PRED_8x8_V]      = predict_8x8_v;
  756.     pf[I_PRED_8x8_H]      = predict_8x8_h;
  757.     pf[I_PRED_8x8_DC]     = predict_8x8_dc;
  758.     pf[I_PRED_8x8_DDL]    = predict_8x8_ddl;
  759.     pf[I_PRED_8x8_DDR]    = predict_8x8_ddr;
  760.     pf[I_PRED_8x8_VR]     = predict_8x8_vr;
  761.     pf[I_PRED_8x8_HD]     = predict_8x8_hd;
  762.     pf[I_PRED_8x8_VL]     = predict_8x8_vl;
  763.     pf[I_PRED_8x8_HU]     = predict_8x8_hu;
  764.     pf[I_PRED_8x8_DC_LEFT]= predict_8x8_dc_left;
  765.     pf[I_PRED_8x8_DC_TOP] = predict_8x8_dc_top;
  766.     pf[I_PRED_8x8_DC_128] = predict_8x8_dc_128;
  767. #ifdef HAVE_MMXEXT
  768.     if( cpu&X264_CPU_MMXEXT )
  769.     {
  770.         x264_predict_8x8_init_mmxext( pf );
  771.     }
  772. #endif
  773. #ifdef HAVE_SSE2
  774.     if( cpu&X264_CPU_SSE2 )
  775.     {
  776.         x264_predict_8x8_init_sse2( pf );
  777.     }
  778. #endif
  779. }
  780. void x264_predict_4x4_init( int cpu, x264_predict_t pf[12] )
  781. {
  782.     pf[I_PRED_4x4_V]      = predict_4x4_v;
  783.     pf[I_PRED_4x4_H]      = predict_4x4_h;
  784.     pf[I_PRED_4x4_DC]     = predict_4x4_dc;
  785.     pf[I_PRED_4x4_DDL]    = predict_4x4_ddl;
  786.     pf[I_PRED_4x4_DDR]    = predict_4x4_ddr;
  787.     pf[I_PRED_4x4_VR]     = predict_4x4_vr;
  788.     pf[I_PRED_4x4_HD]     = predict_4x4_hd;
  789.     pf[I_PRED_4x4_VL]     = predict_4x4_vl;
  790.     pf[I_PRED_4x4_HU]     = predict_4x4_hu;
  791.     pf[I_PRED_4x4_DC_LEFT]= predict_4x4_dc_left;
  792.     pf[I_PRED_4x4_DC_TOP] = predict_4x4_dc_top;
  793.     pf[I_PRED_4x4_DC_128] = predict_4x4_dc_128;
  794. #ifdef HAVE_MMXEXT
  795.     if( cpu&X264_CPU_MMXEXT )
  796.     {
  797.         x264_predict_4x4_init_mmxext( pf );
  798.     }
  799. #endif
  800. }