edge.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:22k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hxcom.h"
  37. #include "edge.h"
  38. #include "hlxclib/math.h"
  39. // Lookup tables to perform luma image enhancement
  40. int soft_core_2d[LUT_LENGTH];
  41. int clip_softcore_post[CLIP_TABLE_LENGTH];
  42. int soft_core_2d88[LUT_LENGTH];
  43. #define lut_soft_core_2d (soft_core_2d+OFFSET_SOFTCORE)
  44. #define lut_soft_core_2d88 (soft_core_2d88+OFFSET_SOFTCORE)
  45. #define lut_clip_softcore_post (clip_softcore_post+OFFSET_CLIP_SOFTCORE)
  46. float g_fCurrentSharpness = 0.0;
  47. INT16 g_nCurrentExpand = 0 ;
  48. void HXEXPORT
  49. ENTRYPOINT(SetSharpnessAdjustments)(float Sharpness, INT16 nExpand)
  50. {
  51.     //Initialize edge enhancemnt lookup table
  52.     //adjust the Sharpness parameter input range [-1,1] to output range [0,MAX_B]
  53.     g_fCurrentSharpness = Sharpness;
  54.     g_nCurrentExpand = nExpand;
  55.     Sharpness += 1.0;
  56.     
  57.     if(nExpand)
  58.     {
  59. Sharpness *= (ZOOM_BOOST*MAX_B/2.0);
  60.     }
  61.     else
  62.     {
  63. Sharpness *= (MAX_B/2.0);
  64.     }
  65.     Inittriangleluts(DEFT_C,DEFT_A,Sharpness);
  66.    
  67. }
  68. void HXEXPORT
  69. ENTRYPOINT(GetSharpnessAdjustments)(float* pSharpness, INT16* pnExpand)
  70. {
  71.     *pSharpness = g_fCurrentSharpness;
  72.     *pnExpand = g_nCurrentExpand;
  73. }
  74. void HXEXPORT
  75. ENTRYPOINT(Enhance)(UCHAR *yuv420in, INT32 inheight, INT32  inwidth, INT32 pitchSrc, float Sharpness)
  76. {
  77.     int     row, curBuf, prevBuf;
  78.     unsigned char  *pLuma;
  79.     static int  helper[2][2][HELPER_MAXLEN];    
  80.     static int first_fl=1;
  81.     float tolerance=(float)0.1;
  82.     int tmp1;
  83.     if ((inwidth > HELPER_MAXLEN) || (inheight <16))
  84. {
  85. return ;
  86. }
  87.     //if Sharpness is -1.0 (or close) do not do any edge enhancement
  88.     if(((Sharpness+1.0)<tolerance) && ((Sharpness+1.0)>-tolerance))
  89.     {
  90. return ;
  91.     }
  92.     if(first_fl==1)
  93.     {
  94. //Initialize constant edge enhancemnt lookup table to defaults for the first time
  95. /*Inittriangleluts(DEFT_C,DEFT_A,DEFT_B);*/
  96. Inittrianglelutsconst();
  97. //initialize clipping table
  98. Initcliplut();
  99. first_fl=0;
  100. }
  101.     curBuf = 0;         // Point to "current" line buffer
  102.     pLuma = yuv420in;    // Point to beginning of current line
  103.     DiffNonLin2Dconst( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  104.     DiffNonLin2Dconst( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  105.     for (row = 1; row < inheight-9; row=row+8) {
  106. //(1)
  107. prevBuf = curBuf;   // Point to previous line buffer
  108. curBuf ^= 1;        // Add 1 modulo 2
  109. pLuma +=pitchSrc;   // Advance pointer to next row
  110. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  111.         DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  112. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  113. //(2)
  114. prevBuf = curBuf;   
  115.         curBuf ^= 1;       
  116. pLuma +=pitchSrc;  
  117. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  118. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  119. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  120. //(3)
  121. prevBuf = curBuf;   
  122.         curBuf ^= 1;        
  123. pLuma +=pitchSrc;  
  124. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  125. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  126. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  127. //(4)
  128. prevBuf = curBuf;   
  129.         curBuf ^= 1;        
  130. pLuma +=pitchSrc;   
  131. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  132. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  133. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  134. //(5)
  135. prevBuf = curBuf;   
  136.         curBuf ^= 1;        
  137. pLuma +=pitchSrc;   
  138. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  139. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  140. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  141. //(6)
  142. prevBuf = curBuf;   
  143.         curBuf ^= 1;        
  144. pLuma +=pitchSrc; 
  145. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  146. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  147. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  148. //2edge pixels------------------
  149. //(7)
  150.         prevBuf = curBuf;   
  151.         curBuf ^= 1;        
  152. pLuma +=pitchSrc;
  153. DiffNonLin2Dconst( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  154. DiffNonLin2Dconst( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  155.         Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  156. //(8)
  157.         prevBuf = curBuf;   
  158.         curBuf ^= 1;        
  159. pLuma +=pitchSrc;
  160. DiffNonLin2Dconst( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  161. DiffNonLin2Dconst( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  162.         Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  163.     }
  164.     tmp1=(inheight-((inheight>>3)<<3))-1;
  165.     switch(tmp1)
  166.     {
  167.     case 6:
  168.  //(1)
  169. prevBuf = curBuf;   
  170. curBuf ^= 1;        
  171. pLuma +=pitchSrc;
  172. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  173. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  174. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  175.     case 5:
  176. //(2)
  177. prevBuf = curBuf;  
  178. curBuf ^= 1;        
  179. pLuma +=pitchSrc; 
  180. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  181. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  182. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  183.     case 4:
  184. //(3)
  185. prevBuf = curBuf;  
  186. curBuf ^= 1;        
  187. pLuma +=pitchSrc; 
  188. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  189. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  190. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  191.     case 3:
  192. //(4)
  193. prevBuf = curBuf;   
  194. curBuf ^= 1;        
  195. pLuma +=pitchSrc; 
  196. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  197. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  198. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  199.     
  200.     case 2:
  201. //(5)
  202. prevBuf = curBuf;   
  203. curBuf ^= 1;        
  204. pLuma +=pitchSrc; 
  205. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  206. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  207. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  208.     case 1:
  209. //(6)
  210. prevBuf = curBuf;   
  211. curBuf ^= 1;        
  212. pLuma +=pitchSrc; 
  213. DiffNonLin2D( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  214. DiffNonLin2D( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  215. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  216.     case 0:
  217. break;
  218.     }
  219.     return ;
  220. }
  221. void HXEXPORT
  222. ENTRYPOINT(EnhanceUniform)(UCHAR *yuv420in, INT32 inheight, INT32  inwidth, INT32 pitchSrc, float Sharpness)
  223. {
  224.     int     row, curBuf, prevBuf;
  225.     unsigned char  *pLuma;
  226.     static int  helper[2][2][HELPER_MAXLEN];    
  227.     static int first_fl=1;
  228.     float tolerance=(float)0.1;
  229.     int tmp1;
  230.     
  231.     if ((inwidth > HELPER_MAXLEN) || (inheight <16))
  232.     {
  233. return ;
  234.     }
  235.     //if Sharpness is -1.0 (or close) don not do any edge enhancement
  236.     if(((Sharpness+1.0)<tolerance) && ((Sharpness+1.0)>-tolerance))
  237.     {
  238. return ;
  239.     }
  240.     if(first_fl==1)
  241.     {
  242. //Initialize edge enhancemnt lookup table to defaults for the first time
  243. Inittriangleluts(DEFT_C,DEFT_A,DEFT_B);
  244. //initialize clipping table
  245. Initcliplut();
  246. first_fl=0;
  247.     }
  248.     curBuf = 0;         // Point to "current" line buffer
  249.     pLuma = yuv420in;    // Point to beginning of current line
  250.     DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  251.     DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  252.     for (row = 1; row < inheight-9; row=row+8) {
  253. //(1)
  254. prevBuf = curBuf;   // Point to previous line buffer
  255.         curBuf ^= 1;        // Add 1 modulo 2
  256. pLuma +=pitchSrc;   // Advance pointer to next row
  257.         DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  258.         DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  259. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  260. //(2)
  261. prevBuf = curBuf;   
  262. curBuf ^= 1;        
  263. pLuma +=pitchSrc; 
  264. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  265. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  266. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  267. //(3)
  268. prevBuf = curBuf;   
  269.         curBuf ^= 1;        
  270. pLuma +=pitchSrc; 
  271. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  272. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  273. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  274. //(4)
  275. prevBuf = curBuf;   
  276.         curBuf ^= 1;       
  277. pLuma +=pitchSrc; 
  278. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  279. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  280. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  281. //(5)
  282. prevBuf = curBuf;   
  283.         curBuf ^= 1;        
  284. pLuma +=pitchSrc; 
  285. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  286. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  287. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  288. //(6)
  289. prevBuf = curBuf;   
  290.         curBuf ^= 1;        
  291. pLuma +=pitchSrc; 
  292. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  293. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  294. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  295. //2edge pixels------------------
  296. //(7)
  297.         prevBuf = curBuf;  
  298.         curBuf ^= 1;        
  299. pLuma +=pitchSrc;
  300. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  301. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  302.         Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  303. //(8)
  304.         prevBuf = curBuf;   
  305.         curBuf ^= 1;        
  306. pLuma +=pitchSrc;
  307. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  308. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  309.         Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  310. }
  311.     tmp1=(inheight-((inheight>>3)<<3))-1;
  312.     switch(tmp1)
  313.     {
  314.     case 6:
  315. //(1)
  316.         prevBuf = curBuf;   
  317.         curBuf ^= 1;        
  318. pLuma +=pitchSrc;
  319. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  320.         DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  321. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  322.     case 5:
  323. //(2)
  324. prevBuf = curBuf;   
  325.         curBuf ^= 1;        
  326. pLuma +=pitchSrc; 
  327. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  328. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  329. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  330.     case 4:
  331. //(3)
  332. prevBuf = curBuf;   
  333.         curBuf ^= 1;        
  334. pLuma +=pitchSrc; 
  335. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  336. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  337. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  338.     case 3:
  339. //(4)
  340. prevBuf = curBuf;   
  341.         curBuf ^= 1;        
  342. pLuma +=pitchSrc; 
  343. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  344. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  345. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  346.     case 2:
  347. //(5)
  348. prevBuf = curBuf;   
  349.         curBuf ^= 1;       
  350. pLuma +=pitchSrc;
  351. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  352. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  353. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  354.     case 1:
  355. //(6)
  356. prevBuf = curBuf;   
  357.         curBuf ^= 1;        
  358. pLuma +=pitchSrc; 
  359. DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
  360. DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
  361. Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
  362.     case 0:
  363. break;
  364.     }
  365.     return ;
  366. }
  367. int Add2DHelper( int *cur, int *prev, unsigned char *pic, int n )
  368. {
  369.     int i;
  370.     int tmp=n>>1;
  371.     int tmp1=n-((n>>1)<<1);
  372.     if(n<2) 
  373.     {
  374. return 1;
  375.     }
  376.     for (i = 0; i < n-1; i=i+2)
  377.     {
  378. pic[i] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[i]
  379.                         + prev[i+1] 
  380. + prev[i + HELPER_MAXLEN] 
  381.                         - cur[i] 
  382. - cur[i+1 + HELPER_MAXLEN] ]; 
  383. pic[i+1] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[i+1]
  384.                         + prev[i+2] 
  385. + prev[i+1+ HELPER_MAXLEN] 
  386.                         - cur[i+1] 
  387. - cur[i+2 + HELPER_MAXLEN] ]; 
  388.     }
  389.     if(tmp1)
  390.     {
  391. pic[n-1] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[n-1]
  392.                       + prev[n] 
  393.       + prev[n-1+ HELPER_MAXLEN]
  394.       - cur[n-1] 
  395.       - cur[n + HELPER_MAXLEN] ];
  396.     }
  397.     return 1;
  398. }
  399. int DiffNonLin2D( unsigned char* pos, unsigned char* neg, int* out, int n )
  400. {
  401.     int i;
  402.     int tmpv;
  403.    
  404.     if(n<16)
  405.     {
  406. return 1;
  407.     }
  408.     out[0]=lut_soft_core_2d[pos[0] - neg[0]];
  409.     
  410.     for (i = 1; i < n-9; i=i+8)
  411.     {
  412. register int tmp0, tmp1;
  413. tmp0 = pos[i] - neg[i];
  414. tmp1 = pos[i+1] - neg[i+1];
  415. out[i]=lut_soft_core_2d[tmp0];
  416. out[i+1]=lut_soft_core_2d[tmp1];
  417. tmp0 = pos[i+2] - neg[i+2];
  418. tmp1 = pos[i+3] - neg[i+3];
  419. out[i+2]=lut_soft_core_2d[tmp0];
  420. out[i+3]=lut_soft_core_2d[tmp1];
  421. tmp0 = pos[i+4] - neg[i+4];
  422. tmp1 = pos[i+5] - neg[i+5];
  423. out[i+4]=lut_soft_core_2d[tmp0];
  424. out[i+5]=lut_soft_core_2d[tmp1];
  425. tmp0 = pos[i+6] - neg[i+6];
  426. tmp1 = pos[i+7] - neg[i+7];
  427. out[i+6]=lut_soft_core_2d88[tmp0];
  428. out[i+7]=lut_soft_core_2d88[tmp1];
  429.     }
  430.     tmpv=(n-((n>>3)<<3))-1;
  431.     switch(tmpv)
  432.     {
  433.     case 6:
  434. out[n-6]=lut_soft_core_2d[pos[n-6]-neg[n-6]];
  435.     case 5:
  436. out[n-5]=lut_soft_core_2d[pos[n-5]-neg[n-5]];
  437.     case 4:
  438. out[n-4]=lut_soft_core_2d[pos[n-4]-neg[n-4]];
  439.     case 3:
  440. out[n-3]=lut_soft_core_2d[pos[n-3]-neg[n-3]];
  441.     case 2:
  442. out[n-2]=lut_soft_core_2d[pos[n-2]-neg[n-2]];
  443.     case 1:
  444. out[n-1]=lut_soft_core_2d[pos[n-1]-neg[n-1]];
  445.     case 0:
  446. break;
  447.     }
  448.     return 1;
  449. }
  450. int DiffNonLin2Duniform( unsigned char* pos, unsigned char* neg, int* out, int n )
  451. {
  452.     int i;
  453.     int tmpv;
  454.     if(n<16)
  455.     {
  456. return 1;
  457.     }
  458.     out[0]=lut_soft_core_2d[pos[0] - neg[0]];
  459.     for (i = 1; i < n-9; i=i+8)
  460. {
  461.     register int tmp0, tmp1;
  462.     tmp0 = pos[i] - neg[i];
  463.     tmp1 = pos[i+1] - neg[i+1];
  464.     out[i]=lut_soft_core_2d[tmp0];
  465.     out[i+1]=lut_soft_core_2d[tmp1];
  466.     tmp0 = pos[i+2] - neg[i+2];
  467.     tmp1 = pos[i+3] - neg[i+3];
  468.     out[i+2]=lut_soft_core_2d[tmp0];
  469.     out[i+3]=lut_soft_core_2d[tmp1];
  470.     tmp0 = pos[i+4] - neg[i+4];
  471.     tmp1 = pos[i+5] - neg[i+5];
  472.     out[i+4]=lut_soft_core_2d[tmp0];
  473.     out[i+5]=lut_soft_core_2d[tmp1];
  474.     tmp0 = pos[i+6] - neg[i+6];
  475.     tmp1 = pos[i+7] - neg[i+7];
  476.     out[i+6]=lut_soft_core_2d[tmp0];
  477.     out[i+7]=lut_soft_core_2d[tmp1];
  478. }
  479.     tmpv=(n-((n>>3)<<3))-1;
  480.     switch(tmpv)
  481.     {
  482.     case 6:
  483. out[n-6]=lut_soft_core_2d[pos[n-6]-neg[n-6]];
  484.     case 5:
  485. out[n-5]=lut_soft_core_2d[pos[n-5]-neg[n-5]];
  486.     case 4:
  487. out[n-4]=lut_soft_core_2d[pos[n-4]-neg[n-4]];
  488.     case 3:
  489. out[n-3]=lut_soft_core_2d[pos[n-3]-neg[n-3]];
  490.     case 2:
  491. out[n-2]=lut_soft_core_2d[pos[n-2]-neg[n-2]];
  492.     case 1:
  493. out[n-1]=lut_soft_core_2d[pos[n-1]-neg[n-1]];
  494.     case 0:
  495. break;
  496.     }
  497.     
  498.     return 1;
  499. }
  500. int DiffNonLin2Dconst( unsigned char* pos, unsigned char* neg, int* out, int n )
  501. {
  502.     int i;
  503.     int tmpv;
  504.     if(n<16)
  505.     {
  506. return 1;
  507.     }
  508.     out[0]=lut_soft_core_2d88[pos[0] - neg[0]];
  509.     for (i = 1; i < n-9; i=i+8)
  510. {
  511.     register int tmp0, tmp1;
  512.     tmp0 = pos[i] - neg[i];
  513.     tmp1 = pos[i+1] - neg[i+1];
  514.     out[i]=lut_soft_core_2d88[tmp0];
  515.     out[i+1]=lut_soft_core_2d88[tmp1];
  516.     tmp0 = pos[i+2] - neg[i+2];
  517.     tmp1 = pos[i+3] - neg[i+3];
  518.     out[i+2]=lut_soft_core_2d88[tmp0];
  519.     out[i+3]=lut_soft_core_2d88[tmp1];
  520.     tmp0 = pos[i+4] - neg[i+4];
  521.     tmp1 = pos[i+5] - neg[i+5];
  522.     out[i+4]=lut_soft_core_2d88[tmp0];
  523.     out[i+5]=lut_soft_core_2d88[tmp1];
  524.     tmp0 = pos[i+6] - neg[i+6];
  525.     tmp1 = pos[i+7] - neg[i+7];
  526.     out[i+6]=lut_soft_core_2d88[tmp0];
  527.     out[i+7]=lut_soft_core_2d88[tmp1];
  528. }
  529.     tmpv=(n-((n>>3)<<3))-1;
  530.     switch(tmpv)
  531.     {
  532.     case 6:
  533. out[n-6]=lut_soft_core_2d88[pos[n-6]-neg[n-6]];
  534.     case 5:
  535. out[n-5]=lut_soft_core_2d88[pos[n-5]-neg[n-5]];
  536.     case 4:
  537. out[n-4]=lut_soft_core_2d88[pos[n-4]-neg[n-4]];
  538.     case 3:
  539. out[n-3]=lut_soft_core_2d88[pos[n-3]-neg[n-3]];
  540.     case 2:
  541. out[n-2]=lut_soft_core_2d88[pos[n-2]-neg[n-2]];
  542.     case 1:
  543. out[n-1]=lut_soft_core_2d88[pos[n-1]-neg[n-1]];
  544.     case 0:
  545. break;
  546.     }
  547.          
  548.     return 1;
  549. }
  550. int Inittriangleluts(float c, float a, float b)
  551. {
  552. int i;
  553. //nonlinearity triangle lut
  554.         for (i=1; i<256; i++)
  555.     soft_core_2d[i+255] = (int)soft_triangle_lut_2d((float)i,c,a,b);
  556. soft_core_2d[255+(int)(c/2)] =int(-a);
  557. soft_core_2d[511-int((255-c)/2)]=int(b);
  558.         for (i=0; i<255; i++)
  559.             soft_core_2d[i] = -soft_core_2d[510-i];
  560. soft_core_2d[255]=0;
  561. soft_core_2d[0]=0;
  562. soft_core_2d[510]=0;
  563. return 1;
  564. }
  565. int Inittrianglelutsconst(void)
  566. {
  567. int i;
  568. //initialize a second lut which has c=50,a=0,b=40 this will be used for 8x8 block boundaries always
  569.         for (i=1; i<256; i++)
  570.     soft_core_2d88[i+255] = (int)soft_triangle_lut_2d((float)i,(float)CONST_C,(float)CONST_A,(float)CONST_B);
  571. soft_core_2d88[255+(int)(CONST_C/2)] =-CONST_A;
  572. soft_core_2d88[511-int((255-CONST_C)/2)]=40;
  573.         for (i=0; i<255; i++)
  574.             soft_core_2d88[i] = -soft_core_2d88[510-i];
  575. soft_core_2d88[255]=0;
  576. soft_core_2d88[0]=0;
  577. soft_core_2d88[510]=0;
  578. return 1;
  579. }
  580. int soft_triangle_lut_2d(float input, float c, float a, float b)
  581. {
  582.     float y;
  583.     /*assumes the ranges of input,a,b,c are already clipped*/
  584.     if(input>=0 && input<(c/2))
  585. y=-(input*a)/(c/2);
  586.     else if(input>=c/2 && input<c)
  587. y=-((c-input)*a)/(c/2);
  588.     else if(input>=c && input<((255+c)/2))
  589. y=((input-c)*b)/((255-c)/2);
  590.     else if(input>=((255+c)/2) && input <=255)
  591. y=((255-input)*b)/((255-c)/2);
  592.     return((int)y);
  593. }
  594. void Initcliplut(void)
  595. {
  596. int i;
  597. //clipping lut
  598. //assumes a and b can have a max value 60
  599.     for (i=0; i<319; i++)
  600. clip_softcore_post[i] = 0;
  601. clip_softcore_post[319] = 0;
  602.     for (i=1; i<256; i++)
  603. clip_softcore_post[i+319] = i;     
  604.    
  605.     for (i=256; i<511; i++)
  606. clip_softcore_post[i+319] = 255;     
  607. }