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

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: intel2700g_idct420.h 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. static void FUNC(IDCTProcess)(void* p,int x,int y)
  24. {
  25. int Pos;
  26. x <<= 4;
  27. y <<= 4; 
  28. MIRRORXY
  29. Pos = (x << IW_XSHIFT) | (y << IW_YSHIFT);
  30. PVR(p)->mx = x;
  31. PVR(p)->my = y;
  32. PVR(p)->SubPos = 0;
  33. PVR(p)->ImageWrite[1] = 
  34. PVR(p)->ImageWrite[2] = (Pos >> 1) |
  35. GXVA_CMD_IMAGE_WRITE |
  36. GXVA_IMAGE_WRITE_WIDTH_8 |
  37. GXVA_IMAGE_WRITE_HGHT_8;
  38. PVR(p)->ImageWrite[0] = Pos |
  39. GXVA_CMD_IMAGE_WRITE |
  40. GXVA_IMAGE_WRITE_WIDTH_16 |
  41. GXVA_IMAGE_WRITE_HGHT_16;
  42. }
  43. static INLINE void FUNC(IDCT8x8)(pvr* p,idct_block_t *Block,int Length,const uint8_t* Scan)
  44. {
  45. const uint8_t *ScanEnd = Scan + Length;
  46. int16_t* Data = p->IZZ;
  47. int v;
  48. int d;
  49. for (;;Data+=2)
  50. {
  51. do
  52. {
  53. if (Scan == ScanEnd) goto end;
  54. v = *(Scan++);
  55. d = Block[v];
  56. } while (!d);
  57. IZZDATA
  58. Data[0] = (int16_t)v;
  59. Data[1] = (int16_t)d;
  60. }
  61. end:
  62. if (Data == p->IZZ)
  63. {
  64. *(int32_t*)Data = 0;
  65. Data += 2;
  66. }
  67. Data[-2] |= 1;
  68. p->M24VA_WriteIZZBlock((gx_int32*)p->IZZ,(gx_int32*)Data - (gx_int32*)p->IZZ);
  69. }
  70. static void FUNC(IDCTCopy16x16)(void* p,int x,int y,int No)
  71. {
  72. int FetchA,FetchB,ImageWrite;
  73. x <<= 4;
  74. y <<= 4;
  75. MIRRORXY
  76. FetchA = 
  77. (x << (FA_XSHIFT+1)) | 
  78. (y << (FA_YSHIFT+1)) |
  79. GXVA_CMD_FETCH_PRED_A |
  80. GXVA_FETCH_A_FIRST_PRED |
  81. (No ? GXVA_FETCH_A_SRC_SEL_REF2 : GXVA_FETCH_A_SRC_SEL_REF1);
  82. FetchB = 
  83. GXVA_CMD_FETCH_PRED_B |
  84. GXVA_FETCH_B_ACC_Y_POS_0 |
  85. GXVA_FETCH_B_ACC_X_POS_0;
  86. ImageWrite = 
  87. (x << IW_XSHIFT) |
  88. (y << IW_YSHIFT) |
  89. GXVA_CMD_IMAGE_WRITE |
  90. GXVA_IMAGE_WRITE_WIDTH_16 |
  91. GXVA_IMAGE_WRITE_HGHT_16;
  92. PVR(p)->M24VA_WriteMCCmdData(
  93. GXVA_CMD_MC_OPP_TYPE |
  94. GXVA_MC_TYPE_COL_PLANE_Y |
  95. GXVA_MC_TYPE_BLK_WIDTH_16 |
  96. GXVA_MC_TYPE_BLK_HGHT_16);
  97. PVR(p)->M24VA_WriteMCCmdData(FetchB);
  98. PVR(p)->M24VA_WriteMCCmdData(FetchA);
  99. PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
  100. FetchA &= ~(GXVA_FETCH_A_PREDX_MASK|GXVA_FETCH_A_PREDY_MASK);
  101. FetchA |= 
  102. (x << FA_XSHIFT) |
  103. (y << FA_YSHIFT);
  104. ImageWrite = 
  105. ((x >> 1) << IW_XSHIFT) |
  106. ((y >> 1) << IW_YSHIFT) |
  107. GXVA_CMD_IMAGE_WRITE |
  108. GXVA_IMAGE_WRITE_WIDTH_8 |
  109. GXVA_IMAGE_WRITE_HGHT_8;
  110. PVR(p)->M24VA_WriteMCCmdData(
  111. GXVA_CMD_MC_OPP_TYPE |
  112. GXVA_MC_TYPE_COL_PLANE_U |
  113. GXVA_MC_TYPE_BLK_WIDTH_8 |
  114. GXVA_MC_TYPE_BLK_HGHT_8);
  115. PVR(p)->M24VA_WriteMCCmdData(FetchB);
  116. PVR(p)->M24VA_WriteMCCmdData(FetchA);
  117. PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
  118. PVR(p)->M24VA_WriteMCCmdData(
  119. GXVA_CMD_MC_OPP_TYPE |
  120. GXVA_MC_TYPE_COL_PLANE_V |
  121. GXVA_MC_TYPE_BLK_WIDTH_8 |
  122. GXVA_MC_TYPE_BLK_HGHT_8);
  123. PVR(p)->M24VA_WriteMCCmdData(FetchB);
  124. PVR(p)->M24VA_WriteMCCmdData(FetchA);
  125. PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
  126. }
  127. static INLINE int FUNC(MVConvert)(const int16_t* MV,int x,int y)
  128. {
  129. return 
  130. (((x MVDIRX MV[MVXIDX]) << FA_XSHIFT) & FA_XMASK) |
  131. (((y MVDIRY MV[MVYIDX]) << FA_YSHIFT) & FA_YMASK);
  132. }
  133. static void FUNC(IDCTMComp16x16Back)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
  134. {
  135. int mx,my,cmd;
  136. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_16|GXVA_MC_TYPE_BLK_HGHT_16);
  137. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|GXVA_FETCH_B_ACC_Y_POS_0|GXVA_FETCH_B_ACC_X_POS_0);
  138. mx = PVR(p)->mx;
  139. my = PVR(p)->my;
  140. cmd = GXVA_CMD_FETCH_PRED_A | GXVA_FETCH_A_FIRST_PRED | GXVA_FETCH_A_SRC_SEL_REF1;
  141. PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
  142. PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
  143. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+0,mx*2,my*2) | cmd);
  144. }
  145. static void FUNC(IDCTMComp16x16BackFwd)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
  146. {
  147. int mx,my,cmd;
  148. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_16|GXVA_MC_TYPE_BLK_HGHT_16);
  149. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|GXVA_FETCH_B_ACC_Y_POS_0|GXVA_FETCH_B_ACC_X_POS_0);
  150. PVR(p)->FetchA[0][0] = 0;
  151. PVR(p)->FetchA[0][1] = 0;
  152. PVR(p)->FetchA[1][0] = 0;
  153. PVR(p)->FetchA[1][1] = 0;
  154. mx = PVR(p)->mx;
  155. my = PVR(p)->my;
  156. cmd = GXVA_FETCH_A_FIRST_PRED;
  157. if (MVBack)
  158. {
  159. cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF1;
  160. PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
  161. PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
  162. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+0,mx*2,my*2) | cmd);
  163. cmd = 0;
  164. }
  165. if (MVFwd)
  166. {
  167. cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF2;
  168. PVR(p)->FetchA[1][0] = FUNC(MVConvert)(MVFwd+8,mx,my) | cmd;
  169. PVR(p)->FetchA[1][1] = FUNC(MVConvert)(MVFwd+10,mx,my) | cmd;
  170. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+0,mx*2,my*2) | cmd);
  171. }
  172. }
  173. static void FUNC(IDCTMComp8x8Back)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
  174. {
  175. int mx = PVR(p)->mx;
  176. int my = PVR(p)->my;
  177. int cmd = GXVA_CMD_FETCH_PRED_A | GXVA_FETCH_A_FIRST_PRED | GXVA_FETCH_A_SRC_SEL_REF1;
  178. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_8|GXVA_MC_TYPE_BLK_HGHT_8);
  179. PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
  180. PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
  181. mx <<= 1;
  182. my <<= 1;
  183. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
  184. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_00,mx,my) | cmd);
  185. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
  186. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_01,mx+16,my) | cmd);
  187. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
  188. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_10,mx,my+16) | cmd);
  189. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
  190. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_11,mx+16,my+16) | cmd);
  191. }
  192. static void FUNC(IDCTMComp8x8BackFwd)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
  193. {
  194. int mx = PVR(p)->mx;
  195. int my = PVR(p)->my;
  196. int cmd = GXVA_FETCH_A_FIRST_PRED;
  197. PVR(p)->FetchA[0][0] = 0;
  198. PVR(p)->FetchA[0][1] = 0;
  199. PVR(p)->FetchA[1][0] = 0;
  200. PVR(p)->FetchA[1][1] = 0;
  201. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_8|GXVA_MC_TYPE_BLK_HGHT_8);
  202. if (MVBack)
  203. {
  204. cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF1;
  205. PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
  206. PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
  207. mx <<= 1;
  208. my <<= 1;
  209. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
  210. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_00,mx,my) | cmd);
  211. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
  212. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_01,mx+16,my) | cmd);
  213. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
  214. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_10,mx,my+16) | cmd);
  215. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
  216. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_11,mx+16,my+16) | cmd);
  217. mx >>= 1;
  218. my >>= 1;
  219. cmd = 0;
  220. }
  221. if (MVFwd)
  222. {
  223. cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF2;
  224. PVR(p)->FetchA[1][0] = FUNC(MVConvert)(MVFwd+8,mx,my) | cmd;
  225. PVR(p)->FetchA[1][1] = FUNC(MVConvert)(MVFwd+10,mx,my) | cmd;
  226. mx <<= 1;
  227. my <<= 1;
  228. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
  229. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_00,mx,my) | cmd);
  230. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
  231. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_01,mx+16,my) | cmd);
  232. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
  233. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_10,mx,my+16) | cmd);
  234. PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
  235. PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_11,mx+16,my+16) | cmd);
  236. }
  237. }
  238. static const int FUNC(Intra420)[6] =
  239. {
  240. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_00,
  241. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_01,
  242. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_10,
  243. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_11,
  244. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT,
  245. GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT
  246. };
  247. static const int FUNC(Inter420)[6] =
  248. {
  249. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_00,
  250. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_01,
  251. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_10,
  252. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_11,
  253. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT,
  254. GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT
  255. };
  256. static void FUNC(IDCTIntra8x8)(void* p,idct_block_t *Block,int Length,int ScanType)
  257. {
  258. int SubPos = PVR(p)->SubPos++;
  259. if (!SubPos)
  260. PVR(p)->M24VA_WriteMCCmdData(
  261. GXVA_CMD_MC_OPP_TYPE|
  262. GXVA_MC_TYPE_COL_PLANE_Y |
  263. GXVA_MC_TYPE_BLK_WIDTH_16 |
  264. GXVA_MC_TYPE_BLK_HGHT_16);
  265. else
  266. if (SubPos >= 4)
  267. PVR(p)->M24VA_WriteMCCmdData(
  268. (SubPos - 3)| // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
  269. GXVA_CMD_MC_OPP_TYPE|
  270. GXVA_MC_TYPE_BLK_WIDTH_8 |
  271. GXVA_MC_TYPE_BLK_HGHT_8);
  272. PVR(p)->M24VA_WriteMCCmdData(FUNC(Intra420)[SubPos]);
  273. FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[ScanType]);
  274. SubPos -= 3;
  275. if (SubPos >= 0)
  276. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
  277. }
  278. static void FUNC(IDCTInter8x8Back)(void* p,idct_block_t *Block,int Length)
  279. {
  280. int SubPos = PVR(p)->SubPos++;
  281. if (SubPos >= 4)
  282. {
  283. PVR(p)->M24VA_WriteMCCmdData(
  284. PVR(p)->MCompType |
  285. GXVA_MC_TYPE_BLK_WIDTH_8 |
  286. GXVA_MC_TYPE_BLK_HGHT_8 |
  287. (SubPos - 3)); // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
  288. //FetchB
  289. PVR(p)->M24VA_WriteMCCmdData(
  290. GXVA_CMD_FETCH_PRED_B |
  291. GXVA_FETCH_B_ACC_Y_POS_0 |
  292. GXVA_FETCH_B_ACC_X_POS_0);
  293. //FetchA
  294. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->FetchA[0][SubPos-4]);
  295. }
  296. if (Length)
  297. {
  298. PVR(p)->M24VA_WriteMCCmdData(FUNC(Inter420)[SubPos]);
  299. FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[0]);
  300. }
  301. SubPos -= 3;
  302. if (SubPos >= 0)
  303. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
  304. }
  305. static void FUNC(IDCTInter8x8BackFwd)(void* p,idct_block_t *Block,int Length)
  306. {
  307. int* FetchA;
  308. int SubPos = PVR(p)->SubPos++;
  309. if (SubPos >= 4)
  310. {
  311. PVR(p)->M24VA_WriteMCCmdData(
  312. PVR(p)->MCompType |
  313. GXVA_MC_TYPE_BLK_WIDTH_8 |
  314. GXVA_MC_TYPE_BLK_HGHT_8 |
  315. (SubPos - 3)); // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
  316. //FetchB
  317. PVR(p)->M24VA_WriteMCCmdData(
  318. GXVA_CMD_FETCH_PRED_B |
  319. GXVA_FETCH_B_ACC_Y_POS_0 |
  320. GXVA_FETCH_B_ACC_X_POS_0);
  321. //FetchA
  322. FetchA = &PVR(p)->FetchA[0][SubPos-4];
  323. if (FetchA[0])
  324. PVR(p)->M24VA_WriteMCCmdData(FetchA[0]);
  325. if (FetchA[2])
  326. PVR(p)->M24VA_WriteMCCmdData(FetchA[2]);
  327. }
  328. if (Length)
  329. {
  330. PVR(p)->M24VA_WriteMCCmdData(FUNC(Inter420)[SubPos]);
  331. FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[0]);
  332. }
  333. SubPos -= 3;
  334. if (SubPos >= 0)
  335. PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
  336. }
  337. #undef FUNC
  338. #undef FA_XMASK
  339. #undef FA_YMASK
  340. #undef FA_XSHIFT
  341. #undef FA_YSHIFT
  342. #undef IW_XSHIFT
  343. #undef IW_YSHIFT
  344. #undef MIRRORXY
  345. #undef IZZDATA
  346. #undef MVDIRX
  347. #undef MVDIRY
  348. #undef MVPOS_00
  349. #undef MVIDX_00
  350. #undef MVPOS_01
  351. #undef MVIDX_01
  352. #undef MVPOS_10
  353. #undef MVIDX_10
  354. #undef MVPOS_11
  355. #undef MVIDX_11
  356. #undef IDCT_00
  357. #undef IDCT_01
  358. #undef IDCT_10
  359. #undef IDCT_11