qpel.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:67k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* 
  2. this is optimized for sh, which have post increment addressing (*p++)
  3. some cpu may be index (p[n]) faster than post increment (*p++)
  4. */
  5. #define LD(adr) *(uint32_t*)(adr)
  6. #define PIXOP2(OPNAME, OP) 
  7. /*static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  8. {
  9. do {
  10. OP(LP(dst  ),no_rnd_avg32(LD32(src1  ),LD32(src2  )) ); 
  11. OP(LP(dst+4),no_rnd_avg32(LD32(src1+4),LD32(src2+4)) ); 
  12. src1+=src_stride1; 
  13. src2+=src_stride2; 
  14. dst+=dst_stride; 
  15. } while(--h); 
  16. }
  17. static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  18. {
  19. do {
  20. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LD32(src2  )) ); 
  21. OP(LP(dst+4),rnd_avg32(LD32(src1+4),LD32(src2+4)) ); 
  22. src1+=src_stride1; 
  23. src2+=src_stride2; 
  24. dst+=dst_stride; 
  25. } while(--h); 
  26. }
  27. static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  28. {
  29. do {
  30. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LD32(src2  )) ); 
  31. src1+=src_stride1; 
  32. src2+=src_stride2; 
  33. dst+=dst_stride; 
  34. } while(--h); 
  35. }
  36. static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  37. {
  38. do {
  39. OP(LP(dst  ),no_rnd_avg32(LD32(src1  ),LD32(src2  )) ); 
  40. OP(LP(dst+4),no_rnd_avg32(LD32(src1+4),LD32(src2+4)) ); 
  41. OP(LP(dst+8),no_rnd_avg32(LD32(src1+8),LD32(src2+8)) ); 
  42. OP(LP(dst+12),no_rnd_avg32(LD32(src1+12),LD32(src2+12)) ); 
  43. src1+=src_stride1; 
  44. src2+=src_stride2; 
  45. dst+=dst_stride; 
  46. } while(--h); 
  47. }
  48. static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  49. {
  50. do {
  51. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LD32(src2  )) ); 
  52. OP(LP(dst+4),rnd_avg32(LD32(src1+4),LD32(src2+4)) ); 
  53. OP(LP(dst+8),rnd_avg32(LD32(src1+8),LD32(src2+8)) ); 
  54. OP(LP(dst+12),rnd_avg32(LD32(src1+12),LD32(src2+12)) ); 
  55. src1+=src_stride1; 
  56. src2+=src_stride2; 
  57. dst+=dst_stride; 
  58. } while(--h); 
  59. }*/
  60. static inline void OPNAME ## _pixels4_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  61. {
  62. do {
  63. OP(LP(dst  ),rnd_avg32(LP(src1  ),LP(src2  )) ); 
  64. src1+=src_stride1; 
  65. src2+=src_stride2; 
  66. dst+=dst_stride; 
  67. } while(--h); 
  68. }
  69. static inline void OPNAME ## _pixels4_l2_aligned2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  70. {
  71. do {
  72. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LP(src2  )) ); 
  73. src1+=src_stride1; 
  74. src2+=src_stride2; 
  75. dst+=dst_stride; 
  76. } while(--h); 
  77. }
  78. static inline void OPNAME ## _no_rnd_pixels16_l2_aligned2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  79. {
  80. do {
  81. OP(LP(dst  ),no_rnd_avg32(LD32(src1  ),LP(src2  )) ); 
  82. OP(LP(dst+4),no_rnd_avg32(LD32(src1+4),LP(src2+4)) ); 
  83. OP(LP(dst+8),no_rnd_avg32(LD32(src1+8),LP(src2+8)) ); 
  84. OP(LP(dst+12),no_rnd_avg32(LD32(src1+12),LP(src2+12)) ); 
  85. src1+=src_stride1; 
  86. src2+=src_stride2; 
  87. dst+=dst_stride; 
  88. } while(--h); 
  89. }
  90. static inline void OPNAME ## _pixels16_l2_aligned2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  91. {
  92. do {
  93. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LP(src2  )) ); 
  94. OP(LP(dst+4),rnd_avg32(LD32(src1+4),LP(src2+4)) ); 
  95. OP(LP(dst+8),rnd_avg32(LD32(src1+8),LP(src2+8)) ); 
  96. OP(LP(dst+12),rnd_avg32(LD32(src1+12),LP(src2+12)) ); 
  97. src1+=src_stride1; 
  98. src2+=src_stride2; 
  99. dst+=dst_stride; 
  100. } while(--h); 
  101. }
  102. static inline void OPNAME ## _no_rnd_pixels8_l2_aligned2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  103. {
  104. do { /* onlye src2 aligned */
  105. OP(LP(dst  ),no_rnd_avg32(LD32(src1  ),LP(src2  )) ); 
  106. OP(LP(dst+4),no_rnd_avg32(LD32(src1+4),LP(src2+4)) ); 
  107. src1+=src_stride1; 
  108. src2+=src_stride2; 
  109. dst+=dst_stride; 
  110. } while(--h); 
  111. }
  112. static inline void OPNAME ## _pixels8_l2_aligned2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  113. {
  114. do {
  115. OP(LP(dst  ),rnd_avg32(LD32(src1  ),LP(src2  )) ); 
  116. OP(LP(dst+4),rnd_avg32(LD32(src1+4),LP(src2+4)) ); 
  117. src1+=src_stride1; 
  118. src2+=src_stride2; 
  119. dst+=dst_stride; 
  120. } while(--h); 
  121. }
  122. static inline void OPNAME ## _no_rnd_pixels8_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  123. {
  124. do {
  125. OP(LP(dst  ),no_rnd_avg32(LP(src1  ),LP(src2  )) ); 
  126. OP(LP(dst+4),no_rnd_avg32(LP(src1+4),LP(src2+4)) ); 
  127. src1+=src_stride1; 
  128. src2+=src_stride2; 
  129. dst+=dst_stride; 
  130. } while(--h); 
  131. }
  132. static inline void OPNAME ## _pixels8_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  133. {
  134. do {
  135. OP(LP(dst  ),rnd_avg32(LP(src1  ),LP(src2  )) ); 
  136. OP(LP(dst+4),rnd_avg32(LP(src1+4),LP(src2+4)) ); 
  137. src1+=src_stride1; 
  138. src2+=src_stride2; 
  139. dst+=dst_stride; 
  140. } while(--h); 
  141. }
  142. static inline void OPNAME ## _no_rnd_pixels16_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  143. {
  144. do {
  145. OP(LP(dst  ),no_rnd_avg32(LP(src1  ),LP(src2  )) ); 
  146. OP(LP(dst+4),no_rnd_avg32(LP(src1+4),LP(src2+4)) ); 
  147. OP(LP(dst+8),no_rnd_avg32(LP(src1+8),LP(src2+8)) ); 
  148. OP(LP(dst+12),no_rnd_avg32(LP(src1+12),LP(src2+12)) ); 
  149. src1+=src_stride1; 
  150. src2+=src_stride2; 
  151. dst+=dst_stride; 
  152. } while(--h); 
  153. }
  154. static inline void OPNAME ## _pixels16_l2_aligned(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  155. {
  156. do {
  157. OP(LP(dst  ),rnd_avg32(LP(src1  ),LP(src2  )) ); 
  158. OP(LP(dst+4),rnd_avg32(LP(src1+4),LP(src2+4)) ); 
  159. OP(LP(dst+8),rnd_avg32(LP(src1+8),LP(src2+8)) ); 
  160. OP(LP(dst+12),rnd_avg32(LP(src1+12),LP(src2+12)) ); 
  161. src1+=src_stride1; 
  162. src2+=src_stride2; 
  163. dst+=dst_stride; 
  164. } while(--h); 
  165. }
  166. static inline void OPNAME ## _no_rnd_pixels16_l2_aligned1(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  167. { OPNAME ## _no_rnd_pixels16_l2_aligned2(dst,src2,src1,dst_stride,src_stride2,src_stride1,h); } 
  168. static inline void OPNAME ## _pixels16_l2_aligned1(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  169. { OPNAME ## _pixels16_l2_aligned2(dst,src2,src1,dst_stride,src_stride2,src_stride1,h); } 
  170. static inline void OPNAME ## _no_rnd_pixels8_l2_aligned1(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  171. { OPNAME ## _no_rnd_pixels8_l2_aligned2(dst,src2,src1,dst_stride,src_stride2,src_stride1,h); } 
  172. static inline void OPNAME ## _pixels8_l2_aligned1(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h) 
  173. { OPNAME ## _pixels8_l2_aligned2(dst,src2,src1,dst_stride,src_stride2,src_stride1,h); } 
  174. static inline void OPNAME ## _pixels8_l4_aligned(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  175. do { 
  176. uint32_t a0,a1,a2,a3; 
  177. UNPACK(a0,a1,LP(src1),LP(src2)); 
  178. UNPACK(a2,a3,LP(src3),LP(src4)); 
  179. OP(LP(dst),rnd_PACK(a0,a1,a2,a3)); 
  180. UNPACK(a0,a1,LP(src1+4),LP(src2+4)); 
  181. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  182. OP(LP(dst+4),rnd_PACK(a0,a1,a2,a3)); 
  183. src1+=src_stride1;
  184. src2+=src_stride2;
  185. src3+=src_stride3;
  186. src4+=src_stride4;
  187. dst+=dst_stride;
  188. } while(--h); 
  189. static inline void OPNAME ## _no_rnd_pixels8_l4_aligned(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  190. do { 
  191. uint32_t a0,a1,a2,a3; 
  192. UNPACK(a0,a1,LP(src1),LP(src2)); 
  193. UNPACK(a2,a3,LP(src3),LP(src4)); 
  194. OP(LP(dst),no_rnd_PACK(a0,a1,a2,a3)); 
  195. UNPACK(a0,a1,LP(src1+4),LP(src2+4)); 
  196. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  197. OP(LP(dst+4),no_rnd_PACK(a0,a1,a2,a3)); 
  198. src1+=src_stride1;
  199. src2+=src_stride2;
  200. src3+=src_stride3;
  201. src4+=src_stride4;
  202. dst+=dst_stride;
  203. } while(--h); 
  204. static inline void OPNAME ## _pixels8_l4_aligned0(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  205. do { 
  206. uint32_t a0,a1,a2,a3; /* src1 only not aligned */
  207. UNPACK(a0,a1,LD32(src1),LP(src2)); 
  208. UNPACK(a2,a3,LP(src3),LP(src4)); 
  209. OP(LP(dst),rnd_PACK(a0,a1,a2,a3)); 
  210. UNPACK(a0,a1,LD32(src1+4),LP(src2+4)); 
  211. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  212. OP(LP(dst+4),rnd_PACK(a0,a1,a2,a3)); 
  213. src1+=src_stride1;
  214. src2+=src_stride2;
  215. src3+=src_stride3;
  216. src4+=src_stride4;
  217. dst+=dst_stride;
  218. } while(--h); 
  219. static inline void OPNAME ## _no_rnd_pixels8_l4_aligned0(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  220. do { 
  221. uint32_t a0,a1,a2,a3; 
  222. UNPACK(a0,a1,LD32(src1),LP(src2)); 
  223. UNPACK(a2,a3,LP(src3),LP(src4)); 
  224. OP(LP(dst),no_rnd_PACK(a0,a1,a2,a3)); 
  225. UNPACK(a0,a1,LD32(src1+4),LP(src2+4)); 
  226. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  227. OP(LP(dst+4),no_rnd_PACK(a0,a1,a2,a3)); 
  228. src1+=src_stride1;
  229. src2+=src_stride2;
  230. src3+=src_stride3;
  231. src4+=src_stride4;
  232. dst+=dst_stride;
  233. } while(--h); 
  234. static inline void OPNAME ## _pixels16_l4_aligned(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  235. do { 
  236. uint32_t a0,a1,a2,a3; 
  237. UNPACK(a0,a1,LP(src1),LP(src2)); 
  238. UNPACK(a2,a3,LP(src3),LP(src4)); 
  239. OP(LP(dst),rnd_PACK(a0,a1,a2,a3)); 
  240. UNPACK(a0,a1,LP(src1+4),LP(src2+4)); 
  241. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  242. OP(LP(dst+8),rnd_PACK(a0,a1,a2,a3)); 
  243. UNPACK(a0,a1,LP(src1+8),LP(src2+8)); 
  244. UNPACK(a2,a3,LP(src3+8),LP(src4+8)); 
  245. OP(LP(dst+8),rnd_PACK(a0,a1,a2,a3)); 
  246. UNPACK(a0,a1,LP(src1+12),LP(src2+12)); 
  247. UNPACK(a2,a3,LP(src3+12),LP(src4+12)); 
  248. OP(LP(dst+12),rnd_PACK(a0,a1,a2,a3)); 
  249. src1+=src_stride1;
  250. src2+=src_stride2;
  251. src3+=src_stride3;
  252. src4+=src_stride4;
  253. dst+=dst_stride;
  254. } while(--h); 
  255. static inline void OPNAME ## _no_rnd_pixels16_l4_aligned(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  256. do { 
  257. uint32_t a0,a1,a2,a3; 
  258. UNPACK(a0,a1,LP(src1),LP(src2)); 
  259. UNPACK(a2,a3,LP(src3),LP(src4)); 
  260. OP(LP(dst),no_rnd_PACK(a0,a1,a2,a3)); 
  261. UNPACK(a0,a1,LP(src1+4),LP(src2+4)); 
  262. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  263. OP(LP(dst+4),no_rnd_PACK(a0,a1,a2,a3)); 
  264. UNPACK(a0,a1,LP(src1+8),LP(src2+8)); 
  265. UNPACK(a2,a3,LP(src3+8),LP(src4+8)); 
  266. OP(LP(dst+8),no_rnd_PACK(a0,a1,a2,a3)); 
  267. UNPACK(a0,a1,LP(src1+12),LP(src2+12)); 
  268. UNPACK(a2,a3,LP(src3+12),LP(src4+12)); 
  269. OP(LP(dst+12),no_rnd_PACK(a0,a1,a2,a3)); 
  270. src1+=src_stride1;
  271. src2+=src_stride2;
  272. src3+=src_stride3;
  273. src4+=src_stride4;
  274. dst+=dst_stride;
  275. } while(--h); 
  276. static inline void OPNAME ## _pixels16_l4_aligned0(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  277. do { /* src1 is unaligned */
  278. uint32_t a0,a1,a2,a3; 
  279. UNPACK(a0,a1,LD32(src1),LP(src2)); 
  280. UNPACK(a2,a3,LP(src3),LP(src4)); 
  281. OP(LP(dst),rnd_PACK(a0,a1,a2,a3)); 
  282. UNPACK(a0,a1,LD32(src1+4),LP(src2+4)); 
  283. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  284. OP(LP(dst+8),rnd_PACK(a0,a1,a2,a3)); 
  285. UNPACK(a0,a1,LD32(src1+8),LP(src2+8)); 
  286. UNPACK(a2,a3,LP(src3+8),LP(src4+8)); 
  287. OP(LP(dst+8),rnd_PACK(a0,a1,a2,a3)); 
  288. UNPACK(a0,a1,LD32(src1+12),LP(src2+12)); 
  289. UNPACK(a2,a3,LP(src3+12),LP(src4+12)); 
  290. OP(LP(dst+12),rnd_PACK(a0,a1,a2,a3)); 
  291. src1+=src_stride1;
  292. src2+=src_stride2;
  293. src3+=src_stride3;
  294. src4+=src_stride4;
  295. dst+=dst_stride;
  296. } while(--h); 
  297. static inline void OPNAME ## _no_rnd_pixels16_l4_aligned0(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){
  298. do { 
  299. uint32_t a0,a1,a2,a3; 
  300. UNPACK(a0,a1,LD32(src1),LP(src2)); 
  301. UNPACK(a2,a3,LP(src3),LP(src4)); 
  302. OP(LP(dst),no_rnd_PACK(a0,a1,a2,a3)); 
  303. UNPACK(a0,a1,LD32(src1+4),LP(src2+4)); 
  304. UNPACK(a2,a3,LP(src3+4),LP(src4+4)); 
  305. OP(LP(dst+4),no_rnd_PACK(a0,a1,a2,a3)); 
  306. UNPACK(a0,a1,LD32(src1+8),LP(src2+8)); 
  307. UNPACK(a2,a3,LP(src3+8),LP(src4+8)); 
  308. OP(LP(dst+8),no_rnd_PACK(a0,a1,a2,a3)); 
  309. UNPACK(a0,a1,LD32(src1+12),LP(src2+12)); 
  310. UNPACK(a2,a3,LP(src3+12),LP(src4+12)); 
  311. OP(LP(dst+12),no_rnd_PACK(a0,a1,a2,a3)); 
  312. src1+=src_stride1;
  313. src2+=src_stride2;
  314. src3+=src_stride3;
  315. src4+=src_stride4;
  316. dst+=dst_stride;
  317. } while(--h); 
  318. #define op_avg(a, b) a = rnd_avg32(a,b)
  319. #define op_put(a, b) a = b
  320. PIXOP2(avg, op_avg)
  321. PIXOP2(put, op_put)
  322. #undef op_avg
  323. #undef op_put
  324. #define avg2(a,b) ((a+b+1)>>1)
  325. #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
  326. static void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder)
  327. {
  328.     const int A=(16-x16)*(16-y16);
  329.     const int B=(   x16)*(16-y16);
  330.     const int C=(16-x16)*(   y16);
  331.     const int D=(   x16)*(   y16);
  332.     do {
  333.         int t0,t1,t2,t3;
  334.         uint8_t *s0 = src;
  335.         uint8_t *s1 = src+stride;
  336.         t0 = *s0++; t2 = *s1++;
  337.         t1 = *s0++; t3 = *s1++;
  338.         dst[0]= (A*t0 + B*t1 + C*t2 + D*t3 + rounder)>>8;
  339.         t0 = *s0++; t2 = *s1++;
  340.         dst[1]= (A*t1 + B*t0 + C*t3 + D*t2 + rounder)>>8;
  341.         t1 = *s0++; t3 = *s1++;
  342.         dst[2]= (A*t0 + B*t1 + C*t2 + D*t3 + rounder)>>8;
  343.         t0 = *s0++; t2 = *s1++;
  344.         dst[3]= (A*t1 + B*t0 + C*t3 + D*t2 + rounder)>>8;
  345.         t1 = *s0++; t3 = *s1++;
  346.         dst[4]= (A*t0 + B*t1 + C*t2 + D*t3 + rounder)>>8;
  347.         t0 = *s0++; t2 = *s1++;
  348.         dst[5]= (A*t1 + B*t0 + C*t3 + D*t2 + rounder)>>8;
  349.         t1 = *s0++; t3 = *s1++;
  350.         dst[6]= (A*t0 + B*t1 + C*t2 + D*t3 + rounder)>>8;
  351.         t0 = *s0++; t2 = *s1++;
  352.         dst[7]= (A*t1 + B*t0 + C*t3 + D*t2 + rounder)>>8;
  353.         dst+= stride;
  354.         src+= stride;
  355.     }while(--h);
  356. }
  357. static void gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, 
  358.                   int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height)
  359. {
  360.     int y, vx, vy;
  361.     const int s= 1<<shift;
  362.     
  363.     width--;
  364.     height--;
  365.     for(y=0; y<h; y++){
  366.         int x;
  367.         vx= ox;
  368.         vy= oy;
  369.         for(x=0; x<8; x++){ //XXX FIXME optimize
  370.             int src_x, src_y, frac_x, frac_y, index;
  371.             src_x= vx>>16;
  372.             src_y= vy>>16;
  373.             frac_x= src_x&(s-1);
  374.             frac_y= src_y&(s-1);
  375.             src_x>>=shift;
  376.             src_y>>=shift;
  377.   
  378.             if((unsigned)src_x < width){
  379.                 if((unsigned)src_y < height){
  380.                     index= src_x + src_y*stride;
  381.                     dst[y*stride + x]= (  (  src[index         ]*(s-frac_x)
  382.                                            + src[index       +1]*   frac_x )*(s-frac_y)
  383.                                         + (  src[index+stride  ]*(s-frac_x)
  384.                                            + src[index+stride+1]*   frac_x )*   frac_y
  385.                                         + r)>>(shift*2);
  386.                 }else{
  387.                     index= src_x + clip(src_y, 0, height)*stride;                    
  388.                     dst[y*stride + x]= ( (  src[index         ]*(s-frac_x) 
  389.                                           + src[index       +1]*   frac_x )*s
  390.                                         + r)>>(shift*2);
  391.                 }
  392.             }else{
  393.                 if((unsigned)src_y < height){
  394.                     index= clip(src_x, 0, width) + src_y*stride;                    
  395.                     dst[y*stride + x]= (  (  src[index         ]*(s-frac_y) 
  396.                                            + src[index+stride  ]*   frac_y )*s
  397.                                         + r)>>(shift*2);
  398.                 }else{
  399.                     index= clip(src_x, 0, width) + clip(src_y, 0, height)*stride;                    
  400.                     dst[y*stride + x]=    src[index         ];
  401.                 }
  402.             }
  403.             
  404.             vx+= dxx;
  405.             vy+= dyx;
  406.         }
  407.         ox += dxy;
  408.         oy += dyy;
  409.     }
  410. }
  411. #define H264_CHROMA_MC(OPNAME, OP)
  412. 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){
  413.     const int A=(8-x)*(8-y);
  414.     const int B=(  x)*(8-y);
  415.     const int C=(8-x)*(  y);
  416.     const int D=(  x)*(  y);
  417.     
  418.     assert(x<8 && y<8 && x>=0 && y>=0);
  419.     do {
  420.         int t0,t1,t2,t3; 
  421.         uint8_t *s0 = src; 
  422.         uint8_t *s1 = src+stride; 
  423.         t0 = *s0++; t2 = *s1++; 
  424.         t1 = *s0++; t3 = *s1++; 
  425.         OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));
  426.         t0 = *s0++; t2 = *s1++; 
  427.         OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));
  428.         dst+= stride;
  429.         src+= stride;
  430.     }while(--h);
  431. }
  432. 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){
  433.     const int A=(8-x)*(8-y);
  434.     const int B=(  x)*(8-y);
  435.     const int C=(8-x)*(  y);
  436.     const int D=(  x)*(  y);
  437.     
  438.     assert(x<8 && y<8 && x>=0 && y>=0);
  439.     do {
  440.         int t0,t1,t2,t3; 
  441.         uint8_t *s0 = src; 
  442.         uint8_t *s1 = src+stride; 
  443.         t0 = *s0++; t2 = *s1++; 
  444.         t1 = *s0++; t3 = *s1++; 
  445.         OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));
  446.         t0 = *s0++; t2 = *s1++; 
  447.         OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));
  448.         t1 = *s0++; t3 = *s1++; 
  449.         OP(dst[2], (A*t0 + B*t1 + C*t2 + D*t3));
  450.         t0 = *s0++; t2 = *s1++; 
  451.         OP(dst[3], (A*t1 + B*t0 + C*t3 + D*t2));
  452.         dst+= stride;
  453.         src+= stride;
  454.     }while(--h);
  455. }
  456. 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){
  457.     const int A=(8-x)*(8-y);
  458.     const int B=(  x)*(8-y);
  459.     const int C=(8-x)*(  y);
  460.     const int D=(  x)*(  y);
  461.     
  462.     assert(x<8 && y<8 && x>=0 && y>=0);
  463.     do {
  464.         int t0,t1,t2,t3; 
  465.         uint8_t *s0 = src; 
  466.         uint8_t *s1 = src+stride; 
  467.         t0 = *s0++; t2 = *s1++; 
  468.         t1 = *s0++; t3 = *s1++; 
  469.         OP(dst[0], (A*t0 + B*t1 + C*t2 + D*t3));
  470.         t0 = *s0++; t2 = *s1++; 
  471.         OP(dst[1], (A*t1 + B*t0 + C*t3 + D*t2));
  472.         t1 = *s0++; t3 = *s1++; 
  473.         OP(dst[2], (A*t0 + B*t1 + C*t2 + D*t3));
  474.         t0 = *s0++; t2 = *s1++; 
  475.         OP(dst[3], (A*t1 + B*t0 + C*t3 + D*t2));
  476.         t1 = *s0++; t3 = *s1++; 
  477.         OP(dst[4], (A*t0 + B*t1 + C*t2 + D*t3));
  478.         t0 = *s0++; t2 = *s1++; 
  479.         OP(dst[5], (A*t1 + B*t0 + C*t3 + D*t2));
  480.         t1 = *s0++; t3 = *s1++; 
  481.         OP(dst[6], (A*t0 + B*t1 + C*t2 + D*t3));
  482.         t0 = *s0++; t2 = *s1++; 
  483.         OP(dst[7], (A*t1 + B*t0 + C*t3 + D*t2));
  484.         dst+= stride;
  485.         src+= stride;
  486.     }while(--h);
  487. }
  488. #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
  489. #define op_put(a, b) a = (((b) + 32)>>6)
  490. H264_CHROMA_MC(put_       , op_put)
  491. H264_CHROMA_MC(avg_       , op_avg)
  492. #undef op_avg
  493. #undef op_put
  494. /* not yet optimized */
  495. static inline void copy_block4(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  496. {
  497.     int i;
  498.     for(i=0; i<h; i++)
  499.     {
  500.         ST32(dst   , LD32(src   ));
  501.         dst+=dstStride;
  502.         src+=srcStride;
  503.     }
  504. }
  505. static inline void copy_block8(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  506. {
  507.     int i;
  508.     for(i=0; i<h; i++)
  509.     {
  510.         ST32(dst   , LD32(src   ));
  511.         ST32(dst+4 , LD32(src+4 ));
  512.         dst+=dstStride;
  513.         src+=srcStride;
  514.     }
  515. }
  516. static inline void copy_block16(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  517. {
  518.     int i;
  519.     for(i=0; i<h; i++)
  520.     {
  521.         ST32(dst   , LD32(src   ));
  522.         ST32(dst+4 , LD32(src+4 ));
  523.         ST32(dst+8 , LD32(src+8 ));
  524.         ST32(dst+12, LD32(src+12));
  525.         dst+=dstStride;
  526.         src+=srcStride;
  527.     }
  528. }
  529. static inline void copy_block17(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  530. {
  531.     int i;
  532.     for(i=0; i<h; i++)
  533.     {
  534.         ST32(dst   , LD32(src   ));
  535.         ST32(dst+4 , LD32(src+4 ));
  536.         ST32(dst+8 , LD32(src+8 ));
  537.         ST32(dst+12, LD32(src+12));
  538.         dst[16]= src[16];
  539.         dst+=dstStride;
  540.         src+=srcStride;
  541.     }
  542. }
  543. static inline void copy_block9(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h)
  544. {
  545.     int i;
  546.     for(i=0; i<h; i++)
  547.     {
  548.         ST32(dst   , LD32(src   ));
  549.         ST32(dst+4 , LD32(src+4 ));
  550.         dst[8]= src[8];
  551.         dst+=dstStride;
  552.         src+=srcStride;
  553.     }
  554. }
  555. /* end not optimized */
  556. #define QPEL_MC(r, OPNAME, RND, OP) 
  557. static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  558.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  559.     do {
  560.         uint8_t *s = src; 
  561.         int src0,src1,src2,src3,src4,src5,src6,src7,src8;
  562.         src0= *s++;
  563.         src1= *s++;
  564.         src2= *s++;
  565.         src3= *s++;
  566.         src4= *s++;
  567.         OP(dst[0], (src0+src1)*20 - (src0+src2)*6 + (src1+src3)*3 - (src2+src4));
  568.         src5= *s++;
  569.         OP(dst[1], (src1+src2)*20 - (src0+src3)*6 + (src0+src4)*3 - (src1+src5));
  570.         src6= *s++;
  571.         OP(dst[2], (src2+src3)*20 - (src1+src4)*6 + (src0+src5)*3 - (src0+src6));
  572.         src7= *s++;
  573.         OP(dst[3], (src3+src4)*20 - (src2+src5)*6 + (src1+src6)*3 - (src0+src7));
  574.         src8= *s++;
  575.         OP(dst[4], (src4+src5)*20 - (src3+src6)*6 + (src2+src7)*3 - (src1+src8));
  576.         OP(dst[5], (src5+src6)*20 - (src4+src7)*6 + (src3+src8)*3 - (src2+src8));
  577.         OP(dst[6], (src6+src7)*20 - (src5+src8)*6 + (src4+src8)*3 - (src3+src7));
  578.         OP(dst[7], (src7+src8)*20 - (src6+src8)*6 + (src5+src7)*3 - (src4+src6));
  579.         dst+=dstStride;
  580.         src+=srcStride;
  581.     }while(--h);
  582. }
  583. static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  584.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  585.     int w=8;
  586.     do{
  587.         uint8_t *s = src, *d=dst;
  588.         int src0,src1,src2,src3,src4,src5,src6,src7,src8;
  589.         src0 = *s; s+=srcStride; 
  590.         src1 = *s; s+=srcStride; 
  591.         src2 = *s; s+=srcStride; 
  592.         src3 = *s; s+=srcStride; 
  593.         src4 = *s; s+=srcStride; 
  594.         OP(*d, (src0+src1)*20 - (src0+src2)*6 + (src1+src3)*3 - (src2+src4));d+=dstStride;
  595.         src5 = *s; s+=srcStride; 
  596.         OP(*d, (src1+src2)*20 - (src0+src3)*6 + (src0+src4)*3 - (src1+src5));d+=dstStride;
  597.         src6 = *s; s+=srcStride; 
  598.         OP(*d, (src2+src3)*20 - (src1+src4)*6 + (src0+src5)*3 - (src0+src6));d+=dstStride;
  599.         src7 = *s; s+=srcStride; 
  600.         OP(*d, (src3+src4)*20 - (src2+src5)*6 + (src1+src6)*3 - (src0+src7));d+=dstStride;
  601.         src8 = *s; 
  602.         OP(*d, (src4+src5)*20 - (src3+src6)*6 + (src2+src7)*3 - (src1+src8));d+=dstStride;
  603.         OP(*d, (src5+src6)*20 - (src4+src7)*6 + (src3+src8)*3 - (src2+src8));d+=dstStride;
  604.         OP(*d, (src6+src7)*20 - (src5+src8)*6 + (src4+src8)*3 - (src3+src7));d+=dstStride;
  605.         OP(*d, (src7+src8)*20 - (src6+src8)*6 + (src5+src7)*3 - (src4+src6));
  606.         dst++;
  607.         src++;
  608.     }while(--w);
  609. }
  610. static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  611.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  612.     do {
  613.         uint8_t *s = src;
  614.         int src0,src1,src2,src3,src4,src5,src6,src7,src8;
  615.         int src9,src10,src11,src12,src13,src14,src15,src16;
  616.         src0= *s++;
  617.         src1= *s++;
  618.         src2= *s++;
  619.         src3= *s++;
  620.         src4= *s++;
  621.         OP(dst[ 0], (src0 +src1 )*20 - (src0 +src2 )*6 + (src1 +src3 )*3 - (src2 +src4 ));
  622.         src5= *s++;
  623.         OP(dst[ 1], (src1 +src2 )*20 - (src0 +src3 )*6 + (src0 +src4 )*3 - (src1 +src5 ));
  624.         src6= *s++;
  625.         OP(dst[ 2], (src2 +src3 )*20 - (src1 +src4 )*6 + (src0 +src5 )*3 - (src0 +src6 ));
  626.         src7= *s++;
  627.         OP(dst[ 3], (src3 +src4 )*20 - (src2 +src5 )*6 + (src1 +src6 )*3 - (src0 +src7 ));
  628.         src8= *s++;
  629.         OP(dst[ 4], (src4 +src5 )*20 - (src3 +src6 )*6 + (src2 +src7 )*3 - (src1 +src8 ));
  630.         src9= *s++;
  631.         OP(dst[ 5], (src5 +src6 )*20 - (src4 +src7 )*6 + (src3 +src8 )*3 - (src2 +src9 ));
  632.         src10= *s++;
  633.         OP(dst[ 6], (src6 +src7 )*20 - (src5 +src8 )*6 + (src4 +src9 )*3 - (src3 +src10));
  634.         src11= *s++;
  635.         OP(dst[ 7], (src7 +src8 )*20 - (src6 +src9 )*6 + (src5 +src10)*3 - (src4 +src11));
  636.         src12= *s++;
  637.         OP(dst[ 8], (src8 +src9 )*20 - (src7 +src10)*6 + (src6 +src11)*3 - (src5 +src12));
  638.         src13= *s++;
  639.         OP(dst[ 9], (src9 +src10)*20 - (src8 +src11)*6 + (src7 +src12)*3 - (src6 +src13));
  640.         src14= *s++;
  641.         OP(dst[10], (src10+src11)*20 - (src9 +src12)*6 + (src8 +src13)*3 - (src7 +src14));
  642.         src15= *s++;
  643.         OP(dst[11], (src11+src12)*20 - (src10+src13)*6 + (src9 +src14)*3 - (src8 +src15));
  644.         src16= *s++;
  645.         OP(dst[12], (src12+src13)*20 - (src11+src14)*6 + (src10+src15)*3 - (src9 +src16));
  646.         OP(dst[13], (src13+src14)*20 - (src12+src15)*6 + (src11+src16)*3 - (src10+src16));
  647.         OP(dst[14], (src14+src15)*20 - (src13+src16)*6 + (src12+src16)*3 - (src11+src15));
  648.         OP(dst[15], (src15+src16)*20 - (src14+src16)*6 + (src13+src15)*3 - (src12+src14));
  649.         dst+=dstStride;
  650.         src+=srcStride;
  651.     }while(--h);
  652. }
  653. static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  654.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  655.     int w=16;
  656.     do {
  657.         uint8_t *s = src, *d=dst;
  658.         int src0,src1,src2,src3,src4,src5,src6,src7,src8;
  659.         int src9,src10,src11,src12,src13,src14,src15,src16;
  660.         src0 = *s; s+=srcStride; 
  661.         src1 = *s; s+=srcStride; 
  662.         src2 = *s; s+=srcStride; 
  663.         src3 = *s; s+=srcStride; 
  664.         src4 = *s; s+=srcStride; 
  665.         OP(*d, (src0 +src1 )*20 - (src0 +src2 )*6 + (src1 +src3 )*3 - (src2 +src4 ));d+=dstStride;
  666.         src5 = *s; s+=srcStride; 
  667.         OP(*d, (src1 +src2 )*20 - (src0 +src3 )*6 + (src0 +src4 )*3 - (src1 +src5 ));d+=dstStride;
  668.         src6 = *s; s+=srcStride; 
  669.         OP(*d, (src2 +src3 )*20 - (src1 +src4 )*6 + (src0 +src5 )*3 - (src0 +src6 ));d+=dstStride;
  670.         src7 = *s; s+=srcStride; 
  671.         OP(*d, (src3 +src4 )*20 - (src2 +src5 )*6 + (src1 +src6 )*3 - (src0 +src7 ));d+=dstStride;
  672.         src8 = *s; s+=srcStride; 
  673.         OP(*d, (src4 +src5 )*20 - (src3 +src6 )*6 + (src2 +src7 )*3 - (src1 +src8 ));d+=dstStride;
  674.         src9 = *s; s+=srcStride; 
  675.         OP(*d, (src5 +src6 )*20 - (src4 +src7 )*6 + (src3 +src8 )*3 - (src2 +src9 ));d+=dstStride;
  676.         src10 = *s; s+=srcStride; 
  677.         OP(*d, (src6 +src7 )*20 - (src5 +src8 )*6 + (src4 +src9 )*3 - (src3 +src10));d+=dstStride;
  678.         src11 = *s; s+=srcStride; 
  679.         OP(*d, (src7 +src8 )*20 - (src6 +src9 )*6 + (src5 +src10)*3 - (src4 +src11));d+=dstStride;
  680.         src12 = *s; s+=srcStride; 
  681.         OP(*d, (src8 +src9 )*20 - (src7 +src10)*6 + (src6 +src11)*3 - (src5 +src12));d+=dstStride;
  682.         src13 = *s; s+=srcStride; 
  683.         OP(*d, (src9 +src10)*20 - (src8 +src11)*6 + (src7 +src12)*3 - (src6 +src13));d+=dstStride;
  684.         src14 = *s; s+=srcStride; 
  685.         OP(*d, (src10+src11)*20 - (src9 +src12)*6 + (src8 +src13)*3 - (src7 +src14));d+=dstStride;
  686.         src15 = *s; s+=srcStride; 
  687.         OP(*d, (src11+src12)*20 - (src10+src13)*6 + (src9 +src14)*3 - (src8 +src15));d+=dstStride;
  688.         src16 = *s; 
  689.         OP(*d, (src12+src13)*20 - (src11+src14)*6 + (src10+src15)*3 - (src9 +src16));d+=dstStride;
  690.         OP(*d, (src13+src14)*20 - (src12+src15)*6 + (src11+src16)*3 - (src10+src16));d+=dstStride;
  691.         OP(*d, (src14+src15)*20 - (src13+src16)*6 + (src12+src16)*3 - (src11+src15));d+=dstStride;
  692.         OP(*d, (src15+src16)*20 - (src14+src16)*6 + (src13+src15)*3 - (src12+src14));
  693.         dst++;
  694.         src++;
  695.     }while(--w);
  696. }
  697. static void OPNAME ## qpel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  698.     OPNAME ## pixels8_c(dst, src, stride, 8);
  699. }
  700. static void OPNAME ## qpel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  701.     uint8_t half[64];
  702.     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);
  703.     OPNAME ## pixels8_l2_aligned2(dst, src, half, stride, stride, 8, 8);
  704. }
  705. static void OPNAME ## qpel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  706.     OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8);
  707. }
  708. static void OPNAME ## qpel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  709.     uint8_t half[64];
  710.     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);
  711.     OPNAME ## pixels8_l2_aligned2(dst, src+1, half, stride, stride, 8, 8);
  712. }
  713. static void OPNAME ## qpel8_mc01_c(uint8_t *dst, uint8_t *src, int stride){
  714.     uint8_t full[16*9];
  715.     uint8_t half[64];
  716.     copy_block9(full, src, 16, stride, 9);
  717.     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);
  718.     OPNAME ## pixels8_l2_aligned(dst, full, half, stride, 16, 8, 8);
  719. }
  720. static void OPNAME ## qpel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  721.     uint8_t full[16*9];
  722.     copy_block9(full, src, 16, stride, 9);
  723.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16);
  724. }
  725. static void OPNAME ## qpel8_mc03_c(uint8_t *dst, uint8_t *src, int stride){
  726.     uint8_t full[16*9];
  727.     uint8_t half[64];
  728.     copy_block9(full, src, 16, stride, 9);
  729.     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);
  730.     OPNAME ## pixels8_l2_aligned(dst, full+16, half, stride, 16, 8, 8);
  731. }
  732. static void ff_ ## OPNAME ## qpel8_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){
  733.     uint8_t full[16*9];
  734.     uint8_t halfH[72];
  735.     uint8_t halfV[64];
  736.     uint8_t halfHV[64];
  737.     copy_block9(full, src, 16, stride, 9);
  738.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  739.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  740.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  741.     OPNAME ## pixels8_l4_aligned(dst, full, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  742. }
  743. static void OPNAME ## qpel8_mc11_c(uint8_t *dst, uint8_t *src, int stride){
  744.     uint8_t full[16*9];
  745.     uint8_t halfH[72];
  746.     uint8_t halfHV[64];
  747.     copy_block9(full, src, 16, stride, 9);
  748.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  749.     put ## RND ## pixels8_l2_aligned(halfH, halfH, full, 8, 8, 16, 9);
  750.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  751.     OPNAME ## pixels8_l2_aligned(dst, halfH, halfHV, stride, 8, 8, 8);
  752. }
  753. static void ff_ ## OPNAME ## qpel8_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){
  754.     uint8_t full[16*9];
  755.     uint8_t halfH[72];
  756.     uint8_t halfV[64];
  757.     uint8_t halfHV[64];
  758.     copy_block9(full, src, 16, stride, 9);
  759.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  760.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  761.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  762.     OPNAME ## pixels8_l4_aligned0(dst, full+1, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  763. }
  764. static void OPNAME ## qpel8_mc31_c(uint8_t *dst, uint8_t *src, int stride){
  765.     uint8_t full[16*9];
  766.     uint8_t halfH[72];
  767.     uint8_t halfHV[64];
  768.     copy_block9(full, src, 16, stride, 9);
  769.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  770.     put ## RND ## pixels8_l2_aligned1(halfH, halfH, full+1, 8, 8, 16, 9);
  771.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  772.     OPNAME ## pixels8_l2_aligned(dst, halfH, halfHV, stride, 8, 8, 8);
  773. }
  774. static void ff_ ## OPNAME ## qpel8_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){
  775.     uint8_t full[16*9];
  776.     uint8_t halfH[72];
  777.     uint8_t halfV[64];
  778.     uint8_t halfHV[64];
  779.     copy_block9(full, src, 16, stride, 9);
  780.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  781.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  782.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  783.     OPNAME ## pixels8_l4_aligned(dst, full+16, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  784. }
  785. static void OPNAME ## qpel8_mc13_c(uint8_t *dst, uint8_t *src, int stride){
  786.     uint8_t full[16*9];
  787.     uint8_t halfH[72];
  788.     uint8_t halfHV[64];
  789.     copy_block9(full, src, 16, stride, 9);
  790.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  791.     put ## RND ## pixels8_l2_aligned(halfH, halfH, full, 8, 8, 16, 9);
  792.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  793.     OPNAME ## pixels8_l2_aligned(dst, halfH+8, halfHV, stride, 8, 8, 8);
  794. }
  795. static void ff_ ## OPNAME ## qpel8_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){
  796.     uint8_t full[16*9];
  797.     uint8_t halfH[72];
  798.     uint8_t halfV[64];
  799.     uint8_t halfHV[64];
  800.     copy_block9(full, src, 16, stride, 9);
  801.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full  , 8, 16, 9);
  802.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  803.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  804.     OPNAME ## pixels8_l4_aligned0(dst, full+17, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);
  805. }
  806. static void OPNAME ## qpel8_mc33_c(uint8_t *dst, uint8_t *src, int stride){
  807.     uint8_t full[16*9];
  808.     uint8_t halfH[72];
  809.     uint8_t halfHV[64];
  810.     copy_block9(full, src, 16, stride, 9);
  811.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  812.     put ## RND ## pixels8_l2_aligned1(halfH, halfH, full+1, 8, 8, 16, 9);
  813.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  814.     OPNAME ## pixels8_l2_aligned(dst, halfH+8, halfHV, stride, 8, 8, 8);
  815. }
  816. static void OPNAME ## qpel8_mc21_c(uint8_t *dst, uint8_t *src, int stride){
  817.     uint8_t halfH[72];
  818.     uint8_t halfHV[64];
  819.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  820.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  821.     OPNAME ## pixels8_l2_aligned(dst, halfH, halfHV, stride, 8, 8, 8);
  822. }
  823. static void OPNAME ## qpel8_mc23_c(uint8_t *dst, uint8_t *src, int stride){
  824.     uint8_t halfH[72];
  825.     uint8_t halfHV[64];
  826.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  827.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  828.     OPNAME ## pixels8_l2_aligned(dst, halfH+8, halfHV, stride, 8, 8, 8);
  829. }
  830. static void ff_ ## OPNAME ## qpel8_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){
  831.     uint8_t full[16*9];
  832.     uint8_t halfH[72];
  833.     uint8_t halfV[64];
  834.     uint8_t halfHV[64];
  835.     copy_block9(full, src, 16, stride, 9);
  836.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  837.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);
  838.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  839.     OPNAME ## pixels8_l2_aligned(dst, halfV, halfHV, stride, 8, 8, 8);
  840. }
  841. static void OPNAME ## qpel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  842.     uint8_t full[16*9];
  843.     uint8_t halfH[72];
  844.     copy_block9(full, src, 16, stride, 9);
  845.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  846.     put ## RND ## pixels8_l2_aligned(halfH, halfH, full, 8, 8, 16, 9);
  847.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  848. }
  849. static void ff_ ## OPNAME ## qpel8_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){
  850.     uint8_t full[16*9];
  851.     uint8_t halfH[72];
  852.     uint8_t halfV[64];
  853.     uint8_t halfHV[64];
  854.     copy_block9(full, src, 16, stride, 9);
  855.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  856.     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);
  857.     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);
  858.     OPNAME ## pixels8_l2_aligned(dst, halfV, halfHV, stride, 8, 8, 8);
  859. }
  860. static void OPNAME ## qpel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  861.     uint8_t full[16*9];
  862.     uint8_t halfH[72];
  863.     copy_block9(full, src, 16, stride, 9);
  864.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);
  865.     put ## RND ## pixels8_l2_aligned1(halfH, halfH, full+1, 8, 8, 16, 9);
  866.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  867. }
  868. static void OPNAME ## qpel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  869.     uint8_t halfH[72];
  870.     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);
  871.     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);
  872. }
  873. static void OPNAME ## qpel16_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  874.     OPNAME ## pixels16_c(dst, src, stride, 16);
  875. }
  876. static void OPNAME ## qpel16_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  877.     uint8_t half[256];
  878.     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);
  879.     OPNAME ## pixels16_l2_aligned2(dst, src, half, stride, stride, 16, 16);
  880. }
  881. static void OPNAME ## qpel16_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  882.     OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16);
  883. }
  884. static void OPNAME ## qpel16_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  885.     uint8_t half[256];
  886.     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);
  887.     OPNAME ## pixels16_l2_aligned2(dst, src+1, half, stride, stride, 16, 16);
  888. }
  889. static void OPNAME ## qpel16_mc01_c(uint8_t *dst, uint8_t *src, int stride){
  890.     uint8_t full[24*17];
  891.     uint8_t half[256];
  892.     copy_block17(full, src, 24, stride, 17);
  893.     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);
  894.     OPNAME ## pixels16_l2_aligned(dst, full, half, stride, 24, 16, 16);
  895. }
  896. static void OPNAME ## qpel16_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  897.     uint8_t full[24*17];
  898.     copy_block17(full, src, 24, stride, 17);
  899.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24);
  900. }
  901. static void OPNAME ## qpel16_mc03_c(uint8_t *dst, uint8_t *src, int stride){
  902.     uint8_t full[24*17];
  903.     uint8_t half[256];
  904.     copy_block17(full, src, 24, stride, 17);
  905.     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);
  906.     OPNAME ## pixels16_l2_aligned(dst, full+24, half, stride, 24, 16, 16);
  907. }
  908. static void ff_ ## OPNAME ## qpel16_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){
  909.     uint8_t full[24*17];
  910.     uint8_t halfH[272];
  911.     uint8_t halfV[256];
  912.     uint8_t halfHV[256];
  913.     copy_block17(full, src, 24, stride, 17);
  914.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  915.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  916.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  917.     OPNAME ## pixels16_l4_aligned(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  918. }
  919. static void OPNAME ## qpel16_mc11_c(uint8_t *dst, uint8_t *src, int stride){
  920.     uint8_t full[24*17];
  921.     uint8_t halfH[272];
  922.     uint8_t halfHV[256];
  923.     copy_block17(full, src, 24, stride, 17);
  924.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  925.     put ## RND ## pixels16_l2_aligned(halfH, halfH, full, 16, 16, 24, 17);
  926.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  927.     OPNAME ## pixels16_l2_aligned(dst, halfH, halfHV, stride, 16, 16, 16);
  928. }
  929. static void ff_ ## OPNAME ## qpel16_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){
  930.     uint8_t full[24*17];
  931.     uint8_t halfH[272];
  932.     uint8_t halfV[256];
  933.     uint8_t halfHV[256];
  934.     copy_block17(full, src, 24, stride, 17);
  935.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  936.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  937.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  938.     OPNAME ## pixels16_l4_aligned0(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  939. }
  940. static void OPNAME ## qpel16_mc31_c(uint8_t *dst, uint8_t *src, int stride){
  941.     uint8_t full[24*17];
  942.     uint8_t halfH[272];
  943.     uint8_t halfHV[256];
  944.     copy_block17(full, src, 24, stride, 17);
  945.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  946.     put ## RND ## pixels16_l2_aligned1(halfH, halfH, full+1, 16, 16, 24, 17);
  947.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  948.     OPNAME ## pixels16_l2_aligned(dst, halfH, halfHV, stride, 16, 16, 16);
  949. }
  950. static void ff_ ## OPNAME ## qpel16_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){
  951.     uint8_t full[24*17];
  952.     uint8_t halfH[272];
  953.     uint8_t halfV[256];
  954.     uint8_t halfHV[256];
  955.     copy_block17(full, src, 24, stride, 17);
  956.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  957.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  958.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  959.     OPNAME ## pixels16_l4_aligned(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  960. }
  961. static void OPNAME ## qpel16_mc13_c(uint8_t *dst, uint8_t *src, int stride){
  962.     uint8_t full[24*17];
  963.     uint8_t halfH[272];
  964.     uint8_t halfHV[256];
  965.     copy_block17(full, src, 24, stride, 17);
  966.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  967.     put ## RND ## pixels16_l2_aligned(halfH, halfH, full, 16, 16, 24, 17);
  968.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  969.     OPNAME ## pixels16_l2_aligned(dst, halfH+16, halfHV, stride, 16, 16, 16);
  970. }
  971. static void ff_ ## OPNAME ## qpel16_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){
  972.     uint8_t full[24*17];
  973.     uint8_t halfH[272];
  974.     uint8_t halfV[256];
  975.     uint8_t halfHV[256];
  976.     copy_block17(full, src, 24, stride, 17);
  977.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full  , 16, 24, 17);
  978.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  979.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  980.     OPNAME ## pixels16_l4_aligned0(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);
  981. }
  982. static void OPNAME ## qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride){
  983.     uint8_t full[24*17];
  984.     uint8_t halfH[272];
  985.     uint8_t halfHV[256];
  986.     copy_block17(full, src, 24, stride, 17);
  987.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  988.     put ## RND ## pixels16_l2_aligned1(halfH, halfH, full+1, 16, 16, 24, 17);
  989.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  990.     OPNAME ## pixels16_l2_aligned(dst, halfH+16, halfHV, stride, 16, 16, 16);
  991. }
  992. static void OPNAME ## qpel16_mc21_c(uint8_t *dst, uint8_t *src, int stride){
  993.     uint8_t halfH[272];
  994.     uint8_t halfHV[256];
  995.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  996.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  997.     OPNAME ## pixels16_l2_aligned(dst, halfH, halfHV, stride, 16, 16, 16);
  998. }
  999. static void OPNAME ## qpel16_mc23_c(uint8_t *dst, uint8_t *src, int stride){
  1000.     uint8_t halfH[272];
  1001.     uint8_t halfHV[256];
  1002.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  1003.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1004.     OPNAME ## pixels16_l2_aligned(dst, halfH+16, halfHV, stride, 16, 16, 16);
  1005. }
  1006. static void ff_ ## OPNAME ## qpel16_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){
  1007.     uint8_t full[24*17];
  1008.     uint8_t halfH[272];
  1009.     uint8_t halfV[256];
  1010.     uint8_t halfHV[256];
  1011.     copy_block17(full, src, 24, stride, 17);
  1012.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1013.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);
  1014.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1015.     OPNAME ## pixels16_l2_aligned(dst, halfV, halfHV, stride, 16, 16, 16);
  1016. }
  1017. static void OPNAME ## qpel16_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  1018.     uint8_t full[24*17];
  1019.     uint8_t halfH[272];
  1020.     copy_block17(full, src, 24, stride, 17);
  1021.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1022.     put ## RND ## pixels16_l2_aligned(halfH, halfH, full, 16, 16, 24, 17);
  1023.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1024. }
  1025. static void ff_ ## OPNAME ## qpel16_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){
  1026.     uint8_t full[24*17];
  1027.     uint8_t halfH[272];
  1028.     uint8_t halfV[256];
  1029.     uint8_t halfHV[256];
  1030.     copy_block17(full, src, 24, stride, 17);
  1031.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1032.     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);
  1033.     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);
  1034.     OPNAME ## pixels16_l2_aligned(dst, halfV, halfHV, stride, 16, 16, 16);
  1035. }
  1036. static void OPNAME ## qpel16_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  1037.     uint8_t full[24*17];
  1038.     uint8_t halfH[272];
  1039.     copy_block17(full, src, 24, stride, 17);
  1040.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);
  1041.     put ## RND ## pixels16_l2_aligned1(halfH, halfH, full+1, 16, 16, 24, 17);
  1042.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1043. }
  1044. static void OPNAME ## qpel16_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1045.     uint8_t halfH[272];
  1046.     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);
  1047.     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);
  1048. }
  1049. #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
  1050. #define op_avg_no_rnd(a, b) a = (((a)+cm[((b) + 15)>>5])>>1)
  1051. #define op_put(a, b) a = cm[((b) + 16)>>5]
  1052. #define op_put_no_rnd(a, b) a = cm[((b) + 15)>>5]
  1053. QPEL_MC(0, put_       , _       , op_put)
  1054. QPEL_MC(1, put_no_rnd_, _no_rnd_, op_put_no_rnd)
  1055. QPEL_MC(0, avg_       , _       , op_avg)
  1056. //QPEL_MC(1, avg_no_rnd , _       , op_avg)
  1057. #undef op_avg
  1058. #undef op_avg_no_rnd
  1059. #undef op_put
  1060. #undef op_put_no_rnd
  1061. #if 1
  1062. #define H264_LOWPASS(OPNAME, OP, OP2) 
  1063. static inline void OPNAME ## h264_qpel_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,int w,int h){
  1064.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1065.     do {
  1066.         int srcB,srcA,src0,src1,src2,src3,src4,src5,src6;
  1067.         uint8_t *s = src-2;
  1068.         srcB = *s++;
  1069.         srcA = *s++;
  1070.         src0 = *s++;
  1071.         src1 = *s++;
  1072.         src2 = *s++;
  1073.         src3 = *s++;
  1074.         OP(dst[0], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));
  1075.         src4 = *s++;
  1076.         OP(dst[1], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));
  1077.         src5 = *s++;
  1078.         OP(dst[2], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));
  1079.         src6 = *s++;
  1080.         OP(dst[3], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));
  1081.       if (w>4) { /* it optimized */ 
  1082.         int src7,src8,src9,src10; 
  1083.         src7 = *s++;
  1084.         OP(dst[4], (src4+src5)*20 - (src3+src6)*5 + (src2+src7));
  1085.         src8 = *s++;
  1086.         OP(dst[5], (src5+src6)*20 - (src4+src7)*5 + (src3+src8));
  1087.         src9 = *s++;
  1088.         OP(dst[6], (src6+src7)*20 - (src5+src8)*5 + (src4+src9));
  1089.         src10 = *s++;
  1090.         OP(dst[7], (src7+src8)*20 - (src6+src9)*5 + (src5+src10));
  1091.        if (w>8) { 
  1092.         int src11,src12,src13,src14,src15,src16,src17,src18; 
  1093.         src11 = *s++;
  1094.         OP(dst[8] , (src8 +src9 )*20 - (src7 +src10)*5 + (src6 +src11));
  1095.         src12 = *s++;
  1096.         OP(dst[9] , (src9 +src10)*20 - (src8 +src11)*5 + (src7 +src12));
  1097.         src13 = *s++;
  1098.         OP(dst[10], (src10+src11)*20 - (src9 +src12)*5 + (src8 +src13));
  1099.         src14 = *s++;
  1100.         OP(dst[11], (src11+src12)*20 - (src10+src13)*5 + (src9 +src14));
  1101.         src15 = *s++;
  1102.         OP(dst[12], (src12+src13)*20 - (src11+src14)*5 + (src10+src15));
  1103.         src16 = *s++;
  1104.         OP(dst[13], (src13+src14)*20 - (src12+src15)*5 + (src11+src16));
  1105.         src17 = *s++;
  1106.         OP(dst[14], (src14+src15)*20 - (src13+src16)*5 + (src12+src17));
  1107.         src18 = *s++;
  1108.         OP(dst[15], (src15+src16)*20 - (src14+src17)*5 + (src13+src18));
  1109.        } 
  1110.       } 
  1111.         dst+=dstStride;
  1112.         src+=srcStride;
  1113.     }while(--h);
  1114. }
  1115. static inline void OPNAME ## h264_qpel_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,int w,int h){
  1116.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1117.     do{
  1118.         int srcB,srcA,src0,src1,src2,src3,src4,src5,src6;
  1119.         uint8_t *s = src-2*srcStride,*d=dst;
  1120.         srcB = *s; s+=srcStride;
  1121.         srcA = *s; s+=srcStride;
  1122.         src0 = *s; s+=srcStride;
  1123.         src1 = *s; s+=srcStride;
  1124.         src2 = *s; s+=srcStride;
  1125.         src3 = *s; s+=srcStride;
  1126.         OP(*d, (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));d+=dstStride;
  1127.         src4 = *s; s+=srcStride;
  1128.         OP(*d, (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));d+=dstStride;
  1129.         src5 = *s; s+=srcStride;
  1130.         OP(*d, (src2+src3)*20 - (src1+src4)*5 + (src0+src5));d+=dstStride;
  1131.         src6 = *s; s+=srcStride;
  1132.         OP(*d, (src3+src4)*20 - (src2+src5)*5 + (src1+src6));d+=dstStride;
  1133.       if (h>4) { 
  1134.         int src7,src8,src9,src10; 
  1135.         src7 = *s; s+=srcStride;
  1136.         OP(*d, (src4+src5)*20 - (src3+src6)*5 + (src2+src7));d+=dstStride;
  1137.         src8 = *s; s+=srcStride;
  1138.         OP(*d, (src5+src6)*20 - (src4+src7)*5 + (src3+src8));d+=dstStride;
  1139.         src9 = *s; s+=srcStride;
  1140.         OP(*d, (src6+src7)*20 - (src5+src8)*5 + (src4+src9));d+=dstStride;
  1141.         src10 = *s; s+=srcStride;
  1142.         OP(*d, (src7+src8)*20 - (src6+src9)*5 + (src5+src10));d+=dstStride;
  1143.        if (h>8) { 
  1144.         int src11,src12,src13,src14,src15,src16,src17,src18; 
  1145.         src11 = *s; s+=srcStride;
  1146.         OP(*d , (src8 +src9 )*20 - (src7 +src10)*5 + (src6 +src11));d+=dstStride;
  1147.         src12 = *s; s+=srcStride;
  1148.         OP(*d , (src9 +src10)*20 - (src8 +src11)*5 + (src7 +src12));d+=dstStride;
  1149.         src13 = *s; s+=srcStride;
  1150.         OP(*d, (src10+src11)*20 - (src9 +src12)*5 + (src8 +src13));d+=dstStride;
  1151.         src14 = *s; s+=srcStride;
  1152.         OP(*d, (src11+src12)*20 - (src10+src13)*5 + (src9 +src14));d+=dstStride;
  1153.         src15 = *s; s+=srcStride;
  1154.         OP(*d, (src12+src13)*20 - (src11+src14)*5 + (src10+src15));d+=dstStride;
  1155.         src16 = *s; s+=srcStride;
  1156.         OP(*d, (src13+src14)*20 - (src12+src15)*5 + (src11+src16));d+=dstStride;
  1157.         src17 = *s; s+=srcStride;
  1158.         OP(*d, (src14+src15)*20 - (src13+src16)*5 + (src12+src17));d+=dstStride;
  1159.         src18 = *s; s+=srcStride;
  1160.         OP(*d, (src15+src16)*20 - (src14+src17)*5 + (src13+src18));d+=dstStride;
  1161.        } 
  1162.       } 
  1163.         dst++;
  1164.         src++;
  1165.     }while(--w);
  1166. }
  1167. static inline void OPNAME ## h264_qpel_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride,int w,int h){
  1168.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1169.     int i;
  1170.     src -= 2*srcStride;
  1171.     i= h+5; 
  1172.     do {
  1173.         int srcB,srcA,src0,src1,src2,src3,src4,src5,src6;
  1174.         uint8_t *s = src-2;
  1175.         srcB = *s++;
  1176.         srcA = *s++;
  1177.         src0 = *s++;
  1178.         src1 = *s++;
  1179.         src2 = *s++;
  1180.         src3 = *s++;
  1181.         tmp[0] = ((src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));
  1182.         src4 = *s++;
  1183.         tmp[1] = ((src1+src2)*20 - (src0+src3)*5 + (srcA+src4));
  1184.         src5 = *s++;
  1185.         tmp[2] = ((src2+src3)*20 - (src1+src4)*5 + (src0+src5));
  1186.         src6 = *s++;
  1187.         tmp[3] = ((src3+src4)*20 - (src2+src5)*5 + (src1+src6));
  1188.       if (w>4) { /* it optimized */ 
  1189.         int src7,src8,src9,src10; 
  1190.         src7 = *s++;
  1191.         tmp[4] = ((src4+src5)*20 - (src3+src6)*5 + (src2+src7));
  1192.         src8 = *s++;
  1193.         tmp[5] = ((src5+src6)*20 - (src4+src7)*5 + (src3+src8));
  1194.         src9 = *s++;
  1195.         tmp[6] = ((src6+src7)*20 - (src5+src8)*5 + (src4+src9));
  1196.         src10 = *s++;
  1197.         tmp[7] = ((src7+src8)*20 - (src6+src9)*5 + (src5+src10));
  1198.        if (w>8) { 
  1199.         int src11,src12,src13,src14,src15,src16,src17,src18; 
  1200.         src11 = *s++;
  1201.         tmp[8] = ((src8 +src9 )*20 - (src7 +src10)*5 + (src6 +src11));
  1202.         src12 = *s++;
  1203.         tmp[9] = ((src9 +src10)*20 - (src8 +src11)*5 + (src7 +src12));
  1204.         src13 = *s++;
  1205.         tmp[10] = ((src10+src11)*20 - (src9 +src12)*5 + (src8 +src13));
  1206.         src14 = *s++;
  1207.         tmp[11] = ((src11+src12)*20 - (src10+src13)*5 + (src9 +src14));
  1208.         src15 = *s++;
  1209.         tmp[12] = ((src12+src13)*20 - (src11+src14)*5 + (src10+src15));
  1210.         src16 = *s++;
  1211.         tmp[13] = ((src13+src14)*20 - (src12+src15)*5 + (src11+src16));
  1212.         src17 = *s++;
  1213.         tmp[14] = ((src14+src15)*20 - (src13+src16)*5 + (src12+src17));
  1214.         src18 = *s++;
  1215.         tmp[15] = ((src15+src16)*20 - (src14+src17)*5 + (src13+src18));
  1216.        } 
  1217.       } 
  1218.         tmp+=tmpStride;
  1219.         src+=srcStride;
  1220.     }while(--i);
  1221.     tmp -= tmpStride*(h+5-2);
  1222.     i = w; 
  1223.     do {
  1224.         int tmpB,tmpA,tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;
  1225.         int16_t *s = tmp-2*tmpStride; 
  1226.         uint8_t *d=dst;
  1227.         tmpB = *s; s+=tmpStride;
  1228.         tmpA = *s; s+=tmpStride;
  1229.         tmp0 = *s; s+=tmpStride;
  1230.         tmp1 = *s; s+=tmpStride;
  1231.         tmp2 = *s; s+=tmpStride;
  1232.         tmp3 = *s; s+=tmpStride;
  1233.         OP2(*d, (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));d+=dstStride;
  1234.         tmp4 = *s; s+=tmpStride;
  1235.         OP2(*d, (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));d+=dstStride;
  1236.         tmp5 = *s; s+=tmpStride;
  1237.         OP2(*d, (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));d+=dstStride;
  1238.         tmp6 = *s; s+=tmpStride;
  1239.         OP2(*d, (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));d+=dstStride;
  1240.       if (h>4) { 
  1241.         int tmp7,tmp8,tmp9,tmp10; 
  1242.         tmp7 = *s; s+=tmpStride;
  1243.         OP2(*d, (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));d+=dstStride;
  1244.         tmp8 = *s; s+=tmpStride;
  1245.         OP2(*d, (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));d+=dstStride;
  1246.         tmp9 = *s; s+=tmpStride;
  1247.         OP2(*d, (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));d+=dstStride;
  1248.         tmp10 = *s; s+=tmpStride;
  1249.         OP2(*d, (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));d+=dstStride;
  1250.        if (h>8) { 
  1251.         int tmp11,tmp12,tmp13,tmp14,tmp15,tmp16,tmp17,tmp18; 
  1252.         tmp11 = *s; s+=tmpStride;
  1253.         OP2(*d , (tmp8 +tmp9 )*20 - (tmp7 +tmp10)*5 + (tmp6 +tmp11));d+=dstStride;
  1254.         tmp12 = *s; s+=tmpStride;
  1255.         OP2(*d , (tmp9 +tmp10)*20 - (tmp8 +tmp11)*5 + (tmp7 +tmp12));d+=dstStride;
  1256.         tmp13 = *s; s+=tmpStride;
  1257.         OP2(*d, (tmp10+tmp11)*20 - (tmp9 +tmp12)*5 + (tmp8 +tmp13));d+=dstStride;
  1258.         tmp14 = *s; s+=tmpStride;
  1259.         OP2(*d, (tmp11+tmp12)*20 - (tmp10+tmp13)*5 + (tmp9 +tmp14));d+=dstStride;
  1260.         tmp15 = *s; s+=tmpStride;
  1261.         OP2(*d, (tmp12+tmp13)*20 - (tmp11+tmp14)*5 + (tmp10+tmp15));d+=dstStride;
  1262.         tmp16 = *s; s+=tmpStride;
  1263.         OP2(*d, (tmp13+tmp14)*20 - (tmp12+tmp15)*5 + (tmp11+tmp16));d+=dstStride;
  1264.         tmp17 = *s; s+=tmpStride;
  1265.         OP2(*d, (tmp14+tmp15)*20 - (tmp13+tmp16)*5 + (tmp12+tmp17));d+=dstStride;
  1266.         tmp18 = *s; s+=tmpStride;
  1267.         OP2(*d, (tmp15+tmp16)*20 - (tmp14+tmp17)*5 + (tmp13+tmp18));d+=dstStride;
  1268.        } 
  1269.       } 
  1270.         dst++;
  1271.         tmp++;
  1272.     }while(--i);
  1273. }
  1274. static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1275.     OPNAME ## h264_qpel_h_lowpass(dst,src,dstStride,srcStride,4,4); 
  1276. }
  1277. static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1278.    OPNAME ## h264_qpel_h_lowpass(dst,src,dstStride,srcStride,8,8); 
  1279. }
  1280. static void OPNAME ## h264_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1281.    OPNAME ## h264_qpel_h_lowpass(dst,src,dstStride,srcStride,16,16); 
  1282. }
  1283. static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1284.    OPNAME ## h264_qpel_v_lowpass(dst,src,dstStride,srcStride,4,4); 
  1285. }
  1286. static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1287.    OPNAME ## h264_qpel_v_lowpass(dst,src,dstStride,srcStride,8,8); 
  1288. }
  1289. static void OPNAME ## h264_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){
  1290.    OPNAME ## h264_qpel_v_lowpass(dst,src,dstStride,srcStride,16,16); 
  1291. }
  1292. static void OPNAME ## h264_qpel4_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1293.    OPNAME ## h264_qpel_hv_lowpass(dst,tmp,src,dstStride,tmpStride,srcStride,4,4); 
  1294. }
  1295. static void OPNAME ## h264_qpel8_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1296.    OPNAME ## h264_qpel_hv_lowpass(dst,tmp,src,dstStride,tmpStride,srcStride,8,8); 
  1297. }
  1298. static void OPNAME ## h264_qpel16_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){
  1299.    OPNAME ## h264_qpel_hv_lowpass(dst,tmp,src,dstStride,tmpStride,srcStride,16,16); 
  1300. }
  1301. #define H264_MC(OPNAME, SIZE) 
  1302. static void OPNAME ## h264_qpel ## SIZE ## _mc00_c (uint8_t *dst, uint8_t *src, int stride){
  1303.     OPNAME ## pixels ## SIZE ## _c(dst, src, stride, SIZE);
  1304. }
  1305. static void OPNAME ## h264_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, int stride){
  1306.     uint8_t half[SIZE*SIZE];
  1307.     put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);
  1308.     OPNAME ## pixels ## SIZE ## _l2_aligned2(dst, src, half, stride, stride, SIZE, SIZE);
  1309. }
  1310. static void OPNAME ## h264_qpel ## SIZE ## _mc20_c(uint8_t *dst, uint8_t *src, int stride){
  1311.     OPNAME ## h264_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride);
  1312. }
  1313. static void OPNAME ## h264_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, int stride){
  1314.     uint8_t half[SIZE*SIZE];
  1315.     put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);
  1316.     OPNAME ## pixels ## SIZE ## _l2_aligned2(dst, src+1, half, stride, stride, SIZE, SIZE);
  1317. }
  1318. static void OPNAME ## h264_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, int stride){
  1319.     uint8_t full[SIZE*(SIZE+5)];
  1320.     uint8_t * const full_mid= full + SIZE*2;
  1321.     uint8_t half[SIZE*SIZE];
  1322.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1323.     put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);
  1324.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, full_mid, half, stride, SIZE, SIZE, SIZE);
  1325. }
  1326. static void OPNAME ## h264_qpel ## SIZE ## _mc02_c(uint8_t *dst, uint8_t *src, int stride){
  1327.     uint8_t full[SIZE*(SIZE+5)];
  1328.     uint8_t * const full_mid= full + SIZE*2;
  1329.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1330.     OPNAME ## h264_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE);
  1331. }
  1332. static void OPNAME ## h264_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, int stride){
  1333.     uint8_t full[SIZE*(SIZE+5)];
  1334.     uint8_t * const full_mid= full + SIZE*2;
  1335.     uint8_t half[SIZE*SIZE];
  1336.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1337.     put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);
  1338.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, full_mid+SIZE, half, stride, SIZE, SIZE, SIZE);
  1339. }
  1340. static void OPNAME ## h264_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, int stride){
  1341.     uint8_t full[SIZE*(SIZE+5)];
  1342.     uint8_t * const full_mid= full + SIZE*2;
  1343.     uint8_t halfH[SIZE*SIZE];
  1344.     uint8_t halfV[SIZE*SIZE];
  1345.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1346.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1347.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1348.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1349. }
  1350. static void OPNAME ## h264_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, int stride){
  1351.     uint8_t full[SIZE*(SIZE+5)];
  1352.     uint8_t * const full_mid= full + SIZE*2;
  1353.     uint8_t halfH[SIZE*SIZE];
  1354.     uint8_t halfV[SIZE*SIZE];
  1355.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1356.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  1357.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1358.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1359. }
  1360. static void OPNAME ## h264_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, int stride){
  1361.     uint8_t full[SIZE*(SIZE+5)];
  1362.     uint8_t * const full_mid= full + SIZE*2;
  1363.     uint8_t halfH[SIZE*SIZE];
  1364.     uint8_t halfV[SIZE*SIZE];
  1365.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  1366.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1367.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1368.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1369. }
  1370. static void OPNAME ## h264_qpel ## SIZE ## _mc33_c(uint8_t *dst, uint8_t *src, int stride){
  1371.     uint8_t full[SIZE*(SIZE+5)];
  1372.     uint8_t * const full_mid= full + SIZE*2;
  1373.     uint8_t halfH[SIZE*SIZE];
  1374.     uint8_t halfV[SIZE*SIZE];
  1375.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  1376.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  1377.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1378.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);
  1379. }
  1380. static void OPNAME ## h264_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1381.     int16_t tmp[SIZE*(SIZE+5)];
  1382.     OPNAME ## h264_qpel ## SIZE ## _hv_lowpass(dst, tmp, src, stride, SIZE, stride);
  1383. }
  1384. static void OPNAME ## h264_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, int stride){
  1385.     int16_t tmp[SIZE*(SIZE+5)];
  1386.     uint8_t halfH[SIZE*SIZE];
  1387.     uint8_t halfHV[SIZE*SIZE];
  1388.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);
  1389.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  1390.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);
  1391. }
  1392. static void OPNAME ## h264_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, int stride){
  1393.     int16_t tmp[SIZE*(SIZE+5)];
  1394.     uint8_t halfH[SIZE*SIZE];
  1395.     uint8_t halfHV[SIZE*SIZE];
  1396.     put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);
  1397.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  1398.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);
  1399. }
  1400. static void OPNAME ## h264_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, int stride){
  1401.     uint8_t full[SIZE*(SIZE+5)];
  1402.     uint8_t * const full_mid= full + SIZE*2;
  1403.     int16_t tmp[SIZE*(SIZE+5)];
  1404.     uint8_t halfV[SIZE*SIZE];
  1405.     uint8_t halfHV[SIZE*SIZE];
  1406.     copy_block ## SIZE (full, src - stride*2, SIZE,  stride, SIZE + 5);
  1407.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1408.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  1409.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);
  1410. }
  1411. static void OPNAME ## h264_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, int stride){
  1412.     uint8_t full[SIZE*(SIZE+5)];
  1413.     uint8_t * const full_mid= full + SIZE*2;
  1414.     int16_t tmp[SIZE*(SIZE+5)];
  1415.     uint8_t halfV[SIZE*SIZE];
  1416.     uint8_t halfHV[SIZE*SIZE];
  1417.     copy_block ## SIZE (full, src - stride*2 + 1, SIZE,  stride, SIZE + 5);
  1418.     put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);
  1419.     put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);
  1420.     OPNAME ## pixels ## SIZE ## _l2_aligned(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);
  1421. }
  1422. #define op_avg(a, b)  a = (((a)+cm[((b) + 16)>>5]+1)>>1)
  1423. //#define op_avg2(a, b) a = (((a)*w1+cm[((b) + 16)>>5]*w2 + o + 64)>>7)
  1424. #define op_put(a, b)  a = cm[((b) + 16)>>5]
  1425. #define op2_avg(a, b)  a = (((a)+cm[((b) + 512)>>10]+1)>>1)
  1426. #define op2_put(a, b)  a = cm[((b) + 512)>>10]
  1427. H264_LOWPASS(put_       , op_put, op2_put)
  1428. H264_LOWPASS(avg_       , op_avg, op2_avg)
  1429. H264_MC(put_, 4)
  1430. H264_MC(put_, 8)
  1431. H264_MC(put_, 16)
  1432. H264_MC(avg_, 4)
  1433. H264_MC(avg_, 8)
  1434. H264_MC(avg_, 16)
  1435. #undef op_avg
  1436. #undef op_put
  1437. #undef op2_avg
  1438. #undef op2_put
  1439. #endif
  1440. static void wmv2_mspel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){
  1441.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1442.     do{
  1443.         int src_1,src0,src1,src2,src3,src4,src5,src6,src7,src8,src9;
  1444.         uint8_t *s = src;
  1445.         src_1 = s[-1];
  1446.         src0 = *s++;
  1447.         src1 = *s++;
  1448.         src2 = *s++;
  1449.         dst[0]= cm[(9*(src0 + src1) - (src_1 + src2) + 8)>>4];
  1450.         src3 = *s++;
  1451.         dst[1]= cm[(9*(src1 + src2) - (src0 + src3) + 8)>>4];
  1452.         src4 = *s++;
  1453.         dst[2]= cm[(9*(src2 + src3) - (src1 + src4) + 8)>>4];
  1454.         src5 = *s++;
  1455.         dst[3]= cm[(9*(src3 + src4) - (src2 + src5) + 8)>>4];
  1456.         src6 = *s++;
  1457.         dst[4]= cm[(9*(src4 + src5) - (src3 + src6) + 8)>>4];
  1458.         src7 = *s++;
  1459.         dst[5]= cm[(9*(src5 + src6) - (src4 + src7) + 8)>>4];
  1460.         src8 = *s++;
  1461.         dst[6]= cm[(9*(src6 + src7) - (src5 + src8) + 8)>>4];
  1462.         src9 = *s++;
  1463.         dst[7]= cm[(9*(src7 + src8) - (src6 + src9) + 8)>>4];
  1464.         dst+=dstStride;
  1465.         src+=srcStride;        
  1466.     }while(--h);
  1467. }
  1468. static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){
  1469.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1470.     do{
  1471.         int src_1,src0,src1,src2,src3,src4,src5,src6,src7,src8,src9;
  1472.         uint8_t *s = src,*d = dst;
  1473.         src_1 = *(s-srcStride);
  1474.         src0 = *s; s+=srcStride;
  1475.         src1 = *s; s+=srcStride;
  1476.         src2 = *s; s+=srcStride;
  1477.         *d= cm[(9*(src0 + src1) - (src_1 + src2) + 8)>>4]; d+=dstStride;
  1478.         src3 = *s; s+=srcStride;
  1479.         *d= cm[(9*(src1 + src2) - (src0  + src3) + 8)>>4]; d+=dstStride;
  1480.         src4 = *s; s+=srcStride;
  1481.         *d= cm[(9*(src2 + src3) - (src1  + src4) + 8)>>4]; d+=dstStride;
  1482.         src5 = *s; s+=srcStride;
  1483.         *d= cm[(9*(src3 + src4) - (src2  + src5) + 8)>>4]; d+=dstStride;
  1484.         src6 = *s; s+=srcStride;
  1485.         *d= cm[(9*(src4 + src5) - (src3  + src6) + 8)>>4]; d+=dstStride;
  1486.         src7 = *s; s+=srcStride;
  1487.         *d= cm[(9*(src5 + src6) - (src4  + src7) + 8)>>4]; d+=dstStride;
  1488.         src8 = *s; s+=srcStride;
  1489.         *d= cm[(9*(src6 + src7) - (src5  + src8) + 8)>>4]; d+=dstStride;
  1490.         src9 = *s;
  1491.         *d= cm[(9*(src7 + src8) - (src6  + src9) + 8)>>4]; d+=dstStride;
  1492.         src++;
  1493.         dst++;
  1494.     }while(--w);
  1495. }
  1496. static void put_mspel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){
  1497.     put_pixels8_c(dst, src, stride, 8);
  1498. }
  1499. static void put_mspel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){
  1500.     uint8_t half[64];
  1501.     wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
  1502.     put_pixels8_l2_aligned2(dst, src, half, stride, stride, 8, 8);
  1503. }
  1504. static void put_mspel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){
  1505.     wmv2_mspel8_h_lowpass(dst, src, stride, stride, 8);
  1506. }
  1507. static void put_mspel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){
  1508.     uint8_t half[64];
  1509.     wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
  1510.     put_pixels8_l2_aligned2(dst, src+1, half, stride, stride, 8, 8);
  1511. }
  1512. static void put_mspel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){
  1513.     wmv2_mspel8_v_lowpass(dst, src, stride, stride, 8);
  1514. }
  1515. static void put_mspel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){
  1516.     uint8_t halfH[88];
  1517.     uint8_t halfV[64];
  1518.     uint8_t halfHV[64];
  1519.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  1520.     wmv2_mspel8_v_lowpass(halfV, src, 8, stride, 8);
  1521.     wmv2_mspel8_v_lowpass(halfHV, halfH+8, 8, 8, 8);
  1522.     put_pixels8_l2_aligned(dst, halfV, halfHV, stride, 8, 8, 8);
  1523. }
  1524. static void put_mspel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){
  1525.     uint8_t halfH[88];
  1526.     uint8_t halfV[64];
  1527.     uint8_t halfHV[64];
  1528.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  1529.     wmv2_mspel8_v_lowpass(halfV, src+1, 8, stride, 8);
  1530.     wmv2_mspel8_v_lowpass(halfHV, halfH+8, 8, 8, 8);
  1531.     put_pixels8_l2_aligned(dst, halfV, halfHV, stride, 8, 8, 8);
  1532. }
  1533. static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){
  1534.     uint8_t halfH[88];
  1535.     wmv2_mspel8_h_lowpass(halfH, src-stride, 8, stride, 11);
  1536.     wmv2_mspel8_v_lowpass(dst, halfH+8, stride, 8, 8);
  1537. }