recon.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:37k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   File: recon.hh
  3.   */
  4. #include "all.hh"
  5. // #define HAVE_3Dnow
  6. #ifdef HAVE_MMX
  7. #ifndef HAVE_3Dnow
  8. static long long ADD_1 = 0x0101010101010101LL;
  9. static long long MASK_AND = 0x7f7f7f7f7f7f7f7fLL;
  10. #endif
  11. #endif
  12. #ifdef HAVE_MMX
  13. #ifndef HAVE_3Dnow
  14. extern "C" void recva(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  15. extern "C" void recvac(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  16. extern "C" void rech(unsigned char *s, unsigned char *d, int lx2, int h);
  17. extern "C" void rechc(unsigned char *s, unsigned char *d, int lx2, int h);
  18. #else
  19. inline void recva(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  20. inline void recvac(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  21. inline void rech(unsigned char *s, unsigned char *d, int lx2, int h);
  22. inline void rechc(unsigned char *s, unsigned char *d, int lx2, int h);
  23. #endif
  24. #else
  25. inline void recva(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  26. inline void recvac(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  27. inline void rech(unsigned char *s, unsigned char *d, int lx2, int h);
  28. inline void rechc(unsigned char *s, unsigned char *d, int lx2, int h);
  29. #endif
  30. inline void rec(unsigned char *s, unsigned char *d, int lx2, int h);
  31. inline void recc(unsigned char *s, unsigned char *d, int lx2, int h);
  32. inline void reca(unsigned char *s, unsigned char *d, int lx2, int h);
  33. inline void recac(unsigned char *s, unsigned char *d, int lx2, int h);
  34. inline void recv(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  35. inline void recvc(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  36. inline void recha(unsigned char *s, unsigned char *d, int lx2, int h);
  37. inline void rechac(unsigned char *s, unsigned char *d, int lx2, int h);
  38. inline void rec4(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  39. inline void rec4c(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  40. inline void rec4a(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  41. inline void rec4ac(unsigned char *s, unsigned char *d, int lx, int lx2, int h);
  42. void recon_comp(unsigned char *src, unsigned char *dst,
  43.                   int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int addflag);
  44. void recon(unsigned char *src[], int sfield, 
  45.    unsigned char *dst[], int dfield, int lx,int lx2,
  46.    int w, int h, int x, int y, int dx, int dy, int addflag){
  47.   /*
  48.     unsigned char *src[]; * prediction source buffer *
  49.     int sfield;           * prediction source field number (0 or 1) *
  50.     unsigned char *dst[]; * prediction destination buffer *
  51.     int dfield;           * prediction destination field number (0 or 1)*
  52.     int lx,lx2;           * horizontal offsets *
  53.     int w,h;              * prediction block/sub-block width, height *
  54.     int x,y;              * pixel co-ordinates of top-left sample in current MB *
  55.     int dx,dy;            * horizontal, vertical motion vector *
  56.     int addflag;          * add prediction error to prediction ? *
  57.     */
  58.   /* Y */
  59.   recon_comp((src[0]+(sfield?lx2>>1:0)), 
  60.      dst[0]+(dfield?lx2>>1:0),
  61.              lx,lx2,w,h,x,y,dx,dy,addflag);
  62.   
  63.   if (chroma_format!=CHROMA444){
  64.     lx>>=1; dx/=2;lx2>>=1; w = 0; x>>=1; 
  65.   }
  66.   if (chroma_format==CHROMA420){
  67.     h>>=1; dy/=2;y>>=1; 
  68.   }
  69.   
  70.   /* Cb */
  71.   recon_comp((src[1]+(sfield?lx2>>1:0)), 
  72.      dst[1]+(dfield?lx2>>1:0),
  73.      lx,lx2,w,h,x,y,dx,dy,addflag);
  74.   /* Cr */
  75.   recon_comp((src[2]+(sfield?lx2>>1:0)),
  76.      dst[2]+(dfield?lx2>>1:0),
  77.              lx,lx2,w,h,x,y,dx,dy,addflag);
  78. }
  79. //#define WIDTH 16
  80. #define WIDTH 1
  81. void LayerData::reconstruct(int bx, int by, int mb_type, int motion_type,
  82.     int PMV[2][2][2], int mv_field_sel[2][2], 
  83.     int dmvector[2], int stwtype){
  84.   int currentfield;
  85.   unsigned char **predframe;
  86.   int DMV[2][2];
  87.   int stwtop, stwbot;
  88.   stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
  89.   stwbot = stwtype/3;
  90.   if ((mb_type & MB_FORWARD) || (pict_type==P_TYPE)){
  91.     if (pict_struct==FRAME_PICTURE){
  92.       if ((motion_type==MC_FRAME) || !(mb_type & MB_FORWARD)){
  93.         /* frame-based prediction */
  94. {
  95.         if (stwtop<2)
  96.           recon(oldrefframe,0,newframe,0,
  97.              coded_picture_width,coded_picture_width<<1,WIDTH,8,bx,by,
  98.             PMV[0][0][0],PMV[0][0][1],stwtop);
  99.         if (stwbot<2)
  100.           recon(oldrefframe,1,newframe,1,
  101.              coded_picture_width,coded_picture_width<<1,WIDTH,8,bx,by,
  102.             PMV[0][0][0],PMV[0][0][1],stwbot);
  103.       }
  104.       }
  105.       else if (motion_type==MC_FIELD) /* field-based prediction */
  106.       {
  107.         /* top field prediction */
  108.         if (stwtop<2)
  109.           recon(oldrefframe,mv_field_sel[0][0],newframe,0,
  110.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  111.             PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
  112.         /* bottom field prediction */
  113.         if (stwbot<2)
  114.           recon(oldrefframe,mv_field_sel[1][0],newframe,1,
  115.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  116.             PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
  117.       }
  118.       else if (motion_type==MC_DMV){ /* dual prime prediction */
  119.         /* calculate derived motion vectors */
  120.         ld->calc_DMV(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
  121.         if (stwtop<2){
  122.           /* predict top field from top field */
  123.           recon(oldrefframe,0,newframe,0,
  124.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  125.             PMV[0][0][0],PMV[0][0][1]>>1,0);
  126.           /* predict and add to top field from bottom field */
  127.           recon(oldrefframe,1,newframe,0,
  128.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  129.             DMV[0][0],DMV[0][1],1);
  130.         }
  131.         if (stwbot<2)
  132.         {
  133.           /* predict bottom field from bottom field */
  134.           recon(oldrefframe,1,newframe,1,
  135.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  136.             PMV[0][0][0],PMV[0][0][1]>>1,0);
  137.           /* predict and add to bottom field from top field */
  138.           recon(oldrefframe,0,newframe,1,
  139.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by>>1,
  140.             DMV[1][0],DMV[1][1],1);
  141.         }
  142.       }
  143.       else
  144.         /* invalid motion_type */
  145.         if (!quiet) printf("invalid motion_typen");
  146.     }
  147.     else /* TOP_FIELD or BOTTOM_FIELD */
  148.     {
  149.       /* field picture */
  150.       currentfield = (pict_struct==BOTTOM_FIELD);
  151.       /* determine which frame to use for prediction */
  152.       if ((pict_type==P_TYPE) && secondfield
  153.          && (currentfield!=mv_field_sel[0][0]))
  154.         predframe = refframe; /* same frame */
  155.       else
  156.         predframe = oldrefframe; /* previous frame */
  157.       if ((motion_type==MC_FIELD) || !(mb_type & MB_FORWARD))
  158.       {
  159.         /* field-based prediction */
  160.         if (stwtop<2)
  161.           recon(predframe,mv_field_sel[0][0],newframe,0,
  162.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,16,bx,by,
  163.             PMV[0][0][0],PMV[0][0][1],stwtop);
  164.       }
  165.       else if (motion_type==MC_16X8)
  166.       {
  167.         if (stwtop<2)
  168.         {
  169.           recon(predframe,mv_field_sel[0][0],newframe,0,
  170.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by,
  171.             PMV[0][0][0],PMV[0][0][1],stwtop);
  172.           /* determine which frame to use for lower half prediction */
  173.           if ((pict_type==P_TYPE) && secondfield
  174.              && (currentfield!=mv_field_sel[1][0]))
  175.             predframe = refframe; /* same frame */
  176.           else
  177.             predframe = oldrefframe; /* previous frame */
  178.           recon(predframe,mv_field_sel[1][0],newframe,0,
  179.             coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by+8,
  180.             PMV[1][0][0],PMV[1][0][1],stwtop);
  181.         }
  182.       }
  183.       else if (motion_type==MC_DMV) /* dual prime prediction */
  184.       {
  185.         if (secondfield)
  186.           predframe = refframe; /* same frame */
  187.         else
  188.           predframe = oldrefframe; /* previous frame */
  189.         /* calculate derived motion vectors */
  190.         calc_DMV(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
  191.         /* predict from field of same parity */
  192.         recon(oldrefframe,currentfield,newframe,0,
  193.           coded_picture_width<<1,coded_picture_width<<1,WIDTH,16,bx,by,
  194.           PMV[0][0][0],PMV[0][0][1],0);
  195.         /* predict from field of opposite parity */
  196.         recon(predframe,!currentfield,newframe,0,
  197.           coded_picture_width<<1,coded_picture_width<<1,WIDTH,16,bx,by,
  198.           DMV[0][0],DMV[0][1],1);
  199.       }
  200.       else
  201.         /* invalid motion_type */
  202.         printf("invalid motion_typen");
  203.     }
  204.     stwtop = stwbot = 1;
  205.   }
  206.   if (mb_type & MB_BACKWARD)
  207.   {
  208.     if (pict_struct==FRAME_PICTURE)
  209.     {
  210.       if (motion_type==MC_FRAME)
  211.       {
  212.         /* frame-based prediction */
  213.         if (stwtop<2)
  214.           recon(refframe,0,newframe,0,
  215.              coded_picture_width,coded_picture_width<<1,WIDTH,8,bx,by,
  216.             PMV[0][1][0],PMV[0][1][1],stwtop);
  217.         if (stwbot<2)
  218.           recon(refframe,1,newframe,1,
  219. coded_picture_width,coded_picture_width<<1,WIDTH,8,bx,by,
  220. PMV[0][1][0],PMV[0][1][1],stwbot);
  221.       }
  222.       else {           /* field-based prediction */
  223. /* top field prediction */
  224. if (stwtop<2){
  225.   recon(refframe,mv_field_sel[0][1],newframe,0,
  226. (coded_picture_width<<1), (coded_picture_width<<1),WIDTH,8,bx, (by>>1),
  227. PMV[0][1][0], (PMV[0][1][1]>>1), stwtop);
  228. }
  229.         /* bottom field prediction */
  230.         if (stwbot<2){
  231.           recon(refframe, mv_field_sel[1][1], newframe, 1, (coded_picture_width<<1),
  232. (coded_picture_width<<1), WIDTH, 8, bx, (by>>1),
  233. PMV[1][1][0], (PMV[1][1][1]>>1), stwbot);
  234. }
  235.       }
  236.     }
  237.     else {                       /* TOP_FIELD or BOTTOM_FIELD */
  238.       /* field picture */
  239.       if (motion_type==MC_FIELD){
  240.         /* field-based prediction */
  241.         recon(refframe,mv_field_sel[0][1],newframe,0,
  242.       coded_picture_width<<1,coded_picture_width<<1,WIDTH,16,bx,by,
  243.       PMV[0][1][0],PMV[0][1][1],stwtop);
  244.       }
  245.       else if (motion_type==MC_16X8)
  246.       {
  247.         recon(refframe,mv_field_sel[0][1],newframe,0,
  248.           coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by,
  249.           PMV[0][1][0],PMV[0][1][1],stwtop);
  250.         recon(refframe,mv_field_sel[1][1],newframe,0,
  251.           coded_picture_width<<1,coded_picture_width<<1,WIDTH,8,bx,by+8,
  252.           PMV[1][1][0],PMV[1][1][1],stwtop);
  253.       }
  254.       else
  255.         /* invalid motion_type */
  256.         printf("invalid motion_typen");
  257.     }
  258.   } /* mb_type & MB_BACKWARD */
  259. }
  260. inline void rec(unsigned char *s, unsigned char *d, int lx2, int h)
  261. {
  262. #ifdef HAVE_MMX
  263. __asm__ __volatile__(
  264. ".align 8n"
  265. "1:t"
  266. "movq ( %1 ),      %%mm0n" /* 8 s */
  267.     "movq 8( %1 ),     %%mm2n" /* 16 s */
  268.     "movq %%mm0,   ( %2 )n"   
  269. "addl %3, %1n"
  270.     "movq %%mm2,   8( %2 )n"   
  271. "decl %0n"
  272.     "leal (%2, %3), %2n"
  273.   "jnz    1b"            
  274. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  275. );   
  276. #else
  277.   for (int j=0; j<h; j++, s+=lx2, d+=lx2){
  278.     d[0] = s[0];d[1] = s[1];d[2] = s[2];d[3] = s[3];
  279.     d[4] = s[4];d[5] = s[5];d[6] = s[6];d[7] = s[7];
  280.     d[8] = s[8];d[9] = s[9];d[10] = s[10];d[11] = s[11];
  281.     d[12] = s[12];d[13] = s[13];d[14] = s[14];d[15] = s[15];
  282.   }
  283. #endif
  284. }
  285. inline void recc(unsigned char *s, unsigned char *d, int lx2, int h){
  286. #ifdef HAVE_MMX
  287. __asm__ __volatile__(
  288. ".align 8n"
  289.     "1:t"
  290.      "movq ( %1 ),     %%mm0n"
  291.        "addl %3,      %1n"
  292.        "movq %%mm0,     ( %2 )n"   
  293. "decl %0n"
  294.        "leal (%2, %3), %2n"
  295.     "jnz    1b"            
  296. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  297. );   
  298. #else
  299.   for (int j=0; j<h; j++, s+=lx2, d+=lx2){
  300.     d[0] = s[0];d[1] = s[1];d[2] = s[2];d[3] = s[3];
  301.     d[4] = s[4];d[5] = s[5];d[6] = s[6];d[7] = s[7];
  302.   }
  303. #endif
  304. }
  305. inline void reca(unsigned char *s,unsigned char  *d, int lx2, int h){
  306. #ifdef HAVE_MMX
  307. #ifdef HAVE_3Dnow
  308. __asm__ (
  309. ".align 8n"
  310. "1:"
  311.     "movq (%1), %%mm0n"      /* 8 s */
  312.     "movq (%2), %%mm2n"      /* 8 d */
  313.     "movq 8(%1), %%mm1n"      /* 8 s */
  314.     "movq 8(%2), %%mm3n"      /* 8 d */
  315. "pavgusb  %%mm2,  %%mm0n"
  316. "addl %3, %1n"
  317. "pavgusb  %%mm3,  %%mm1n"
  318. "movq %%mm0, (%2)n"
  319. "movq %%mm1, 8(%2)n"
  320. "addl %3, %2n"
  321. "loop 1bn"
  322. :
  323. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  324. );
  325. #else
  326. __asm__ (
  327.    "movq      MASK_AND,  %%mm5n"
  328.    "movq      ADD_1,  %%mm6n"
  329. "1:t"
  330.    "movq        (%1),%%mm0n"
  331.    "movq        (%2),%%mm1n"
  332.    "movq       8(%1),%%mm2n"
  333.    "movq       8(%2),%%mm3n"
  334.    "psrlw $1,%%mm0n"
  335.    "psrlw     $1,%%mm1n"
  336.    "psrlw     $1,%%mm2n"
  337.    "psrlw     $1,%%mm3n"
  338.    "pand     %%mm5,%%mm0n"
  339.    "pand     %%mm5,%%mm1n"
  340.    "pand     %%mm5,%%mm2n"
  341.    "pand     %%mm5,%%mm3n"
  342.    "paddusb    %%mm1,%%mm0n"
  343.    "paddusb    %%mm3,%%mm2n"
  344.    "paddusb    %%mm6,%%mm0n"
  345.    "paddusb    %%mm6,%%mm2n"
  346.    "movq       %%mm0,(%2)n"
  347.    "addl       %3,%1n"
  348.    "movq     %%mm2, 8(%2)n"
  349.    "decl       %0n"
  350.    "leal (%2, %3), %2n"
  351.    "jnz        1bn"
  352. :
  353. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  354. );
  355. #endif
  356. #else
  357.   for (int j=0; j<h; j++, s+=lx2, d+=lx2){
  358.     d[0] = (unsigned int)(d[0] + s[0] + 1)>>1;
  359.     d[1] = (unsigned int)(d[1] + s[1] + 1)>>1;
  360.     d[2] = (unsigned int)(d[2] + s[2] + 1)>>1;
  361.     d[3] = (unsigned int)(d[3] + s[3] + 1)>>1;
  362.     d[4] = (unsigned int)(d[4] + s[4] + 1)>>1;
  363.     d[5] = (unsigned int)(d[5] + s[5] + 1)>>1;
  364.     d[6] = (unsigned int)(d[6] + s[6] + 1)>>1;
  365.     d[7] = (unsigned int)(d[7] + s[7] + 1)>>1;
  366.     d[8] = (unsigned int)(d[8] + s[8] + 1)>>1;
  367.     d[9] = (unsigned int)(d[9] + s[9] + 1)>>1;
  368.     d[10] = (unsigned int)(d[10] + s[10] + 1)>>1;
  369.     d[11] = (unsigned int)(d[11] + s[11] + 1)>>1;
  370.     d[12] = (unsigned int)(d[12] + s[12] + 1)>>1;
  371.     d[13] = (unsigned int)(d[13] + s[13] + 1)>>1;
  372.     d[14] = (unsigned int)(d[14] + s[14] + 1)>>1;
  373.     d[15] = (unsigned int)(d[15] + s[15] + 1)>>1;
  374.   }
  375. #endif
  376. }
  377. inline void recac(unsigned char *s, unsigned char *d, int lx2, int h){
  378. #ifdef HAVE_MMX
  379. #ifdef HAVE_3Dnow
  380. __asm__ (
  381. ".align 8n"
  382. "1:"
  383.     "movq (%1), %%mm0n"      /* 8 s */
  384.     "movq (%2), %%mm2n"      /* 8 d */
  385. "pavgusb  %%mm2,  %%mm0n"
  386. "addl %3, %1n"
  387. "movq %%mm0, (%2)n"
  388. "addl %3, %2n"
  389. "loop 1bn"
  390. :
  391. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  392. );
  393. #else
  394. __asm__ (
  395.    "movq      MASK_AND,  %%mm5n"
  396.    "movq      ADD_1,  %%mm6n"
  397. "1:t"
  398.    "movq       (%1),%%mm0n"
  399.    "movq       (%2),%%mm1n"
  400.    "psrlw $1,%%mm0n"
  401.    "psrlw     $1,%%mm1n"
  402.    "pand     %%mm5,%%mm0n"
  403.    "pand     %%mm5,%%mm1n"
  404.    "paddusb    %%mm1,%%mm0n"
  405.    "paddusb    %%mm6,%%mm0n"
  406.    "addl       %3,%1n"
  407.    "movq       %%mm0,(%2)n"
  408.    "decl       %0n"
  409.    "leal (%2, %3), %2n"
  410.    "jnz        1bn"
  411. :
  412. : "c" (h), "r" (s), "r" (d), "r" (lx2)
  413. );
  414. #endif
  415. #else
  416.   for (int j=0; j<h; j++, s+= lx2, d+= lx2){
  417.     d[0] = (unsigned int)(d[0] + s[0] + 1)>>1;
  418.     d[1] = (unsigned int)(d[1] + s[1] + 1)>>1;
  419.     d[2] = (unsigned int)(d[2] + s[2] + 1)>>1;
  420.     d[3] = (unsigned int)(d[3] + s[3] + 1)>>1;
  421.     d[4] = (unsigned int)(d[4] + s[4] + 1)>>1;
  422.     d[5] = (unsigned int)(d[5] + s[5] + 1)>>1;
  423.     d[6] = (unsigned int)(d[6] + s[6] + 1)>>1;
  424.     d[7] = (unsigned int)(d[7] + s[7] + 1)>>1;
  425.   }
  426. #endif
  427. }
  428. inline void recv(unsigned char *s, unsigned char *d, int lx,int lx2, int h){
  429. #ifdef HAVE_MMX
  430. #ifdef HAVE_3Dnow
  431. __asm__(
  432. ".align 8n"
  433. "1:"
  434.     "movq (%1), %%mm0n"      /* 8 s */
  435.     "movq (%4), %%mm2n"      /* 8 s +lx */
  436.     "movq 8(%1), %%mm1n"      /* 8 s */
  437.     "movq 8(%4), %%mm3n"      /* 8 s +lx **/
  438. "pavgusb %%mm2,  %%mm0n"
  439. "addl %3, %1n"
  440. "pavgusb %%mm3,  %%mm1n"
  441. "movq %%mm0, (%2)n"
  442. "addl %3, %4n"
  443. "movq %%mm1, 8(%2)n"
  444. "addl %3, %2n"
  445. "loop 1bn"
  446.       :
  447.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  448. );
  449. #else
  450. __asm__ (
  451.    "movq      MASK_AND,  %%mm5n"
  452.    "movq      ADD_1,  %%mm6n"
  453. "1:t"
  454.     "movq (%1), %%mm0n"      /* 8 s */
  455.     "movq (%4), %%mm1n"      /* 8 s +lx */
  456.     "movq 8(%1), %%mm2n"      /* 8 s */
  457.     "movq 8(%4), %%mm3n"      /* 8 s +lx **/
  458.    "psrlw      $1,%%mm0n"
  459.    "psrlw      $1,%%mm1n"
  460.    "psrlw      $1,%%mm2n"
  461.    "psrlw      $1,%%mm3n"
  462.    "pand       %%mm5,%%mm0n"
  463.    "pand       %%mm5,%%mm1n"
  464.    "pand       %%mm5,%%mm2n"
  465.    "pand       %%mm5,%%mm3n"
  466.    "paddusb    %%mm1,%%mm0n"
  467.    "paddusb    %%mm3,%%mm2n"
  468.    "paddusb    %%mm6,%%mm0n"
  469.    "paddusb    %%mm6,%%mm2n"
  470.    "movq       %%mm0,(%2)n"
  471.    "addl       %3,%1n"
  472.    "movq     %%mm2, 8(%2)n"
  473.    "addl       %3,%4n"
  474.    "decl       %0n"
  475.    "leal (%2, %3), %2n"
  476.    "jnz        1bn"
  477.       :
  478.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  479. );
  480. #endif
  481. #else
  482.   unsigned char *dp,*sp,*sp2;
  483.   sp = s;
  484.   sp2 = s+lx;
  485.   dp = d;
  486.   for (int j=0; j<h; j++){
  487.     dp[0] = (unsigned int)(sp[0]+sp2[0]+1)>>1;
  488.     dp[1] = (unsigned int)(sp[1]+sp2[1]+1)>>1;
  489.     dp[2] = (unsigned int)(sp[2]+sp2[2]+1)>>1;
  490.     dp[3] = (unsigned int)(sp[3]+sp2[3]+1)>>1;
  491.     dp[4] = (unsigned int)(sp[4]+sp2[4]+1)>>1;
  492.     dp[5] = (unsigned int)(sp[5]+sp2[5]+1)>>1;
  493.     dp[6] = (unsigned int)(sp[6]+sp2[6]+1)>>1;
  494.     dp[7] = (unsigned int)(sp[7]+sp2[7]+1)>>1;
  495.     dp[8] = (unsigned int)(sp[8]+sp2[8]+1)>>1;
  496.     dp[9] = (unsigned int)(sp[9]+sp2[9]+1)>>1;
  497.     dp[10] = (unsigned int)(sp[10]+sp2[10]+1)>>1;
  498.     dp[11] = (unsigned int)(sp[11]+sp2[11]+1)>>1;
  499.     dp[12] = (unsigned int)(sp[12]+sp2[12]+1)>>1;
  500.     dp[13] = (unsigned int)(sp[13]+sp2[13]+1)>>1;
  501.     dp[14] = (unsigned int)(sp[14]+sp2[14]+1)>>1;
  502.     dp[15] = (unsigned int)(sp[15]+sp2[15]+1)>>1;
  503.     sp+= lx2;
  504.     sp2+= lx2;
  505.     dp+= lx2;
  506.   }
  507. #endif
  508. }
  509. inline void recvc(unsigned char *s, unsigned char *d, int lx, int lx2, int h){
  510. #ifdef HAVE_MMX
  511. #ifdef HAVE_3Dnow
  512. __asm__(
  513. ".align 8n"
  514. "1:"
  515.     "movq (%1), %%mm0n"      /* 8 s */
  516.     "movq (%4), %%mm2n"      /* 8 s +lx */
  517. "addl %3, %1n"
  518. "pavgusb %%mm2,  %%mm0n"
  519. "addl %3, %4n"
  520. "movq %%mm0, (%2)n"
  521. "addl %3, %2n"
  522. "loop 1bn"
  523.       :
  524.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  525. );
  526. #else
  527. __asm__ (
  528.    "movq      MASK_AND,  %%mm5n"
  529.    "movq      ADD_1,  %%mm6n"
  530. "1:t"
  531.     "movq (%1), %%mm0n"      /* 8 s */
  532.     "movq (%4), %%mm1n"      /* 8 s +lx */
  533.    "psrlw      $1,%%mm0n"
  534.    "psrlw      $1,%%mm1n"
  535.    "pand       %%mm5,%%mm0n"
  536.    "pand       %%mm5,%%mm1n"
  537.    "paddusb    %%mm1,%%mm0n"
  538.    "addl       %3,%1n"
  539.    "paddusb    %%mm6,%%mm0n"
  540.    "addl       %3,%4n"
  541.    "movq       %%mm0,(%2)n"
  542.    "decl       %0n"
  543.    "leal (%2, %3), %2n"
  544.    "jnz        1bn"
  545.       :
  546.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  547. );
  548. #endif
  549. #else
  550.   unsigned char *dp,*sp,*sp2;
  551.   sp = s;
  552.   sp2 = s+lx;
  553.   dp = d;
  554.   for (int j=0; j<h; j++){
  555.     dp[0] = (unsigned int)(sp[0]+sp2[0]+1)>>1;
  556.     dp[1] = (unsigned int)(sp[1]+sp2[1]+1)>>1;
  557.     dp[2] = (unsigned int)(sp[2]+sp2[2]+1)>>1;
  558.     dp[3] = (unsigned int)(sp[3]+sp2[3]+1)>>1;
  559.     dp[4] = (unsigned int)(sp[4]+sp2[4]+1)>>1;
  560.     dp[5] = (unsigned int)(sp[5]+sp2[5]+1)>>1;
  561.     dp[6] = (unsigned int)(sp[6]+sp2[6]+1)>>1;
  562.     dp[7] = (unsigned int)(sp[7]+sp2[7]+1)>>1;
  563.     sp+= lx2;
  564.     sp2+= lx2;
  565.     dp+= lx2;
  566.   }
  567. #endif
  568. }
  569. #ifdef HAVE_3Dnow
  570. inline void recva(unsigned char *s, unsigned char *d, int lx, int lx2, int h)
  571. {
  572. __asm__(
  573. ".align 8n"
  574. "1:"
  575.     "movq (%1), %%mm0n"      /* 8 s */
  576.     "movq 8(%1), %%mm1n"      /* 8 s */
  577.     "movq (%4), %%mm2n"      /* 8 s +lx */
  578.     "movq 8(%4), %%mm3n"      /* 8 s +lx **/
  579. "pavgusb %%mm2,  %%mm0n"
  580. "addl %3, %1n"
  581. "pavgusb %%mm3,  %%mm1n"
  582.     "movq (%2), %%mm2n"      /* 8 d */
  583.     "movq 8(%2), %%mm3n"      /* 8 d */
  584. "pavgusb %%mm2,  %%mm0n"
  585. "addl %3, %4n"
  586. "pavgusb %%mm3,  %%mm1n"
  587. "movq %%mm0, (%2)n"
  588. "movq %%mm1, 8(%2)n"
  589. "addl %3, %2n"
  590. "loop 1bn"
  591.       :
  592.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  593. );
  594. }
  595. inline void recvac(unsigned char *s, unsigned char *d, int lx,int lx2, int h)
  596. {
  597. __asm__(
  598. ".align 8n"
  599. "1:"
  600.     "movq (%1), %%mm0n"      /* 8 s */
  601.     "movq (%4), %%mm2n"      /* 8 s +lx */
  602. "addl %3, %1n"
  603. "pavgusb %%mm2,  %%mm0n"
  604.     "movq (%2), %%mm3n"      /* 8 d */
  605. "addl %3, %4n"
  606. "pavgusb %%mm3,  %%mm0n"
  607. "movq %%mm0, (%2)n"
  608. "addl %3, %2n"
  609. "loop 1bn"
  610.       :
  611.       : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  612. );
  613. }
  614. inline void rech(unsigned char *s, unsigned char *d, int lx2, int h)
  615. {
  616. __asm__ (
  617. ".align 8n"
  618. "1:"
  619.     "movq (%1), %%mm0n"      /* 8 s */
  620.     "movq 8(%1), %%mm1n"      /* 8 s */
  621.     "movq 1(%1), %%mm2n"      /* 8 s */
  622.     "movq 9(%1), %%mm3n"      /* 8 s */
  623. "pavgusb  %%mm2,  %%mm0n"
  624. "addl %3, %1n"
  625. "pavgusb  %%mm3,  %%mm1n"
  626. "movq %%mm0, (%2)n"
  627. "movq %%mm1, 8(%2)n"
  628. "addl %3, %2n"
  629. "loop 1bn"
  630.       :
  631.       : "c" (h), "r" (s), "r" (d), "r" (lx2)
  632. );
  633. }
  634. inline void rechc(unsigned char *s,unsigned char *d, int lx2, int h){
  635. __asm__ (
  636. ".align 8n"
  637. "1:"
  638.     "movq (%1), %%mm0n"      /* 8 s */
  639.     "movq 1(%1), %%mm2n"      /* 8 s +1 */
  640. "addl %3, %1n"
  641. "pavgusb  %%mm2,  %%mm0n"
  642. "movq %%mm0, (%2)n"
  643. "addl %3, %2n"
  644. "loop 1bn"
  645.       :
  646.       : "c" (h), "r" (s), "r" (d), "r" (lx2)
  647. );
  648. }
  649. inline void recha(unsigned char *s, unsigned char *d,int lx2, int h)
  650. {
  651. __asm__ (
  652. ".align 8n"
  653. "1:"
  654.     "movq (%1), %%mm0n"      /* 8 s */
  655.     "movq 8(%1), %%mm1n"      /* 8 s */
  656.     "movq 1(%1), %%mm2n"      /* 8 s */
  657.     "movq 9(%1), %%mm3n"      /* 8 s */
  658. "pavgusb  %%mm2,  %%mm0n"
  659. "addl %3, %1n"
  660. "pavgusb  %%mm3,  %%mm1n"
  661.     "movq (%2), %%mm2n"      /* 8 d */
  662.     "movq 8(%2), %%mm3n"      /* 8 d */
  663. "pavgusb  %%mm2,  %%mm0n"
  664. "pavgusb  %%mm3,  %%mm1n"
  665. "movq %%mm0, (%2)n"
  666. "movq %%mm1, 8(%2)n"
  667. "addl %3, %2n"
  668. "loop 1bn"
  669.       :
  670.       : "c" (h), "r" (s), "r" (d), "r" (lx2)
  671. );
  672. }
  673. inline void rechac(unsigned char *s,unsigned char  *d, int lx2, int h)
  674. {
  675. __asm__ (
  676. ".align 8n"
  677. "1:"
  678.     "movq (%1), %%mm0n"      /* 8 s */
  679.     "movq 1(%1), %%mm2n"      /* 8 s */
  680. "addl %3, %1n"
  681. "pavgusb  %%mm2,  %%mm0n"
  682.     "movq (%2), %%mm1n"      /* 8 d */
  683. "pavgusb  %%mm1,  %%mm0n"
  684. "movq %%mm0, (%2)n"
  685. "addl %3, %2n"
  686. "loop 1bn"
  687.       :
  688.       : "c" (h), "r" (s), "r" (d), "r" (lx2)
  689. );
  690. }
  691. inline void rec4(unsigned char *s, unsigned char *d, int lx, int lx2, int h)
  692. {
  693. __asm__ __volatile__(
  694.     "movq (%1), %%mm0n"  /* 8 s */
  695.     "movq 8(%1), %%mm1n"  /* 8 s */
  696.     "movq 1(%1), %%mm2n"  /* 8 s +1*/
  697.     "movq 9(%1), %%mm3n"  /* 8 s +1*/
  698. ".align 8n"
  699. "1:"
  700.     "movq (%4), %%mm4n"  /* 8 s+lx */
  701. "pavgusb  %%mm2,  %%mm0n"
  702.     "movq 8(%4), %%mm5n"  /* 8 s+lx */
  703. "pavgusb  %%mm3,  %%mm1n"
  704.     "movq 1(%4), %%mm6n"  /* 8 s+lx +1*/
  705. "pavgusb  %%mm4,  %%mm0n"
  706.     "movq 9(%4), %%mm7n"  /* 8 s+lx +1*/
  707. "pavgusb  %%mm5,  %%mm1n"
  708. "pavgusb  %%mm6,  %%mm0n"
  709. "addl %3, %4n"
  710. "pavgusb  %%mm7,  %%mm1n"
  711. "movq %%mm0, (%2)n"
  712. "movq %%mm6, %%mm2n"
  713. "movq %%mm7, %%mm3n"
  714. "movq %%mm1, 8(%2)n"
  715. "movq %%mm4, %%mm0n"
  716. "movq %%mm5, %%mm1n"
  717. "addl %3, %2n"
  718. "loop 1bn"
  719.        :
  720. : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  721. );
  722. }
  723. inline void rec4c(unsigned char *s,unsigned char *d, int lx, int lx2, int h)
  724. {
  725. __asm__ __volatile__(
  726.     "movq (%1), %%mm0n"  /* 8 s */
  727.     "movq 1(%1), %%mm2n"  /* 8 s +1*/
  728. ".align 8n"
  729. "1:"
  730.     "movq (%4), %%mm4n"  /* 8 s+lx */
  731. "pavgusb  %%mm2,  %%mm0n"
  732.     "movq 1(%4), %%mm6n"  /* 8 s+lx +1*/
  733. "pavgusb  %%mm4,  %%mm0n"
  734. "addl %3, %4n"
  735. "pavgusb  %%mm6,  %%mm0n"
  736. "movq %%mm0, (%2)n"
  737. "movq %%mm6, %%mm2n"
  738. "movq %%mm4, %%mm0n"
  739. "addl %3, %2n"
  740. "loop 1bn"
  741.        :
  742. : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  743. );
  744. }
  745. inline void rec4a(unsigned char *s,unsigned char *d, int lx, int lx2, int h)
  746. {
  747. __asm__ __volatile__(
  748.     "movq (%1), %%mm0n"  /* 8 s */
  749.     "movq 8(%1), %%mm1n"  /* 8 s */
  750.     "movq 1(%1), %%mm2n"  /* 8 s +1*/
  751.     "movq 9(%1), %%mm3n"  /* 8 s +1*/
  752. ".align 8n"
  753. "1:"
  754.     "movq (%4), %%mm4n"  /* 8 s+lx */
  755. "pavgusb  %%mm2,  %%mm0n"
  756.     "movq 8(%4), %%mm5n"  /* 8 s+lx */
  757. "pavgusb  %%mm3,  %%mm1n"
  758.     "movq 1(%4), %%mm6n"  /* 8 s+lx +1*/
  759. "pavgusb  %%mm4,  %%mm0n"
  760.     "movq 9(%4), %%mm7n"  /* 8 s+lx +1*/
  761. "pavgusb  %%mm5,  %%mm1n"
  762. "movq (%2), %%mm2n"
  763. "pavgusb  %%mm6,  %%mm0n"
  764. "movq 8(%2), %%mm3n"
  765. "pavgusb  %%mm2,  %%mm0n"
  766. "addl %3, %4n"
  767. "pavgusb  %%mm3,  %%mm1n"
  768. "movq %%mm0, (%2)n"
  769. "pavgusb  %%mm7,  %%mm1n"
  770. "movq %%mm6, %%mm2n"
  771. "movq %%mm7, %%mm3n"
  772. "movq %%mm1, 8(%2)n"
  773. "movq %%mm4, %%mm0n"
  774. "movq %%mm5, %%mm1n"
  775. "addl %3, %2n"
  776. "loop 1bn"
  777.        :
  778. : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  779. );
  780. }
  781. inline void rec4ac(unsigned char *s,unsigned char  *d, int lx, int lx2, int h)
  782. {
  783. __asm__ __volatile__(
  784.     "movq (%1), %%mm0n"  /* 8 s */
  785.     "movq 1(%1), %%mm2n"  /* 8 s +1*/
  786. ".align 8n"
  787. "1:"
  788.     "movq (%4), %%mm4n"  /* 8 s+lx */
  789. "pavgusb  %%mm2,  %%mm0n"
  790.     "movq 1(%4), %%mm6n"  /* 8 s+lx +1*/
  791. "pavgusb  %%mm4,  %%mm0n"
  792. "movq (%2), %%mm1n"  /* 8 d */
  793. "pavgusb  %%mm6,  %%mm0n"
  794. "addl %3, %4n"
  795. "pavgusb  %%mm1,  %%mm0n"
  796. "movq %%mm6, %%mm2n"
  797. "movq %%mm0, (%2)n"
  798. "movq %%mm4, %%mm0n"
  799. "addl %3, %2n"
  800. "loop 1bn"
  801.        :
  802. : "c" (h), "r" (s), "r" (d), "r" (lx2), "r" (s +lx)
  803. );
  804. }
  805. #endif
  806. void recon_comp(unsigned char *src, unsigned char *dst, int lx, int lx2,
  807. int w, int h, int x, int y, int dx, int dy, int addflag){
  808. //  int xint, xh, yint, yh;
  809.   int switcher;
  810.   unsigned char *s, *d;
  811.   /* half pel scaling */
  812. //  xint = dx>>1;
  813. //  xh = dx & 1;
  814. //  yint = dy>>1;
  815. //  yh = dy & 1;
  816. //  switcher = (dx & 1) << 3 | (dy & 1) << 2 | (w !=8) & 1;
  817.   switcher = (dx & 1) << 3 | (dy & 1) << 2 | w;
  818.   if (addflag) 
  819.     switcher |= 2; 
  820.   /* origins */
  821.   s = src + lx*(y+(dy>>1)) + x + (dx>>1);
  822.   d = dst + lx*y + x;
  823.   switch (switcher) {
  824.   case 0x3:  reca(s,d,lx2,h);
  825. break;
  826.   case 0x2: recac(s,d,lx2,h);
  827. break;
  828.   case 0x1: rec(s,d,lx2,h);
  829. break;
  830.   case 0x0: recc(s,d,lx2,h);
  831. break;
  832.   case 0x7:  recva(s,d,lx,lx2,h);
  833. break;
  834.   case 0x6: recvac(s,d,lx,lx2,h);
  835. break;
  836.   case 0x5: recv(s,d,lx,lx2,h);
  837. break;
  838.   case 0x4: recvc(s,d,lx,lx2,h);
  839. break;
  840.   case 0xb:  recha(s,d,lx2,h);
  841. break;
  842.   case 0xa: rechac(s,d,lx2,h);
  843. break;
  844.   case 0x9: rech(s,d,lx2,h);
  845. break;
  846.   case 0x8: rechc(s,d,lx2,h);
  847. break;
  848.   case 0xf:  rec4a(s,d,lx,lx2,h);
  849. break;
  850.   case 0xe: rec4ac(s,d,lx,lx2,h);
  851. break;
  852.   case 0xd: rec4(s,d,lx,lx2,h);
  853. break;
  854.   case 0xc: rec4c(s,d,lx,lx2,h);
  855. break;
  856.   }
  857. #if 0
  858.   if (!xh && !yh)
  859.     if (addflag){
  860.       if (w!=8) reca(s,d,lx2,h);
  861.       else      recac(s,d,lx2,h);
  862.     }
  863.     else {
  864.       if (w!=8) rec(s,d,lx2,h);
  865.       else      recc(s,d,lx2,h);
  866.     }
  867.   else if (!xh && yh)
  868.     if (addflag){
  869.       if (w!=8) recva(s,d,lx,lx2,h);
  870.       else      recvac(s,d,lx,lx2,h);
  871.     }
  872.     else {
  873.       if (w!=8) recv(s,d,lx,lx2,h);
  874.       else      recvc(s,d,lx,lx2,h);
  875.     }
  876.   else if (xh && !yh)
  877.     if (addflag){
  878.       if (w!=8) recha(s,d,lx2,h);
  879.       else      rechac(s,d,lx2,h);
  880.     }
  881.     else {
  882.       if (w!=8) rech(s,d,lx2,h);
  883.       else      rechc(s,d,lx2,h);
  884.     }
  885.   else /* if (xh && yh) */
  886.     if (addflag){
  887.       if (w!=8) rec4a(s,d,lx,lx2,h);
  888.       else      rec4ac(s,d,lx,lx2,h);
  889.     }
  890.     else {
  891.       if (w!=8) rec4(s,d,lx,lx2,h);
  892.       else      rec4c(s,d,lx,lx2,h);
  893.     }
  894. #endif
  895. }
  896. #ifndef HAVE_MMX
  897. inline void recva(unsigned char *s, unsigned char *d, int lx, int lx2, int h){
  898.   unsigned char *dp,*sp,*sp2;
  899.   sp = s;
  900.   sp2 = s+lx;
  901.   dp = d;
  902.   for (int j=0; j<h; j++){
  903.     dp[0] = (dp[0] + ((unsigned int)(sp[0]+sp2[0]+1)>>1) + 1)>>1;
  904.     dp[1] = (dp[1] + ((unsigned int)(sp[1]+sp2[1]+1)>>1) + 1)>>1;
  905.     dp[2] = (dp[2] + ((unsigned int)(sp[2]+sp2[2]+1)>>1) + 1)>>1;
  906.     dp[3] = (dp[3] + ((unsigned int)(sp[3]+sp2[3]+1)>>1) + 1)>>1;
  907.     dp[4] = (dp[4] + ((unsigned int)(sp[4]+sp2[4]+1)>>1) + 1)>>1;
  908.     dp[5] = (dp[5] + ((unsigned int)(sp[5]+sp2[5]+1)>>1) + 1)>>1;
  909.     dp[6] = (dp[6] + ((unsigned int)(sp[6]+sp2[6]+1)>>1) + 1)>>1;
  910.     dp[7] = (dp[7] + ((unsigned int)(sp[7]+sp2[7]+1)>>1) + 1)>>1;
  911.     dp[8] = (dp[8] + ((unsigned int)(sp[8]+sp2[8]+1)>>1) + 1)>>1;
  912.     dp[9] = (dp[9] + ((unsigned int)(sp[9]+sp2[9]+1)>>1) + 1)>>1;
  913.     dp[10] = (dp[10] + ((unsigned int)(sp[10]+sp2[10]+1)>>1) + 1)>>1;
  914.     dp[11] = (dp[11] + ((unsigned int)(sp[11]+sp2[11]+1)>>1) + 1)>>1;
  915.     dp[12] = (dp[12] + ((unsigned int)(sp[12]+sp2[12]+1)>>1) + 1)>>1;
  916.     dp[13] = (dp[13] + ((unsigned int)(sp[13]+sp2[13]+1)>>1) + 1)>>1;
  917.     dp[14] = (dp[14] + ((unsigned int)(sp[14]+sp2[14]+1)>>1) + 1)>>1;
  918.     dp[15] = (dp[15] + ((unsigned int)(sp[15]+sp2[15]+1)>>1) + 1)>>1;
  919.     sp+= lx2;
  920.     sp2+= lx2;
  921.     dp+= lx2;
  922.   }
  923. }
  924. inline void recvac(unsigned char *s, unsigned char *d, int lx,int lx2, int h){
  925.   unsigned char *dp,*sp,*sp2;
  926.   sp = s;
  927.   sp2 = s+lx;
  928.   dp = d;
  929.   for (int j=0; j<h; j++){
  930.     dp[0] = (dp[0] + ((unsigned int)(sp[0]+sp2[0]+1)>>1) + 1)>>1;
  931.     dp[1] = (dp[1] + ((unsigned int)(sp[1]+sp2[1]+1)>>1) + 1)>>1;
  932.     dp[2] = (dp[2] + ((unsigned int)(sp[2]+sp2[2]+1)>>1) + 1)>>1;
  933.     dp[3] = (dp[3] + ((unsigned int)(sp[3]+sp2[3]+1)>>1) + 1)>>1;
  934.     dp[4] = (dp[4] + ((unsigned int)(sp[4]+sp2[4]+1)>>1) + 1)>>1;
  935.     dp[5] = (dp[5] + ((unsigned int)(sp[5]+sp2[5]+1)>>1) + 1)>>1;
  936.     dp[6] = (dp[6] + ((unsigned int)(sp[6]+sp2[6]+1)>>1) + 1)>>1;
  937.     dp[7] = (dp[7] + ((unsigned int)(sp[7]+sp2[7]+1)>>1) + 1)>>1;
  938.     sp+= lx2;
  939.     sp2+= lx2;
  940.     dp+= lx2;
  941.   }
  942. }
  943. inline void rech(unsigned char *s, unsigned char *d, int lx2, int h){
  944.   unsigned char *dp,*sp;
  945.   unsigned int s1,s2;
  946.   sp = s;
  947.   dp = d;
  948.   for (int j=0; j<h; j++){
  949.     s1=sp[0];
  950.     dp[0] = (unsigned int)(s1+(s2=sp[1])+1)>>1;
  951.     dp[1] = (unsigned int)(s2+(s1=sp[2])+1)>>1;
  952.     dp[2] = (unsigned int)(s1+(s2=sp[3])+1)>>1;
  953.     dp[3] = (unsigned int)(s2+(s1=sp[4])+1)>>1;
  954.     dp[4] = (unsigned int)(s1+(s2=sp[5])+1)>>1;
  955.     dp[5] = (unsigned int)(s2+(s1=sp[6])+1)>>1;
  956.     dp[6] = (unsigned int)(s1+(s2=sp[7])+1)>>1;
  957.     dp[7] = (unsigned int)(s2+(s1=sp[8])+1)>>1;
  958.     dp[8] = (unsigned int)(s1+(s2=sp[9])+1)>>1;
  959.     dp[9] = (unsigned int)(s2+(s1=sp[10])+1)>>1;
  960.     dp[10] = (unsigned int)(s1+(s2=sp[11])+1)>>1;
  961.     dp[11] = (unsigned int)(s2+(s1=sp[12])+1)>>1;
  962.     dp[12] = (unsigned int)(s1+(s2=sp[13])+1)>>1;
  963.     dp[13] = (unsigned int)(s2+(s1=sp[14])+1)>>1;
  964.     dp[14] = (unsigned int)(s1+(s2=sp[15])+1)>>1;
  965.     dp[15] = (unsigned int)(s2+sp[16]+1)>>1;
  966.     sp+= lx2;
  967.     dp+= lx2;
  968.   }
  969. }
  970. inline void rechc(unsigned char *s,unsigned char *d, int lx2, int h){
  971.   unsigned char *dp,*sp;
  972.   unsigned int s1,s2;
  973.   sp = s;
  974.   dp = d;
  975.   for (int j=0; j<h; j++){
  976.     s1=sp[0];
  977.     dp[0] = (unsigned int)(s1+(s2=sp[1])+1)>>1;
  978.     dp[1] = (unsigned int)(s2+(s1=sp[2])+1)>>1;
  979.     dp[2] = (unsigned int)(s1+(s2=sp[3])+1)>>1;
  980.     dp[3] = (unsigned int)(s2+(s1=sp[4])+1)>>1;
  981.     dp[4] = (unsigned int)(s1+(s2=sp[5])+1)>>1;
  982.     dp[5] = (unsigned int)(s2+(s1=sp[6])+1)>>1;
  983.     dp[6] = (unsigned int)(s1+(s2=sp[7])+1)>>1;
  984.     dp[7] = (unsigned int)(s2+sp[8]+1)>>1;
  985.     sp+= lx2;
  986.     dp+= lx2;
  987.   }
  988. }
  989. #endif
  990. #ifndef HAVE_3Dnow
  991. inline void recha(unsigned char *s, unsigned char *d,int lx2, int h){
  992.   unsigned char *dp,*sp;
  993.   unsigned int s1,s2;
  994.   sp = s;
  995.   dp = d;
  996.   for (int j=0; j<h; j++){
  997.     s1=sp[0];
  998.     dp[0] = (dp[0] + ((unsigned int)(s1+(s2=sp[1])+1)>>1) + 1)>>1;
  999.     dp[1] = (dp[1] + ((unsigned int)(s2+(s1=sp[2])+1)>>1) + 1)>>1;
  1000.     dp[2] = (dp[2] + ((unsigned int)(s1+(s2=sp[3])+1)>>1) + 1)>>1;
  1001.     dp[3] = (dp[3] + ((unsigned int)(s2+(s1=sp[4])+1)>>1) + 1)>>1;
  1002.     dp[4] = (dp[4] + ((unsigned int)(s1+(s2=sp[5])+1)>>1) + 1)>>1;
  1003.     dp[5] = (dp[5] + ((unsigned int)(s2+(s1=sp[6])+1)>>1) + 1)>>1;
  1004.     dp[6] = (dp[6] + ((unsigned int)(s1+(s2=sp[7])+1)>>1) + 1)>>1;
  1005.     dp[7] = (dp[7] + ((unsigned int)(s2+(s1=sp[8])+1)>>1) + 1)>>1;
  1006.     dp[8] = (dp[8] + ((unsigned int)(s1+(s2=sp[9])+1)>>1) + 1)>>1;
  1007.     dp[9] = (dp[9] + ((unsigned int)(s2+(s1=sp[10])+1)>>1) + 1)>>1;
  1008.     dp[10] = (dp[10] + ((unsigned int)(s1+(s2=sp[11])+1)>>1) + 1)>>1;
  1009.     dp[11] = (dp[11] + ((unsigned int)(s2+(s1=sp[12])+1)>>1) + 1)>>1;
  1010.     dp[12] = (dp[12] + ((unsigned int)(s1+(s2=sp[13])+1)>>1) + 1)>>1;
  1011.     dp[13] = (dp[13] + ((unsigned int)(s2+(s1=sp[14])+1)>>1) + 1)>>1;
  1012.     dp[14] = (dp[14] + ((unsigned int)(s1+(s2=sp[15])+1)>>1) + 1)>>1;
  1013.     dp[15] = (dp[15] + ((unsigned int)(s2+sp[16]+1)>>1) + 1)>>1;
  1014.     sp+= lx2;
  1015.     dp+= lx2;
  1016.   }
  1017. }
  1018. inline void rechac(unsigned char *s,unsigned char  *d, int lx2, int h){
  1019.   unsigned char *dp,*sp;
  1020.   unsigned int s1,s2;
  1021.   sp = s;
  1022.   dp = d;
  1023.   for (int j=0; j<h; j++){
  1024.     s1=sp[0];
  1025.     dp[0] = (dp[0] + ((unsigned int)(s1+(s2=sp[1])+1)>>1) + 1)>>1;
  1026.     dp[1] = (dp[1] + ((unsigned int)(s2+(s1=sp[2])+1)>>1) + 1)>>1;
  1027.     dp[2] = (dp[2] + ((unsigned int)(s1+(s2=sp[3])+1)>>1) + 1)>>1;
  1028.     dp[3] = (dp[3] + ((unsigned int)(s2+(s1=sp[4])+1)>>1) + 1)>>1;
  1029.     dp[4] = (dp[4] + ((unsigned int)(s1+(s2=sp[5])+1)>>1) + 1)>>1;
  1030.     dp[5] = (dp[5] + ((unsigned int)(s2+(s1=sp[6])+1)>>1) + 1)>>1;
  1031.     dp[6] = (dp[6] + ((unsigned int)(s1+(s2=sp[7])+1)>>1) + 1)>>1;
  1032.     dp[7] = (dp[7] + ((unsigned int)(s2+sp[8]+1)>>1) + 1)>>1;
  1033.     sp+= lx2;
  1034.     dp+= lx2;
  1035.   }
  1036. }
  1037. inline void rec4(unsigned char *s, unsigned char *d, int lx, int lx2, int h){
  1038.   unsigned char *dp,*sp,*sp2;
  1039.   unsigned int s1,s2,s3,s4;
  1040.   sp = s;
  1041.   sp2 = s+lx;
  1042.   dp = d;
  1043.   for (int j=0; j<h; j++){
  1044.     s1=sp[0]; s3=sp2[0];
  1045.     dp[0] = (unsigned int)(s1+(s2=sp[1])+s3+(s4=sp2[1])+2)>>2;
  1046.     dp[1] = (unsigned int)(s2+(s1=sp[2])+s4+(s3=sp2[2])+2)>>2;
  1047.     dp[2] = (unsigned int)(s1+(s2=sp[3])+s3+(s4=sp2[3])+2)>>2;
  1048.     dp[3] = (unsigned int)(s2+(s1=sp[4])+s4+(s3=sp2[4])+2)>>2;
  1049.     dp[4] = (unsigned int)(s1+(s2=sp[5])+s3+(s4=sp2[5])+2)>>2;
  1050.     dp[5] = (unsigned int)(s2+(s1=sp[6])+s4+(s3=sp2[6])+2)>>2;
  1051.     dp[6] = (unsigned int)(s1+(s2=sp[7])+s3+(s4=sp2[7])+2)>>2;
  1052.     dp[7] = (unsigned int)(s2+(s1=sp[8])+s4+(s3=sp2[8])+2)>>2;
  1053.     dp[8] = (unsigned int)(s1+(s2=sp[9])+s3+(s4=sp2[9])+2)>>2;
  1054.     dp[9] = (unsigned int)(s2+(s1=sp[10])+s4+(s3=sp2[10])+2)>>2;
  1055.     dp[10] = (unsigned int)(s1+(s2=sp[11])+s3+(s4=sp2[11])+2)>>2;
  1056.     dp[11] = (unsigned int)(s2+(s1=sp[12])+s4+(s3=sp2[12])+2)>>2;
  1057.     dp[12] = (unsigned int)(s1+(s2=sp[13])+s3+(s4=sp2[13])+2)>>2;
  1058.     dp[13] = (unsigned int)(s2+(s1=sp[14])+s4+(s3=sp2[14])+2)>>2;
  1059.     dp[14] = (unsigned int)(s1+(s2=sp[15])+s3+(s4=sp2[15])+2)>>2;
  1060.     dp[15] = (unsigned int)(s2+sp[16]+s4+sp2[16]+2)>>2;
  1061.     sp+= lx2;
  1062.     sp2+= lx2;
  1063.     dp+= lx2;
  1064.   }
  1065. }
  1066. inline void rec4c(unsigned char *s,unsigned char *d, int lx, int lx2, int h){
  1067.   unsigned char *dp,*sp,*sp2;
  1068.   unsigned int s1,s2,s3,s4;
  1069.   sp = s;
  1070.   sp2 = s+lx;
  1071.   dp = d;
  1072.   for (int j=0; j<h; j++){
  1073.     s1=sp[0]; s3=sp2[0];
  1074.     dp[0] = (unsigned int)(s1+(s2=sp[1])+s3+(s4=sp2[1])+2)>>2;
  1075.     dp[1] = (unsigned int)(s2+(s1=sp[2])+s4+(s3=sp2[2])+2)>>2;
  1076.     dp[2] = (unsigned int)(s1+(s2=sp[3])+s3+(s4=sp2[3])+2)>>2;
  1077.     dp[3] = (unsigned int)(s2+(s1=sp[4])+s4+(s3=sp2[4])+2)>>2;
  1078.     dp[4] = (unsigned int)(s1+(s2=sp[5])+s3+(s4=sp2[5])+2)>>2;
  1079.     dp[5] = (unsigned int)(s2+(s1=sp[6])+s4+(s3=sp2[6])+2)>>2;
  1080.     dp[6] = (unsigned int)(s1+(s2=sp[7])+s3+(s4=sp2[7])+2)>>2;
  1081.     dp[7] = (unsigned int)(s2+sp[8]+s4+sp2[8]+2)>>2;
  1082.     sp+= lx2;
  1083.     sp2+= lx2;
  1084.     dp+= lx2;
  1085.   }
  1086. }
  1087. inline void rec4a(unsigned char *s,unsigned char *d, int lx, int lx2, int h){
  1088.   unsigned char *dp=d, *sp=s, *sp2=s+lx;
  1089.   unsigned int s1, s2, s3, s4;
  1090. /*
  1091.   sp = s;
  1092.   sp2 = s+lx;
  1093.   dp = d;
  1094. */
  1095.   for (int j=0; j<h; j++){
  1096.     s1=sp[0]; s3=sp2[0];
  1097.     dp[0] = (dp[0] + ((unsigned int)(s1+(s2=sp[1])+s3+(s4=sp2[1])+2)>>2) + 1)>>1;
  1098.     dp[1] = (dp[1] + ((unsigned int)(s2+(s1=sp[2])+s4+(s3=sp2[2])+2)>>2) + 1)>>1;
  1099.     dp[2] = (dp[2] + ((unsigned int)(s1+(s2=sp[3])+s3+(s4=sp2[3])+2)>>2) + 1)>>1;
  1100.     dp[3] = (dp[3] + ((unsigned int)(s2+(s1=sp[4])+s4+(s3=sp2[4])+2)>>2) + 1)>>1;
  1101.     dp[4] = (dp[4] + ((unsigned int)(s1+(s2=sp[5])+s3+(s4=sp2[5])+2)>>2) + 1)>>1;
  1102.     dp[5] = (dp[5] + ((unsigned int)(s2+(s1=sp[6])+s4+(s3=sp2[6])+2)>>2) + 1)>>1;
  1103.     dp[6] = (dp[6] + ((unsigned int)(s1+(s2=sp[7])+s3+(s4=sp2[7])+2)>>2) + 1)>>1;
  1104.     dp[7] = (dp[7] + ((unsigned int)(s2+(s1=sp[8])+s4+(s3=sp2[8])+2)>>2) + 1)>>1;
  1105.     dp[8] = (dp[8] + ((unsigned int)(s1+(s2=sp[9])+s3+(s4=sp2[9])+2)>>2) + 1)>>1;
  1106.     dp[9] = (dp[9] + ((unsigned int)(s2+(s1=sp[10])+s4+(s3=sp2[10])+2)>>2) + 1)>>1;
  1107.     dp[10] = (dp[10] + ((unsigned int)(s1+(s2=sp[11])+s3+(s4=sp2[11])+2)>>2) + 1)>>1;
  1108.     dp[11] = (dp[11] + ((unsigned int)(s2+(s1=sp[12])+s4+(s3=sp2[12])+2)>>2) + 1)>>1;
  1109.     dp[12] = (dp[12] + ((unsigned int)(s1+(s2=sp[13])+s3+(s4=sp2[13])+2)>>2) + 1)>>1;
  1110.     dp[13] = (dp[13] + ((unsigned int)(s2+(s1=sp[14])+s4+(s3=sp2[14])+2)>>2) + 1)>>1;
  1111.     dp[14] = (dp[14] + ((unsigned int)(s1+(s2=sp[15])+s3+(s4=sp2[15])+2)>>2) + 1)>>1;
  1112.     dp[15] = (dp[15] + ((unsigned int)(s2+sp[16]+s4+sp2[16]+2)>>2) + 1)>>1;
  1113.     sp+= lx2;
  1114.     sp2+= lx2;
  1115.     dp+= lx2;
  1116.   }
  1117. }
  1118. inline void rec4ac(unsigned char *s,unsigned char  *d, int lx, int lx2, int h){
  1119.   unsigned char *dp=d, *sp=s, *sp2=s+lx;
  1120.   unsigned int s1,s2,s3,s4;
  1121. /*
  1122.   sp = s;
  1123.   sp2 = s+lx;
  1124.   dp = d;
  1125. */
  1126.   for (int j=0; j<h; j++){
  1127.     s1=sp[0]; s3=sp2[0];
  1128.     dp[0] = (dp[0] + ((unsigned int)(s1+(s2=sp[1])+s3+(s4=sp2[1])+2)>>2) + 1)>>1;
  1129.     dp[1] = (dp[1] + ((unsigned int)(s2+(s1=sp[2])+s4+(s3=sp2[2])+2)>>2) + 1)>>1;
  1130.     dp[2] = (dp[2] + ((unsigned int)(s1+(s2=sp[3])+s3+(s4=sp2[3])+2)>>2) + 1)>>1;
  1131.     dp[3] = (dp[3] + ((unsigned int)(s2+(s1=sp[4])+s4+(s3=sp2[4])+2)>>2) + 1)>>1;
  1132.     dp[4] = (dp[4] + ((unsigned int)(s1+(s2=sp[5])+s3+(s4=sp2[5])+2)>>2) + 1)>>1;
  1133.     dp[5] = (dp[5] + ((unsigned int)(s2+(s1=sp[6])+s4+(s3=sp2[6])+2)>>2) + 1)>>1;
  1134.     dp[6] = (dp[6] + ((unsigned int)(s1+(s2=sp[7])+s3+(s4=sp2[7])+2)>>2) + 1)>>1;
  1135.     dp[7] = (dp[7] + ((unsigned int)(s2+sp[8]+s4+sp2[8]+2)>>2) + 1)>>1;
  1136.     sp+= lx2;
  1137.     sp2+= lx2;
  1138.     dp+= lx2;
  1139.   }
  1140. }
  1141. #endif