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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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