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

Audio

开发平台:

Visual C++

  1. /*
  2.  * DSP utils
  3.  * Copyright (c) 2000, 2001 Fabrice Bellard.
  4.  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with this library; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  *
  20.  * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at>
  21.  */
  22.  
  23. /**
  24.  * @file dsputil.c
  25.  * DSP utils
  26.  */
  27.  
  28. #include "avcodec.h"
  29. #include "dsputil.h"
  30. #include "mpegvideo.h"
  31. #include "simple_idct.h"
  32. //#include "faandct.h"
  33. uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
  34. uint32_t squareTbl[512];
  35. //AS by ty
  36. const uint8_t ff_h263_loop_filter_strength[32]={
  37. //  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
  38.     0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11,11,12,12,12
  39. };
  40. //AE by ty
  41. const uint8_t ff_zigzag_direct[64] = {
  42.     0,   1,  8, 16,  9,  2,  3, 10,
  43.     17, 24, 32, 25, 18, 11,  4,  5,
  44.     12, 19, 26, 33, 40, 48, 41, 34,
  45.     27, 20, 13,  6,  7, 14, 21, 28,
  46.     35, 42, 49, 56, 57, 50, 43, 36,
  47.     29, 22, 15, 23, 30, 37, 44, 51,
  48.     58, 59, 52, 45, 38, 31, 39, 46,
  49.     53, 60, 61, 54, 47, 55, 62, 63
  50. };
  51. /* Specific zigzag scan for 248 idct. NOTE that unlike the
  52.    specification, we interleave the fields */
  53. const uint8_t ff_zigzag248_direct[64] = {
  54.      0,  8,  1,  9, 16, 24,  2, 10,
  55.     17, 25, 32, 40, 48, 56, 33, 41,
  56.     18, 26,  3, 11,  4, 12, 19, 27,
  57.     34, 42, 49, 57, 50, 58, 35, 43,
  58.     20, 28,  5, 13,  6, 14, 21, 29,
  59.     36, 44, 51, 59, 52, 60, 37, 45,
  60.     22, 30,  7, 15, 23, 31, 38, 46,
  61.     53, 61, 54, 62, 39, 47, 55, 63,
  62. };
  63. /* not permutated inverse zigzag_direct + 1 for MMX quantizer */
  64. uint16_t __align8 inv_zigzag_direct16[64];
  65. const uint8_t ff_alternate_horizontal_scan[64] = {
  66.     0,  1,   2,  3,  8,  9, 16, 17, 
  67.     10, 11,  4,  5,  6,  7, 15, 14,
  68.     13, 12, 19, 18, 24, 25, 32, 33, 
  69.     26, 27, 20, 21, 22, 23, 28, 29,
  70.     30, 31, 34, 35, 40, 41, 48, 49, 
  71.     42, 43, 36, 37, 38, 39, 44, 45,
  72.     46, 47, 50, 51, 56, 57, 58, 59, 
  73.     52, 53, 54, 55, 60, 61, 62, 63,
  74. };
  75. const uint8_t ff_alternate_vertical_scan[64] = {
  76.     0,  8,  16, 24,  1,  9,  2, 10, 
  77.     17, 25, 32, 40, 48, 56, 57, 49,
  78.     41, 33, 26, 18,  3, 11,  4, 12, 
  79.     19, 27, 34, 42, 50, 58, 35, 43,
  80.     51, 59, 20, 28,  5, 13,  6, 14, 
  81.     21, 29, 36, 44, 52, 60, 37, 45,
  82.     53, 61, 22, 30,  7, 15, 23, 31, 
  83.     38, 46, 54, 62, 39, 47, 55, 63,
  84. };
  85. /* a*inverse[b]>>32 == a/b for all 0<=a<=65536 && 2<=b<=255 */
  86. const uint32_t inverse[256]={
  87.          0, 4294967295U,2147483648U,1431655766, 1073741824,  858993460,  715827883,  613566757, 
  88.  536870912,  477218589,  429496730,  390451573,  357913942,  330382100,  306783379,  286331154, 
  89.  268435456,  252645136,  238609295,  226050911,  214748365,  204522253,  195225787,  186737709, 
  90.  178956971,  171798692,  165191050,  159072863,  153391690,  148102321,  143165577,  138547333, 
  91.  134217728,  130150525,  126322568,  122713352,  119304648,  116080198,  113025456,  110127367, 
  92.  107374183,  104755300,  102261127,   99882961,   97612894,   95443718,   93368855,   91382283, 
  93.   89478486,   87652394,   85899346,   84215046,   82595525,   81037119,   79536432,   78090315, 
  94.   76695845,   75350304,   74051161,   72796056,   71582789,   70409300,   69273667,   68174085, 
  95.   67108864,   66076420,   65075263,   64103990,   63161284,   62245903,   61356676,   60492498, 
  96.   59652324,   58835169,   58040099,   57266231,   56512728,   55778797,   55063684,   54366675, 
  97.   53687092,   53024288,   52377650,   51746594,   51130564,   50529028,   49941481,   49367441, 
  98.   48806447,   48258060,   47721859,   47197443,   46684428,   46182445,   45691142,   45210183, 
  99.   44739243,   44278014,   43826197,   43383509,   42949673,   42524429,   42107523,   41698712, 
  100.   41297763,   40904451,   40518560,   40139882,   39768216,   39403370,   39045158,   38693400, 
  101.   38347923,   38008561,   37675152,   37347542,   37025581,   36709123,   36398028,   36092163, 
  102.   35791395,   35495598,   35204650,   34918434,   34636834,   34359739,   34087043,   33818641, 
  103.   33554432,   33294321,   33038210,   32786010,   32537632,   32292988,   32051995,   31814573, 
  104.   31580642,   31350127,   31122952,   30899046,   30678338,   30460761,   30246249,   30034737, 
  105.   29826162,   29620465,   29417585,   29217465,   29020050,   28825284,   28633116,   28443493, 
  106.   28256364,   28071682,   27889399,   27709467,   27531842,   27356480,   27183338,   27012373, 
  107.   26843546,   26676816,   26512144,   26349493,   26188825,   26030105,   25873297,   25718368, 
  108.   25565282,   25414008,   25264514,   25116768,   24970741,   24826401,   24683721,   24542671, 
  109.   24403224,   24265352,   24129030,   23994231,   23860930,   23729102,   23598722,   23469767, 
  110.   23342214,   23216040,   23091223,   22967740,   22845571,   22724695,   22605092,   22486740, 
  111.   22369622,   22253717,   22139007,   22025474,   21913099,   21801865,   21691755,   21582751, 
  112.   21474837,   21367997,   21262215,   21157475,   21053762,   20951060,   20849356,   20748635, 
  113.   20648882,   20550083,   20452226,   20355296,   20259280,   20164166,   20069941,   19976593, 
  114.   19884108,   19792477,   19701685,   19611723,   19522579,   19434242,   19346700,   19259944, 
  115.   19173962,   19088744,   19004281,   18920561,   18837576,   18755316,   18673771,   18592933, 
  116.   18512791,   18433337,   18354562,   18276457,   18199014,   18122225,   18046082,   17970575, 
  117.   17895698,   17821442,   17747799,   17674763,   17602325,   17530479,   17459217,   17388532, 
  118.   17318417,   17248865,   17179870,   17111424,   17043522,   16976156,   16909321,   16843010,
  119. };
  120. /* Input permutation for the simple_idct_mmx */
  121. static const uint8_t simple_mmx_permutation[64]={
  122. 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, 
  123. 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, 
  124. 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, 
  125. 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, 
  126. 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, 
  127. 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, 
  128. 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, 
  129. 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
  130. };
  131. static int pix_sum_c(uint8_t * pix, int line_size)
  132. {
  133.     int s, i, j;
  134.     s = 0;
  135.     for (i = 0; i < 16; i++) {
  136. for (j = 0; j < 16; j += 8) {
  137.     s += pix[0];
  138.     s += pix[1];
  139.     s += pix[2];
  140.     s += pix[3];
  141.     s += pix[4];
  142.     s += pix[5];
  143.     s += pix[6];
  144.     s += pix[7];
  145.     pix += 8;
  146. }
  147. pix += line_size - 16;
  148.     }
  149.     return s;
  150. }
  151. static int pix_norm1_c(uint8_t * pix, int line_size)
  152. {
  153.     int s, i, j;
  154.     uint32_t *sq = squareTbl + 256;
  155.     s = 0;
  156.     for (i = 0; i < 16; i++) {
  157. for (j = 0; j < 16; j += 8) {
  158. #if 0
  159.     s += sq[pix[0]];
  160.     s += sq[pix[1]];
  161.     s += sq[pix[2]];
  162.     s += sq[pix[3]];
  163.     s += sq[pix[4]];
  164.     s += sq[pix[5]];
  165.     s += sq[pix[6]];
  166.     s += sq[pix[7]];
  167. #else
  168. #if LONG_MAX > 2147483647
  169.     register uint64_t x=*(uint64_t*)pix;
  170.     s += sq[x&0xff];
  171.     s += sq[(x>>8)&0xff];
  172.     s += sq[(x>>16)&0xff];
  173.     s += sq[(x>>24)&0xff];
  174.             s += sq[(x>>32)&0xff];
  175.             s += sq[(x>>40)&0xff];
  176.             s += sq[(x>>48)&0xff];
  177.             s += sq[(x>>56)&0xff];
  178. #else
  179.     register uint32_t x=*(uint32_t*)pix;
  180.     s += sq[x&0xff];
  181.     s += sq[(x>>8)&0xff];
  182.     s += sq[(x>>16)&0xff];
  183.     s += sq[(x>>24)&0xff];
  184.             x=*(uint32_t*)(pix+4);
  185.             s += sq[x&0xff];
  186.             s += sq[(x>>8)&0xff];
  187.             s += sq[(x>>16)&0xff];
  188.             s += sq[(x>>24)&0xff];
  189. #endif
  190. #endif
  191.     pix += 8;
  192. }
  193. pix += line_size - 16;
  194.     }
  195.     return s;
  196. }
  197. static void bswap_buf(uint32_t *dst, uint32_t *src, int w){
  198.     int i;
  199.     
  200.     for(i=0; i+8<=w; i+=8){
  201.         dst[i+0]= bswap_32(src[i+0]);
  202.         dst[i+1]= bswap_32(src[i+1]);
  203.         dst[i+2]= bswap_32(src[i+2]);
  204.         dst[i+3]= bswap_32(src[i+3]);
  205.         dst[i+4]= bswap_32(src[i+4]);
  206.         dst[i+5]= bswap_32(src[i+5]);
  207.         dst[i+6]= bswap_32(src[i+6]);
  208.         dst[i+7]= bswap_32(src[i+7]);
  209.     }
  210.     for(;i<w; i++){
  211.         dst[i+0]= bswap_32(src[i+0]);
  212.     }
  213. }
  214. static int sse8_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h)
  215. {
  216.     int s, i;
  217.     uint32_t *sq = squareTbl + 256;
  218.     s = 0;
  219.     for (i = 0; i < h; i++) {
  220.         s += sq[pix1[0] - pix2[0]];
  221.         s += sq[pix1[1] - pix2[1]];
  222.         s += sq[pix1[2] - pix2[2]];
  223.         s += sq[pix1[3] - pix2[3]];
  224.         s += sq[pix1[4] - pix2[4]];
  225.         s += sq[pix1[5] - pix2[5]];
  226.         s += sq[pix1[6] - pix2[6]];
  227.         s += sq[pix1[7] - pix2[7]];
  228.         pix1 += line_size;
  229.         pix2 += line_size;
  230.     }
  231.     return s;
  232. }
  233. static int sse16_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  234. {
  235.     int s, i;
  236.     uint32_t *sq = squareTbl + 256;
  237.     s = 0;
  238.     for (i = 0; i < h; i++) {
  239.         s += sq[pix1[ 0] - pix2[ 0]];
  240.         s += sq[pix1[ 1] - pix2[ 1]];
  241.         s += sq[pix1[ 2] - pix2[ 2]];
  242.         s += sq[pix1[ 3] - pix2[ 3]];
  243.         s += sq[pix1[ 4] - pix2[ 4]];
  244.         s += sq[pix1[ 5] - pix2[ 5]];
  245.         s += sq[pix1[ 6] - pix2[ 6]];
  246.         s += sq[pix1[ 7] - pix2[ 7]];
  247.         s += sq[pix1[ 8] - pix2[ 8]];
  248.         s += sq[pix1[ 9] - pix2[ 9]];
  249.         s += sq[pix1[10] - pix2[10]];
  250.         s += sq[pix1[11] - pix2[11]];
  251.         s += sq[pix1[12] - pix2[12]];
  252.         s += sq[pix1[13] - pix2[13]];
  253.         s += sq[pix1[14] - pix2[14]];
  254.         s += sq[pix1[15] - pix2[15]];
  255.         pix1 += line_size;
  256.         pix2 += line_size;
  257.     }
  258.     return s;
  259. }
  260. static void get_pixels_c(DCTELEM *restrict block, const uint8_t *pixels, int line_size)
  261. {
  262.     int i;
  263.     /* read the pixels */
  264.     for(i=0;i<8;i++) {
  265.         block[0] = pixels[0];
  266.         block[1] = pixels[1];
  267.         block[2] = pixels[2];
  268.         block[3] = pixels[3];
  269.         block[4] = pixels[4];
  270.         block[5] = pixels[5];
  271.         block[6] = pixels[6];
  272.         block[7] = pixels[7];
  273.         pixels += line_size;
  274.         block += 8;
  275.     }
  276. }
  277. static void diff_pixels_c(DCTELEM *restrict block, const uint8_t *s1,
  278.   const uint8_t *s2, int stride){
  279.     int i;
  280.     /* read the pixels */
  281.     for(i=0;i<8;i++) {
  282.         block[0] = s1[0] - s2[0];
  283.         block[1] = s1[1] - s2[1];
  284.         block[2] = s1[2] - s2[2];
  285.         block[3] = s1[3] - s2[3];
  286.         block[4] = s1[4] - s2[4];
  287.         block[5] = s1[5] - s2[5];
  288.         block[6] = s1[6] - s2[6];
  289.         block[7] = s1[7] - s2[7];
  290.         s1 += stride;
  291.         s2 += stride;
  292.         block += 8;
  293.     }
  294. }
  295. static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
  296.  int line_size)
  297. {
  298.     int i;
  299.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  300.     
  301.     /* read the pixels */
  302.     for(i=0;i<8;i++) {
  303.         pixels[0] = cm[block[0]];
  304.         pixels[1] = cm[block[1]];
  305.         pixels[2] = cm[block[2]];
  306.         pixels[3] = cm[block[3]];
  307.         pixels[4] = cm[block[4]];
  308.         pixels[5] = cm[block[5]];
  309.         pixels[6] = cm[block[6]];
  310.         pixels[7] = cm[block[7]];
  311.         pixels += line_size;
  312.         block += 8;
  313.     }
  314. }
  315. static void put_signed_pixels_clamped_c(const DCTELEM *block, 
  316.                                         uint8_t *restrict pixels,
  317.                                         int line_size)
  318. {
  319.     int i, j;
  320.     for (i = 0; i < 8; i++) {
  321.         for (j = 0; j < 8; j++) {
  322.             if (*block < -128)
  323.                 *pixels = 0;
  324.             else if (*block > 127)
  325.                 *pixels = 255;
  326.             else
  327.                 *pixels = (uint8_t)(*block + 128);
  328.             block++;
  329.             pixels++;
  330.         }
  331.         pixels += (line_size - 8);
  332.     }
  333. }
  334. static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
  335.                           int line_size)
  336. {
  337.     int i;
  338.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  339.     
  340.     /* read the pixels */
  341.     for(i=0;i<8;i++) {
  342.         pixels[0] = cm[pixels[0] + block[0]];
  343.         pixels[1] = cm[pixels[1] + block[1]];
  344.         pixels[2] = cm[pixels[2] + block[2]];
  345.         pixels[3] = cm[pixels[3] + block[3]];
  346.         pixels[4] = cm[pixels[4] + block[4]];
  347.         pixels[5] = cm[pixels[5] + block[5]];
  348.         pixels[6] = cm[pixels[6] + block[6]];
  349.         pixels[7] = cm[pixels[7] + block[7]];
  350.         pixels += line_size;
  351.         block += 8;
  352.     }
  353. }
  354. #if 0
  355. #define PIXOP2(OPNAME, OP) 
  356. static void OPNAME ## _pixels(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  357. {
  358.     int i;
  359.     for(i=0; i<h; i++){
  360.         OP(*((uint64_t*)block), LD64(pixels));
  361.         pixels+=line_size;
  362.         block +=line_size;
  363.     }
  364. }
  365. static void OPNAME ## _no_rnd_pixels_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  366. {
  367.     int i;
  368.     for(i=0; i<h; i++){
  369.         const uint64_t a= LD64(pixels  );
  370.         const uint64_t b= LD64(pixels+1);
  371.         OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));
  372.         pixels+=line_size;
  373.         block +=line_size;
  374.     }
  375. }
  376. static void OPNAME ## _pixels_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  377. {
  378.     int i;
  379.     for(i=0; i<h; i++){
  380.         const uint64_t a= LD64(pixels  );
  381.         const uint64_t b= LD64(pixels+1);
  382.         OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));
  383.         pixels+=line_size;
  384.         block +=line_size;
  385.     }
  386. }
  387. static void OPNAME ## _no_rnd_pixels_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  388. {
  389.     int i;
  390.     for(i=0; i<h; i++){
  391.         const uint64_t a= LD64(pixels          );
  392.         const uint64_t b= LD64(pixels+line_size);
  393.         OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));
  394.         pixels+=line_size;
  395.         block +=line_size;
  396.     }
  397. }
  398. static void OPNAME ## _pixels_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  399. {
  400.     int i;
  401.     for(i=0; i<h; i++){
  402.         const uint64_t a= LD64(pixels          );
  403.         const uint64_t b= LD64(pixels+line_size);
  404.         OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));
  405.         pixels+=line_size;
  406.         block +=line_size;
  407.     }
  408. }
  409. static void OPNAME ## _pixels_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  410. {
  411.         int i;
  412.         const uint64_t a= LD64(pixels  );
  413.         const uint64_t b= LD64(pixels+1);
  414.         uint64_t l0=  (a&0x0303030303030303ULL)
  415.                     + (b&0x0303030303030303ULL)
  416.                     + 0x0202020202020202ULL;
  417.         uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  418.                    + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  419.         uint64_t l1,h1;
  420.         pixels+=line_size;
  421.         for(i=0; i<h; i+=2){
  422.             uint64_t a= LD64(pixels  );
  423.             uint64_t b= LD64(pixels+1);
  424.             l1=  (a&0x0303030303030303ULL)
  425.                + (b&0x0303030303030303ULL);
  426.             h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  427.               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  428.             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));
  429.             pixels+=line_size;
  430.             block +=line_size;
  431.             a= LD64(pixels  );
  432.             b= LD64(pixels+1);
  433.             l0=  (a&0x0303030303030303ULL)
  434.                + (b&0x0303030303030303ULL)
  435.                + 0x0202020202020202ULL;
  436.             h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  437.               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  438.             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));
  439.             pixels+=line_size;
  440.             block +=line_size;
  441.         }
  442. }
  443. static void OPNAME ## _no_rnd_pixels_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  444. {
  445.         int i;
  446.         const uint64_t a= LD64(pixels  );
  447.         const uint64_t b= LD64(pixels+1);
  448.         uint64_t l0=  (a&0x0303030303030303ULL)
  449.                     + (b&0x0303030303030303ULL)
  450.                     + 0x0101010101010101ULL;
  451.         uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  452.                    + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  453.         uint64_t l1,h1;
  454.         pixels+=line_size;
  455.         for(i=0; i<h; i+=2){
  456.             uint64_t a= LD64(pixels  );
  457.             uint64_t b= LD64(pixels+1);
  458.             l1=  (a&0x0303030303030303ULL)
  459.                + (b&0x0303030303030303ULL);
  460.             h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  461.               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  462.             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));
  463.             pixels+=line_size;
  464.             block +=line_size;
  465.             a= LD64(pixels  );
  466.             b= LD64(pixels+1);
  467.             l0=  (a&0x0303030303030303ULL)
  468.                + (b&0x0303030303030303ULL)
  469.                + 0x0101010101010101ULL;
  470.             h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)
  471.               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);
  472.             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));
  473.             pixels+=line_size;
  474.             block +=line_size;
  475.         }
  476. }
  477. CALL_2X_PIXELS(OPNAME ## _pixels16_c    , OPNAME ## _pixels_c    , 8)
  478. CALL_2X_PIXELS(OPNAME ## _pixels16_x2_c , OPNAME ## _pixels_x2_c , 8)
  479. CALL_2X_PIXELS(OPNAME ## _pixels16_y2_c , OPNAME ## _pixels_y2_c , 8)
  480. CALL_2X_PIXELS(OPNAME ## _pixels16_xy2_c, OPNAME ## _pixels_xy2_c, 8)
  481. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2_c , OPNAME ## _no_rnd_pixels_x2_c , 8)
  482. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2_c , OPNAME ## _no_rnd_pixels_y2_c , 8)
  483. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2_c, OPNAME ## _no_rnd_pixels_xy2_c, 8)
  484. #define op_avg(a, b) a = ( ((a)|(b)) - ((((a)^(b))&0xFEFEFEFEFEFEFEFEULL)>>1) )
  485. #else // 64 bit variant
  486. #define PIXOP2(OPNAME, OP) 
  487. static void OPNAME ## _pixels2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  488.     int i;
  489.     for(i=0; i<h; i++){
  490.         OP(*((uint16_t*)(block  )), LD16(pixels  ));
  491.         pixels+=line_size;
  492.         block +=line_size;
  493.     }
  494. }
  495. static void OPNAME ## _pixels4_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  496.     int i;
  497.     for(i=0; i<h; i++){
  498.         OP(*((uint32_t*)(block  )), LD32(pixels  ));
  499.         pixels+=line_size;
  500.         block +=line_size;
  501.     }
  502. }
  503. static void OPNAME ## _pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  504.     int i;
  505.     for(i=0; i<h; i++){
  506.         OP(*((uint32_t*)(block  )), LD32(pixels  ));
  507.         OP(*((uint32_t*)(block+4)), LD32(pixels+4));
  508.         pixels+=line_size;
  509.         block +=line_size;
  510.     }
  511. }
  512. static inline void OPNAME ## _no_rnd_pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  513.     OPNAME ## _pixels8_c(block, pixels, line_size, h);
  514. }
  515. static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  516.                                                 int src_stride1, int src_stride2, int h){
  517.     int i;
  518.     for(i=0; i<h; i++){
  519.         uint32_t a,b;
  520.         a= LD32(&src1[i*src_stride1  ]);
  521.         b= LD32(&src2[i*src_stride2  ]);
  522.         OP(*((uint32_t*)&dst[i*dst_stride  ]), no_rnd_avg32(a, b));
  523.         a= LD32(&src1[i*src_stride1+4]);
  524.         b= LD32(&src2[i*src_stride2+4]);
  525.         OP(*((uint32_t*)&dst[i*dst_stride+4]), no_rnd_avg32(a, b));
  526.     }
  527. }
  528. static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  529.                                                 int src_stride1, int src_stride2, int h){
  530.     int i;
  531.     for(i=0; i<h; i++){
  532.         uint32_t a,b;
  533.         a= LD32(&src1[i*src_stride1  ]);
  534.         b= LD32(&src2[i*src_stride2  ]);
  535.         OP(*((uint32_t*)&dst[i*dst_stride  ]), rnd_avg32(a, b));
  536.         a= LD32(&src1[i*src_stride1+4]);
  537.         b= LD32(&src2[i*src_stride2+4]);
  538.         OP(*((uint32_t*)&dst[i*dst_stride+4]), rnd_avg32(a, b));
  539.     }
  540. }
  541. static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  542.                                                 int src_stride1, int src_stride2, int h){
  543.     int i;
  544.     for(i=0; i<h; i++){
  545.         uint32_t a,b;
  546.         a= LD32(&src1[i*src_stride1  ]);
  547.         b= LD32(&src2[i*src_stride2  ]);
  548.         OP(*((uint32_t*)&dst[i*dst_stride  ]), rnd_avg32(a, b));
  549.     }
  550. }
  551. static inline void OPNAME ## _pixels2_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  552.                                                 int src_stride1, int src_stride2, int h){
  553.     int i;
  554.     for(i=0; i<h; i++){
  555.         uint32_t a,b;
  556.         a= LD16(&src1[i*src_stride1  ]);
  557.         b= LD16(&src2[i*src_stride2  ]);
  558.         OP(*((uint16_t*)&dst[i*dst_stride  ]), rnd_avg32(a, b));
  559.     }
  560. }
  561. static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  562.                                                 int src_stride1, int src_stride2, int h){
  563.     OPNAME ## _pixels8_l2(dst  , src1  , src2  , dst_stride, src_stride1, src_stride2, h);
  564.     OPNAME ## _pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);
  565. }
  566. static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, 
  567.                                                 int src_stride1, int src_stride2, int h){
  568.     OPNAME ## _no_rnd_pixels8_l2(dst  , src1  , src2  , dst_stride, src_stride1, src_stride2, h);
  569.     OPNAME ## _no_rnd_pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);
  570. }
  571. static inline void OPNAME ## _no_rnd_pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  572.     OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);
  573. }
  574. static inline void OPNAME ## _pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  575.     OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);
  576. }
  577. static inline void OPNAME ## _no_rnd_pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  578.     OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);
  579. }
  580. static inline void OPNAME ## _pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  581.     OPNAME ## _pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);
  582. }
  583. static inline void OPNAME ## _pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,
  584.                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  585.     int i;
  586.     for(i=0; i<h; i++){
  587.         uint32_t a, b, c, d, l0, l1, h0, h1;
  588.         a= LD32(&src1[i*src_stride1]);
  589.         b= LD32(&src2[i*src_stride2]);
  590.         c= LD32(&src3[i*src_stride3]);
  591.         d= LD32(&src4[i*src_stride4]);
  592.         l0=  (a&0x03030303UL)
  593.            + (b&0x03030303UL)
  594.            + 0x02020202UL;
  595.         h0= ((a&0xFCFCFCFCUL)>>2)
  596.           + ((b&0xFCFCFCFCUL)>>2);
  597.         l1=  (c&0x03030303UL)
  598.            + (d&0x03030303UL);
  599.         h1= ((c&0xFCFCFCFCUL)>>2)
  600.           + ((d&0xFCFCFCFCUL)>>2);
  601.         OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  602.         a= LD32(&src1[i*src_stride1+4]);
  603.         b= LD32(&src2[i*src_stride2+4]);
  604.         c= LD32(&src3[i*src_stride3+4]);
  605.         d= LD32(&src4[i*src_stride4+4]);
  606.         l0=  (a&0x03030303UL)
  607.            + (b&0x03030303UL)
  608.            + 0x02020202UL;
  609.         h0= ((a&0xFCFCFCFCUL)>>2)
  610.           + ((b&0xFCFCFCFCUL)>>2);
  611.         l1=  (c&0x03030303UL)
  612.            + (d&0x03030303UL);
  613.         h1= ((c&0xFCFCFCFCUL)>>2)
  614.           + ((d&0xFCFCFCFCUL)>>2);
  615.         OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  616.     }
  617. }
  618. static inline void OPNAME ## _pixels4_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  619.     OPNAME ## _pixels4_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);
  620. }
  621. static inline void OPNAME ## _pixels4_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  622.     OPNAME ## _pixels4_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);
  623. }
  624. static inline void OPNAME ## _pixels2_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  625.     OPNAME ## _pixels2_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);
  626. }
  627. static inline void OPNAME ## _pixels2_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  628.     OPNAME ## _pixels2_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);
  629. }
  630. static inline void OPNAME ## _no_rnd_pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,
  631.                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  632.     int i;
  633.     for(i=0; i<h; i++){
  634.         uint32_t a, b, c, d, l0, l1, h0, h1;
  635.         a= LD32(&src1[i*src_stride1]);
  636.         b= LD32(&src2[i*src_stride2]);
  637.         c= LD32(&src3[i*src_stride3]);
  638.         d= LD32(&src4[i*src_stride4]);
  639.         l0=  (a&0x03030303UL)
  640.            + (b&0x03030303UL)
  641.            + 0x01010101UL;
  642.         h0= ((a&0xFCFCFCFCUL)>>2)
  643.           + ((b&0xFCFCFCFCUL)>>2);
  644.         l1=  (c&0x03030303UL)
  645.            + (d&0x03030303UL);
  646.         h1= ((c&0xFCFCFCFCUL)>>2)
  647.           + ((d&0xFCFCFCFCUL)>>2);
  648.         OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  649.         a= LD32(&src1[i*src_stride1+4]);
  650.         b= LD32(&src2[i*src_stride2+4]);
  651.         c= LD32(&src3[i*src_stride3+4]);
  652.         d= LD32(&src4[i*src_stride4+4]);
  653.         l0=  (a&0x03030303UL)
  654.            + (b&0x03030303UL)
  655.            + 0x01010101UL;
  656.         h0= ((a&0xFCFCFCFCUL)>>2)
  657.           + ((b&0xFCFCFCFCUL)>>2);
  658.         l1=  (c&0x03030303UL)
  659.            + (d&0x03030303UL);
  660.         h1= ((c&0xFCFCFCFCUL)>>2)
  661.           + ((d&0xFCFCFCFCUL)>>2);
  662.         OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  663.     }
  664. }
  665. static inline void OPNAME ## _pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,
  666.                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  667.     OPNAME ## _pixels8_l4(dst  , src1  , src2  , src3  , src4  , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);
  668.     OPNAME ## _pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);
  669. }
  670. static inline void OPNAME ## _no_rnd_pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,
  671.                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  672.     OPNAME ## _no_rnd_pixels8_l4(dst  , src1  , src2  , src3  , src4  , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);
  673.     OPNAME ## _no_rnd_pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);
  674. }
  675. static inline void OPNAME ## _pixels2_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  676. {
  677.         int i, a0, b0, a1, b1;
  678.         a0= pixels[0];
  679.         b0= pixels[1] + 2;
  680.         a0 += b0;
  681.         b0 += pixels[2];
  682.         pixels+=line_size;
  683.         for(i=0; i<h; i+=2){
  684.             a1= pixels[0];
  685.             b1= pixels[1];
  686.             a1 += b1;
  687.             b1 += pixels[2];
  688.             block[0]= (a1+a0)>>2; /* FIXME non put */
  689.             block[1]= (b1+b0)>>2;
  690.             pixels+=line_size;
  691.             block +=line_size;
  692.             a0= pixels[0];
  693.             b0= pixels[1] + 2;
  694.             a0 += b0;
  695.             b0 += pixels[2];
  696.             block[0]= (a1+a0)>>2;
  697.             block[1]= (b1+b0)>>2;
  698.             pixels+=line_size;
  699.             block +=line_size;
  700.         }
  701. }
  702. static inline void OPNAME ## _pixels4_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  703. {
  704.         int i;
  705.         const uint32_t a= LD32(pixels  );
  706.         const uint32_t b= LD32(pixels+1);
  707.         uint32_t l0=  (a&0x03030303UL)
  708.                     + (b&0x03030303UL)
  709.                     + 0x02020202UL;
  710.         uint32_t h0= ((a&0xFCFCFCFCUL)>>2)
  711.                    + ((b&0xFCFCFCFCUL)>>2);
  712.         uint32_t l1,h1;
  713.         pixels+=line_size;
  714.         for(i=0; i<h; i+=2){
  715.             uint32_t a= LD32(pixels  );
  716.             uint32_t b= LD32(pixels+1);
  717.             l1=  (a&0x03030303UL)
  718.                + (b&0x03030303UL);
  719.             h1= ((a&0xFCFCFCFCUL)>>2)
  720.               + ((b&0xFCFCFCFCUL)>>2);
  721.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  722.             pixels+=line_size;
  723.             block +=line_size;
  724.             a= LD32(pixels  );
  725.             b= LD32(pixels+1);
  726.             l0=  (a&0x03030303UL)
  727.                + (b&0x03030303UL)
  728.                + 0x02020202UL;
  729.             h0= ((a&0xFCFCFCFCUL)>>2)
  730.               + ((b&0xFCFCFCFCUL)>>2);
  731.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  732.             pixels+=line_size;
  733.             block +=line_size;
  734.         }
  735. }
  736. static inline void OPNAME ## _pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  737. {
  738.     int j;
  739.     for(j=0; j<2; j++){
  740.         int i;
  741.         const uint32_t a= LD32(pixels  );
  742.         const uint32_t b= LD32(pixels+1);
  743.         uint32_t l0=  (a&0x03030303UL)
  744.                     + (b&0x03030303UL)
  745.                     + 0x02020202UL;
  746.         uint32_t h0= ((a&0xFCFCFCFCUL)>>2)
  747.                    + ((b&0xFCFCFCFCUL)>>2);
  748.         uint32_t l1,h1;
  749.         pixels+=line_size;
  750.         for(i=0; i<h; i+=2){
  751.             uint32_t a= LD32(pixels  );
  752.             uint32_t b= LD32(pixels+1);
  753.             l1=  (a&0x03030303UL)
  754.                + (b&0x03030303UL);
  755.             h1= ((a&0xFCFCFCFCUL)>>2)
  756.               + ((b&0xFCFCFCFCUL)>>2);
  757.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  758.             pixels+=line_size;
  759.             block +=line_size;
  760.             a= LD32(pixels  );
  761.             b= LD32(pixels+1);
  762.             l0=  (a&0x03030303UL)
  763.                + (b&0x03030303UL)
  764.                + 0x02020202UL;
  765.             h0= ((a&0xFCFCFCFCUL)>>2)
  766.               + ((b&0xFCFCFCFCUL)>>2);
  767.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  768.             pixels+=line_size;
  769.             block +=line_size;
  770.         }
  771.         pixels+=4-line_size*(h+1);
  772.         block +=4-line_size*h;
  773.     }
  774. }
  775. static inline void OPNAME ## _no_rnd_pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  776. {
  777.     int j;
  778.     for(j=0; j<2; j++){
  779.         int i;
  780.         const uint32_t a= LD32(pixels  );
  781.         const uint32_t b= LD32(pixels+1);
  782.         uint32_t l0=  (a&0x03030303UL)
  783.                     + (b&0x03030303UL)
  784.                     + 0x01010101UL;
  785.         uint32_t h0= ((a&0xFCFCFCFCUL)>>2)
  786.                    + ((b&0xFCFCFCFCUL)>>2);
  787.         uint32_t l1,h1;
  788.         pixels+=line_size;
  789.         for(i=0; i<h; i+=2){
  790.             uint32_t a= LD32(pixels  );
  791.             uint32_t b= LD32(pixels+1);
  792.             l1=  (a&0x03030303UL)
  793.                + (b&0x03030303UL);
  794.             h1= ((a&0xFCFCFCFCUL)>>2)
  795.               + ((b&0xFCFCFCFCUL)>>2);
  796.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  797.             pixels+=line_size;
  798.             block +=line_size;
  799.             a= LD32(pixels  );
  800.             b= LD32(pixels+1);
  801.             l0=  (a&0x03030303UL)
  802.                + (b&0x03030303UL)
  803.                + 0x01010101UL;
  804.             h0= ((a&0xFCFCFCFCUL)>>2)
  805.               + ((b&0xFCFCFCFCUL)>>2);
  806.             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));
  807.             pixels+=line_size;
  808.             block +=line_size;
  809.         }
  810.         pixels+=4-line_size*(h+1);
  811.         block +=4-line_size*h;
  812.     }
  813. }
  814. CALL_2X_PIXELS(OPNAME ## _pixels16_c  , OPNAME ## _pixels8_c  , 8)
  815. CALL_2X_PIXELS(OPNAME ## _pixels16_x2_c , OPNAME ## _pixels8_x2_c , 8)
  816. CALL_2X_PIXELS(OPNAME ## _pixels16_y2_c , OPNAME ## _pixels8_y2_c , 8)
  817. CALL_2X_PIXELS(OPNAME ## _pixels16_xy2_c, OPNAME ## _pixels8_xy2_c, 8)
  818. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_c  , OPNAME ## _pixels8_c         , 8)
  819. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2_c , OPNAME ## _no_rnd_pixels8_x2_c , 8)
  820. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2_c , OPNAME ## _no_rnd_pixels8_y2_c , 8)
  821. CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2_c, OPNAME ## _no_rnd_pixels8_xy2_c, 8)
  822. #define op_avg(a, b) a = rnd_avg32(a, b)
  823. #endif
  824. #define op_put(a, b) a = b
  825. PIXOP2(avg, op_avg)
  826. PIXOP2(put, op_put)
  827. #undef op_avg
  828. #undef op_put
  829. #define avg2(a,b) ((a+b+1)>>1)
  830. #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
  831. static void put_no_rnd_pixels16_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){
  832.     put_no_rnd_pixels16_l2(dst, a, b, stride, stride, stride, h);
  833. }
  834. static void put_no_rnd_pixels8_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){
  835.     put_no_rnd_pixels8_l2(dst, a, b, stride, stride, stride, h);
  836. }
  837. static void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder)
  838. {
  839.     const int A=(16-x16)*(16-y16);
  840.     const int B=(   x16)*(16-y16);
  841.     const int C=(16-x16)*(   y16);
  842.     const int D=(   x16)*(   y16);
  843.     int i;
  844.     for(i=0; i<h; i++)
  845.     {
  846.         dst[0]= (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + rounder)>>8;
  847.         dst[1]= (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + rounder)>>8;
  848.         dst[2]= (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + rounder)>>8;
  849.         dst[3]= (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + rounder)>>8;
  850.         dst[4]= (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + rounder)>>8;
  851.         dst[5]= (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + rounder)>>8;
  852.         dst[6]= (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + rounder)>>8;
  853.         dst[7]= (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + rounder)>>8;
  854.         dst+= stride;
  855.         src+= stride;
  856.     }
  857. }
  858. static void gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, 
  859.                   int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height)
  860. {
  861.     int y, vx, vy;
  862.     const int s= 1<<shift;
  863.     
  864.     width--;
  865.     height--;
  866.     for(y=0; y<h; y++){
  867.         int x;
  868.         vx= ox;
  869.         vy= oy;
  870.         for(x=0; x<8; x++){ //XXX FIXME optimize
  871.             int src_x, src_y, frac_x, frac_y, index;
  872.             src_x= vx>>16;
  873.             src_y= vy>>16;
  874.             frac_x= src_x&(s-1);
  875.             frac_y= src_y&(s-1);
  876.             src_x>>=shift;
  877.             src_y>>=shift;
  878.   
  879.             if((unsigned)src_x < width){
  880.                 if((unsigned)src_y < height){
  881.                     index= src_x + src_y*stride;
  882.                     dst[y*stride + x]= (  (  src[index         ]*(s-frac_x)
  883.                                            + src[index       +1]*   frac_x )*(s-frac_y)
  884.                                         + (  src[index+stride  ]*(s-frac_x)
  885.                                            + src[index+stride+1]*   frac_x )*   frac_y
  886.                                         + r)>>(shift*2);
  887.                 }else{
  888.                     index= src_x + clip(src_y, 0, height)*stride;                    
  889.                     dst[y*stride + x]= ( (  src[index         ]*(s-frac_x) 
  890.                                           + src[index       +1]*   frac_x )*s
  891.                                         + r)>>(shift*2);
  892.                 }
  893.             }else{
  894.                 if((unsigned)src_y < height){
  895.                     index= clip(src_x, 0, width) + src_y*stride;                    
  896.                     dst[y*stride + x]= (  (  src[index         ]*(s-frac_y) 
  897.                                            + src[index+stride  ]*   frac_y )*s
  898.                                         + r)>>(shift*2);
  899.                 }else{
  900.                     index= clip(src_x, 0, width) + clip(src_y, 0, height)*stride;                    
  901.                     dst[y*stride + x]=    src[index         ];
  902.                 }
  903.             }
  904.             
  905.             vx+= dxx;
  906.             vy+= dyx;
  907.         }
  908.         ox += dxy;
  909.         oy += dyy;
  910.     }
  911. }
  912. static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  913.     switch(width){
  914.     case 2: put_pixels2_c (dst, src, stride, height); break;
  915.     case 4: put_pixels4_c (dst, src, stride, height); break;
  916.     case 8: put_pixels8_c (dst, src, stride, height); break;
  917.     case 16:put_pixels16_c(dst, src, stride, height); break;
  918.     }
  919. }
  920. static inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  921.     int i,j;
  922.     for (i=0; i < height; i++) {
  923.       for (j=0; j < width; j++) {
  924. dst[j] = (683*(2*src[j] + src[j+1] + 1)) >> 11;
  925.       }
  926.       src += stride;
  927.       dst += stride;
  928.     }
  929. }
  930. static inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  931.     int i,j;
  932.     for (i=0; i < height; i++) {
  933.       for (j=0; j < width; j++) {
  934. dst[j] = (683*(src[j] + 2*src[j+1] + 1)) >> 11;
  935.       }
  936.       src += stride;
  937.       dst += stride;
  938.     }
  939. }
  940.     
  941. static inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  942.     int i,j;
  943.     for (i=0; i < height; i++) {
  944.       for (j=0; j < width; j++) {
  945. dst[j] = (683*(2*src[j] + src[j+stride] + 1)) >> 11;
  946.       }
  947.       src += stride;
  948.       dst += stride;
  949.     }
  950. }
  951.     
  952. static inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  953.     int i,j;
  954.     for (i=0; i < height; i++) {
  955.       for (j=0; j < width; j++) {
  956. dst[j] = (2731*(4*src[j] + 3*src[j+1] + 3*src[j+stride] + 2*src[j+stride+1] + 6)) >> 15;
  957.       }
  958.       src += stride;
  959.       dst += stride;
  960.     }
  961. }
  962. static inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  963.     int i,j;
  964.     for (i=0; i < height; i++) {
  965.       for (j=0; j < width; j++) {
  966. dst[j] = (2731*(3*src[j] + 2*src[j+1] + 4*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15;
  967.       }
  968.       src += stride;
  969.       dst += stride;
  970.     }
  971. }
  972. static inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  973.     int i,j;
  974.     for (i=0; i < height; i++) {
  975.       for (j=0; j < width; j++) {
  976. dst[j] = (683*(src[j] + 2*src[j+stride] + 1)) >> 11;
  977.       }
  978.       src += stride;
  979.       dst += stride;
  980.     }
  981. }
  982. static inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  983.     int i,j;
  984.     for (i=0; i < height; i++) {
  985.       for (j=0; j < width; j++) {
  986. dst[j] = (2731*(3*src[j] + 4*src[j+1] + 2*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15;
  987.       }
  988.       src += stride;
  989.       dst += stride;
  990.     }
  991. }
  992. static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  993.     int i,j;
  994.     for (i=0; i < height; i++) {
  995.       for (j=0; j < width; j++) {
  996. dst[j] = (2731*(2*src[j] + 3*src[j+1] + 3*src[j+stride] + 4*src[j+stride+1] + 6)) >> 15;
  997.       }
  998.       src += stride;
  999.       dst += stride;
  1000.     }
  1001. }
  1002. static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1003.     switch(width){
  1004.     case 2: avg_pixels2_c (dst, src, stride, height); break;
  1005.     case 4: avg_pixels4_c (dst, src, stride, height); break;
  1006.     case 8: avg_pixels8_c (dst, src, stride, height); break;
  1007.     case 16:avg_pixels16_c(dst, src, stride, height); break;
  1008.     }
  1009. }
  1010. static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1011.     int i,j;
  1012.     for (i=0; i < height; i++) {
  1013.       for (j=0; j < width; j++) {
  1014. dst[j] = (dst[j] + ((683*(2*src[j] + src[j+1] + 1)) >> 11) + 1) >> 1;
  1015.       }
  1016.       src += stride;
  1017.       dst += stride;
  1018.     }
  1019. }
  1020. static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1021.     int i,j;
  1022.     for (i=0; i < height; i++) {
  1023.       for (j=0; j < width; j++) {
  1024. dst[j] = (dst[j] + ((683*(src[j] + 2*src[j+1] + 1)) >> 11) + 1) >> 1;
  1025.       }
  1026.       src += stride;
  1027.       dst += stride;
  1028.     }
  1029. }
  1030.     
  1031. static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1032.     int i,j;
  1033.     for (i=0; i < height; i++) {
  1034.       for (j=0; j < width; j++) {
  1035. dst[j] = (dst[j] + ((683*(2*src[j] + src[j+stride] + 1)) >> 11) + 1) >> 1;
  1036.       }
  1037.       src += stride;
  1038.       dst += stride;
  1039.     }
  1040. }
  1041.     
  1042. static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1043.     int i,j;
  1044.     for (i=0; i < height; i++) {
  1045.       for (j=0; j < width; j++) {
  1046. dst[j] = (dst[j] + ((2731*(4*src[j] + 3*src[j+1] + 3*src[j+stride] + 2*src[j+stride+1] + 6)) >> 15) + 1) >> 1;
  1047.       }
  1048.       src += stride;
  1049.       dst += stride;
  1050.     }
  1051. }
  1052. static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1053.     int i,j;
  1054.     for (i=0; i < height; i++) {
  1055.       for (j=0; j < width; j++) {
  1056. dst[j] = (dst[j] + ((2731*(3*src[j] + 2*src[j+1] + 4*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15) + 1) >> 1;
  1057.       }
  1058.       src += stride;
  1059.       dst += stride;
  1060.     }
  1061. }
  1062. static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1063.     int i,j;
  1064.     for (i=0; i < height; i++) {
  1065.       for (j=0; j < width; j++) {
  1066. dst[j] = (dst[j] + ((683*(src[j] + 2*src[j+stride] + 1)) >> 11) + 1) >> 1;
  1067.       }
  1068.       src += stride;
  1069.       dst += stride;
  1070.     }
  1071. }
  1072. static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1073.     int i,j;
  1074.     for (i=0; i < height; i++) {
  1075.       for (j=0; j < width; j++) {
  1076. dst[j] = (dst[j] + ((2731*(3*src[j] + 4*src[j+1] + 2*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15) + 1) >> 1;
  1077.       }
  1078.       src += stride;
  1079.       dst += stride;
  1080.     }
  1081. }
  1082. static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){
  1083.     int i,j;
  1084.     for (i=0; i < height; i++) {
  1085.       for (j=0; j < width; j++) {
  1086. dst[j] = (dst[j] + ((2731*(2*src[j] + 3*src[j+1] + 3*src[j+stride] + 4*src[j+stride+1] + 6)) >> 15) + 1) >> 1;
  1087.       }
  1088.       src += stride;
  1089.       dst += stride;
  1090.     }
  1091. }
  1092. #if 0
  1093. #define TPEL_WIDTH(width)
  1094. static void put_tpel_pixels ## width ## _mc00_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1095.     void put_tpel_pixels_mc00_c(dst, src, stride, width, height);}
  1096. static void put_tpel_pixels ## width ## _mc10_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1097.     void put_tpel_pixels_mc10_c(dst, src, stride, width, height);}
  1098. static void put_tpel_pixels ## width ## _mc20_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1099.     void put_tpel_pixels_mc20_c(dst, src, stride, width, height);}
  1100. static void put_tpel_pixels ## width ## _mc01_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1101.     void put_tpel_pixels_mc01_c(dst, src, stride, width, height);}
  1102. static void put_tpel_pixels ## width ## _mc11_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1103.     void put_tpel_pixels_mc11_c(dst, src, stride, width, height);}
  1104. static void put_tpel_pixels ## width ## _mc21_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1105.     void put_tpel_pixels_mc21_c(dst, src, stride, width, height);}
  1106. static void put_tpel_pixels ## width ## _mc02_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1107.     void put_tpel_pixels_mc02_c(dst, src, stride, width, height);}
  1108. static void put_tpel_pixels ## width ## _mc12_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1109.     void put_tpel_pixels_mc12_c(dst, src, stride, width, height);}
  1110. static void put_tpel_pixels ## width ## _mc22_c(uint8_t *dst, const uint8_t *src, int stride, int height){
  1111.     void put_tpel_pixels_mc22_c(dst, src, stride, width, height);}
  1112. #endif
  1113. #define H264_CHROMA_MC(OPNAME, OP)
  1114. static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
  1115.     const int A=(8-x)*(8-y);
  1116.     const int B=(  x)*(8-y);
  1117.     const int C=(8-x)*(  y);
  1118.     const int D=(  x)*(  y);
  1119.     int i;
  1120.     
  1121.     assert(x<8 && y<8 && x>=0 && y>=0);
  1122.     for(i=0; i<h; i++)
  1123.     {
  1124.         OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));
  1125.         OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));
  1126.         dst+= stride;
  1127.         src+= stride;
  1128.     }
  1129. }
  1130. static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
  1131.     const int A=(8-x)*(8-y);
  1132.     const int B=(  x)*(8-y);
  1133.     const int C=(8-x)*(  y);
  1134.     const int D=(  x)*(  y);
  1135.     int i;
  1136.     
  1137.     assert(x<8 && y<8 && x>=0 && y>=0);
  1138.     for(i=0; i<h; i++)
  1139.     {
  1140.         OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));
  1141.         OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));
  1142.         OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));
  1143.         OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));
  1144.         dst+= stride;
  1145.         src+= stride;
  1146.     }
  1147. }
  1148. static void OPNAME ## h264_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
  1149.     const int A=(8-x)*(8-y);
  1150.     const int B=(  x)*(8-y);
  1151.     const int C=(8-x)*(  y);
  1152.     const int D=(  x)*(  y);
  1153.     int i;
  1154.     
  1155.     assert(x<8 && y<8 && x>=0 && y>=0);
  1156.     for(i=0; i<h; i++)
  1157.     {
  1158.         OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));
  1159.         OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));
  1160.         OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));
  1161.         OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));
  1162.         OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));
  1163.         OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));
  1164.         OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));
  1165.         OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));
  1166.         dst+= stride;
  1167.         src+= stride;
  1168.     }
  1169. }
  1170. #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
  1171. #define op_put(a, b) a = (((b) + 32)>>6)
  1172. H264_CHROMA_MC(put_       , op_put)
  1173. H264_CHROMA_MC(avg_       , op_avg)
  1174. #undef op_avg
  1175. #undef op_put
  1176. static inline void copy_block4(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  1177. {
  1178.     int i;
  1179.     for(i=0; i<h; i++)
  1180.     {
  1181.         ST32(dst   , LD32(src   ));
  1182.         dst+=dstStride;
  1183.         src+=srcStride;
  1184.     }
  1185. }
  1186. static inline void copy_block8(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  1187. {
  1188.     int i;
  1189.     for(i=0; i<h; i++)
  1190.     {
  1191.         ST32(dst   , LD32(src   ));
  1192.         ST32(dst+4 , LD32(src+4 ));
  1193.         dst+=dstStride;
  1194.         src+=srcStride;
  1195.     }
  1196. }
  1197. static inline void copy_block16(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  1198. {
  1199.     int i;
  1200.     for(i=0; i<h; i++)
  1201.     {
  1202.         ST32(dst   , LD32(src   ));
  1203.         ST32(dst+4 , LD32(src+4 ));
  1204.         ST32(dst+8 , LD32(src+8 ));
  1205.         ST32(dst+12, LD32(src+12));
  1206.         dst+=dstStride;
  1207.         src+=srcStride;
  1208.     }
  1209. }
  1210. static inline void copy_block17(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  1211. {
  1212.     int i;
  1213.     for(i=0; i<h; i++)
  1214.     {
  1215.         ST32(dst   , LD32(src   ));
  1216.         ST32(dst+4 , LD32(src+4 ));
  1217.         ST32(dst+8 , LD32(src+8 ));
  1218.         ST32(dst+12, LD32(src+12));
  1219.         dst[16]= src[16];
  1220.         dst+=dstStride;
  1221.         src+=srcStride;
  1222.     }
  1223. }
  1224. static inline void copy_block9(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  1225. {
  1226.     int i;
  1227.     for(i=0; i<h; i++)
  1228.     {
  1229.         ST32(dst   , LD32(src   ));
  1230.         ST32(dst+4 , LD32(src+4 ));
  1231.         dst[8]= src[8];
  1232.         dst+=dstStride;
  1233.         src+=srcStride;
  1234.     }
  1235. }
  1236. #define QPEL_MC(r, OPNAME, RND, OP) 
  1237. static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  1238.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1239.     int i;
  1240.     for(i=0; i<h; i++)
  1241.     {
  1242.         OP(dst[0], (src[0]+src[1])*20 - (src[0]+src[2])*6 + (src[1]+src[3])*3 - (src[2]+src[4]));
  1243.         OP(dst[1], (src[1]+src[2])*20 - (src[0]+src[3])*6 + (src[0]+src[4])*3 - (src[1]+src[5]));
  1244.         OP(dst[2], (src[2]+src[3])*20 - (src[1]+src[4])*6 + (src[0]+src[5])*3 - (src[0]+src[6]));
  1245.         OP(dst[3], (src[3]+src[4])*20 - (src[2]+src[5])*6 + (src[1]+src[6])*3 - (src[0]+src[7]));
  1246.         OP(dst[4], (src[4]+src[5])*20 - (src[3]+src[6])*6 + (src[2]+src[7])*3 - (src[1]+src[8]));
  1247.         OP(dst[5], (src[5]+src[6])*20 - (src[4]+src[7])*6 + (src[3]+src[8])*3 - (src[2]+src[8]));
  1248.         OP(dst[6], (src[6]+src[7])*20 - (src[5]+src[8])*6 + (src[4]+src[8])*3 - (src[3]+src[7]));
  1249.         OP(dst[7], (src[7]+src[8])*20 - (src[6]+src[8])*6 + (src[5]+src[7])*3 - (src[4]+src[6]));
  1250.         dst+=dstStride;
  1251.         src+=srcStride;
  1252.     }
  1253. }
  1254. static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1255.     const int w=8;
  1256.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1257.     int i;
  1258.     for(i=0; i<w; i++)
  1259.     {
  1260.         const int src0= src[0*srcStride];
  1261.         const int src1= src[1*srcStride];
  1262.         const int src2= src[2*srcStride];
  1263.         const int src3= src[3*srcStride];
  1264.         const int src4= src[4*srcStride];
  1265.         const int src5= src[5*srcStride];
  1266.         const int src6= src[6*srcStride];
  1267.         const int src7= src[7*srcStride];
  1268.         const int src8= src[8*srcStride];
  1269.         OP(dst[0*dstStride], (src0+src1)*20 - (src0+src2)*6 + (src1+src3)*3 - (src2+src4));
  1270.         OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*6 + (src0+src4)*3 - (src1+src5));
  1271.         OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*6 + (src0+src5)*3 - (src0+src6));
  1272.         OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*6 + (src1+src6)*3 - (src0+src7));
  1273.         OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*6 + (src2+src7)*3 - (src1+src8));
  1274.         OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*6 + (src3+src8)*3 - (src2+src8));
  1275.         OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*6 + (src4+src8)*3 - (src3+src7));
  1276.         OP(dst[7*dstStride], (src7+src8)*20 - (src6+src8)*6 + (src5+src7)*3 - (src4+src6));
  1277.         dst++;
  1278.         src++;
  1279.     }
  1280. }
  1281. static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  1282.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1283.     int i;
  1284.     
  1285.     for(i=0; i<h; i++)
  1286.     {
  1287.         OP(dst[ 0], (src[ 0]+src[ 1])*20 - (src[ 0]+src[ 2])*6 + (src[ 1]+src[ 3])*3 - (src[ 2]+src[ 4]));
  1288.         OP(dst[ 1], (src[ 1]+src[ 2])*20 - (src[ 0]+src[ 3])*6 + (src[ 0]+src[ 4])*3 - (src[ 1]+src[ 5]));
  1289.         OP(dst[ 2], (src[ 2]+src[ 3])*20 - (src[ 1]+src[ 4])*6 + (src[ 0]+src[ 5])*3 - (src[ 0]+src[ 6]));
  1290.         OP(dst[ 3], (src[ 3]+src[ 4])*20 - (src[ 2]+src[ 5])*6 + (src[ 1]+src[ 6])*3 - (src[ 0]+src[ 7]));
  1291.         OP(dst[ 4], (src[ 4]+src[ 5])*20 - (src[ 3]+src[ 6])*6 + (src[ 2]+src[ 7])*3 - (src[ 1]+src[ 8]));
  1292.         OP(dst[ 5], (src[ 5]+src[ 6])*20 - (src[ 4]+src[ 7])*6 + (src[ 3]+src[ 8])*3 - (src[ 2]+src[ 9]));
  1293.         OP(dst[ 6], (src[ 6]+src[ 7])*20 - (src[ 5]+src[ 8])*6 + (src[ 4]+src[ 9])*3 - (src[ 3]+src[10]));
  1294.         OP(dst[ 7], (src[ 7]+src[ 8])*20 - (src[ 6]+src[ 9])*6 + (src[ 5]+src[10])*3 - (src[ 4]+src[11]));
  1295.         OP(dst[ 8], (src[ 8]+src[ 9])*20 - (src[ 7]+src[10])*6 + (src[ 6]+src[11])*3 - (src[ 5]+src[12]));
  1296.         OP(dst[ 9], (src[ 9]+src[10])*20 - (src[ 8]+src[11])*6 + (src[ 7]+src[12])*3 - (src[ 6]+src[13]));
  1297.         OP(dst[10], (src[10]+src[11])*20 - (src[ 9]+src[12])*6 + (src[ 8]+src[13])*3 - (src[ 7]+src[14]));
  1298.         OP(dst[11], (src[11]+src[12])*20 - (src[10]+src[13])*6 + (src[ 9]+src[14])*3 - (src[ 8]+src[15]));
  1299.         OP(dst[12], (src[12]+src[13])*20 - (src[11]+src[14])*6 + (src[10]+src[15])*3 - (src[ 9]+src[16]));
  1300.         OP(dst[13], (src[13]+src[14])*20 - (src[12]+src[15])*6 + (src[11]+src[16])*3 - (src[10]+src[16]));
  1301.         OP(dst[14], (src[14]+src[15])*20 - (src[13]+src[16])*6 + (src[12]+src[16])*3 - (src[11]+src[15]));
  1302.         OP(dst[15], (src[15]+src[16])*20 - (src[14]+src[16])*6 + (src[13]+src[15])*3 - (src[12]+src[14]));
  1303.         dst+=dstStride;
  1304.         src+=srcStride;
  1305.     }
  1306. }
  1307. static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1308.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1309.     int i;
  1310.     const int w=16;
  1311.     for(i=0; i<w; i++)
  1312.     {
  1313.         const int src0= src[0*srcStride];
  1314.         const int src1= src[1*srcStride];
  1315.         const int src2= src[2*srcStride];
  1316.         const int src3= src[3*srcStride];
  1317.         const int src4= src[4*srcStride];
  1318.         const int src5= src[5*srcStride];
  1319.         const int src6= src[6*srcStride];
  1320.         const int src7= src[7*srcStride];
  1321.         const int src8= src[8*srcStride];
  1322.         const int src9= src[9*srcStride];
  1323.         const int src10= src[10*srcStride];
  1324.         const int src11= src[11*srcStride];
  1325.         const int src12= src[12*srcStride];
  1326.         const int src13= src[13*srcStride];
  1327.         const int src14= src[14*srcStride];
  1328.         const int src15= src[15*srcStride];
  1329.         const int src16= src[16*srcStride];
  1330.         OP(dst[ 0*dstStride], (src0 +src1 )*20 - (src0 +src2 )*6 + (src1 +src3 )*3 - (src2 +src4 ));
  1331.         OP(dst[ 1*dstStride], (src1 +src2 )*20 - (src0 +src3 )*6 + (src0 +src4 )*3 - (src1 +src5 ));
  1332.         OP(dst[ 2*dstStride], (src2 +src3 )*20 - (src1 +src4 )*6 + (src0 +src5 )*3 - (src0 +src6 ));
  1333.         OP(dst[ 3*dstStride], (src3 +src4 )*20 - (src2 +src5 )*6 + (src1 +src6 )*3 - (src0 +src7 ));
  1334.         OP(dst[ 4*dstStride], (src4 +src5 )*20 - (src3 +src6 )*6 + (src2 +src7 )*3 - (src1 +src8 ));
  1335.         OP(dst[ 5*dstStride], (src5 +src6 )*20 - (src4 +src7 )*6 + (src3 +src8 )*3 - (src2 +src9 ));
  1336.         OP(dst[ 6*dstStride], (src6 +src7 )*20 - (src5 +src8 )*6 + (src4 +src9 )*3 - (src3 +src10));
  1337.         OP(dst[ 7*dstStride], (src7 +src8 )*20 - (src6 +src9 )*6 + (src5 +src10)*3 - (src4 +src11));
  1338.         OP(dst[ 8*dstStride], (src8 +src9 )*20 - (src7 +src10)*6 + (src6 +src11)*3 - (src5 +src12));
  1339.         OP(dst[ 9*dstStride], (src9 +src10)*20 - (src8 +src11)*6 + (src7 +src12)*3 - (src6 +src13));
  1340.         OP(dst[10*dstStride], (src10+src11)*20 - (src9 +src12)*6 + (src8 +src13)*3 - (src7 +src14));
  1341.         OP(dst[11*dstStride], (src11+src12)*20 - (src10+src13)*6 + (src9 +src14)*3 - (src8 +src15));
  1342.         OP(dst[12*dstStride], (src12+src13)*20 - (src11+src14)*6 + (src10+src15)*3 - (src9 +src16));
  1343.         OP(dst[13*dstStride], (src13+src14)*20 - (src12+src15)*6 + (src11+src16)*3 - (src10+src16));
  1344.         OP(dst[14*dstStride], (src14+src15)*20 - (src13+src16)*6 + (src12+src16)*3 - (src11+src15));
  1345.         OP(dst[15*dstStride], (src15+src16)*20 - (src14+src16)*6 + (src13+src15)*3 - (src12+src14));
  1346.         dst++;
  1347.         src++;
  1348.     }
  1349. }
  1350. static void OPNAME ## qpel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  1351.     OPNAME ## pixels8_c(dst, src, stride, 8);
  1352. }
  1353. static void OPNAME ## qpel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  1354.     uint8_t half[64];
  1355.     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);
  1356.     OPNAME ## pixels8_l2(dst, src, half, stride, stride, 8, 8);
  1357. }
  1358. static void OPNAME ## qpel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  1359.     OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8);
  1360. }
  1361. static void OPNAME ## qpel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  1362.     uint8_t half[64];
  1363.     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);
  1364.     OPNAME ## pixels8_l2(dst, src+1, half, stride, stride, 8, 8);
  1365. }
  1366. static void OPNAME ## qpel8_mc01_c(uint8_t *dst, uint8_t *src, int stride){
  1367.     uint8_t full[16*9];
  1368.     uint8_t half[64];
  1369.     copy_block9(full, src, 16, stride, 9);
  1370.     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);
  1371.     OPNAME ## pixels8_l2(dst, full, half, stride, 16, 8, 8);
  1372. }
  1373. static void OPNAME ## qpel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  1374.     uint8_t full[16*9];
  1375.     copy_block9(full, src, 16, stride, 9);
  1376.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16);
  1377. }
  1378. static void OPNAME ## qpel8_mc03_c(uint8_t *dst, uint8_t *src, int stride){
  1379.     uint8_t full[16*9];
  1380.     uint8_t half[64];
  1381.     copy_block9(full, src, 16, stride, 9);
  1382.     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);
  1383.     OPNAME ## pixels8_l2(dst, full+16, half, stride, 16, 8, 8);
  1384. }
  1385. void ff_ ## OPNAME ## qpel8_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){
  1386.     uint8_t full[16*9];
  1387.     uint8_t halfH[72];
  1388.     uint8_t halfV[64];
  1389.     uint8_t halfHV[64];
  1390.     copy_block9(full, src, 16, stride, 9);
  1391.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1392.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  1393.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1394.     OPNAME ## pixels8_l4(dst, full, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  1395. }
  1396. static void OPNAME ## qpel8_mc11_c(uint8_t *dst, uint8_t *src, int stride){
  1397.     uint8_t full[16*9];
  1398.     uint8_t halfH[72];
  1399.     uint8_t halfHV[64];
  1400.     copy_block9(full, src, 16, stride, 9);
  1401.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1402.     put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);
  1403.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1404.     OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);
  1405. }
  1406. void ff_ ## OPNAME ## qpel8_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){
  1407.     uint8_t full[16*9];
  1408.     uint8_t halfH[72];
  1409.     uint8_t halfV[64];
  1410.     uint8_t halfHV[64];
  1411.     copy_block9(full, src, 16, stride, 9);
  1412.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1413.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  1414.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1415.     OPNAME ## pixels8_l4(dst, full+1, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  1416. }
  1417. static void OPNAME ## qpel8_mc31_c(uint8_t *dst, uint8_t *src, int stride){
  1418.     uint8_t full[16*9];
  1419.     uint8_t halfH[72];
  1420.     uint8_t halfHV[64];
  1421.     copy_block9(full, src, 16, stride, 9);
  1422.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1423.     put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);
  1424.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1425.     OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);
  1426. }
  1427. void ff_ ## OPNAME ## qpel8_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){
  1428.     uint8_t full[16*9];
  1429.     uint8_t halfH[72];
  1430.     uint8_t halfV[64];
  1431.     uint8_t halfHV[64];
  1432.     copy_block9(full, src, 16, stride, 9);
  1433.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1434.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  1435.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1436.     OPNAME ## pixels8_l4(dst, full+16, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  1437. }
  1438. static void OPNAME ## qpel8_mc13_c(uint8_t *dst, uint8_t *src, int stride){
  1439.     uint8_t full[16*9];
  1440.     uint8_t halfH[72];
  1441.     uint8_t halfHV[64];
  1442.     copy_block9(full, src, 16, stride, 9);
  1443.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1444.     put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);
  1445.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1446.     OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);
  1447. }
  1448. void ff_ ## OPNAME ## qpel8_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){
  1449.     uint8_t full[16*9];
  1450.     uint8_t halfH[72];
  1451.     uint8_t halfV[64];
  1452.     uint8_t halfHV[64];
  1453.     copy_block9(full, src, 16, stride, 9);
  1454.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full  , 8, 16, 9);
  1455.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  1456.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1457.     OPNAME ## pixels8_l4(dst, full+17, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  1458. }
  1459. static void OPNAME ## qpel8_mc33_c(uint8_t *dst, uint8_t *src, int stride){
  1460.     uint8_t full[16*9];
  1461.     uint8_t halfH[72];
  1462.     uint8_t halfHV[64];
  1463.     copy_block9(full, src, 16, stride, 9);
  1464.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1465.     put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);
  1466.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1467.     OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);
  1468. }
  1469. static void OPNAME ## qpel8_mc21_c(uint8_t *dst, uint8_t *src, int stride){
  1470.     uint8_t halfH[72];
  1471.     uint8_t halfHV[64];
  1472.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  1473.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1474.     OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);
  1475. }
  1476. static void OPNAME ## qpel8_mc23_c(uint8_t *dst, uint8_t *src, int stride){
  1477.     uint8_t halfH[72];
  1478.     uint8_t halfHV[64];
  1479.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  1480.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1481.     OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);
  1482. }
  1483. void ff_ ## OPNAME ## qpel8_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){
  1484.     uint8_t full[16*9];
  1485.     uint8_t halfH[72];
  1486.     uint8_t halfV[64];
  1487.     uint8_t halfHV[64];
  1488.     copy_block9(full, src, 16, stride, 9);
  1489.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1490.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  1491.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1492.     OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);
  1493. }
  1494. static void OPNAME ## qpel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  1495.     uint8_t full[16*9];
  1496.     uint8_t halfH[72];
  1497.     copy_block9(full, src, 16, stride, 9);
  1498.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1499.     put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);
  1500.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  1501. }
  1502. void ff_ ## OPNAME ## qpel8_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){
  1503.     uint8_t full[16*9];
  1504.     uint8_t halfH[72];
  1505.     uint8_t halfV[64];
  1506.     uint8_t halfHV[64];
  1507.     copy_block9(full, src, 16, stride, 9);
  1508.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1509.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  1510.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  1511.     OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);
  1512. }
  1513. static void OPNAME ## qpel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  1514.     uint8_t full[16*9];
  1515.     uint8_t halfH[72];
  1516.     copy_block9(full, src, 16, stride, 9);
  1517.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  1518.     put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);
  1519.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  1520. }
  1521. static void OPNAME ## qpel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1522.     uint8_t halfH[72];
  1523.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  1524.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  1525. }
  1526. static void OPNAME ## qpel16_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  1527.     OPNAME ## pixels16_c(dst, src, stride, 16);
  1528. }
  1529. static void OPNAME ## qpel16_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  1530.     uint8_t half[256];
  1531.     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);
  1532.     OPNAME ## pixels16_l2(dst, src, half, stride, stride, 16, 16);
  1533. }
  1534. static void OPNAME ## qpel16_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  1535.     OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16);
  1536. }
  1537. static void OPNAME ## qpel16_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  1538.     uint8_t half[256];
  1539.     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);
  1540.     OPNAME ## pixels16_l2(dst, src+1, half, stride, stride, 16, 16);
  1541. }
  1542. static void OPNAME ## qpel16_mc01_c(uint8_t *dst, uint8_t *src, int stride){
  1543.     uint8_t full[24*17];
  1544.     uint8_t half[256];
  1545.     copy_block17(full, src, 24, stride, 17);
  1546.     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);
  1547.     OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);
  1548. }
  1549. static void OPNAME ## qpel16_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  1550.     uint8_t full[24*17];
  1551.     copy_block17(full, src, 24, stride, 17);
  1552.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24);
  1553. }
  1554. static void OPNAME ## qpel16_mc03_c(uint8_t *dst, uint8_t *src, int stride){
  1555.     uint8_t full[24*17];
  1556.     uint8_t half[256];
  1557.     copy_block17(full, src, 24, stride, 17);
  1558.     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);
  1559.     OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);
  1560. }
  1561. void ff_ ## OPNAME ## qpel16_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){
  1562.     uint8_t full[24*17];
  1563.     uint8_t halfH[272];
  1564.     uint8_t halfV[256];
  1565.     uint8_t halfHV[256];
  1566.     copy_block17(full, src, 24, stride, 17);
  1567.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1568.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  1569.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1570.     OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  1571. }
  1572. static void OPNAME ## qpel16_mc11_c(uint8_t *dst, uint8_t *src, int stride){
  1573.     uint8_t full[24*17];
  1574.     uint8_t halfH[272];
  1575.     uint8_t halfHV[256];
  1576.     copy_block17(full, src, 24, stride, 17);
  1577.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1578.     put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);
  1579.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1580.     OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);
  1581. }
  1582. void ff_ ## OPNAME ## qpel16_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){
  1583.     uint8_t full[24*17];
  1584.     uint8_t halfH[272];
  1585.     uint8_t halfV[256];
  1586.     uint8_t halfHV[256];
  1587.     copy_block17(full, src, 24, stride, 17);
  1588.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1589.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  1590.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1591.     OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  1592. }
  1593. static void OPNAME ## qpel16_mc31_c(uint8_t *dst, uint8_t *src, int stride){
  1594.     uint8_t full[24*17];
  1595.     uint8_t halfH[272];
  1596.     uint8_t halfHV[256];
  1597.     copy_block17(full, src, 24, stride, 17);
  1598.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1599.     put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);
  1600.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1601.     OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);
  1602. }
  1603. void ff_ ## OPNAME ## qpel16_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){
  1604.     uint8_t full[24*17];
  1605.     uint8_t halfH[272];
  1606.     uint8_t halfV[256];
  1607.     uint8_t halfHV[256];
  1608.     copy_block17(full, src, 24, stride, 17);
  1609.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1610.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  1611.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1612.     OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  1613. }
  1614. static void OPNAME ## qpel16_mc13_c(uint8_t *dst, uint8_t *src, int stride){
  1615.     uint8_t full[24*17];
  1616.     uint8_t halfH[272];
  1617.     uint8_t halfHV[256];
  1618.     copy_block17(full, src, 24, stride, 17);
  1619.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1620.     put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);
  1621.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1622.     OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);
  1623. }
  1624. void ff_ ## OPNAME ## qpel16_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){
  1625.     uint8_t full[24*17];
  1626.     uint8_t halfH[272];
  1627.     uint8_t halfV[256];
  1628.     uint8_t halfHV[256];
  1629.     copy_block17(full, src, 24, stride, 17);
  1630.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full  , 16, 24, 17);
  1631.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  1632.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1633.     OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  1634. }
  1635. static void OPNAME ## qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride){
  1636.     uint8_t full[24*17];
  1637.     uint8_t halfH[272];
  1638.     uint8_t halfHV[256];
  1639.     copy_block17(full, src, 24, stride, 17);
  1640.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1641.     put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);
  1642.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1643.     OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);
  1644. }
  1645. static void OPNAME ## qpel16_mc21_c(uint8_t *dst, uint8_t *src, int stride){
  1646.     uint8_t halfH[272];
  1647.     uint8_t halfHV[256];
  1648.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  1649.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1650.     OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);
  1651. }
  1652. static void OPNAME ## qpel16_mc23_c(uint8_t *dst, uint8_t *src, int stride){
  1653.     uint8_t halfH[272];
  1654.     uint8_t halfHV[256];
  1655.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  1656.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1657.     OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);
  1658. }
  1659. void ff_ ## OPNAME ## qpel16_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){
  1660.     uint8_t full[24*17];
  1661.     uint8_t halfH[272];
  1662.     uint8_t halfV[256];
  1663.     uint8_t halfHV[256];
  1664.     copy_block17(full, src, 24, stride, 17);
  1665.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1666.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  1667.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1668.     OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);
  1669. }
  1670. static void OPNAME ## qpel16_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  1671.     uint8_t full[24*17];
  1672.     uint8_t halfH[272];
  1673.     copy_block17(full, src, 24, stride, 17);
  1674.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1675.     put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);
  1676.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1677. }
  1678. void ff_ ## OPNAME ## qpel16_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){
  1679.     uint8_t full[24*17];
  1680.     uint8_t halfH[272];
  1681.     uint8_t halfV[256];
  1682.     uint8_t halfHV[256];
  1683.     copy_block17(full, src, 24, stride, 17);
  1684.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1685.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  1686.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1687.     OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);
  1688. }
  1689. static void OPNAME ## qpel16_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  1690.     uint8_t full[24*17];
  1691.     uint8_t halfH[272];
  1692.     copy_block17(full, src, 24, stride, 17);
  1693.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1694.     put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);
  1695.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1696. }
  1697. static void OPNAME ## qpel16_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1698.     uint8_t halfH[272];
  1699.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  1700.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1701. }
  1702. #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
  1703. #define op_avg_no_rnd(a, b) a = (((a)+cm[((b) + 15)>>5])>>1)
  1704. #define op_put(a, b) a = cm[((b) + 16)>>5]
  1705. #define op_put_no_rnd(a, b) a = cm[((b) + 15)>>5]
  1706. QPEL_MC(0, put_       , _       , op_put)
  1707. QPEL_MC(1, put_no_rnd_, _no_rnd_, op_put_no_rnd)
  1708. QPEL_MC(0, avg_       , _       , op_avg)
  1709. //QPEL_MC(1, avg_no_rnd , _       , op_avg)
  1710. #undef op_avg
  1711. #undef op_avg_no_rnd
  1712. #undef op_put
  1713. #undef op_put_no_rnd
  1714. #if 1
  1715. #define H264_LOWPASS(OPNAME, OP, OP2) 
  1716. static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1717.     const int h=4;
  1718.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1719.     int i;
  1720.     for(i=0; i<h; i++)
  1721.     {
  1722.         OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));
  1723.         OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));
  1724.         OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]));
  1725.         OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]));
  1726.         dst+=dstStride;
  1727.         src+=srcStride;
  1728.     }
  1729. }
  1730. static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1731.     const int w=4;
  1732.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1733.     int i;
  1734.     for(i=0; i<w; i++)
  1735.     {
  1736.         const int srcB= src[-2*srcStride];
  1737.         const int srcA= src[-1*srcStride];
  1738.         const int src0= src[0 *srcStride];
  1739.         const int src1= src[1 *srcStride];
  1740.         const int src2= src[2 *srcStride];
  1741.         const int src3= src[3 *srcStride];
  1742.         const int src4= src[4 *srcStride];
  1743.         const int src5= src[5 *srcStride];
  1744.         const int src6= src[6 *srcStride];
  1745.         OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));
  1746.         OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));
  1747.         OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));
  1748.         OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));
  1749.         dst++;
  1750.         src++;
  1751.     }
  1752. }
  1753. static void OPNAME ## h264_qpel4_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1754.     const int h=4;
  1755.     const int w=4;
  1756.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1757.     int i;
  1758.     src -= 2*srcStride;
  1759.     for(i=0; i<h+5; i++)
  1760.     {
  1761.         tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);
  1762.         tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);
  1763.         tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]);
  1764.         tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]);
  1765.         tmp+=tmpStride;
  1766.         src+=srcStride;
  1767.     }
  1768.     tmp -= tmpStride*(h+5-2);
  1769.     for(i=0; i<w; i++)
  1770.     {
  1771.         const int tmpB= tmp[-2*tmpStride];
  1772.         const int tmpA= tmp[-1*tmpStride];
  1773.         const int tmp0= tmp[0 *tmpStride];
  1774.         const int tmp1= tmp[1 *tmpStride];
  1775.         const int tmp2= tmp[2 *tmpStride];
  1776.         const int tmp3= tmp[3 *tmpStride];
  1777.         const int tmp4= tmp[4 *tmpStride];
  1778.         const int tmp5= tmp[5 *tmpStride];
  1779.         const int tmp6= tmp[6 *tmpStride];
  1780.         OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1781.         OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1782.         OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1783.         OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1784.         dst++;
  1785.         tmp++;
  1786.     }
  1787. }
  1788. static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1789.     const int h=8;
  1790.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1791.     int i;
  1792.     for(i=0; i<h; i++)
  1793.     {
  1794.         OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]));
  1795.         OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]));
  1796.         OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]));
  1797.         OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]));
  1798.         OP(dst[4], (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]));
  1799.         OP(dst[5], (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]));
  1800.         OP(dst[6], (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]));
  1801.         OP(dst[7], (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]));
  1802.         dst+=dstStride;
  1803.         src+=srcStride;
  1804.     }
  1805. }
  1806. static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1807.     const int w=8;
  1808.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1809.     int i;
  1810.     for(i=0; i<w; i++)
  1811.     {
  1812.         const int srcB= src[-2*srcStride];
  1813.         const int srcA= src[-1*srcStride];
  1814.         const int src0= src[0 *srcStride];
  1815.         const int src1= src[1 *srcStride];
  1816.         const int src2= src[2 *srcStride];
  1817.         const int src3= src[3 *srcStride];
  1818.         const int src4= src[4 *srcStride];
  1819.         const int src5= src[5 *srcStride];
  1820.         const int src6= src[6 *srcStride];
  1821.         const int src7= src[7 *srcStride];
  1822.         const int src8= src[8 *srcStride];
  1823.         const int src9= src[9 *srcStride];
  1824.         const int src10=src[10*srcStride];
  1825.         OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));
  1826.         OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));
  1827.         OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));
  1828.         OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));
  1829.         OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7));
  1830.         OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8));
  1831.         OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9));
  1832.         OP(dst[7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10));
  1833.         dst++;
  1834.         src++;
  1835.     }
  1836. }
  1837. static void OPNAME ## h264_qpel8_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1838.     const int h=8;
  1839.     const int w=8;
  1840.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1841.     int i;
  1842.     src -= 2*srcStride;
  1843.     for(i=0; i<h+5; i++)
  1844.     {
  1845.         tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]);
  1846.         tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]);
  1847.         tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]);
  1848.         tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]);
  1849.         tmp[4]= (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]);
  1850.         tmp[5]= (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]);
  1851.         tmp[6]= (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]);
  1852.         tmp[7]= (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]);
  1853.         tmp+=tmpStride;
  1854.         src+=srcStride;
  1855.     }
  1856.     tmp -= tmpStride*(h+5-2);
  1857.     for(i=0; i<w; i++)
  1858.     {
  1859.         const int tmpB= tmp[-2*tmpStride];
  1860.         const int tmpA= tmp[-1*tmpStride];
  1861.         const int tmp0= tmp[0 *tmpStride];
  1862.         const int tmp1= tmp[1 *tmpStride];
  1863.         const int tmp2= tmp[2 *tmpStride];
  1864.         const int tmp3= tmp[3 *tmpStride];
  1865.         const int tmp4= tmp[4 *tmpStride];
  1866.         const int tmp5= tmp[5 *tmpStride];
  1867.         const int tmp6= tmp[6 *tmpStride];
  1868.         const int tmp7= tmp[7 *tmpStride];
  1869.         const int tmp8= tmp[8 *tmpStride];
  1870.         const int tmp9= tmp[9 *tmpStride];
  1871.         const int tmp10=tmp[10*tmpStride];
  1872.         OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1873.         OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1874.         OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1875.         OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1876.         OP2(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));
  1877.         OP2(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));
  1878.         OP2(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));
  1879.         OP2(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));
  1880.         dst++;
  1881.         tmp++;
  1882.     }
  1883. }
  1884. static void OPNAME ## h264_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1885.     OPNAME ## h264_qpel8_v_lowpass(dst  , src  , dstStride, srcStride);
  1886.     OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);
  1887.     src += 8*srcStride;
  1888.     dst += 8*dstStride;
  1889.     OPNAME ## h264_qpel8_v_lowpass(dst  , src  , dstStride, srcStride);
  1890.     OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);
  1891. }
  1892. static void OPNAME ## h264_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1893.     OPNAME ## h264_qpel8_h_lowpass(dst  , src  , dstStride, srcStride);
  1894.     OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);
  1895.     src += 8*srcStride;
  1896.     dst += 8*dstStride;
  1897.     OPNAME ## h264_qpel8_h_lowpass(dst  , src  , dstStride, srcStride);
  1898.     OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);
  1899. }
  1900. static void OPNAME ## h264_qpel16_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1901.     OPNAME ## h264_qpel8_hv_lowpass(dst  , tmp  , src  , dstStride, tmpStride, srcStride);
  1902.     OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);
  1903.     src += 8*srcStride;
  1904.     tmp += 8*tmpStride;
  1905.     dst += 8*dstStride;
  1906.     OPNAME ## h264_qpel8_hv_lowpass(dst  , tmp  , src  , dstStride, tmpStride, srcStride);
  1907.     OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);
  1908. }
  1909. #define H264_MC(OPNAME, SIZE) 
  1910. static void OPNAME ## h264_qpel ## SIZE ## _mc00_c (uint8_t *dst, uint8_t *src, int stride){
  1911.     OPNAME ## pixels ## SIZE ## _c(dst, src, stride, SIZE);
  1912. }
  1913. static void OPNAME ## h264_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, int stride){
  1914.     uint8_t half[SIZE*SIZE];
  1915.     put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);
  1916.     OPNAME ## pixels ## SIZE ## _l2(dst, src, half, stride, stride, SIZE, SIZE);
  1917. }
  1918. static void OPNAME ## h264_qpel ## SIZE ## _mc20_c(uint8_t *dst, uint8_t *src, int stride){
  1919.     OPNAME ## h264_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride);
  1920. }
  1921. static void OPNAME ## h264_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, int stride){
  1922.     uint8_t half[SIZE*SIZE];
  1923.     put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);
  1924.     OPNAME ## pixels ## SIZE ## _l2(dst, src+1, half, stride, stride, SIZE, SIZE);
  1925. }
  1926. static void OPNAME ## h264_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, int stride){
  1927.     uint8_t full[SIZE*(SIZE+5)];
  1928.     uint8_t * const full_mid= full + SIZE*2;
  1929.     uint8_t half[SIZE*SIZE];
  1930.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1931.     put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);
  1932.     OPNAME ## pixels ## SIZE ## _l2(dst, full_mid, half, stride, SIZE, SIZE, SIZE);
  1933. }
  1934. static void OPNAME ## h264_qpel ## SIZE ## _mc02_c(uint8_t *dst, uint8_t *src, int stride){
  1935.     uint8_t full[SIZE*(SIZE+5)];
  1936.     uint8_t * const full_mid= full + SIZE*2;
  1937.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1938.     OPNAME ## h264_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE);
  1939. }
  1940. static void OPNAME ## h264_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, int stride){
  1941.     uint8_t full[SIZE*(SIZE+5)];
  1942.     uint8_t * const full_mid= full + SIZE*2;
  1943.     uint8_t half[SIZE*SIZE];
  1944.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1945.     put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);
  1946.     OPNAME ## pixels ## SIZE ## _l2(dst, full_mid+SIZE, half, stride, SIZE, SIZE, SIZE);
  1947. }
  1948. static void OPNAME ## h264_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, int stride){
  1949.     uint8_t full[SIZE*(SIZE+5)];
  1950.     uint8_t * const full_mid= full + SIZE*2;
  1951.     uint8_t halfH[SIZE*SIZE];
  1952.     uint8_t halfV[SIZE*SIZE];
  1953.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1954.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1955.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1956.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1957. }
  1958. static void OPNAME ## h264_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, int stride){
  1959.     uint8_t full[SIZE*(SIZE+5)];
  1960.     uint8_t * const full_mid= full + SIZE*2;
  1961.     uint8_t halfH[SIZE*SIZE];
  1962.     uint8_t halfV[SIZE*SIZE];
  1963.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1964.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  1965.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1966.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1967. }
  1968. static void OPNAME ## h264_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, int stride){
  1969.     uint8_t full[SIZE*(SIZE+5)];
  1970.     uint8_t * const full_mid= full + SIZE*2;
  1971.     uint8_t halfH[SIZE*SIZE];
  1972.     uint8_t halfV[SIZE*SIZE];
  1973.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  1974.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1975.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1976.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1977. }
  1978. static void OPNAME ## h264_qpel ## SIZE ## _mc33_c(uint8_t *dst, uint8_t *src, int stride){
  1979.     uint8_t full[SIZE*(SIZE+5)];
  1980.     uint8_t * const full_mid= full + SIZE*2;
  1981.     uint8_t halfH[SIZE*SIZE];
  1982.     uint8_t halfV[SIZE*SIZE];
  1983.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  1984.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  1985.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1986.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1987. }
  1988. static void OPNAME ## h264_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1989.     int16_t tmp[SIZE*(SIZE+5)];
  1990.     OPNAME ## h264_qpel ## SIZE ## _hv_lowpass(dst, tmp, src, stride, SIZE, stride);
  1991. }
  1992. static void OPNAME ## h264_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, int stride){
  1993.     int16_t tmp[SIZE*(SIZE+5)];
  1994.     uint8_t halfH[SIZE*SIZE];
  1995.     uint8_t halfHV[SIZE*SIZE];
  1996.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1997.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  1998.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);
  1999. }
  2000. static void OPNAME ## h264_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, int stride){
  2001.     int16_t tmp[SIZE*(SIZE+5)];
  2002.     uint8_t halfH[SIZE*SIZE];
  2003.     uint8_t halfHV[SIZE*SIZE];
  2004.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  2005.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  2006.     OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);
  2007. }
  2008. static void OPNAME ## h264_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, int stride){
  2009.     uint8_t full[SIZE*(SIZE+5)];
  2010.     uint8_t * const full_mid= full + SIZE*2;
  2011.     int16_t tmp[SIZE*(SIZE+5)];
  2012.     uint8_t halfV[SIZE*SIZE];
  2013.     uint8_t halfHV[SIZE*SIZE];
  2014.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  2015.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  2016.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  2017.     OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);
  2018. }
  2019. static void OPNAME ## h264_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, int stride){
  2020.     uint8_t full[SIZE*(SIZE+5)];
  2021.     uint8_t * const full_mid= full + SIZE*2;
  2022.     int16_t tmp[SIZE*(SIZE+5)];
  2023.     uint8_t halfV[SIZE*SIZE];
  2024.     uint8_t halfHV[SIZE*SIZE];
  2025.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  2026.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  2027.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  2028.     OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);
  2029. }
  2030. #define op_avg(a, b)  a = (((a)+cm[((b) + 16)>>5]+1)>>1)
  2031. //#define op_avg2(a, b) a = (((a)*w1+cm[((b) + 16)>>5]*w2 + o + 64)>>7)
  2032. #define op_put(a, b)  a = cm[((b) + 16)>>5]
  2033. #define op2_avg(a, b)  a = (((a)+cm[((b) + 512)>>10]+1)>>1)
  2034. #define op2_put(a, b)  a = cm[((b) + 512)>>10]
  2035. H264_LOWPASS(put_       , op_put, op2_put)
  2036. H264_LOWPASS(avg_       , op_avg, op2_avg)
  2037. H264_MC(put_, 4)
  2038. H264_MC(put_, 8)
  2039. H264_MC(put_, 16)
  2040. H264_MC(avg_, 4)
  2041. H264_MC(avg_, 8)
  2042. H264_MC(avg_, 16)
  2043. #undef op_avg
  2044. #undef op_put
  2045. #undef op2_avg
  2046. #undef op2_put
  2047. #endif
  2048. static void wmv2_mspel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  2049.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  2050.     int i;
  2051.     for(i=0; i<h; i++){
  2052.         dst[0]= cm[(9*(src[0] + src[1]) - (src[-1] + src[2]) + 8)>>4];
  2053.         dst[1]= cm[(9*(src[1] + src[2]) - (src[ 0] + src[3]) + 8)>>4];
  2054.         dst[2]= cm[(9*(src[2] + src[3]) - (src[ 1] + src[4]) + 8)>>4];
  2055.         dst[3]= cm[(9*(src[3] + src[4]) - (src[ 2] + src[5]) + 8)>>4];
  2056.         dst[4]= cm[(9*(src[4] + src[5]) - (src[ 3] + src[6]) + 8)>>4];
  2057.         dst[5]= cm[(9*(src[5] + src[6]) - (src[ 4] + src[7]) + 8)>>4];
  2058.         dst[6]= cm[(9*(src[6] + src[7]) - (src[ 5] + src[8]) + 8)>>4];
  2059.         dst[7]= cm[(9*(src[7] + src[8]) - (src[ 6] + src[9]) + 8)>>4];
  2060.         dst+=dstStride;
  2061.         src+=srcStride;        
  2062.     }
  2063. }
  2064. static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){
  2065.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  2066.     int i;
  2067.     for(i=0; i<w; i++){
  2068.         const int src_1= src[ -srcStride];
  2069.         const int src0 = src[0          ];
  2070.         const int src1 = src[  srcStride];
  2071.         const int src2 = src[2*srcStride];
  2072.         const int src3 = src[3*srcStride];
  2073.         const int src4 = src[4*srcStride];
  2074.         const int src5 = src[5*srcStride];
  2075.         const int src6 = src[6*srcStride];
  2076.         const int src7 = src[7*srcStride];
  2077.         const int src8 = src[8*srcStride];
  2078.         const int src9 = src[9*srcStride];
  2079.         dst[0*dstStride]= cm[(9*(src0 + src1) - (src_1 + src2) + 8)>>4];
  2080.         dst[1*dstStride]= cm[(9*(src1 + src2) - (src0  + src3) + 8)>>4];
  2081.         dst[2*dstStride]= cm[(9*(src2 + src3) - (src1  + src4) + 8)>>4];
  2082.         dst[3*dstStride]= cm[(9*(src3 + src4) - (src2  + src5) + 8)>>4];
  2083.         dst[4*dstStride]= cm[(9*(src4 + src5) - (src3  + src6) + 8)>>4];
  2084.         dst[5*dstStride]= cm[(9*(src5 + src6) - (src4  + src7) + 8)>>4];
  2085.         dst[6*dstStride]= cm[(9*(src6 + src7) - (src5  + src8) + 8)>>4];
  2086.         dst[7*dstStride]= cm[(9*(src7 + src8) - (src6  + src9) + 8)>>4];
  2087.         src++;
  2088.         dst++;
  2089.     }
  2090. }
  2091. static void put_mspel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  2092.     put_pixels8_c(dst, src, stride, 8);
  2093. }
  2094. static void put_mspel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  2095.     uint8_t half[64];
  2096.     wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
  2097.     put_pixels8_l2(dst, src, half, stride, stride, 8, 8);
  2098. }
  2099. static void put_mspel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  2100.     wmv2_mspel8_h_lowpass(dst, src, stride, stride, 8);
  2101. }
  2102. static void put_mspel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  2103.     uint8_t half[64];
  2104.     wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
  2105.     put_pixels8_l2(dst, src+1, half, stride, stride, 8, 8);
  2106. }
  2107. static void put_mspel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  2108.     wmv2_mspel8_v_lowpass(dst, src, stride, stride, 8);
  2109. }
  2110. static void put_mspel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  2111.     uint8_t halfH[88];
  2112.     uint8_t halfV[64];
  2113.     uint8_t halfHV[64];
  2114.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  2115.     wmv2_mspel8_v_lowpass(halfV, src, 8, stride, 8);
  2116.     wmv2_mspel8_v_lowpass(halfHV, halfH+8, 8, 8, 8);
  2117.     put_pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);
  2118. }
  2119. static void put_mspel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  2120.     uint8_t halfH[88];
  2121.     uint8_t halfV[64];
  2122.     uint8_t halfHV[64];
  2123.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  2124.     wmv2_mspel8_v_lowpass(halfV, src+1, 8, stride, 8);
  2125.     wmv2_mspel8_v_lowpass(halfHV, halfH+8, 8, 8, 8);
  2126.     put_pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);
  2127. }
  2128. static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  2129.     uint8_t halfH[88];
  2130.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  2131.     wmv2_mspel8_v_lowpass(dst, halfH+8, stride, 8, 8);
  2132. }
  2133. static void h263_v_loop_filter_c(uint8_t *src, int stride, int qscale){
  2134.     int x;
  2135.     const int strength= ff_h263_loop_filter_strength[qscale];
  2136.     
  2137.     for(x=0; x<8; x++){
  2138.         int d1, d2, ad1;
  2139.         int p0= src[x-2*stride];
  2140.         int p1= src[x-1*stride];
  2141.         int p2= src[x+0*stride];
  2142.         int p3= src[x+1*stride];
  2143.         int d = (p0 - p3 + 4*(p2 - p1)) / 8;
  2144.         if     (d<-2*strength) d1= 0;
  2145.         else if(d<-  strength) d1=-2*strength - d;
  2146.         else if(d<   strength) d1= d;
  2147.         else if(d< 2*strength) d1= 2*strength - d;
  2148.         else                   d1= 0;
  2149.         
  2150.         p1 += d1;
  2151.         p2 -= d1;
  2152.         if(p1&256) p1= ~(p1>>31);
  2153.         if(p2&256) p2= ~(p2>>31);
  2154.         
  2155.         src[x-1*stride] = p1;
  2156.         src[x+0*stride] = p2;
  2157.         ad1= ABS(d1)>>1;
  2158.         
  2159.         d2= clip((p0-p3)/4, -ad1, ad1);
  2160.         
  2161.         src[x-2*stride] = p0 - d2;
  2162.         src[x+  stride] = p3 + d2;
  2163.     }
  2164. }
  2165. static void h263_h_loop_filter_c(uint8_t *src, int stride, int qscale){
  2166.     int y;
  2167.     const int strength= ff_h263_loop_filter_strength[qscale];
  2168.     
  2169.     for(y=0; y<8; y++){
  2170.         int d1, d2, ad1;
  2171.         int p0= src[y*stride-2];
  2172.         int p1= src[y*stride-1];
  2173.         int p2= src[y*stride+0];
  2174.         int p3= src[y*stride+1];
  2175.         int d = (p0 - p3 + 4*(p2 - p1)) / 8;
  2176.         if     (d<-2*strength) d1= 0;
  2177.         else if(d<-  strength) d1=-2*strength - d;
  2178.         else if(d<   strength) d1= d;
  2179.         else if(d< 2*strength) d1= 2*strength - d;
  2180.         else                   d1= 0;
  2181.         
  2182.         p1 += d1;
  2183.         p2 -= d1;
  2184.         if(p1&256) p1= ~(p1>>31);
  2185.         if(p2&256) p2= ~(p2>>31);
  2186.         
  2187.         src[y*stride-1] = p1;
  2188.         src[y*stride+0] = p2;
  2189.         ad1= ABS(d1)>>1;
  2190.         
  2191.         d2= clip((p0-p3)/4, -ad1, ad1);
  2192.         
  2193.         src[y*stride-2] = p0 - d2;
  2194.         src[y*stride+1] = p3 + d2;
  2195.     }
  2196. }
  2197. static void h261_loop_filter_c(uint8_t *src, int stride){
  2198.     int x,y,xy,yz;
  2199.     int temp[64];
  2200.     for(x=0; x<8; x++){
  2201.         temp[x      ] = 4*src[x           ];
  2202.         temp[x + 7*8] = 4*src[x + 7*stride];
  2203.     }
  2204.     for(y=1; y<7; y++){
  2205.         for(x=0; x<8; x++){
  2206.             xy = y * stride + x;
  2207.             yz = y * 8 + x;
  2208.             temp[yz] = src[xy - stride] + 2*src[xy] + src[xy + stride];
  2209.         }
  2210.     }
  2211.         
  2212.     for(y=0; y<8; y++){
  2213.         src[  y*stride] = (temp[  y*8] + 2)>>2;
  2214.         src[7+y*stride] = (temp[7+y*8] + 2)>>2;
  2215.         for(x=1; x<7; x++){
  2216.             xy = y * stride + x;
  2217.             yz = y * 8 + x;
  2218.             src[xy] = (temp[yz-1] + 2*temp[yz] + temp[yz+1] + 8)>>4;
  2219.         }
  2220.     }
  2221. }
  2222. static inline int pix_abs16_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2223. {
  2224.     int s, i;
  2225.     s = 0;
  2226.     for(i=0;i<h;i++) {
  2227.         s += abs(pix1[0] - pix2[0]);
  2228.         s += abs(pix1[1] - pix2[1]);
  2229.         s += abs(pix1[2] - pix2[2]);
  2230.         s += abs(pix1[3] - pix2[3]);
  2231.         s += abs(pix1[4] - pix2[4]);
  2232.         s += abs(pix1[5] - pix2[5]);
  2233.         s += abs(pix1[6] - pix2[6]);
  2234.         s += abs(pix1[7] - pix2[7]);
  2235.         s += abs(pix1[8] - pix2[8]);
  2236.         s += abs(pix1[9] - pix2[9]);
  2237.         s += abs(pix1[10] - pix2[10]);
  2238.         s += abs(pix1[11] - pix2[11]);
  2239.         s += abs(pix1[12] - pix2[12]);
  2240.         s += abs(pix1[13] - pix2[13]);
  2241.         s += abs(pix1[14] - pix2[14]);
  2242.         s += abs(pix1[15] - pix2[15]);
  2243.         pix1 += line_size;
  2244.         pix2 += line_size;
  2245.     }
  2246.     return s;
  2247. }
  2248. static int pix_abs16_x2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2249. {
  2250.     int s, i;
  2251.     s = 0;
  2252.     for(i=0;i<h;i++) {
  2253.         s += abs(pix1[0] - avg2(pix2[0], pix2[1]));
  2254.         s += abs(pix1[1] - avg2(pix2[1], pix2[2]));
  2255.         s += abs(pix1[2] - avg2(pix2[2], pix2[3]));
  2256.         s += abs(pix1[3] - avg2(pix2[3], pix2[4]));
  2257.         s += abs(pix1[4] - avg2(pix2[4], pix2[5]));
  2258.         s += abs(pix1[5] - avg2(pix2[5], pix2[6]));
  2259.         s += abs(pix1[6] - avg2(pix2[6], pix2[7]));
  2260.         s += abs(pix1[7] - avg2(pix2[7], pix2[8]));
  2261.         s += abs(pix1[8] - avg2(pix2[8], pix2[9]));
  2262.         s += abs(pix1[9] - avg2(pix2[9], pix2[10]));
  2263.         s += abs(pix1[10] - avg2(pix2[10], pix2[11]));
  2264.         s += abs(pix1[11] - avg2(pix2[11], pix2[12]));
  2265.         s += abs(pix1[12] - avg2(pix2[12], pix2[13]));
  2266.         s += abs(pix1[13] - avg2(pix2[13], pix2[14]));
  2267.         s += abs(pix1[14] - avg2(pix2[14], pix2[15]));
  2268.         s += abs(pix1[15] - avg2(pix2[15], pix2[16]));
  2269.         pix1 += line_size;
  2270.         pix2 += line_size;
  2271.     }
  2272.     return s;
  2273. }
  2274. static int pix_abs16_y2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2275. {
  2276.     int s, i;
  2277.     uint8_t *pix3 = pix2 + line_size;
  2278.     s = 0;
  2279.     for(i=0;i<h;i++) {
  2280.         s += abs(pix1[0] - avg2(pix2[0], pix3[0]));
  2281.         s += abs(pix1[1] - avg2(pix2[1], pix3[1]));
  2282.         s += abs(pix1[2] - avg2(pix2[2], pix3[2]));
  2283.         s += abs(pix1[3] - avg2(pix2[3], pix3[3]));
  2284.         s += abs(pix1[4] - avg2(pix2[4], pix3[4]));
  2285.         s += abs(pix1[5] - avg2(pix2[5], pix3[5]));
  2286.         s += abs(pix1[6] - avg2(pix2[6], pix3[6]));
  2287.         s += abs(pix1[7] - avg2(pix2[7], pix3[7]));
  2288.         s += abs(pix1[8] - avg2(pix2[8], pix3[8]));
  2289.         s += abs(pix1[9] - avg2(pix2[9], pix3[9]));
  2290.         s += abs(pix1[10] - avg2(pix2[10], pix3[10]));
  2291.         s += abs(pix1[11] - avg2(pix2[11], pix3[11]));
  2292.         s += abs(pix1[12] - avg2(pix2[12], pix3[12]));
  2293.         s += abs(pix1[13] - avg2(pix2[13], pix3[13]));
  2294.         s += abs(pix1[14] - avg2(pix2[14], pix3[14]));
  2295.         s += abs(pix1[15] - avg2(pix2[15], pix3[15]));
  2296.         pix1 += line_size;
  2297.         pix2 += line_size;
  2298.         pix3 += line_size;
  2299.     }
  2300.     return s;
  2301. }
  2302. static int pix_abs16_xy2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2303. {
  2304.     int s, i;
  2305.     uint8_t *pix3 = pix2 + line_size;
  2306.     s = 0;
  2307.     for(i=0;i<h;i++) {
  2308.         s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1]));
  2309.         s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2]));
  2310.         s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3]));
  2311.         s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4]));
  2312.         s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5]));
  2313.         s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6]));
  2314.         s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7]));
  2315.         s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8]));
  2316.         s += abs(pix1[8] - avg4(pix2[8], pix2[9], pix3[8], pix3[9]));
  2317.         s += abs(pix1[9] - avg4(pix2[9], pix2[10], pix3[9], pix3[10]));
  2318.         s += abs(pix1[10] - avg4(pix2[10], pix2[11], pix3[10], pix3[11]));
  2319.         s += abs(pix1[11] - avg4(pix2[11], pix2[12], pix3[11], pix3[12]));
  2320.         s += abs(pix1[12] - avg4(pix2[12], pix2[13], pix3[12], pix3[13]));
  2321.         s += abs(pix1[13] - avg4(pix2[13], pix2[14], pix3[13], pix3[14]));
  2322.         s += abs(pix1[14] - avg4(pix2[14], pix2[15], pix3[14], pix3[15]));
  2323.         s += abs(pix1[15] - avg4(pix2[15], pix2[16], pix3[15], pix3[16]));
  2324.         pix1 += line_size;
  2325.         pix2 += line_size;
  2326.         pix3 += line_size;
  2327.     }
  2328.     return s;
  2329. }
  2330. static inline int pix_abs8_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2331. {
  2332.     int s, i;
  2333.     s = 0;
  2334.     for(i=0;i<h;i++) {
  2335.         s += abs(pix1[0] - pix2[0]);
  2336.         s += abs(pix1[1] - pix2[1]);
  2337.         s += abs(pix1[2] - pix2[2]);
  2338.         s += abs(pix1[3] - pix2[3]);
  2339.         s += abs(pix1[4] - pix2[4]);
  2340.         s += abs(pix1[5] - pix2[5]);
  2341.         s += abs(pix1[6] - pix2[6]);
  2342.         s += abs(pix1[7] - pix2[7]);
  2343.         pix1 += line_size;
  2344.         pix2 += line_size;
  2345.     }
  2346.     return s;
  2347. }
  2348. static int pix_abs8_x2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2349. {
  2350.     int s, i;
  2351.     s = 0;
  2352.     for(i=0;i<h;i++) {
  2353.         s += abs(pix1[0] - avg2(pix2[0], pix2[1]));
  2354.         s += abs(pix1[1] - avg2(pix2[1], pix2[2]));
  2355.         s += abs(pix1[2] - avg2(pix2[2], pix2[3]));
  2356.         s += abs(pix1[3] - avg2(pix2[3], pix2[4]));
  2357.         s += abs(pix1[4] - avg2(pix2[4], pix2[5]));
  2358.         s += abs(pix1[5] - avg2(pix2[5], pix2[6]));
  2359.         s += abs(pix1[6] - avg2(pix2[6], pix2[7]));
  2360.         s += abs(pix1[7] - avg2(pix2[7], pix2[8]));
  2361.         pix1 += line_size;
  2362.         pix2 += line_size;
  2363.     }
  2364.     return s;
  2365. }
  2366. static int pix_abs8_y2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2367. {
  2368.     int s, i;
  2369.     uint8_t *pix3 = pix2 + line_size;
  2370.     s = 0;
  2371.     for(i=0;i<h;i++) {
  2372.         s += abs(pix1[0] - avg2(pix2[0], pix3[0]));
  2373.         s += abs(pix1[1] - avg2(pix2[1], pix3[1]));
  2374.         s += abs(pix1[2] - avg2(pix2[2], pix3[2]));
  2375.         s += abs(pix1[3] - avg2(pix2[3], pix3[3]));
  2376.         s += abs(pix1[4] - avg2(pix2[4], pix3[4]));
  2377.         s += abs(pix1[5] - avg2(pix2[5], pix3[5]));
  2378.         s += abs(pix1[6] - avg2(pix2[6], pix3[6]));
  2379.         s += abs(pix1[7] - avg2(pix2[7], pix3[7]));
  2380.         pix1 += line_size;
  2381.         pix2 += line_size;
  2382.         pix3 += line_size;
  2383.     }
  2384.     return s;
  2385. }
  2386. static int pix_abs8_xy2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
  2387. {
  2388.     int s, i;
  2389.     uint8_t *pix3 = pix2 + line_size;
  2390.     s = 0;
  2391.     for(i=0;i<h;i++) {
  2392.         s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1]));
  2393.         s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2]));
  2394.         s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3]));
  2395.         s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4]));
  2396.         s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5]));
  2397.         s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6]));
  2398.         s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7]));
  2399.         s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8]));
  2400.         pix1 += line_size;
  2401.         pix2 += line_size;
  2402.         pix3 += line_size;
  2403.     }
  2404.     return s;
  2405. }
  2406. static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h){
  2407.     int score1=0;
  2408.     int score2=0;
  2409.     int x,y;
  2410.     for(y=0; y<h; y++){
  2411.         for(x=0; x<16; x++){
  2412.             score1+= (s1[x  ] - s2[x ])*(s1[x  ] - s2[x ]);
  2413.         }
  2414.         if(y+1<h){
  2415.             for(x=0; x<15; x++){
  2416.                 score2+= ABS(  s1[x  ] - s1[x  +stride]
  2417.                              - s1[x+1] + s1[x+1+stride])
  2418.                         -ABS(  s2[x  ] - s2[x  +stride]
  2419.                              - s2[x+1] + s2[x+1+stride]);
  2420.             }
  2421.         }
  2422.         s1+= stride;
  2423.         s2+= stride;
  2424.     }
  2425.     if(c) return score1 + ABS(score2)*c->avctx->nsse_weight;
  2426.     else  return score1 + ABS(score2)*8;
  2427. }
  2428. static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h){
  2429.     int score1=0;
  2430.     int score2=0;
  2431.     int x,y;
  2432.     
  2433.     for(y=0; y<h; y++){
  2434.         for(x=0; x<8; x++){
  2435.             score1+= (s1[x  ] - s2[x ])*(s1[x  ] - s2[x ]);
  2436.         }
  2437.         if(y+1<h){
  2438.             for(x=0; x<7; x++){
  2439.                 score2+= ABS(  s1[x  ] - s1[x  +stride]
  2440.                              - s1[x+1] + s1[x+1+stride])
  2441.                         -ABS(  s2[x  ] - s2[x  +stride]
  2442.                              - s2[x+1] + s2[x+1+stride]);
  2443.             }
  2444.         }
  2445.         s1+= stride;
  2446.         s2+= stride;
  2447.     }
  2448.     
  2449.     if(c) return score1 + ABS(score2)*c->avctx->nsse_weight;
  2450.     else  return score1 + ABS(score2)*8;
  2451. }
  2452. static int try_8x8basis_c(int16_t rem[64], int16_t weight[64], int16_t basis[64], int scale){
  2453.     int i;
  2454.     unsigned int sum=0;
  2455.     for(i=0; i<8*8; i++){
  2456.         int b= rem[i] + ((basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT));
  2457.         int w= weight[i];
  2458.         b>>= RECON_SHIFT;
  2459.         assert(-512<b && b<512);
  2460.         sum += (w*b)*(w*b)>>4;
  2461.     }
  2462.     return sum>>2;
  2463. }
  2464. static void add_8x8basis_c(int16_t rem[64], int16_t basis[64], int scale){
  2465.     int i;
  2466.     for(i=0; i<8*8; i++){
  2467.         rem[i] += (basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT);
  2468.     }    
  2469. }
  2470. /**
  2471.  * permutes an 8x8 block.
  2472.  * @param block the block which will be permuted according to the given permutation vector
  2473.  * @param permutation the permutation vector
  2474.  * @param last the last non zero coefficient in scantable order, used to speed the permutation up
  2475.  * @param scantable the used scantable, this is only used to speed the permutation up, the block is not 
  2476.  *                  (inverse) permutated to scantable order!
  2477.  */
  2478. void ff_block_permute(DCTELEM *block, uint8_t *permutation, const uint8_t *scantable, int last)
  2479. {
  2480.     int i;
  2481.     DCTELEM temp[64];
  2482.     
  2483.     if(last<=0) return;
  2484.     //if(permutation[1]==1) return; //FIXME its ok but not clean and might fail for some perms
  2485.     for(i=0; i<=last; i++){
  2486.         const int j= scantable[i];
  2487.         temp[j]= block[j];
  2488.         block[j]=0;
  2489.     }
  2490.     
  2491.     for(i=0; i<=last; i++){
  2492.         const int j= scantable[i];
  2493.         const int perm_j= permutation[j];
  2494.         block[perm_j]= temp[j];
  2495.     }
  2496. }
  2497. static int zero_cmp(void *s, uint8_t *a, uint8_t *b, int stride, int h){
  2498.     return 0;
  2499. }
  2500. void ff_set_cmp(DSPContext* c, me_cmp_func *cmp, int type){
  2501.     int i;
  2502.     
  2503.     memset(cmp, 0, sizeof(void*)*5);
  2504.         
  2505.     for(i=0; i<5; i++){
  2506.         switch(type&0xFF){
  2507.         case FF_CMP_SAD:
  2508.             cmp[i]= c->sad[i];
  2509.             break;
  2510.         case FF_CMP_SATD:
  2511.             cmp[i]= c->hadamard8_diff[i];
  2512.             break;
  2513.         case FF_CMP_SSE:
  2514.             cmp[i]= c->sse[i];
  2515.             break;
  2516.         case FF_CMP_DCT:
  2517.             cmp[i]= c->dct_sad[i];
  2518.             break;
  2519.         case FF_CMP_PSNR:
  2520.             cmp[i]= c->quant_psnr[i];
  2521.             break;
  2522.         case FF_CMP_BIT:
  2523.             cmp[i]= c->bit[i];
  2524.             break;
  2525.         case FF_CMP_RD:
  2526.             cmp[i]= c->rd[i];
  2527.             break;
  2528.         case FF_CMP_VSAD:
  2529.             cmp[i]= c->vsad[i];
  2530.             break;
  2531.         case FF_CMP_VSSE:
  2532.             cmp[i]= c->vsse[i];
  2533.             break;
  2534.         case FF_CMP_ZERO:
  2535.             cmp[i]= zero_cmp;
  2536.             break;
  2537.         case FF_CMP_NSSE:
  2538.             cmp[i]= c->nsse[i];
  2539.             break;
  2540.         default:
  2541.             av_log(NULL, AV_LOG_ERROR,"internal error in cmp function selectionn");
  2542.         }
  2543.     }
  2544. }
  2545. /**
  2546.  * memset(blocks, 0, sizeof(DCTELEM)*6*64)
  2547.  */
  2548. static void clear_blocks_c(DCTELEM *blocks)
  2549. {
  2550.     memset(blocks, 0, sizeof(DCTELEM)*6*64);
  2551. }
  2552. static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){
  2553.     int i;
  2554.     for(i=0; i+7<w; i+=8){
  2555.         dst[i+0] += src[i+0];
  2556.         dst[i+1] += src[i+1];
  2557.         dst[i+2] += src[i+2];
  2558.         dst[i+3] += src[i+3];
  2559.         dst[i+4] += src[i+4];
  2560.         dst[i+5] += src[i+5];
  2561.         dst[i+6] += src[i+6];
  2562.         dst[i+7] += src[i+7];
  2563.     }
  2564.     for(; i<w; i++)
  2565.         dst[i+0] += src[i+0];
  2566. }
  2567. static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
  2568.     int i;
  2569.     for(i=0; i+7<w; i+=8){
  2570.         dst[i+0] = src1[i+0]-src2[i+0];
  2571.         dst[i+1] = src1[i+1]-src2[i+1];
  2572.         dst[i+2] = src1[i+2]-src2[i+2];
  2573.         dst[i+3] = src1[i+3]-src2[i+3];
  2574.         dst[i+4] = src1[i+4]-src2[i+4];
  2575.         dst[i+5] = src1[i+5]-src2[i+5];
  2576.         dst[i+6] = src1[i+6]-src2[i+6];
  2577.         dst[i+7] = src1[i+7]-src2[i+7];
  2578.     }
  2579.     for(; i<w; i++)
  2580.         dst[i+0] = src1[i+0]-src2[i+0];
  2581. }
  2582. static void sub_hfyu_median_prediction_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top){
  2583.     int i;
  2584.     uint8_t l, lt;
  2585.     l= *left;
  2586.     lt= *left_top;
  2587.     for(i=0; i<w; i++){
  2588.         const int pred= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF);
  2589.         lt= src1[i];
  2590.         l= src2[i];
  2591.         dst[i]= l - pred;
  2592.     }    
  2593.     *left= l;
  2594.     *left_top= lt;
  2595. }
  2596. #define BUTTERFLY2(o1,o2,i1,i2) 
  2597. o1= (i1)+(i2);
  2598. o2= (i1)-(i2);
  2599. #define BUTTERFLY1(x,y) 
  2600. {
  2601.     int a,b;
  2602.     a= x;
  2603.     b= y;
  2604.     x= a+b;
  2605.     y= a-b;
  2606. }
  2607. #define BUTTERFLYA(x,y) (ABS((x)+(y)) + ABS((x)-(y)))
  2608. static int hadamard8_diff8x8_c(/*MpegEncContext*/ void *s, uint8_t *dst, uint8_t *src, int stride, int h){
  2609.     int i;
  2610.     int temp[64];
  2611.     int sum=0;
  2612.     
  2613.     assert(h==8);
  2614.     for(i=0; i<8; i++){
  2615.         //FIXME try pointer walks
  2616.         BUTTERFLY2(temp[8*i+0], temp[8*i+1], src[stride*i+0]-dst[stride*i+0],src[stride*i+1]-dst[stride*i+1]);
  2617.         BUTTERFLY2(temp[8*i+2], temp[8*i+3], src[stride*i+2]-dst[stride*i+2],src[stride*i+3]-dst[stride*i+3]);
  2618.         BUTTERFLY2(temp[8*i+4], temp[8*i+5], src[stride*i+4]-dst[stride*i+4],src[stride*i+5]-dst[stride*i+5]);
  2619.         BUTTERFLY2(temp[8*i+6], temp[8*i+7], src[stride*i+6]-dst[stride*i+6],src[stride*i+7]-dst[stride*i+7]);
  2620.         
  2621.         BUTTERFLY1(temp[8*i+0], temp[8*i+2]);
  2622.         BUTTERFLY1(temp[8*i+1], temp[8*i+3]);
  2623.         BUTTERFLY1(temp[8*i+4], temp[8*i+6]);
  2624.         BUTTERFLY1(temp[8*i+5], temp[8*i+7]);
  2625.         
  2626.         BUTTERFLY1(temp[8*i+0], temp[8*i+4]);
  2627.         BUTTERFLY1(temp[8*i+1], temp[8*i+5]);
  2628.         BUTTERFLY1(temp[8*i+2], temp[8*i+6]);
  2629.         BUTTERFLY1(temp[8*i+3], temp[8*i+7]);
  2630.     }
  2631.     for(i=0; i<8; i++){
  2632.         BUTTERFLY1(temp[8*0+i], temp[8*1+i]);
  2633.         BUTTERFLY1(temp[8*2+i], temp[8*3+i]);
  2634.         BUTTERFLY1(temp[8*4+i], temp[8*5+i]);
  2635.         BUTTERFLY1(temp[8*6+i], temp[8*7+i]);
  2636.         
  2637.         BUTTERFLY1(temp[8*0+i], temp[8*2+i]);
  2638.         BUTTERFLY1(temp[8*1+i], temp[8*3+i]);
  2639.         BUTTERFLY1(temp[8*4+i], temp[8*6+i]);
  2640.         BUTTERFLY1(temp[8*5+i], temp[8*7+i]);
  2641.         sum += 
  2642.              BUTTERFLYA(temp[8*0+i], temp[8*4+i])
  2643.             +BUTTERFLYA(temp[8*1+i], temp[8*5+i])
  2644.             +BUTTERFLYA(temp[8*2+i], temp[8*6+i])
  2645.             +BUTTERFLYA(temp[8*3+i], temp[8*7+i]);
  2646.     }
  2647. #if 0
  2648. static int maxi=0;
  2649. if(sum>maxi){
  2650.     maxi=sum;
  2651.     printf("MAX:%dn", maxi);
  2652. }
  2653. #endif
  2654.     return sum;
  2655. }
  2656. static int hadamard8_intra8x8_c(/*MpegEncContext*/ void *s, uint8_t *src, uint8_t *dummy, int stride, int h){
  2657.     int i;
  2658.     int temp[64];
  2659.     int sum=0;
  2660.     
  2661.     assert(h==8);
  2662.     
  2663.     for(i=0; i<8; i++){
  2664.         //FIXME try pointer walks
  2665.         BUTTERFLY2(temp[8*i+0], temp[8*i+1], src[stride*i+0],src[stride*i+1]);
  2666.         BUTTERFLY2(temp[8*i+2], temp[8*i+3], src[stride*i+2],src[stride*i+3]);
  2667.         BUTTERFLY2(temp[8*i+4], temp[8*i+5], src[stride*i+4],src[stride*i+5]);
  2668.         BUTTERFLY2(temp[8*i+6], temp[8*i+7], src[stride*i+6],src[stride*i+7]);
  2669.         
  2670.         BUTTERFLY1(temp[8*i+0], temp[8*i+2]);
  2671.         BUTTERFLY1(temp[8*i+1], temp[8*i+3]);
  2672.         BUTTERFLY1(temp[8*i+4], temp[8*i+6]);
  2673.         BUTTERFLY1(temp[8*i+5], temp[8*i+7]);
  2674.         
  2675.         BUTTERFLY1(temp[8*i+0], temp[8*i+4]);
  2676.         BUTTERFLY1(temp[8*i+1], temp[8*i+5]);
  2677.         BUTTERFLY1(temp[8*i+2], temp[8*i+6]);
  2678.         BUTTERFLY1(temp[8*i+3], temp[8*i+7]);
  2679.     }
  2680.     for(i=0; i<8; i++){
  2681.         BUTTERFLY1(temp[8*0+i], temp[8*1+i]);
  2682.         BUTTERFLY1(temp[8*2+i], temp[8*3+i]);
  2683.         BUTTERFLY1(temp[8*4+i], temp[8*5+i]);
  2684.         BUTTERFLY1(temp[8*6+i], temp[8*7+i]);
  2685.         
  2686.         BUTTERFLY1(temp[8*0+i], temp[8*2+i]);
  2687.         BUTTERFLY1(temp[8*1+i], temp[8*3+i]);
  2688.         BUTTERFLY1(temp[8*4+i], temp[8*6+i]);
  2689.         BUTTERFLY1(temp[8*5+i], temp[8*7+i]);
  2690.     
  2691.         sum += 
  2692.              BUTTERFLYA(temp[8*0+i], temp[8*4+i])
  2693.             +BUTTERFLYA(temp[8*1+i], temp[8*5+i])
  2694.             +BUTTERFLYA(temp[8*2+i], temp[8*6+i])
  2695.             +BUTTERFLYA(temp[8*3+i], temp[8*7+i]);
  2696.     }
  2697.     
  2698.     sum -= ABS(temp[8*0] + temp[8*4]); // -mean
  2699.     
  2700.     return sum;
  2701. }
  2702. static int dct_sad8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride, int h){
  2703.     MpegEncContext * const s= (MpegEncContext *)c;
  2704.     uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64/8];
  2705.     DCTELEM * const temp= (DCTELEM*)aligned_temp;
  2706.     int sum=0, i;
  2707.     
  2708.     assert(h==8);
  2709.     s->dsp.diff_pixels(temp, src1, src2, stride);
  2710.     s->dsp.fdct(temp);
  2711.     for(i=0; i<64; i++)
  2712.         sum+= ABS(temp[i]);
  2713.         
  2714.     return sum;
  2715. }
  2716. void simple_idct(DCTELEM *block); //FIXME
  2717. static int quant_psnr8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride, int h){
  2718.     MpegEncContext * const s= (MpegEncContext *)c;
  2719.     uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64*2/8];
  2720.     DCTELEM * const temp= (DCTELEM*)aligned_temp;
  2721.     DCTELEM * const bak = ((DCTELEM*)aligned_temp)+64;
  2722.     int sum=0, i;
  2723.     assert(h==8);
  2724.     s->mb_intra=0;
  2725.     
  2726.     s->dsp.diff_pixels(temp, src1, src2, stride);
  2727.     
  2728.     memcpy(bak, temp, 64*sizeof(DCTELEM));
  2729.     
  2730.     s->block_last_index[0/*FIXME*/]= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
  2731.     s->dct_unquantize_inter(s, temp, 0, s->qscale);
  2732.     simple_idct(temp); //FIXME 
  2733.     
  2734.     for(i=0; i<64; i++)
  2735.         sum+= (temp[i]-bak[i])*(temp[i]-bak[i]);
  2736.         
  2737.     return sum;
  2738. }
  2739. static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride, int h){
  2740.     MpegEncContext * const s= (MpegEncContext *)c;
  2741.     const uint8_t *scantable= s->intra_scantable.permutated;
  2742.     uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64/8];
  2743. //    uint64_t __align8 aligned_bak[stride];
  2744.     uint64_t __align8 aligned_bak[128];
  2745.     DCTELEM * const temp= (DCTELEM*)aligned_temp;
  2746.     uint8_t * const bak= (uint8_t*)aligned_bak;
  2747.     int i, last, run, bits, level, distoration, start_i;
  2748.     const int esc_length= s->ac_esc_length;
  2749.     uint8_t * length;
  2750.     uint8_t * last_length;
  2751.     
  2752.     assert(h==8);
  2753.     for(i=0; i<8; i++){
  2754.         ((uint32_t*)(bak + i*stride))[0]= ((uint32_t*)(src2 + i*stride))[0];
  2755.         ((uint32_t*)(bak + i*stride))[1]= ((uint32_t*)(src2 + i*stride))[1];
  2756.     }
  2757.     s->dsp.diff_pixels(temp, src1, src2, stride);
  2758.     s->block_last_index[0/*FIXME*/]= last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
  2759.     bits=0;
  2760.     
  2761.     if (s->mb_intra) {
  2762.         start_i = 1; 
  2763.         length     = s->intra_ac_vlc_length;
  2764.         last_length= s->intra_ac_vlc_last_length;
  2765.         bits+= s->luma_dc_vlc_length[temp[0] + 256]; //FIXME chroma
  2766.     } else {
  2767.         start_i = 0;
  2768.         length     = s->inter_ac_vlc_length;
  2769.         last_length= s->inter_ac_vlc_last_length;
  2770.     }
  2771.     
  2772.     if(last>=start_i){
  2773.         run=0;
  2774.         for(i=start_i; i<last; i++){
  2775.             int j= scantable[i];
  2776.             level= temp[j];
  2777.         
  2778.             if(level){
  2779.                 level+=64;
  2780.                 if((level&(~127)) == 0){
  2781.                     bits+= length[UNI_AC_ENC_INDEX(run, level)];
  2782.                 }else
  2783.                     bits+= esc_length;
  2784.                 run=0;
  2785.             }else
  2786.                 run++;
  2787.         }
  2788.         i= scantable[last];
  2789.        
  2790.         level= temp[i] + 64;
  2791.         assert(level - 64);
  2792.         
  2793.         if((level&(~127)) == 0){
  2794.             bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
  2795.         }else
  2796.             bits+= esc_length;
  2797.     
  2798.     }
  2799.     if(last>=0){
  2800.         if(s->mb_intra)
  2801.             s->dct_unquantize_intra(s, temp, 0, s->qscale);
  2802.         else
  2803.             s->dct_unquantize_inter(s, temp, 0, s->qscale);
  2804.     }
  2805.     
  2806.     s->dsp.idct_add(bak, stride, temp);
  2807.     
  2808.     distoration= s->dsp.sse[1](NULL, bak, src1, stride, 8);
  2809.     return distoration + ((bits*s->qscale*s->qscale*109 + 64)>>7);
  2810. }
  2811. static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride, int h){
  2812.     MpegEncContext * const s= (MpegEncContext *)c;
  2813.     const uint8_t *scantable= s->intra_scantable.permutated;
  2814.     uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64/8];
  2815.     DCTELEM * const temp= (DCTELEM*)aligned_temp;
  2816.     int i, last, run, bits, level, start_i;
  2817.     const int esc_length= s->ac_esc_length;
  2818.     uint8_t * length;
  2819.     uint8_t * last_length;
  2820.     assert(h==8);
  2821.     
  2822.     s->dsp.diff_pixels(temp, src1, src2, stride);
  2823.     s->block_last_index[0/*FIXME*/]= last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
  2824.     bits=0;
  2825.     
  2826.     if (s->mb_intra) {
  2827.         start_i = 1; 
  2828.         length     = s->intra_ac_vlc_length;
  2829.         last_length= s->intra_ac_vlc_last_length;
  2830.         bits+= s->luma_dc_vlc_length[temp[0] + 256]; //FIXME chroma
  2831.     } else {
  2832.         start_i = 0;
  2833.         length     = s->inter_ac_vlc_length;
  2834.         last_length= s->inter_ac_vlc_last_length;
  2835.     }
  2836.     
  2837.     if(last>=start_i){
  2838.         run=0;
  2839.         for(i=start_i; i<last; i++){
  2840.             int j= scantable[i];
  2841.             level= temp[j];
  2842.         
  2843.             if(level){
  2844.                 level+=64;
  2845.                 if((level&(~127)) == 0){
  2846.                     bits+= length[UNI_AC_ENC_INDEX(run, level)];
  2847.                 }else
  2848.                     bits+= esc_length;
  2849.                 run=0;
  2850.             }else
  2851.                 run++;
  2852.         }
  2853.         i= scantable[last];
  2854.                 
  2855.         level= temp[i] + 64;
  2856.         
  2857.         assert(level - 64);
  2858.         
  2859.         if((level&(~127)) == 0){
  2860.             bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
  2861.         }else
  2862.             bits+= esc_length;
  2863.     }
  2864.     return bits;
  2865. }
  2866. static int vsad_intra16_c(/*MpegEncContext*/ void *c, uint8_t *s, uint8_t *dummy, int stride, int h){
  2867.     int score=0;
  2868.     int x,y;
  2869.     
  2870.     for(y=1; y<h; y++){
  2871.         for(x=0; x<16; x+=4){
  2872.             score+= ABS(s[x  ] - s[x  +stride]) + ABS(s[x+1] - s[x+1+stride]) 
  2873.                    +ABS(s[x+2] - s[x+2+stride]) + ABS(s[x+3] - s[x+3+stride]);
  2874.         }
  2875.         s+= stride;
  2876.     }
  2877.     
  2878.     return score;
  2879. }
  2880. static int vsad16_c(/*MpegEncContext*/ void *c, uint8_t *s1, uint8_t *s2, int stride, int h){
  2881.     int score=0;
  2882.     int x,y;
  2883.     
  2884.     for(y=1; y<h; y++){
  2885.         for(x=0; x<16; x++){
  2886.             score+= ABS(s1[x  ] - s2[x ] - s1[x  +stride] + s2[x +stride]);
  2887.         }
  2888.         s1+= stride;
  2889.         s2+= stride;
  2890.     }
  2891.     
  2892.     return score;
  2893. }
  2894. #define SQ(a) ((a)*(a))
  2895. static int vsse_intra16_c(/*MpegEncContext*/ void *c, uint8_t *s, uint8_t *dummy, int stride, int h){
  2896.     int score=0;
  2897.     int x,y;
  2898.     
  2899.     for(y=1; y<h; y++){
  2900.         for(x=0; x<16; x+=4){
  2901.             score+= SQ(s[x  ] - s[x  +stride]) + SQ(s[x+1] - s[x+1+stride]) 
  2902.                    +SQ(s[x+2] - s[x+2+stride]) + SQ(s[x+3] - s[x+3+stride]);
  2903.         }
  2904.         s+= stride;
  2905.     }
  2906.     
  2907.     return score;
  2908. }
  2909. static int vsse16_c(/*MpegEncContext*/ void *c, uint8_t *s1, uint8_t *s2, int stride, int h){
  2910.     int score=0;
  2911.     int x,y;
  2912.     
  2913.     for(y=1; y<h; y++){
  2914.         for(x=0; x<16; x++){
  2915.             score+= SQ(s1[x  ] - s2[x ] - s1[x  +stride] + s2[x +stride]);
  2916.         }
  2917.         s1+= stride;
  2918.         s2+= stride;
  2919.     }
  2920.     
  2921.     return score;
  2922. }
  2923. WARPER8_16_SQ(hadamard8_diff8x8_c, hadamard8_diff16_c)
  2924. WARPER8_16_SQ(hadamard8_intra8x8_c, hadamard8_intra16_c)
  2925. WARPER8_16_SQ(dct_sad8x8_c, dct_sad16_c)
  2926. WARPER8_16_SQ(quant_psnr8x8_c, quant_psnr16_c)
  2927. WARPER8_16_SQ(rd8x8_c, rd16_c)
  2928. WARPER8_16_SQ(bit8x8_c, bit16_c)
  2929. /* XXX: those functions should be suppressed ASAP when all IDCTs are
  2930.  converted */
  2931. static void ff_jref_idct_put(uint8_t *dest, int line_size, DCTELEM *block)
  2932. {
  2933.     j_rev_dct (block);
  2934.     put_pixels_clamped_c(block, dest, line_size);
  2935. }
  2936. static void ff_jref_idct_add(uint8_t *dest, int line_size, DCTELEM *block)
  2937. {
  2938.     j_rev_dct (block);
  2939.     add_pixels_clamped_c(block, dest, line_size);
  2940. }
  2941. /* init static data */
  2942. void dsputil_static_init(void)
  2943. {
  2944.     int i;
  2945.     for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
  2946.     for(i=0;i<MAX_NEG_CROP;i++) {
  2947.         cropTbl[i] = 0;
  2948.         cropTbl[i + MAX_NEG_CROP + 256] = 255;
  2949.     }
  2950.     
  2951.     for(i=0;i<512;i++) {
  2952.         squareTbl[i] = (i - 256) * (i - 256);
  2953.     }
  2954.     
  2955.     for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
  2956. }
  2957. void dsputil_init(DSPContext* c, AVCodecContext *avctx)
  2958. {
  2959.     int i;
  2960. #ifdef CONFIG_ENCODERS
  2961.     if(avctx->dct_algo==FF_DCT_FASTINT) {
  2962.         c->fdct = fdct_ifast;
  2963. c->fdct248 = fdct_ifast248;
  2964.     } 
  2965.     else if(avctx->dct_algo==FF_DCT_FAAN) {
  2966.         c->fdct = ff_faandct;
  2967. c->fdct248 = ff_faandct248; 
  2968.     } 
  2969.     else {
  2970.         c->fdct = ff_jpeg_fdct_islow; //slow/accurate/default
  2971. c->fdct248 = ff_fdct248_islow;
  2972.     }
  2973. #endif //CONFIG_ENCODERS
  2974.     if(avctx->idct_algo==FF_IDCT_INT){
  2975.         c->idct_put= ff_jref_idct_put;
  2976.         c->idct_add= ff_jref_idct_add;
  2977.         c->idct    = j_rev_dct;
  2978.         c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;
  2979.     }else{ //accurate/default
  2980.         c->idct_put= simple_idct_put;
  2981.         c->idct_add= simple_idct_add;
  2982.         c->idct    = simple_idct;
  2983.         c->idct_permutation_type= FF_NO_IDCT_PERM;
  2984.     }
  2985.     // VP3 DSP support 
  2986.     c->vp3_dsp_init = vp3_dsp_init_c;
  2987.     c->vp3_idct = vp3_idct_c;
  2988.     c->get_pixels = get_pixels_c;
  2989.     c->diff_pixels = diff_pixels_c;
  2990.     c->put_pixels_clamped = put_pixels_clamped_c;
  2991.     c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
  2992.     c->add_pixels_clamped = add_pixels_clamped_c;
  2993.     c->gmc1 = gmc1_c;
  2994.     c->gmc = gmc_c;
  2995.     c->clear_blocks = clear_blocks_c;
  2996.     c->pix_sum = pix_sum_c;
  2997.     c->pix_norm1 = pix_norm1_c;
  2998.     // TODO [0] 16  [1] 8 
  2999.     c->pix_abs[0][0] = pix_abs16_c;
  3000.     c->pix_abs[0][1] = pix_abs16_x2_c;
  3001.     c->pix_abs[0][2] = pix_abs16_y2_c;
  3002.     c->pix_abs[0][3] = pix_abs16_xy2_c;
  3003.     c->pix_abs[1][0] = pix_abs8_c;
  3004.     c->pix_abs[1][1] = pix_abs8_x2_c;
  3005.     c->pix_abs[1][2] = pix_abs8_y2_c;
  3006.     c->pix_abs[1][3] = pix_abs8_xy2_c;
  3007. #define dspfunc(PFX, IDX, NUM) 
  3008.     c->PFX ## _pixels_tab[IDX][0] = PFX ## _pixels ## NUM ## _c;     
  3009.     c->PFX ## _pixels_tab[IDX][1] = PFX ## _pixels ## NUM ## _x2_c;  
  3010.     c->PFX ## _pixels_tab[IDX][2] = PFX ## _pixels ## NUM ## _y2_c;  
  3011.     c->PFX ## _pixels_tab[IDX][3] = PFX ## _pixels ## NUM ## _xy2_c
  3012.     dspfunc(put, 0, 16);
  3013.     dspfunc(put_no_rnd, 0, 16);
  3014.     dspfunc(put, 1, 8);
  3015.     dspfunc(put_no_rnd, 1, 8);
  3016.     dspfunc(put, 2, 4);
  3017.     dspfunc(put, 3, 2);
  3018.     dspfunc(avg, 0, 16);
  3019.     dspfunc(avg_no_rnd, 0, 16);
  3020.     dspfunc(avg, 1, 8);
  3021.     dspfunc(avg_no_rnd, 1, 8);
  3022.     dspfunc(avg, 2, 4);
  3023.     dspfunc(avg, 3, 2);/**/
  3024. #undef dspfunc
  3025.     c->put_no_rnd_pixels_l2[0]= put_no_rnd_pixels16_l2_c;
  3026.     c->put_no_rnd_pixels_l2[1]= put_no_rnd_pixels8_l2_c;
  3027.     c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c;
  3028.     c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c;
  3029.     c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c;
  3030.     c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c;
  3031.     c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c;
  3032.     c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c;
  3033.     c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c;
  3034.     c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c;
  3035.     c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c;
  3036.     c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c;
  3037.     c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c;
  3038.     c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c;
  3039.     c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c;
  3040.     c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c;
  3041.     c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c;
  3042.     c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c;
  3043.     c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c;
  3044.     c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c;
  3045. #define dspfunc(PFX, IDX, NUM) 
  3046.     c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_c; 
  3047.     c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_c; 
  3048.     c->PFX ## _pixels_tab[IDX][ 2] = PFX ## NUM ## _mc20_c; 
  3049.     c->PFX ## _pixels_tab[IDX][ 3] = PFX ## NUM ## _mc30_c; 
  3050.     c->PFX ## _pixels_tab[IDX][ 4] = PFX ## NUM ## _mc01_c; 
  3051.     c->PFX ## _pixels_tab[IDX][ 5] = PFX ## NUM ## _mc11_c; 
  3052.     c->PFX ## _pixels_tab[IDX][ 6] = PFX ## NUM ## _mc21_c; 
  3053.     c->PFX ## _pixels_tab[IDX][ 7] = PFX ## NUM ## _mc31_c; 
  3054.     c->PFX ## _pixels_tab[IDX][ 8] = PFX ## NUM ## _mc02_c; 
  3055.     c->PFX ## _pixels_tab[IDX][ 9] = PFX ## NUM ## _mc12_c; 
  3056.     c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_c; 
  3057.     c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_c; 
  3058.     c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_c; 
  3059.     c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_c; 
  3060.     c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_c; 
  3061.     c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_c
  3062.     dspfunc(put_qpel, 0, 16);
  3063.     dspfunc(put_no_rnd_qpel, 0, 16);
  3064.     dspfunc(avg_qpel, 0, 16);
  3065.     // dspfunc(avg_no_rnd_qpel, 0, 16); 
  3066.     dspfunc(put_qpel, 1, 8);
  3067.     dspfunc(put_no_rnd_qpel, 1, 8);
  3068.     dspfunc(avg_qpel, 1, 8);
  3069.     // dspfunc(avg_no_rnd_qpel, 1, 8); 
  3070.     dspfunc(put_h264_qpel, 0, 16);
  3071.     dspfunc(put_h264_qpel, 1, 8);
  3072.     dspfunc(put_h264_qpel, 2, 4);
  3073.     dspfunc(avg_h264_qpel, 0, 16);
  3074.     dspfunc(avg_h264_qpel, 1, 8);
  3075.     dspfunc(avg_h264_qpel, 2, 4);
  3076. #undef dspfunc
  3077.     c->put_h264_chroma_pixels_tab[0]= put_h264_chroma_mc8_c;
  3078.     c->put_h264_chroma_pixels_tab[1]= put_h264_chroma_mc4_c;
  3079.     c->put_h264_chroma_pixels_tab[2]= put_h264_chroma_mc2_c;
  3080.     c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_c;
  3081.     c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_c;
  3082.     c->avg_h264_chroma_pixels_tab[2]= avg_h264_chroma_mc2_c;
  3083.     c->put_mspel_pixels_tab[0]= put_mspel8_mc00_c;
  3084.     c->put_mspel_pixels_tab[1]= put_mspel8_mc10_c;
  3085.     c->put_mspel_pixels_tab[2]= put_mspel8_mc20_c;
  3086.     c->put_mspel_pixels_tab[3]= put_mspel8_mc30_c;
  3087.     c->put_mspel_pixels_tab[4]= put_mspel8_mc02_c;
  3088.     c->put_mspel_pixels_tab[5]= put_mspel8_mc12_c;
  3089.     c->put_mspel_pixels_tab[6]= put_mspel8_mc22_c;
  3090.     c->put_mspel_pixels_tab[7]= put_mspel8_mc32_c;
  3091. /**/        
  3092. #define SET_CMP_FUNC(name) 
  3093.     c->name[0]= name ## 16_c;
  3094.     c->name[1]= name ## 8x8_c;
  3095.     
  3096.     SET_CMP_FUNC(hadamard8_diff)
  3097.     c->hadamard8_diff[4]= hadamard8_intra16_c;
  3098.     SET_CMP_FUNC(dct_sad)
  3099.     c->sad[0]= pix_abs16_c;
  3100.     c->sad[1]= pix_abs8_c;
  3101.     c->sse[0]= sse16_c;
  3102.     c->sse[1]= sse8_c;
  3103.     SET_CMP_FUNC(quant_psnr)
  3104.     SET_CMP_FUNC(rd)
  3105.     SET_CMP_FUNC(bit)
  3106.     c->vsad[0]= vsad16_c;
  3107.     c->vsad[4]= vsad_intra16_c;
  3108.     c->vsse[0]= vsse16_c;
  3109.     c->vsse[4]= vsse_intra16_c;
  3110.     c->nsse[0]= nsse16_c;
  3111.     c->nsse[1]= nsse8_c;
  3112.         
  3113.     c->add_bytes= add_bytes_c;
  3114.     c->diff_bytes= diff_bytes_c;
  3115.     c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c;
  3116.     c->bswap_buf= bswap_buf;
  3117.     
  3118.     c->h263_h_loop_filter= h263_h_loop_filter_c;
  3119.     c->h263_v_loop_filter= h263_v_loop_filter_c;
  3120.     
  3121.     c->h261_loop_filter= h261_loop_filter_c;
  3122.     
  3123.     c->try_8x8basis= try_8x8basis_c;
  3124.     c->add_8x8basis= add_8x8basis_c;
  3125. #ifdef HAVE_MMX
  3126.     dsputil_init_mmx(c, avctx);
  3127. #endif
  3128. #ifdef ARCH_ARMV4L
  3129.     dsputil_init_armv4l(c, avctx);
  3130. #endif
  3131. #ifdef HAVE_MLIB
  3132.     dsputil_init_mlib(c, avctx);
  3133. #endif
  3134. #ifdef ARCH_SPARC
  3135.    dsputil_init_vis(c,avctx);
  3136. #endif
  3137. #ifdef ARCH_ALPHA
  3138.     dsputil_init_alpha(c, avctx);
  3139. #endif
  3140. #ifdef ARCH_POWERPC
  3141.     dsputil_init_ppc(c, avctx);
  3142. #endif
  3143. #ifdef HAVE_MMI
  3144.     dsputil_init_mmi(c, avctx);
  3145. #endif
  3146. #ifdef ARCH_SH4
  3147.     dsputil_init_sh4(c,avctx);
  3148. #endif
  3149.     switch(c->idct_permutation_type){
  3150.     case FF_NO_IDCT_PERM:
  3151.         for(i=0; i<64; i++)
  3152.             c->idct_permutation[i]= i;
  3153.         break;
  3154.     case FF_LIBMPEG2_IDCT_PERM:
  3155.         for(i=0; i<64; i++)
  3156.             c->idct_permutation[i]= (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
  3157.         break;
  3158.     case FF_SIMPLE_IDCT_PERM:
  3159.         for(i=0; i<64; i++)
  3160.             c->idct_permutation[i]= simple_mmx_permutation[i];
  3161.         break;
  3162.     case FF_TRANSPOSE_IDCT_PERM:
  3163.         for(i=0; i<64; i++)
  3164.             c->idct_permutation[i]= ((i&7)<<3) | (i>>3);
  3165.         break;
  3166.     default:
  3167.         av_log(avctx, AV_LOG_ERROR, "Internal error, IDCT permutation not setn");
  3168.     }
  3169. }