edge.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:22k
源码类别:

Symbian

开发平台:

Visual C++

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