reconstruct.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:39k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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