idctref.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. /* idctref_miha.c, Inverse Discrete Fourier Transform, double precision */
  3. /*************************************************************/
  4. /*                                                           */
  5. /* x87 hand-optimized assembly by Miha Peternel              */
  6. /*                                     27.11. - 20.1.2001    */
  7. /*                                                           */
  8. /* You are free to use this code in your project if:         */
  9. /* - no changes are made to this message                     */
  10. /* - any changes to this code are publicly available         */
  11. /* - your project documentation contains the following text: */
  12. /*   "This software contains fast high-quality IDCT decoder  */
  13. /*    by Miha Peternel."                                     */
  14. /*                                                           */
  15. /*************************************************************/
  16. /*  Perform IEEE 1180 reference (64-bit floating point, separable 8x1
  17.  *  direct matrix multiply) Inverse Discrete Cosine Transform
  18. */
  19. #define ModelX 123 // enable C-level optimizations by Miha Peternel
  20. /* Here we use math.h to generate constants.  Compiler results may
  21.    vary a little */
  22. #include <math.h>
  23. #define M_PI 3.1415926535897932384626433832795
  24. const static double HALF = 0.5;
  25. /* private data */
  26. static short iclip[1024+1024]; /* clipping table */
  27. static short *iclp;
  28. /* cosine transform matrix for 8x1 IDCT */
  29. static double c[8][8];
  30. /* initialize DCT coefficient matrix */
  31. void Initialize_REF_IDCT()
  32. {
  33.   int freq, time, i;
  34.   double scale;
  35.   for (freq=0; freq < 8; freq++)
  36.   {
  37.     scale = (freq == 0) ? sqrt(0.125) : 0.5;
  38.     for (time=0; time<8; time++)
  39.       c[freq][time] = scale*cos((M_PI/8.0)*freq*(time + 0.5));
  40.   }
  41. #ifdef ModelX
  42.   iclp = iclip+1024;
  43.   for (i= -1024; i<1024; i++)
  44.     iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
  45. #endif
  46. }
  47. void REF_IDCT(short *block)
  48. {
  49.   double tmp[64];
  50. double rnd[64];
  51. int int0, int1, int2, int3, int4, int5, int6, int7;
  52. unsigned short fpold;
  53. unsigned short fpnew;
  54. int *b = (int *) block;
  55.   if( !(b[0]|(b[31]&~0x10000)) )
  56. {
  57.   if( b[ 1]|b[ 2]|b[ 3]|b[ 4]|b[ 5]|b[ 6] )
  58.   goto normal;
  59.   if( b[ 7]|b[ 8]|b[ 9]|b[10]|b[11]|b[12] )
  60.   goto normal;
  61.   if( b[13]|b[14]|b[15]|b[16]|b[17]|b[18] )
  62.   goto normal;
  63.   if( b[19]|b[20]|b[21]|b[22]|b[23]|b[24] )
  64.   goto normal;
  65.   if( b[25]|b[26]|b[27]|b[28]|b[29]|b[30] )
  66.   goto normal;
  67. b[31]=0;
  68. return;
  69. }
  70. normal:
  71. __asm
  72. {
  73. // do the IDCT
  74. mov esi,[block]
  75. lea eax,[c]
  76. lea edi,[tmp]
  77. //mov ebx,8
  78. mov ebx,8 // 0x77000000 // 8
  79. align 16
  80. __col1:
  81.     movzx edx,[esi+1*2]
  82. mov   ecx,[esi+2*2]
  83. or    edx,[esi+4*2]
  84. or    ecx,[esi+6*2]
  85. or edx,ecx
  86. //mov ecx,8
  87. mov ecx,8/2 // 0x77000000 // 8
  88. jnz __row1
  89. fild  word ptr [esi+0*2]
  90. fmul qword ptr [eax+0*8*8]
  91. fst  qword ptr [edi+0*8]
  92. fst  qword ptr [edi+1*8]
  93. fst  qword ptr [edi+2*8]
  94. fst  qword ptr [edi+3*8]
  95. fst  qword ptr [edi+4*8]
  96. fst  qword ptr [edi+5*8]
  97. fst  qword ptr [edi+6*8]
  98. fstp qword ptr [edi+7*8]
  99. add edi,8*8
  100. jmp __next1
  101. align 16
  102. __row1:
  103. fild  word ptr [esi+0*2]
  104. fmul qword ptr [eax+0*8*8]
  105. fild  word ptr [esi+1*2]
  106. fmul qword ptr [eax+1*8*8]
  107. fadd
  108. fild  word ptr [esi+2*2]
  109. fmul qword ptr [eax+2*8*8]
  110. fadd
  111. fild  word ptr [esi+3*2]
  112. fmul qword ptr [eax+3*8*8]
  113. fadd
  114. fild  word ptr [esi+4*2]
  115. fmul qword ptr [eax+4*8*8]
  116. fadd
  117. fild  word ptr [esi+5*2]
  118. fmul qword ptr [eax+5*8*8]
  119. fadd
  120. fild  word ptr [esi+6*2]
  121. fmul qword ptr [eax+6*8*8]
  122. fadd
  123. fild  word ptr [esi+7*2]
  124. fmul qword ptr [eax+7*8*8]
  125. fadd
  126. fild  word ptr [esi+0*2]
  127. fmul qword ptr [eax+0*8*8+8]
  128. fild  word ptr [esi+1*2]
  129. fmul qword ptr [eax+1*8*8+8]
  130. fadd
  131. fild  word ptr [esi+2*2]
  132. fmul qword ptr [eax+2*8*8+8]
  133. fadd
  134. fild  word ptr [esi+3*2]
  135. fmul qword ptr [eax+3*8*8+8]
  136. fadd
  137. fild  word ptr [esi+4*2]
  138. fmul qword ptr [eax+4*8*8+8]
  139. fadd
  140. fild  word ptr [esi+5*2]
  141. fmul qword ptr [eax+5*8*8+8]
  142. fadd
  143. fild  word ptr [esi+6*2]
  144. fmul qword ptr [eax+6*8*8+8]
  145. fadd
  146. fild  word ptr [esi+7*2]
  147. fmul qword ptr [eax+7*8*8+8]
  148. fadd
  149. add eax,8*2
  150. fxch st(1)
  151. fstp qword ptr [edi]//
  152. fstp qword ptr [edi+8]
  153. add edi,8*2
  154. dec ecx
  155. jnz __row1
  156. add eax,-8*8
  157.   //align 16
  158. __next1:
  159. add esi,+8*2
  160. sub ebx,0x80000001 // add ebx,ebx 
  161. js  __col1
  162. //align 16
  163. test ebx,ebx // align jump &| redo flags
  164. jnz __col1
  165. lea esi,[tmp]
  166. lea eax,[c]
  167. lea edi,[rnd]
  168. //mov edi,[block]
  169.     fld qword ptr [HALF]
  170. mov ebx,8
  171. __row2:
  172. mov ecx,8/2
  173. align 16
  174. __col2:
  175. fld  qword ptr [esi+0*8*8]
  176. fmul qword ptr [eax+0*8*8]
  177. fld  qword ptr [esi+1*8*8]
  178. fmul qword ptr [eax+1*8*8]
  179. fadd
  180. fld  qword ptr [esi+2*8*8]
  181. fmul qword ptr [eax+2*8*8]
  182. fadd
  183. fld  qword ptr [esi+3*8*8]
  184. fmul qword ptr [eax+3*8*8]
  185. fadd
  186. fld  qword ptr [esi+4*8*8]
  187. fmul qword ptr [eax+4*8*8]
  188. fadd
  189. fld  qword ptr [esi+5*8*8]
  190. fmul qword ptr [eax+5*8*8]
  191. fadd
  192. fld  qword ptr [esi+6*8*8]
  193. fmul qword ptr [eax+6*8*8]
  194. fadd
  195. fld  qword ptr [esi+7*8*8]
  196. fmul qword ptr [eax+7*8*8]
  197. fadd
  198. fadd st(0),st(1)
  199. fxch st(1)
  200. fld  qword ptr [esi+0*8*8]
  201. fmul qword ptr [eax+0*8*8+8]
  202. fld  qword ptr [esi+1*8*8]
  203. fmul qword ptr [eax+1*8*8+8]
  204. fadd
  205. fld  qword ptr [esi+2*8*8]
  206. fmul qword ptr [eax+2*8*8+8]
  207. fadd
  208. fld  qword ptr [esi+3*8*8]
  209. fmul qword ptr [eax+3*8*8+8]
  210. fadd
  211. fld  qword ptr [esi+4*8*8]
  212. fmul qword ptr [eax+4*8*8+8]
  213. fadd
  214. fld  qword ptr [esi+5*8*8]
  215. fmul qword ptr [eax+5*8*8+8]
  216. fadd
  217. fld  qword ptr [esi+6*8*8]
  218. fmul qword ptr [eax+6*8*8+8]
  219. fadd
  220. fld  qword ptr [esi+7*8*8]
  221. fmul qword ptr [eax+7*8*8+8]
  222. fadd
  223. fadd st(0),st(1)
  224. add eax,8*2
  225. fxch st(2)
  226. fstp qword ptr [edi]
  227. fxch st(1)
  228. fstp qword ptr [edi+8*8]
  229. add edi,8*8*2
  230. dec ecx
  231. jnz __col2
  232. add eax,-8*8
  233. add esi,+8
  234. add edi,8-8*8*8
  235. sub ebx,0x80000001
  236. js  __row2
  237.   //align 16
  238. test ebx,ebx // align jump &| redo flags
  239. jnz __row2
  240. ffree st(0) // bye bye 0.5
  241.   // set x87 to floor mode
  242. fstcw [fpold]
  243. movzx eax, [fpold]
  244. or eax, 0x0400 // round down - floor
  245. mov [fpnew], ax
  246. fldcw [fpnew]
  247. // now floor the damn array
  248. lea esi, [rnd]
  249. mov edi, [block]
  250. mov ebx, -256 // clip min
  251. mov edx, +255 // clip max
  252. mov ecx, 8
  253. align 16
  254. __floor:
  255.   fld   qword ptr [esi+0*8]
  256. fistp dword ptr [int0]
  257.   mov eax,[int0]
  258. cmp   eax,ebx
  259. cmovl eax,ebx
  260. cmp   eax,edx
  261. cmovg eax,edx
  262.   fld   qword ptr [esi+1*8]
  263. fistp dword ptr [int1]
  264. mov word ptr [edi+0*2],ax
  265.   mov eax,[int1]
  266. cmp   eax,ebx
  267. cmovl eax,ebx
  268. cmp   eax,edx
  269. cmovg eax,edx
  270.   fld   qword ptr [esi+2*8]
  271. fistp dword ptr [int2]
  272. mov word ptr [edi+1*2],ax
  273.   mov eax,[int2]
  274. cmp   eax,ebx
  275. cmovl eax,ebx
  276. cmp   eax,edx
  277. cmovg eax,edx
  278.   fld   qword ptr [esi+3*8]
  279. fistp dword ptr [int3]
  280. mov word ptr [edi+2*2],ax
  281.   mov eax,[int3]
  282. cmp   eax,ebx
  283. cmovl eax,ebx
  284. cmp   eax,edx
  285. cmovg eax,edx
  286.   fld   qword ptr [esi+4*8]
  287. fistp dword ptr [int4]
  288. mov word ptr [edi+3*2],ax
  289.   mov eax,[int4]
  290. cmp   eax,ebx
  291. cmovl eax,ebx
  292. cmp   eax,edx
  293. cmovg eax,edx
  294.   fld   qword ptr [esi+5*8]
  295. fistp dword ptr [int5]
  296. mov word ptr [edi+4*2],ax
  297.   mov eax,[int5]
  298. cmp   eax,ebx
  299. cmovl eax,ebx
  300. cmp   eax,edx
  301. cmovg eax,edx
  302.   fld   qword ptr [esi+6*8]
  303. fistp dword ptr [int6]
  304. mov word ptr [edi+5*2],ax
  305.   mov eax,[int6]
  306. cmp   eax,ebx
  307. cmovl eax,ebx
  308. cmp   eax,edx
  309. cmovg eax,edx
  310.   fld   qword ptr [esi+7*8]
  311. fistp dword ptr [int7]
  312. mov word ptr [edi+6*2],ax
  313.   mov eax,[int7]
  314. cmp   eax,ebx
  315. cmovl eax,ebx
  316. cmp   eax,edx
  317. cmovg eax,edx
  318. mov word ptr [edi+7*2],ax
  319. add esi, 8*8
  320. add edi, 8*2
  321. sub ecx,0x80000001
  322. js  __floor
  323.   //align 16
  324. test ecx,ecx // align jump &| redo flags
  325. jnz __floor
  326. // set x87 to default mode
  327. fldcw [fpold]
  328. };
  329. }