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

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: idct_half.c 284 2005-10-04 08:54:26Z 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. #define W1 2676  // 2048*sqrt(2)*cos(1*pi/8) 
  26. #define W3 1108  // 2048*sqrt(2)*cos(3*pi/8) 
  27. #define ADDSAT32(a,Dst,Add32)
  28. b = a + Add32;
  29. c = a & Add32;
  30. a ^= Add32;
  31. a &= ~b;
  32. a |= c;
  33. a &= MaskCarry;
  34. c = a << 1;
  35. b -= c; /* adjust neighbour */
  36. b |= c - (a >> 7); /* mask */
  37. Dst = b;
  38. #define SUBSAT32(a,Dst,Add32)
  39. a = ~a;
  40. b = a + Add32;
  41. c = a & Add32;
  42. a ^= Add32;
  43. a &= ~b;
  44. a |= c;
  45. a &= MaskCarry;
  46. c = a << 1;
  47. b -= c; /* adjust neighbour */
  48. b |= c - (a >> 7); /* mask */
  49. Dst = ~b;
  50. #define SPLIT(d0,d1,d2)
  51. d0 = d1 + d2;
  52. d1 -= d2;
  53. #define BUTTERFLY(d0,d1,W0,W1,tmp)
  54.     tmp = W0 * (d0 + d1);
  55.     d0 = tmp + (W1 - W0) * d0;
  56.     d1 = tmp - (W1 + W0) * d1;
  57. static void IDCT_Col4(idct_block_t *Blk)
  58. {
  59. int d0,d1,d2,d3,d4;
  60. d0 = Blk[0];
  61. d1 = Blk[8];
  62. d2 = Blk[16];
  63. d3 = Blk[24];
  64. if (!(d2|d3))
  65. {
  66. if (!d1) 
  67. // d0
  68. if (d0) 
  69. {
  70. d0 <<= 3;
  71. Blk[0]  = (idct_block_t)d0;
  72. Blk[8]  = (idct_block_t)d0;
  73. Blk[16] = (idct_block_t)d0;
  74. Blk[24] = (idct_block_t)d0;
  75. }
  76. }
  77. else 
  78. // d0,d1
  79. d0 = (d0 << 11) + 128; //+final rounding
  80. d4 = W1 * d1;
  81. d1 = W3 * d1;
  82. Blk[0]  = (idct_block_t)((d0 + d4) >> 8);
  83. Blk[8]  = (idct_block_t)((d0 + d1) >> 8);
  84. Blk[16] = (idct_block_t)((d0 - d1) >> 8);
  85. Blk[24] = (idct_block_t)((d0 - d4) >> 8);
  86. }
  87. }
  88. else
  89. // d0,d1,d2,d3
  90. d0 = (d0 << 11) + 128; //+final rounding
  91. d2 = (d2 << 11);
  92. BUTTERFLY(d1,d3,W3,W1,d4)
  93. SPLIT(d4,d0,d2) // d2->d1
  94. Blk[0]  = (idct_block_t)((d4 + d1) >> 8);
  95. Blk[8]  = (idct_block_t)((d0 + d3) >> 8);
  96. Blk[16] = (idct_block_t)((d0 - d3) >> 8);
  97. Blk[24] = (idct_block_t)((d4 - d1) >> 8);
  98. }
  99. }
  100. static void IDCT_Row4(idct_block_t *Blk, uint8_t *Dst, const uint8_t *Src)
  101. {
  102. int d0,d1,d2,d3,d4;
  103. d1 = Blk[1];
  104.    d2 = Blk[2];
  105.    d3 = Blk[3];
  106. if (!(d1|d2|d3))
  107. {
  108. d0 = (Blk[0] + 32) >> 6;
  109. if (!Src)
  110. {
  111. SAT(d0);
  112. d0 &= 255;
  113. d0 |= d0 << 8;
  114. d0 |= d0 << 16;
  115. ((uint32_t*)Dst)[0] = d0;
  116. return;
  117. }
  118. d2 = d4 = d1 = d0;
  119. }
  120. else
  121. {
  122. d0 = (Blk[0] << 11) + 65536; // +final rounding
  123. d2 = (d2 << 11);
  124. BUTTERFLY(d1,d3,W3,W1,d4)
  125. SPLIT(d4,d0,d2) // d2->d1
  126. d2 = (d4 + d1) >> 17; //0
  127. d4 = (d4 - d1) >> 17; //3
  128. d1 = (d0 + d3) >> 17; //1
  129. d0 = (d0 - d3) >> 17; //2
  130. }
  131. if (Src)
  132. {
  133. d2 += Src[0];
  134. d1 += Src[1];
  135. d0 += Src[2];
  136. d4 += Src[3];
  137. }
  138. if ((d2|d1|d0|d4)>>8)
  139. {
  140. SAT(d2)
  141. SAT(d1)
  142. SAT(d0)
  143. SAT(d4)
  144. }
  145. Dst[0] = (uint8_t)d2;
  146. Dst[1] = (uint8_t)d1;
  147. Dst[2] = (uint8_t)d0;
  148. Dst[3] = (uint8_t)d4;
  149. }
  150. void STDCALL IDCT_Block4x4(idct_block_t *Block, uint8_t *Dest, int DestStride, const uint8_t *Src)
  151. {
  152. int SrcStride;
  153. IDCT_Col4(Block);
  154. IDCT_Col4(Block+1);
  155. IDCT_Col4(Block+2);
  156. IDCT_Col4(Block+3);
  157. SrcStride = 0;
  158. #ifdef MIPS64
  159. if (Src) SrcStride = DestStride;
  160. #else
  161. if (Src) SrcStride = 8;
  162. #endif
  163. IDCT_Row4(Block,Dest,Src);
  164. Dest+=DestStride;
  165. Src+=SrcStride;
  166. IDCT_Row4(Block+8,Dest,Src);
  167. Dest+=DestStride;
  168. Src+=SrcStride;
  169. IDCT_Row4(Block+16,Dest,Src);
  170. Dest+=DestStride;
  171. Src+=SrcStride;
  172. IDCT_Row4(Block+24,Dest,Src);
  173. }
  174. void STDCALL IDCT_Block2x2(idct_block_t *Block, uint8_t *Dest, int DestStride, const uint8_t *Src)
  175. {
  176. int d0,d1,d2,d3,d4;
  177. d0 = Block[0] + Block[8];
  178. d1 = Block[0] - Block[8];
  179. d2 = Block[1] + Block[9];
  180. d3 = Block[1] - Block[9];
  181. d0 += 4;
  182. d4 = (d0 - d2) >> 3;
  183. d0 = (d0 + d2) >> 3;
  184. d1 += 4;
  185. d2 = (d1 - d3) >> 3;
  186. d1 = (d1 + d3) >> 3;
  187. if (Src)
  188. {
  189. #ifdef MIPS64
  190. int SrcStride = DestStride;
  191. #else
  192. int SrcStride = 8;
  193. #endif
  194. d0 += Src[0];
  195. d4 += Src[1];
  196. d1 += Src[0+SrcStride];
  197. d2 += Src[1+SrcStride];
  198. }
  199. if ((d0|d4|d1|d2)>>8)
  200. {
  201. SAT(d0)
  202. SAT(d4)
  203. SAT(d1)
  204. SAT(d2)
  205. }
  206. Dest[0] = (uint8_t)d0;
  207. Dest[1] = (uint8_t)d4;
  208. Dest+=DestStride;
  209. Dest[0] = (uint8_t)d1;
  210. Dest[1] = (uint8_t)d2;
  211. }
  212. #ifndef MMX
  213. void STDCALL IDCT_Const4x4(int v,uint8_t * Dst, int DstPitch, uint8_t * Src)
  214. {
  215. #ifndef MIPS64
  216. int SrcPitch = 8;
  217. #else
  218. int SrcPitch = DstPitch;
  219. #endif
  220. const uint8_t* SrcEnd = Src + 4*SrcPitch;
  221. uint32_t MaskCarry = 0x80808080U;
  222. uint32_t a,b,c;
  223. if (v>0)
  224. {
  225. v |= v << 8;
  226. v |= v << 16;
  227. do
  228. {
  229. a = ((uint32_t*)Src)[0]; 
  230. ADDSAT32(a,((uint32_t*)Dst)[0],v); 
  231. Dst += DstPitch;
  232. Src += SrcPitch;
  233. }
  234. while (Src != SrcEnd);
  235. }
  236. else
  237. if (v<0)
  238. {
  239. v = -v;
  240. v |= v << 8;
  241. v |= v << 16;
  242. do
  243. {
  244. a = ((uint32_t*)Src)[0];
  245. SUBSAT32(a,((uint32_t*)Dst)[0],v);
  246. Dst += DstPitch;
  247. Src += SrcPitch;
  248. }
  249. while (Src != SrcEnd);
  250. }
  251. #ifndef MIPS64
  252. else
  253. CopyBlock4x4(Src,Dst,SrcPitch,DstPitch);
  254. #endif
  255. }
  256. #endif