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

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: mcomp_c.c 329 2005-11-04 17:17:55Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #include "softidct.h"
  25. #if !defined(ARM) && !defined(MIPS64) && !defined(MIPS32) && !defined(MMX)
  26. #define LoadRow(a,b,ofs) 
  27. a=LOAD32(Src+ofs+0); 
  28. b=LOAD32(Src+ofs+4); 
  29. }
  30. #define LoadMRow(a,b,c,d,ofs) 
  31. a=LOAD32(Src+ofs+0); 
  32. b=LOAD32(Src+ofs+4); 
  33. c=LOAD32(Src+ofs+8); 
  34. d=LOAD32(Src+ofs+12); 
  35. }
  36. #define SaveRow(a,b) 
  37. ((uint32_t*)Dst)[0]=a; 
  38. ((uint32_t*)Dst)[1]=b; 
  39. }
  40. #define SaveMRow(a,b,c,d)
  41. {
  42. ((uint32_t*)Dst)[0]=a;
  43. ((uint32_t*)Dst)[1]=b;
  44. ((uint32_t*)Dst)[2]=c;
  45. ((uint32_t*)Dst)[3]=d;
  46. }
  47. #define AddRow(a,b,t0,t1)
  48. t0=((uint32_t*)Dst)[0]; 
  49. t1=((uint32_t*)Dst)[1]; 
  50. AVG32R(a,b,t0,t1); 
  51. ((uint32_t*)Dst)[0]=a; 
  52. ((uint32_t*)Dst)[1]=b; 
  53. }
  54. #define PrepareAvg4(a,b,c,d)
  55. {
  56. uint32_t q,w;
  57. q=(a & 0x03030303);
  58. w=(b & 0x03030303);
  59. q+=(c & 0x03030303);
  60. w+=(d & 0x03030303);
  61. a=(a>>2) & 0x3F3F3F3F;
  62. b=(b>>2) & 0x3F3F3F3F;
  63. a+=(c>>2) & 0x3F3F3F3F;
  64. b+=(d>>2) & 0x3F3F3F3F;
  65. c=q;
  66. d=w;
  67. }
  68. #define Avg4(a,b,c,d,g,h,i,j)
  69. {
  70. a+=g;
  71. b+=h;
  72. c+=i+0x02020202;
  73. d+=j+0x02020202;
  74. a+=(c>>2) & 0x03030303;
  75. b+=(d>>2) & 0x03030303;
  76. }
  77. #define Avg4Round(a,b,c,d,g,h,i,j)
  78. {
  79. a+=g;
  80. b+=h;
  81. c+=i+0x01010101;
  82. d+=j+0x01010101;
  83. a+=(c>>2) & 0x03030303;
  84. b+=(d>>2) & 0x03030303;
  85. }
  86. // Dst[p] = Src[p]
  87. void STDCALL CopyBlock(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  88. {
  89. uint8_t *SrcEnd = Src + 8*SrcPitch;
  90. uint32_t a,b;
  91. do
  92. {
  93. LoadRow(a,b,0)
  94. SaveRow(a,b)
  95. Dst += DstPitch;
  96. Src += SrcPitch;
  97. }
  98. while (Src != SrcEnd);
  99. }
  100. // Dst[p] = (Src[p] + Src[p+1]+1) >> 1;
  101. void STDCALL CopyBlockHor(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  102. {
  103. uint8_t *SrcEnd = Src + 8*SrcPitch;
  104. uint32_t a,b,c,d;
  105. do
  106. {
  107. LoadRow(a,b,0)
  108. LoadRow(c,d,1)
  109. AVG32R(a,b,c,d)
  110. SaveRow(a,b)
  111. Dst += DstPitch;
  112. Src += SrcPitch;
  113. }
  114. while (Src != SrcEnd);
  115. }
  116. // Dst[p] = (Src[p] + Src[p+SrcPitch]+1) >> 1;
  117. void STDCALL CopyBlockVer(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  118. {
  119. uint8_t *SrcEnd = Src + 8*SrcPitch;
  120. uint32_t a,b,c,d,e,f;
  121. LoadRow(a,b,0)
  122. do
  123. {
  124. Src += SrcPitch;
  125. LoadRow(c,d,0)
  126. e = c;
  127. f = d;
  128. AVG32R(a,b,e,f)
  129. SaveRow(a,b)
  130. Dst += DstPitch;
  131. Src += SrcPitch;
  132. LoadRow(a,b,0)
  133. e = c;
  134. f = d;
  135. AVG32R(c,d,e,f)
  136. SaveRow(c,d)
  137. Dst += DstPitch;
  138. }
  139. while (Src != SrcEnd);
  140. }
  141. // Dst[p] = (Src[p] + Src[p+1] + Src[p+SrcPitch] + Src[p+SrcPitch+1] + 2) >> 2;
  142. void STDCALL CopyBlockHorVer(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  143. {
  144. uint8_t *SrcEnd = Src + 8*SrcPitch;
  145. uint32_t a,b,c,d,g,h,i,j;
  146. LoadRow(a,b,0)
  147. LoadRow(c,d,1)
  148. PrepareAvg4(a,b,c,d)
  149. do
  150. {
  151. Src += SrcPitch;
  152. LoadRow(g,h,0)
  153. LoadRow(i,j,1)
  154. PrepareAvg4(g,h,i,j)
  155. Avg4(a,b,c,d,g,h,i,j)
  156. SaveRow(a,b)
  157. Dst += DstPitch;
  158. Src += SrcPitch;
  159. LoadRow(a,b,0)
  160. LoadRow(c,d,1)
  161. PrepareAvg4(a,b,c,d)
  162. Avg4(g,h,i,j,a,b,c,d)
  163. SaveRow(g,h)
  164. Dst += DstPitch;
  165. }
  166. while (Src != SrcEnd);
  167. }
  168. // Dst[p] = (Src[p] + Src[p+1]) >> 1;
  169. void STDCALL CopyBlockHorRound(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  170. {
  171. uint8_t *SrcEnd = Src + 8*SrcPitch;
  172. uint32_t a,b,c,d;
  173. do
  174. {
  175. LoadRow(a,b,0)
  176. LoadRow(c,d,1)
  177. AVG32NR(a,b,c,d)
  178. SaveRow(a,b)
  179. Dst += DstPitch;
  180. Src += SrcPitch;
  181. }
  182. while (Src != SrcEnd);
  183. }
  184. // Dst[p] = (Src[p] + Src[p+SrcPitch]) >> 1;
  185. void STDCALL CopyBlockVerRound(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  186. {
  187. uint8_t *SrcEnd = Src + 8*SrcPitch;
  188. uint32_t a,b,c,d,e,f;
  189. LoadRow(a,b,0)
  190. do
  191. {
  192. Src += SrcPitch;
  193. LoadRow(c,d,0)
  194. e = c;
  195. f = d;
  196. AVG32NR(a,b,e,f)
  197. SaveRow(a,b)
  198. Dst += DstPitch;
  199. Src += SrcPitch;
  200. LoadRow(a,b,0)
  201. e = a;
  202. f = b;
  203. AVG32NR(c,d,e,f)
  204. SaveRow(c,d)
  205. Dst += DstPitch;
  206. }
  207. while (Src != SrcEnd);
  208. }
  209. // Dst[p] = (Src[p] + Src[p+1] + Src[p+SrcPitch] + Src[p+SrcPitch+1] + 1) >> 2;
  210. void STDCALL CopyBlockHorVerRound(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  211. {
  212. uint8_t *SrcEnd = Src + 8*SrcPitch;
  213. uint32_t a,b,c,d,g,h,i,j;
  214. LoadRow(a,b,0)
  215. LoadRow(c,d,1)
  216. PrepareAvg4(a,b,c,d)
  217. do
  218. {
  219. Src += SrcPitch;
  220. LoadRow(g,h,0)
  221. LoadRow(i,j,1)
  222. PrepareAvg4(g,h,i,j)
  223. Avg4Round(a,b,c,d,g,h,i,j)
  224. SaveRow(a,b)
  225. Dst += DstPitch;
  226. Src += SrcPitch;
  227. LoadRow(a,b,0)
  228. LoadRow(c,d,1)
  229. PrepareAvg4(a,b,c,d)
  230. Avg4Round(g,h,i,j,a,b,c,d)
  231. SaveRow(g,h)
  232. Dst += DstPitch;
  233. }
  234. while (Src != SrcEnd);
  235. }
  236. // Dst[p] = (Src[p] + Dst[p] + 1) >> 1
  237. void STDCALL AddBlock(uint8_t *Src, uint8_t *Dst, int SrcPitch)
  238. {
  239. uint8_t *SrcEnd = Src + 8*SrcPitch;
  240. uint32_t a,b,c,d;
  241. do
  242. {
  243. LoadRow(a,b,0)
  244. AddRow(a,b,c,d)
  245. Dst += 8;
  246. Src += SrcPitch;
  247. }
  248. while (Src != SrcEnd);
  249. }
  250. // Dst[p] = (((Src[p] + Src[p+1]+1) >> 1) + Dst[p] + 1) >> 1
  251. void STDCALL AddBlockHor(uint8_t *Src, uint8_t *Dst, int SrcPitch)
  252. {
  253. uint8_t *SrcEnd = Src + 8*SrcPitch;
  254. uint32_t a,b,c,d;
  255. do
  256. {
  257. LoadRow(a,b,0)
  258. LoadRow(c,d,1)
  259. AVG32R(a,b,c,d)
  260. AddRow(a,b,c,d)
  261. Dst += 8;
  262. Src += SrcPitch;
  263. }
  264. while (Src != SrcEnd);
  265. }
  266. // Dst[p] = (((Src[p] + Src[p+SrcPitch]+1) >> 1) + Dst[p] + 1) >> 1
  267. void STDCALL AddBlockVer(uint8_t *Src, uint8_t *Dst, int SrcPitch)
  268. {
  269. uint8_t *SrcEnd = Src + 8*SrcPitch;
  270. uint32_t a,b,c,d,e,f;
  271. LoadRow(a,b,0)
  272. do
  273. {
  274. Src += SrcPitch;
  275. c=a;
  276. d=b;
  277. LoadRow(a,b,0)
  278. e=a;
  279. f=b;
  280. AVG32R(c,d,e,f)
  281. AddRow(c,d,e,f)
  282. Dst += 8;
  283. }
  284. while (Src != SrcEnd);
  285. }
  286. // Dst[p] = (((Src[p] + Src[p+1] + Src[p+SrcPitch] + Src[p+SrcPitch+1] + 2) >> 2) + Dst[p] + 1) >> 1
  287. void STDCALL AddBlockHorVer(uint8_t *Src, uint8_t *Dst, int SrcPitch)
  288. {
  289. uint8_t *SrcEnd = Src + 8*SrcPitch;
  290. uint32_t a,b,c,d,g,h,i,j;
  291. LoadRow(a,b,0)
  292. LoadRow(c,d,1)
  293. PrepareAvg4(a,b,c,d)
  294. do
  295. {
  296. Src += SrcPitch;
  297. LoadRow(g,h,0)
  298. LoadRow(i,j,1)
  299. PrepareAvg4(g,h,i,j)
  300. Avg4(a,b,c,d,g,h,i,j)
  301. AddRow(a,b,c,d)
  302. a=g;
  303. b=h;
  304. c=i;
  305. d=j;
  306. Dst += 8;
  307. }
  308. while (Src != SrcEnd);
  309. }
  310. // Dst[p] = Src[p]
  311. void STDCALL CopyBlock16x16(uint8_t *Src, uint8_t *Dst, int SrcPitch,int DstPitch)
  312. {
  313. uint8_t *SrcEnd = Src + 16*SrcPitch;
  314. uint32_t a,b,c,d;
  315. do
  316. {
  317. a=((uint32_t*)Src)[0];
  318. b=((uint32_t*)Src)[1];
  319. c=((uint32_t*)Src)[2];
  320. d=((uint32_t*)Src)[3];
  321. ((uint32_t*)Dst)[0]=a;
  322. ((uint32_t*)Dst)[1]=b;
  323. ((uint32_t*)Dst)[2]=c;
  324. ((uint32_t*)Dst)[3]=d;
  325. Dst += DstPitch;
  326. Src += SrcPitch;
  327. }
  328. while (Src != SrcEnd);
  329. }
  330. // Dst[p] = Src[p]
  331. void STDCALL CopyBlock8x8(uint8_t *Src, uint8_t *Dst, int SrcPitch,int DstPitch)
  332. {
  333. uint8_t *SrcEnd = Src + 8*SrcPitch;
  334. uint32_t a,b,c,d;
  335. do
  336. {
  337. a=((uint32_t*)Src)[0];
  338. b=((uint32_t*)Src)[1];
  339. Src += SrcPitch;
  340. c=((uint32_t*)Src)[0];
  341. d=((uint32_t*)Src)[1];
  342. Src += SrcPitch;
  343. ((uint32_t*)Dst)[0]=a;
  344. ((uint32_t*)Dst)[1]=b;
  345. Dst += DstPitch;
  346. ((uint32_t*)Dst)[0]=c;
  347. ((uint32_t*)Dst)[1]=d;
  348. Dst += DstPitch;
  349. }
  350. while (Src != SrcEnd);
  351. }
  352. // Dst[p] = Src[p]
  353. void STDCALL CopyBlockM(uint8_t *Src, uint8_t *Dst, int SrcPitch, int DstPitch)
  354. {
  355. uint8_t *SrcEnd = Src + 16*SrcPitch;
  356. uint32_t a,b,c,d;
  357. do
  358. {
  359. LoadMRow(a,b,c,d,0)
  360. SaveMRow(a,b,c,d)
  361. Dst += DstPitch;
  362. Src += SrcPitch;
  363. }
  364. while (Src != SrcEnd);
  365. }
  366. #endif