xref: /utopia/UTPA2-700.0.x/modules/pq/hal/manhattan/pq/mhal_pq_adaptive.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 #define MHAL_PQ_ADAPTIVE_C
95 
96 //-------------------------------------------------------------------------------------------------
97 //  Include Files
98 //-------------------------------------------------------------------------------------------------
99 #if !defined(MSOS_TYPE_LINUX_KERNEL)
100 #include "string.h"
101 #else
102 #include <linux/string.h>
103 #endif
104 // Common Definition
105 #include "MsCommon.h"
106 #include "MsOS.h"
107 
108 // Internal Definition
109 #include "hwreg_utility2.h"
110 #include "color_reg.h"
111 
112 #include "drvXC_IOPort.h"
113 #include "apiXC.h"
114 #include "apiXC_Dlc.h"
115 #include "drvPQ.h"
116 #include "mhal_pq_adaptive.h"
117 //-------------------------------------------------------------------------------------------------
118 //  Driver Compiler Options
119 //-------------------------------------------------------------------------------------------------
120 
121 //-------------------------------------------------------------------------------------------------
122 //  Local Defines
123 //-------------------------------------------------------------------------------------------------
124 #define MSIF_ADAPTIVE_LIB_CODE_C            {'A','D','A','P','T','I','V','E','_'}
125 #define MSIF_ADAPTIVE_VERSION_C             {'0','0','0','0','0','1'}
126 #define PQ_ADAPTIVE_VERSION 9132
127 
128 #ifndef UNUSED //to avoid compile warnings...
129 #define UNUSED(var) (void)((var) = (var))
130 #endif
131 //#define DBG_DBK_LC
132 //#define DBG_SD2HD_LC
133 //#define DBG_HISW8T_LC
134 //-------------------------------------------------------------------------------------------------
135 //  Local Structures
136 //-------------------------------------------------------------------------------------------------
137 
138 //-------------------------------------------------------------------------------------------------
139 //  Global Variables
140 //-------------------------------------------------------------------------------------------------
141 static MS_BOOL _bAnyCandenceEnable = TRUE;
142 static MS_BOOL _bVerticalMovingForDHD = FALSE;
143 //extern MS_U16 _u16PQSrcType_DBK_Detect[PQ_MAX_WINDOW]; //For Auto_DBK SW driver used
144 static MS_BOOL _bIsHDSource = true;             //For Check SD mode
145 static int normalize_factor = 255;
146 //DBK Variables
147 // Width candidate = 6 to 37, offset = 6, size = 32
148 XC_LetterBoxState lbState;
149 static MS_S32 frameWidth;
150 static MS_S32 frameHeight;
151 static MS_U8 lbConfirmLevel = 0;
152 static MS_U16 GuardBandWidth = 0x40;
153 #define MaxWidth 4097
154 #define MaxHeight 2161
155 #define paraSize 32
156 #define paraVerSize 16
157 
158 const int paraWidth[32] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35};
159 const int paraVerWidth[16] = { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
160 
161 const int WidthDetectCostDownBit = 0;
162 
163 // For IIR
164 static MS_S32 WidthIIR = 8;
165 static int BlockinessCheckPre[MaxWidth] = { 0 };
166 static int BlockinessCheckIIR[MaxWidth] = { 0 };
167 static XC_MCNRLutQmapSetting m_stMCNRLutQmapSetting = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}};
168 
169 // Threshold for blockness check
170 const int hitrate_threshold = 128; // 160/256
171 const int hitRateDiffThr = 16; // 16/256
172 // IIR Strength
173 int IIRStrength = 4; // IIR = 4 : Cur * 1/4 + IIR * 3/4
174 //Vertical Mark Strength
175 static int VMStrMax = 0xF;
176 static int VMStrMin = 0x0;
177 const int HDBK_Str_Thrd = 50;
178 
179 //Patch switching control
180 #define HQV_JAGGY_PATTERN_ENBLE 0
181 #define SHIBASOKU_ENABLE 1
182 #define LG_SPECIFIC_PATTERN_ENABLE 0
183 #define SZ_PATTERN_ENABLE 1
184 #define SEC_HQV_PATTERN 0
185 #define KURO_PATTERN_ENABLE 0
186 #define HOUSE_MD_PATTERN_ENABLE 0
187 
188 #define MCNR_LUT_LOAD_FROM_QMAP 1
189 #define PDNR_LUT_LOAD_FROM_QMAP 1
190 
191 #if !defined(MSOS_TYPE_LINUX_KERNEL)
192 extern __attribute__((weak))MS_U8 MApi_XC_DLC_GetAverageValue(void);
193 #endif
194 //-------------------------------------------------------------------------------------------------
195 //  Local Variables
196 //-------------------------------------------------------------------------------------------------
197 
198 
199 //-------------------------------------------------------------------------------------------------
200 //  Debug Functions
201 //-------------------------------------------------------------------------------------------------
202 
203 /******************************************************************************/
204 /// Debug Info Control
205 /******************************************************************************/
DEBUG_LC_Turn_On(void * pInstance)206 void DEBUG_LC_Turn_On(void *pInstance)
207 {
208 	MApi_XC_W2BYTEMSK(REG_SC_BK30_38_L, 0x0001, 0x0001 );
209 	MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0002, 0x0002 );
210 }
211 
DEBUG_LC(void * pInstance,const MS_U16 lightReg,const MS_U8 val,const MS_U8 color)212 void DEBUG_LC(void *pInstance, const MS_U16 lightReg, const MS_U8 val, const MS_U8 color )
213 {
214 	if( val == 0 )
215 		MApi_XC_W2BYTEMSK(lightReg, ( color << (val<<2) ), ( 0x7 << (val<<2) ) );
216 	else if( val == 1 )
217 		MApi_XC_W2BYTE(lightReg, ( color << 4 ) | color );
218 	else if( val == 2 )
219 		MApi_XC_W2BYTE(lightReg, ( color << 8 ) | ( color << 4 ) | color );
220 	else
221 		MApi_XC_W2BYTE(lightReg, ( color << 12 ) | ( color << 8 ) | ( color << 4 ) | color );
222 }
223 
DEBUG_LC_40(void * pInstance,const MS_U8 a)224 void DEBUG_LC_40(void *pInstance, const MS_U8 a )
225 {
226 	if( (a > 0x00) && (a < 0x04) )
227 	{
228 		MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0001 );
229 	}
230 	else if( (a > 0x03) && (a < 0x10) )
231 	{
232 		MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0011 );
233 	}
234 	else if( (a > 0x0F) && (a < 0x40) )
235 	{
236 		MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0111 );
237 	}
238 	else if( (a > 0x3F) /*&& (a < 0x100)*/ )
239 	{
240 		MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x1111 );
241 	}
242 	else
243 	{
244 		MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0000 );
245 	}
246 }
247 
DEBUG_LC_41(void * pInstance,const MS_U8 a)248 void DEBUG_LC_41(void *pInstance, const MS_U8 a )
249 {
250 	if( (a > 0) && (a < 4) )
251 	{
252 		MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0002 );
253 	}
254 	else if( (a > 3) && (a < 8) )
255 	{
256 		MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0022 );
257 	}
258 	else if( (a > 7) && (a < 12) )
259 	{
260 		MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0222 );
261 	}
262 	else if( (a > 11) )
263 	{
264 		MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x2222 );
265 	}
266 	else
267 	{
268 		MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0000 );
269 	}
270 }
271 
DEBUG_LC_42(void * pInstance,const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY)272 void DEBUG_LC_42(void *pInstance, const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY )
273 {
274 	if( isSceneChangeMc )
275 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0003, 0x0007);
276 	else
277 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0007);
278 
279 	if( isSceneChangeY )
280 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0040, 0x0070);
281 	else
282 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0070);
283 }
284 
DEBUG_LC_43(void * pInstance,MS_U8 noiseLevel)285 void DEBUG_LC_43(void *pInstance, MS_U8 noiseLevel )
286 {
287 	/*
288 	if( noiseLevel < 0 )
289 	MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x1111, 0x7777 );
290 	else
291 	*/
292 	{
293 		MS_U8 val = noiseLevel >> 5;
294 		if( val == 0 )
295 			MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0000, 0x7777);
296 		else if( val == 1 )
297 			MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0002, 0x7777);
298 		else if( val == 2 )
299 			MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0022, 0x7777);
300 		else if( val == 3 )
301 			MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0222, 0x7777);
302 		else
303 			MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x2222, 0x7777);
304 	}
305 }
306 
DEBUG_LC_55(void * pInstance,const MS_U8 GG)307 void DEBUG_LC_55(void *pInstance, const MS_U8 GG )
308 {
309 
310 	//BK30_40~BK30_5F
311 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
312 	//LSB(low byte) = left, MSB(high byte) = right
313 	if ( GG == 1 )//white
314 	{
315 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
316 	}
317 	else if (GG == 2)//green
318 	{
319 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x2222, 0x7777);
320 	}
321 	else//black
322 	{
323 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
324 	}
325 }
326 
DEBUG_LC_56(void * pInstance,const MS_U8 GG)327 void DEBUG_LC_56(void *pInstance, const MS_U8 GG )
328 {
329 
330 	//BK30_40~BK30_5F
331 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
332 	//LSB(low byte) = left, MSB(high byte) = right
333 	if ( GG == 1 )//white
334 	{
335 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
336 	}
337 	else if (GG == 2)//green
338 	{
339 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x2222, 0x7777);
340 	}
341 	else//black
342 	{
343 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
344 	}
345 }
DEBUG_LC_57(void * pInstance,const MS_U8 GG)346 void DEBUG_LC_57(void *pInstance, const MS_U8 GG )
347 {
348 
349 	//BK30_40~BK30_5F
350 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
351 	//LSB(low byte) = left, MSB(high byte) = right
352 	if ( GG == 1 )//white
353 	{
354 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
355 	}
356 	else if (GG == 2)//green
357 	{
358 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x2222, 0x7777);
359 	}
360 	else//black
361 	{
362 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
363 	}
364 }
365 
DEBUG_LC_5D(void * pInstance,const MS_U8 GG)366 void DEBUG_LC_5D(void *pInstance, const MS_U8 GG )
367 {
368 
369 	//BK30_40~BK30_5F
370 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
371 	//LSB(low byte) = left, MSB(high byte) = right
372 	if ( GG == 1 )//white
373 	{
374 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
375 	}
376 	else if (GG == 2)//green
377 	{
378 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x2222, 0x7777);
379 	}
380 	else//black
381 	{
382 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
383 	}
384 }
DEBUG_LC_5E(void * pInstance,const MS_U8 GG)385 void DEBUG_LC_5E(void *pInstance, const MS_U8 GG )
386 {
387 
388 	//BK30_40~BK30_5F
389 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
390 	//LSB(low byte) = left, MSB(high byte) = right
391 	if ( GG == 1 )
392 	{
393 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x7777, 0x7777);
394 	}
395 	else if (GG == 2)
396 	{
397 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x2222, 0x7777);
398 	}
399 	else
400 	{
401 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x0000, 0x7777);
402 	}
403 }
DEBUG_LC_5F(void * pInstance,const MS_U8 GG)404 void DEBUG_LC_5F(void *pInstance, const MS_U8 GG )
405 {
406 
407 	//BK30_40~BK30_5F
408 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
409 	//LSB(low byte) = left, MSB(high byte) = right
410 	if ( GG == 1 )
411 	{
412 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x7777, 0x7777);
413 	}
414 	else if (GG == 2)
415 	{
416 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x2222, 0x7777);
417 	}
418 	else
419 	{
420 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x0000, 0x7777);
421 	}
422 }
423 
424 //Add by Bella for SHDH debug 8/30
425 //Renamed by Probex Sep.06 2013
DEBUG_LC_Full6bit(void * pInstance,const MS_U8 data)426 void DEBUG_LC_Full6bit(void *pInstance, const MS_U8 data )
427 {
428 	//BK30_50, BK30_54, BK30_58
429 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
430 	//LSB(low byte) = left, MSB(high byte) = right
431 
432 	if ( data <= 7 )
433 	{
434 
435 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, data, 0x7777);
436 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
437 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
438 
439   }
440   else if ( data <= 14 )
441 	{
442 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
443 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
444 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
445 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
446 	}
447 	else if ( data <= 21)
448 	{
449 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
450 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
451 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
452 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
453 	}
454 	else if (data <= 28 )
455 	{
456 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
457 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
458 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
459 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
460 	}
461 	else if (data <= 35)
462 	{
463 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
464 		MS_U16 dataExpression = ( data-28 );
465 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
466 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
467 
468 	}
469 	else if (data <= 42 )
470 	{
471 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
472 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
473 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
474 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
475 	}
476   else if (data <= 49 )
477 	{
478 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
479 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
480 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
481 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
482 
483 	}
484 	else if (data <= 56 )
485 	{
486 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
487 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
488 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
489 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
490 	}
491 	else if (data <= 63 )
492 	{
493 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
494 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
495 		MS_U16 dataExpression = (data - 56 );
496 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, dataExpression, 0x7777);
497 	}
498 	else //>64
499 	{
500 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
501 		MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
502 		MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x7777, 0x7777);
503 	}
504 }
DEBUG_LC_Full6bit2(void * pInstance,const MS_U8 data)505 void DEBUG_LC_Full6bit2(void *pInstance, const MS_U8 data )
506 {
507 	//BK30_51, BK30_55, BK30_59
508 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
509 	//LSB(low byte) = left, MSB(high byte) = right
510 
511 	if ( data <= 7 )
512 	{
513 
514 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, data, 0x7777);
515 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
516 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
517 
518   }
519   else if ( data <= 14 )
520 	{
521 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
522 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
523 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
524 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
525 	}
526 	else if ( data <= 21)
527 	{
528 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
529 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
530 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
531 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
532 	}
533 	else if (data <= 28 )
534 	{
535 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
536 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
537 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
538 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
539 	}
540 	else if (data <= 35)
541 	{
542 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
543 		MS_U16 dataExpression = ( data-28 );
544 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
545 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
546 
547 	}
548 	else if (data <= 42 )
549 	{
550 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
551 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
552 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
553 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
554 	}
555   else if (data <= 49 )
556 	{
557 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
558 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
559 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
560 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
561 
562 	}
563 	else if (data <= 56 )
564 	{
565 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
566 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
567 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
568 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
569 	}
570 	else if (data <= 63 )
571 	{
572 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
573 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
574 		MS_U16 dataExpression = (data - 56 );
575 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, dataExpression, 0x7777);
576 	}
577 	else
578 	{
579 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
580 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
581 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
582 	}
583 }
DEBUG_LC_Full6bit3(void * pInstance,const MS_U8 data)584 void DEBUG_LC_Full6bit3(void *pInstance, const MS_U8 data )
585 {
586 	//BK30_52, BK30_56, BK30_5A
587 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
588 	//LSB(low byte) = left, MSB(high byte) = right
589 
590 	if ( data <= 7 )
591 	{
592 
593 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, data, 0x7777);
594 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
595 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
596 
597   }
598   else if ( data <= 14 )
599 	{
600 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
601 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
602 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
603 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
604 	}
605 	else if ( data <= 21)
606 	{
607 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
608 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
609 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
610 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
611 	}
612 	else if (data <= 28 )
613 	{
614 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
615 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
616 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
617 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
618 	}
619 	else if (data <= 35)
620 	{
621 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
622 		MS_U16 dataExpression = ( data-28 );
623 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
624 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
625 
626 	}
627 	else if (data <= 42 )
628 	{
629 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
630 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
631 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
632 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
633 	}
634   else if (data <= 49 )
635 	{
636 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
637 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
638 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
639 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
640 
641 	}
642 	else if (data <= 56 )
643 	{
644 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
645 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
646 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
647 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
648 	}
649 	else if (data <= 63 )
650 	{
651 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
652 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
653 		MS_U16 dataExpression = (data - 56 );
654 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, dataExpression, 0x7777);
655 	}
656 	else
657 	{
658 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
659 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
660 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
661 	}
662 }
DEBUG_LC_Full6bit4(void * pInstance,const MS_U8 data)663 void DEBUG_LC_Full6bit4(void *pInstance, const MS_U8 data )
664 {
665 	//BK30_53, BK30_57, BK30_5B
666 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
667 	//LSB(low byte) = left, MSB(high byte) = right
668 
669 	if ( data <= 7 )
670 	{
671 
672 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, data, 0x7777);
673 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
674 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
675 
676   }
677   else if ( data <= 14 )
678 	{
679 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
680 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
681 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
682 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
683 	}
684 	else if ( data <= 21)
685 	{
686 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
687 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
688 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
689 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
690 	}
691 	else if (data <= 28 )
692 	{
693 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
694 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
695 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
696 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
697 	}
698 	else if (data <= 35)
699 	{
700 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
701 		MS_U16 dataExpression = ( data-28 );
702 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
703 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
704 
705 	}
706 	else if (data <= 42 )
707 	{
708 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
709 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
710 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
711 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
712 	}
713   else if (data <= 49 )
714 	{
715 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
716 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
717 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
718 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
719 
720 	}
721 	else if (data <= 56 )
722 	{
723 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
724 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
725 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
726 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
727 	}
728 	else if (data <= 63 )
729 	{
730 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
731 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
732 		MS_U16 dataExpression = (data - 56 );
733 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, dataExpression, 0x7777);
734 	}
735 	else
736 	{
737 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
738 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
739 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
740 	}
741 }
DEBUG_LC_Full6bit5(void * pInstance,const MS_U8 data)742 void DEBUG_LC_Full6bit5(void *pInstance, const MS_U8 data )
743 {
744 	//BK30_50, BK30_54, BK30_58
745 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
746 	//LSB(low byte) = left, MSB(high byte) = right
747 
748 	if ( data <= 7 )
749 	{
750 
751 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, data, 0x7777);
752 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
753 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
754 
755   }
756   else if ( data <= 14 )
757 	{
758 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
759 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
760 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
761 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
762 	}
763 	else if ( data <= 21)
764 	{
765 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
766 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
767 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
768 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
769 	}
770 	else if (data <= 28 )
771 	{
772 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
773 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
774 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
775 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
776 	}
777 	else if (data <= 35)
778 	{
779 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
780 		MS_U16 dataExpression = ( data-28 );
781 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
782 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
783 
784 	}
785 	else if (data <= 42 )
786 	{
787 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
788 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
789 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
790 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
791 	}
792   else if (data <= 49 )
793 	{
794 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
795 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
796 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
797 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
798 
799 	}
800 	else if (data <= 56 )
801 	{
802 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
803 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
804 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
805 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
806 	}
807 	else if (data <= 63 )
808 	{
809 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
810 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
811 		MS_U16 dataExpression = (data - 56 );
812 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, dataExpression, 0x7777);
813 	}
814 	else //>64
815 	{
816 		MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
817 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
818 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x7777, 0x7777);
819 	}
820 }
DEBUG_LC_Full6bit6(void * pInstance,const MS_U8 data)821 void DEBUG_LC_Full6bit6(void *pInstance, const MS_U8 data )
822 {
823 	//BK30_50, BK30_54, BK30_58
824 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
825 	//LSB(low byte) = left, MSB(high byte) = right
826 
827 	if ( data <= 7 )
828 	{
829 
830 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, data, 0x7777);
831 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
832 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
833 
834   }
835   else if ( data <= 14 )
836 	{
837 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
838 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
839 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
840 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
841 	}
842 	else if ( data <= 21)
843 	{
844 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
845 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
846 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
847 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
848 	}
849 	else if (data <= 28 )
850 	{
851 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
852 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
853 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
854 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
855 	}
856 	else if (data <= 35)
857 	{
858 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
859 		MS_U16 dataExpression = ( data-28 );
860 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
861 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
862 
863 	}
864 	else if (data <= 42 )
865 	{
866 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
867 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
868 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
869 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
870 	}
871   else if (data <= 49 )
872 	{
873 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
874 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
875 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
876 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
877 
878 	}
879 	else if (data <= 56 )
880 	{
881 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
882 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
883 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
884 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
885 	}
886 	else if (data <= 63 )
887 	{
888 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
889 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
890 		MS_U16 dataExpression = (data - 56 );
891 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, dataExpression, 0x7777);
892 	}
893 	else //>64
894 	{
895 		MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
896 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
897 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x7777, 0x7777);
898 	}
899 }
DEBUG_LC_Full6bit7(void * pInstance,const MS_U8 data)900 void DEBUG_LC_Full6bit7(void *pInstance, const MS_U8 data )
901 {
902 	//BK30_50, BK30_54, BK30_58
903 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
904 	//LSB(low byte) = left, MSB(high byte) = right
905 
906 	if ( data <= 7 )
907 	{
908 
909 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, data, 0x7777);
910 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
911 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
912 
913   }
914   else if ( data <= 14 )
915 	{
916 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
917 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
918 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
919 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
920 	}
921 	else if ( data <= 21)
922 	{
923 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
924 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
925 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
926 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
927 	}
928 	else if (data <= 28 )
929 	{
930 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
931 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
932 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
933 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
934 	}
935 	else if (data <= 35)
936 	{
937 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
938 		MS_U16 dataExpression = ( data-28 );
939 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
940 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
941 
942 	}
943 	else if (data <= 42 )
944 	{
945 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
946 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
947 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
948 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
949 	}
950   else if (data <= 49 )
951 	{
952 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
953 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
954 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
955 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
956 
957 	}
958 	else if (data <= 56 )
959 	{
960 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
961 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
962 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
963 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
964 	}
965 	else if (data <= 63 )
966 	{
967 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
968 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
969 		MS_U16 dataExpression = (data - 56 );
970 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, dataExpression, 0x7777);
971 	}
972 	else //>64
973 	{
974 		MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
975 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
976 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x7777, 0x7777);
977 	}
978 }
DEBUG_LC_Full6bit8(void * pInstance,const MS_U8 data)979 void DEBUG_LC_Full6bit8(void *pInstance, const MS_U8 data )
980 {
981 	//BK30_50, BK30_54, BK30_58
982 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
983 	//LSB(low byte) = left, MSB(high byte) = right
984 
985 	if ( data <= 7 )
986 	{
987 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, data, 0x7777);
988 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
989 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
990   }
991   else if ( data <= 14 )
992 	{
993 		MS_U16 dataExpression = ( (data-7) << 4) + 7;
994 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
995 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
996 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
997 	}
998 	else if ( data <= 21)
999 	{
1000 		MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
1001 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
1002 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
1003 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1004 	}
1005 	else if (data <= 28 )
1006 	{
1007 		MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
1008 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
1009 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
1010 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1011 	}
1012 	else if (data <= 35)
1013 	{
1014 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1015 		MS_U16 dataExpression = ( data-28 );
1016 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1017 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1018 
1019 	}
1020 	else if (data <= 42 )
1021 	{
1022 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1023 		MS_U16 dataExpression = (( data-35 )<< 4) + 7;
1024 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1025 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1026 	}
1027   else if (data <= 49 )
1028 	{
1029 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1030 		MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
1031 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1032 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1033 
1034 	}
1035 	else if (data <= 56 )
1036 	{
1037 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1038 		MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
1039 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1040 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1041 	}
1042 	else if (data <= 63 )
1043 	{
1044 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1045 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1046 		MS_U16 dataExpression = (data - 56 );
1047 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, dataExpression, 0x7777);
1048 	}
1049 	else //>64
1050 	{
1051 		MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1052 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1053 		MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x7777, 0x7777);
1054 	}
1055 }
DEBUG_LC_DBKWidth(void * pInstance,const MS_U8 width)1056 void DEBUG_LC_DBKWidth(void *pInstance, const MS_U8 width )
1057 {
1058 	//BK30_40~BK30_5F
1059 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1060 	//LSB(low byte) = left, MSB(high byte) = right
1061 	if ( width == 8 )
1062 	{
1063 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0222, 0x0777);
1064 	}
1065 	else if ( width == 16 )
1066 	{
1067 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0444, 0x0777);
1068 	}
1069 	else if ( width <=22 && width>=20 )
1070 	{
1071 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0555, 0x0777);
1072 	}
1073 	else
1074 	{
1075 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0111, 0x0777);
1076 	}
1077 }
DEBUG_LC_DBKDET(void * pInstance,const MS_U8 GG)1078 void DEBUG_LC_DBKDET(void *pInstance, const MS_U8 GG )
1079 {
1080 
1081 	//BK30_40~BK30_5F
1082 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1083 	//LSB(low byte) = left, MSB(high byte) = right
1084 	if ( GG == 0 )
1085 	{
1086 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x7000, 0x7000);
1087 	}
1088 	if ( GG == 1 )
1089 	{
1090 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x6000, 0x7000); //yellow
1091 	}
1092 	else if (GG == 2)
1093 	{
1094 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x5000, 0x7000); //purple
1095 	}
1096 	else if (GG == 3)
1097 	{
1098 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x4000, 0x7000); //4 = cyan
1099 	}
1100 	else if (GG == 4)
1101 	{
1102 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x3000, 0x7000); //3 = blue
1103 	}
1104 	else if (GG == 5)
1105 	{
1106 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x2000, 0x7000); //2 = green
1107 	}
1108 	else if (GG == 6)
1109 	{
1110 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0000, 0x7000);
1111 
1112 	}
1113 	else
1114 	{
1115 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x1111, 0x7000);
1116 	}
1117 }
DEBUG_LC_FrameEdg(void * pInstance,const MS_U16 inValue)1118 void DEBUG_LC_FrameEdg(void *pInstance, const MS_U16 inValue )
1119 {
1120 	//BK30_40~BK30_5F
1121 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1122 	//LSB(low byte) = left, MSB(high byte) = right
1123 
1124 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1125 
1126 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1127 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1128 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1129 	{
1130 		TH1 = 100;
1131 		TH2 = 80;
1132 		TH3 = 60;
1133 		TH4 = 50;
1134 		TH5 = 40;
1135 		TH6 = 30;
1136 		TH7 = 20;
1137 		TH8 = 10;
1138 	}
1139 	if ( inValue> TH1 )
1140 	{
1141 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
1142 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1143 	}
1144 	else if ( inValue> TH2 )
1145 	{
1146 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7770, 0x7777);
1147 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1148 	}
1149 	else if ( inValue> TH3 )
1150 	{
1151 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7700, 0x7777);
1152 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1153 	}
1154 	else if ( inValue> TH4 )
1155 	{
1156 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7000, 0x7777);
1157 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1158 	}
1159 	else if ( inValue > TH5 )
1160 	{
1161 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1162 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1163 	}
1164 	else if ( inValue > TH6 )
1165 	{
1166 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1167 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7770, 0x7777);
1168 	}
1169 	else if ( inValue > TH7 )
1170 	{
1171 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1172 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7700, 0x7777);
1173 	}
1174 	else if ( inValue > TH8 )
1175 	{
1176 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1177 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7000, 0x7777);
1178 	}
1179 	else
1180 	{
1181 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1182 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x0000, 0x7777);
1183 	}
1184 }
DEBUG_LC_FrameBlk(void * pInstance,const MS_U16 inValue)1185 void DEBUG_LC_FrameBlk(void *pInstance, const MS_U16 inValue )
1186 {
1187 	//BK30_40~BK30_5F
1188 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1189 	//LSB(low byte) = left, MSB(high byte) = right
1190 
1191 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1192 
1193 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1194 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1195 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1196 	//if (HD_control == false)
1197 	{
1198 		TH1 = 100;
1199 		TH2 = 80;
1200 		TH3 = 60;
1201 		TH4 = 50;
1202 		TH5 = 40;
1203 		TH6 = 30;
1204 		TH7 = 20;
1205 		TH8 = 10;
1206 	}
1207 	if ( inValue> TH1 )
1208 	{
1209 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
1210 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1211 	}
1212 	else if ( inValue> TH2 )
1213 	{
1214 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7770, 0x7777);
1215 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1216 	}
1217 	else if ( inValue> TH3 )
1218 	{
1219 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7700, 0x7777);
1220 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1221 	}
1222 	else if ( inValue> TH4 )
1223 	{
1224 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7000, 0x7777);
1225 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1226 	}
1227 	else if ( inValue > TH5 )
1228 	{
1229 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1230 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1231 	}
1232 	else if ( inValue > TH6 )
1233 	{
1234 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1235 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7770, 0x7777);
1236 	}
1237 	else if ( inValue > TH7 )
1238 	{
1239 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1240 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7700, 0x7777);
1241 	}
1242 	else if ( inValue > TH8 )
1243 	{
1244 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1245 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7000, 0x7777);
1246 	}
1247 	else
1248 	{
1249 		MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1250 		MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
1251 	}
1252 }
DEBUG_LC_FrameDet(void * pInstance,const MS_U16 inValue)1253 void DEBUG_LC_FrameDet(void *pInstance, const MS_U16 inValue )
1254 {
1255 	//BK30_40~BK30_5F
1256 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1257 	//LSB(low byte) = left, MSB(high byte) = right
1258 
1259 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1260 
1261 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1262 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1263 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1264 	//if (HD_control == false)
1265 	{
1266 		TH1 = 100;
1267 		TH2 = 80;
1268 		TH3 = 60;
1269 		TH4 = 50;
1270 		TH5 = 40;
1271 		TH6 = 30;
1272 		TH7 = 20;
1273 		TH8 = 10;
1274 	}
1275 	if ( inValue> TH1 )
1276 	{
1277 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
1278 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1279 	}
1280 	else if ( inValue> TH2 )
1281 	{
1282 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7770, 0x7777);
1283 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1284 	}
1285 	else if ( inValue> TH3 )
1286 	{
1287 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7700, 0x7777);
1288 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1289 	}
1290 	else if ( inValue> TH4 )
1291 	{
1292 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7000, 0x7777);
1293 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1294 	}
1295 	else if ( inValue > TH5 )
1296 	{
1297 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1298 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1299 	}
1300 	else if ( inValue > TH6 )
1301 	{
1302 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1303 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7770, 0x7777);
1304 	}
1305 	else if ( inValue > TH7 )
1306 	{
1307 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1308 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7700, 0x7777);
1309 	}
1310 	else if ( inValue > TH8 )
1311 	{
1312 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1313 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7000, 0x7777);
1314 	}
1315 	else
1316 	{
1317 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1318 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
1319 	}
1320 }
1321 
DEBUG_LC_ColorSum(void * pInstance,const MS_U16 inValue)1322 void DEBUG_LC_ColorSum(void *pInstance, const MS_U16 inValue )
1323 {
1324 	//BK30_40~BK30_5F
1325 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1326 	//LSB(low byte) = left, MSB(high byte) = right
1327 
1328 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1329 
1330 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1331 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1332 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1333 
1334 	{
1335 		TH1 = 100;
1336 		TH2 = 80;
1337 		TH3 = 60;
1338 		TH4 = 50;
1339 		TH5 = 40;
1340 		TH6 = 30;
1341 		TH7 = 20;
1342 		TH8 = 10;
1343 	}
1344 	if ( inValue> TH1 )
1345 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
1346 	else if ( inValue> TH2 )
1347 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7774, 0x7777);
1348 	else if ( inValue> TH3 )
1349 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7770, 0x7777);
1350 	else if ( inValue> TH4 )
1351 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7740, 0x7777);
1352 	else if ( inValue > TH5 )
1353 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7700, 0x7777);
1354 	else if ( inValue > TH6 )
1355 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7400, 0x7777);
1356 	else if ( inValue > TH7 )
1357 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7000, 0x7777);
1358 	else if ( inValue > TH8 )
1359 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x4000, 0x7777);
1360 	else
1361 		MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
1362 }
DEBUG_LC_uComplex(void * pInstance,const MS_U16 inValue)1363 void DEBUG_LC_uComplex(void *pInstance, const MS_U16 inValue )
1364 {
1365 	//BK30_40~BK30_5F
1366 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1367 	//LSB(low byte) = left, MSB(high byte) = right
1368 
1369 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1370 
1371 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1372 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1373 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1374 
1375 	{
1376 		TH1 = 0x1000;
1377 		TH2 = 0x0800;
1378 		TH3 = 0x0400;
1379 		TH4 = 0x0200;
1380 		TH5 = 0x0100;
1381 		TH6 = 0x0080;
1382 		TH7 = 0x0040;
1383 		TH8 = 0x0020;
1384 	}
1385 	if ( inValue> TH1 )
1386 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
1387 	else if ( inValue> TH2 )
1388 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7774, 0x7777);
1389 	else if ( inValue> TH3 )
1390 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7770, 0x7777);
1391 	else if ( inValue> TH4 )
1392 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7740, 0x7777);
1393 	else if ( inValue > TH5 )
1394 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7700, 0x7777);
1395 	else if ( inValue > TH6 )
1396 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7400, 0x7777);
1397 	else if ( inValue > TH7 )
1398 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7000, 0x7777);
1399 	else if ( inValue > TH8 )
1400 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x4000, 0x7777);
1401 	else
1402 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x0000, 0x7777);
1403 
1404 }
DEBUG_LC_SDCnt(void * pInstance,const MS_U16 inValue)1405 void DEBUG_LC_SDCnt(void *pInstance, const MS_U16 inValue )
1406 {
1407 	//BK30_40~BK30_5F
1408 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1409 	//LSB(low byte) = left, MSB(high byte) = right
1410 
1411 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1412 
1413 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1414 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1415 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1416 
1417 	{
1418 		TH1 = 50000;
1419 		TH2 = 20000;
1420 		TH3 = 8000;
1421 		TH4 = 3000;
1422 		TH5 = 1000;
1423 		TH6 = 300;
1424 		TH7 = 100;
1425 		TH8 = 10;
1426 	}
1427 	if ( inValue> TH1 )
1428 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
1429 	else if ( inValue> TH2 )
1430 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7774, 0x7777);
1431 	else if ( inValue> TH3 )
1432 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7770, 0x7777);
1433 	else if ( inValue> TH4 )
1434 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7740, 0x7777);
1435 	else if ( inValue > TH5 )
1436 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7700, 0x7777);
1437 	else if ( inValue > TH6 )
1438 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7400, 0x7777);
1439 	else if ( inValue > TH7 )
1440 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7000, 0x7777);
1441 	else if ( inValue > TH8 )
1442 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x4000, 0x7777);
1443 	else
1444 		MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
1445 }
DEBUG_LC_HDCnt(void * pInstance,const MS_U16 inValue)1446 void DEBUG_LC_HDCnt(void *pInstance, const MS_U16 inValue )
1447 {
1448 	//BK30_40~BK30_5F
1449 	//1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1450 	//LSB(low byte) = left, MSB(high byte) = right
1451 
1452 	//long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1453 
1454 	//MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1455 	//PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1456 	int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1457 
1458 	{
1459 		TH1 = 4000;
1460 		TH2 = 1000;
1461 		TH3 = 500;
1462 		TH4 = 250;
1463 		TH5 = 120;
1464 		TH6 = 60;
1465 		TH7 = 30;
1466 		TH8 = 10;
1467 	}
1468 	if ( inValue> TH1 )
1469 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
1470 	else if ( inValue> TH2 )
1471 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7774, 0x7777);
1472 	else if ( inValue> TH3 )
1473 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7770, 0x7777);
1474 	else if ( inValue> TH4 )
1475 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7740, 0x7777);
1476 	else if ( inValue > TH5 )
1477 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7700, 0x7777);
1478 	else if ( inValue > TH6 )
1479 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7400, 0x7777);
1480 	else if ( inValue > TH7 )
1481 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7000, 0x7777);
1482 	else if ( inValue > TH8 )
1483 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x4000, 0x7777);
1484 	else
1485 		MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
1486 }
1487 /******************************************************************************/
1488 // Debug Info Control
1489 /******************************************************************************/
1490 
1491 
1492 
1493 
1494 //-------------------------------------------------------------------------------------------------
1495 //  Local Functions
1496 //-------------------------------------------------------------------------------------------------
1497 
1498 
1499 //-------------------------------------------------------------------------------------------------
1500 //  Global Functions
1501 //-------------------------------------------------------------------------------------------------
__minmax(int a,int b,int c)1502 int __minmax(int a, int b, int c) // make sure b < c
1503 {
1504 	if (a<=b)
1505 		return b;
1506 	else if (a >= c)
1507 		return c;
1508 	else
1509 		return a;
1510 }
1511 
__max(int a,int b)1512 int __max(int a, int b)
1513 {
1514 	if (a>=b)
1515 		return a;
1516 	else
1517 		return b;
1518 }
1519 
__max3(int a,int b,int c)1520 int __max3(int a, int b, int c)
1521 {
1522 	if ( (a>=b) && (a>=c) )
1523 		return a;
1524 	else if ((b>=a) && (b>=c) )
1525 		return b;
1526 	else
1527 		return c;
1528 }
1529 
__min(int a,int b)1530 int __min(int a, int b)
1531 {
1532 	if (a>=b)
1533 		return b;
1534 	else
1535 		return a;
1536 }
1537 
__min3(int a,int b,int c)1538 int __min3(int a, int b, int c)
1539 {
1540 	if ( (a<=b) && (a<=c) )
1541 		return a;
1542 	else if ((b<=a) && (b<=c) )
1543 		return b;
1544 	else
1545 		return c;
1546 }
1547 
1548 /******************************************************************************/
1549 ///Get control register for adaptive tuning function
1550 ///@return MS_U32: Read two byte for FSC
1551 ///Add by Bella 20150707
1552 /******************************************************************************/
MDrv_UFSC_Read2Byte(MS_U64 AddresL)1553 MS_U8 MDrv_UFSC_Read2Byte( MS_U64 AddresL)
1554 {
1555     MS_U8 u8Value= 0;
1556 
1557     u8Value= (MS_U8)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)));
1558 
1559     return u8Value;
1560 }
1561 
1562 /******************************************************************************/
1563 ///Get control register for adaptive tuning function
1564 ///@return MS_U32: Read two byte and MASK for FSC
1565 ///Add by Bella 20150707
1566 /******************************************************************************/
MDrv_UFSC_Read2ByteMSK(MS_U64 AddresL,MS_U16 mask)1567 MS_U16 MDrv_UFSC_Read2ByteMSK( MS_U64 AddresL, MS_U16 mask)
1568 {
1569     MS_U16 u16Value= 0;
1570 
1571     u16Value= (MS_U16)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)))&mask;
1572 
1573     return u16Value;
1574 }
1575 
1576 /******************************************************************************/
1577 ///Get control register for adaptive tuning function
1578 ///@return MS_U8: Control status
1579 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl(void * pInstance)1580 MS_U8 MDrv_SC_get_adaptive_ctrl(void *pInstance)
1581 {
1582     MS_U8 u8Ctrl = 0;
1583 
1584 	u8Ctrl = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF);
1585 
1586 	return u8Ctrl;
1587 }
1588 
1589 /******************************************************************************/
1590 ///Get control register for adaptive tuning function
1591 ///@return MS_U8: Control status
1592 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl2(void * pInstance)1593 MS_U8 MDrv_SC_get_adaptive_ctrl2(void *pInstance)
1594 {
1595     MS_U8 u8Ctrl = 0;
1596 
1597 	u8Ctrl = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF00) >> 8);
1598 
1599 	return u8Ctrl;
1600 }
1601 
1602 /******************************************************************************/
1603 ///Get control register for adaptive tuning function
1604 ///@return MS_U8: Control status
1605 /******************************************************************************/
MDrv_UFSC_get_adaptive_ctrl3(void)1606 MS_U8 MDrv_UFSC_get_adaptive_ctrl3(void)
1607 {
1608     MS_U8 u8UFSCCtrl = 0;
1609 
1610     u8UFSCCtrl =MDrv_UFSC_Read2ByteMSK(REG_FSC_BK30_3F_L, 0xFFFF)>>8;
1611 
1612     return u8UFSCCtrl;
1613 }
1614 
1615 /******************************************************************************/
1616 /// Agate Function
1617 /******************************************************************************/
MDrv_SC_Agate_ME1_SetStatisticsWindow(void * pInstance)1618 void MDrv_SC_Agate_ME1_SetStatisticsWindow( void *pInstance )
1619 {
1620     MS_U32 u32MaxHblkSize = 0, u32MaxVblkSize = 0;
1621 
1622 	u32MaxHblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0x00FF);   //ME2_H Max
1623 	u32MaxVblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0xFF00) >> 8;  //ME2_V Max
1624 
1625 	u32MaxHblkSize = u32MaxHblkSize - 1;
1626 	u32MaxVblkSize = u32MaxVblkSize - 1;
1627 
1628 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L,  u32MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1629 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L,  u32MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1630 }
1631 
MDrv_SC_Edison_ME1_SetStatisticsWindow(void * pInstance,MS_U32 u16Width,MS_U16 u16Height)1632 void MDrv_SC_Edison_ME1_SetStatisticsWindow(void * pInstance,MS_U32 u16Width, MS_U16 u16Height)
1633 {
1634     MS_U16 u16MaxHblkSize = 0, u16MaxVblkSize = 0;
1635 
1636 	u16MaxHblkSize  = (u16Width/10);  //ME2_H Max
1637 	u16MaxVblkSize = (u16Height/6);  //ME2_V Max
1638 
1639 	u16MaxHblkSize  = u16MaxHblkSize - 4;
1640 	u16MaxVblkSize = u16MaxVblkSize - 4;
1641 
1642 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L,  u16MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1643 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L,  u16MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1644 }
1645 
MDrv_SC_Edison_GMV_reload(void * pInstance,const XC_GMvStates gMv)1646 void MDrv_SC_Edison_GMV_reload( void * pInstance, const XC_GMvStates gMv )
1647 {
1648     MS_BOOL bisPanScan = FALSE;
1649     static MS_U8 iir_cnt = 0;
1650     MS_S8 MvXdir = 0;
1651     MS_S8 MvYdir = 0;
1652 
1653 	if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 ) && ( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) ) //pan-scan case
1654 	{
1655 		bisPanScan = true;
1656 	}
1657 	else
1658 	{
1659 		bisPanScan = false;
1660 	}
1661 
1662 	if( bisPanScan )
1663 	{
1664 		iir_cnt = 120; //default:240
1665 	}
1666 	else
1667 	{
1668 		if( iir_cnt != 0 )
1669 			iir_cnt--;
1670 	}
1671 
1672 	MvXdir = gMv.minMvXdir - 32;
1673 	MvYdir = gMv.minMvYdir - 8;
1674 
1675 	//ME1 refer GMV
1676 	if( iir_cnt == 0 )
1677 	{
1678 		MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03  , 0x000F );
1679 		MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<0) , 0x007F );
1680 		MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0x1F00 );
1681 		MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1682 	}
1683 	else
1684 	{
1685 		MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x02  , 0x000F );
1686 		MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x01<<8) , 0xFF00 ); //ME1 favor GMV enable
1687 
1688 		//Set ME1 MVX
1689 		if( MvXdir >= 0 )
1690 			MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvXdir , 0x007F );
1691 		else
1692 		{
1693 			if( MvXdir == -32)
1694 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0060 , 0x007F );
1695 			else if( MvXdir == -31)
1696 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0061 , 0x007F );
1697 			else if( MvXdir == -30)
1698 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0062 , 0x007F );
1699 			else if( MvXdir == -29)
1700 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0063 , 0x007F );
1701 			else if( MvXdir == -28)
1702 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0064 , 0x007F );
1703 			else if( MvXdir == -27)
1704 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0065 , 0x007F );
1705 			else if( MvXdir == -26)
1706 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0066 , 0x007F );
1707 			else if( MvXdir == -25)
1708 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0067 , 0x007F );
1709 			else if( MvXdir == -24)
1710 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0068 , 0x007F );
1711 			else if( MvXdir == -23)
1712 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0069 , 0x007F );
1713 			else if( MvXdir == -22)
1714 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006A , 0x007F );
1715 			else if( MvXdir == -21)
1716 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006B , 0x007F );
1717 			else if( MvXdir == -20)
1718 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006C , 0x007F );
1719 			else if( MvXdir == -19)
1720 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006D , 0x007F );
1721 			else if( MvXdir == -18)
1722 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006E , 0x007F );
1723 			else if( MvXdir == -17)
1724 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006F , 0x007F );
1725 			else if( MvXdir == -16)
1726 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0070 , 0x007F );
1727 			else if( MvXdir == -15)
1728 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0071 , 0x007F );
1729 			else if( MvXdir == -14)
1730 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0072 , 0x007F );
1731 			else if( MvXdir == -13)
1732 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0073 , 0x007F );
1733 			else if( MvXdir == -12)
1734 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0074 , 0x007F );
1735 			else if( MvXdir == -11)
1736 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0075 , 0x007F );
1737 			else if( MvXdir == -10)
1738 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0076 , 0x007F );
1739 			else if( MvXdir == -9)
1740 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0077 , 0x007F );
1741 			else if( MvXdir == -8)
1742 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0078 , 0x007F );
1743 			else if( MvXdir == -7)
1744 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0079 , 0x007F );
1745 			else if( MvXdir == -6)
1746 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007A , 0x007F );
1747 			else if( MvXdir == -5)
1748 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007B , 0x007F );
1749 			else if( MvXdir == -4)
1750 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007C , 0x007F );
1751 			else if( MvXdir == -3)
1752 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007D , 0x007F );
1753 			else if( MvXdir == -2)
1754 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007E , 0x007F );
1755 			else if( MvXdir == -1)
1756 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007F , 0x007F );
1757 		}
1758 
1759 		//Set ME1 MVY
1760 		if( MvYdir >= 0 )
1761 			MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvYdir<<8 , 0x1F00 );
1762 		else
1763 		{
1764 			if( MvYdir == -8)
1765 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1800 , 0x1F00 );
1766 			else if( MvYdir == -7)
1767 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1900 , 0x1F00 );
1768 			else if( MvYdir == -6)
1769 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1A00 , 0x1F00 );
1770 			else if( MvYdir == -5)
1771 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1B00 , 0x1F00 );
1772 			else if( MvYdir == -4)
1773 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1C00 , 0x1F00 );
1774 			else if( MvYdir == -3)
1775 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1D00 , 0x1F00 );
1776 			else if( MvYdir == -2)
1777 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1E00 , 0x1F00 );
1778 			else if( MvYdir == -1)
1779 				MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1F00 , 0x1F00 );
1780 		}
1781 	}
1782 }
1783 
1784 #define REG_MCDI_EODIW_SHIFT_MAX 3
1785 #define REG_MCDI_EODIW_SHIFT_MIN 1
1786 #define REG_MCDI_EODIW_AB_MAX_GAIN_MAX 12
1787 #define REG_MCDI_EODIW_AB_MAX_GAIN_MIN 4
1788 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MAX 6
1789 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MIN 1
MDrv_SC_Agate_SubMvPanScan(void * pInstance,const XC_GMvStates gMv,const MS_BOOL isSceneChange,const MS_BOOL isSdHqvJaggedTest,const MS_U16 motion)1790 void MDrv_SC_Agate_SubMvPanScan( void *pInstance, const XC_GMvStates gMv, const MS_BOOL isSceneChange, const MS_BOOL isSdHqvJaggedTest, const MS_U16 motion )
1791 {
1792     MS_BOOL bisSubMvPanScan = FALSE;
1793     static MS_U8 u8iir_cnt = 0;
1794     MS_BOOL bisMv0 = ( ( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 ) ) ? true : false;
1795     static MS_U8 u8isMv0Cnt = 0;
1796     static MS_U8 u8isSubMvPanScanCnt = 0;
1797 
1798     static MS_U16 u16reg_mcdi_eodiw_shift = REG_MCDI_EODIW_SHIFT_MAX;
1799     static MS_U16 u16reg_mcdi_eodiw_ab_max_gain = REG_MCDI_EODIW_AB_MAX_GAIN_MIN;
1800     static MS_U16 u16reg_mcdi_eodiw_min_sad_gain = REG_MCDI_EODIW_MIN_SAD_GAIN_MAX;
1801 
1802 
1803 	if( bisMv0 && ( motion < 0x100 ) )
1804 	{
1805 		if( u8isMv0Cnt < 20 )
1806 			u8isMv0Cnt++;
1807 	}
1808 	else
1809 	{
1810 		if( u8isMv0Cnt > 0 )
1811 			u8isMv0Cnt--;
1812 	}
1813 
1814 	if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 )
1815 		&&( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) && gMv.yMvIsMovingOdd )
1816 	{
1817 		bisSubMvPanScan = true;
1818 	}
1819 	else
1820 	{
1821 		bisSubMvPanScan = false;
1822 	}
1823 
1824 
1825 	if( bisSubMvPanScan )
1826 	{
1827 		if( u8isSubMvPanScanCnt < 20 )
1828 			u8isSubMvPanScanCnt++;
1829 	}
1830 	else
1831 	{
1832 		if( u8isSubMvPanScanCnt > 0 )
1833 			u8isSubMvPanScanCnt--;
1834 	}
1835 
1836 
1837 	//PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1838 	//PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1839 
1840 	if( ( u8isSubMvPanScanCnt > 5 ) || isSdHqvJaggedTest )
1841 	{
1842 		u8iir_cnt = 240;
1843 	}
1844 	else
1845 	{
1846 		if( u8iir_cnt != 0 )
1847 			u8iir_cnt--;
1848 	}
1849 
1850 	if( isSceneChange ||  ( u8isMv0Cnt > 10 ) ) /* for pattern stable, if only check GMV-Mv0 have problem */
1851 		u8iir_cnt = 0;
1852 
1853 	if( u8iir_cnt == 0 )
1854 	{
1855 		if( u16reg_mcdi_eodiw_shift < REG_MCDI_EODIW_SHIFT_MAX )
1856 			u16reg_mcdi_eodiw_shift++;
1857 
1858 		if( u16reg_mcdi_eodiw_ab_max_gain > REG_MCDI_EODIW_AB_MAX_GAIN_MIN )
1859 			u16reg_mcdi_eodiw_ab_max_gain--;
1860 
1861 		if( u16reg_mcdi_eodiw_min_sad_gain < REG_MCDI_EODIW_MIN_SAD_GAIN_MAX )
1862 			u16reg_mcdi_eodiw_min_sad_gain++;
1863 	}
1864 	else/* do sub pixel */
1865 	{
1866 		if( u16reg_mcdi_eodiw_shift > REG_MCDI_EODIW_SHIFT_MIN )
1867 			u16reg_mcdi_eodiw_shift--;
1868 
1869 		if( u16reg_mcdi_eodiw_ab_max_gain < REG_MCDI_EODIW_AB_MAX_GAIN_MAX )
1870 			u16reg_mcdi_eodiw_ab_max_gain++;
1871 
1872 		if( u16reg_mcdi_eodiw_min_sad_gain > REG_MCDI_EODIW_MIN_SAD_GAIN_MIN )
1873 			u16reg_mcdi_eodiw_min_sad_gain--;
1874 	}
1875 
1876 	MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, u16reg_mcdi_eodiw_shift  , 0x000F );
1877 	MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, (u16reg_mcdi_eodiw_ab_max_gain<<12) , 0xF000 );
1878 
1879      //Dummy to control write value, add by Bella 20150708
1880     if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x0F00)!=0x0000)
1881     {
1882         MApi_XC_W2BYTEMSK(REG_SC_BK22_2A_L, MApi_XC_R2BYTE(REG_SC_BK23_5D_L), 0x0F00);
1883     }
1884     else
1885     {
1886         MApi_XC_W2BYTEMSK( REG_SC_BK22_2A_L, (u16reg_mcdi_eodiw_min_sad_gain<<8) , 0x0F00 );
1887     }
1888 }
1889 
MDrv_SC_Agate_PanScan_Church(void * pInstance,const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const MS_U32 uComplex,const MS_BOOL meStill,const MS_BOOL isHDsource)1890 void MDrv_SC_Agate_PanScan_Church(void *pInstance, const XC_GMvStates gMv, const MS_U16 nonMv0Comfirm, const MS_U32 uComplex, const MS_BOOL meStill, const MS_BOOL isHDsource )
1891 {
1892     MS_BOOL bisPanScanV = FALSE;
1893     static MS_U8 iir_cnt = 0;
1894     MS_U32 colorSum = 0;
1895 
1896     colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
1897     colorSum  = colorSum / 8;
1898 
1899     if( (gMv.h1XYsum > 10) && (gMv.h2XYsum > 10) && (gMv.h1XYdiff < 3) && (gMv.h2XYdiff < 3)
1900             && (gMv.minMvXdir == 32) && (nonMv0Comfirm > 6) &&(colorSum > 0x80) && (uComplex > 0x100)
1901             && (uComplex < 0x600) && (meStill == false) && (isHDsource == false) ) //vertical moving
1902     {
1903             bisPanScanV = true;
1904     }
1905     else
1906     {
1907             bisPanScanV = false;
1908     }
1909 
1910     if( bisPanScanV )
1911     {
1912         iir_cnt = 120; //default:240
1913     }
1914     else
1915     {
1916         if( iir_cnt != 0 )
1917         iir_cnt--;
1918     }
1919 
1920     if( isHDsource )
1921         iir_cnt = 0;
1922 
1923     if( iir_cnt == 0 )
1924     {
1925         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03  , 0x000F );
1926         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0xFF00 );
1927         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1928         MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x10) , 0x00FF );
1929      }
1930     else
1931     {
1932         MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x01  , 0x000F );
1933         MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x02<<8) , 0xFF00 );
1934         MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x02<<8) , 0xFF00 );
1935         MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x6C) , 0x00FF );
1936      }
1937 }
1938 
MDrv_SC_FilmReorder(void * pInstance,const XC_OpFrameStates opFrameStatus)1939 void MDrv_SC_FilmReorder(void *pInstance, const XC_OpFrameStates opFrameStatus )
1940 {
1941 	static XC_FilmRoStates filmRoStates;
1942 	static MS_BOOL init = true;
1943 	static MS_U8 samplingTime = 0;
1944 //	MS_BOOL isPoolOfFull;
1945     int vaildCnt = 0;
1946     int i = 0;
1947 
1948 	samplingTime++;
1949 
1950 	if( init )
1951 	{
1952 		for( i=0; i < 16 ; i++ )
1953 		{
1954 			filmRoStates.motion[i] = 0;
1955 			filmRoStates.unmatch_1[i] = 0;
1956 			filmRoStates.unmatch_3[i] = 0;
1957 			filmRoStates.vaildCnt[i] = 0;
1958 			filmRoStates.vaild[i] = false;
1959 		}
1960 		init = false;
1961 	}
1962 
1963 	/* Step0. loading states */
1964 	filmRoStates.motion[opFrameStatus.curOpFrame] 			= MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0xFFFF);
1965 	filmRoStates.unmatch_1[opFrameStatus.curOpFrame] 		= MApi_XC_R2BYTEMSK(REG_SC_BK0A_0A_L, 0xFFFF);
1966 	filmRoStates.unmatch_3[opFrameStatus.curOpFrame] 		= MApi_XC_R2BYTEMSK(REG_SC_BK0A_0B_L, 0xFFFF);
1967 
1968 	if( filmRoStates.vaildCnt[opFrameStatus.curOpFrame] < 255 )
1969 		filmRoStates.vaildCnt[opFrameStatus.curOpFrame]++;
1970 
1971 	filmRoStates.vaild[opFrameStatus.curOpFrame] 	      = true;
1972 
1973 	/* Step1. 1s do clean unflash counter */
1974 	if( samplingTime == 60 )
1975 	{
1976 		for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1977 		{
1978 			if( filmRoStates.vaildCnt[i] < 10 )
1979 			{
1980 				filmRoStates.vaild[i] 	      = false;
1981 			}
1982 		}
1983 		samplingTime = 0;/* reset of sampling time */
1984 	}
1985 
1986 	/* Step2. Check pool is full */
1987 	vaildCnt = 0;
1988 	for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1989 	{
1990 		if( filmRoStates.vaild[i] )
1991 			vaildCnt++;
1992 	}
1993 //	isPoolOfFull = ( vaildCnt > (opFrameStatus.maxOpFrame/2) ) ? true : false;
1994 
1995 }
1996 
MDrv_SC_SaveHpfSetting(void * pInstance,const MS_U8 isSourceChange)1997 XC_HpfDefaultRegSetting MDrv_SC_SaveHpfSetting(void *pInstance, const MS_U8 isSourceChange )
1998 {
1999 	static XC_HpfDefaultRegSetting reg;
2000 
2001 	if(  isSourceChange == 1 )
2002 	{
2003 
2004 		reg.HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
2005 		reg.HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
2006 
2007 		reg.HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
2008 		reg.HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
2009 
2010 		reg.HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF)  );
2011 		reg.HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF)  );
2012 
2013 		reg.HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F)  );
2014 		reg.HDSDD_overflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2015 
2016 		//reg.HDSD_detection_letter_box_enable = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080) >> 7 );
2017 	}
2018 	return reg;
2019 }
2020 
2021 #if 0
2022 void print_hpfSetting(void)
2023 {
2024 	MS_BOOL HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
2025 	MS_BOOL HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
2026 
2027 	MS_U8 HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
2028 	MS_U8 HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
2029 
2030 	MS_U16 HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF)  );
2031 	MS_U16 HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF)  );
2032 
2033 	MS_U8 HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F)  );
2034 	MS_U8 HDSDD_overflow_threshold  = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2035 
2036 	MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2037 	//MS_U16 boundarystart = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7C_L, 0x1FFF)  );
2038 	//MS_U16 boundaryend   = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7D_L, 0x1FFF)  );
2039 	MS_U16 uxx = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080)  );
2040 
2041 	//PRT_TRP("det_mode_0 = %d, det_mode_1 = %d, det_mode_shift_0 = %d, det_mode_shift_1 = %d, det_mode_threshold_0 = %d, det_mode_threshold_1 = %d, HDSDD_underflow_threshold = %d, HDSDD_overflow_threshold = %d\n",
2042 	HDSDD0_det_mode, HDSDD1_det_mode, HDSDD0_det_mode_shift, HDSDD1_det_mode_shift, HDSDD0_det_mode_threshold, HDSDD1_det_mode_threshold, HDSDD_underflow_threshold, HDSDD_overflow_threshold);
2043 
2044 	//PRT_TRP("widthCur = %d, boundarystart = %d, boundaryend = %d, uxx = %d\n", widthCur, boundarystart, boundaryend, uxx);
2045 }
2046 #endif
2047 
MDrv_SC_hpfDefaultRelod(void * pInstance,const XC_HpfDefaultRegSetting defaultReg)2048 void MDrv_SC_hpfDefaultRelod(void *pInstance, const XC_HpfDefaultRegSetting defaultReg )
2049 {
2050 	//const int boundary = 10;
2051 	//MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2052 
2053 
2054 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
2055 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
2056 
2057 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
2058 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
2059 
2060 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
2061 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
2062 
2063 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, defaultReg.HDSDD0_det_mode , 0x0001); /* mode */
2064 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode)<<4, 0x0010); /* mode */
2065 
2066 	MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0190, 0xFFFF);
2067 	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4000, 0x7000);
2068 
2069 	MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);  /*for HD repot*/
2070 	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0200, 0x0700); /*for HD repot*/
2071 
2072 	MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
2073 	MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
2074 
2075 	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0001 , 0x0001); /* mode */
2076 	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0010, 0x0010); /* mode */
2077 
2078 
2079 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
2080 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); /* set start */
2081 //	MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);/* set end */
2082 }
2083 
2084 
2085 /*#define TIMEID_LRLETTERBOX 0
2086 MS_BOOL MDrv_SC_Edison_LrLetterBox( const XC_OpFrameStates opFrameStatusCur, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 _timeSharingID, const MS_U8 timingSegment )
2087 {
2088 	const int boundary = 10;
2089 	static XC_OpFrameStates opFrameStatusLast;
2090     MS_U16 widthCur = 0;
2091 	static MS_U16 widthLast;
2092 	static MS_U8 operationCnt = 0;
2093 	static int maxBreadthDetermine = 0;
2094     MS_U32 sdCntActL_cur = 0, sdCntActR_cur = 0;
2095 	static MS_U32 sdCntActL_last = 0xFFFF;
2096 	static MS_U32 sdCntActR_last = 0xFFFF;
2097 	static int sdCntActLcnt = 0;
2098 	static int sdCntActRcnt = 0;
2099 	static MS_BOOL isL_letterBox = false;
2100 	static MS_BOOL isR_letterBox = false;
2101 
2102 	static MS_BOOL _return = false;
2103 
2104 	widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);//cur width
2105 
2106 	if( _timeSharingID == TIMEID_LRLETTERBOX )
2107 	{
2108 		if( timingSegment == 0 )
2109 			MDrv_SC_hpfDefaultRelod( defaultReg );
2110 		else
2111 		{
2112 			//enable window
2113 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
2114 
2115 			// max width ratio
2116 
2117 			if( widthCur != widthLast )
2118 			{
2119 				maxBreadthDetermine = widthCur / 12;
2120 			}
2121 
2122 			// L/R width switch
2123 			if( isL_letterBox )// if "L letter box" ready then do "R letter box"
2124 			{
2125 				//R side
2126 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, widthCur-boundary-maxBreadthDetermine, 0x1FFF);// set start
2127 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);//set end
2128 			}
2129 			else
2130 			{
2131 				//L side
2132 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 0+boundary, 0x1FFF); //set start
2133 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, maxBreadthDetermine+boundary, 0x1FFF);//set end
2134 			}
2135 
2136 			if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2137 			{
2138 				if(operationCnt%2)
2139 				{
2140 					sdCntActL_cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
2141 					sdCntActL_cur = ( sdCntActL_last*3 + sdCntActL_cur ) >> 2;
2142 					sdCntActL_last = sdCntActL_cur;
2143 
2144 					if( sdCntActL_last < 3 )
2145 					{
2146 						if( sdCntActLcnt < 256 ) // 256 = counter max
2147 							sdCntActLcnt++;
2148 					}
2149 					else
2150 					{
2151 						if( sdCntActLcnt > 5 )
2152 							sdCntActLcnt = sdCntActLcnt - 5;
2153 					}
2154 				}
2155 				else
2156 				{
2157 					sdCntActR_cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
2158 					sdCntActR_cur = ( sdCntActR_last*3 + sdCntActR_cur ) >> 2;
2159 					sdCntActR_last = sdCntActR_cur;
2160 
2161 					if( sdCntActR_last < 3 )
2162 					{
2163 						if( sdCntActRcnt < 256 )// 256 = counter max
2164 							sdCntActRcnt++;
2165 					}
2166 					else
2167 					{
2168 						if( sdCntActRcnt > 5 )
2169 							sdCntActRcnt = sdCntActRcnt - 5;
2170 					}
2171 				}
2172 				operationCnt++;
2173 			}
2174 
2175 			isL_letterBox = ( sdCntActLcnt > 120 ) ? true : false;
2176 			isR_letterBox = ( sdCntActRcnt > 120 ) ? true : false;
2177 
2178 			opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2179 			widthLast = widthCur;
2180 
2181 			_return = (isL_letterBox && isR_letterBox);
2182 		}
2183 	}
2184 	else
2185 	{
2186 		//disable window
2187 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000, 0x0080);
2188 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); // set start
2189 		//    MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);// set end
2190 	}
2191 
2192 	return _return;
2193 }
2194 */
MDrv_SC_McFilmLike(void * pInstance,const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2195 MS_BOOL MDrv_SC_McFilmLike(void *pInstance, const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd )
2196 {
2197 	static XC_OpFrameStates opFrameStatusLast;
2198 	static XC_McFilmStates mcFilmStates;
2199     MS_BOOL  isFilm = FALSE;
2200 	static MS_U8 isFilmCnt = 0;
2201 	static MS_U8 continuousError = 0;
2202 	MS_U8 lowerBoundTh = 0;
2203 
2204 	if( isHd )
2205 		lowerBoundTh = 0xFF;
2206 	else
2207       #if SZ_PATTERN_ENABLE
2208       lowerBoundTh = 0x80;
2209       #else
2210 			lowerBoundTh = 0x40;
2211       #endif
2212 
2213 	mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2214 	mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2215 
2216 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2217 	{
2218 		if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2219 			||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2220 		{
2221 			if( isFilmCnt < 255 )
2222 				isFilmCnt++;
2223 
2224 			continuousError = 0;
2225 		}
2226 		else
2227 		{
2228 			if( isFilmCnt > 0 )
2229 				isFilmCnt--;
2230 
2231 			if( continuousError < 255 )
2232 				continuousError++;
2233 		}
2234 
2235 		if( continuousError > 4 )
2236 			isFilmCnt = 0;
2237 	}
2238 
2239 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2240 
2241 	isFilm = ( isFilmCnt > 10 ) ? true : false;
2242 
2243 	return isFilm;
2244 }
MDrv_SC_McFilmUkoSabihS(void * pInstance,const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd,MS_U32 _hpfHdCntReport)2245 MS_BOOL MDrv_SC_McFilmUkoSabihS(void *pInstance, const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd, MS_U32 _hpfHdCntReport )
2246 {
2247 	static XC_OpFrameStates opFrameStatusLast;
2248 	static XC_McFilmStates mcFilmStates;
2249 	MS_BOOL  isFilm;
2250 	static MS_U8 isFilmCnt = 0;
2251 	static MS_U8 continuousError = 0;
2252 	MS_U8 lowerBoundTh = 0;
2253 
2254 	if( isHd )
2255 	{
2256 		if (_hpfHdCntReport >= 50000)
2257 			lowerBoundTh = 0xFF;//255
2258 		else if (_hpfHdCntReport >= 32000)
2259 			lowerBoundTh = 128+ 127*(_hpfHdCntReport-32000)/18000;
2260 		else if (_hpfHdCntReport >= 6400)
2261 			lowerBoundTh = 64+ 16*(_hpfHdCntReport-6400)/6400;
2262 		else //if (_hpfHdCntReport <= 6400)
2263 			lowerBoundTh = _hpfHdCntReport/100;
2264 	}
2265 	else
2266 		lowerBoundTh = 0x80;
2267 
2268 	mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2269 	mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2270 
2271 	MS_U32 filmLikePrvPixelsAdj = __max(mcFilmStates.filmLikePrvPixels - lowerBoundTh*2, 0);
2272 	MS_U32 filmLikeNxtPixelsAdj = __max(mcFilmStates.filmLikeNxtPixels - lowerBoundTh*2, 0);
2273 	//DEBUG_LC_Full6bit3(__max(mcFilmStates.filmLikePrvPixels, mcFilmStates.filmLikeNxtPixels )/16);
2274 	//DEBUG_LC_Full6bit4(__min(mcFilmStates.filmLikePrvPixels, mcFilmStates.filmLikeNxtPixels )/16);
2275 	//DEBUG_LC_Full6bit5(lowerBoundTh);
2276 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2277 	{
2278 		if( (filmLikePrvPixelsAdj > 0) && (filmLikeNxtPixelsAdj > 0) &&
2279 			( (filmLikePrvPixelsAdj>filmLikeNxtPixelsAdj*5 && filmLikePrvPixelsAdj > lowerBoundTh)
2280 			||(filmLikeNxtPixelsAdj>filmLikePrvPixelsAdj*5 && filmLikeNxtPixelsAdj > lowerBoundTh) ) )
2281 		{
2282 			if( isFilmCnt < 63 )
2283 				isFilmCnt++;
2284 
2285 			continuousError = 0;
2286 		}
2287 		else if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2288 			||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2289 		{
2290 			if( isFilmCnt < 63 )
2291 				isFilmCnt++;
2292 
2293 			continuousError = 0;
2294 		}
2295 		else
2296 		{
2297 			if( isFilmCnt > 0 )
2298 				isFilmCnt--;
2299 
2300 			if( continuousError < 63 )
2301 				continuousError++;
2302 		}
2303 
2304 		if( continuousError > 4 )
2305 			isFilmCnt = 0;
2306 	}
2307 
2308 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2309 
2310 	isFilm = ( isFilmCnt > 10 ) ? true : false;
2311 	//DEBUG_LC_Full6bit2(isFilmCnt);
2312 
2313 	return isFilm;
2314 }
MDrv_SC_Motion4StillCnt(void * pInstance,const MS_U16 motion4)2315 MS_U8 MDrv_SC_Motion4StillCnt(void *pInstance, const MS_U16 motion4 )
2316 {
2317 	static MS_U8 motionCnt = 0;
2318 
2319 	if( motion4 == 0 )
2320 	{
2321 	 //motionCnt = motionCnt < 12 ? motionCnt += 3 : 15);
2322 
2323 	 if(motionCnt < 12)
2324 	 {
2325 	  motionCnt += 3;
2326 	 }
2327 	 else
2328 	 {
2329 	  motionCnt =15;
2330 	 }
2331 	}
2332 	   else
2333 	   {
2334 	 //motionCnt = motionCnt > 3 ? motionCnt -= 3 : 0);
2335 	 if(motionCnt > 3 )
2336 	 {
2337 	   motionCnt -= 3;
2338 	}
2339 	else
2340 	{
2341 	  motionCnt =0;
2342 	  }
2343 	}
2344 
2345 	return motionCnt;
2346 }
2347 
MDrv_SC_Me1Still(void * pInstance,const MS_U16 me13x3MwMax,const MS_U16 mv0Cost)2348 MS_U8 MDrv_SC_Me1Still(void *pInstance, const MS_U16 me13x3MwMax, const MS_U16 mv0Cost )
2349 {
2350 	static MS_U8 cnt = 0;
2351 
2352 	if( ( me13x3MwMax < 30 ) && ( mv0Cost < 30) )
2353 	{
2354 		if( cnt < 15 )
2355 			cnt++;
2356 	}
2357 	else
2358 	{
2359 		if( cnt > 0 )
2360 			cnt--;
2361 	}
2362 
2363 	return cnt;
2364 }
2365 
MDrv_SC_McSmallMoving(void * pInstance,const MS_U16 me13x3MwMin,const MS_U16 mv0Cost)2366 MS_U8 MDrv_SC_McSmallMoving(void *pInstance, const MS_U16 me13x3MwMin, const MS_U16 mv0Cost )
2367 {
2368 	static MS_U8 smallMovingCnt = 0;
2369 
2370 	if( ( mv0Cost>>8 ) > me13x3MwMin )
2371 	{
2372 		if( smallMovingCnt < 255 )
2373 			smallMovingCnt++;
2374 	}
2375 	else
2376 	{
2377 		if( smallMovingCnt > 0 )
2378 			smallMovingCnt--;
2379 	}
2380 
2381 	return smallMovingCnt;
2382 }
2383 
MDrv_SC_McFilmLikeHd(void * pInstance,const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2384 MS_BOOL MDrv_SC_McFilmLikeHd(void *pInstance, const XC_OpFrameStates opFrameStatusCur, MS_BOOL isHd )
2385 {
2386 	static XC_OpFrameStates opFrameStatusLast;
2387 	static XC_McFilmStates mcFilmStates;
2388     MS_BOOL  isFilm = FALSE;
2389 	static MS_U8 isFilmCnt = 0;
2390 	static MS_U8 continuousError = 0;
2391 	MS_U8 lowerBoundTh = 0;
2392 
2393 	if( isHd )
2394 		lowerBoundTh = 0xFF;
2395 	else
2396 		lowerBoundTh = 0x40;
2397 
2398 	mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2399 	mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2400 
2401 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2402 	{
2403 		if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*15))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh ))      /*Sam modify*/
2404 			||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*15))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh )))  /*Sam modify*/
2405 		{
2406 			if( isFilmCnt < 255 )
2407 				isFilmCnt++;
2408 
2409 			continuousError = 0;
2410 		}
2411 		else
2412 		{
2413 			if( isFilmCnt > 0 )
2414 				isFilmCnt--;
2415 
2416 			if( continuousError < 255 )
2417 				continuousError++;
2418 		}
2419 
2420 		if( continuousError > 4 )
2421 			isFilmCnt = 0;
2422 	}
2423 
2424 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2425 
2426 	isFilm = ( isFilmCnt > 10 ) ? true : false;
2427 
2428 	return isFilm;
2429 }
2430 
MDrv_SC_McFilmLikeAny(void * pInstance,const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmLike,MS_BOOL isHd)2431 MS_BOOL MDrv_SC_McFilmLikeAny(void *pInstance, const XC_OpFrameStates opFrameStatusCur, const MS_BOOL isMcFilmLike, MS_BOOL isHd )
2432 {
2433 	static XC_OpFrameStates opFrameStatusLast;
2434 	static XC_McFilmStates mcFilmStates;
2435     MS_BOOL  isFilmAny = FALSE;
2436 	static MS_U8 isFilmCnt = 0;
2437 	static MS_U8 continuousError = 0;
2438 	static MS_U8 continuousZero = 0;
2439 	static MS_U16 maxFilmLikeDiff = 0;
2440 	MS_U8 lowerBoundTh = 0;
2441 
2442 	if( isHd )
2443 		lowerBoundTh = 0xFF;
2444 	else
2445 		lowerBoundTh = 0x80;
2446 
2447 	mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2448 	mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2449 
2450 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
2451 	{
2452 
2453 		if(((mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*5))&&(mcFilmStates.filmLikePrvPixels > lowerBoundTh))
2454 			||((mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*5))&&(mcFilmStates.filmLikeNxtPixels > lowerBoundTh)))
2455 		{
2456 			if( isFilmCnt < 255 )
2457 				isFilmCnt++;
2458 
2459 			/* save maximum of diff */
2460 			if( mcFilmStates.filmLikePrvPixels > mcFilmStates.filmLikeNxtPixels )
2461 				maxFilmLikeDiff = mcFilmStates.filmLikePrvPixels;
2462 			else
2463 				maxFilmLikeDiff = mcFilmStates.filmLikeNxtPixels;
2464 
2465 			continuousError = 0;
2466 			continuousZero = 15; /* Keep to 10 * 1.5x times "O" */
2467 
2468 		}
2469 		else if(  ( maxFilmLikeDiff > mcFilmStates.filmLikePrvPixels*5 ) && ( maxFilmLikeDiff > mcFilmStates.filmLikeNxtPixels*5 ) && ( continuousZero > 0 ) )
2470 		{
2471 			if( continuousZero > 0 )
2472 				continuousZero--;
2473 		}
2474 		else
2475 		{
2476 			if( isFilmCnt > 0 )
2477 				isFilmCnt--;
2478 
2479 			if( continuousError < 255 )
2480 				continuousError++;
2481 
2482 			continuousZero = 0;
2483 			maxFilmLikeDiff = 0;
2484 		}
2485 
2486 		if( continuousError > 4 )
2487 		{
2488 			isFilmCnt = 0;
2489 		}
2490 	}
2491 
2492 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
2493 
2494 	isFilmAny = ( isFilmCnt > 10 ) ? true : false;
2495 
2496 	return ( isFilmAny && ( !isMcFilmLike ) ); /* Film-Any(without 2:3:3:2/2:2:2:4) and Film-32/22 will not into same condition */
2497 }
2498 
MDrv_SC_McFilmLikeForSlowMotion(void * pInstance,const MS_U32 motion,const XC_GMvStates gMv)2499 MS_BOOL MDrv_SC_McFilmLikeForSlowMotion(void *pInstance, const MS_U32 motion, const XC_GMvStates gMv  )
2500 {
2501 	MS_BOOL isMv0 = ((gMv.minMvXdir == 32)&&(gMv.minMvYdir == 8)) ? true : false;
2502 	MS_BOOL maxBinFocus = ( gMv.h1XYsum > 0x40 ) ? true : false;
2503 	MS_BOOL isStill = ( motion < 0x100 ) ? true : false;
2504 
2505 	static XC_McFilmStates mcFilmStates;
2506     MS_BOOL  isFilm = FALSE;
2507 	static MS_U8 isFilmCnt = 0;
2508 	static MS_U8 continuousError = 0;
2509 
2510 	mcFilmStates.filmLikePrvPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_75_L, 0xFFFF);
2511 	mcFilmStates.filmLikeNxtPixels = MApi_XC_R2BYTEMSK(REG_SC_BK2A_76_L, 0xFFFF);
2512 
2513 	if( (mcFilmStates.filmLikePrvPixels>(mcFilmStates.filmLikeNxtPixels*1) )
2514 		|| (mcFilmStates.filmLikeNxtPixels>(mcFilmStates.filmLikePrvPixels*1) ) )
2515 	{
2516 		if( isFilmCnt < 255 )
2517 			isFilmCnt++;
2518 
2519 		continuousError = 0;
2520 	}
2521 	else
2522 	{
2523 		if( isFilmCnt > 0 )
2524 			isFilmCnt--;
2525 
2526 		if( continuousError < 255 )
2527 			continuousError++;
2528 	}
2529 
2530 	if( continuousError > 10 )
2531 		isFilmCnt = 0;
2532 
2533 	//isFilm = ( isFilmCnt > 10 ) ? true : false;
2534 	isFilm = ( isFilmCnt > 5 ) ? true : false;
2535 
2536 	return ( isFilm && isMv0 && maxBinFocus && isStill );
2537 }
2538 
MDrv_SC_HQV_JaggedTestPattern(void * pInstance,const XC_GMvStates gMv)2539 MS_BOOL MDrv_SC_HQV_JaggedTestPattern(void *pInstance, const XC_GMvStates gMv )
2540 {
2541 	MS_BOOL isMvX0 = (gMv.minMvXdir == 32) ? true : false;
2542 	MS_BOOL isOddY = ( gMv.minMvYdir % 2 ) ? true : false;
2543 	MS_BOOL maxBinNonFocus = ( gMv.h1XYsum < 0x10 ) ? true : false;
2544 
2545 	if( isMvX0 && isOddY && maxBinNonFocus )
2546     {
2547         return  true;
2548 		//printf("MDrv_SC_HQV_JaggedTestPattern == TRUE\n\n");
2549     }
2550     else
2551     {
2552         return false;
2553 		//printf("MDrv_SC_HQV_JaggedTestPattern == FALSE\n\n");
2554     }
2555 	//printf("isMvX0 == %d, isOddY == %d, maxBinNonFocus == %d\n\n", isMvX0, isOddY, maxBinNonFocus);
2556 }
2557 
2558 #define SPIKE_NR_MAX 15
2559 #define SPIKE_NR_MIN 2
MDrv_SC_HQV_RandomNoise(void * pInstance,const XC_GMvStates gMv,const MS_U16 mvNotFound,const MS_U32 _hdFilterBaseReport,const MS_U32 u32MotionValue_Sum)2560 void MDrv_SC_HQV_RandomNoise(void *pInstance, const XC_GMvStates gMv,  const MS_U16 mvNotFound, const MS_U32 _hdFilterBaseReport,  const MS_U32 u32MotionValue_Sum )
2561 {
2562 	MS_BOOL isMv0 = ((gMv.minMvXdir == 32)&&(gMv.minMvYdir == 8)) ? true : false;
2563 	MS_BOOL maxBinFocus = ( gMv.h1XYsum > 0xE0 ) ? true : false;
2564 	MS_BOOL isMoving = ( u32MotionValue_Sum > 0x02 ) ? true : false;
2565 	MS_BOOL notSoHighFreq = ( _hdFilterBaseReport < 0x700 ) ? true : false;
2566 	MS_BOOL isNotFound =  ( mvNotFound > 0x300 ) ? true : false;
2567 
2568 	static MS_BOOL isHqvRandomNoise = false;
2569 	static MS_U8 confirmCnt = 0;
2570 	static MS_U8 intensity = 0;
2571 
2572 	if( isMv0 && maxBinFocus && isMoving && notSoHighFreq && isNotFound )
2573 	{
2574 		if( confirmCnt < 60 )
2575 			confirmCnt++;
2576 	}
2577 	else
2578 		confirmCnt = 0;
2579 
2580 	isHqvRandomNoise = ( confirmCnt > 10 ) ? true : false;
2581 
2582 	if( isHqvRandomNoise )
2583 	{
2584 		if( intensity < SPIKE_NR_MAX )
2585 			intensity++;
2586 	}
2587 	else
2588 	{
2589 		if( intensity > SPIKE_NR_MIN )
2590 			intensity--;
2591 	}
2592 	MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  (MS_U16)( intensity << 8 )  , 0x0F00 );
2593 
2594 	if( isHqvRandomNoise ) /* Noise trun-off noise masking motion protection */
2595 		MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  0x0000/*Off*/ , 0x0008 );
2596 	else
2597 		MApi_XC_W2BYTEMSK( REG_SC_BK26_50_L,  0x0008/*On*/ , 0x0008 );
2598 	//return isHqvRandomNoise;
2599 }
2600 
2601 #define MF_Gain            6
MDrv_SC_ZoomMoving(void * pInstance,const XC_GMvStates gMv,const MS_U16 me1IsNonMv0,const MS_U16 me1IsNotFound,const MS_U16 featherAndMotion,const MS_U16 motion)2602 MS_BOOL MDrv_SC_ZoomMoving( void *pInstance, const XC_GMvStates gMv , const MS_U16 me1IsNonMv0, const MS_U16 me1IsNotFound, const MS_U16 featherAndMotion, const MS_U16 motion )
2603 {
2604 
2605 	//MS_BOOL isMvY0 = (gMv.minMvYdir == 8) ? true : false;
2606 	MS_BOOL isMvY0 = (( abs(32 - gMv.minMvXdir) < 4 )&&(gMv.minMvYdir == 8)) ? true : false;
2607 	//MS_BOOL maxBin = true;//( gMv.h1XYsum < 0x30 && gMv.h1XYsum > 0x04 ) ? true : false;
2608 	MS_BOOL isMoving = ( motion > 0x200 ) ? true : false;
2609 
2610     MS_BOOL isSmallMoving = FALSE;
2611 	static MS_U16 prev_featherAndMotion = 0;
2612 	MS_U16 cur_featherAndMotion = 0;
2613 	MS_BOOL withoutFeather = false;
2614 	static MS_U8 confirm_cnt = 0;
2615 
2616 	cur_featherAndMotion = featherAndMotion;
2617 
2618 	//denyMoving = ( me1IsNonMv0 + me1IsNotFound );
2619 
2620 	cur_featherAndMotion = (prev_featherAndMotion*3 + cur_featherAndMotion ) >> 2;
2621 	prev_featherAndMotion = cur_featherAndMotion;
2622 
2623 	withoutFeather = ( cur_featherAndMotion < 8 ) ? true : false;
2624 
2625 	if( (( me1IsNotFound > (me1IsNonMv0*MF_Gain)) && ( me1IsNotFound > 0x30 )) && withoutFeather && isMvY0 && isMoving )
2626 		isSmallMoving = true;
2627 	else
2628 		isSmallMoving = false;
2629 
2630 	if( isSmallMoving )
2631 	{
2632 		if( confirm_cnt < 40 )
2633 			confirm_cnt++;
2634 	}
2635 	else
2636 	{
2637 		if( confirm_cnt > 0 )
2638 			confirm_cnt--;
2639 	}
2640 
2641 
2642 	return ( confirm_cnt > 30 );
2643 }
2644 
2645 
MDrv_SC_EODi_Armored(void * pInstance,const XC_GMvStates gMv,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm)2646 void MDrv_SC_EODi_Armored(void *pInstance, const XC_GMvStates gMv , const MS_U16 mv0Comfirm , const MS_U16 nonMv0Comfirm )
2647 {
2648     MS_BOOL is_still = FALSE;
2649 	MS_BOOL isMv0 = ( ( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 ) ) ? true : false;
2650 	static MS_U8 confirm_cnt = 0;
2651 	static MS_BOOL reg_eodi_pwsam_en = false;
2652 
2653 	if( isMv0 && (mv0Comfirm > 0x15) && (nonMv0Comfirm < 8))
2654 		is_still = true;
2655 	else
2656 		is_still = false;
2657 
2658 	if( is_still )
2659 	{
2660 		confirm_cnt = confirm_cnt + 5;
2661 
2662 		if(confirm_cnt > 20)
2663 			confirm_cnt = 20;
2664 	}
2665 	else
2666 	{
2667 		if(confirm_cnt > 0)
2668 			confirm_cnt--;
2669 		else
2670 			confirm_cnt = 0;
2671 	}
2672 
2673 	if( confirm_cnt >= 10)
2674 	{
2675 		reg_eodi_pwsam_en = true;
2676 	}
2677 	else
2678 	{
2679 		reg_eodi_pwsam_en = false;
2680 	}
2681 	MApi_XC_W2BYTEMSK( REG_SC_BK21_3D_L, (MS_U16)( reg_eodi_pwsam_en << 3) , 0x0008 );
2682 }
2683 
2684 #define S_UPPERBOUND_TH 15
2685 #define S_MATCH_TH 10
MDrv_SC_Agate_ukoSabihS(void * pInstance,const XC_ApiStatus * stXCStatus,const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const XC_FilmStates filmstatus,const MS_BOOL isMcFilm,MS_BOOL * isUkosabihsMotion,MS_BOOL * isUkosabihsMc,MS_BOOL * isUkosabihsForFilm,const MS_U16 mv0Comfirm,MS_BOOL * isUkosabihsMv0,const MS_BOOL isHDSrc)2686 MS_BOOL MDrv_SC_Agate_ukoSabihS(void *pInstance, const XC_ApiStatus *stXCStatus, const XC_GMvStates gMv ,const MS_U16 nonMv0Comfirm, const XC_FilmStates filmstatus, const MS_BOOL isMcFilm,
2687 				MS_BOOL *isUkosabihsMotion, MS_BOOL *isUkosabihsMc, MS_BOOL *isUkosabihsForFilm, const MS_U16 mv0Comfirm, MS_BOOL *isUkosabihsMv0, const MS_BOOL isHDSrc )
2688 {
2689     MS_BOOL is_ukoSabihS = FALSE, is_ukoSabihSmv0 = FALSE;
2690 	MS_BOOL isMv0 = (( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 )) ? true : false;
2691 	MS_BOOL isFilm = ( filmstatus.film_act || isMcFilm ) ? true : false;
2692 	MS_BOOL isWithoutMv0Comfirm = ( mv0Comfirm < 0x20 ) ? true : false;
2693 	MS_BOOL isCVBSinput,isTVinput;
2694     MS_U8 XYDiffTH= 0,SpeedUp_TH = 0,Confirm_TH = 0;
2695     int h2XYsumTH = 0, h2XYsumTH2 = 0,nonMv0ComfirmTH = 0, mv0ComfirmTH=0;
2696 
2697 	static MS_U8 confirm_cnt = 0;
2698 	static MS_U8 confirm_cnt_mv0 = 0;
2699 	static MS_U8 even_cnt = 0;
2700 
2701 	static MS_U8 confirm_cnt_film = 0;
2702 
2703 	//MS_BOOL is_ukoSabihS_isHBurst = ( isHBurstMoving && ( gMv.h2XYdiff > 0x45 )) ? true : false;
2704 
2705 
2706 	isCVBSinput = ((stXCStatus->bInterlace) && (stXCStatus->enInputSourceType >= INPUT_SOURCE_CVBS)&& (stXCStatus->enInputSourceType <= INPUT_SOURCE_CVBS_MAX));
2707 	isTVinput = ((stXCStatus->bInterlace) && (stXCStatus->enInputSourceType == INPUT_SOURCE_TV));
2708 
2709 	if(isHDSrc)
2710 	{
2711 		SpeedUp_TH = 200;
2712 	}
2713 	else
2714 	{
2715 		SpeedUp_TH = 40;
2716 	}
2717 
2718 	if(isCVBSinput || isTVinput)
2719 	{
2720 		XYDiffTH = 0x01;
2721     Confirm_TH =  0x80;
2722 	}
2723 	else
2724 	{
2725 		XYDiffTH = 0x06;
2726     Confirm_TH =0x40 ;
2727 	}
2728 
2729     SpeedUp_TH = 200;
2730     nonMv0ComfirmTH = 0x40;
2731     mv0ComfirmTH = 0x200;
2732     h2XYsumTH = 0x16;
2733     h2XYsumTH2 = 0x32;
2734 
2735     nonMv0ComfirmTH = (nonMv0ComfirmTH * normalize_factor) / 256;
2736     mv0ComfirmTH = (mv0ComfirmTH * normalize_factor) / 256;
2737     h2XYsumTH = (h2XYsumTH * normalize_factor) / 256;
2738     h2XYsumTH2 = (h2XYsumTH2 * normalize_factor) / 256;
2739     SpeedUp_TH = (SpeedUp_TH * normalize_factor) / 256;
2740     XYDiffTH = (XYDiffTH *normalize_factor) / 256;
2741     Confirm_TH = (Confirm_TH *normalize_factor) / 256;
2742 
2743 
2744 	if(isCVBSinput||isTVinput)
2745 	{
2746 		is_ukoSabihS = false;
2747 	}
2748     else if((gMv.h2XYsum > h2XYsumTH)&& (gMv.h2XYdiff <= XYDiffTH)&& (!isMv0) && (nonMv0Comfirm> Confirm_TH ) && isWithoutMv0Comfirm && (isHDSrc) )
2749     {
2750         is_ukoSabihS = true;
2751     }
2752     else if((gMv.h2XYsum > h2XYsumTH2)&& (gMv.h2XYdiff <= XYDiffTH)&& (!isMv0) && (nonMv0Comfirm> Confirm_TH ) && isWithoutMv0Comfirm )
2753    {
2754 		is_ukoSabihS = true;
2755 	}
2756 	else
2757 	{
2758 		is_ukoSabihS = false;
2759 	}
2760 
2761 	if( (!gMv.yMvIsMovingOdd) )
2762 	{
2763 		even_cnt++;
2764 
2765 		if(even_cnt > S_UPPERBOUND_TH)
2766 			even_cnt = S_UPPERBOUND_TH;
2767 	}
2768 	else
2769 	{
2770 		even_cnt = 0;
2771 	}
2772 
2773 	if( is_ukoSabihS )
2774 	{
2775 		if(gMv.h2XYsum > SpeedUp_TH )    /*for Speed up*/
2776 		{
2777 			confirm_cnt = confirm_cnt + 2;
2778 		}
2779 		else
2780 		{
2781 			confirm_cnt++;
2782 		}
2783 
2784 		if(confirm_cnt > S_UPPERBOUND_TH)
2785 			confirm_cnt = S_UPPERBOUND_TH;
2786 	}
2787 	else
2788 	{
2789 		if(gMv.h2XYsum > SpeedUp_TH )    /*for Speed up*/
2790 		{
2791 			if( confirm_cnt > 0 )
2792 				confirm_cnt--;
2793 		}
2794 		else
2795 			confirm_cnt = 0;
2796 	}
2797 
2798 	if (isMcFilm)
2799 	{
2800 		confirm_cnt = 0;
2801 	}
2802 
2803 	if(( confirm_cnt >= S_MATCH_TH)&&( even_cnt >= S_MATCH_TH) )
2804 	{
2805 		*isUkosabihsMc = true;
2806 		//MApi_XC_W2BYTEMSK( REG_SC_BK22_7A_L, 0x1000 , 0x1000 );
2807 	}
2808 	else
2809 	{
2810 		*isUkosabihsMc = false;
2811 		//MApi_XC_W2BYTEMSK( REG_SC_BK22_7A_L, 0x0000 , 0x1000 );
2812 	}
2813 
2814 	if( confirm_cnt >= S_MATCH_TH)
2815 	{
2816 		*isUkosabihsMotion = true;
2817 	}
2818 	else
2819 	{
2820 		*isUkosabihsMotion = false;
2821 	}
2822 
2823 	if( confirm_cnt >= S_MATCH_TH)
2824 	{
2825 		*isUkosabihsForFilm = true;
2826 	}
2827 	else
2828 	{
2829 		*isUkosabihsForFilm = false;
2830 	}
2831 	if( *isUkosabihsForFilm )
2832 	{
2833 		confirm_cnt_film++;
2834 
2835 		if(confirm_cnt_film > S_UPPERBOUND_TH)
2836 			confirm_cnt_film = S_UPPERBOUND_TH;
2837 	}
2838 	else
2839 	{
2840 		confirm_cnt_film = 0;
2841 	}
2842 	if( confirm_cnt_film >= S_MATCH_TH)
2843 	{
2844 		MApi_XC_W2BYTEMSK( REG_SC_BK30_09_L, 0x0001 , 0x0001 );
2845 		//MApi_XC_W2BYTEMSK( REG_SC_BK30_41_L, 0x7000 , 0x7000 );
2846 	}
2847 	else
2848 	{
2849 		MApi_XC_W2BYTEMSK( REG_SC_BK30_09_L, 0x0000 , 0x0001 );
2850 		//MApi_XC_W2BYTEMSK( REG_SC_BK30_41_L, 0x0000 , 0x7000 );
2851 	}
2852 
2853 	if( isFilm )
2854 	{
2855 		//confirm_cnt = 0;
2856 		*isUkosabihsMc = false;
2857 		*isUkosabihsMotion = false;
2858 		even_cnt = 0;
2859 	}
2860 	//==============================================================================================================
2861 
2862     if((gMv.h2XYsum > 0x3)&& (gMv.h2XYdiff <= 1) && (isMv0) && (mv0Comfirm>mv0ComfirmTH))
2863 	{
2864 		is_ukoSabihSmv0 = true;
2865 	}
2866 	else
2867 	{
2868 		is_ukoSabihSmv0 = false;
2869 	}
2870 
2871 	if( is_ukoSabihSmv0 )
2872 	{
2873 		confirm_cnt_mv0++;
2874 
2875 		if(confirm_cnt_mv0 > S_UPPERBOUND_TH )
2876 			confirm_cnt_mv0 = S_UPPERBOUND_TH;
2877 	}
2878 	else
2879 	{
2880 		confirm_cnt_mv0 = 0;
2881 	}
2882 
2883 	if( confirm_cnt_mv0 >= S_MATCH_TH )
2884 	{
2885 		*isUkosabihsMv0 = true;
2886 	}
2887 	else
2888 	{
2889 		*isUkosabihsMv0 = false;
2890 	}
2891 	//==============================================================================================================
2892 
2893 	return ( *isUkosabihsMc || *isUkosabihsMotion );
2894 }
2895 
MDrv_SC_sweep_ukoSabihS(void * pInstance,const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const MS_U16 mv0Comfirm,const XC_FilmStates filmstatus,const MS_BOOL isMcFilm,const MS_U32 uComplex,MS_BOOL * isUkosabihsMotionSweep)2896 MS_BOOL MDrv_SC_sweep_ukoSabihS(void *pInstance, const XC_GMvStates gMv,
2897 				const MS_U16 nonMv0Comfirm, const MS_U16 mv0Comfirm,
2898 				const XC_FilmStates filmstatus, const MS_BOOL isMcFilm,
2899 				const MS_U32 uComplex,
2900 				MS_BOOL *isUkosabihsMotionSweep )
2901 {
2902     MS_BOOL is_ukoSabihS_sweep = FALSE;
2903 	MS_BOOL isMv0 = (( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 )) ? true : false;
2904 	MS_BOOL isFilm = ( filmstatus.film22 || filmstatus.film22 || isMcFilm ) ? true : false;
2905     MS_BOOL isUkosabihsMcSweep = FALSE;
2906 
2907 	static MS_U8 confirm_cnt = 0;
2908 	static MS_U8 even_cnt = 0;
2909 
2910 	if((gMv.h2XYsum > 0x9)&& (gMv.h2XYdiff <= 5) && (!isMv0) && (nonMv0Comfirm>0x300) && (uComplex>0x7300) && (mv0Comfirm <= 10) )
2911 		is_ukoSabihS_sweep = true;
2912 	else
2913 		is_ukoSabihS_sweep = false;
2914 
2915 	if( (!gMv.yMvIsMovingOdd) )
2916 	{
2917 		even_cnt++;
2918 
2919 		if(even_cnt > 10)
2920 			even_cnt = 10;
2921 	}
2922 	else
2923 	{
2924 		even_cnt = 0;
2925 	}
2926 
2927 	if( is_ukoSabihS_sweep )
2928 	{
2929 		confirm_cnt++;
2930 
2931 		if(confirm_cnt > 10)
2932 			confirm_cnt = 10;
2933 	}
2934 	else
2935 	{
2936 		confirm_cnt = 0;
2937 	}
2938 
2939 	if( isFilm )
2940 	{
2941 		confirm_cnt = 0;
2942 		even_cnt = 0;
2943 	}
2944 
2945 	if(( confirm_cnt == 10)&&( even_cnt == 10) )
2946 		isUkosabihsMcSweep = true;
2947 	else
2948 		isUkosabihsMcSweep = false;
2949 
2950 	if( confirm_cnt == 10)
2951 		*isUkosabihsMotionSweep = true;
2952 	else
2953 		*isUkosabihsMotionSweep = false;
2954 
2955 	return isUkosabihsMcSweep;
2956 }
2957 
MDrv_SC_Agate_GMV(void * pInstance,const XC_Me1HisStates H1,const XC_Me1HisStates H2)2958 XC_GMvStates MDrv_SC_Agate_GMV(void *pInstance, const XC_Me1HisStates H1,  const XC_Me1HisStates H2 )
2959 {
2960 	XC_GMvStates gMv;
2961 //	MS_BOOL yIsMovingOdd;
2962 //	MS_BOOL xIsMovingOdd;
2963 //	MS_BOOL isMovingOdd;
2964 
2965 	const MS_U8 const_GMV_X_LUT[9][8] =
2966 	{
2967 		{0,	1,	2,	3,	4,	5,	6,	7 },
2968 		{8,	9,	10,	11,	12,	13,	14,	15},
2969 		{16,	17,	18,	19,	20,	21,	22,	23},
2970 		{24,	25,	26,	27,	28,	29,	30,	31},
2971 		{33,	34,	35,	36,	37,	38,	39,	40},
2972 		{41,	42,	43,	44,	45,	46,	47,	48},
2973 		{49,	50,	51,	52,	53,	54,	55,	56},
2974 		{57,	58,	59,	60,	61,	62,	63,	64},
2975 		{32,	32,	32,	32,	32,	32,	32,	32}
2976 	};
2977 
2978 	const MS_U8 const_GMV_Y_LUT[9][2] =
2979 	{
2980 		{0,		1},
2981 		{2,		3},
2982 		{4,		5},
2983 		{6,		7},
2984 		{9,		10},
2985 		{11,	12},
2986 		{13,	14},
2987 		{15,	16},
2988 		{8,		8}
2989 	};
2990 
2991 	MS_U8 x_h1_idx = H1.minMvXdir;
2992 	MS_U8 x_h2_idx = ( H1.minMvXdir == 8 ) ? 0 : H2.minMvXdir;
2993 	MS_U8 y_h1_idx = H1.minMvYdir;
2994 	MS_U8 y_h2_idx = ( H1.minMvYdir == 8 ) ? 0 : H2.minMvYdir;
2995 
2996 	MS_U8 gm_x = const_GMV_X_LUT[x_h1_idx][x_h2_idx];
2997 	MS_U8 gm_y = const_GMV_Y_LUT[y_h1_idx][y_h2_idx];
2998 
2999 //	xIsMovingOdd = ( gm_x % 2 ) ? true : false;
3000 //	yIsMovingOdd = ( gm_y % 2 ) ? true : false;
3001 //	isMovingOdd = ( xIsMovingOdd | yIsMovingOdd );
3002 
3003 	gMv.minMvXdir 	= gm_x;
3004 	//gMv.minMvXbin	= H1.minMvXBin;
3005 	gMv.h1XYdiff 	= abs(H1.minMvXBin-H1.minMvYBin);
3006 	gMv.h1XYsum 	= H1.minMvXBin+H1.minMvYBin;
3007 	gMv.minMvYdir 	= gm_y;
3008 	//gMv.minMvYbin	= H1.minMvYBin;
3009 	gMv.h2XYdiff 	= abs(H2.minMvXBin-H2.minMvYBin);
3010 	gMv.h2XYsum 	= H2.minMvXBin+H2.minMvYBin;
3011 	gMv.yMvIsMovingOdd = ( gm_y % 2 ) ? true : false;
3012 #if 1
3013 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L,  (gm_x<<8), 0xFF00);
3014 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L,  gm_y, 0x00FF);
3015 
3016 	//DEBUG_LC_Full6bit(gm_x);
3017 	//DEBUG_LC_Full6bit2(gm_y);
3018 
3019 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  (gMv.h2XYdiff), 0xFFFF);
3020 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  (gMv.h1XYdiff<<8), 0xFF00);
3021 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L,  gMv.h2XYdiff, 0x00FF);
3022 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  (gMv.h2XYsum), 0xFFFF);
3023 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  (((gMv.h1XYsum)>>2)<<8), 0xFF00);
3024 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L,  ((gMv.h2XYsum)>>2), 0x00FF);
3025 #endif
3026 
3027 	return gMv;
3028 }
3029 
MDrv_SC_Agate_Hierarchy2(void * pInstance,const XC_Me1HisStates H1)3030 XC_Me1HisStates MDrv_SC_Agate_Hierarchy2(void *pInstance, const XC_Me1HisStates H1 )
3031 {
3032 	MS_U8 me1_X_histogram[8];
3033 	MS_U8 me1_Y_histogram[2];
3034     MS_U8 minXdir = 0, minXdirBin = 0;
3035     MS_U8 minYdir = 0, minYdirBin = 0;
3036 	XC_Me1HisStates H2States;
3037     int dir = 0;
3038 
3039 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L,  H1.minMvXdir , 0x0007 ); /*reg_gmv_h_hier2_sel*/
3040 	MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L,  H1.minMvYdir<<4 , 0x0070 ); /*reg_gmv_h_hier2_sel*/
3041 
3042 	me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0x00FF);
3043 	me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0xFF00) >> 8;
3044 	me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0x00FF);
3045 	me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0xFF00) >> 8;
3046 	me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0x00FF);
3047 	me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0xFF00) >> 8;
3048 	me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0x00FF);
3049 	me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0xFF00) >> 8;
3050 
3051 	me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0x00FF);
3052 	me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0xFF00) >> 8;
3053 
3054    /*FOR Vertical move 8 pixels*/
3055    if((H1.minMvYdir == 7)&&(abs (H1.minMvYBin -(me1_Y_histogram[0] +me1_Y_histogram[1] ))>3))//MV = 7 or 8
3056    	{
3057    		me1_Y_histogram[1] = (MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0xFF00) >> 8) - MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0x00FF); // MV+8 =  (H1+7)  - (MV+7)
3058    	}
3059    else if(H1.minMvYdir == 6 )//MV = 5or 6
3060    	{
3061    		me1_Y_histogram[0]= MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0x00FF)  - (MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0xFF00)>>8);  // MV+5= (H1+6) - (MV+6)
3062    	}
3063 
3064 	//find max histogram
3065 	minXdir = 0;
3066 	minXdirBin = 0;
3067 	for (dir=0; dir<=7 ; dir++)
3068 	{
3069 		if( minXdirBin < me1_X_histogram[dir] )
3070 		{
3071 			minXdir = dir;
3072 			minXdirBin = me1_X_histogram[dir];
3073 		}
3074 	}
3075 
3076 	minYdir = 0;
3077 	minYdirBin = 0;
3078 	for (dir=0; dir<=1 ; dir++)
3079 	{
3080 		if( minYdirBin < me1_Y_histogram[dir] )
3081 		{
3082 			minYdir = dir;
3083 			minYdirBin = me1_Y_histogram[dir];
3084 		}
3085 	}
3086 
3087 	if( H1.minMvXdir == 8 ) //MV0
3088 	{
3089 		H2States.minMvXdir = H1.minMvXdir;
3090 		H2States.minMvXBin = H1.minMvXBin;
3091 	}
3092 	else
3093 	{
3094 		H2States.minMvXdir = minXdir;
3095 		H2States.minMvXBin = minXdirBin;
3096 	}
3097 
3098 	if( H1.minMvYdir == 8 )
3099 	{
3100 		H2States.minMvYdir = H1.minMvYdir;
3101 		H2States.minMvYBin = H1.minMvYBin;
3102 	}
3103 	else
3104 	{
3105 		H2States.minMvYdir = minYdir;
3106 		H2States.minMvYBin = minYdirBin;
3107 	}
3108 
3109 	return H2States;
3110 }
3111 
MDrv_SC_Agate_Hierarchy1(void * pInstance)3112 XC_Me1HisStates MDrv_SC_Agate_Hierarchy1( void *pInstance )
3113 {
3114 	MS_U8 me1_X_histogram[9];
3115 	MS_U8 me1_Y_histogram[9];
3116     MS_U8 minXdir = 0, minXdirBin = 0;
3117     MS_U8 minYdir = 0, minYdirBin = 0;
3118 	XC_Me1HisStates H1States;
3119     int dir = 0;
3120 
3121 	me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
3122 	me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
3123 	me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
3124 	me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
3125 	me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
3126 	me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
3127 	me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
3128 	me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
3129 	me1_X_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
3130 
3131 	me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0x00FF);
3132 	me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0xFF00) >> 8;
3133 	me1_Y_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0x00FF);
3134 	me1_Y_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0xFF00) >> 8;
3135 	me1_Y_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0x00FF);
3136 	me1_Y_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0xFF00) >> 8;
3137 	me1_Y_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0x00FF);
3138 	me1_Y_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0xFF00) >> 8;
3139 	me1_Y_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0xFF00) >> 8;
3140 
3141 	minXdir = 0;
3142 	minXdirBin = 0;
3143 	for ( dir = 0; dir <= 8 ; dir ++ )
3144 	{
3145 		if( minXdirBin < me1_X_histogram[dir] )
3146 		{
3147 			minXdir = dir;
3148 			minXdirBin = me1_X_histogram[dir];
3149 		}
3150 	}
3151 
3152 	minYdir = 0;
3153 	minYdirBin = 0;
3154 	for ( dir = 0; dir <= 8 ; dir ++ )
3155 	{
3156 		if( minYdirBin < me1_Y_histogram[dir] )
3157 		{
3158 			minYdir = dir;
3159 			minYdirBin = me1_Y_histogram[dir];
3160 		}
3161 	}
3162 	H1States.minMvXdir = minXdir;
3163 	H1States.minMvXBin = minXdirBin;
3164 	H1States.minMvYdir = minYdir;
3165 	H1States.minMvYBin = minYdirBin;
3166 
3167 	return H1States;
3168 }
3169 
3170 /******************************************************************************/
3171 /// Einstein Function
3172 ///
3173 /******************************************************************************/
MDrv_RegC_pdnr_me1_smv_nr_strength(void * pInstance,const MS_U8 smvw,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3174 void MDrv_RegC_pdnr_me1_smv_nr_strength(void *pInstance, const MS_U8 smvw, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3175 {
3176 	static MS_U8 qMapDefault = 3;
3177 	MS_U8 setValue;
3178 	static MS_BOOL allowW = false;
3179 	MS_U8 smallMovingW;
3180 
3181 	smallMovingW = 15 - (smvw >> 4);
3182 
3183 	if( (isSourceChange == 1) && (allowW == false) )
3184 	{
3185 		qMapDefault = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK2A_66_L, 0x0F00) >> 8 );
3186 		allowW = true;
3187 	}
3188 
3189 	if( sceneChange )
3190 		setValue = 0x0; /* motion gain is Max when scene change happen */
3191 	else if( smallMovingW > qMapDefault )
3192 		setValue = qMapDefault;
3193 	else
3194 		setValue = smallMovingW;
3195 
3196 	if( allowW )
3197 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, setValue << 8 , 0x0F00);
3198 }
3199 
MDrv_Adaptive_Coring(void * pInstance,const MS_U8 noiseLevel,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3200 void MDrv_Adaptive_Coring(void *pInstance, const MS_U8 noiseLevel, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3201 {
3202 	static MS_U8 qMapPostCoringTh1;
3203 	static MS_U8 qMapPostCoringTh2;
3204 	static MS_U8 noiseL1Cnt = 0, noiseL2Cnt = 0;
3205 
3206 	if( isSourceChange )
3207 	{
3208 		qMapPostCoringTh1 = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x000F );
3209 		qMapPostCoringTh2 = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x00F0 ) >> 4 );
3210 
3211 		noiseL1Cnt = noiseL2Cnt = 0;
3212 	}
3213 	else if( sceneChange )
3214 	{
3215 		MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh1 , 0x000F );
3216 		MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh2 << 4 , 0x00F0 );
3217 
3218 		noiseL1Cnt = noiseL2Cnt = 0;
3219 	}
3220 	else
3221 	{
3222 		if( noiseLevel > 0x40 )
3223 		{
3224 			if( noiseL1Cnt < 16 )
3225 				++noiseL1Cnt;
3226 		}
3227 		else if( noiseL1Cnt > 0 )
3228 			--noiseL1Cnt;
3229 
3230 		if( noiseLevel > 0x80 )
3231 		{
3232 			if( noiseL2Cnt < 16 )
3233 				++noiseL2Cnt;
3234 		}
3235 		else if( noiseL2Cnt > 0 )
3236 			--noiseL2Cnt;
3237 
3238 		MS_U8 postCoringTh1 = ( 0x9 * noiseL2Cnt + 0xE * (16 - noiseL2Cnt) + 8 ) >> 4;
3239 		MS_U8 postCoringTh2 = ( 0xB * noiseL2Cnt + 0xF * (16 - noiseL2Cnt) + 8 ) >> 4;
3240 
3241 		postCoringTh1 = ( postCoringTh1 * noiseL1Cnt + qMapPostCoringTh1 * (16 - noiseL1Cnt) + 8 ) >> 4;
3242 		postCoringTh2 = ( postCoringTh2 * noiseL1Cnt + qMapPostCoringTh2 * (16 - noiseL1Cnt) + 8 ) >> 4;
3243 
3244 		MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh1 , 0x000F );
3245 		MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh2 << 4 , 0x00F0 );
3246 	}
3247 }
3248 
3249 /******************************************************************************/
3250 /// Agate Function
3251 ///
3252 /******************************************************************************/
3253 
3254 
MDrv_SC_Edison_D3D_driver(void * pInstance)3255 void MDrv_SC_Edison_D3D_driver( void *pInstance )
3256 {
3257 	MS_U16 LT_Lev[32];
3258 	MS_U16 RB_Lev[32];
3259     MS_U8 idx = 0;
3260 
3261 	static MS_U32 DIF_LR_sum = 0xFFFF;
3262 	static MS_U32 DIF_TB_sum = 0xFFFF;
3263 //	static MS_U8 D3D_mode=0; //0: video, 1: LR mode, 2:TB mode
3264 	static MS_U8 D3D_ready=0;
3265 	static MS_U8 LRTB_Cnt=0;
3266 	static MS_U32 DIF_LR_sum_prv=0xFFFF;
3267 	static MS_U32 DIF_TB_sum_prv=0xFFFF;
3268 	static MS_BOOL begin_d3d = false;
3269 //	static MS_U16 CB_status = 0;
3270 
3271 	//first time
3272 	if( (LRTB_Cnt == 0) && (begin_d3d == false))
3273 	{
3274 		MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3275 		begin_d3d = true;
3276 	}
3277 
3278 	if( D3D_ready )
3279 	{
3280 		LT_Lev[0]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_10_L, 0xFFFF);
3281 		LT_Lev[1]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_11_L, 0xFFFF);
3282 		LT_Lev[2]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_12_L, 0xFFFF);
3283 		LT_Lev[3]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_13_L, 0xFFFF);
3284 		LT_Lev[4]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_14_L, 0xFFFF);
3285 		LT_Lev[5]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_15_L, 0xFFFF);
3286 		LT_Lev[6]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_16_L, 0xFFFF);
3287 		LT_Lev[7]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_17_L, 0xFFFF);
3288 		LT_Lev[8]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_18_L, 0xFFFF);
3289 		LT_Lev[9]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_19_L, 0xFFFF);
3290 		LT_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1A_L, 0xFFFF);
3291 		LT_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1B_L, 0xFFFF);
3292 		LT_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1C_L, 0xFFFF);
3293 		LT_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1D_L, 0xFFFF);
3294 		LT_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1E_L, 0xFFFF);
3295 		LT_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1F_L, 0xFFFF);
3296 		LT_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_20_L, 0xFFFF);
3297 		LT_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_21_L, 0xFFFF);
3298 		LT_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_22_L, 0xFFFF);
3299 		LT_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_23_L, 0xFFFF);
3300 		LT_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_24_L, 0xFFFF);
3301 		LT_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_25_L, 0xFFFF);
3302 		LT_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_26_L, 0xFFFF);
3303 		LT_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_27_L, 0xFFFF);
3304 		LT_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_28_L, 0xFFFF);
3305 		LT_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_29_L, 0xFFFF);
3306 		LT_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2A_L, 0xFFFF);
3307 		LT_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2B_L, 0xFFFF);
3308 		LT_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2C_L, 0xFFFF);
3309 		LT_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2D_L, 0xFFFF);
3310 		LT_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2E_L, 0xFFFF);
3311 		LT_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2F_L, 0xFFFF);
3312 
3313 		RB_Lev[0]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_30_L, 0xFFFF);
3314 		RB_Lev[1]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_31_L, 0xFFFF);
3315 		RB_Lev[2]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_32_L, 0xFFFF);
3316 		RB_Lev[3]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_33_L, 0xFFFF);
3317 		RB_Lev[4]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_34_L, 0xFFFF);
3318 		RB_Lev[5]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_35_L, 0xFFFF);
3319 		RB_Lev[6]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_36_L, 0xFFFF);
3320 		RB_Lev[7]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_37_L, 0xFFFF);
3321 		RB_Lev[8]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_38_L, 0xFFFF);
3322 		RB_Lev[9]  = MApi_XC_R2BYTEMSK(REG_SC_BK1D_39_L, 0xFFFF);
3323 		RB_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3A_L, 0xFFFF);
3324 		RB_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3B_L, 0xFFFF);
3325 		RB_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3C_L, 0xFFFF);
3326 		RB_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3D_L, 0xFFFF);
3327 		RB_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3E_L, 0xFFFF);
3328 		RB_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3F_L, 0xFFFF);
3329 		RB_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_40_L, 0xFFFF);
3330 		RB_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_41_L, 0xFFFF);
3331 		RB_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_42_L, 0xFFFF);
3332 		RB_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_43_L, 0xFFFF);
3333 		RB_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_44_L, 0xFFFF);
3334 		RB_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_45_L, 0xFFFF);
3335 		RB_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_46_L, 0xFFFF);
3336 		RB_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_47_L, 0xFFFF);
3337 		RB_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_48_L, 0xFFFF);
3338 		RB_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_49_L, 0xFFFF);
3339 		RB_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4A_L, 0xFFFF);
3340 		RB_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4B_L, 0xFFFF);
3341 		RB_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4C_L, 0xFFFF);
3342 		RB_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4D_L, 0xFFFF);
3343 		RB_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4E_L, 0xFFFF);
3344 		RB_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4F_L, 0xFFFF);
3345 
3346 
3347 		if( 0 == (LRTB_Cnt % 2) )
3348 		{
3349 			DIF_LR_sum = 0;
3350 			for( idx = 0; idx < 32; idx++ )
3351 			{
3352 				DIF_LR_sum = DIF_LR_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3353 			}
3354 
3355 			//IIR filter
3356 			DIF_LR_sum = (DIF_LR_sum_prv*3 + DIF_LR_sum)/4;
3357 			DIF_LR_sum_prv = DIF_LR_sum;
3358 		}
3359 		else
3360 		{
3361 			DIF_TB_sum = 0;
3362 			for( idx = 0; idx < 32; idx++ )
3363 			{
3364 				DIF_TB_sum = DIF_TB_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3365 			}
3366 
3367 			//IIR filter
3368 			DIF_TB_sum = (DIF_TB_sum_prv*3 + DIF_TB_sum)/4;
3369 			DIF_TB_sum_prv = DIF_TB_sum;
3370 		}
3371 
3372 		//checkboard status
3373 //		CB_status = MApi_XC_R2BYTEMSK(REG_SC_BK1D_53_L, 0xFFFF);
3374 #if 0
3375 		if((DIF_TB_sum > (4*DIF_LR_sum)) && (DIF_LR_sum < 1000))
3376 			D3D_mode = 1; //LR mode
3377 		else if((DIF_LR_sum > (4*DIF_TB_sum)) && (DIF_TB_sum < 1000))
3378 			D3D_mode = 2; //TB mode
3379 		else if( CB_status > 1000 )
3380 			D3D_mode = 3; //Checkboard mode
3381 		else if( (DIF_LR_sum < 400) && (DIF_TB_sum < 400) )
3382 			D3D_mode = 4; //repeat previous frame
3383 		else
3384 			D3D_mode = 0; //video
3385 #endif
3386 		//for next D3D frame trigger
3387 		if( 0 == (LRTB_Cnt % 2) )
3388 			MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x02, 0x02); //for next frame: top-bottom
3389 		else
3390 			MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x00, 0x02); //for next frame: side-by-side
3391 
3392 		MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3393 	}
3394 
3395 	//for next start
3396 	if( LRTB_Cnt >= 1 )
3397 	{
3398 		LRTB_Cnt=0;
3399 	}
3400 	else
3401 	{
3402 		LRTB_Cnt++;
3403 	}
3404 
3405 	//wait ready signal
3406 	D3D_ready = MApi_XC_R2BYTEMSK(REG_SC_BK1D_50_L, 0x0080)>>7;
3407 }
3408 
MDrv_SC_ResetSourceChange(void * pInstance,const MS_BOOL sourceChangeForME)3409 void MDrv_SC_ResetSourceChange(void *pInstance,const MS_BOOL sourceChangeForME ) //review MERESET
3410 {
3411 
3412 	static MS_U8 u8CurFrameCnt1 = 0;
3413 	static MS_U8 u8CurFrameCnt2 = 0;
3414 	static MS_BOOL meReset = false;
3415 	static MS_BOOL isReset = false;
3416 
3417 	if(sourceChangeForME == 1 )
3418 	{
3419 		if(u8CurFrameCnt1 != 60 )
3420 			u8CurFrameCnt1++;
3421 	}
3422 	else
3423 		u8CurFrameCnt1 = 0;
3424 
3425 	if( meReset )
3426 	{
3427 		if(u8CurFrameCnt2 != 60 )
3428 			u8CurFrameCnt2++;
3429 	}
3430 	else
3431 		u8CurFrameCnt2 = 0;
3432 
3433 	if( (u8CurFrameCnt1 == 30) && (!meReset) )
3434 	{
3435 		meReset = true;
3436 	}
3437 
3438 	if( (u8CurFrameCnt2 == 5) && meReset )
3439 	{
3440 		meReset = false;
3441 		isReset = true;
3442 	}
3443 	else
3444 	{
3445 		isReset = false;
3446 	}
3447 
3448 	if(isReset)
3449 	{
3450 		MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L,  0x0000, 0x0002); /* Reset Init Bit */
3451         u8CurFrameCnt1 = 0;
3452 	}
3453 }
MDrv_SC_Agate_ME_Reset(void * pInstance,const MS_U32 u32MotionValue2,const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY,const MS_BOOL isSourceChange)3454 MS_BOOL MDrv_SC_Agate_ME_Reset(void *pInstance, const MS_U32 u32MotionValue2, const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY, const MS_BOOL isSourceChange  )//review MERESET
3455 {
3456 	static MS_U8 u8CurFrameCnt1 = 0;
3457 	static MS_U8 u8CurFrameCnt2 = 0;
3458 	static MS_BOOL meReset = false;
3459 	MS_BOOL meResetFlag = false;
3460 
3461 	if (u32MotionValue2 == 0 )
3462 	{
3463 		if(u8CurFrameCnt1 != 60 )
3464 			u8CurFrameCnt1++;
3465 	}
3466 	else
3467 	{
3468 		u8CurFrameCnt1 = 0;
3469 	}
3470 
3471 	if ( meReset )
3472 	{
3473 		if(u8CurFrameCnt2 != 60 )
3474 			u8CurFrameCnt2++;
3475 	}
3476 	else
3477 	{
3478 		u8CurFrameCnt2 = 0;
3479 	}
3480 
3481 	if( (u8CurFrameCnt1 == 30) && (!meReset) )
3482 	{
3483 		meReset = true;
3484 	}
3485 
3486 	if( (u8CurFrameCnt2 == 5) && meReset )
3487 	{
3488 		meReset = false;
3489 		meResetFlag = true;
3490 	}
3491 	else
3492 	{
3493 		meResetFlag = false;
3494 	}
3495 
3496 	if( meReset || isSceneChangeMc || isSceneChangeY || isSourceChange)
3497 	{
3498 		MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L,  0x0011, 0x0011);
3499 	}
3500 	else
3501 	{
3502 		MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L,  0x0000, 0x0011);
3503 	}
3504 	return meResetFlag;
3505 }
3506 
3507 /******************************************************************************/
3508 ///Read ME value (F2 ME status)
3509 ///@return MS_U16: Motion value
3510 /******************************************************************************/
MDrv_SC_read_avgMcnrMovingWeightMin(void * pInstance)3511 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMin(void *pInstance)
3512 {
3513 	MS_U16 cur;
3514 	static MS_U16 prv = 0;
3515 
3516 	cur = MApi_XC_R2BYTE(REG_SC_BK09_68_L);
3517 	cur = ((prv*3 )+ cur ) >> 2;
3518 	prv = cur;
3519 
3520 	return prv;
3521 }
3522 
MDrv_SC_read_avgMcnrMovingWeight(void * pInstance)3523 MS_U16 MDrv_SC_read_avgMcnrMovingWeight(void *pInstance)
3524 {
3525 	MS_U16 cur;
3526 	static MS_U16 prv = 0;
3527 
3528 	cur = MApi_XC_R2BYTE(REG_SC_BK09_6A_L);
3529 	cur = ((prv*3 )+ cur ) >> 2;
3530 	prv = cur;
3531 
3532 	return prv;
3533 }
3534 
MDrv_SC_read_avgMcnrMovingWeightMax(void * pInstance)3535 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMax(void *pInstance)
3536 {
3537 	MS_U16 cur;
3538 	static MS_U16 prv = 0;
3539 
3540 	cur = MApi_XC_R2BYTE(REG_SC_BK09_6B_L);
3541 	cur = ((prv*3 )+ cur ) >> 2;
3542 	prv = cur;
3543 
3544 	return prv;
3545 }
3546 
MDrv_SC_read_avgMv0MovingWeight(void * pInstance)3547 MS_U16 MDrv_SC_read_avgMv0MovingWeight(void *pInstance)
3548 {
3549 	MS_U16 cur;
3550 	static MS_U16 prv = 0;
3551 
3552 	cur = MApi_XC_R2BYTE(REG_SC_BK09_69_L);
3553 	cur = ((prv*3 )+ cur ) >> 2;
3554 	prv = cur;
3555 
3556 	return prv;
3557 }
3558 
MDrv_SC_read_me2SadDiff(void * pInstance)3559 MS_U16 MDrv_SC_read_me2SadDiff(void *pInstance)
3560 {
3561 	MS_U16 cur;
3562 	static MS_U16 prv = 0;
3563 
3564 	cur = MApi_XC_R2BYTE(REG_SC_BK09_6C_L);
3565 	cur = ((prv*3 )+ cur ) >> 2;
3566 	prv = cur;
3567 
3568 	return prv;
3569 }
3570 
3571 /******************************************************************************/
3572 ///Read motion value (F2 motion status)
3573 ///@return MS_U8: Motion value
3574 /******************************************************************************/
MDrv_SC_read_motion_value1(void * pInstance)3575 MS_U32 MDrv_SC_read_motion_value1(void *pInstance)
3576 {
3577     MS_U32 u32MotionValue = 0;
3578     MS_U32 u32RegMadi_1C = 0, u32RegMadi_1B = 0, u32RegMadi_1A = 0;
3579 
3580 	u32RegMadi_1C = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F);
3581 	u32RegMadi_1B = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xFF00);
3582 	u32RegMadi_1A = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0x00FF);
3583 
3584 	u32RegMadi_1C = u32RegMadi_1C * 0x10000UL;
3585 
3586 	u32MotionValue = (u32RegMadi_1C + u32RegMadi_1B + u32RegMadi_1A)  ;
3587 
3588 	DRVSCA_DBG(PRT_TRP("MotionValue = 0x%x\n", u32MotionValue));
3589 
3590 	return u32MotionValue;
3591 }
3592 
3593 /******************************************************************************/
3594 ///Read motion value (Motion count status)
3595 ///@return MS_U8: Motion value
3596 /******************************************************************************/
MDrv_SC_read_motion_value2(void * pInstance)3597 MS_U32 MDrv_SC_read_motion_value2(void *pInstance)
3598 {
3599     MS_U32 u32MotionValue = 0;
3600 
3601     u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0x7F);
3602 
3603 	return u32MotionValue;
3604 }
3605 
3606 /******************************************************************************/
3607 ///Read motion value (Motion count status)
3608 ///@return MS_U32: Motion value
3609 /******************************************************************************/
MDrv_SC_read_motion_value3(void * pInstance)3610 MS_U32 MDrv_SC_read_motion_value3(void *pInstance)
3611 {
3612     MS_U32 u32MotionValue = 0;
3613 
3614 	u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_18_L, 0x0FFF);
3615 
3616 	return u32MotionValue;
3617 }
3618 
MDrv_SC_read_motion_value4(void * pInstance)3619 MS_U16 MDrv_SC_read_motion_value4(void *pInstance)
3620 {
3621     MS_U16 motionValue = 0;
3622 
3623 	motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0x7FFF);
3624 
3625 	return motionValue;
3626 }
3627 
3628 //-------------------------------------------------------------------------------------------------
3629 /// Read motion value (Motion count status)
3630 /// @return MS_U8: Motion value
3631 //-------------------------------------------------------------------------------------------------
Hal_PQ_GetCurrentMotionValue(void * pInstance)3632 MS_U8 Hal_PQ_GetCurrentMotionValue(void *pInstance)
3633 {
3634     MS_U8 u8MotionValue = 0;
3635 
3636 	u8MotionValue  = (MS_U8)((MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F) << 2)
3637 		|(MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xC000) >> 6));
3638 
3639 	return u8MotionValue;
3640 }
3641 
3642 /******************************************************************************/
3643 ///Read VCnt value
3644 ///@return MS_U8: VCnt value
3645 /******************************************************************************/
MDrv_SC_read_v_cnt(void * pInstance)3646 MS_U8 MDrv_SC_read_v_cnt(void *pInstance)
3647 {
3648     MS_U8 u8VCnt = 0;
3649 	u8VCnt = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0xC0) >> 6);
3650 	return u8VCnt;
3651 }
3652 
3653 /******************************************************************************/
3654 ///Read SDHDD Detect Threshold value
3655 ///@return MS_U16: HDSDD_Det_Threshold value
3656 /******************************************************************************/
MDrv_SC_read_HDSDD_Det_Threshold_value(void * pInstance)3657 MS_U16 MDrv_SC_read_HDSDD_Det_Threshold_value(void *pInstance)
3658 {
3659     MS_U16 u16Value = 0;
3660 
3661 	u16Value = (MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK22_7F_L, 0xFFFF);
3662 
3663 	return u16Value;
3664 }
3665 
3666 /******************************************************************************/
3667 ///Read DLC 32 section Histogram Data
3668 ///@return MS_U16: 32 section Histogram Data
3669 /******************************************************************************/
3670 
MDrv_SC_GetLumaHistogram(void * pInstance)3671 XC_LumaHistogramStates MDrv_SC_GetLumaHistogram(void *pInstance)
3672 {
3673 	XC_LumaHistogramStates lumaStatus;
3674 	lumaStatus.lumaBin[0] =  MApi_XC_R2BYTE( REG_SC_BK1A_40_L );
3675 	lumaStatus.lumaBin[1] =  MApi_XC_R2BYTE( REG_SC_BK1A_41_L );
3676 	lumaStatus.lumaBin[2] =  MApi_XC_R2BYTE( REG_SC_BK1A_42_L );
3677 	lumaStatus.lumaBin[3] =  MApi_XC_R2BYTE( REG_SC_BK1A_43_L );
3678 	lumaStatus.lumaBin[4] =  MApi_XC_R2BYTE( REG_SC_BK1A_44_L );
3679 	lumaStatus.lumaBin[5] =  MApi_XC_R2BYTE( REG_SC_BK1A_45_L );
3680 	lumaStatus.lumaBin[6] =  MApi_XC_R2BYTE( REG_SC_BK1A_46_L );
3681 	lumaStatus.lumaBin[7] =  MApi_XC_R2BYTE( REG_SC_BK1A_47_L );
3682 	lumaStatus.lumaBin[8] =  MApi_XC_R2BYTE( REG_SC_BK1A_48_L );
3683 	lumaStatus.lumaBin[9] =  MApi_XC_R2BYTE( REG_SC_BK1A_49_L );
3684 	lumaStatus.lumaBin[10] =  MApi_XC_R2BYTE( REG_SC_BK1A_4A_L );
3685 	lumaStatus.lumaBin[11] =  MApi_XC_R2BYTE( REG_SC_BK1A_4B_L );
3686 	lumaStatus.lumaBin[12] =  MApi_XC_R2BYTE( REG_SC_BK1A_4C_L );
3687 	lumaStatus.lumaBin[13] =  MApi_XC_R2BYTE( REG_SC_BK1A_4D_L );
3688 	lumaStatus.lumaBin[14] =  MApi_XC_R2BYTE( REG_SC_BK1A_4E_L );
3689 	lumaStatus.lumaBin[15] =  MApi_XC_R2BYTE( REG_SC_BK1A_4F_L );
3690 	lumaStatus.lumaBin[16] =  MApi_XC_R2BYTE( REG_SC_BK1A_50_L );
3691 	lumaStatus.lumaBin[17] =  MApi_XC_R2BYTE( REG_SC_BK1A_51_L );
3692 	lumaStatus.lumaBin[18] =  MApi_XC_R2BYTE( REG_SC_BK1A_52_L );
3693 	lumaStatus.lumaBin[19] =  MApi_XC_R2BYTE( REG_SC_BK1A_53_L );
3694 	lumaStatus.lumaBin[20] =  MApi_XC_R2BYTE( REG_SC_BK1A_54_L );
3695 	lumaStatus.lumaBin[21] =  MApi_XC_R2BYTE( REG_SC_BK1A_55_L );
3696 	lumaStatus.lumaBin[22] =  MApi_XC_R2BYTE( REG_SC_BK1A_56_L );
3697 	lumaStatus.lumaBin[23] =  MApi_XC_R2BYTE( REG_SC_BK1A_57_L );
3698 	lumaStatus.lumaBin[24] =  MApi_XC_R2BYTE( REG_SC_BK1A_58_L );
3699 	lumaStatus.lumaBin[25] =  MApi_XC_R2BYTE( REG_SC_BK1A_59_L );
3700 	lumaStatus.lumaBin[26] =  MApi_XC_R2BYTE( REG_SC_BK1A_5A_L );
3701 	lumaStatus.lumaBin[27] =  MApi_XC_R2BYTE( REG_SC_BK1A_5B_L );
3702 	lumaStatus.lumaBin[28] =  MApi_XC_R2BYTE( REG_SC_BK1A_5C_L );
3703 	lumaStatus.lumaBin[29] =  MApi_XC_R2BYTE( REG_SC_BK1A_5D_L );
3704 	lumaStatus.lumaBin[30] =  MApi_XC_R2BYTE( REG_SC_BK1A_5E_L );
3705 	lumaStatus.lumaBin[31] =  MApi_XC_R2BYTE( REG_SC_BK1A_5F_L );
3706 
3707 	return lumaStatus;
3708 }
3709 
3710 #define Confirm_Gain         5
MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(void * pInstance,MS_U16 * me1IsMv0,MS_U16 * me1IsNonMv0,MS_U16 * me1IsNotFound)3711 MS_U16 MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(void *pInstance,MS_U16 *me1IsMv0, MS_U16 *me1IsNonMv0, MS_U16 *me1IsNotFound )
3712 {
3713     MS_U16 MV0_Comfirm = 0,  nonMV0_Comfirm = 0, MV_Contradict = 0;
3714 	static MS_U16 Prev_MV0_Comfirm = 0;
3715 	static MS_U16 Prev_nonMV0_Comfirm = 0;
3716 	static MS_U16 Prev_MV_Contradict = 0;
3717     MS_U16 MV_Comfirm = 0;
3718     MS_U16 MR_Offset = 0;
3719 
3720 	MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
3721 	nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
3722 	MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
3723 
3724 	MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3725 	Prev_MV0_Comfirm = MV0_Comfirm;
3726 
3727 	nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3728 	Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3729 
3730 	MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3731 	Prev_MV_Contradict = MV_Contradict;
3732 
3733 	MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3734 
3735 	if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3736 		MR_Offset = nonMV0_Comfirm;
3737 	else
3738 		MR_Offset = 0;
3739 
3740 	*me1IsMv0 = MV0_Comfirm;
3741 	*me1IsNonMv0 = nonMV0_Comfirm;
3742 	*me1IsNotFound = MV_Contradict;
3743 
3744 	return MR_Offset;
3745 }
3746 
MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(void * pInstance,MS_U16 * me2IsMv0,MS_U16 * me2IsNonMv0,MS_U16 * me2IsNotFound)3747 MS_U16 MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(void *pInstance,MS_U16 *me2IsMv0, MS_U16 *me2IsNonMv0, MS_U16 *me2IsNotFound)
3748 {
3749     MS_U16 MV0_Comfirm = 0,  nonMV0_Comfirm = 0, MV_Contradict = 0;
3750 	static MS_U16 Prev_MV0_Comfirm = 0;
3751 	static MS_U16 Prev_nonMV0_Comfirm = 0;
3752 	static MS_U16 Prev_MV_Contradict = 0;
3753     MS_U16 MV_Comfirm = 0;
3754     MS_U16 MR_Offset = 0;
3755 
3756 	MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
3757 	nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
3758 	MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
3759 
3760 	MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3761 	Prev_MV0_Comfirm = MV0_Comfirm;
3762 
3763 	nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3764 	Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3765 
3766 	MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3767 	Prev_MV_Contradict = MV_Contradict;
3768 
3769 	MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3770 
3771 	if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3772 		MR_Offset = nonMV0_Comfirm;
3773 	else
3774 		MR_Offset = 0;
3775 
3776 	*me2IsMv0 = MV0_Comfirm;
3777 	*me2IsNonMv0 = nonMV0_Comfirm;
3778 	*me2IsNotFound = MV_Contradict;
3779 
3780 	return MR_Offset;
3781 }
3782 
3783 #define ScenceChange_TH        0x1000
MDrv_SC_Agate_SceneChangeY(void * pInstance,const XC_LumaHistogramStates lumaHistogram)3784 MS_BOOL MDrv_SC_Agate_SceneChangeY(void *pInstance, const  XC_LumaHistogramStates lumaHistogram )
3785 {
3786 	//XC_DLC_ApiStatus DLC_Status;
3787 	//MApi_XC_DLC_GetStatus_Ex(&DLC_Status,MAIN_WINDOW);
3788 	static MS_U16 Pre_LumaHistogram[32], Max_HistogramDiff = 0;
3789 	MS_U16 HistogramDiff = 0;
3790     int i = 0;
3791 
3792 	for(i=0;i<32;i++)
3793 	{
3794 		if(lumaHistogram.lumaBin[i] >= Pre_LumaHistogram[i])
3795 		{
3796 			HistogramDiff = lumaHistogram.lumaBin[i] - Pre_LumaHistogram[i];
3797 		}
3798 		else
3799 		{
3800 			HistogramDiff = Pre_LumaHistogram[i] - lumaHistogram.lumaBin[i];
3801 		}
3802 
3803 		if(HistogramDiff > Max_HistogramDiff)
3804 		{
3805 			Max_HistogramDiff = HistogramDiff;
3806 		}
3807 
3808 		Pre_LumaHistogram[i] = lumaHistogram.lumaBin[i];
3809 	}
3810 
3811 	if( Max_HistogramDiff > ScenceChange_TH )
3812 	{
3813 		Max_HistogramDiff = 0;
3814 		return true;
3815 	}
3816 	else
3817 	{
3818 		Max_HistogramDiff = 0;
3819 		return false;
3820 	}
3821 }
3822 
MDrv_SC_Agate_SceneChangeMc(void * pInstance,const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0,const MS_U16 me1IsNotFound,const MS_U16 me2IsMv0,const MS_U16 me2IsNonMv0,const MS_U16 me2IsNotFound)3823 MS_BOOL MDrv_SC_Agate_SceneChangeMc(void *pInstance,const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0, const MS_U16 me1IsNotFound,
3824 				    const MS_U16 me2IsMv0, const MS_U16 me2IsNonMv0, const MS_U16 me2IsNotFound)
3825 {
3826     MS_U16 me1Comfirm = 0;
3827     MS_U16 me2Comfirm = 0;
3828 	static MS_BOOL isNotFound           = false;
3829 	static MS_BOOL isScencChange        = false;
3830 
3831 	static MS_U8 notFoundDelayCnt = 0;
3832 	static MS_U8 scencChangeDelayCnt = 0;
3833 
3834 	me1Comfirm = me1IsMv0 + me1IsNonMv0;
3835 	me2Comfirm = me2IsMv0 + me2IsNonMv0;
3836 
3837 	if((me1IsNotFound > me1Comfirm*5)&&(me2IsNotFound > me2Comfirm*5) &&
3838 		(me1IsNotFound > 0x10) && (me2IsNotFound > 0x10) )/* not found*/
3839 	{
3840 		isNotFound = true;
3841 	}
3842 
3843 	if( isNotFound )
3844 	{
3845 		if( notFoundDelayCnt != 60 )
3846 			notFoundDelayCnt++;
3847 	}
3848 
3849 	if( notFoundDelayCnt > 10 )
3850 	{
3851 		if((me1IsNotFound*5 < me1Comfirm)&&(me2IsNotFound*5 < me2Comfirm) &&
3852 			(me1Comfirm > 0x10) && (me2Comfirm > 0x10) )/* found */
3853 		{
3854 			isScencChange = true;
3855 		}
3856 		else
3857 		{
3858 			isScencChange = false;
3859 		}
3860 
3861 		notFoundDelayCnt = 0;
3862 		isNotFound = false;
3863 	}
3864 
3865 	if( isScencChange )
3866 	{
3867 		if( scencChangeDelayCnt != 60 )
3868 			scencChangeDelayCnt++;
3869 	}
3870 
3871 	if( scencChangeDelayCnt > 5 )
3872 	{
3873 		scencChangeDelayCnt = 0;
3874 		isScencChange = false;
3875 	}
3876 
3877 	return isScencChange;
3878 }
3879 
3880 #define HIS_MOTION_TH 0x0A
MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)3881 MS_BOOL MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)
3882 {
3883 	if( u32MotionValue < HIS_MOTION_TH )
3884 	{
3885 		return TRUE;                            //Still pattern
3886 	}
3887 	else
3888 	{
3889 		return FALSE;                           //Moving pattern
3890 	}
3891 }
3892 
3893 #define HIS_MOTION_TH2 0x30
MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)3894 MS_BOOL MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)
3895 {
3896 	if( u32MotionValue < HIS_MOTION_TH2 )
3897 	{
3898 		return TRUE;                            //Still pattern
3899 	}
3900 	else
3901 	{
3902 		return FALSE;                           //Moving pattern
3903 	}
3904 }
3905 
3906 
3907 #define Feather_Sum_TH 0x1500
3908 #define Feather_Sum_TH2 0x230
MDrv_SC_TotalFeather_Sum_Status(void * pInstance,const MS_U16 featherAndMotion,const MS_BOOL isSD_source,MS_BOOL * Feather_sum_status2)3909 MS_BOOL MDrv_SC_TotalFeather_Sum_Status(void *pInstance,const MS_U16 featherAndMotion, const MS_BOOL isSD_source, MS_BOOL *Feather_sum_status2 )
3910 {
3911     MS_U32 SD2HD_Feather = 0;
3912 	static MS_U32 SD2HD_Feather_iir = 0;
3913 	MS_BOOL isFeatherAndMotion = ( featherAndMotion > 0x10 ) ? true : false;
3914 
3915     MS_BOOL isFeather1 = FALSE, isFeather2 = FALSE;
3916 
3917 	static MS_U8 confirm_cnt1 = 0;
3918 	static MS_U8 confirm_cnt2 = 0;
3919 
3920 	SD2HD_Feather    = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
3921 	SD2HD_Feather = ((SD2HD_Feather_iir*3 )+ SD2HD_Feather ) >> 2;
3922 	SD2HD_Feather_iir = SD2HD_Feather;
3923 
3924 	if( (SD2HD_Feather_iir > Feather_Sum_TH2) &&(isSD_source) && (!isFeatherAndMotion) )
3925 		//*Feather_sum_status2 = true;
3926 		isFeather2 = true;
3927 	else
3928 		//*Feather_sum_status2 = false;
3929 		isFeather2 = false;
3930 
3931 	if( (SD2HD_Feather_iir > Feather_Sum_TH) &&(isSD_source) && (!isFeatherAndMotion) )
3932 		isFeather1 = true;
3933 	else
3934 		isFeather1 = false;
3935 
3936 	if( isFeather2 )
3937 	{
3938 		if( confirm_cnt2 < 120 )
3939 			confirm_cnt2++;
3940 	}
3941 	else
3942 	{
3943 		confirm_cnt2 = 0;
3944 	}
3945 
3946 	if( isFeather1 )
3947 	{
3948 		if( confirm_cnt1 < 120 )
3949 			confirm_cnt1++;
3950 	}
3951 	else
3952 	{
3953 
3954 		confirm_cnt1 = 0;
3955 	}
3956 
3957 
3958 	if( confirm_cnt2 > 60 )
3959 		*Feather_sum_status2 = true;
3960 	else
3961 		*Feather_sum_status2 = false;
3962 
3963 	return ( confirm_cnt1 > 60 );
3964 }
3965 
MDrv_SC_ScenceChangeDetectByNotFound(void * pInstance,const MS_U16 mvNotFound_noIIR)3966 MS_BOOL MDrv_SC_ScenceChangeDetectByNotFound(void *pInstance,const MS_U16 mvNotFound_noIIR)
3967 {
3968 	static MS_U16 mvNotFound_noIIR_pre = 0;
3969     MS_U16 Diff_notFound = 0;
3970 
3971 	if(mvNotFound_noIIR > mvNotFound_noIIR_pre)
3972 	{
3973 		Diff_notFound = mvNotFound_noIIR - mvNotFound_noIIR_pre;
3974 	}
3975 	else
3976 	{
3977 		Diff_notFound = mvNotFound_noIIR_pre - mvNotFound_noIIR;
3978 	}
3979 
3980 	if(Diff_notFound > 0x10)
3981 	{
3982 		if( (mvNotFound_noIIR > (mvNotFound_noIIR_pre*2)) || (mvNotFound_noIIR < (mvNotFound_noIIR_pre*2)) )
3983 		{
3984 			mvNotFound_noIIR_pre = mvNotFound_noIIR;
3985 			return true;
3986 		}
3987 		else
3988 		{
3989 			mvNotFound_noIIR_pre = mvNotFound_noIIR;
3990 			return false;
3991 		}
3992 	}
3993 	else
3994 	{
3995 		return false;
3996 	}
3997 }
3998 
3999 #define TIME_SHARING_DELAY 4
4000 #define TIME_SHARING_MAX_ID 4
MDrv_SC_TimeSharing(void * pInstance,const XC_OpFrameStates opFrameStatusCur,MS_U8 * timingSegment,MS_BOOL isSourceChangeFlag)4001 MS_U8 MDrv_SC_TimeSharing(void *pInstance, const XC_OpFrameStates opFrameStatusCur,  MS_U8 *timingSegment , MS_BOOL isSourceChangeFlag)
4002 {
4003 	static XC_OpFrameStates opFrameStatusLast;
4004 	static MS_U8 timingId = 0;
4005 
4006 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4007 		timingId++;
4008 
4009 	if( timingId == (TIME_SHARING_DELAY*TIME_SHARING_MAX_ID) || isSourceChangeFlag == 1)
4010 		timingId = 0;
4011 
4012 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4013 
4014 	// return
4015 	*timingSegment = ( timingId % TIME_SHARING_DELAY ) ;
4016 	return ( timingId / TIME_SHARING_DELAY );
4017 }
4018 
MDrv_SC_OpFrame_Status(void * pInstance)4019 XC_OpFrameStates MDrv_SC_OpFrame_Status(void *pInstance)
4020 {
4021 	XC_OpFrameStates opFrameStatus;
4022 
4023 	opFrameStatus.curOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_3A_L, 0x00F0) >> 4 );
4024 	opFrameStatus.maxOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_19_L, 0x001F) >> 0 );
4025 
4026 	return opFrameStatus;
4027 }
4028 
MDrv_SC_Film_Status(void * pInstance)4029 XC_FilmStates MDrv_SC_Film_Status(void *pInstance)
4030 {
4031 	XC_FilmStates filmstatus;
4032 
4033 	filmstatus.film22 = FALSE;
4034 	filmstatus.film32 = FALSE;
4035 	filmstatus.filmany = FALSE;
4036 	filmstatus.film_act = FALSE;
4037 
4038 	if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0008) == 0x0008)   // film22
4039 	{
4040 		filmstatus.film22 = TRUE;
4041 	}
4042 	if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0010) == 0x0010)   // film32
4043 	{
4044 		filmstatus.film32 = TRUE;
4045 	}
4046 
4047 	if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0040) == 0x0040)   // film any
4048 	{
4049 		filmstatus.filmany = TRUE;
4050 	}
4051 
4052 	if(filmstatus.film22 ||filmstatus.film32 ||filmstatus.filmany)
4053 	{
4054 		filmstatus.film_act = TRUE;
4055 	}
4056 
4057 	return filmstatus;
4058 }
4059 
MDrv_SC_KFC_EODiW_Ctrl(void * pInstance,const MS_BOOL isUkosabihsMc)4060 void MDrv_SC_KFC_EODiW_Ctrl(void *pInstance, const MS_BOOL isUkosabihsMc )
4061 {
4062     MS_U16 reg = 0;
4063 
4064 	if( isUkosabihsMc )
4065 		reg = 0x0000; /* disable kfcEodiW  */
4066 	else
4067 		reg = 0x00C0; /* enable kfcEodiW  */
4068 
4069 	MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x00C0 );
4070 }
4071 
MDrv_SC_Mcdi_EODiW_Ctrl(void * pInstance,const MS_BOOL isUkosabihsMc,const MS_BOOL isL107)4072 void MDrv_SC_Mcdi_EODiW_Ctrl(void *pInstance, const MS_BOOL isUkosabihsMc, const MS_BOOL isL107 )
4073 {
4074     MS_U16 reg = 0;
4075 
4076 	if( isUkosabihsMc || isL107 )
4077     {
4078         reg = 0x0000; /* disable mcEodiW */
4079         //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==0\n\n");
4080     }
4081 	else
4082     {
4083         reg = 0x0080; /* enable mcEodiW */
4084         //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==80\n\n");
4085     }
4086 
4087     MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x0080 );
4088 }
4089 
MDrv_SC_Force_Mcdi_Ctrl(void * pInstance,const MS_BOOL isUkosabihsMc)4090 void MDrv_SC_Force_Mcdi_Ctrl(void *pInstance, const MS_BOOL isUkosabihsMc)
4091 {
4092     MS_U16 reg_force_mcdi = 0;
4093 
4094 	if( isUkosabihsMc )
4095 		reg_force_mcdi = 0x8080;
4096 	else
4097 		reg_force_mcdi = 0x0000;
4098 
4099 	MApi_XC_W2BYTEMSK( REG_SC_BK2A_2F_L, reg_force_mcdi , 0xFFFF );
4100 }
4101 
MDrv_SC_Force_Motion_Ctrl(void * pInstance,const MS_BOOL isL139,const MS_BOOL isUkosabihsMotion)4102 void MDrv_SC_Force_Motion_Ctrl(void *pInstance, const MS_BOOL isL139, const MS_BOOL isUkosabihsMotion )
4103 {
4104     MS_U16 reg_force_motion;
4105     MS_U32 mv0_feather, nonMv0_feather;
4106     MS_U32 total_feather;
4107 
4108     mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4109     nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
4110 
4111     total_feather =  mv0_feather + nonMv0_feather;
4112 
4113     if( (isUkosabihsMotion)&&(total_feather< 0x1200))
4114 	{
4115 		reg_force_motion = 0x008F; /* full motion */
4116 	}
4117 	else if( isL139 )
4118 	{
4119 		reg_force_motion = 0x0080; /* full still */
4120 	}
4121 	else
4122 	{
4123 		reg_force_motion = 0x0000;
4124 	}
4125 
4126 	MApi_XC_W2BYTEMSK(REG_SC_BK22_78_L, reg_force_motion, 0x00FF);
4127 }
4128 
4129 #define reg_mcdi_feather_gain_MaxValue 0x02
4130 #define reg_mcdi_feather_gain_MinValue 0x00
MDrv_SC_KFC_Ctrl(void * pInstance,const MS_BOOL isAbihsot)4131 void MDrv_SC_KFC_Ctrl(void *pInstance, const MS_BOOL isAbihsot )
4132 {
4133 	static MS_U16 u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4134 
4135 	if( isAbihsot )
4136 	{
4137 		if(u16regmcdifeathergain > reg_mcdi_feather_gain_MinValue)
4138 			u16regmcdifeathergain--;
4139 		else
4140 			u16regmcdifeathergain = reg_mcdi_feather_gain_MinValue;
4141 	}
4142 	else
4143 	{
4144 		if(u16regmcdifeathergain < reg_mcdi_feather_gain_MaxValue)
4145 			u16regmcdifeathergain++;
4146 		else
4147 			u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4148 	}
4149 
4150         //Dummy to control write value, add by Bella 20150708
4151         if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x000F)!=0x0000)
4152         {
4153             MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x0F00);
4154         }
4155         else
4156         {
4157 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)u16regmcdifeathergain << 8, 0x0F00);
4158         }
4159 }
MDrv_SC_SourceChange(void * pInstance)4160 MS_BOOL MDrv_SC_SourceChange(void *pInstance)
4161 {
4162 	static MS_BOOL bprevSourceChange = false;
4163 
4164 	MS_BOOL sourceChangeInitReg = MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0001);
4165 	sourceChangeInitReg = sourceChangeInitReg&&(!bprevSourceChange);
4166 
4167 	if( sourceChangeInitReg == 1 )
4168 	{
4169 		MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, sourceChangeInitReg << 1, 0x0002);
4170 	}
4171 	else
4172 		MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, 0x0000, 0x0001);
4173 
4174 	bprevSourceChange = sourceChangeInitReg;
4175 	return sourceChangeInitReg;
4176 }
4177 
MDrv_SC_SourceChangeFlag(void * pInstance,MS_BOOL SourceChangeLastTime)4178 MS_BOOL MDrv_SC_SourceChangeFlag(void *pInstance,MS_BOOL SourceChangeLastTime)
4179 {
4180 	static MS_BOOL bsourceChangeFrm1 = false;
4181 	static MS_BOOL bsourceChangeFrm2 = false;
4182 	static MS_BOOL bsourceChangeFrm3 = false;
4183 
4184 	MS_BOOL sourceChangeFlag = bsourceChangeFrm1 || bsourceChangeFrm2 || bsourceChangeFrm3 || SourceChangeLastTime;
4185 
4186 	bsourceChangeFrm1 = bsourceChangeFrm2;
4187 	bsourceChangeFrm2 = bsourceChangeFrm3;
4188 	bsourceChangeFrm3 = SourceChangeLastTime;
4189 
4190 
4191 	return sourceChangeFlag;
4192 }
4193 
4194 #define VerticalMovingUdRatio_MaxValue 0x0F
4195 #define VerticalMovingUdRatio_MinValue 0x07
MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(void * pInstance,const MS_U32 inSearchUseFeather,MS_BOOL isfilmLike)4196 void MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(void *pInstance,const MS_U32 inSearchUseFeather, MS_BOOL isfilmLike )
4197 {
4198 	static MS_U16 u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4199 
4200 	if( inSearchUseFeather > 0x300 )
4201 	{
4202 		if ( u16VerticalMovingUdRatioValue > VerticalMovingUdRatio_MinValue)
4203 			u16VerticalMovingUdRatioValue--;
4204 		else
4205 			u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MinValue;
4206 	}
4207 	else
4208 	{
4209 		if ( u16VerticalMovingUdRatioValue < VerticalMovingUdRatio_MaxValue)
4210 			u16VerticalMovingUdRatioValue++;
4211 		else
4212 			u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4213 	}
4214 
4215 	if ( isfilmLike )
4216 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, 0, 0x000F);
4217 	else
4218 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, (MS_U16)u16VerticalMovingUdRatioValue, 0x000F);
4219 
4220 }
4221 
4222 #define KFC_8bitMotionGain_MaxValue 0x08
4223 #define KFC_8bitMotionGain_MinValue 0x04 //0 have feather issue.
MDrv_SC_KFC_8bitMotionGain_Ctrl(void * pInstance,const MS_BOOL isZoomIn,const MS_BOOL isFilmLike,const MS_BOOL McSmallMoving)4224 void MDrv_SC_KFC_8bitMotionGain_Ctrl(void *pInstance,const MS_BOOL isZoomIn, const MS_BOOL isFilmLike, const MS_BOOL McSmallMoving )
4225 {
4226 	static MS_U16 u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4227 
4228 	if( isFilmLike || McSmallMoving )
4229 	{
4230 		if ( u16KFC8bitMotionGainValue < 0x0F/*Max*/ )
4231 			u16KFC8bitMotionGainValue++;
4232 		else
4233 			u16KFC8bitMotionGainValue = 0x0F;
4234 	}
4235 	else if( isZoomIn  )
4236 	{
4237 		//MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x1000, 0x1000);
4238 		if ( u16KFC8bitMotionGainValue > KFC_8bitMotionGain_MinValue)
4239 			u16KFC8bitMotionGainValue--;
4240 		else
4241 			u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MinValue;
4242 	}
4243 	else
4244 	{
4245 		//MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x0000, 0x1000);
4246 		if ( u16KFC8bitMotionGainValue < KFC_8bitMotionGain_MaxValue)
4247 			u16KFC8bitMotionGainValue++;
4248 		else
4249 			u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4250 	}
4251 
4252 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_3B_L, (MS_U16)u16KFC8bitMotionGainValue<<4, 0x00F0);
4253 }
4254 
4255 #define DNR_DIV_MAX 4
MDrv_SC_DNR_DIV0_Ctrl(void * pInstance,const MS_BOOL isWeakMcNrFilm,const MS_U8 isSourceChange)4256 void MDrv_SC_DNR_DIV0_Ctrl(void *pInstance, const MS_BOOL isWeakMcNrFilm, const MS_U8 isSourceChange    )
4257 {
4258 	static MS_U8 orgDiv0 = 0;
4259 	static MS_U8 curDiv0 = 0;
4260 
4261 	if( isSourceChange )
4262 		orgDiv0 = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK06_27_L, 0x001C)) >> 2;
4263 
4264 
4265 	if( isWeakMcNrFilm )
4266 	{
4267 		if( curDiv0 < DNR_DIV_MAX )
4268 			curDiv0++;
4269 	}
4270 	else
4271 	{
4272 		if( curDiv0 > orgDiv0 )
4273 			curDiv0--;
4274 	}
4275 
4276 	MApi_XC_W2BYTEMSK(REG_SC_BK06_27_L, ( curDiv0 << 2 ), 0x001C);
4277 }
4278 
4279 #define REG_W3_FinialGain_MAX  0x0F
4280 #define REG_W3_FinialGain_MIN   0x08
MDrv_SC_MCNR_PatchW3FinalGain_Ctrl(void * pInstance,const MS_BOOL isWeakMcNrFilm)4281 void MDrv_SC_MCNR_PatchW3FinalGain_Ctrl(void *pInstance, const MS_BOOL isWeakMcNrFilm  )
4282 {
4283 	static MS_U8 reg_patch_w3_final_gain = REG_W3_FinialGain_MIN;
4284 
4285 	if( isWeakMcNrFilm )
4286 	{
4287 		if( reg_patch_w3_final_gain < REG_W3_FinialGain_MAX )
4288 			reg_patch_w3_final_gain++;
4289 	}
4290 	else
4291 	{
4292 		if( reg_patch_w3_final_gain > REG_W3_FinialGain_MIN )
4293 			reg_patch_w3_final_gain--;
4294 	}
4295 
4296 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, ( reg_patch_w3_final_gain << 4 ), 0x00F0 );
4297 }
4298 
MDrv_SC_MotionLimitGain_Ctrl(void * pInstance,const MS_BOOL isL153)4299 void MDrv_SC_MotionLimitGain_Ctrl(void *pInstance, const MS_BOOL isL153 )
4300 {
4301 	if( isL153 )
4302 	{
4303 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
4304 	}
4305 	else
4306 	{
4307 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
4308 	}
4309 }
4310 
MDrv_SC_UCDi_Weight_Boundary_Ctrl(void * pInstance,const XC_Me1HisStates H1)4311 void MDrv_SC_UCDi_Weight_Boundary_Ctrl(void *pInstance, const XC_Me1HisStates H1)
4312 {
4313     MS_BOOL isHorizontalscroll =  ( H1.minMvXdir != 8 ) ? true : false;
4314     if( isHorizontalscroll )
4315     {
4316         MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x1807, 0xFFFF);
4317     }
4318     else
4319     {
4320         MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x0000, 0xFFFF);
4321     }
4322 }
4323 
4324 #define FeatherSstGain_Max 0x0F
4325 #define FeatherSstGain_Min  0x02
MDrv_SC_featherSstGain_Ctrl(void * pInstance,const MS_BOOL isMcFilmSlowMotion)4326 void MDrv_SC_featherSstGain_Ctrl(void *pInstance, const MS_BOOL  isMcFilmSlowMotion )
4327 {
4328 	static MS_U8 reg_featherSstGain =  FeatherSstGain_Min;
4329 
4330 	if( isMcFilmSlowMotion )
4331 	{
4332 		if( reg_featherSstGain < FeatherSstGain_Max )
4333 			reg_featherSstGain++;
4334 	}
4335 	else
4336 	{
4337 		if( reg_featherSstGain > FeatherSstGain_Min )
4338 			reg_featherSstGain--;
4339 	}
4340 
4341 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstGain << 12 ), 0xF000);
4342 }
4343 
4344 #define FeatherSstOffset_Max 0x01 /* default */
4345 #define FeatherSstOffset_Min  0x00
MDrv_SC_featherSstOffset_Ctrl(void * pInstance,const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmSlowMotion,const MS_BOOL favorStill)4346 void MDrv_SC_featherSstOffset_Ctrl(void *pInstance, const XC_OpFrameStates opFrameStatusCur, const MS_BOOL  isMcFilmSlowMotion, const MS_BOOL favorStill )
4347 {
4348 	static MS_U8 reg_featherSstOffset =  FeatherSstOffset_Max;
4349 	static XC_OpFrameStates opFrameStatusLast;
4350 	static MS_U8 frameCnt = 0;
4351 
4352 	if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4353 	{
4354 		if( frameCnt < 16 )
4355 			frameCnt++;
4356 		else
4357 			frameCnt = 0;
4358 	}
4359 
4360 	if( isMcFilmSlowMotion )
4361 	{
4362 		if( reg_featherSstOffset > FeatherSstOffset_Min )
4363 			reg_featherSstOffset--;
4364 	}
4365 	else if( favorStill )
4366 	{
4367 		if( frameCnt == 15 )
4368 		{
4369 			if( reg_featherSstOffset < 0x0F/* max of offset value */ )
4370 				reg_featherSstOffset++;
4371 		}
4372 	}
4373 	else
4374 	{
4375 		if( reg_featherSstOffset < FeatherSstOffset_Max )
4376 			reg_featherSstOffset++;
4377 		else if( reg_featherSstOffset > FeatherSstOffset_Max )
4378 			reg_featherSstOffset--;
4379 	}
4380 
4381 	//PRT_TRP("==reg_featherSstOffset=%x\n",reg_featherSstOffset);
4382 
4383 	opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4384 
4385         //Dummy to control write value, add by Bella 20150708
4386         if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x0F00)!=0x0000)
4387         {
4388             MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x0F00);
4389         }
4390         else
4391         {
4392 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstOffset << 8 ), 0x0F00);
4393 }
4394 }
4395 
MDrv_SC_NR_CheckMotionBigChange(void * pInstance,const MS_BOOL isHDSrc,MS_BOOL * motionBigChange,MS_BOOL * motionBigChange2)4396 void MDrv_SC_NR_CheckMotionBigChange(void *pInstance, const MS_BOOL isHDSrc, MS_BOOL *motionBigChange, MS_BOOL *motionBigChange2 )
4397 {
4398 	static MS_U16 motionValuePrv;
4399     MS_U16 motionValue = 0;
4400 
4401 	motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0xFFFF);
4402 
4403 	*motionBigChange = false;
4404 	*motionBigChange2 = false;
4405 	if ( motionValue != motionValuePrv )
4406 	{
4407 		*motionBigChange =
4408 			( motionValue & 0x7fff )    > 0x80 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4409 			( motionValuePrv & 0x7fff ) > 0x80 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4410 
4411 		if ( isHDSrc )
4412 			*motionBigChange2 =
4413 			( motionValue & 0x7fff )    > 0x800 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4414 			( motionValuePrv & 0x7fff ) > 0x800 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4415 		else
4416 			*motionBigChange2 =
4417 			( motionValue & 0x7fff )    > 0x200 && ( ( motionValue & 0x7fff )    /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4418 			( motionValuePrv & 0x7fff ) > 0x200 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4419 
4420 	}
4421 	motionValuePrv = motionValue;
4422 }
4423 
4424 #define ME_MovingWeight_Max_SD 0x10
4425 #define ME_MovingWeight_Max_HD 0x10
4426 #define ME_MovingWeight_Max2_SD 0x12
4427 #define ME_MovingWeight_Max2_HD 0x12
4428 #define ME_MovingWeight_Min  0x08
4429 
4430 #define MCNR_MOTIONGAIN_MAX2 0xC
4431 #define MCNR_MOTIONGAIN_MAX  0x8
4432 #define MCNR_MOTIONGAIN_MIN  0x7
4433 
4434 #define PDNR_MOTIONGAIN_MAX2 0xC
4435 #define PDNR_MOTIONGAIN_MAX  0x8
4436 #define PDNR_MOTIONGAIN_MIN  0x4
4437 
MDrv_SC_NR_Driver(void * pInstance,const XC_FilmStates filmstatus,const MS_BOOL isHDSrc)4438 void MDrv_SC_NR_Driver(void *pInstance, const XC_FilmStates filmstatus, const MS_BOOL isHDSrc )
4439 {
4440 	static MS_U8 movingWeight = ME_MovingWeight_Max_SD;
4441 	static MS_U8 mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4442 	static MS_U8 pdnr_motionGain = 0x8;
4443 	static MS_U8 isFilmandMotion = 0;
4444 	static MS_U8 stillFrameCnt = 0;
4445 
4446 	// special patch for HQVSD random noise pattern
4447 	static MS_U8 patchHQVSDSlowMotionScenCnt = 0;
4448 	MS_U8 me1_X_histogram[8];
4449     MS_U16 mv0featheringCnt = 0;
4450     MS_U16 mvhistogramMV0Cnt = 0;
4451     MS_U16 mvhistogramNonMV0Cnt = 0;
4452 	// special patch for sec woman in dark
4453 	static MS_U8 patchSecWomanInDarkScnenCnt = 0;
4454 	static MS_U8 mcnrUpdateTableLevelCnt = 0x80;
4455     MS_U8 mcnrUpdateTableLevel = 0;
4456     MS_U16 mcnrMoveStep = 0;
4457 
4458     MS_U32 me1_mv0blk = 0, me1_nonMv0blk = 0;
4459     MS_U32 me2_mv0blk = 0, me2_nonMv0blk = 0;
4460     MS_BOOL movingBlkMoreThanMV0Blk1 = FALSE;
4461     MS_BOOL movingBlkMoreThanMV0Blk2 = FALSE;
4462     MS_BOOL isStill = FALSE;
4463     MS_BOOL isfilmNotfilm22 = FALSE;
4464 
4465     MS_BOOL motionBigChange = FALSE, motionBigChange2 = FALSE;
4466 	MDrv_SC_NR_CheckMotionBigChange(pInstance, isHDSrc, &motionBigChange, &motionBigChange2  );
4467 
4468 	// read status
4469 	me1_mv0blk 	  = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
4470 	me1_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
4471 	me2_mv0blk 	  = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
4472 	me2_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
4473 
4474 	movingBlkMoreThanMV0Blk1 =
4475 		isHDSrc ? ( ( me2_nonMv0blk == 0XFFF ) || ( ( me2_nonMv0blk > 0x1000 ) && ( me2_nonMv0blk > me1_mv0blk*2 ) ) ):
4476 		( ( me1_nonMv0blk > 0x40  ) && ( me1_nonMv0blk > me1_mv0blk/2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me1_mv0blk/2 ) );
4477 
4478 	movingBlkMoreThanMV0Blk2 =
4479 		isHDSrc ? ( ( me1_nonMv0blk > 0x10  ) && ( me1_nonMv0blk > me1_mv0blk*2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk*2 ) ) :
4480 		( ( me1_nonMv0blk > 0x10  ) && ( me1_nonMv0blk > me1_mv0blk/8 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk/4 ) );
4481 
4482 	isStill = ( ( me1_mv0blk > 0x40 ) && ( me1_mv0blk > me1_nonMv0blk/8 ) ) ||
4483 		( ( me1_mv0blk > 0x4  ) && ( me1_nonMv0blk == 0 ) && ( me2_nonMv0blk < 0x40 ) ); // patch for sony tree
4484 
4485 	// special patch for HQVSD random noise pattern
4486 	me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
4487 	me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
4488 	me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
4489 	me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
4490 	me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
4491 	me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
4492 	me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
4493 	me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
4494 
4495 	mv0featheringCnt = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4496 	mvhistogramMV0Cnt = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
4497 	mvhistogramNonMV0Cnt = me1_X_histogram[0] + me1_X_histogram[1] + me1_X_histogram[2] + me1_X_histogram[3] +
4498 		me1_X_histogram[4] + me1_X_histogram[5] + me1_X_histogram[6] + me1_X_histogram[7];
4499 
4500 	if ( motionBigChange || motionBigChange2 )
4501 		patchHQVSDSlowMotionScenCnt = 0;
4502 	else if ( mv0featheringCnt == 0 && // mv0 feathering count
4503 		me2_mv0blk > 0x140 && me2_nonMv0blk < 0xC0 &&
4504 		mvhistogramNonMV0Cnt < 8 &&
4505 		mvhistogramMV0Cnt < 0x20 )
4506 	{
4507 		if ( patchHQVSDSlowMotionScenCnt <= 0xf0 )
4508 			patchHQVSDSlowMotionScenCnt ++;
4509 	}
4510 	else
4511 	{
4512 		if ( patchHQVSDSlowMotionScenCnt > 0x10 )
4513 			patchHQVSDSlowMotionScenCnt -= 0x10;
4514 		else
4515 			patchHQVSDSlowMotionScenCnt = 0;
4516 	}
4517 
4518 	// special patch for sec woman in dark
4519 	// 1. when in dark scene
4520 	if ( mv0featheringCnt ==0  && // mv0 feathering count
4521 		me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x25 &&
4522 		mvhistogramNonMV0Cnt < 4 && mvhistogramMV0Cnt < 8 )
4523 	{
4524 		if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4525 			patchSecWomanInDarkScnenCnt ++;
4526 	}
4527 	else if (
4528 		me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x30 &&
4529 		mvhistogramNonMV0Cnt < 8 && mvhistogramMV0Cnt < 0x20 )
4530 	{
4531 		if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4532 			patchSecWomanInDarkScnenCnt ++;
4533 	}
4534 	else
4535 	{
4536 		if ( patchSecWomanInDarkScnenCnt > 0x10 )
4537 			patchSecWomanInDarkScnenCnt -= 0x10;
4538 		else
4539 			patchSecWomanInDarkScnenCnt = 0;
4540 	}
4541 
4542 
4543 	mcnrMoveStep = 4; //(MApi_XC_R2BYTE(REG_SC_BK30_08_L)) >> 8;
4544 	if ( isHDSrc || motionBigChange || motionBigChange2 )
4545 	{
4546 		mcnrUpdateTableLevelCnt = 0x80;
4547 	}
4548 	else if ( patchHQVSDSlowMotionScenCnt >= 0x10 )
4549 	{
4550 		if ( mcnrUpdateTableLevelCnt < 0xF0 )
4551 			mcnrUpdateTableLevelCnt += mcnrMoveStep;
4552 	}
4553 	else if ( patchSecWomanInDarkScnenCnt >= 0x10 )
4554 	{
4555 		if ( mcnrUpdateTableLevelCnt > 10 )
4556 			mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4557 	}
4558 	else // go back to 0x80
4559 	{
4560 		if ( mcnrUpdateTableLevelCnt > 0x80 )
4561 			mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4562 		else if ( mcnrUpdateTableLevelCnt < 0x80 )
4563 			mcnrUpdateTableLevelCnt += mcnrMoveStep;
4564 	}
4565 	mcnrUpdateTableLevel = mcnrUpdateTableLevelCnt >> 4;
4566 
4567 	if ( false == isHDSrc )
4568 	{
4569 		// Reduce PDNR
4570 		if ( mcnrUpdateTableLevel <= 2 )
4571 		{
4572 			MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x4444 );
4573 			MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x4444 );
4574 			MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x3333 );
4575 			MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x3300 );
4576 
4577 			MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x4444 );
4578 			MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x4444 );
4579 			MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x3333 );
4580 			MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x3300 );
4581 
4582 			MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x2222 );
4583 			MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x1111 );
4584 		}
4585 		else if ( mcnrUpdateTableLevel <= 6 )
4586 		{
4587 			MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x6666 );
4588 			MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x5555 );
4589 			MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x5555 );
4590 			MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x4400 );
4591 
4592 			MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x6666 );
4593 			MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x5555 );
4594 			MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x5555 );
4595 			MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x4400 );
4596 
4597 			MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x3333 );
4598 			MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x2211 );
4599 		}
4600 		else //if ( mcnrUpdateTableLevel <= 10 ) // 6 ~ 10 default
4601 		{
4602 			MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x8888 );
4603 			MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x7777 );
4604 			MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x6666 );
4605 			MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x6600 );
4606 
4607 			MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x8888 );
4608 			MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x7777 );
4609 			MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x6666 );
4610 			MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x6600 );
4611 
4612 			MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x4444 );
4613 			MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x4432 );
4614 		}
4615 
4616 		// Increase Chroma NR
4617 		if ( mcnrUpdateTableLevel >= 0xC )
4618 		{
4619 			MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xCCCC );
4620 			MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xCCCC );
4621 			MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xCCBA );
4622 			MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x8640 );
4623 		}
4624 		else if ( mcnrUpdateTableLevel >= 0xA )
4625 		{
4626 			MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xAAAA );
4627 			MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xAAAA );
4628 			MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xA865 );
4629 			MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x4320 );
4630 		}
4631 		else //default
4632 		{
4633 			MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0x8888 );
4634 			MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0x7766 );
4635 			MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0x5432 );
4636 			MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x0000 );
4637 		}
4638 	}
4639 
4640 	isfilmNotfilm22 = ( filmstatus.filmany || filmstatus.film32 ); // keep film22 as same NR strength
4641 	if ( isfilmNotfilm22 )
4642 	{
4643 		if ( movingBlkMoreThanMV0Blk2 )
4644 			isFilmandMotion = 0x10;
4645 		else if ( isFilmandMotion != 0 )
4646 			isFilmandMotion --;
4647 	}
4648 	else
4649 		isFilmandMotion = 0;
4650 
4651 	// patch of increase or reduce MV0moving weight
4652 	if ( movingBlkMoreThanMV0Blk1 /*|| motionBigChange2*/ )
4653 		movingWeight = ME_MovingWeight_Min;
4654 	else if( movingBlkMoreThanMV0Blk2 )
4655 	{
4656 		if( movingWeight > ME_MovingWeight_Min )
4657 			movingWeight--;
4658 		else
4659 			movingWeight = ME_MovingWeight_Min;
4660 	}
4661 	else if ( isStill || mcnrUpdateTableLevel >= 0xA )
4662 	{
4663 		if ( isHDSrc )
4664 		{
4665 			if( movingWeight < ME_MovingWeight_Max2_HD )
4666 				movingWeight++;
4667 			else
4668 				movingWeight = ME_MovingWeight_Max2_HD;
4669 		}
4670 		else
4671 		{
4672 			if( movingWeight < ME_MovingWeight_Max2_SD )
4673 				movingWeight++;
4674 			else
4675 				movingWeight = ME_MovingWeight_Max2_SD;
4676 		}
4677 	}
4678 	else
4679 	{
4680 		if ( isHDSrc )
4681 		{
4682 			if( movingWeight < ME_MovingWeight_Max_HD )
4683 				movingWeight++;
4684 			else
4685 				movingWeight = ME_MovingWeight_Max_HD;
4686 		}
4687 		else
4688 		{
4689 			if( movingWeight < ME_MovingWeight_Max_SD )
4690 				movingWeight++;
4691 			else
4692 				movingWeight = ME_MovingWeight_Max_SD;
4693 		}
4694 	}
4695 
4696 	MApi_XC_W2BYTEMSK(REG_SC_BK17_19_L, ( movingWeight<<8 )  | movingWeight, 0x1F1F);
4697 
4698 	// 2. patch mcnr/pdnr motion gain
4699 	if ( motionBigChange2 ) // for scene change or film mode moving
4700 	{
4701 		mcnr_motionGain = MCNR_MOTIONGAIN_MAX2;
4702 	}
4703 	else if ( motionBigChange ) // reduce MCNR when mv is changing...
4704 	{
4705 		if( mcnr_motionGain < MCNR_MOTIONGAIN_MAX )
4706 			mcnr_motionGain ++;
4707 		//else
4708 		//	mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4709 	}
4710 	else //PDNR default park at min
4711 	{
4712 		if( mcnr_motionGain > MCNR_MOTIONGAIN_MIN )
4713 			mcnr_motionGain --;
4714 		else
4715 			mcnr_motionGain = MCNR_MOTIONGAIN_MIN;
4716 	}
4717 
4718 	// reduce PDNR when bigChange, film & motion
4719 	if ( motionBigChange2 )
4720 	{
4721 		pdnr_motionGain = PDNR_MOTIONGAIN_MAX2;
4722 	}
4723 	else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion || mcnrUpdateTableLevel <= 0x4 )
4724 	{
4725 		if( pdnr_motionGain < PDNR_MOTIONGAIN_MAX )
4726 			pdnr_motionGain ++;
4727 		else
4728 			pdnr_motionGain = PDNR_MOTIONGAIN_MAX;
4729 	}
4730 	else if ( isStill || mcnrUpdateTableLevel >= 0xA ) // for sony temple tree, only reduce NR when isStill
4731 	{
4732 		if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4733 			pdnr_motionGain --;
4734 		else
4735 			pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4736 	}
4737 	else
4738 	{
4739 		if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4740 			pdnr_motionGain --;
4741 		else
4742 			pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4743 	}
4744 
4745 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, mcnr_motionGain<<8, 0x0F00);
4746 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_15_L, (pdnr_motionGain<<4) | pdnr_motionGain, 0x00FF);
4747 
4748 
4749 	// Adjust NR table... strong NR table can reduce Noise
4750 	if ( isStill )
4751 	{
4752 		if ( stillFrameCnt < 0x80 )
4753 			stillFrameCnt ++;
4754 	}
4755 	else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion )
4756 	{
4757 		stillFrameCnt = 0;
4758 	}
4759 
4760 }
4761 
4762 
MDrv_SC_MCDi_En_Ctrl(void * pInstance,const MS_BOOL disable)4763 void MDrv_SC_MCDi_En_Ctrl(void *pInstance, const MS_BOOL disable )
4764 {
4765 	if( disable )
4766 	{
4767 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0000, 0x0080); // disable MCDi
4768         //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0080, 0x0080); // Enable MADi_SST
4769 	}
4770 	else
4771 	{
4772 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0080, 0x0080);// enable MCDi
4773         //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0000, 0x0080); // disable MADi_SST
4774 	}
4775 }
4776 
MDrv_SC_SST_Ctrl(void * pInstance,const MS_BOOL disable,const MS_U32 FeatherSum,const MS_BOOL isHDSrc)4777 void MDrv_SC_SST_Ctrl( void *pInstance,const MS_BOOL disable, const MS_U32 FeatherSum, const MS_BOOL isHDSrc )
4778 {
4779     static MS_BOOL reg_sst_en = true;
4780     MS_U32 mv0_feather;
4781     mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4782     if( disable ||((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc)&&(SZ_PATTERN_ENABLE ==1))) //Add feathersum for TSB#3 capter4 white noise
4783 	{
4784 		reg_sst_en = false;
4785 	}
4786 	else
4787 	{
4788 		reg_sst_en = true;
4789 	}
4790 
4791 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, (MS_U16)(reg_sst_en << 8), 0x0100);
4792 
4793 }
4794 
checkHQVMovingBarPatch(void * pInstance,const MS_U8 colorSum)4795 MS_BOOL checkHQVMovingBarPatch(void *pInstance, const MS_U8 colorSum )  // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4796 {
4797 	MS_BOOL isHQVMovingBarPattern = false;
4798 
4799 	if ( // BK17
4800 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF)      ) < 0x4 &&
4801 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8 ) < 0x4 &&
4802 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF)      ) < 0x4 &&
4803 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8 ) < 0x4 &&
4804 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF)      ) < 0x4 &&
4805 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8 ) < 0x4 &&
4806 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF)      ) < 0x4 &&
4807 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8 ) < 0x4 &&
4808 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF)      ) > 0x40 &&
4809 		 // BK2A
4810 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF)      ) > 0xB00 &&
4811 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7B_L, 0xFFFF)      ) < 0x50 &&
4812 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7F_L, 0xFFFF)      ) < 0x40 &&
4813 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_74_L, 0xFFFF)      ) < 0x100 &&
4814 		 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_77_L, 0xFFFF)      ) < 0x100 &&
4815 		 colorSum == 0 )
4816 		isHQVMovingBarPattern = true;
4817             return isHQVMovingBarPattern;
4818 }
4819 
4820 #define UCDi_OP1_HisWeight_MaxValue 0x0E    // history weight = 6
4821 #define UCDi_OP1_HisWeight_MinValue 0x04    // history weight = 2
MDrv_SC_UCDi_OP1_HisWeight_Ctrl(void * pInstance,const MS_BOOL Bouncing_status,const MS_BOOL Feather_sum_status,const XC_FilmStates filmstatus,const MS_U8 colorSum,const MS_U32 FeatherSum,const MS_BOOL isHDSrc)4822 void MDrv_SC_UCDi_OP1_HisWeight_Ctrl(void *pInstance,const MS_BOOL Bouncing_status,const MS_BOOL Feather_sum_status,const XC_FilmStates filmstatus, const MS_U8 colorSum, const MS_U32 FeatherSum, const MS_BOOL isHDSrc)
4823 {
4824     static MS_U32 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4825     static MS_U32 mv0_feather_prv = 0x0000;
4826     MS_U32 mv0_feather;
4827     MS_U8 u8MotionValue;
4828 
4829     u8MotionValue = MApi_XC_R2BYTE(REG_SC_BK0A_1A_L)& 0x007F;
4830 
4831     mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4832     //Add iir filter
4833     mv0_feather = (mv0_feather_prv*3 + mv0_feather)/4;
4834     mv0_feather_prv = mv0_feather;
4835 
4836     if((u8MotionValue<0x0A) && (SZ_PATTERN_ENABLE ==1))//Add for AV patterns, titles are shaking issue
4837     {
4838         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4839         //printf("u8MotionValue = %d, SZ_PATTERN_ENABLE = %d\n\n",u8MotionValue, SZ_PATTERN_ENABLE);
4840     }
4841     else if(((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc))&& (SZ_PATTERN_ENABLE ==1)) //Add feathersum for TSB#3 capter4 white noise
4842 	{
4843         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4844         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0000, 0x0002);
4845         //printf("FeatherSum = %d, mv0_feather = %d\n\n",(int)FeatherSum, (int)mv0_feather);
4846     }
4847     else if( Bouncing_status || Feather_sum_status )
4848 	{
4849         reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4850         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4851         //printf("Bouncing_status = %d, Feather_sum_status = %d\n\n",Bouncing_status, Feather_sum_status);
4852 	}
4853 #if SEC_HQV_PATTERN
4854 	else if ( checkHQVMovingBarPatch( colorSum ) ) // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4855 	{
4856 		if( reg_uc_his_weight > 0x8 )
4857 			reg_uc_his_weight--;
4858         MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4859 		//printf("reg_uc_his_weight = %d\n\n",(int)reg_uc_his_weight);
4860 	}
4861 #endif
4862 	else
4863 	{
4864 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4865 		if( reg_uc_his_weight < UCDi_OP1_HisWeight_MaxValue )
4866 			reg_uc_his_weight++;
4867 		else
4868 			reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4869         //printf("else reg_uc_his_weight= %d\n\n",(int)reg_uc_his_weight);
4870 	}
4871 
4872 	if(filmstatus.film_act)
4873 	{
4874 		reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4875 	}
4876 
4877         //Dummy to control write value, add by Bella 20150708
4878         if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x000E)!=0x0000)
4879         {
4880             MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x000E);
4881         }
4882         else
4883         {
4884 	        MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, reg_uc_his_weight, 0x000E);
4885         }
4886 
4887 }
4888 
4889 #define SPF_OP1_HisWeight_MaxValue 0x06    // history weight = 6
4890 #define SPF_OP1_HisWeight_MinValue 0x02    // history weight = 2
MDrv_SC_SPF_OP1_HisWeight_Ctrl(void * pInstance,const MS_BOOL Bouncing_status)4891 void MDrv_SC_SPF_OP1_HisWeight_Ctrl(void *pInstance,const MS_BOOL Bouncing_status)
4892 {
4893 	static MS_U32 reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4894 
4895 	if( Bouncing_status  )
4896 	{
4897 		reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4898 #ifdef DBG_HISW8T_LC
4899 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0007, 0x000F );
4900 #endif
4901 	}
4902 	else
4903 	{
4904 		if( reg_uc_his_weight < SPF_OP1_HisWeight_MaxValue )
4905 			reg_uc_his_weight++;
4906 		else
4907 			reg_uc_his_weight = SPF_OP1_HisWeight_MaxValue;
4908 #ifdef DBG_HISW8T_LC
4909 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x000F );
4910 #endif
4911 	}
4912 
4913 	MApi_XC_W2BYTEMSK(REG_SC_BK09_5C_L, reg_uc_his_weight, 0x0007);
4914 
4915 }
4916 
4917 //
4918 //		MV0 comfirm for such as like "Piano Bar" motionless pattern
4919 //
4920 #define KFCnonHistoryMotionDivideMode_MaxValue 0x02
4921 #define KFCnonHistoryMotionDivideMode_MinValue 0x01
4922 
MDrv_SC_KFC_EODiW_Motionless(void * pInstance)4923 void MDrv_SC_KFC_EODiW_Motionless(void *pInstance)
4924 {
4925     MS_U32 mv0Comfirm = 0,  nonMV0Comfirm = 0, mvNotFound = 0, luma = 0;
4926 	static MS_U32 prevMV0Comfirm = 0;
4927 	static MS_U32 prevNonMV0Comfirm = 0;
4928 	static MS_U32 prevMvNotFound = 0;
4929 	static MS_U32 prevLuma = 0;
4930 	static MS_U32 prevComfirmValue = 0;
4931     MS_U32 comfirmValue = 0;
4932 	static MS_U32 prevComfirmValue2 = 0;
4933     MS_U32 comfirmValue2 =0;
4934 	static MS_U32 KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4935 
4936 	mv0Comfirm			= MApi_XC_R2BYTE(REG_SC_BK09_78_L);
4937 	nonMV0Comfirm	  = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
4938 	mvNotFound			= MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
4939 	luma            = MApi_XC_R2BYTE(REG_SC_BK1A_06_L);
4940 
4941 	mv0Comfirm = (prevMV0Comfirm * 3 + mv0Comfirm) >> 2;
4942 	prevMV0Comfirm = mv0Comfirm;
4943 
4944 	nonMV0Comfirm = (prevNonMV0Comfirm * 3 + nonMV0Comfirm) >> 2;
4945 	prevNonMV0Comfirm = nonMV0Comfirm;
4946 
4947 	mvNotFound = (prevMvNotFound * 3 + mvNotFound) >> 2;
4948 	prevMvNotFound = mvNotFound;
4949 
4950 	luma = (prevLuma * 3 + luma) >> 2;
4951 	prevLuma = luma;
4952 	//  ==================================================	//
4953 	/* mv0 check !! */
4954 	if(mv0Comfirm > (mvNotFound * 20) )
4955 		comfirmValue = mv0Comfirm - mvNotFound * 20;
4956 	else
4957 		comfirmValue = 0;
4958 
4959 	comfirmValue = (prevComfirmValue * 3 + comfirmValue) >> 2;
4960 	prevComfirmValue = comfirmValue;
4961 
4962 	//  ==================================================	//
4963 	/* Small moving check !! */
4964 	if(mv0Comfirm > (nonMV0Comfirm * 1) )
4965 		comfirmValue2 = mv0Comfirm - nonMV0Comfirm * 1;
4966 	else
4967 		comfirmValue2 = 0;
4968 
4969 	comfirmValue2 = (prevComfirmValue2 * 3 + comfirmValue2) >> 2;
4970 	prevComfirmValue2 = comfirmValue2;
4971 
4972 	//  ==================================================	//
4973 	if( (comfirmValue > 100) && (comfirmValue2 > 100) && (luma < 0x2000) )
4974 	{
4975 		//KFCnonHistoryMotionDivideMode = 0x00;
4976 		if(KFCnonHistoryMotionDivideMode > KFCnonHistoryMotionDivideMode_MinValue)
4977 			KFCnonHistoryMotionDivideMode--;
4978 		else
4979 			KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MinValue;
4980 	}
4981 	else
4982 	{
4983 		if(KFCnonHistoryMotionDivideMode < KFCnonHistoryMotionDivideMode_MaxValue)
4984 			KFCnonHistoryMotionDivideMode++;
4985 		else
4986 			KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4987 	}
4988 	/* Main window KFC non-history motion divide mode */
4989 	MApi_XC_W2BYTEMSK(REG_SC_BK22_28_L, KFCnonHistoryMotionDivideMode << 4, 0x0030);
4990 }
4991 
MDrv_SC_Edison_VectorNR0(void * pInstance,const MS_U16 isFeatherAndMotion,const MS_BOOL isMcFilm,const MS_BOOL isLrLetterBox,const MS_U32 uComplex,const MS_U16 mv0Comfirm,const MS_BOOL isMcOutOfSearchRange)4992 void MDrv_SC_Edison_VectorNR0(void *pInstance, const MS_U16 isFeatherAndMotion, const MS_BOOL isMcFilm,
4993 			      const MS_BOOL isLrLetterBox, const MS_U32 uComplex, const MS_U16 mv0Comfirm,
4994 			      const MS_BOOL isMcOutOfSearchRange )
4995 {
4996     MS_U16 FAM = 0;
4997 	static MS_U16 FAM_iir = 0;
4998 	static MS_U8 _noFeatherCnt = 0;
4999     MS_BOOL mcnr_vector0 = FALSE;
5000     MS_BOOL isCplx = FALSE;
5001     MS_BOOL isRealMv0 = FALSE;
5002 
5003 	isRealMv0 = ( mv0Comfirm > 0x20 ) ? true : false;
5004 	isCplx = ( uComplex > 0x1500 ) ? true : false;
5005 
5006 	FAM = isFeatherAndMotion;
5007 	FAM = ((FAM_iir*3 )+ FAM ) >> 2;
5008 	FAM_iir = FAM;
5009 
5010 	if( FAM_iir < 5 )
5011 	{
5012 		if( _noFeatherCnt <= 64)
5013 			_noFeatherCnt++;
5014 	}
5015 	else
5016 	{
5017 		_noFeatherCnt = 0;
5018 	}
5019 
5020 	mcnr_vector0 = ( _noFeatherCnt > 50 ) ? true : false;
5021 
5022 	if ( ( mcnr_vector0 && isCplx && isRealMv0 ) || isMcFilm || isLrLetterBox || isMcOutOfSearchRange )
5023 	{
5024 		MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0002, 0x0002); /*F2 Force MNR interpolation MV enable*/
5025 		MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5026 	}
5027 	else/*disable*/
5028 	{
5029 		MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0000, 0x0002); /*F2 Force MNR interpolation MV enable*/
5030 		MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5031 	}
5032 }
5033 
5034 #define L139_COLORSUM 0x0A /*CVBS*/
MDrv_SC_Agate_L139(void * pInstance,const MS_U32 mvComfirm,const MS_U32 colorSum,const MS_U32 uComplex,const MS_BOOL meStill,const XC_Me1HisStates H2)5035 MS_BOOL MDrv_SC_Agate_L139(void *pInstance, const MS_U32 mvComfirm, const MS_U32 colorSum, const MS_U32 uComplex, const MS_BOOL meStill, const  XC_Me1HisStates H2 /*, const MS_BOOL ukoSabihS_en*/ )
5036 {
5037     MS_BOOL me1IsMv0 = 0;
5038     MS_BOOL isL139 = 0;
5039 
5040 	if((H2.minMvXdir == 8) && (H2.minMvYdir == 8) &&(H2.minMvXBin > 13) && (H2.minMvYBin > 13))
5041 	{
5042 		me1IsMv0 = true;
5043 	}
5044 	else
5045 	{
5046 		me1IsMv0 = false;
5047 	}
5048 
5049 	if( (mvComfirm > 95) && (colorSum < L139_COLORSUM)&&(uComplex > 3456) && meStill && me1IsMv0 )
5050 	{
5051 		isL139 = true;
5052 	}
5053 	else
5054 	{
5055 		isL139 = false;
5056 	}
5057     //printf("isL139== %d \n\n",isL139);
5058 	return isL139;
5059 }
5060 
MDrv_SC_Agate_L107(void * pInstance,const MS_U32 mvComfirm,const MS_U32 uComplex,const XC_GMvStates gMv,const MS_U32 u32MotionValue,const MS_U32 total_feather,const MS_U8 inputSource)5061 MS_BOOL MDrv_SC_Agate_L107(void *pInstance, const MS_U32 mvComfirm, const MS_U32 uComplex, const XC_GMvStates gMv, const MS_U32 u32MotionValue, const MS_U32 total_feather, const MS_U8 inputSource )
5062 {
5063     MS_BOOL mvComfirmId = FALSE, colorId = FALSE, cplxId = FALSE, motionId = FALSE, featherId = FALSE;
5064     MS_BOOL notFoundMvId = FALSE, foundMvId = FALSE, foundNonMv0Id = FALSE;
5065     MS_BOOL gMvId = FALSE;
5066     MS_BOOL L107 = FALSE;
5067 
5068     MS_U32 notFoundMv = 0;
5069 	static MS_U32 notFoundMv_iir = 0;
5070     MS_U32 foundMv0 = 0;
5071 	static MS_U32 foundMv0_iir = 0;
5072     MS_U32 foundNonMv0 = 0;
5073 	static MS_U32 foundNonMv0_iir = 0;
5074     MS_U32 colorSum = 0;
5075 	static MS_U32 colorSum_iir = 0;
5076 
5077 	foundMv0 = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5078 	foundMv0 = ((foundMv0_iir*3 )+ foundMv0 ) >> 2;
5079 	foundMv0_iir = foundMv0;
5080 
5081 	foundNonMv0 = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5082 	foundNonMv0 = ((foundNonMv0_iir*3 )+ foundNonMv0 ) >> 2;
5083 	foundNonMv0_iir = foundNonMv0;
5084 
5085 	notFoundMv = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5086 	notFoundMv = ((notFoundMv_iir*3 )+ notFoundMv ) >> 2;
5087 	notFoundMv_iir = notFoundMv;
5088 
5089 	colorSum = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
5090 	colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5091 	colorSum_iir = colorSum;
5092 
5093 	motionId = (u32MotionValue > 0x2C00) ? true : false;
5094 	mvComfirmId = ( mvComfirm < 16 ) ? true : false;
5095 	if( inputSource == 1 ) /*CVBS*/
5096 		colorId = ( (colorSum > 0x2300) && (colorSum < 0x2B00) ) ? true : false;
5097 	else if( inputSource == 2 )
5098 		colorId = ( (colorSum > 0x1700) && (colorSum < 0x1B00) ) ? true : false;
5099 	else
5100 		colorId = false;
5101 
5102 	cplxId = ( (uComplex > 0x200) && (uComplex < 0x600) ) ? true : false;
5103 	featherId = ( (total_feather < 0x40) && (total_feather > 0x20) ) ? true : false;
5104 
5105 	foundMvId =( (foundMv0_iir < 0x90) && (foundMv0_iir > 0x50) ) ? true : false;
5106 	foundNonMv0Id =( (foundNonMv0_iir < 0x20) && (foundNonMv0_iir > 0x01) ) ? true : false;
5107 	notFoundMvId = ( notFoundMv_iir < 0x2F ) ? true : false;
5108 
5109 	if( ( gMv.h1XYsum > 10) && ( gMv.h2XYsum > 10)&&( gMv.h1XYdiff < 5)
5110 		&& ( gMv.h2XYdiff < 5) &&( gMv.minMvXdir == 0x20) && (gMv.minMvYdir == 8))
5111 	{
5112 		gMvId = true;
5113 	}
5114 	else
5115 	{
5116 		gMvId = false;
5117 	}
5118 
5119 	if( mvComfirmId && colorId && cplxId && gMvId && motionId && featherId
5120 		&&foundMvId && foundNonMv0Id && notFoundMvId )
5121 	{
5122 		L107 = true;
5123 	}
5124 	else
5125 	{
5126 		L107 = false;
5127 	}
5128     //printf("isL107 == %d\n\n",L107);
5129 	return L107;
5130 }
5131 
MDrv_SC_Agate_L153(void * pInstance,const MS_BOOL movingWithoutFeather,const MS_U32 colorSum,const MS_U32 uComplex,const XC_Me1HisStates H2)5132 MS_BOOL MDrv_SC_Agate_L153(void *pInstance, const MS_BOOL movingWithoutFeather, const MS_U32 colorSum, const MS_U32 uComplex, const  XC_Me1HisStates H2 )
5133 {
5134     MS_BOOL notXmoving = FALSE;
5135     MS_BOOL YmovingNotFocus = FALSE;
5136     MS_BOOL CplxRange = FALSE;
5137     MS_BOOL withoutColor = FALSE;
5138     MS_BOOL L153 = FALSE;
5139 
5140 	if( colorSum < 5 )
5141 		withoutColor = true;
5142 	else
5143 		withoutColor = false;
5144 
5145 	if((H2.minMvXdir == 8) && (H2.minMvXBin > 10))
5146 		notXmoving = true;
5147 	else
5148 		notXmoving = false;
5149 
5150 	if( H2.minMvYBin < 5)
5151 		YmovingNotFocus = true;
5152 	else
5153 		YmovingNotFocus = false;
5154 
5155 	if(( uComplex > 0x200 ) && ( uComplex < 0x300 ))
5156 		CplxRange = true;
5157 	else
5158 		CplxRange = false;
5159 
5160 	if(notXmoving && YmovingNotFocus && movingWithoutFeather && withoutColor && CplxRange)
5161 	{
5162 		L153 = true;
5163 		//MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
5164 	}
5165 	else
5166 	{
5167 		L153 = false;
5168 		//MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
5169 	}
5170     //printf("L153 == %d \n\n",L153);
5171 	return L153;
5172 }
5173 
MDrv_SC_AbihsotArtifactFeatherPattern(void * pInstance,const MS_BOOL Feather_sum_status,const MS_BOOL Feather_sum_status2,const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0)5174 MS_BOOL MDrv_SC_AbihsotArtifactFeatherPattern(void *pInstance,const MS_BOOL Feather_sum_status, const MS_BOOL Feather_sum_status2,
5175 					      const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0 )
5176 {
5177 	static MS_BOOL isAbihsot = false;
5178 	static MS_BOOL isStill = false;
5179 	static MS_BOOL isStillFeather = false;
5180 
5181 	isStill = ( me1IsMv0 > me1IsNonMv0*26 ) ? true : false;
5182 
5183 	isStillFeather = ( isStill && Feather_sum_status2 ) ? true : false;
5184 
5185 	if( Feather_sum_status || isStillFeather )
5186 	{
5187 		isAbihsot = true;
5188 	}
5189 	else
5190 	{
5191 		isAbihsot = false;
5192 	}
5193 
5194 	return ( isAbihsot );
5195 }
5196 
MDrv_SC_SBlueShirt(void * pInstance,const MS_U16 nonMv0Comfirm,const MS_U16 mv0Comfirm,const MS_U16 mvNotFound,const MS_U16 mvNotFoundME2,const MS_U32 uComplex,const XC_Me1HisStates H2,const XC_GMvStates gMv)5197 MS_BOOL MDrv_SC_SBlueShirt(void *pInstance,const MS_U16 nonMv0Comfirm, const MS_U16 mv0Comfirm, const MS_U16 mvNotFound ,
5198 			   const MS_U16 mvNotFoundME2, const MS_U32 uComplex, const  XC_Me1HisStates H2, const XC_GMvStates gMv )
5199 {
5200     MS_BOOL XmovingNotFocus = FALSE;
5201     MS_BOOL Cplx_Range = FALSE;
5202     MS_BOOL is_SBlueWoman = FALSE,isSBlueShirtWoman = FALSE;
5203 
5204 	if((gMv.h2XYdiff < 0x10) && (nonMv0Comfirm < 0x55) &&
5205 		(mv0Comfirm < 0x40)&& (mvNotFound < 0x100)&& (mvNotFoundME2 > 0x350) )
5206 	{
5207 		is_SBlueWoman = true;
5208 	}
5209 	else
5210 	{
5211 		is_SBlueWoman = false;
5212 	}
5213 
5214 	if( H2.minMvXBin < 0x15)
5215 		XmovingNotFocus = true;
5216 	else
5217 		XmovingNotFocus = false;
5218 
5219 	if(( uComplex > 2000 ) && ( uComplex < 3000 ))
5220 		Cplx_Range = true;
5221 	else
5222 		Cplx_Range = false;
5223 
5224 	if(XmovingNotFocus && is_SBlueWoman && Cplx_Range)
5225 	{
5226 		isSBlueShirtWoman = true;
5227 	}
5228 	else
5229 	{
5230 		isSBlueShirtWoman = false;
5231 	}
5232 
5233 	return isSBlueShirtWoman;
5234 }
5235 
5236 
5237 #define L107_FEATHER_GAIN_MAX 2
5238 #define L107_FEATHER_GAIN_MIN 0
5239 #define L107_CPLX_OFFSET_MAX 6
5240 #define L107_CPLX_OFFSET_MIN 0
5241 #define L107_CPLX_GAIN_MAX 15
5242 #define L107_CPLX_GAIN_MIN 4
MDrv_SC_A5_L107(void * pInstance,const MS_U32 IsVerticalMoving,const MS_U32 IsHorizontalMoving,const MS_U32 total_feather,const MS_U32 mvComfirm,const MS_U32 colorSum,const MS_U32 u32MotionValue,const MS_U32 uComplex)5243 MS_BOOL MDrv_SC_A5_L107(void *pInstance,const MS_U32 IsVerticalMoving, const MS_U32 IsHorizontalMoving, const MS_U32 total_feather, const MS_U32 mvComfirm, const MS_U32 colorSum,const MS_U32 u32MotionValue, const MS_U32 uComplex )
5244 {
5245 	static MS_U32 reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX ;
5246 	static MS_U32 reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX ;
5247 	static MS_U32 reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN ;
5248     MS_BOOL bL107_en = FALSE;
5249 
5250 	if((IsVerticalMoving < 20) && (IsHorizontalMoving < 200) && (total_feather < 100)
5251 		&& (mvComfirm > 200) && (colorSum > 200) && (u32MotionValue > 0x3500) && (uComplex < 0x700))
5252 	{
5253 		bL107_en = TRUE;
5254 
5255 		if( reg_mcdi_feather_gain > L107_FEATHER_GAIN_MIN )
5256 			reg_mcdi_feather_gain--;
5257 		else
5258 			reg_mcdi_feather_gain = L107_FEATHER_GAIN_MIN;
5259 
5260 		if( reg_mcdi_cplx_offset > L107_CPLX_OFFSET_MIN )
5261 			reg_mcdi_cplx_offset--;
5262 		else
5263 			reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MIN;
5264 
5265 		if( reg_mcdi_cplx_gain < L107_CPLX_GAIN_MAX )
5266 			reg_mcdi_cplx_gain++;
5267 		else
5268 			reg_mcdi_cplx_gain = L107_CPLX_GAIN_MAX;
5269 	}
5270 	else
5271 	{
5272 		bL107_en = FALSE;
5273 
5274 		if( reg_mcdi_feather_gain < L107_FEATHER_GAIN_MAX )
5275 			reg_mcdi_feather_gain++;
5276 		else
5277 			reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX;
5278 
5279 		if( reg_mcdi_cplx_offset < L107_CPLX_OFFSET_MAX )
5280 			reg_mcdi_cplx_offset++;
5281 		else
5282 			reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX;
5283 
5284 		if( reg_mcdi_cplx_gain > L107_CPLX_GAIN_MIN )
5285 			reg_mcdi_cplx_gain--;
5286 		else
5287 			reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN;
5288 	}
5289 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)reg_mcdi_feather_gain<<12, 0xF000); // 2 to 0
5290 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_offset<<4, 0x00F0);// 6 to 0
5291 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_gain<<8, 0x0F00);// 4 to F
5292 
5293 	return bL107_en;
5294 }
5295 
MDrv_SC_Agate_ComplexSum(void * pInstance)5296 MS_U32 MDrv_SC_Agate_ComplexSum(void *pInstance)
5297 {
5298 	static MS_U32 IsComplex_iir = 0xFFFF;
5299     MS_U32 IsComplex = 0;
5300 
5301 	IsComplex = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5302 
5303 	IsComplex = (IsComplex_iir*3 + IsComplex ) >> 2;
5304 	IsComplex_iir = IsComplex;
5305 
5306 	return IsComplex_iir;
5307 }
5308 
MDrv_SC_A5_KFC_IsVerticalMoving(void * pInstance)5309 MS_U32 MDrv_SC_A5_KFC_IsVerticalMoving( void *pInstance )
5310 {
5311     MS_U32 u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5312     MS_U32 me_vertical = 0;
5313 	static MS_U32 IsVerticalMoving_iir = 0;
5314 
5315 	u32_mvc     = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5316 	u32_mvu     = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5317 	u32_mvd     = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5318 
5319 	if ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd))
5320 	{
5321 		if( u32_mvu > (u32_mvc+u32_mvd)/2 )
5322 			me_vertical = (u32_mvu - (u32_mvc+u32_mvd)/2);
5323 		else
5324 			me_vertical = 0;
5325 	}
5326 	else if((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) )
5327 	{
5328 		if( u32_mvd > (u32_mvc+u32_mvu)/2 )
5329 			me_vertical = (u32_mvd - (u32_mvc+u32_mvu)/2);
5330 		else
5331 			me_vertical = 0;
5332 	}
5333 	else
5334 	{
5335 		me_vertical = 0;
5336 	}
5337 
5338 	if( me_vertical > 255 )
5339 		me_vertical = 255;
5340 
5341 	me_vertical = (IsVerticalMoving_iir*3 + me_vertical ) >> 2;
5342 	IsVerticalMoving_iir = me_vertical;
5343 
5344 	_bVerticalMovingForDHD = (((u32_mvu > 0x100) && (u32_mvu > u32_mvd*2) && (u32_mvu > u32_mvc))  //moving up
5345 		||( (u32_mvd > 0x100) && (u32_mvd > u32_mvu*2) && (u32_mvd > u32_mvc))  //moving down
5346 		||( ((u32_mvu + u32_mvd) > 0x100) && ((u32_mvu/8 + u32_mvd/8) > u32_mvc))); // u/d motion is much than mvc
5347 
5348 	return me_vertical;
5349 }
5350 
MDrv_SC_A5_ColorPixelSum(void * pInstance)5351 MS_U32 MDrv_SC_A5_ColorPixelSum(void *pInstance)
5352 {
5353 	MS_U32 colorSum;
5354 	static MS_U32 colorSum_iir = 0;
5355 
5356 	colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
5357 	colorSum  = colorSum / 8;
5358 
5359 	if( colorSum > 255 )
5360 		colorSum = 255;
5361 
5362 	colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5363 	colorSum_iir = colorSum;
5364 
5365 	return colorSum_iir;
5366 }
5367 
MDrv_SC_Agate_TotalFeather(void * pInstance)5368 MS_U32 MDrv_SC_Agate_TotalFeather(void *pInstance)
5369 {
5370 	MS_U32 mv0_feather, nonMv0_feather;
5371 	MS_U32 total_feather;
5372 	static MS_U32 total_feather_iir = 255;
5373 
5374 	mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5375 	nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5376 
5377 	total_feather = ( mv0_feather + nonMv0_feather ) / 4;
5378 
5379 	if( total_feather > 255 )
5380 		total_feather = 255;
5381 
5382 	total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5383 	total_feather_iir = total_feather;
5384 
5385 	return total_feather_iir;
5386 }
5387 
MDrv_SC_TotalFeather_Sum(void * pInstance)5388 MS_U32 MDrv_SC_TotalFeather_Sum(void *pInstance)
5389 {
5390 	MS_U32 mv0_feather, nonMv0_feather;
5391 	MS_U32 total_feather;
5392 	static MS_U32 total_feather_iir = 0;
5393 
5394 	mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5395 	nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5396 
5397 	total_feather =  mv0_feather + nonMv0_feather;
5398 
5399 	total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5400 	total_feather_iir = total_feather;
5401 
5402 	return total_feather_iir;
5403 }
5404 
5405 #define OOSRF_Gain          4
5406 #define OOSRF_Power        2
MDrv_SC_McInSearchRangeUseFeather(void * pInstance)5407 MS_U32 MDrv_SC_McInSearchRangeUseFeather( void *pInstance )
5408 {
5409     MS_U32 before_MC_feather = 0, after_MC_feather = 0;
5410     MS_U32 MC_OOSRF = 0;
5411 	static MS_U32 Prev_before_MC_feather = 0;
5412 	static MS_U32 Prev_after_MC_feather = 0;
5413 
5414 	before_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L) ;//mv0_feather
5415 	after_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);//nonMv0_feather
5416 
5417 	before_MC_feather = (Prev_before_MC_feather*3 + before_MC_feather ) >> 2;
5418 	Prev_before_MC_feather = before_MC_feather;
5419 
5420 	after_MC_feather = (Prev_after_MC_feather*3 + after_MC_feather ) >> 2;
5421 	Prev_after_MC_feather = after_MC_feather;
5422 
5423 	if( before_MC_feather > (after_MC_feather*OOSRF_Gain) >> OOSRF_Power  )//mv0_feather >> nonMv0_feather: MCDI is correct, therefore in search range
5424 		MC_OOSRF = before_MC_feather - ((after_MC_feather*OOSRF_Gain) >> OOSRF_Power) ;
5425 	else
5426 		MC_OOSRF = 0;
5427 
5428 	return MC_OOSRF;  // "Big": in seach range "Small": out of seach range
5429 }
5430 
5431 #define TOTAL_MV_TIME 10
MDrv_SC_Agate_TotalMvComfirm(void * pInstance)5432 MS_U32 MDrv_SC_Agate_TotalMvComfirm(void *pInstance)
5433 {
5434     MS_U32 mv0 = 0, nonMv0 = 0, notFound = 0;
5435     MS_U32 total_mv = 0, mvComfirm = 0;
5436 	static MS_U32 mvComfirm_iir = 0;
5437 
5438 	mv0      = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5439 	nonMv0   = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5440 	notFound   = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5441 
5442 	total_mv = mv0 + nonMv0;
5443 
5444 	if( total_mv > (notFound*TOTAL_MV_TIME))
5445 		mvComfirm =   total_mv - notFound*TOTAL_MV_TIME;
5446 	else
5447 		mvComfirm = 0;
5448 
5449 	if( mvComfirm > 255 )
5450 		mvComfirm = 255;
5451 
5452 	mvComfirm = ((mvComfirm_iir*3 )+ mvComfirm ) >> 2;
5453 	mvComfirm_iir = mvComfirm;
5454 
5455 	return mvComfirm_iir;
5456 }
5457 
MDrv_SC_Agate_ME1_nonMv0Comfirm(void * pInstance)5458 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm(void *pInstance)
5459 {
5460     MS_U16 nonmv0Comfirm = 0;
5461 	static MS_U16 nonmv0Comfirm_iir = 0;
5462 
5463 	nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5464 
5465 	nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5466 	nonmv0Comfirm_iir = nonmv0Comfirm;
5467 
5468 	return nonmv0Comfirm_iir;
5469 }
5470 
MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void * pInstance)5471 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void *pInstance)
5472 {
5473     MS_U16 nonmv0Comfirm = 0;
5474 
5475 	nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5476 	return nonmv0Comfirm;
5477 }
5478 
MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void * pInstance)5479 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void *pInstance)
5480 {
5481 	MS_U16 mv0Comfirm = 0;
5482 
5483 	mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5484 	return mv0Comfirm;
5485 }
5486 
MDrv_SC_Agate_ME1_mvNotFound(void * pInstance)5487 MS_U16 MDrv_SC_Agate_ME1_mvNotFound(void *pInstance)
5488 {
5489     MS_U16 mvNotFound = 0;
5490 	static MS_U16 mvNotFound_iir = 0;
5491 
5492 	mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5493 
5494 	mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5495 	mvNotFound_iir = mvNotFound;
5496 
5497 	return mvNotFound_iir;
5498 }
5499 
5500 #if 0
5501 MS_U16 MDrv_SC_Agate_ME1_mvNotFound_noIIR(void)
5502 {
5503     MS_U16 mvNotFound_noIIR = 0;
5504 
5505 	mvNotFound_noIIR = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5506 
5507 	return mvNotFound_noIIR;
5508 }
5509 #endif
5510 
MDrv_SC_Agate_ME1_mv0Comfirm(void * pInstance)5511 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm(void *pInstance)
5512 {
5513     MS_U16 mv0Comfirm = 0;
5514 	static MS_U16 mv0Comfirm_iir = 0;
5515 
5516 	mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5517 
5518 	mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5519 	mv0Comfirm_iir = mv0Comfirm;
5520 
5521 	return mv0Comfirm_iir;
5522 }
5523 
MDrv_SC_Agate_ME2_nonMv0Comfirm(void * pInstance)5524 MS_U16 MDrv_SC_Agate_ME2_nonMv0Comfirm(void *pInstance)
5525 {
5526     MS_U16 nonmv0Comfirm = 0;
5527     static MS_U16 nonmv0Comfirm_iir = 0;
5528 
5529     nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
5530 
5531     nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5532     nonmv0Comfirm_iir = nonmv0Comfirm;
5533 
5534     return nonmv0Comfirm_iir;
5535 }
5536 
MDrv_SC_Agate_ME2_mv0Comfirm(void * pInstance)5537 MS_U16 MDrv_SC_Agate_ME2_mv0Comfirm(void *pInstance)
5538 {
5539     MS_U16 mv0Comfirm = 0;
5540     static MS_U16 mv0Comfirm_iir = 0;
5541 
5542     mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
5543 
5544     mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5545     mv0Comfirm_iir = mv0Comfirm;
5546 
5547     return mv0Comfirm_iir;
5548 }
5549 
MDrv_SC_Agate_ME2_mvNotFound(void * pInstance)5550 MS_U16 MDrv_SC_Agate_ME2_mvNotFound(void *pInstance)
5551 {
5552 	MS_U16 mvNotFound = 0;
5553 	static MS_U16 mvNotFound_iir = 0;
5554 
5555 	mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
5556 
5557 	mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5558 	mvNotFound_iir = mvNotFound;
5559 
5560 	return mvNotFound_iir;
5561 }
5562 
MDrv_SC_McOutOfSearchRange(void * pInstance,const MS_U16 mvNotFound,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm,const MS_U16 isFeatherAndMotion,const XC_GMvStates gMv)5563 MS_BOOL MDrv_SC_McOutOfSearchRange(void *pInstance, const MS_U16 mvNotFound, const MS_U16 mv0Comfirm, const MS_U16 nonMv0Comfirm, const MS_U16 isFeatherAndMotion, const XC_GMvStates gMv )
5564 {
5565 
5566 	MS_BOOL isBigGmvDiff = (( abs(32 - gMv.minMvXdir) > 15 ) || ( abs(8 - gMv.minMvYdir) > 4 ) ) ? true : false;
5567     MS_BOOL  isOutOfSearchRange = 0;
5568 	static MS_U8 isCnt = 0;
5569 
5570 	int notFound = (int)mvNotFound;
5571 	int mv0 = (int) mv0Comfirm;
5572 	int nonmv0 = (int) nonMv0Comfirm;
5573 
5574 	/* where are nonMv0Comfirm ??? >_< */
5575     isOutOfSearchRange = ( (notFound > ((mv0+nonmv0)*8)) && ( (notFound) > 0x80 ) ) ? true : false;
5576 
5577 	if( isOutOfSearchRange && (isFeatherAndMotion > 5) && isBigGmvDiff )
5578 	{
5579 		if( isCnt < 255 )
5580 			isCnt++;
5581 	}
5582 	else
5583 	{
5584 		if( isCnt > 0 )
5585 			isCnt--;
5586 	}
5587 
5588 	return ( isCnt > 15 ) ? true : false;
5589 }
5590 
5591 /*Added for VG846 Sparse Pattern to avoid forcing MCDi function */
MDrv_SC_ukoSabihS_SparsePattern(void * pInstance,const MS_U16 mvNotFound,const MS_U16 mvNotFoundME2,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm,const MS_U16 mv0ComfirmME2,const MS_U16 nonMv0ComfirmME2,const MS_BOOL isHDSrc)5592 MS_BOOL MDrv_SC_ukoSabihS_SparsePattern( void *pInstance,const MS_U16 mvNotFound, const MS_U16 mvNotFoundME2, const MS_U16 mv0Comfirm, const MS_U16 nonMv0Comfirm, const MS_U16 mv0ComfirmME2, const MS_U16 nonMv0ComfirmME2, const MS_BOOL isHDSrc )
5593 {
5594 
5595     MS_BOOL  isSparse = 0;
5596 
5597     int notFound = (int)mvNotFound;
5598     int notFoundME2 = (int)mvNotFoundME2;
5599     int MVConfirm = (int) mv0Comfirm;
5600     int MVConfirmME2 = (int) mv0ComfirmME2;
5601     int nonmv0 = (int) nonMv0Comfirm;
5602     int nonmv0ME2 = (int) nonMv0ComfirmME2;
5603     int notFoundTH = 0;
5604     int notFoundME2TH = 0;
5605 
5606     /*if(isHDSrc)
5607     {
5608         isSparse = ( notFound > 0x200 ) && ( notFoundME2 > 0xF00 ) ? true : false;
5609     }
5610     else
5611     {
5612         isSparse = ( notFound > 0x40 ) && ( notFoundME2 > 0x800 ) ? true : false;
5613     }*/
5614 
5615     if(isHDSrc)
5616     {
5617     	 notFoundTH = (0x200* normalize_factor)/256;
5618    	 notFoundME2TH = (0xF00* normalize_factor)/256;
5619     }
5620     else
5621     {
5622  	   notFoundTH = (0x40* normalize_factor)/256;
5623  	   notFoundME2TH = (0x800* normalize_factor)/256;
5624     }
5625     isSparse = ( notFound > notFoundTH ) && ( notFoundME2 > notFoundME2TH ) ? true : false;
5626 
5627     if (isSparse && (notFound >(MVConfirm+nonmv0))&& (notFoundME2 >(MVConfirmME2+nonmv0ME2)))
5628     {
5629         	return true;
5630     }
5631     else
5632     {
5633             return false;
5634      }
5635 
5636 }
5637 
5638 
MDrv_SC_Agate_FeatherAndMotion(void * pInstance)5639 MS_U16 MDrv_SC_Agate_FeatherAndMotion(void *pInstance)
5640 {
5641     MS_U16 FAM = 0;
5642 	FAM = MApi_XC_R2BYTE(REG_SC_BK2A_7F_L); //feather and motion pixels
5643 	return FAM;
5644 }
5645 
MDrv_SC_ukoSabihS_HBurstMoving(void * pInstance,const MS_U32 _hpfSdCntReport)5646 MS_BOOL MDrv_SC_ukoSabihS_HBurstMoving(void *pInstance, const MS_U32 _hpfSdCntReport )
5647 {
5648     MS_U32 mv0_feather = 0;
5649     MS_BOOL isHBurst_act = FALSE;
5650 	static MS_U8 u8HBurstConfirmCnt = 0;
5651 
5652 	mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5653 
5654 	isHBurst_act = ( ((mv0_feather) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5655 
5656 	if(isHBurst_act)
5657 	{
5658 		if(u8HBurstConfirmCnt <= 0x20)
5659 		{
5660 			u8HBurstConfirmCnt++;
5661 		}
5662 	}
5663 	else
5664 	{
5665 		u8HBurstConfirmCnt = 0;
5666 	}
5667 
5668 	if(u8HBurstConfirmCnt > 10)
5669 	{
5670 		return true;
5671 	}
5672 	else
5673 	{
5674 		return false;
5675 	}
5676 }
5677 
MDrv_SC_ukoSabihS_ArtifactPattern(void * pInstance,const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc)5678 MS_BOOL MDrv_SC_ukoSabihS_ArtifactPattern(void *pInstance, const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc )
5679 {
5680     MS_BOOL isArtifactPattern_act = 0;
5681 	static MS_U8 u8ArtifactPatternConfirmCnt = 0;
5682 
5683 	if(isHDSrc)
5684 	{
5685 		isArtifactPattern_act = ( _hpfHdTolerantReport > 0x18000 ) ? true : false;
5686 	}
5687 	else
5688 	{
5689 		isArtifactPattern_act = ( _hpfHdTolerantReport > 0x4000 ) ? true : false;
5690 	}
5691 
5692 	if(isArtifactPattern_act)
5693 	{
5694 		if(u8ArtifactPatternConfirmCnt < 20)
5695 		{
5696 			u8ArtifactPatternConfirmCnt++;
5697 		}
5698 	}
5699 	else
5700 	{
5701 		if(u8ArtifactPatternConfirmCnt > 0)
5702 		{
5703 			u8ArtifactPatternConfirmCnt--;
5704 		}
5705 	}
5706 
5707 	if(u8ArtifactPatternConfirmCnt > 10)
5708 	{
5709 		return true;
5710 	}
5711 	else
5712 	{
5713 		return false;
5714 	}
5715 
5716 	//return isHBurstMoving;
5717 }
5718 
MDrv_SC_ukoSabihS_noLumaCplx(void * pInstance)5719 MS_BOOL MDrv_SC_ukoSabihS_noLumaCplx( void *pInstance )
5720 {
5721     MS_U8 reg_main_max_pixel_sat = 0;
5722     MS_U8 reg_main_min_pixel_sat = 0;
5723 
5724     MS_U16 reg_feather_and_motion_pixel = 0;
5725 
5726 	static MS_U8 confirmCnt = 0;
5727 
5728 	reg_main_max_pixel_sat = (MS_U8)( MApi_XC_R2BYTE(REG_SC_BK1A_61_L) & 0x00FF );
5729 	reg_main_min_pixel_sat = (MS_U8)( MApi_XC_R2BYTE(REG_SC_BK1A_61_L) & 0xFF00 ) >> 8;
5730 	reg_feather_and_motion_pixel = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5731 
5732 	if( ( reg_main_min_pixel_sat == 0 ) &&
5733 		( reg_main_max_pixel_sat == 0 ) &&
5734 		( reg_feather_and_motion_pixel > 0x5000 ) )
5735 	{
5736 		if( confirmCnt < 30 )
5737 			confirmCnt++;
5738 	}
5739 	else
5740 		confirmCnt = 0;
5741 
5742 	return ( confirmCnt > 20 );
5743 }
5744 
MDrv_SC_ukoSabihS_HBurst(void * pInstance,const MS_U32 _hpfSdCntReport,const MS_U32 uComplex)5745 MS_BOOL MDrv_SC_ukoSabihS_HBurst(void *pInstance, const MS_U32 _hpfSdCntReport, const MS_U32 uComplex )
5746 {
5747     MS_BOOL isHBurst = FALSE;
5748 
5749 	isHBurst = ( ((uComplex) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5750 
5751 	return isHBurst;
5752 }
5753 
MDrv_SC_Agate_ME1Still(void * pInstance)5754 MS_BOOL MDrv_SC_Agate_ME1Still(void *pInstance)
5755 {
5756     MS_U32 mv0 = 0, nonMv0 = 0;
5757     MS_BOOL isStill = FALSE;
5758 
5759 	static MS_U32 mv0_iir = 0;
5760 	static MS_U32 nonMv0_iir = 0;
5761 
5762 	mv0      = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5763 	nonMv0   = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5764 
5765 	if( mv0_iir > (nonMv0_iir*6) )
5766 		isStill = true;
5767 	else
5768 		isStill = false;
5769 
5770 	mv0 = ((mv0_iir*3 )+ mv0 ) >> 2;
5771 	mv0_iir = mv0;
5772 
5773 	nonMv0 = ((nonMv0_iir*3 )+ nonMv0 ) >> 2;
5774 	nonMv0_iir = nonMv0;
5775 
5776 	return isStill;
5777 }
5778 
MDrv_SC_Agate_MovingWithoutFeather(void * pInstance)5779 MS_BOOL MDrv_SC_Agate_MovingWithoutFeather(void *pInstance)
5780 {
5781     MS_U32 mv0_feather = 0, nonMv0_feather = 0;
5782     MS_BOOL isMovingWithoutFeather = FALSE;
5783 
5784 	static MS_U32 mv0_feather_iir = 0;
5785 	static MS_U32 nonMv0_feather_iir = 0;
5786 
5787 	mv0_feather      = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5788 	nonMv0_feather   = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5789 
5790 	if( mv0_feather_iir > (nonMv0_feather_iir*60) )
5791 		isMovingWithoutFeather = true;
5792 	else
5793 		isMovingWithoutFeather = false;
5794 
5795 	mv0_feather = ((mv0_feather_iir*3 )+ mv0_feather ) >> 2;
5796 	mv0_feather_iir = mv0_feather;
5797 
5798 	nonMv0_feather = ((nonMv0_feather_iir*3 )+ nonMv0_feather ) >> 2;
5799 	nonMv0_feather_iir = nonMv0_feather;
5800 
5801 	return isMovingWithoutFeather;
5802 }
5803 
5804 /******************************************************************************/
5805 ///Extend MCNR Driver
5806 /******************************************************************************/
MDrv_SC_Extend_UCNR_driver(void * pInstance)5807 void MDrv_SC_Extend_UCNR_driver(void *pInstance)
5808 {
5809     MS_U32 u32_is_mv0 = 0, u32_non_mv0 = 0, u32_mvNotFound = 0, u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5810     MS_BOOL me_not_confirm = FALSE, me_vertical = FALSE, still_pattern = FALSE;
5811 	static MS_U8 u8notConfirmCnt;
5812 //	static MS_U32 last_u32_mvNotFound;
5813 
5814 	u32_is_mv0  = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5815 	u32_non_mv0 = MApi_XC_R2BYTE(REG_SC_BK2A_79_L);
5816 	u32_mvNotFound = MApi_XC_R2BYTE(REG_SC_BK2A_7A_L);
5817 	u32_mvc     = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5818 	u32_mvu     = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5819 	u32_mvd     = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5820 
5821 	/////////////////////////////////////////////////////////////////
5822 	//  NR Patch 1
5823 	/////////////////////////////////////////////////////////////////
5824 
5825 	me_not_confirm = (u32_is_mv0 < 0x0200) && (u32_non_mv0 < 0x0200) ;
5826 	me_vertical    = ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd) && (u32_mvu > 0x200))
5827 		||((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) && (u32_mvd > 0x200));
5828 
5829 	still_pattern = (u32_is_mv0 < 0x0020) && (u32_non_mv0 < 0x0020) && (u32_mvNotFound < 0x0020);
5830 
5831 	if(!still_pattern)
5832 	{
5833 		if(false == me_not_confirm)
5834 		{
5835 			if(u8notConfirmCnt > 0)
5836 			{
5837 				u8notConfirmCnt--;
5838 			}
5839 		}
5840 		else
5841 		{
5842 			if(u8notConfirmCnt <= 0x40)
5843 			{
5844 				u8notConfirmCnt++;
5845 			}
5846 		}
5847 	}
5848 
5849 	if ( (u8notConfirmCnt > 0x30)|| me_vertical ) // low nr strength
5850 	{
5851 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_08_L, (MS_U16)0xAAAA, 0xFFFF);
5852 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_09_L, (MS_U16)0xAAAA, 0xFFFF);
5853 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0A_L, (MS_U16)0xAAAA, 0xFFFF);
5854 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0B_L, (MS_U16)0xAAAA, 0xFFFF);
5855 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0C_L, (MS_U16)0xAAAA, 0xFFFF);
5856 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0D_L, (MS_U16)0xAA98, 0xFFFF);
5857 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0E_L, (MS_U16)0x7654, 0xFFFF);
5858 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0F_L, (MS_U16)0x3210, 0xFFFF);
5859 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0064, 0x00FF); // moving picture, increase random motion
5860 	}
5861 	else
5862 	{
5863 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_08_L, (MS_U16)0xAAAA, 0xFFFF);
5864 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_09_L, (MS_U16)0xAAAA, 0xFFFF);
5865 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0A_L, (MS_U16)0xAAAA, 0xFFFF);
5866 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0B_L, (MS_U16)0xAAAA, 0xFFFF);
5867 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0C_L, (MS_U16)0xAAAA, 0xFFFF);
5868 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0D_L, (MS_U16)0xAA98, 0xFFFF);
5869 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0E_L, (MS_U16)0x7654, 0xFFFF);
5870 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_0F_L, (MS_U16)0x3210, 0xFFFF);
5871 	}
5872 
5873 	if ( (u32_is_mv0 > 0x200) && ((u32_is_mv0/2) > u32_non_mv0) && ((u32_is_mv0/2) > u32_mvNotFound) )
5874 	{
5875 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // still picture, reduce random motion
5876 	}
5877 	else if(u32_non_mv0 > u32_is_mv0)
5878 	{
5879 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // moving picture, increase random motion
5880 	}
5881 	else
5882 	{
5883 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // default random motion
5884 	}
5885 
5886 	//last_u32_mvNotFound = u32_mvNotFound;
5887 }
5888 
5889 /******************************************************************************/
5890 ///Noise Estimation Driver
5891 /******************************************************************************/
MDrv_SC_GetNoiseLevel(void * pInstance,MS_U8 * estNoise,const XC_LetterBoxState * letterBoxState,const XC_ApiStatus * stXCStatus,const MS_BOOL bInterlace,const MS_BOOL isOpFrameChanged)5892 MS_U8 MDrv_SC_GetNoiseLevel(void *pInstance, MS_U8 *estNoise, const XC_LetterBoxState *letterBoxState, const XC_ApiStatus *stXCStatus, const MS_BOOL bInterlace, const MS_BOOL isOpFrameChanged )
5893 {
5894 	const int defaultnoise = 35;
5895 	static int noiseIIR = 35;
5896 	static int noisehistory[5] = {0,0,0,0,0};
5897 	static MS_BOOL long_noisehistory[11] = {0,0,0,0,0,0,0,0,0,0,0};
5898 	static int safenoise = 0;
5899 	static int resetcount = 0;
5900 	MS_U8 reg_noise_confirm_level = 2;
5901 	static MS_BOOL is_ne_set = false;
5902 
5903 	int avgpixeldiff = defaultnoise;
5904 	int NE_histogram[25];
5905 	int MV0count = 0;
5906 
5907 	if( isOpFrameChanged )
5908 	{
5909 		MS_U16 height = bInterlace ? stXCStatus->ScaledCropWin.height/2 : stXCStatus->ScaledCropWin.height;
5910 		MS_U16 width = stXCStatus->ScaledCropWin.width;
5911 
5912 		MS_U16 hSt = (letterBoxState->lbCntL + 49 )/ 10;
5913 		MS_U16 hEnd = ( __max( width - letterBoxState->lbCntR - 50, 0 ) ) / 10;
5914 
5915 		MS_U16 vSt = (letterBoxState->lbCntT + 29 )/ 6;
5916 		MS_U16 vEnd = ( __max( height - letterBoxState->lbCntB - 30, 0 ) ) / 6;
5917 
5918 		MApi_XC_W2BYTE(REG_SC_BK39_0E_L, (hEnd << 8) | hSt );
5919 		MApi_XC_W2BYTE(REG_SC_BK39_0F_L, (vEnd << 8) | vSt );
5920 
5921 		MS_U16 total_block_num=__max((vEnd+1)/4-(vSt+3)/4,0)*__max((hEnd+1)/4-(hSt+3)/4,0);
5922 
5923 
5924 		if( !is_ne_set )
5925 		{
5926 			MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
5927 			is_ne_set = true;
5928 
5929 			MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, 0x0000, 0x0100);
5930 			MApi_XC_W2BYTEMSK(REG_SC_BK39_0D_L, 0x0001, 0x0001); // active window en
5931 		}
5932 		else if (MApi_XC_R2BYTEMSK(REG_SC_BK39_08_L, 0x0080)!=0)//ready
5933 		{
5934 			NE_histogram[0]=MApi_XC_R2BYTEMSK(REG_SC_BK39_10_L,0x07FF);
5935 			NE_histogram[1]=MApi_XC_R2BYTEMSK(REG_SC_BK39_11_L,0x07FF);
5936 			NE_histogram[2]=MApi_XC_R2BYTEMSK(REG_SC_BK39_12_L,0x07FF);
5937 			NE_histogram[3]=MApi_XC_R2BYTEMSK(REG_SC_BK39_13_L,0x07FF);
5938 			NE_histogram[4]=MApi_XC_R2BYTEMSK(REG_SC_BK39_14_L,0x07FF);
5939 			NE_histogram[5]=MApi_XC_R2BYTEMSK(REG_SC_BK39_15_L,0x07FF);
5940 			NE_histogram[6]=MApi_XC_R2BYTEMSK(REG_SC_BK39_16_L,0x07FF);
5941 			NE_histogram[7]=MApi_XC_R2BYTEMSK(REG_SC_BK39_17_L,0x07FF);
5942 			NE_histogram[8]=MApi_XC_R2BYTEMSK(REG_SC_BK39_18_L,0x07FF);
5943 			NE_histogram[9]=MApi_XC_R2BYTEMSK(REG_SC_BK39_19_L,0x07FF);
5944 			NE_histogram[10]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1A_L,0x07FF);
5945 			NE_histogram[11]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1B_L,0x07FF);
5946 			NE_histogram[12]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1C_L,0x07FF);
5947 			NE_histogram[13]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1D_L,0x07FF);
5948 			NE_histogram[14]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1E_L,0x07FF);
5949 			NE_histogram[15]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1F_L,0x07FF);
5950 			NE_histogram[16]=MApi_XC_R2BYTEMSK(REG_SC_BK39_20_L,0x07FF);
5951 			NE_histogram[17]=MApi_XC_R2BYTEMSK(REG_SC_BK39_21_L,0x07FF);
5952 			NE_histogram[18]=MApi_XC_R2BYTEMSK(REG_SC_BK39_22_L,0x07FF);
5953 			NE_histogram[19]=MApi_XC_R2BYTEMSK(REG_SC_BK39_23_L,0x07FF);
5954 			NE_histogram[20]=MApi_XC_R2BYTEMSK(REG_SC_BK39_24_L,0x07FF);
5955 			NE_histogram[21]=MApi_XC_R2BYTEMSK(REG_SC_BK39_25_L,0x07FF);
5956 			NE_histogram[22]=MApi_XC_R2BYTEMSK(REG_SC_BK39_26_L,0x07FF);
5957 			NE_histogram[23]=MApi_XC_R2BYTEMSK(REG_SC_BK39_27_L,0x07FF);
5958 			NE_histogram[24]=MApi_XC_R2BYTEMSK(REG_SC_BK39_28_L,0x07FF);
5959 
5960 			int i;
5961 			for (i = 4; i > 0; i-- )
5962 				noisehistory[i]=noisehistory[i-1];
5963 			for (i = 10; i > 0; i-- )
5964 				long_noisehistory[i]=long_noisehistory[i-1];
5965 			for (i=0;i<25;i++)
5966 				MV0count+=NE_histogram[i];
5967 			if (MV0count<total_block_num/12 || total_block_num<24)
5968 			{
5969 				if (safenoise>0)
5970 				{
5971 					avgpixeldiff=safenoise;
5972 					resetcount++;
5973 					reg_noise_confirm_level=8;
5974 				}
5975 				else
5976 				{
5977 					avgpixeldiff=noiseIIR;
5978 					reg_noise_confirm_level=0;
5979 				}
5980 				noisehistory[0]=0;
5981 				long_noisehistory[0]=0;
5982 			}
5983 			else
5984 			{
5985 				int maxhis=1;
5986 				int maxval=0;
5987 				for (i=0;i<24;i++)
5988 				{
5989 					int curva;
5990 					if (i==0)
5991 						curva=2*NE_histogram[i]+NE_histogram[i+1];
5992 					else if (i==23)
5993 						curva=2*NE_histogram[i]+NE_histogram[i-1];
5994 					else
5995 						curva=NE_histogram[i-1]+2*NE_histogram[i]+NE_histogram[i+1];
5996 
5997 					if (curva>maxval)
5998 					{
5999 						maxval=curva;
6000 						maxhis=i;
6001 					}
6002 				}
6003 				int thre1=4;
6004 				int thre2=13;
6005 				if (maxhis>12)
6006 				{
6007 					thre1=3;
6008 					thre2=10;
6009 				}
6010 				if ((maxval>total_block_num/10 && (maxval-NE_histogram[maxhis])*10/MV0count>=thre1 && NE_histogram[maxhis] * 100 / MV0count>thre2))// || MV0count<total_block_num/24)
6011 				{
6012 					noisehistory[0]=10*maxhis+5;
6013 					long_noisehistory[0]=1;
6014 					int nonzerocount=0;
6015 					int historytotal=0;
6016 					int firstnoise=0;
6017 					int long_nonzerocount=0;
6018 					for ( i=0;i<5;i++)
6019 					{
6020 						historytotal=historytotal+noisehistory[i];
6021 						if (noisehistory[i]>0)
6022 						{
6023 							nonzerocount++;
6024 							firstnoise=noisehistory[i];
6025 						}
6026 					}
6027 					for ( i=0;i<11;i++)
6028 						long_nonzerocount+=long_noisehistory[i];
6029 					if (nonzerocount>=3 && (maxhis<=3 || long_nonzerocount>=7))
6030 					{
6031 						int removefirstavg=(historytotal-firstnoise)/(nonzerocount-1);
6032 						if ((removefirstavg+20)<firstnoise)
6033 							safenoise=removefirstavg;
6034 						else
6035 							safenoise=historytotal/nonzerocount;
6036 						resetcount=0;
6037 						avgpixeldiff=noisehistory[0];
6038 						reg_noise_confirm_level=8;
6039 					}
6040 					else if (safenoise>0)
6041 					{
6042 						avgpixeldiff=safenoise;
6043 						resetcount++;
6044 						reg_noise_confirm_level=8;
6045 					}
6046 					else
6047 					{
6048 						avgpixeldiff=noisehistory[0];
6049 						reg_noise_confirm_level=1;
6050 					}
6051 				}
6052 				else
6053 				{
6054 					noisehistory[0]=0;
6055 					long_noisehistory[0]=0;
6056 					if (safenoise>0)
6057 					{
6058 						avgpixeldiff=safenoise;
6059 						resetcount++;
6060 						reg_noise_confirm_level=8;
6061 					}
6062 					else
6063 					{
6064 						avgpixeldiff=10*maxhis+5;
6065 						reg_noise_confirm_level=1;
6066 					}
6067 				}
6068 			}
6069 			if (resetcount>8)
6070 			{
6071 				safenoise=0;
6072 				resetcount=0;
6073 			}
6074 			int tmpcount=0;
6075 			int prenoise=0;
6076 			for ( i = 0; i < 5; i++ )
6077 			{
6078 				if (noisehistory[i]<250 && noisehistory[i]>0)
6079 				{
6080 					tmpcount++;
6081 					prenoise=prenoise+noisehistory[i];
6082 				}
6083 			}
6084 			if (tmpcount>0)
6085 				prenoise=prenoise/tmpcount;
6086 			int reg_ne_mv0cost_th =2*prenoise/10;
6087 			reg_ne_mv0cost_th = reg_ne_mv0cost_th > 3 ? reg_ne_mv0cost_th : 3;
6088 			if (tmpcount==0)
6089 				reg_ne_mv0cost_th =60;
6090 			MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, reg_ne_mv0cost_th, 0x003F);
6091 
6092 			if (reg_noise_confirm_level==8)
6093 				noiseIIR = (noiseIIR*3+avgpixeldiff) >> 2;
6094 
6095 			MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
6096 			is_ne_set = true;
6097 		}
6098 	}
6099 
6100 	*estNoise = (MS_U8)( noiseIIR <= 255 ? noiseIIR : 255 );
6101 
6102 	return reg_noise_confirm_level;
6103 }
6104 
6105 /******************************************************************************/
6106 ///UCNR Driver
6107 /******************************************************************************/
Hal_PQ_LoadMCNRLutQmapSetting()6108 MS_BOOL Hal_PQ_LoadMCNRLutQmapSetting()
6109 {
6110     //UCNR LUT
6111 #if MCNR_LUT_LOAD_FROM_QMAP
6112     m_stMCNRLutQmapSetting.mcnrLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_08_L);
6113     m_stMCNRLutQmapSetting.mcnrLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_09_L);
6114     m_stMCNRLutQmapSetting.mcnrLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_0A_L);
6115     m_stMCNRLutQmapSetting.mcnrLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_0B_L);
6116     m_stMCNRLutQmapSetting.mcnrLut[4] = MApi_XC_R2BYTE(REG_SC_BK2A_0C_L);
6117     m_stMCNRLutQmapSetting.mcnrLut[5] = MApi_XC_R2BYTE(REG_SC_BK2A_0D_L);
6118     m_stMCNRLutQmapSetting.mcnrLut[6] = MApi_XC_R2BYTE(REG_SC_BK2A_0E_L);
6119     m_stMCNRLutQmapSetting.mcnrLut[7] = MApi_XC_R2BYTE(REG_SC_BK2A_0F_L);
6120 #else
6121     m_stMCNRLutQmapSetting.mcnrLut[0] = 0xFFEE;
6122     m_stMCNRLutQmapSetting.mcnrLut[1] = 0xDDCC;
6123     m_stMCNRLutQmapSetting.mcnrLut[2] = 0xBBAA;
6124     m_stMCNRLutQmapSetting.mcnrLut[3] = 0x9988;
6125     m_stMCNRLutQmapSetting.mcnrLut[4] = 0x7766;
6126     m_stMCNRLutQmapSetting.mcnrLut[5] = 0x5544;
6127     m_stMCNRLutQmapSetting.mcnrLut[6] = 0x3322;
6128     m_stMCNRLutQmapSetting.mcnrLut[7] = 0x1100;
6129 #endif
6130 
6131     //PDNR LUT
6132 #if PDNR_LUT_LOAD_FROM_QMAP
6133     m_stMCNRLutQmapSetting.pdnrlowLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_1C_L);
6134     m_stMCNRLutQmapSetting.pdnrlowLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_1D_L);
6135     m_stMCNRLutQmapSetting.pdnrlowLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_1E_L);
6136     m_stMCNRLutQmapSetting.pdnrlowLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_1F_L);
6137     m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_20_L);
6138     m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_21_L);
6139     m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_22_L);
6140     m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_23_L);
6141     m_stMCNRLutQmapSetting.pdnrhighLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_24_L);
6142     m_stMCNRLutQmapSetting.pdnrhighLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_25_L);
6143     m_stMCNRLutQmapSetting.pdnrhighLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_26_L);
6144     m_stMCNRLutQmapSetting.pdnrhighLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_27_L);
6145 #else
6146     m_stMCNRLutQmapSetting.pdnrlowLut[0] = 0x8888;
6147     m_stMCNRLutQmapSetting.pdnrlowLut[1] = 0x8888;
6148     m_stMCNRLutQmapSetting.pdnrlowLut[2] = 0x7654;
6149     m_stMCNRLutQmapSetting.pdnrlowLut[3] = 0x3210;
6150     m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = 0x2100;
6151     m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = 0x0000;
6152     m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = 0x0000;
6153     m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = 0x0000;
6154     if(_bIsHDSource)
6155     {
6156         m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8888;
6157         m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x8888;
6158         m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x8887;
6159         m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x6420;
6160     }
6161     else
6162     {
6163         m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8876;
6164         m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x5432;
6165         m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x1000;
6166         m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x0000;
6167     }
6168 #endif
6169 
6170     return true;
6171 }
6172 
MDrv_SC_NR_LUT_Aux(void * pInstance,MS_U16 nr_lut,MS_U8 sc)6173 MS_U16 MDrv_SC_NR_LUT_Aux(void *pInstance, MS_U16 nr_lut, MS_U8 sc)
6174 {
6175 	sc = sc < 16 ? sc : 16;
6176 
6177     MS_U8 h0 = (nr_lut >>  0) & 0xF;
6178     MS_U8 h1 = (nr_lut >>  4) & 0xF;
6179     MS_U8 h2 = (nr_lut >>  8) & 0xF;
6180     MS_U8 h3 = (nr_lut >> 12) & 0xF;
6181 
6182     XC_ApiStatus DrvStatus;
6183 	MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
6184 	if ((!DrvStatus.bInterlace) && (DrvStatus.u16InputVFreq < 300)) //reduce gain value if 24p
6185 	{
6186 		h0 = ((h0 * sc)/3) >> 4;
6187 		h1 = ((h1 * sc)/3) >> 4;
6188 		h2 = ((h2 * sc)/3) >> 4;
6189 		h3 = ((h3 * sc)/3) >> 4;
6190 	}
6191 	else
6192 	{
6193 		h0 = (h0 * sc) >> 4;
6194 	    h1 = (h1 * sc) >> 4;
6195 	    h2 = (h2 * sc) >> 4;
6196 	    h3 = (h3 * sc) >> 4;
6197 	}
6198 
6199     return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6200 }
6201 
MDrv_SC_NR_LUT_Offset_Aux(void * pInstance,MS_U16 nr_lut,MS_U8 sc)6202 MS_U16 MDrv_SC_NR_LUT_Offset_Aux(void *pInstance, MS_U16 nr_lut, MS_U8 sc)
6203 {
6204 	sc = sc < 0xF ? sc : 0xF;
6205 
6206     MS_U8 h0 = (nr_lut >>  0) & 0xF;
6207     MS_U8 h1 = (nr_lut >>  4) & 0xF;
6208     MS_U8 h2 = (nr_lut >>  8) & 0xF;
6209     MS_U8 h3 = (nr_lut >> 12) & 0xF;
6210 
6211     h0 = (h0 > sc) ? h0 - sc : 0;
6212     h1 = (h1 > sc) ? h1 - sc : 0;
6213     h2 = (h2 > sc) ? h2 - sc : 0;
6214     h3 = (h3 > sc) ? h3 - sc : 0;
6215 
6216     return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6217 }
6218 
MDrv_SC_Luma_PK_LUT_Aux(void * pInstance,const MS_U8 table[],MS_U8 sc)6219 MS_U16 MDrv_SC_Luma_PK_LUT_Aux(void *pInstance, const MS_U8 table[], MS_U8 sc)
6220 {
6221 	sc = sc < 16 ? sc : 16;
6222 
6223 	MS_U8 h0 = ( 8 * (16-sc) + table[0] * sc + 8) >> 4;
6224 	MS_U8 h1 = ( 8 * (16-sc) + table[1] * sc + 8) >> 4;
6225 	MS_U8 h2 = ( 8 * (16-sc) + table[2] * sc + 8) >> 4;
6226 	MS_U8 h3 = ( 8 * (16-sc) + table[3] * sc + 8) >> 4;
6227 
6228 	return (h0 << 12) | (h1 << 8) | (h2 << 4) | (h3 << 0);
6229 }
6230 
MDrv_SC_Set_PDNR_Gain(void * pInstance,MS_U8 gain,MS_BOOL isSourceChange)6231 void MDrv_SC_Set_PDNR_Gain(void *pInstance, MS_U8 gain, MS_BOOL isSourceChange )
6232 {
6233     MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlowLut[0], gain ) );
6234     MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlowLut[1], gain ) );
6235     MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlowLut[2], gain ) );
6236     MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlowLut[3], gain ) );
6237     MApi_XC_W2BYTE(REG_SC_BK2A_20_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlow2Lut[0], gain ) );
6238     MApi_XC_W2BYTE(REG_SC_BK2A_21_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlow2Lut[1], gain ) );
6239     MApi_XC_W2BYTE(REG_SC_BK2A_22_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlow2Lut[2], gain ) );
6240     MApi_XC_W2BYTE(REG_SC_BK2A_23_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrlow2Lut[3], gain ) );
6241     MApi_XC_W2BYTE(REG_SC_BK2A_24_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrhighLut[0], gain ) );
6242     MApi_XC_W2BYTE(REG_SC_BK2A_25_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrhighLut[1], gain ) );
6243     MApi_XC_W2BYTE(REG_SC_BK2A_26_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrhighLut[2], gain ) );
6244     MApi_XC_W2BYTE(REG_SC_BK2A_27_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.pdnrhighLut[3], gain ) );
6245 }
6246 
MDrv_SC_Set_MCNR_Gain(void * pInstance,MS_U8 gain,MS_BOOL isSourceChange)6247 void MDrv_SC_Set_MCNR_Gain(void *pInstance, MS_U8 gain, MS_BOOL isSourceChange )
6248 {
6249     MApi_XC_W2BYTE(REG_SC_BK2A_08_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[0], gain ) );
6250     MApi_XC_W2BYTE(REG_SC_BK2A_09_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[1], gain ) );
6251     MApi_XC_W2BYTE(REG_SC_BK2A_0A_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[2], gain ) );
6252     MApi_XC_W2BYTE(REG_SC_BK2A_0B_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[3], gain ) );
6253     MApi_XC_W2BYTE(REG_SC_BK2A_0C_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[4], gain ) );
6254     MApi_XC_W2BYTE(REG_SC_BK2A_0D_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[5], gain ) );
6255     MApi_XC_W2BYTE(REG_SC_BK2A_0E_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[6], gain ) );
6256     MApi_XC_W2BYTE(REG_SC_BK2A_0F_L, MDrv_SC_NR_LUT_Aux(pInstance, m_stMCNRLutQmapSetting.mcnrLut[7], gain ) );
6257 }
6258 
MDrv_SC_Set_PostDINR_Gain(void * pInstance,MS_U8 gain,MS_BOOL isSourceChange)6259 void MDrv_SC_Set_PostDINR_Gain(void *pInstance, MS_U8 gain, MS_BOOL isSourceChange )
6260 {
6261 	static MS_U16 lut[4];
6262 	if( isSourceChange )
6263 	{
6264 		lut[0] = MApi_XC_R2BYTE(REG_SC_BK61_08_L);
6265 		lut[1] = MApi_XC_R2BYTE(REG_SC_BK61_09_L);
6266 		lut[2] = MApi_XC_R2BYTE(REG_SC_BK61_0A_L);
6267 		lut[3] = MApi_XC_R2BYTE(REG_SC_BK61_0B_L);
6268 	}
6269 	else
6270 	{
6271 		MApi_XC_W2BYTE(REG_SC_BK61_08_L, MDrv_SC_NR_LUT_Aux(pInstance, lut[0], gain ) );
6272 		MApi_XC_W2BYTE(REG_SC_BK61_09_L, MDrv_SC_NR_LUT_Aux(pInstance, lut[1], gain ) );
6273 		MApi_XC_W2BYTE(REG_SC_BK61_0A_L, MDrv_SC_NR_LUT_Aux(pInstance, lut[2], gain ) );
6274 		MApi_XC_W2BYTE(REG_SC_BK61_0B_L, MDrv_SC_NR_LUT_Aux(pInstance, lut[3], gain ) );
6275 	}
6276 }
6277 
MDrv_SC_Set_Luma_PK_Gain(void * pInstance,MS_U8 gain)6278 void MDrv_SC_Set_Luma_PK_Gain(void *pInstance, MS_U8 gain )
6279 {
6280 	const MS_U8 tableL[4] = { 2, 2, 8, 8 };
6281 	const MS_U8 tableH[4] = { 10, 8, 8, 6 };
6282 
6283 	MApi_XC_W2BYTE(REG_SC_BK19_55_L, 0x21 );
6284 	MApi_XC_W2BYTE(REG_SC_BK19_56_L, MDrv_SC_Luma_PK_LUT_Aux(pInstance, tableL, gain ) );
6285 	MApi_XC_W2BYTE(REG_SC_BK19_57_L, MDrv_SC_Luma_PK_LUT_Aux(pInstance, tableH, gain ) );
6286 }
6287 
MDrv_SC_GMV_Stability(void * pInstance,MS_U16 * gmvDiff,MS_U8 * gmvAvgX,MS_U8 * gmvAvgY,const XC_GMvStates * GMV,const MS_BOOL isOpFrameChanged)6288 void MDrv_SC_GMV_Stability(void *pInstance, MS_U16 *gmvDiff, MS_U8 *gmvAvgX, MS_U8 *gmvAvgY, const XC_GMvStates *GMV, const MS_BOOL isOpFrameChanged )
6289 {
6290 	static XC_GMvStates gmvHist[8];
6291 	static MS_U8 histPos = 0;
6292 	static MS_U16 mvDiff = 0;
6293 	static MS_U16 mvAvgX = 0, mvAvgY = 0;
6294 
6295 	if( isOpFrameChanged )
6296 	{
6297 		gmvHist[histPos] = *GMV;
6298 		histPos = histPos < 7 ? histPos+1 : 0;
6299 
6300 		mvDiff = 0;
6301 		mvAvgX = mvAvgY = 0;
6302 		int i;
6303 		for( i = 0 ; i < 8 ; ++i )
6304 		{
6305 			if( i != 0 )
6306 				mvDiff += abs( gmvHist[i].minMvXdir - gmvHist[i-1].minMvXdir ) + abs( gmvHist[i].minMvYdir - gmvHist[i-1].minMvYdir );
6307 			mvAvgY += gmvHist[i].minMvYdir;
6308 			mvAvgX += gmvHist[i].minMvXdir;
6309 		}
6310 		mvAvgY = ( mvAvgY + 4 ) >> 3;
6311 		mvAvgX = ( mvAvgX + 4 ) >> 3;
6312 	}
6313 
6314 	*gmvDiff = mvDiff;
6315 	*gmvAvgX = mvAvgX;
6316 	*gmvAvgY = mvAvgY;
6317 }
6318 
MDrv_SC_NR_HouseMD_Patch(void * pInstance,const MS_U16 me1NotFoundBlk,const XC_LumaHistogramStates * lumaHistogramStates,const MS_BOOL isSceneChange)6319 MS_U8 MDrv_SC_NR_HouseMD_Patch(void *pInstance,
6320 	/*const MS_U8 gmvAvgX, const MS_U8 gmvAvgY, const int blkConfidence,*/ const MS_U16 me1NotFoundBlk, const XC_LumaHistogramStates *lumaHistogramStates,
6321 	const MS_BOOL isSceneChange
6322 )
6323 {
6324 	static MS_U8 u8LowLumaVerMovingCnt = 0;
6325 
6326 	MS_U32 darkSum = 0, lowLumaSum = 0, avgLuma = 0, totalSum = 0;
6327 	int i = 0;
6328 	for( i = 0 ; i < 32 ; ++i )
6329 	{
6330 		if( i < 4 ) darkSum += lumaHistogramStates->lumaBin[i];
6331 		if( i < 8 ) lowLumaSum += lumaHistogramStates->lumaBin[i];
6332 		totalSum += lumaHistogramStates->lumaBin[i];
6333 		avgLuma += lumaHistogramStates->lumaBin[i] * i;
6334 	}
6335 	if( totalSum != 0 )
6336 	{
6337 		avgLuma /= totalSum;
6338 		darkSum = darkSum * 256 / totalSum;
6339 		lowLumaSum = lowLumaSum * 256 / totalSum;
6340 	}
6341 	else
6342 	{
6343 		avgLuma = 0;
6344 		darkSum = 0;
6345 		lowLumaSum = 0;
6346 	}
6347 
6348 	MS_U16 u16TopCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6349 	MS_U16 u16BottomCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6350 
6351 	//PRT_TRP( "Luma dark, low, avg: %d, %d, %d\n", (int)darkSum, (int)lowLumaSum, (int)avgLuma );
6352 
6353 	if(
6354 		( u8LowLumaVerMovingCnt <= 8 ? (darkSum > 170) : (darkSum > 160)  )
6355 		&& lowLumaSum > 230
6356 		&& avgLuma < 4
6357 		/*&& blkConfidence > 70*/
6358 		&& me1NotFoundBlk > 0x300
6359 		&& ( u8LowLumaVerMovingCnt <= 8 ? (u16TopCnt > 0xFF || u16BottomCnt > 0xFF) : (u16TopCnt > 0xF || u16BottomCnt > 0xF) )
6360 	)
6361 	{
6362 		u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt < 64 ? u8LowLumaVerMovingCnt+1 : 64;
6363 	}
6364 	else
6365 	{
6366 		u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt > 0 ? u8LowLumaVerMovingCnt-1 : 0;
6367 	}
6368 
6369 	if( isSceneChange )
6370 	{
6371 		u8LowLumaVerMovingCnt = 0;
6372 	}
6373 
6374 	//MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, isVerMoving ? 0x0020 : 0x0010, 0x00F0 );
6375 
6376 	return u8LowLumaVerMovingCnt;
6377 }
6378 
MDrv_SC_NR_Driver_E28(void * pInstance,const MS_U16 u16MotionValue4,const XC_LumaHistogramStates * lumaHistogramStates,const XC_FilmStates * filmstatus,const XC_GMvStates * GMV,const MS_BOOL isUkosabihsMotion,const MS_BOOL isSceneChangeExt,const MS_BOOL bInterlace,const MS_BOOL isHDSrc,const MS_BOOL isSourceChange,const MS_BOOL isOpFrameChanged,const MS_U8 * estNoise,const MS_U8 NE_confirm)6379 void MDrv_SC_NR_Driver_E28
6380 (
6381     void *pInstance,
6382     const MS_U16 u16MotionValue4,
6383 /*	const int blkConfidence,*/
6384     //const MS_U32 hpfHdTolerantReport,
6385     const XC_LumaHistogramStates *lumaHistogramStates,
6386     const XC_FilmStates *filmstatus,
6387     //const XC_LetterBoxState *letterBoxState,
6388     //const XC_ApiStatus *stXCStatus,
6389     const XC_GMvStates *GMV,
6390     const MS_BOOL isUkosabihsMotion,
6391     const MS_BOOL isSceneChangeExt,
6392     const MS_BOOL bInterlace,
6393     const MS_BOOL isHDSrc,
6394     const MS_BOOL isSourceChange,
6395     const MS_BOOL isOpFrameChanged,
6396     const MS_U8 *estNoise,
6397     const MS_U8 NE_confirm
6398 )
6399 {
6400     // Update MCNR/PDNR LUT from Qmap
6401     MS_BOOL bMCNR_LUT_Reload = (MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L, 0x0400)>>8);
6402     if(bMCNR_LUT_Reload)
6403     {
6404         if(Hal_PQ_LoadMCNRLutQmapSetting())
6405             MApi_XC_W2BYTEMSK(REG_SC_BK30_0C_L, 0x0000, 0x0400);
6406     }
6407 
6408 	// debug en
6409 	MS_BOOL dbgEn = MApi_XC_R2BYTEMSK(REG_SC_BK30_38_L, 0x0001 ) & (MApi_XC_R2BYTEMSK(REG_SC_BK30_39_L, 0x0001 ));
6410 	if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0003, 0x0003 );
6411 
6412 	static MS_BOOL prevIsSceneChangeExt = 0;
6413 	MS_BOOL isSceneChange = 0;
6414 	if( (!prevIsSceneChangeExt) && isSceneChangeExt )
6415 		isSceneChange = 1;
6416 
6417 	prevIsSceneChangeExt = isSceneChangeExt;
6418 
6419 	static MS_U8 mcnrMotionCnt = 0;
6420 	static MS_U8 noiseLevel = 0;
6421 	//static MS_U8 smvFrameCnt = 0;
6422 	static MS_U8 panScanCnt = 0;
6423 
6424 	/* Get UCNR Status */
6425 	MS_U16 me1MovingWeight3x3Min = MDrv_SC_read_avgMcnrMovingWeightMin(pInstance);
6426 	//MS_U16 me1MovingWeight3x3Max = MDrv_SC_read_avgMcnrMovingWeightMax(pInstance);
6427 	MS_U16 me1MovingWeight = MDrv_SC_read_avgMcnrMovingWeight(pInstance);
6428 	MS_U16 me1Mv0Cost = MDrv_SC_read_avgMv0MovingWeight(pInstance);
6429 	MS_U16 me2SadDiff = MDrv_SC_read_me2SadDiff(pInstance);
6430 
6431 	MS_U16 mcnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_70_L);
6432 	//MS_U16 mcnr2WPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_71_L);
6433 	MS_U16 pdnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_72_L);
6434 
6435 	MS_U8 smallMovingW = MDrv_SC_McSmallMoving(pInstance, me1MovingWeight3x3Min, me1Mv0Cost );
6436 	if (dbgEn)
6437 	DEBUG_LC_40(pInstance, smallMovingW );
6438 
6439 	MS_U8 motion4StillCnt = MDrv_SC_Motion4StillCnt(pInstance, u16MotionValue4 ); // 0 ~ 15
6440 	//MS_U8 stillW = MDrv_SC_Me1Still(pInstance, me1MovingWeight3x3Max, me1Mv0Cost );
6441 
6442 	/*1D motion status*/
6443 	MS_U16 mv0pixels  = MApi_XC_R2BYTE(REG_SC_BK09_78_L);
6444 	MS_U16 nonMv0Pixels = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
6445 	MS_U16 mvNotFoundPixels = MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
6446 
6447 	/*2D motion status*/
6448 	MS_U16 me1Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
6449 	MS_U16 me1NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
6450 	MS_U16 me1NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
6451 	MS_U16 me2Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
6452 	MS_U16 me2NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
6453 	MS_U16 me2NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
6454 
6455 	static MS_BOOL lastEN = 0;
6456 
6457 
6458 	if( isSceneChange || isSourceChange )
6459 		noiseLevel = 0;
6460 	else
6461 	{
6462         //NE_confirm = MDrv_SC_GetNoiseLevel( &estNoise, letterBoxState, stXCStatus, bInterlace, isOpFrameChanged );
6463 		if (NE_confirm==8)
6464 			lastEN=1;
6465 		else if (NE_confirm==0 || NE_confirm==1)
6466 			lastEN=0;
6467 		if( NE_confirm == 8 || (NE_confirm==2 && lastEN==1))
6468         noiseLevel = *estNoise;
6469 		else
6470 			noiseLevel = 0;
6471 	}
6472 	//printf("noise level : %d, %d\n", noiseLevel, NE_confirm);
6473 	//printf("noise opframe change : %d\n", (int)isOpFrameChanged);
6474 
6475 	// NE adaptive debug en
6476 	MS_BOOL neAdptDbgEn = /*(MApi_XC_R2BYTE(REG_SC_BK2A_51_L) == 0x0100) && */(!isUkosabihsMotion);
6477 
6478 	// NE adaptive dnr4w_max
6479 	MS_U8 dnr4Max = noiseLevel > 40 ? (noiseLevel-40)/4 + 0xC : 0xC;
6480 	dnr4Max = dnr4Max < 0xF ? dnr4Max : 0xF;
6481 	dnr4Max = neAdptDbgEn ? dnr4Max : 0xC;
6482 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_4D_L, dnr4Max << 12, 0xF000 );
6483 
6484 	// NE adaptive mcnr noise level
6485 	MS_U8 nlMax = noiseLevel > 40 ? (noiseLevel-40)/4 + 8 : 8;
6486 	nlMax = nlMax < 0xF ? nlMax : 0xF;
6487 	nlMax = neAdptDbgEn ? nlMax : 8;
6488 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, nlMax << 8, 0x0F00 );
6489 
6490 	MS_U16 gmvDiff = 0;
6491 	MS_U8 gmvAvgX = 0, gmvAvgY = 0;
6492 	MDrv_SC_GMV_Stability(pInstance, &gmvDiff, &gmvAvgX, &gmvAvgY, GMV, isOpFrameChanged );
6493 	//printf( "GMV diff, avgX, avgY: %d, %d %d\n", gmvDiff, gmvAvgX, gmvAvgY );
6494 
6495 	//DEBUG_LC_41(pInstance, motion4StillCnt );
6496 	//DEBUG_LC_43(pInstance, noiseLevel );
6497 	//printf( "noise level : %d\n", noiseLevel );
6498 
6499 	// force film-like/m2s weight to max if source is progressive/film
6500 	if( (!bInterlace) || filmstatus->film_act )
6501 	{
6502 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0xE000, 0xFF00);
6503 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x5000, 0xF000 );
6504 	}
6505 	else
6506 	{
6507 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0x0000, 0xFF00);
6508 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x3000, 0xF000 );
6509 	}
6510 
6511 	MS_U16 mcnrWPixCntThL, pdnrWPixCntThL, mcnrWPixCntThH, pdnrWPixCntThH;
6512 //	MS_U16 smvTh;
6513 	MS_U16 panScanThL, panScanThH;
6514 	MS_U16 almostStillTh;
6515 	if( isHDSrc )
6516 	{
6517 		mcnrWPixCntThL = 0xF0;
6518 		pdnrWPixCntThL = 0xF0;
6519 		mcnrWPixCntThH = 0x3800;
6520 		pdnrWPixCntThH = 0x3800;
6521 		panScanThH = 0x3000;
6522 		panScanThL = 0x2000;
6523 		almostStillTh = 0x200;
6524 #if 0
6525 		if( noiseLevel > 0x40 )
6526 			smvTh = 0xFF;
6527 		else
6528 			smvTh = 0x00;
6529 #endif
6530 	}
6531 	else
6532 	{
6533 		mcnrWPixCntThL = 0xF0;
6534 		pdnrWPixCntThL = 0xF0;
6535 		mcnrWPixCntThH = 0x980; //0x580;
6536 		pdnrWPixCntThH = 0xB80; //0xA00;
6537 		panScanThH = 0x800;
6538 		panScanThL = 0x500;
6539 		almostStillTh = 0x30;
6540 #if 0
6541 		if( noiseLevel > 0x40 )
6542 			smvTh = 0xFF;
6543 		else
6544 			smvTh = 0x00;
6545 #endif
6546 	}
6547 
6548 	static MS_BOOL isStill = true, isStillDelay = true, isStillNoSceneChane = true, isStillDelayNoSceneChane = true;
6549 	if( (mcnrWPixCnt < mcnrWPixCntThL && pdnrWPixCnt < pdnrWPixCntThL && motion4StillCnt > 8 )
6550 		|| ( mcnrWPixCnt < mcnrWPixCntThH && pdnrWPixCnt < pdnrWPixCntThH && motion4StillCnt > 12 )
6551 		)
6552 	{
6553 		mcnrMotionCnt = 0;
6554 		isStill = isStillDelay = true;
6555 		isStillNoSceneChane = isStillDelayNoSceneChane = isSceneChange ? false : true;
6556 	}
6557 	else
6558 	{
6559 		if( mcnrMotionCnt > 16 )
6560 		{
6561 			isStill = isStillNoSceneChane = false;
6562 
6563 			if( mcnrMotionCnt > 32 )
6564 				isStillDelay = isStillDelayNoSceneChane = false;
6565 			else
6566 			{
6567 				isStillDelay = true;
6568 				isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6569 				++mcnrMotionCnt;
6570 			}
6571 		}
6572 		else
6573 		{
6574 			isStill = isStillDelay = true;
6575 			isStillNoSceneChane = ( isSceneChange || !isStillNoSceneChane ) ? false : true;
6576 			isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6577 			++mcnrMotionCnt;
6578 		}
6579 	}
6580 
6581 	// reduce pdnr weight by ME1 smv at small moving or almost still scenes
6582 //	MS_BOOL isAlmostStill;
6583 	if( me1MovingWeight < almostStillTh )
6584 	{
6585 //		isAlmostStill = true;
6586 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0010, 0x00F0 );
6587 	}
6588 	else
6589 	{
6590 //		isAlmostStill = false;
6591 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0020, 0x00F0 );
6592 	}
6593 
6594 	// panScan
6595 	static MS_BOOL isPanScan = false;
6596 	if( me1MovingWeight > panScanThH )
6597 	{
6598 		if( panScanCnt < 16 )
6599 			++panScanCnt;
6600 	}
6601 	else
6602 	{
6603 		if( !(isPanScan && me1MovingWeight > panScanThL) )
6604 		{
6605 			if( panScanCnt > 0 )
6606 				--panScanCnt;
6607 		}
6608 	}
6609 
6610 	if( panScanCnt > 6 )
6611 	{
6612 		isPanScan = true;
6613 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0100, 0x0F00 );
6614 	}
6615 	else
6616 	{
6617 		isPanScan = false;
6618 		if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0200, 0x0F00 );
6619 	}
6620 
6621 	// low texture moving
6622 	static MS_U8 lowTexMovingCnt = 0; // 0~32
6623 	MS_BOOL isMe1Moving = false, isMe2Moving = false, is1DLowTexMoving = false;
6624 	if( me1Mv0Blk < 0x20 && me1NonMv0Blk < 0x40 && me1NotFoundBlk > 0x3D0 && me1MovingWeight > 0x500/*0x1300*/ )
6625 	{
6626 		isMe1Moving = true;
6627 	}
6628 
6629 	if( me2Mv0Blk < 0x800 && me2NonMv0Blk > 0x700 && me2NotFoundBlk > 0xD00 )
6630 	{
6631 		isMe2Moving = true;
6632 	}
6633 
6634 	if( mv0pixels < 0x2FF && nonMv0Pixels < 0xF00 && mvNotFoundPixels < 0x160 )
6635 	{
6636 		is1DLowTexMoving = true;
6637 	}
6638 
6639 	if( isMe1Moving && isMe2Moving && is1DLowTexMoving )
6640 	{
6641 		if( lowTexMovingCnt < 32 )
6642 			++lowTexMovingCnt;
6643 	}
6644 	else if( lowTexMovingCnt > 0 )
6645 	{
6646 		--lowTexMovingCnt;
6647 	}
6648 
6649 	MS_BOOL isLowTexMoving = false;
6650 	if( lowTexMovingCnt > 8 )
6651 	{
6652 		// enable keep detail
6653 		isLowTexMoving = true;
6654 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0x1000, 0xF000);
6655 	}
6656 	else
6657 	{
6658 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0xF000, 0xF000);
6659 	}
6660 
6661 	static MS_U8 pdnrGain = 16;
6662 	static MS_U8 me1NRStrength = 0xF;
6663 
6664 	// isUkosabihsMotion then reduce PDNR table
6665 	if( isUkosabihsMotion && isPanScan && !isLowTexMoving )
6666 	{
6667 		// maximum PDNR gain 12
6668 		pdnrGain = pdnrGain > 12 ? pdnrGain-1 : (pdnrGain < 12 ? pdnrGain + 1 : pdnrGain );
6669 		// reduce ME1_moving_w_nr_strength to 3
6670 		me1NRStrength = me1NRStrength > 3 ? me1NRStrength - 1 : me1NRStrength;
6671 	}
6672 	// isLowTexMoving or isUkosabihsMotion but me1 moving weight is small then turn off PDNR
6673 	else if( ( isUkosabihsMotion && !isPanScan ) || isLowTexMoving )
6674 	{
6675 		// turn off PDNR
6676 			pdnrGain = pdnrGain > 6 ? pdnrGain - 6 : 0;
6677 			me1NRStrength = me1NRStrength < 0xE ? me1NRStrength + 2 : 0xF;
6678 	}
6679 	else
6680 	{
6681 			pdnrGain = pdnrGain < 10 ? pdnrGain + 6 : 16;
6682 			me1NRStrength = me1NRStrength < 0xB ? me1NRStrength + 4 : 0xF;
6683 	}
6684 
6685 	static MS_U8 maxSnrStrength = 32;
6686 	// isUkosabihsMotion || isPanScan then turn off SNR
6687 	if( isUkosabihsMotion || isPanScan )
6688 		maxSnrStrength = maxSnrStrength > 0 ? maxSnrStrength-1 : 0;
6689 	else
6690 		maxSnrStrength = maxSnrStrength < 32 ? maxSnrStrength+1 : 32;
6691 
6692 	// max SNR Weight
6693 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_69_L, maxSnrStrength << 8, 0x3F00);
6694 
6695 #if HOUSE_MD_PATTERN_ENABLE
6696 	// House MD patch
6697 	MS_U8 u8LowLumaVerMovingCnt = MDrv_SC_NR_HouseMD_Patch( pInstance,/*gmvAvgX, gmvAvgY, blkConfidence, */me1NotFoundBlk, lumaHistogramStates, isSceneChange );
6698 #else
6699     static MS_U8 u8LowLumaVerMovingCnt = 0;
6700 #endif
6701 
6702 
6703 	// force 2D for stable vertical moving
6704 	static MS_U8 force2DCnt = 0;
6705 	static MS_U8 force1Dcnt = 0;
6706 	//if( isUkosabihsMotion && gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7)
6707 	if( isUkosabihsMotion && gmvDiff < 2 &&
6708 		( (gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) || ( abs( gmvAvgX - 32 ) < 16 && abs( gmvAvgX - 32 ) > 9 ) )
6709 	)
6710 	{
6711 		if( force2DCnt < 32 )
6712 			++force2DCnt;
6713 	}
6714 	else if(  gmvDiff < 5 &&
6715 		(gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) && isPanScan && ( abs( gmvAvgX - 32 ) < 3)  )
6716 	{
6717 		if( force2DCnt < 32 )
6718 			++force2DCnt;
6719 	}
6720 	else
6721 	{
6722 		if( force2DCnt > 0 )
6723 			--force2DCnt;
6724 	}
6725 
6726 	// force 1D if small moving horizontal burst ( me2 not stable )
6727 	if( !isUkosabihsMotion /*&& hpfHdTolerantReport > 0xC000*/ && me1Mv0Cost > 0x1900 && me2SadDiff < 0x100 )
6728 	{
6729 		if( force1Dcnt < 32 )
6730 			++force1Dcnt;
6731 	}
6732 	else
6733 	{
6734 		if( force1Dcnt > 0 )
6735 			--force1Dcnt;
6736 	}
6737 
6738 	if( !isUkosabihsMotion && u8LowLumaVerMovingCnt > 8 )
6739 	{
6740 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4100, 0x7F00 );
6741 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0000, 0x0008 );
6742 	}
6743 	else
6744 	{
6745 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0008, 0x0008 );
6746 
6747 	if( force2DCnt > 16 )
6748 	{
6749 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4000, 0x7F00 );
6750 	}
6751 	else if( force1Dcnt > 16 )
6752 	{
6753 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x6000, 0x7F00 );
6754 	}
6755 	else if( force2DCnt < 8 || force1Dcnt < 8 )
6756 	{
6757 		MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x0000, 0x7F00 );
6758 	}
6759 	}
6760 
6761 	// still and vertical pan scan
6762 	static MS_U8 mcnrGain = 16;
6763 	if( isUkosabihsMotion )
6764 	{
6765 		if( gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6766 		{
6767 			// stable vertical moving
6768 			mcnrGain = mcnrGain > 8 ? mcnrGain  - 1 : ( mcnrGain < 8 ? mcnrGain + 1 : 8 );
6769 		}
6770 		else if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6771 		{
6772 			mcnrGain = mcnrGain > 4 ? mcnrGain  - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6773 		}
6774 		else if( abs( gmvAvgY - 8 ) >= 7 || abs( gmvAvgX - 32 ) >= 16 )
6775 		{
6776 			// high mv vertical moving
6777 			mcnrGain = mcnrGain > 0 ? mcnrGain  - 1 : 0;
6778 		}
6779 		else
6780 		{
6781 			mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6782 		}
6783 	}
6784 	else if( isPanScan )
6785 	{
6786 		// not isUkosabihsMotion
6787 		if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 )
6788 		{
6789 			if( force2DCnt > 16 )
6790 			{
6791 				mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6792 			}
6793 			else
6794 			{
6795 			mcnrGain = mcnrGain > 4 ? mcnrGain  - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6796 		}
6797 		}
6798 		else if( abs( gmvAvgY - 8 ) >= 7 )
6799 		{
6800 			// high mv vertical moving
6801 			mcnrGain = mcnrGain > 0 ? mcnrGain  - 1 : 0;
6802 		}
6803 		else
6804 		{
6805 			mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6806 		}
6807 	}
6808 	else if( (abs( gmvAvgX - 32 ) >= 16) && (force2DCnt < 16) )
6809 	{
6810 		// motion is out of 1D search range
6811 		// MCNR creates contours
6812 		mcnrGain = mcnrGain > 8 ? mcnrGain  - 1 : mcnrGain;
6813 		pdnrGain = pdnrGain < 20 ? pdnrGain + 2 : pdnrGain;
6814 	}
6815 	else
6816 	{
6817 		//mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6818 		//mcnrGain = isSceneChange ? 16 : ( mcnrGain < 16 ? mcnrGain + 1 : 16 );
6819 		 mcnrGain = isSceneChange ? 16 : ( mcnrGain < 12 ? mcnrGain + 4 :16 );
6820 	}
6821 
6822 	// direct overwrite
6823 	if( isStillNoSceneChane /*isStill*/ || ( isStillDelayNoSceneChane/*isStillDelay*/ && gmvAvgY != 8) )
6824 	{
6825 		mcnrGain = 3;
6826 	}
6827 
6828 	// MCNR gain
6829 	MDrv_SC_Set_MCNR_Gain( pInstance,mcnrGain, isSourceChange );
6830 
6831 	// direct overwite
6832 	if( isStill || isSceneChange )
6833 	{
6834 		pdnrGain = 0;
6835 	}
6836 
6837 	// PDNR gain
6838 	//MDrv_SC_Set_PDNR_Gain( pdnrGain, isSourceChange );
6839 	MDrv_SC_Set_PDNR_Gain(pInstance, ( isStill || isSceneChange ) ? 0 : pdnrGain,isSourceChange );
6840 	// ME1_moving_w_nr_strength
6841 	MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, me1NRStrength << 12, 0xF000);
6842 
6843 
6844     // For BWS1&UCNR both ON, image sticking @scene change (turn on UCNR dither @scene change 12 times.)
6845     // 2014.9.16 Ryan
6846     static MS_U16 SceneCnt=0;
6847     if( ((MApi_XC_R2BYTE(REG_SC_BK08_01_L)& 0x0001) == 0x0000) && (isSceneChangeExt) ) //Due to compress issue, when BWS enable and scenechange, dither enable
6848     {
6849         SceneCnt = 12; //
6850     }
6851     else
6852     {
6853         if(SceneCnt>0)
6854         {
6855             SceneCnt = SceneCnt - 1;
6856         }
6857         else
6858         {
6859             SceneCnt = 0;
6860         }
6861     }
6862 
6863     if(SceneCnt>0)
6864     {
6865         MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x003C, 0x007F);
6866     }
6867     else
6868     {
6869         MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x007F, 0x007F);
6870     }
6871 
6872 
6873 	static MS_U8 postDINRGain = 16;
6874 	if( isUkosabihsMotion || isPanScan || is1DLowTexMoving )
6875 	{
6876 		postDINRGain = postDINRGain > 4 ? postDINRGain  - 4 : 0;
6877 	}
6878 	else
6879 	{
6880 		postDINRGain = postDINRGain < 16 ? postDINRGain + 1 : 16;
6881 	}
6882 
6883 	// PostDI NR gain
6884 	MDrv_SC_Set_PostDINR_Gain(pInstance, postDINRGain, isSourceChange );
6885 
6886 	//printf( "Gain : %d, %d, %d \n", mcnrGain, pdnrGain, postDINRGain );
6887 
6888 #if 0
6889 	// luma peaking
6890 	if( isPanScan && gmvAvgX != 32 && gmvAvgY == 8 && !isUkosabihsMotion )
6891 	{
6892 		MDrv_SC_Set_Luma_PK_Gain(pInstance, panScanCnt );
6893 	}
6894 	else
6895 	{
6896 		MDrv_SC_Set_Luma_PK_Gain(pInstance, 0 );
6897 	}
6898 #endif
6899 
6900 	if( dbgEn )
6901 	{
6902 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe1Moving ? 0x0002 : 0x0001), 0x000F );
6903 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe2Moving ? 0x0020 : 0x0010), 0x00F0 );
6904 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (is1DLowTexMoving ? 0x0200 : 0x0100), 0x0F00 );
6905 		MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isLowTexMoving ? 0x2000 : 0x1000), 0xF000 );
6906 
6907 		MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, (pdnrGain == 0) ? 0x0001 : 0x0002, 0x000F );
6908 
6909 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, isUkosabihsMotion ? 0x0020 : 0x0010, 0x00F0 );
6910 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, force1Dcnt > 16 ? 0x0200 : 0x0100, 0x0F00 );
6911 		MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, mcnrGain == 16 ? 0x2000 : 0x1000, 0xF000 );
6912 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isSceneChange ? 0x0002 : 0x0001), 0x000F );
6913 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isStillNoSceneChane ? 0x0020 : 0x0010), 0x00F0 );
6914 
6915 		MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, ( ( (NE_confirm == 8) || (NE_confirm==2 && lastEN==1) ) ? 0x2000 : 0x1000), 0xF000 );
6916 
6917 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 10 ? 0x0002 : 0x0), 0x000F );
6918 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 20 ? 0x0020 : 0x0), 0x00F0 );
6919 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 30 ? 0x0200 : 0x0), 0x0F00 );
6920 		MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 40 ? 0x2000 : 0x0), 0xF000 );
6921 
6922 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 50 ? 0x0002 : 0x0), 0x000F );
6923 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 60 ? 0x0020 : 0x0), 0x00F0 );
6924 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 70 ? 0x0200 : 0x0), 0x0F00 );
6925 		MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 80 ? 0x2000 : 0x0), 0xF000 );
6926 
6927 		MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, (noiseLevel >  90 ? 0x0002 : 0x0), 0x000F );
6928 		MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, (noiseLevel > 100 ? 0x0020 : 0x0), 0x00F0 );
6929 		MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, (noiseLevel > 110 ? 0x0200 : 0x0), 0x0F00 );
6930 		MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, (noiseLevel > 120 ? 0x2000 : 0x0), 0xF000 );
6931 	}
6932 
6933 	// adaptive coring
6934 	//MDrv_Adaptive_Coring( noiseLevel, isSourceChange, isSceneChange );
6935 }
6936 /******************************************************************************/
6937 ///LetterBox Driver
6938 /******************************************************************************/
MDrv_SC_Letter_Box_Driver(void * pInstance,const MS_BOOL isSceneChange,const MS_BOOL isSourceChange,const MS_BOOL isOpFrameChanged)6939 XC_LetterBoxState MDrv_SC_Letter_Box_Driver(void *pInstance, /*const MS_BOOL isHDSrc,*/ const MS_BOOL isSceneChange, const MS_BOOL isSourceChange, const MS_BOOL isOpFrameChanged )
6940 {
6941 	//static MS_U8 lbConfirmLevel = 0;
6942 	static MS_U8 triggerCnt = 0;
6943 	static MS_U8 hisPos = 0;
6944 	static MS_U8 hisCnt = 0;
6945 	static MS_U16 au16HisCntT[16] = {0};
6946 	static MS_U16 au16HisCntB[16] = {0};
6947 	static MS_U16 au16HisCntL[16] = {0};
6948 	static MS_U16 au16HisCntR[16] = {0};
6949 	static MS_U16 cntIIRT = 0, cntIIRB = 0, cntIIRL = 0, cntIIRR = 0;
6950 	static MS_U16 prevMinCntT = 0, prevMinCntB = 0, prevMinCntL = 0, prevMinCntR = 0;
6951 	//static XC_LetterBoxState lbState;
6952 
6953 	MS_U16 triggerMask = MApi_XC_R2BYTEMSK(REG_SC_BK0B_15_L, 0xF000) >> 12;
6954 	triggerMask = triggerMask < 3 ? 3 : triggerMask;
6955 
6956 	MApi_XC_W2BYTEMSK(REG_SC_BK0B_05_L, 0x7F, 0x1FFF );
6957 
6958 	if( isSceneChange || isSourceChange )
6959 	{
6960 		lbConfirmLevel = 0;
6961 		hisCnt = 0;
6962 		memset( au16HisCntT, 0xFF, sizeof(au16HisCntT) );
6963 		memset( au16HisCntB, 0xFF, sizeof(au16HisCntB) );
6964 		memset( au16HisCntL, 0xFF, sizeof(au16HisCntL) );
6965 		memset( au16HisCntR, 0xFF, sizeof(au16HisCntR) );
6966 	}
6967 
6968 	if( isOpFrameChanged )
6969 	{
6970 		if( (triggerCnt & triggerMask) == 0 )
6971 		{
6972 			au16HisCntT[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6973 			au16HisCntB[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6974 			au16HisCntL[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0F_L, 0x07FF );
6975 			au16HisCntR[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_10_L, 0x07FF );
6976 
6977 			MS_U16 minCntT = au16HisCntT[0], minCntB = au16HisCntB[0], minCntL = au16HisCntL[0], minCntR = au16HisCntR[0];
6978 			int i;
6979 			for( i = 1 ; i < 16 ; ++i )
6980 			{
6981 				minCntT = au16HisCntT[i] < minCntT ? au16HisCntT[i] : minCntT;
6982 				minCntB = au16HisCntB[i] < minCntB ? au16HisCntB[i] : minCntB;
6983 				minCntL = au16HisCntL[i] < minCntL ? au16HisCntL[i] : minCntL;
6984 				minCntR = au16HisCntR[i] < minCntR ? au16HisCntR[i] : minCntR;
6985 			}
6986 
6987 			if( hisPos == 15 )
6988 				hisPos = 0;
6989 			else
6990 				++hisPos;
6991 
6992 			if( hisCnt < 16 )
6993 				++hisCnt;
6994 
6995 			MS_U16 conf = abs( (int)(minCntT + minCntB + minCntL + minCntR) - (int)(prevMinCntT + prevMinCntB + prevMinCntL + prevMinCntR) );
6996 			conf = conf < 256 ? 255 - conf : 0;
6997 			if ( minCntL == 0x01FFF || minCntR == 0x01FFF || minCntT == 0x01FFF || minCntB == 0x01FFF)
6998 				conf = 0;
6999 
7000 			lbConfirmLevel = (lbConfirmLevel*6 + conf*2 )>> 3;
7001 			lbState.lbComfirmLevel = conf;
7002 			lbState.lbCntT = cntIIRT = ( cntIIRT * 7 + minCntT ) >> 3;
7003 			lbState.lbCntB = cntIIRB = ( cntIIRB * 7 + minCntB ) >> 3;
7004 			lbState.lbCntL = cntIIRL = ( cntIIRL * 7 + minCntL ) >> 3;
7005 			lbState.lbCntR = cntIIRR = ( cntIIRR * 7 + minCntR ) >> 3;
7006 
7007 			prevMinCntT = minCntT;
7008 			prevMinCntB = minCntB;
7009 			prevMinCntL = minCntL;
7010 			prevMinCntR = minCntR;
7011 			/*
7012 			if( isHDSrc )
7013 			{
7014 				int ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7015 				lbState.lbRatioC = ratio < 256 ? ratio : 255;
7016 
7017 				ratio = 0x1FA4000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7018 				lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7019 
7020 				ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7021 				lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7022 			}
7023 			else
7024 			{
7025 				int ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7026 				lbState.lbRatioC = ratio < 256 ? ratio : 255;
7027 
7028 				ratio = 0x546000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7029 				lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7030 
7031 				ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7032 				lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7033 			}*/
7034 			int windowWidth  = __max((int)(frameWidth-cntIIRL-cntIIRR), 1);
7035 			int windowHeight = __max((int)(frameHeight-cntIIRT-cntIIRB), 1);
7036 			int ratio = 0x1FA40000 / ( windowWidth * windowHeight );
7037 			lbState.lbRatioC = ratio < 256 ? ratio : 255;
7038 
7039 			ratio = 0x1FA40000 / ( frameWidth * windowHeight );
7040 			lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7041 
7042 			ratio = 0x1FA40000 / ( windowWidth * frameHeight );
7043 			lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7044 
7045 
7046 			MApi_XC_W2BYTEMSK(REG_SC_BK0B_15_L, cntIIRL, 0x01FF);
7047 			MApi_XC_W2BYTEMSK(REG_SC_BK0B_16_L, cntIIRR, 0x01FF);
7048 
7049 			//PRT_TRP( "Letter Box L : %03d, R : %03d, confirm : %03d, ratio C/TB/LR : %02d.%2d, %02d.%2d, %02d.%2d \n", cntIIRL, cntIIRR, conf,
7050 			//lbState.lbRatioC/16, (lbState.lbRatioC&0xF)*10/16, lbState.lbRatioTB/16, (lbState.lbRatioTB&0xF)*10/16, lbState.lbRatioLR/16, (lbState.lbRatioLR&0xF)*10/16 );
7051 		}
7052 		++triggerCnt;
7053 
7054 		if (lbConfirmLevel > 224 && !(isSceneChange ||isSourceChange) && (lbState.lbCntL > 100) && (lbState.lbCntR > 100) )
7055 		{
7056 				MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7057 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, lbState.lbCntL + 50, 0x1FFF);
7058 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, frameWidth - lbState.lbCntR - 50, 0x1FFF);
7059 				MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
7060 		}
7061 		else
7062 		{
7063 				const int boundary = 10;
7064 				MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
7065 
7066 				MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7067 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); /* set start */
7068 				MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);/* set end */
7069 				MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
7070 		}
7071 	}
7072 
7073 	return lbState;
7074 }
7075 
7076 /******************************************************************************/
7077 ///DeFeathering
7078 ///@param u32MotionValue \     IN: Motion value
7079 /******************************************************************************/
MDrv_SC_de_feathering(void * pInstance,MS_U32 u32MotionValue)7080 void MDrv_SC_de_feathering(void *pInstance,MS_U32 u32MotionValue)
7081 {
7082 	static MS_U32 u32DeFeatherCntLv1 = 0;
7083 	static MS_U32 u32DeFeatherCntLv2 = 0;
7084 	static MS_U32 u32DeFeatherCntLv3 = 0;
7085     MS_U8 u8SST_Static_Core_TH = 0;
7086     MS_U32 reg_defethering_lv1_cnt = 0;
7087     MS_U32 reg_defethering_lv2_cnt = 0;
7088     MS_U32 reg_mdp_cnt = 0;
7089 
7090 	reg_defethering_lv1_cnt = 0x0A;
7091 	reg_defethering_lv2_cnt = 0x08;
7092 	reg_mdp_cnt = 0x01;
7093 
7094 	// motion level count
7095 	if(u32MotionValue >= DEFETHERING_LV1_TH)
7096 	{
7097 		if(u32DeFeatherCntLv1 < reg_defethering_lv1_cnt)
7098 			u32DeFeatherCntLv1++;
7099 	}
7100 	else
7101 	{
7102 		if(u32DeFeatherCntLv1 >= reg_mdp_cnt)
7103 			u32DeFeatherCntLv1 = u32DeFeatherCntLv1 - reg_mdp_cnt;
7104 	}
7105 
7106 	if(u32MotionValue >= DEFETHERING_LV2_TH)
7107 	{
7108 		if(u32DeFeatherCntLv2 < reg_defethering_lv2_cnt)
7109 			u32DeFeatherCntLv2++;
7110 	}
7111 	else
7112 	{
7113 		if(u32DeFeatherCntLv2 >= reg_mdp_cnt)
7114 			u32DeFeatherCntLv2 = u32DeFeatherCntLv2 - reg_mdp_cnt;
7115 	}
7116 
7117 	if(u32MotionValue >= DEFETHERING_LV3_TH)
7118 	{
7119 		if(u32DeFeatherCntLv3 < DEFETHERING_LV3_CNT)
7120 			u32DeFeatherCntLv3++;
7121 	}
7122 	else
7123 	{
7124 		if(u32DeFeatherCntLv3 >= reg_mdp_cnt)
7125 			u32DeFeatherCntLv3 = u32DeFeatherCntLv3 - reg_mdp_cnt;
7126 	}
7127 
7128 	//DeFeathering begin
7129 	if(u32DeFeatherCntLv1 >= reg_defethering_lv1_cnt)
7130 	{
7131 		u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV1_VALUE;
7132 	}
7133 	else if(u32DeFeatherCntLv2 >= reg_defethering_lv2_cnt)
7134 	{
7135 		u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV2_VALUE;
7136 	}
7137 	else if(u32DeFeatherCntLv3 >= DEFETHERING_LV3_CNT)
7138 	{
7139 		u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV3_VALUE;
7140 	}
7141 	else
7142 	{
7143 		u8SST_Static_Core_TH    = SST_STATIC_CORE_TH_LV4_VALUE;
7144 	}
7145 
7146 	MApi_XC_W2BYTEMSK(REG_SC_BK22_1A_L, (MS_U16)u8SST_Static_Core_TH, 0xFF);
7147 }
7148 
7149 /******************************************************************************/
7150 ///DeFlickering
7151 ///@param u32MotionValue \     IN: Motion value
7152 /******************************************************************************/
MDrv_SC_de_flickering(void * pInstance,MS_U32 u32MotionValue)7153 void MDrv_SC_de_flickering(void *pInstance,MS_U32 u32MotionValue)
7154 {
7155 	static MS_S32 s32DeFlickerCnt = 0;
7156     MS_U32 reg_m_feat_smooth_hle_th = 0, reg_m_feat_smooth_shrink = 0;
7157 
7158 	reg_m_feat_smooth_hle_th = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0xF000); // Feat Smooth HLE TH
7159 	reg_m_feat_smooth_shrink = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0x8F);
7160 
7161 	if(u32MotionValue >= DEFLICKERING_TH)
7162 	{
7163 		if(s32DeFlickerCnt < 65535)
7164 			s32DeFlickerCnt++;
7165 	}
7166 	else
7167 	{
7168 		s32DeFlickerCnt = 0;
7169 	}
7170 
7171 	if(s32DeFlickerCnt >= DEFLICKERING_CNT)
7172 	{
7173 		reg_m_feat_smooth_hle_th += 0x0300;
7174 		reg_m_feat_smooth_shrink += 0x10;
7175 	}
7176 	else
7177 	{
7178 		reg_m_feat_smooth_hle_th += 0x0700;
7179 		reg_m_feat_smooth_shrink += 0x30;
7180 	}
7181 
7182 	MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_shrink, 0xFF);
7183 	MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_hle_th, 0xFF00);
7184 }
7185 
7186 /******************************************************************************/
7187 ///DeBouncing
7188 ///@param u32MotionValue \     IN: Motion value
7189 /******************************************************************************/
7190 #define DEBOUNCING_GAIN 1 //0
MDrv_SC_de_bouncing(void * pInstance,MS_U32 u32MotionValue)7191 void MDrv_SC_de_bouncing(void *pInstance,MS_U32 u32MotionValue)
7192 {
7193 	static MS_S32 s32DeBouncingCnt = 0;
7194     MS_U32 u32RegHisWtF2 = 0;
7195     MS_U32 u32regdebouncingth = 0;
7196     int reg_debouncing_cnt = 0;
7197 
7198 	u32regdebouncingth = 0x0A;
7199 	reg_debouncing_cnt = 0x03;
7200 
7201 	u32RegHisWtF2 = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0A_L, 0xF8); // history ratio weighting
7202 
7203 	if(u32MotionValue <= u32regdebouncingth * DEBOUNCING_GAIN)
7204 	{
7205 		s32DeBouncingCnt = 0;
7206 	}
7207 	else
7208 	{
7209 		if(s32DeBouncingCnt < 65535)
7210 			s32DeBouncingCnt++;
7211 	}
7212 
7213 	if(s32DeBouncingCnt >= reg_debouncing_cnt)
7214 	{
7215 		u32RegHisWtF2 += 0x06; // history = 6 moving
7216 	}
7217 	else
7218 	{
7219 		u32RegHisWtF2 += 0x03; // history = 3 still
7220 	}
7221 	MApi_XC_W2BYTEMSK(REG_SC_BK22_0A_L, u32RegHisWtF2, 0xFF);
7222 }
7223 
7224 /******************************************************************************/
7225 
MDrv_SC_Edison_DHD_driver(void * pInstance,MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm,XC_GMvStates gMV,MS_U32 _hpfHdCntReport)7226 void MDrv_SC_Edison_DHD_driver(void *pInstance, MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm, XC_GMvStates gMV, MS_U32 _hpfHdCntReport )
7227 {
7228 	// dhd stadium patch: lower dhd strength
7229 	static MS_U32 u32filmCnt = 0;
7230 	int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7231 
7232 	MS_U32 exactFeatherCnt = 0;
7233 	static MS_U32 pre_exactFeatherCnt = 0;
7234 	MS_BOOL isMv0 = ( ( gMV.minMvXdir == 32 ) && ( gMV.minMvYdir == 8 ) ) ? true : false;
7235 
7236 	exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7237 	exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7238 	pre_exactFeatherCnt = exactFeatherCnt;
7239 
7240     MS_U32 colorSum = 0;
7241 	static MS_U32 colorSum_iir = 0;
7242 
7243 	colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
7244 
7245 	colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7246 	colorSum_iir = colorSum;
7247 
7248 	if((uComplex>0x680) && (nonMv0Comfirm > 0x70) && (me1Still == false) && (check_width > 0x700) && ((/*exactFeatherCnt > 0x30 &&*/colorSum > 0x1500 && colorSum < 0x2500 )|| mv0Comfirm < 0x50 ) ) //exactFeatherCnt > 0x30 for stadium & mv0Comfirm < 0x50 for building of "KURO" disc
7249 	{
7250 		u32filmCnt++;
7251 
7252 		if( u32filmCnt >= 50 )
7253 		{
7254 			u32filmCnt = 50;
7255 		}
7256 	}
7257 	else if((gMV.h2XYsum > 0x30)&& (gMV.h2XYdiff <= 0x06)&& (!isMv0) && (nonMv0Comfirm>0x40) && mv0Comfirm < 0x20 )//shibasoku pan
7258 	{
7259 
7260 		u32filmCnt++;
7261 
7262 		if( u32filmCnt >= 50 )
7263 		{
7264 			u32filmCnt = 50;
7265 		}
7266 	}
7267 	else if ( _hpfHdCntReport > 0xFFFF )
7268 	{
7269 
7270 		u32filmCnt++;
7271 
7272 		if( u32filmCnt >= 50 )
7273 		{
7274 			u32filmCnt = 50;
7275 		}
7276 	}
7277 	else
7278 	{
7279 		if( u32filmCnt == 0 )
7280 		{
7281 			u32filmCnt = 0;
7282 		}
7283 		else
7284 		{
7285 			u32filmCnt--;
7286 		}
7287 	}
7288 
7289 	if( u32filmCnt <= 2 )
7290 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00, 0x0F00); //dhd user weight
7291 	else if( u32filmCnt == 3 )
7292 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0C00, 0x0F00); //dhd user weight
7293 	else if( u32filmCnt == 4 )
7294 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0B00, 0x0F00); //dhd user weight
7295 	else if( u32filmCnt == 5 )
7296 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0900, 0x0F00); //dhd user weight
7297 	else if( u32filmCnt == 6 )
7298 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0700, 0x0F00); //dhd user weight
7299 	else if( u32filmCnt == 7 )
7300 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0500, 0x0F00); //dhd user weight
7301 	else if( u32filmCnt == 8 )
7302 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0300, 0x0F00); //dhd user weight
7303 	else if( u32filmCnt == 9 )
7304 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0100, 0x0F00); //dhd user weight
7305 	else if( u32filmCnt >= 10 )
7306 		MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00); //dhd user weight
7307 
7308 }
7309 
MDrv_SC_Edison_DHD_Weather_driver(void * pInstance,MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7310 void MDrv_SC_Edison_DHD_Weather_driver(void *pInstance, MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7311 {
7312 	// dhd weather patch: enhance dhd strength
7313 	static MS_U32 u32filmCnt = 0;
7314 	int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7315 
7316 	MS_U32 exactFeatherCnt = 0;
7317 	static MS_U32 pre_exactFeatherCnt = 0;
7318 
7319 	exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7320 	exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7321 	pre_exactFeatherCnt = exactFeatherCnt;
7322 
7323 
7324     MS_U32 colorSum = 0;
7325 	static MS_U32 colorSum_iir = 0;
7326 
7327 	colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
7328 
7329 	colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7330 	colorSum_iir = colorSum;
7331 
7332 	if((uComplex>0x800) && (mv0Comfirm > 0x140) && (nonMv0Comfirm < 0x40) && (me1Still == true) && (check_width>0x700) && (exactFeatherCnt < 0x10) && (colorSum > 0x700) )
7333 	{
7334 		u32filmCnt++;
7335 
7336 		if( u32filmCnt >= 24 )
7337 		{
7338 			u32filmCnt = 24;
7339 		}
7340 	}
7341 	else
7342 	{
7343 		if( u32filmCnt > 0 )
7344 			u32filmCnt = u32filmCnt - 2;
7345 	}
7346 
7347 	if( check_width>0x700 )
7348 	{
7349 
7350 		if( u32filmCnt <= 2 )
7351 		{
7352 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0040, 0x00FF); //dhd c edge diff(hor).
7353 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xA000, 0xFF00); //dhd y edge diff(hor).
7354 		}
7355 		else if( u32filmCnt == 3 )
7356 		{
7357 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0054, 0x00FF); //dhd c edge diff(hor).
7358 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xAB00, 0xFF00); //dhd y edge diff(hor).
7359 		}
7360 		else if( u32filmCnt == 4 )
7361 		{
7362 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0068, 0x00FF); //dhd c edge diff(hor).
7363 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xB600, 0xFF00); //dhd y edge diff(hor).
7364 		}
7365 		else if( u32filmCnt == 5 )
7366 		{
7367 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x007C, 0x00FF); //dhd c edge diff(hor).
7368 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xC100, 0xFF00); //dhd y edge diff(hor).
7369 		}
7370 		else if( u32filmCnt == 6 )
7371 		{
7372 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0090, 0x00FF); //dhd c edge diff(hor).
7373 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xCC00, 0xFF00); //dhd y edge diff(hor).
7374 		}
7375 		else if( u32filmCnt == 7 )
7376 		{
7377 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00A4, 0x00FF); //dhd c edge diff(hor).
7378 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xD700, 0xFF00); //dhd y edge diff(hor).
7379 		}
7380 		else if( u32filmCnt == 8 )
7381 		{
7382 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00B8, 0x00FF); //dhd c edge diff(hor).
7383 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xE200, 0xFF00); //dhd y edge diff(hor).
7384 		}
7385 		else if( u32filmCnt == 9 )
7386 		{
7387 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00CC, 0x00FF); //dhd c edge diff(hor).
7388 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xED00, 0xFF00); //dhd y edge diff(hor).
7389 		}
7390 		else if( u32filmCnt >= 10 )
7391 		{
7392 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00E0, 0x00FF); //dhd c edge diff(hor).
7393 			MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xF800, 0xFF00); //dhd y edge diff(hor).
7394 		}
7395 
7396 	}
7397 
7398 }
7399 
MDrv_SC_Edison_DHD_GSLSM_driver(void * pInstance,MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7400 void MDrv_SC_Edison_DHD_GSLSM_driver(void *pInstance, MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7401 {
7402 	// dhd patch for global still & local moving region( dot-crawl on dirty background ): enhance dhd strength
7403 	static MS_U32 u32filmCnt = 0;
7404 	int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7405 
7406 	MS_U32 exactFeatherCnt = 0;
7407 	static MS_U32 pre_exactFeatherCnt = 0;
7408 
7409 	exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7410 	exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7411 	pre_exactFeatherCnt = exactFeatherCnt;
7412 
7413     MS_U32 colorSum = 0;
7414 	static MS_U32 colorSum_iir = 0;
7415 
7416 	colorSum  = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
7417 
7418 	colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7419 	colorSum_iir = colorSum;
7420 
7421 	if((uComplex>0x800) && (mv0Comfirm >= nonMv0Comfirm*3) && (me1Still == true) && (check_width>0x700) && ((exactFeatherCnt > 0x40) || (exactFeatherCnt < 0x10 && colorSum > 0xB00) ) ) //exactFeatherCnt < 0x10 && colorSum > 0xB00 for weather
7422 	{
7423 		u32filmCnt++;
7424 
7425 		if( u32filmCnt >= 24 )
7426 		{
7427 			u32filmCnt = 24;
7428 		}
7429 	}
7430 	else
7431 	{
7432 		if( u32filmCnt > 0 )
7433 			u32filmCnt = u32filmCnt - 2;
7434 	}
7435 
7436 	if( check_width>0x700 )
7437 	{
7438 		if( u32filmCnt <= 2 )
7439 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0024, 0x00FF); //dhd y(n), y(n-4) diff.
7440 		else if( u32filmCnt == 3 )
7441 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0026, 0x00FF); //dhd y(n), y(n-4) diff.
7442 		else if( u32filmCnt == 4 )
7443 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0029, 0x00FF); //dhd y(n), y(n-4) diff.
7444 		else if( u32filmCnt == 5 )
7445 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002B, 0x00FF); //dhd y(n), y(n-4) diff.
7446 		else if( u32filmCnt == 6 )
7447 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002E, 0x00FF); //dhd y(n), y(n-4) diff.
7448 		else if( u32filmCnt == 7 )
7449 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0030, 0x00FF); //dhd y(n), y(n-4) diff.
7450 		else if( u32filmCnt == 8 )
7451 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0033, 0x00FF); //dhd y(n), y(n-4) diff.
7452 		else if( u32filmCnt == 9 )
7453 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0035, 0x00FF); //dhd y(n), y(n-4) diff.
7454 		else if( u32filmCnt >= 10 )
7455 			MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0038, 0x00FF); //dhd y(n), y(n-4) diff.
7456 	}
7457 
7458 }
7459 
7460 //
7461 //To do (merge with MDrv_SC_Edison_DHD_driver)
7462 //
MDrv_SC_Edison_DHD_Stadium_driver(void * pInstance,MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)7463 void MDrv_SC_Edison_DHD_Stadium_driver(void *pInstance,MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)
7464 {
7465 
7466 	int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7467 	int currentGain = MApi_XC_R2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00) >> 8 ;
7468 	if( check_width > 0x700 )
7469 	{
7470 		if( isMcFilmHd || filmstatus.filmany) //disable DHD when Film timing
7471 			//if( filmstatus.film_act )
7472 			MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7473 		else
7474 			MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7475 	}
7476 	else
7477 	{
7478 		if( filmstatus.filmany) //disable DHD when SD film-any
7479 			MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7480 		else
7481 			MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7482 	}
7483 
7484 }
7485 
7486 //
7487 //To adjust the CCS_MR HisWeight Ctrl
7488 //
7489 #define CCS_MR_HisWeight_MaxValue 0x1F
7490 #define CCS_MR_HisWeight_MinValue  0x18
MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)7491 void MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)
7492 {
7493 	static MS_U8 Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7494 
7495 	if( (filmstatus.film32) |(filmstatus.filmany))
7496 	{
7497 		Reg_CCS_MR_Weight = CCS_MR_HisWeight_MaxValue;
7498 	}
7499 	else
7500 	{
7501 		if( Reg_CCS_MR_Weight > CCS_MR_HisWeight_MinValue )
7502 			Reg_CCS_MR_Weight--;
7503 		else
7504 			Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7505 	}
7506 	MApi_XC_W2BYTEMSK(REG_SC_BK06_77_L, Reg_CCS_MR_Weight<<8, 0x1F00);
7507 }
7508 
7509 
7510 /******************************************************************************/
7511 ///CCS Driver
7512 /******************************************************************************/
7513 
MDrv_SC_Edison_CCS_driver(void * pInstance,const MS_BOOL ukoSabihS_en)7514 void MDrv_SC_Edison_CCS_driver(void *pInstance, const MS_BOOL ukoSabihS_en )
7515 {
7516 	// horizontal moving => lower ccs weight
7517 	static MS_U32 u32CCSvideoCnt = 0;
7518     MS_BOOL isMvPanScan = FALSE;
7519 
7520 	//if((gMv.h1XYsum >10) && (gMv.h2XYsum > 10) && ( gMv.h1XYdiff < 5) && (gMv.h2XYdiff < 5))
7521 	if( ukoSabihS_en )
7522 	{
7523 		isMvPanScan = true;
7524 	}
7525 	else
7526 	{
7527 		isMvPanScan = false;
7528 	}
7529 
7530 	if(isMvPanScan)
7531 	{
7532 		u32CCSvideoCnt++;
7533 
7534 		if( u32CCSvideoCnt >= 20 )
7535 		{
7536 			u32CCSvideoCnt = 20;
7537 		}
7538 	}
7539 	else
7540 	{
7541 		if( u32CCSvideoCnt == 0 )
7542 		{
7543 			u32CCSvideoCnt = 0;
7544 		}
7545 		else
7546 		{
7547 			u32CCSvideoCnt--;
7548 		}
7549 	}
7550 
7551 	if( u32CCSvideoCnt <= 2 )
7552 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000F, 0x000F); //ccs user weight
7553 	else if( u32CCSvideoCnt == 3 )
7554 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000D, 0x000F); //ccs user weight
7555 	else if( u32CCSvideoCnt == 4 )
7556 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000B, 0x000F); //ccs user weight
7557 	else if( u32CCSvideoCnt == 5 )
7558 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0009, 0x000F); //ccs user weight
7559 	else if( u32CCSvideoCnt == 6 )
7560 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0007, 0x000F); //ccs user weight
7561 	else if( u32CCSvideoCnt == 7 )
7562 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0005, 0x000F); //ccs user weight
7563 	else if( u32CCSvideoCnt == 8 )
7564 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0003, 0x000F); //ccs user weight
7565 	else if( u32CCSvideoCnt == 9 )
7566 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0001, 0x000F); //ccs user weight
7567 	else if( u32CCSvideoCnt >= 10 )
7568 		MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0000, 0x000F); //ccs user weight
7569 }
7570 
MDrv_SC_LowLumaDetection(void * pInstance)7571 MS_BOOL MDrv_SC_LowLumaDetection(void *pInstance)
7572 {
7573     MS_BOOL isLowLuma = FALSE;
7574     MS_U16 MaxL_pixel = 0;
7575 
7576 	MaxL_pixel = MApi_XC_R2BYTE(REG_SC_BK1A_0B_L)&0x00FF;
7577 
7578 	if((MaxL_pixel<100)&&(MApi_XC_DLC_GetAverageValue()< 120))
7579 	{
7580 		isLowLuma = true;
7581 	}
7582 	else
7583 	{
7584 		isLowLuma = false;
7585 	}
7586 
7587 	return isLowLuma;
7588 }
7589 
LumaAGCLUT(void * pInstance,const MS_U8 LumaCheck)7590 MS_U8 LumaAGCLUT(void *pInstance,const MS_U8 LumaCheck )
7591 {
7592 	MS_U8 lumaAgcGain = 0;
7593 
7594 	if( LumaCheck > 120 )
7595 		lumaAgcGain = 6;
7596 	else if( ( LumaCheck > 114 ) &&  ( LumaCheck <= 120 ))
7597 		lumaAgcGain = 7;
7598 	else if( ( LumaCheck > 104 ) &&  ( LumaCheck <= 114 ))
7599 		lumaAgcGain = 8;
7600 	else if( ( LumaCheck > 94 ) &&  ( LumaCheck <= 104 ))
7601 		lumaAgcGain = 8;
7602 	else if( ( LumaCheck > 83 ) &&  ( LumaCheck <= 94 ))
7603 		lumaAgcGain = 9;
7604 	else if( ( LumaCheck > 73 ) &&  ( LumaCheck <= 83 ))
7605 		lumaAgcGain = 10;
7606 	else if( ( LumaCheck > 62 ) &&  ( LumaCheck <= 73 ))
7607 		lumaAgcGain = 11;
7608 	else if( ( LumaCheck > 51 ) &&  ( LumaCheck <= 62 ))
7609 		lumaAgcGain = 13;
7610 	else if( ( LumaCheck > 40 ) &&  ( LumaCheck <= 51 ))
7611 		lumaAgcGain = 15;
7612 	else if( ( LumaCheck > 26 ) &&  ( LumaCheck <= 40 ))
7613 		lumaAgcGain = 17;
7614 	else
7615 		lumaAgcGain = 15;
7616 
7617 	return lumaAgcGain;
7618 }
7619 
7620 #define HD_ACT_TH 10
7621 #define HDSDD_SPEED 1
7622 #define HDSDD_DIV 0
7623 #define HD_SPEED 2
7624 #define SD_SPEED 4
7625 
MDrv_SC_Edision_stillFeatherDetection(void * pInstance,const MS_U32 u32MotionValue,const MS_BOOL isUkosabihsMotion,const MS_U32 _hpfHdCntReport,const MS_BOOL isHBurstMoving,const MS_BOOL isHBurst,const MS_BOOL isUkosabihsMv0,const MS_BOOL isMcFilmHd,const MS_U32 _hpfSdCntReport)7626 void MDrv_SC_Edision_stillFeatherDetection(void *pInstance,const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMotion,
7627 					   const MS_U32 _hpfHdCntReport, const MS_BOOL isHBurstMoving, const MS_BOOL isHBurst, const MS_BOOL isUkosabihsMv0,
7628 					   const MS_BOOL isMcFilmHd/*, const MS_BOOL isSceneChange*/, const MS_U32 _hpfSdCntReport )
7629 {
7630 	MS_U32 exactFeatherCnt = 0;
7631 	static MS_U32 pre_exactFeatherCnt = 0;
7632 
7633 	MS_U32 HD_ConfirmCnt_Reg = 0;
7634 	static MS_U32 HD_ConfirmCnt_Reg_post = 0;
7635 	static MS_U16 HD_ConfirmCnt = 0;
7636 
7637     MS_U8 u8MinPixel = 0;
7638 	static MS_U8 u8PrevMinPixel = 0;
7639 
7640     MS_U8 u8MaxPixel = 0;
7641 	static MS_U8 u8PrevMaxPixel = 0;
7642 
7643     MS_U16 Luma = 0;
7644 	static MS_U16 LumaPrev = 0;
7645     MS_U8 LumaCheck = 0;
7646 
7647     MS_U16 Cplx = 0;
7648 	static MS_U16 CplxPrev = 0;
7649     MS_U8 CplxCheck = 0;
7650 
7651 	MS_U8 lumaAgcGain = 0;
7652 	MS_BOOL cplxLumaPatch = false;
7653 
7654     MS_U8  featherRatio = 0;
7655 
7656 //	MS_BOOL XXX;
7657 
7658 	MS_BOOL isMovingImage = ( u32MotionValue!=0 ) ? true : false;
7659 
7660 	MS_BOOL isWithoutHsignal = ( _hpfSdCntReport < 0x10 ) ? true : false;
7661 
7662 //	XXX = isSceneChange;
7663 	exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7664 	exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7665 	pre_exactFeatherCnt = exactFeatherCnt;
7666 
7667 	u8MaxPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0x00FF);
7668 	u8MaxPixel = (u8PrevMaxPixel*3 + u8MaxPixel ) >> 2;
7669 	u8PrevMaxPixel = u8MaxPixel;
7670 
7671 	u8MinPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0xFF00)>>8;
7672 	u8MinPixel = (u8PrevMinPixel*3 + u8MinPixel ) >> 2;
7673 	u8PrevMinPixel = u8MinPixel;
7674 
7675 	Luma = MApi_XC_R2BYTEMSK(REG_SC_BK1A_06_L, 0xFFFF);
7676 	Luma = (LumaPrev*3 + Luma ) >> 2;
7677 	LumaPrev = Luma;
7678 
7679 	Cplx = MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF);
7680 	Cplx = (CplxPrev*3 + Cplx ) >> 2;
7681 	CplxPrev = Cplx;
7682 
7683 	{
7684 		LumaCheck = Luma >> 8;
7685 		CplxCheck = Cplx >> 8;
7686 		lumaAgcGain = LumaAGCLUT(pInstance, LumaCheck );
7687 		cplxLumaPatch = ( CplxCheck > ( LumaCheck * lumaAgcGain ) >> 3 ) ? true : false;
7688 	}
7689 
7690 	if( ( isUkosabihsMv0 && !isMovingImage) || isMcFilmHd )
7691 		featherRatio = 5;
7692 	else if( !isUkosabihsMotion && isMovingImage )
7693 		featherRatio = 2;
7694 	else
7695 		featherRatio = 4;
7696 
7697 	if((exactFeatherCnt > 0x20)&&( exactFeatherCnt > (_hpfHdCntReport*featherRatio)))
7698 	{
7699 		if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7700 			HD_ConfirmCnt = 0xFF;
7701 		else
7702 			HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7703 	}
7704 	else
7705 	{
7706 		if(HD_ConfirmCnt < 1)
7707 			HD_ConfirmCnt = 0;
7708 		else
7709 			HD_ConfirmCnt = HD_ConfirmCnt - 1;
7710 	}
7711 
7712 	if( HD_ConfirmCnt > 0x80 )
7713 		HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7714 	else
7715 		HD_ConfirmCnt_Reg = 0;
7716 
7717 	HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7718 
7719 	if( HD_ConfirmCnt_Reg > 0x3F )
7720 		HD_ConfirmCnt_Reg = 0x3F;
7721 
7722 	if( cplxLumaPatch )
7723 	{
7724 		HD_ConfirmCnt_Reg_post = 0;
7725 	}
7726 	else if( isWithoutHsignal )
7727 	{
7728 		HD_ConfirmCnt_Reg_post = 0;
7729 	}
7730 	else if( (isHBurst || isHBurstMoving || isUkosabihsMotion ) && HD_ConfirmCnt_Reg != 0 )
7731 	{
7732 		if( HD_ConfirmCnt_Reg_post < 8 )
7733 			HD_ConfirmCnt_Reg_post = 0;
7734 		else
7735 			HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7736 	}
7737 	else if( u8MaxPixel < 25 && HD_ConfirmCnt_Reg != 0 )
7738 	{
7739 		if( HD_ConfirmCnt_Reg_post < 8 )
7740 			HD_ConfirmCnt_Reg_post = 0;
7741 		else
7742 			HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7743 	}
7744 	else
7745 		HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg;
7746 
7747 	//121 weight
7748 
7749 	MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg_post, 0x001F);
7750 
7751 }
7752 
MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void * pInstance)7753 void MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void *pInstance)
7754 {
7755     MS_U32 HDcnt_Act = 0;
7756     MS_U32 FeatherCnt = 0;
7757     MS_U32 SDcnt_Act = 0;
7758 	MS_U32 NEW_FeatherCnt = 0;
7759 	MS_U32 HD_ConfirmCnt_Reg = 0;
7760 
7761 	static MS_U32 PreHDcnt_Act = 0;
7762 	static MS_U32 PreSDcnt_Act = 0;
7763 	static MS_U32 PreFeatherCnt = 0;
7764 	static MS_U32 PreNEW_FeatherCnt = 0;
7765 	static MS_U16 HD_ConfirmCnt = 0;//0xFF; // 0x7FFF == 0
7766 
7767 	HDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7768 	HDcnt_Act = ( PreHDcnt_Act*3 + HDcnt_Act ) >> 2;
7769 	PreHDcnt_Act = HDcnt_Act;
7770 
7771 	SDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7772 	SDcnt_Act = ( PreSDcnt_Act*3 + SDcnt_Act ) >> 2;
7773 	PreSDcnt_Act = SDcnt_Act;
7774 
7775 	FeatherCnt = MApi_XC_R2BYTE(REG_SC_BK23_56_L); //New add for A1 chip
7776 	FeatherCnt = ( PreFeatherCnt*3 + FeatherCnt ) >> 2;
7777 	PreFeatherCnt = FeatherCnt;
7778 
7779 	NEW_FeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7780 	NEW_FeatherCnt = ( PreNEW_FeatherCnt*3 + NEW_FeatherCnt ) >> 2;
7781 	PreNEW_FeatherCnt = NEW_FeatherCnt;
7782 
7783 	if( (NEW_FeatherCnt > 0x80) && (SDcnt_Act > 0x1800) && (NEW_FeatherCnt < 0xF00) && (HDcnt_Act < 0x3000))
7784 	{
7785 		if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7786 			HD_ConfirmCnt = 0xFF;
7787 		else
7788 			HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7789 	}
7790 	else
7791 	{
7792 		if(HD_ConfirmCnt < 1)
7793 			HD_ConfirmCnt = 0;
7794 		else
7795 			HD_ConfirmCnt = HD_ConfirmCnt - 1;
7796 	}
7797 
7798 	if( HD_ConfirmCnt > 0x80 )
7799 		HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7800 	else
7801 		HD_ConfirmCnt_Reg = 0;
7802 
7803 	HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7804 
7805 	if( HD_ConfirmCnt_Reg > 0x3F )
7806 		HD_ConfirmCnt_Reg = 0x3F;
7807 
7808 	//121 weight
7809 	MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg, 0x003F);
7810 }
7811 
7812 #define TIMEID_hpfTolerantReport 2
MDrv_SC_hpfTolerantReport(void * pInstance,const MS_U8 _timeSharingID,const XC_HpfDefaultRegSetting defaultReg,MS_U32 * _hpfHdTolerantReport,const MS_U8 timingSegment)7813 MS_U32 MDrv_SC_hpfTolerantReport(void *pInstance, const MS_U8 _timeSharingID, const XC_HpfDefaultRegSetting defaultReg, MS_U32 *_hpfHdTolerantReport, const MS_U8 timingSegment )
7814 {
7815 	static MS_U32 _return_sd = 0;
7816 	static MS_U32 _return_hd = 0;
7817 
7818 	if( _timeSharingID == TIMEID_hpfTolerantReport )
7819 	{
7820 		if( timingSegment == 0 )
7821 		{
7822 			MDrv_SC_hpfDefaultRelod(pInstance, defaultReg );
7823 		//else if( timingSegment == 1 ) /* Set Regiater */
7824 		//{
7825 
7826 			MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0100, 0xFFFF);
7827 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<12, 0x7000);
7828 
7829 			MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0280, 0xFFFF);     /*for HD repot*/
7830 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x06)<<8, 0x0700);  /*for HD repot*/
7831 
7832 			MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0000 , 0x003F); /* underflow */
7833 			MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3F00, 0x3F00); /* overflow */
7834 		}
7835 		else if ( timingSegment > 1)
7836 		{
7837 			_return_sd =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7838 
7839 			_return_hd =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7840 
7841 
7842 		}
7843 	}
7844 	else
7845 	{
7846 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
7847 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
7848 
7849 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
7850 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7851 
7852 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
7853 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
7854 	}
7855 
7856 	*_hpfHdTolerantReport = _return_hd;
7857 
7858 	return _return_sd;
7859 }
7860 
7861 #define TIMEID_dynamicHDfilterBaseReport 1
MDrv_SC_dynamicHDfilterBaseReport(void * pInstance,const MS_U8 _timeSharingID,const MS_U32 u32MotionValue,const MS_BOOL isUkosabihsMv0,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)7862 MS_U32 MDrv_SC_dynamicHDfilterBaseReport(void *pInstance, const MS_U8 _timeSharingID, const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMv0, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 timingSegment  )
7863 {
7864 
7865 	MS_BOOL isStillImage = ( u32MotionValue < 10 ) ? true : false;
7866 	MS_U32 hdRepot= 0;
7867 	static MS_U32 _return = 0;
7868 
7869 	if( _timeSharingID == TIMEID_dynamicHDfilterBaseReport )
7870 	{
7871 		if( timingSegment == 0 )
7872 		{
7873 			MDrv_SC_hpfDefaultRelod(pInstance, defaultReg );
7874 		//else if( timingSegment == 1 ) /* Set Regiater */
7875 		//{
7876 			if( ( isUkosabihsMv0 && isStillImage) )
7877 			{
7878 				MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0100, 0xFFFF);
7879 				MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<8, 0x0700);
7880 			}
7881 			else
7882 			{
7883 				MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7884 				MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7885 			}
7886 		}
7887 		else if ( timingSegment > 1)
7888 		{
7889 			hdRepot =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7890 
7891 			_return = hdRepot;
7892 		}
7893 	}
7894 	else
7895 	{
7896 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF);  /*for HD repot*/
7897 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7898 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7899 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7900 	}
7901 	return _return;
7902 }
7903 
7904 #define TIMEID_FilterBaseReport 0
MDrv_SC_SDHD_FilterBaseReport(void * pInstance,const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment,MS_U32 * hdNactCntRet)7905 MS_U8 MDrv_SC_SDHD_FilterBaseReport(void *pInstance, const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg,  const MS_U8 timingSegment  , MS_U32 *hdNactCntRet)
7906 {
7907     MS_U8 u8Luma = 0;
7908     MS_U16 u16MinPixel = 0,u16MaxPixel = 0, MaxMinPixel = 0;
7909     static MS_U32 HDcnt_Act = 0, hdNactCnt = 0;
7910 	static MS_U32 SDcnt_Act = 0;
7911     MS_U32 HDcnt_Act_Cur = 0;
7912     MS_U32 SDcnt_Act_Cur = 0;
7913     MS_U32 hdNactCntCur;
7914 	static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
7915 	static MS_U8 u8PrevLuma = 0;
7916 	static MS_U16 u16PrevMinPixel = 0;
7917 	static MS_U16 u16PrevMaxPixel = 0;
7918     MS_U32 HD_ConfirmCnt_Reg = 0;
7919     MS_U32 HDSDD_Det_threshold = 0;
7920 	static MS_U8 _return = 0;
7921 
7922 	if( _timeSharingID == TIMEID_FilterBaseReport )
7923 	{
7924 		if( timingSegment == 0 )
7925 		{
7926 			MDrv_SC_hpfDefaultRelod(pInstance, defaultReg );
7927 		//else if( timingSegment == 1 ) /* Set Regiater */
7928 		//{
7929 			u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
7930 //			int AVG_LUMA = MApi_XC_DLC_GetAverageValue();
7931 			u8PrevLuma = u8Luma;
7932 
7933 			u16MaxPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0x00FF);
7934 			u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
7935 			u16PrevMaxPixel = u16MaxPixel;
7936 
7937 			u16MinPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0xFF00)>>8;
7938 			u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
7939 			u16PrevMinPixel = u16MinPixel;
7940 
7941 			MaxMinPixel = u16MaxPixel - u16MinPixel;
7942 
7943 			if(u8Luma>=0xFF)
7944 				u8Luma = 0xFF;
7945 
7946 			HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
7947 
7948 			if(HDSDD_Det_threshold >=0xFFFF)
7949 				HDSDD_Det_threshold=0xFFFF;
7950 
7951 			MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
7952 			MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
7953 		}
7954 		else if( timingSegment == 1 )
7955 		{
7956 
7957 		}
7958         else /* Run */
7959         {
7960             HDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7961             SDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7962             hdNactCntCur =  (MApi_XC_R2BYTE(REG_SC_BK02_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_78_L)
7963             + (MApi_XC_R2BYTE(REG_SC_BK82_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK82_78_L);
7964 
7965             HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act) >> 1;
7966             SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act) >> 1;
7967 
7968             *_hpfHdCntReport = HDcnt_Act;
7969             *_hpfSdCntReport = SDcnt_Act;
7970             *hdNactCntRet = hdNactCnt = (hdNactCntCur+ hdNactCnt) >> 1;
7971 
7972             if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
7973             {
7974             	if(HD_ConfirmCnt < HD_SPEED)
7975             		HD_ConfirmCnt = 0;
7976             	else
7977             		HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
7978             }
7979             else if( SDcnt_Act != 0 )
7980             {
7981             	if(HD_ConfirmCnt > (0x80 - SD_SPEED))
7982             		HD_ConfirmCnt = 0x80;
7983             	else
7984             		HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7985             }
7986             else
7987             {
7988             	if(HD_ConfirmCnt < 1)
7989             		HD_ConfirmCnt = 0;
7990             	else
7991             		HD_ConfirmCnt = HD_ConfirmCnt - 1;
7992             }
7993 
7994             if( HD_ConfirmCnt > 0x20 )
7995             	HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
7996             else
7997             	HD_ConfirmCnt_Reg = 0;
7998 
7999             HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8000 
8001             if( HD_ConfirmCnt_Reg > 0x3F )
8002             	HD_ConfirmCnt_Reg = 0x3F;
8003 
8004             _return = HD_ConfirmCnt_Reg;
8005         }
8006 	}
8007 	else
8008 	{
8009 		//  return to the original condition
8010 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8011 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8012 	}
8013 
8014 	return _return;
8015 }
8016 
8017 #define TIMEID_FilterOneReport 3
MDrv_SC_SDHD_FilterOneReport(void * pInstance,const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)8018 MS_U8 MDrv_SC_SDHD_FilterOneReport(void *pInstance, const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg,  const MS_U8 timingSegment  )
8019 {
8020 	MS_U8 u8Luma;
8021 	MS_U16 u16MinPixel,u16MaxPixel, MaxMinPixel;
8022 	static MS_U32 HDcnt_Act = 0;
8023 	static MS_U32 SDcnt_Act = 0;
8024 	MS_U32 HDcnt_Act_Cur;
8025 	MS_U32 SDcnt_Act_Cur;
8026 	static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
8027 	static MS_U8 u8PrevLuma = 0;
8028 	static MS_U16 u16PrevMinPixel = 0;
8029 	static MS_U16 u16PrevMaxPixel = 0;
8030 	MS_U32 HD_ConfirmCnt_Reg;
8031 	MS_U32 HDSDD_Det_threshold;
8032 	static MS_U8 _return = 0;
8033 
8034 	if( _timeSharingID == TIMEID_FilterOneReport )
8035 	{
8036 		if( timingSegment == 0 )
8037 		{
8038 			MDrv_SC_hpfDefaultRelod(pInstance, defaultReg );
8039 			u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
8040 
8041 			u8PrevLuma = u8Luma;
8042 
8043 			u16MaxPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0x00FF);
8044 			u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
8045 			u16PrevMaxPixel = u16MaxPixel;
8046 
8047 			u16MinPixel = MApi_XC_R2BYTEMSK(REG_SC_BK1A_0B_L, 0xFF00)>>8;
8048 			u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
8049 			u16PrevMinPixel = u16MinPixel;
8050 
8051 			MaxMinPixel = u16MaxPixel - u16MinPixel;
8052 
8053 			if(u8Luma>=0xFF)
8054 				u8Luma = 0xFF;
8055 
8056 			HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
8057 
8058 			if(HDSDD_Det_threshold >=0xFFFF)
8059 				HDSDD_Det_threshold=0xFFFF;
8060 
8061 			MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
8062 			MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
8063 
8064 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x1000, 0x7000);
8065 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0100, 0x0700); /*for HD repot*/
8066 
8067 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0001); /* mode */
8068 			MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0010); /* mode */
8069 
8070 
8071 	       MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
8072 	       MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
8073 
8074 
8075 		}
8076 		else if( timingSegment == 1 )
8077 		{
8078 
8079 		}
8080 		else /* Run */
8081 		{
8082 			HDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8083 			SDcnt_Act_Cur =  (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8084 
8085 			HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act*3) >> 2;
8086 			SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act*3) >> 2;
8087 
8088 			*_hpfHdCntReport = HDcnt_Act;
8089 			*_hpfSdCntReport = SDcnt_Act;
8090 
8091 
8092 			if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8093 			{
8094 				if(HD_ConfirmCnt < HD_SPEED)
8095 					HD_ConfirmCnt = 0;
8096 				else
8097 					HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8098 			}
8099 			else if( SDcnt_Act != 0 )
8100 			{
8101 				if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8102 					HD_ConfirmCnt = 0x80;
8103 				else
8104 					HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8105 			}
8106 			else
8107 			{
8108 				if(HD_ConfirmCnt < 1)
8109 					HD_ConfirmCnt = 0;
8110 				else
8111 					HD_ConfirmCnt = HD_ConfirmCnt - 1;
8112 			}
8113 
8114 			if( HD_ConfirmCnt > 0x20 )
8115 				HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8116 			else
8117 				HD_ConfirmCnt_Reg = 0;
8118 
8119 			HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8120 
8121 			if( HD_ConfirmCnt_Reg > 0x3F )
8122 				HD_ConfirmCnt_Reg = 0x3F;
8123 
8124 			_return = HD_ConfirmCnt_Reg;
8125 		}
8126 	}
8127 	else
8128 	{
8129 		//  return to the original condition
8130 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8131 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8132 	}
8133 
8134 	return _return;
8135 }
8136 
MDrv_SC_Edison_NEW_SDHD_DETECT_report(void * pInstance)8137 MS_U8 MDrv_SC_Edison_NEW_SDHD_DETECT_report(void *pInstance)
8138 {
8139 	MS_U32 HDcnt_Act[5] = {0,0,0,0,0};
8140 	MS_U32 SDcnt_Act[5] = {0,0,0,0,0};
8141 	MS_U32 FeatherCnt[5] = {0,0,0,0,0};
8142 	MS_U32 SDcnt_NonAct[5] = {0,0,0,0,0};
8143 	static MS_U32 HDcnt_Act_prv[5] = {0,0,0,0,0};
8144 	static MS_U32 SDcnt_Act_prv[5] = {0,0,0,0,0};
8145 	static MS_U32 FeatherCnt_prv[5] = {0,0,0,0,0};
8146 	static MS_U32 SDcnt_NonAct_prv[5] = {0,0,0,0,0};
8147 	static MS_U8 SD2HD_CNT = 0;
8148 	static MS_U16 HD_ConfirmCnt[5] = {0,0,0,0,0};//xFF;
8149 	static MS_U32 HD_ConfirmCnt_Reg[5] = {0,0,0,0,0};
8150 	static MS_U32 HD_ConfirmCnt_Reg_f_prv = 0;
8151 	MS_U32 HD_ConfirmCnt_Reg_f = 0;
8152 
8153 	if( SD2HD_CNT == 0 )
8154 	{
8155 		//empty stage
8156 	}
8157 	else if( SD2HD_CNT == 1 )
8158 	{
8159 		//Detect corner logo
8160 		//left-side
8161 		HDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8162 		SDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8163 		SDcnt_NonAct[0] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8164 		FeatherCnt[0]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8165 
8166 		//IIR result
8167 		HDcnt_Act[0]    = (HDcnt_Act_prv[0]*3 + HDcnt_Act[0])/4;
8168 		SDcnt_Act[0]    = (SDcnt_Act_prv[0]*3 + SDcnt_Act[0])/4;
8169 		SDcnt_NonAct[0] = (SDcnt_NonAct_prv[0]*3 + SDcnt_NonAct[0])/4;
8170 		FeatherCnt[0]   = (FeatherCnt_prv[0]*3 + FeatherCnt[0])/4;
8171 		HDcnt_Act_prv[0]    = HDcnt_Act[0];
8172 		SDcnt_Act_prv[0]    = SDcnt_Act[0];
8173 		SDcnt_NonAct_prv[0] = SDcnt_NonAct[0];
8174 		FeatherCnt_prv[0]   = FeatherCnt[0];
8175 
8176 		if((HDcnt_Act[0] > HD_ACT_TH) && (SDcnt_Act[0] != 0)) //debugging
8177 		{
8178 			if(HD_ConfirmCnt[0] < HD_SPEED*5)
8179 				HD_ConfirmCnt[0] = 0;
8180 			else
8181 				HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - HD_SPEED*5;
8182 		}
8183 		else if( SDcnt_Act[0] != 0 ) //w/o consider feathering
8184 		{
8185 			if(HD_ConfirmCnt[0] > (0xFF - SD_SPEED*5))
8186 				HD_ConfirmCnt[0] = 0xFF;
8187 			else
8188 				HD_ConfirmCnt[0] = HD_ConfirmCnt[0] + SD_SPEED*5;
8189 		}
8190 		else
8191 		{
8192 			if(HD_ConfirmCnt[0] < 1)
8193 				HD_ConfirmCnt[0] = 0;
8194 			else
8195 				HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - 1;
8196 		}
8197 
8198 		if( HD_ConfirmCnt[0] > 0x80 )
8199 			HD_ConfirmCnt_Reg[0] = HD_ConfirmCnt[0] - 0x80;
8200 		else
8201 			HD_ConfirmCnt_Reg[0] = 0;
8202 
8203 		HD_ConfirmCnt_Reg[0] = (HD_ConfirmCnt_Reg[0]*HDSDD_SPEED) >> HDSDD_DIV;
8204 
8205 		if( HD_ConfirmCnt_Reg[0] > 0x3F )
8206 			HD_ConfirmCnt_Reg[0] = 0x3F;
8207 
8208 		//for SD2HD_CNT == 2 window size
8209 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 480, 0x1FFF);
8210 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1440, 0x1FFF);
8211 	}
8212 	else if( SD2HD_CNT == 2 )
8213 	{
8214 		//empty stage
8215 	}
8216 	else if( SD2HD_CNT == 3 )
8217 	{
8218 		HDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8219 		SDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8220 		SDcnt_NonAct[1] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8221 		FeatherCnt[1]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8222 
8223 		//IIR result
8224 		HDcnt_Act[1]    = (HDcnt_Act_prv[1]*3 + HDcnt_Act[1])/4;
8225 		SDcnt_Act[1]    = (SDcnt_Act_prv[1]*3 + SDcnt_Act[1])/4;
8226 		SDcnt_NonAct[1] = (SDcnt_NonAct_prv[1]*3 + SDcnt_NonAct[1])/4;
8227 		FeatherCnt[1]   = (FeatherCnt_prv[1]*3 + FeatherCnt[1])/4;
8228 		HDcnt_Act_prv[1]    = HDcnt_Act[1];
8229 		SDcnt_Act_prv[1]    = SDcnt_Act[1];
8230 		SDcnt_NonAct_prv[1] = SDcnt_NonAct[1];
8231 		FeatherCnt_prv[1]   = FeatherCnt[1];
8232 
8233 		if( (HDcnt_Act[1] > HD_ACT_TH) && (SDcnt_Act[1] != 0) )
8234 		{
8235 			if(HD_ConfirmCnt[1] < HD_SPEED*5)
8236 				HD_ConfirmCnt[1] = 0;
8237 			else
8238 				HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - HD_SPEED*5;
8239 
8240 		}
8241 		else if( SDcnt_Act[1] != 0 ) //w/o consider feathering
8242 		{
8243 			if(HD_ConfirmCnt[1] > (0xFF - SD_SPEED*5))
8244 				HD_ConfirmCnt[1] = 0xFF;
8245 			else
8246 				HD_ConfirmCnt[1] = HD_ConfirmCnt[1] + SD_SPEED*5;
8247 		}
8248 		else
8249 		{
8250 			if(HD_ConfirmCnt[1] < 1)
8251 				HD_ConfirmCnt[1] = 0;
8252 			else
8253 				HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - 1;
8254 		}
8255 
8256 		if( HD_ConfirmCnt[1] > 0x80 )
8257 			HD_ConfirmCnt_Reg[1] = HD_ConfirmCnt[1] - 0x80;
8258 		else
8259 			HD_ConfirmCnt_Reg[1] = 0;
8260 
8261 		HD_ConfirmCnt_Reg[1] = (HD_ConfirmCnt_Reg[1]*HDSDD_SPEED) >> HDSDD_DIV;
8262 
8263 		if( HD_ConfirmCnt_Reg[1] > 0x3F )
8264 			HD_ConfirmCnt_Reg[1] = 0x3F;
8265 
8266 		//for SD2HD_CNT == 4 window size
8267 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 640, 0x1FFF);
8268 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1280, 0x1FFF);
8269 	}
8270 	else if( SD2HD_CNT == 4 )
8271 	{
8272 		//empty stage
8273 	}
8274 	else if( SD2HD_CNT == 5 )
8275 	{
8276 		HDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8277 		SDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8278 		SDcnt_NonAct[2] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8279 		FeatherCnt[2]   =  MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8280 
8281 		//IIR result
8282 		HDcnt_Act[2]    = (HDcnt_Act_prv[2]*3 + HDcnt_Act[2])/4;
8283 		SDcnt_Act[2]    = (SDcnt_Act_prv[2]*3 + SDcnt_Act[2])/4;
8284 		SDcnt_NonAct[2] = (SDcnt_NonAct_prv[2]*3 + SDcnt_NonAct[2])/4;
8285 		FeatherCnt[2]   = (FeatherCnt_prv[2]*3 + FeatherCnt[2])/4;
8286 		HDcnt_Act_prv[2]    = HDcnt_Act[2];
8287 		SDcnt_Act_prv[2]    = SDcnt_Act[2];
8288 		SDcnt_NonAct_prv[2] = SDcnt_NonAct[2];
8289 		FeatherCnt_prv[2]   = FeatherCnt[2];
8290 
8291 		if( (HDcnt_Act[2] > HD_ACT_TH) && (SDcnt_Act[2] != 0) )
8292 		{
8293 			if(HD_ConfirmCnt[2] < HD_SPEED*5)
8294 				HD_ConfirmCnt[2] = 0;
8295 			else
8296 				HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - HD_SPEED*5;
8297 
8298 		}
8299 		else if( SDcnt_Act[2] != 0 ) //w/o consider feathering
8300 		{
8301 			if(HD_ConfirmCnt[2] > (0xFF - SD_SPEED*5))
8302 				HD_ConfirmCnt[2] = 0xFF;
8303 			else
8304 				HD_ConfirmCnt[2] = HD_ConfirmCnt[2] + SD_SPEED*5;
8305 		}
8306 		else
8307 		{
8308 			if(HD_ConfirmCnt[2] < 1)
8309 				HD_ConfirmCnt[2] = 0;
8310 			else
8311 				HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - 1;
8312 		}
8313 
8314 		if( HD_ConfirmCnt[2] > 0x80 )
8315 			HD_ConfirmCnt_Reg[2] = HD_ConfirmCnt[2] - 0x80;
8316 		else
8317 			HD_ConfirmCnt_Reg[2] = 0;
8318 
8319 		HD_ConfirmCnt_Reg[2] = (HD_ConfirmCnt_Reg[2]*HDSDD_SPEED) >> HDSDD_DIV;
8320 
8321 		if( HD_ConfirmCnt_Reg[2] > 0x3F )
8322 			HD_ConfirmCnt_Reg[2] = 0x3F;
8323 
8324 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 40, 0x1FFF);
8325 		//MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1880, 0x1FFF);
8326 	}
8327 
8328 	if( SD2HD_CNT == 5 )
8329 	{
8330 		HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg[2] + ((HD_ConfirmCnt_Reg[0] + HD_ConfirmCnt_Reg[1]*3 )>>2);
8331 
8332 		HD_ConfirmCnt_Reg_f = (HD_ConfirmCnt_Reg_f_prv*3 + HD_ConfirmCnt_Reg_f+2)/4;
8333 
8334 		if( HD_ConfirmCnt_Reg_f >= 0x3E )
8335 			HD_ConfirmCnt_Reg_f = 0x3F;
8336 		else if( HD_ConfirmCnt_Reg_f <= 0x02 )
8337 			HD_ConfirmCnt_Reg_f = 0;
8338 
8339 		HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f;
8340 	}
8341 	else
8342 	{
8343 		HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg_f_prv;
8344 		//HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f_prv;
8345 	}
8346 
8347 	//for next frame start
8348 	if( SD2HD_CNT == 5 )
8349 		SD2HD_CNT = 0;
8350 	else
8351 		SD2HD_CNT++;
8352 
8353 	return HD_ConfirmCnt_Reg_f;
8354 }
8355 
MDrv_UFSC_PQ_BNF_status(XC_BackgroundState * backgroundState,MS_BOOL isOpFrameChanged)8356 void MDrv_UFSC_PQ_BNF_status( XC_BackgroundState *backgroundState, MS_BOOL isOpFrameChanged  ) //Left half histogram data
8357 {
8358     static MS_U16 iir_Ymax = 0;
8359     static MS_U16 iir_Umax = 0;
8360     static MS_U16 iir_Vmax = 0;
8361     static MS_U32 iir_pbgrate = 0;
8362     static MS_U32 iir_flatSkinCnt = 0;
8363     static MS_U32 iir_cplxCnt = 0;
8364     static MS_U32 iir_prvBgCnt = 0;
8365     static MS_U32 iir_skinRawCnt = 0;
8366     static MS_U32 iir_cplxRawCnt = 0;
8367     static MS_U32 iir_dswRawCnt = 0;
8368 
8369     MS_U32 BNF_Yhist[32], BNF_Uhist[32], BNF_Vhist[32];
8370     static MS_BOOL SetStatus = false;
8371     MS_U16 i, Ymax, Umax, Vmax;
8372     MS_U32 Ymax_cnt, Umax_cnt, Vmax_cnt, maxYUVcnt;
8373     MS_U32 totalPixel, pbgrate;
8374 
8375     MApi_XC_Write2ByteMask(REG_FSC_BK4D_39_L, 0 , 0x0FFF );
8376     MApi_XC_Write2ByteMask(REG_FSC_BK4D_3B_L, frameWidth/2-1 , 0x0FFF );
8377     MApi_XC_Write2ByteMask(REG_FSC_BK4D_3C_L, frameHeight-1 , 0x0FFF );
8378 
8379     MApi_XC_Write2ByteMask(REG_FSC_BKCD_39_L, GuardBandWidth , 0x0FFF );
8380     MApi_XC_Write2ByteMask(REG_FSC_BKCD_3B_L, GuardBandWidth+ frameWidth/2-1 , 0x0FFF );
8381     MApi_XC_Write2ByteMask(REG_FSC_BKCD_3C_L, frameHeight-1 , 0x0FFF );
8382 
8383 
8384     if ( isOpFrameChanged )
8385     {
8386         if( !SetStatus )
8387         {
8388             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0004 );
8389             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0004 , 0x0004 );
8390 
8391             SetStatus = true;
8392         }
8393         else if (( MDrv_UFSC_Read2Byte(REG_FSC_BK4D_51_L)& 0x0008 ) &&  SetStatus )
8394         {
8395             // Y histogram
8396             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0003 );
8397             for( i = 0 ; i < 32 ; ++i )
8398             {
8399                 MS_U16 sh = ((i&0x3)<<2);
8400                             BNF_Yhist[i] = ( MDrv_UFSC_Read2Byte(REG_FSC_BK4D_58_L+ (i<<1) ) << 3 )
8401                     + ( (MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8402                     + ( MDrv_UFSC_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8403                     + ( (MDrv_UFSC_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8404             }
8405 
8406 #if 0
8407             totalPixel = 0;
8408             printf(" --- Y historgam -- \n");
8409             for ( i = 0 ; i < 32; i ++)
8410             {
8411                 totalPixel = totalPixel + BNF_Yhist[i];
8412                 printf("Yhist[%d] = %d\n", i, BNF_Yhist[i]);
8413             }
8414             printf("total pixel = %d\n", totalPixel );
8415 #endif
8416             // U histogram
8417             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0001 , 0x0003 );
8418             for( i = 0 ; i < 32 ; ++i )
8419             {
8420                 MS_U16 sh = ((i&0x3)<<2);
8421                             BNF_Uhist[i] = ( MDrv_UFSC_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8422                     + ( (MDrv_UFSC_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8423                     + ( MDrv_UFSC_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8424                     + ( (MDrv_UFSC_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8425             }
8426 #if 0
8427             totalPixel = 0;
8428             printf(" --- U historgam -- \n");
8429             for ( i = 0 ; i < 32; i ++)
8430             {
8431                 totalPixel = totalPixel + BNF_Uhist[i];
8432                 printf("Uhist[%d] = %d\n", i, BNF_Uhist[i]);
8433             }
8434             printf("total pixel = %d\n", totalPixel );
8435 #endif
8436 
8437 
8438             // V histogram
8439             MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0002 , 0x0003 );
8440             for( i = 0 ; i < 32 ; ++i )
8441             {
8442                 MS_U16 sh = ((i&0x3)<<2);
8443                             BNF_Vhist[i] = ( MDrv_UFSC_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8444                     + ( (MDrv_UFSC_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8445                     + ( MDrv_UFSC_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8446                     + ( (MDrv_UFSC_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8447             }
8448 #if 0
8449             totalPixel = 0;
8450             printf(" --- V historgam -- \n");
8451             for ( i = 0 ; i < 32; i ++)
8452             {
8453                 totalPixel = totalPixel + BNF_Vhist[i];
8454                 printf("Vhist[%d] = %d\n", i, BNF_Vhist[i]);
8455             }
8456             printf("total pixel = %d\n", totalPixel );
8457 #endif
8458 
8459 
8460             Ymax = 0;
8461             Umax = 0;
8462             Vmax = 0;
8463             Ymax_cnt = 0;
8464             Umax_cnt = 0;
8465             Vmax_cnt = 0;
8466 
8467             for ( i = 0; i< 32; i++ )
8468             {
8469                 if ( BNF_Yhist[i] > Ymax_cnt )
8470                 {
8471                     Ymax = i << 4;
8472                     Ymax_cnt = BNF_Yhist[i];
8473                 }
8474 
8475                 if ( BNF_Uhist[i] > Umax_cnt )
8476                 {
8477                     Umax = i << 4;
8478                     Umax_cnt = BNF_Uhist[i];
8479                 }
8480 
8481                 if ( BNF_Vhist[i] > Vmax_cnt )
8482                 {
8483                     Vmax = i << 4 ;
8484                     Vmax_cnt = BNF_Vhist[i];
8485                 }
8486 
8487             }
8488 
8489             maxYUVcnt  = __min3(Ymax_cnt, Umax_cnt, Vmax_cnt);
8490             totalPixel = ( frameWidth* frameHeight ) >> 5;
8491             pbgrate = (totalPixel!=0) ? (maxYUVcnt*5000)/totalPixel : 0;
8492 
8493             Ymax = ((3*iir_Ymax)+ Ymax ) >> 2;
8494             iir_Ymax = Ymax;
8495 
8496             Umax = ((3*iir_Umax)+ Umax ) >> 2;
8497             iir_Umax = Umax;
8498 
8499             Vmax = ((3*iir_Vmax )+ Vmax ) >> 2;
8500             iir_Vmax = Vmax;
8501 
8502             pbgrate = ((iir_pbgrate*3 )+ pbgrate) >> 2;
8503             iir_pbgrate = pbgrate;
8504 
8505             Ymax = ( Ymax + 8 )>> 4;
8506             Umax = ( Umax + 8 )>> 4;
8507             Vmax = ( Vmax + 8 )>> 4;
8508 
8509 
8510 #if 0
8511             printf(" max Ybin = %d, cnt = %d \n", Ymax, Ymax_cnt );
8512             printf(" max Ubin = %d, cnt = %d \n", Umax, Umax_cnt  );
8513             printf(" max Vbin = %d, cnt = %d \n", Vmax, Vmax_cnt  );
8514             printf(" totalPixel = %d \n", totalPixel );
8515             printf(" maxYUVcnt = %d \n", maxYUVcnt );
8516             printf(" pbgrate = %d \n", pbgrate );
8517 #endif
8518 
8519             MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Ymax , 0x001F );
8520             MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Umax << 8 , 0x1F00 );
8521             MApi_XC_Write2ByteMask(REG_FSC_BK4D_43_L, Vmax , 0x001F );
8522             MApi_XC_Write2ByteMask(REG_FSC_BK4D_45_L, pbgrate , 0xDFFF );
8523 
8524             MS_U32 flatSkinCnt = ( (MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_53_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BK4D_52_L )
8525                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_53_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_52_L ) ) >> 1;
8526             MS_U32 cplxCnt = (( MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_55_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BK4D_54_L )
8527                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_55_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_54_L ) ) >> 1;
8528             MS_U32 prvBgCnt = ((MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_57_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BK4D_56_L )
8529                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_57_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_56_L ) ) >> 1;
8530             MS_U32 skinRawCnt = ((MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_4B_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BK4D_4A_L )
8531                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_4B_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_4A_L ) ) >> 1;
8532             MS_U32 cplxRawCnt = ((MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_4D_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BK4D_4C_L )
8533                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_4D_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_4C_L ) ) >> 1;
8534             MS_U32 dswRawCnt = ((MDrv_UFSC_Read2ByteMSK(REG_FSC_BK4D_4F_L, 0x0007 ) << 16) +    MDrv_UFSC_Read2Byte(REG_FSC_BK4D_4E_L )
8535                         + (MDrv_UFSC_Read2ByteMSK(REG_FSC_BKCD_4F_L, 0x0007 ) << 16) +  MDrv_UFSC_Read2Byte(REG_FSC_BKCD_4E_L ) ) >> 1;
8536 
8537 
8538             flatSkinCnt = ((iir_flatSkinCnt*3 )+ flatSkinCnt) >> 2;
8539             iir_flatSkinCnt = flatSkinCnt;
8540 
8541             cplxCnt = ((iir_cplxCnt*3 )+ cplxCnt) >> 2;
8542             iir_cplxCnt = cplxCnt;
8543 
8544             prvBgCnt = ((iir_prvBgCnt*3 )+ prvBgCnt) >> 2;
8545             iir_prvBgCnt = prvBgCnt;
8546 
8547             skinRawCnt = ((iir_skinRawCnt*3 )+ skinRawCnt) >> 2;
8548             iir_skinRawCnt = skinRawCnt;
8549 
8550             cplxRawCnt = ((iir_cplxRawCnt*3 )+ cplxRawCnt) >> 2;
8551             iir_cplxRawCnt = cplxRawCnt;
8552 
8553             dswRawCnt = ((iir_dswRawCnt*3 )+ dswRawCnt) >> 2;
8554             iir_dswRawCnt = dswRawCnt;
8555 
8556 
8557             backgroundState->flatSkinCnt = flatSkinCnt;
8558             backgroundState->cplxCnt = cplxCnt;
8559             backgroundState->prvBgCnt = prvBgCnt;
8560             backgroundState->skinRawCnt = skinRawCnt;
8561             backgroundState->cplxRawCnt = cplxRawCnt;
8562             backgroundState->dswRawCnt = dswRawCnt;
8563 
8564             backgroundState->pbgY = Ymax;
8565             backgroundState->pbgU = Umax;
8566             backgroundState->pbgV = Vmax;
8567             backgroundState->pbgrate = pbgrate;
8568 
8569             SetStatus = false;
8570         }
8571     }
8572 
8573 }
8574 
MDrv_UFSC_PQ_LSE(int frNNCnt2,int menuW,int edgePatW,int sdW,int srEnhStr)8575 void MDrv_UFSC_PQ_LSE( int frNNCnt2, int menuW, int edgePatW, int sdW, int srEnhStr )
8576 {
8577     #define LSE_EDGE_G_LB 8
8578     int artW = __max( menuW, edgePatW );
8579 
8580     // CG pattern
8581     int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
8582     nnW = __min( 256, nnW );
8583 
8584     // LSE adaptive edge gain
8585         int edgeGain = MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_38_L, 0x003F);
8586     int edgeGainLb = LSE_EDGE_G_LB;
8587     edgeGain = __max( edgeGain, edgeGainLb );
8588 
8589     int reduceW = __max( artW, sdW );
8590     int adptGain = __max( 0, edgeGain * (512-reduceW) >> 9 );
8591     adptGain = (adptGain * (256-nnW)) >> 8;
8592     adptGain = (adptGain * srEnhStr) >> 5;
8593     adptGain = __min( adptGain, 0x003F );
8594     MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, adptGain<<8, 0x3F00 );
8595 
8596     // detail gain
8597     reduceW = __max(0,256 - nnW);//max( 0, 256 - min( (sdW>>1), nnW ) );
8598     {
8599              int detGain = (MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_38_L, 0x3F00 ) * reduceW) >> 8;
8600         detGain = ( detGain * srEnhStr ) >> 5;
8601         detGain = __min( 0x003f, detGain );
8602         MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, detGain, 0x003F );
8603     }
8604     {
8605               int detGain = (MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_39_L, 0x003F ) * reduceW) >> 8;
8606         detGain = ( detGain * srEnhStr ) >> 5;
8607         detGain = __min( 0x003f, detGain );
8608         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain<<8, 0x3F00 );
8609     }
8610     {
8611               int detGain = (MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_39_L, 0x3F00 ) * reduceW) >> 8;
8612         detGain = ( detGain * srEnhStr ) >> 5;
8613         detGain = __min( 0x003f, detGain );
8614         MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain, 0x003F );
8615     }
8616     // lut gain
8617     int finalLutGain = 0x08 + ( (0x08*sdW) >> 8 );
8618     MApi_XC_Write2ByteMask( REG_FSC_BK75_1C_L, finalLutGain, 0x001F );
8619 
8620 }
8621 
MDrv_UFSC_PQ_NLM(XC_BackgroundState * backgroundState,int menuW,int edgePatW,int srEnhStr)8622 void MDrv_UFSC_PQ_NLM( XC_BackgroundState *backgroundState, int menuW, int edgePatW, int srEnhStr )
8623 {
8624     // coring
8625     MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, __max( edgePatW, menuW ) >> 3, 0x00FF );
8626 
8627     // NLM gain for skin, this should use colour adaptive
8628     int pbSkinW = __max( 0, (int)backgroundState->flatSkinCnt - 1200) >> 2;
8629     pbSkinW = __min( 16, pbSkinW );
8630 
8631     // NLM gain
8632         int finGain = /*0xA*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_30_L, 0x00FF ) - ( (4 * pbSkinW) >> 4 );
8633     finGain = ( finGain * srEnhStr ) >> 5;
8634     finGain = __min( 0x00FF, finGain );
8635     MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, finGain<<8, 0xFF00 );
8636 
8637     //printf( "pbSkinW, NLM gain : %d, %d\n", pbSkinW, finGain );
8638 
8639 }
8640 
MDrv_UFSC_PQ_PreEnh(int fHdW,int sdW,MS_U16 estNoise,MS_U8 estConfirm,int srEnhStr)8641 void MDrv_UFSC_PQ_PreEnh( int fHdW, int sdW, MS_U16 estNoise,MS_U8 estConfirm, int srEnhStr )
8642 {
8643     // BLTI bias gain
8644     int biasGain = ( 0x10 * fHdW ) >> 8;
8645     if( fHdW == 256 )
8646     {
8647         biasGain = ( 0x10 * (256-sdW) + 0x20 * sdW ) >> 8;
8648     }
8649 
8650     MApi_XC_Write2ByteMask( REG_FSC_BK4C_52_L, biasGain, 0x007F );
8651 
8652     // LTI ac thrd
8653     int acThrd = ( 0x04 * (256-sdW) + 0x1C * sdW ) >> 8;
8654     MApi_XC_Write2ByteMask( REG_FSC_BK4C_53_L, acThrd<<8, 0xFF00 );
8655 
8656     // Pre PK3x3
8657     int finGain = (/*0x10*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_30_L, 0x3F00 ) * srEnhStr ) >> 5;
8658     finGain = __min( 0x3F00, finGain );
8659     MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, finGain, 0x003F );
8660 
8661     // LDE
8662         int ldeDarkGain = MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_31_L, 0x1F00) ;
8663     int ldeDarkGainSD = MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_32_L, 0x001F) ;
8664     int ldeDarkGainFHD = (ldeDarkGain + ldeDarkGainSD) >> 1;
8665     int ldeGain = ( ldeDarkGain/*0xA*/ * (256 - fHdW) + ldeDarkGainFHD/*0x12*/ * fHdW ) >> 8;
8666     if( fHdW == 256 )
8667     {
8668         ldeGain = ( ldeDarkGainFHD * (256-sdW) + ldeDarkGainSD/*0x1A*/ * sdW ) >> 8;
8669     }
8670 
8671     MS_U8 report_noise = __minmax(estNoise,0,15);
8672     report_noise = (report_noise == 15) ? 16 : report_noise;
8673     MS_U8 report_confirm = __minmax(estConfirm-1,0,7);
8674     report_confirm = __max(0,report_confirm - 2) * 4;
8675     report_confirm = __minmax( report_confirm, 0, 16 );
8676 
8677     int noiseW = estNoise - (16-report_confirm);
8678     noiseW = 16 - __minmax( noiseW, 0, 16 );
8679     // back to default while noise is large
8680     ldeGain = ( ldeDarkGain * (16-noiseW) + ldeGain/*0xA*/ * noiseW ) >> 4;
8681     ldeGain = ( ldeGain * srEnhStr ) >> 5;
8682 
8683     MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGain<<8, 0x1F00 );
8684 
8685     int ldeGainH =( MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_31_L, 0x001F )/*0xA*/ * noiseW ) >> 4;
8686     ldeGainH = ( ldeGainH * srEnhStr ) >> 5;
8687     MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGainH, 0x001F );
8688 }
8689 
MDrv_UFSC_PQ_PostPK3x3(int menuW,int edgePatW,int fHdW,int sdW,int srEnhStr)8690 void MDrv_UFSC_PQ_PostPK3x3( int menuW, int edgePatW, int fHdW, int sdW, int srEnhStr )
8691 {
8692     // ds_minw
8693     edgePatW = __max( edgePatW, menuW );
8694     fHdW = __max( 0, fHdW - edgePatW );
8695        int dsmin = MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_33_L, 0xFF00);
8696        int dsminSD = __min( 0x00FF, dsmin + MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_34_L, 0x00FF) );
8697     int dsminFHD = (dsmin*170 + dsminSD*86) >> 8;
8698     int dsminW = ( dsmin * (256-fHdW) + /*0x20*/dsminFHD * fHdW ) >> 8;
8699     if( fHdW == 256 )
8700     {
8701         dsminW = ( /*0x20*/dsminFHD * (256-sdW) + /*0x60*/dsminSD * sdW ) >> 8;
8702     }
8703     MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, dsminW<<8, 0xFF00 );
8704 
8705     // ds gain
8706     //int dsw = MApi_XC_R2BYTEMSK( REG_SC_BK30_32_H, 0xFF );
8707     //int dswSD = MApi_XC_R2BYTEMSK( REG_SC_BK30_33_L, 0xFF );
8708     int dsGain = 0xB/*dsw*/ - ( ((0xB/*dswSD*/)*fHdW ) >> 8 );
8709     //int dsGain = ( dsw * (256-fHdW) + dswSD * fHdW ) >> 8;
8710     MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, (dsGain&0xFF), 0x00FF );
8711 
8712     // lower high gain
8713     int posGain = 0x30/*MApi_XC_R2BYTEMSK( REG_SC_BK30_34_H, 0xFF )*/ - ( (0x18/*MApi_XC_R2BYTEMSK( REG_SC_BK30_35_L, 0xFF )*/ * sdW) >> 8 );
8714     posGain = ( posGain * srEnhStr ) >> 5;
8715     posGain = __min( 0xFF, posGain );
8716     MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
8717 
8718     int negGain = ( 0x30/*MApi_XC_R2BYTEMSK( REG_FSC_BK30_35_H, 0xFF )*/ * srEnhStr ) >> 5;
8719     negGain = __min( 0xFF, negGain );
8720     MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
8721 }
8722 
MDrv_UFSC_PQ_HASC(int sdW,int srEnhStr)8723 void MDrv_UFSC_PQ_HASC( int sdW, int srEnhStr )
8724 {
8725        int lowGain = /*0x28*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_36_L, 0x7F00 )
8726         + ( (/*0x38*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_37_L, 0x007F ) * sdW) >> 8 );
8727     lowGain = ( lowGain * srEnhStr ) >> 5;
8728     lowGain = __min( lowGain, 0x007F );
8729     MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, lowGain<<8, 0x7F00 );
8730 
8731        int highGain = ( /*0x18*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_36_L, 0x007F ) * srEnhStr ) >> 5;
8732     highGain = __min( 0x007F, highGain );
8733     MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, highGain, 0x007F );
8734 }
8735 
MDrv_UFSC_PQ_P2M(int menuW,int edgePatW,int srEnhStr)8736 void MDrv_UFSC_PQ_P2M( int menuW, int edgePatW, int srEnhStr )
8737 {
8738        int gain = ( /*9*/MDrv_UFSC_Read2ByteMSK( REG_FSC_BK30_37_L, 0x3F00 ) * (256 - __max(edgePatW, menuW)) ) >> 8;
8739     gain = (gain * srEnhStr ) >> 5;
8740     gain = __min( 0x3F00, gain );
8741     MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, gain, 0x003F );
8742 }
8743 
MDrv_UFSC_PQ_ANN(int frNNCnt2)8744 void MDrv_UFSC_PQ_ANN( int frNNCnt2 )
8745 {
8746     // CG pattern
8747     int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
8748     nnW = __min( 256, nnW );
8749     int artNNW = __max( 0, frNNCnt2 - 8192 ) >> 4;
8750     artNNW = __min( 256, artNNW );
8751 
8752     int colorGain = ( 0x10 * (256-nnW) + 0x7 * nnW ) >> 8;
8753     colorGain = ( colorGain * (256-artNNW) + 0x04 * artNNW ) >> 8;
8754     int colorOffset = ( artNNW * 0x18 ) >> 8;
8755 
8756     int strictGain = ( 0x20 * (256-nnW) + 0x4 * nnW ) >> 8;
8757     strictGain = ( strictGain * (256-artNNW) + 0x2 * artNNW ) >> 8;
8758     int strictOffset = ( 0x17 * nnW ) >> 8;
8759     strictOffset = ( strictOffset * (256-artNNW) + 0x0 * artNNW ) >> 8;
8760 
8761     int nnGain = ( 0x10 * (256-artNNW) + 0x18 * artNNW ) >> 8;
8762 
8763     MApi_XC_Write2ByteMask( REG_FSC_BK72_25_L, ((colorGain<<8)+colorOffset), 0xFF00 );
8764     MApi_XC_Write2ByteMask( REG_FSC_BK72_26_L, ((strictGain<<8)+strictOffset), 0xFF00 );
8765     MApi_XC_Write2ByteMask( REG_FSC_BK72_2D_L, nnGain, 0x001F );
8766 
8767 }
8768 
MDrv_UFSC_PQ_DMS_referBNF(XC_BackgroundState * backgroundState)8769 void MDrv_UFSC_PQ_DMS_referBNF( XC_BackgroundState *backgroundState )
8770 {
8771 
8772     MS_U16 Ymax_idx = backgroundState->pbgY;
8773     MS_U16 Umax_idx = backgroundState->pbgU;
8774     MS_U16 Vmax_idx = backgroundState->pbgV;
8775     MS_U32 confidence = backgroundState->pbgrate;
8776 
8777 
8778     MApi_XC_Write2ByteMask(REG_FSC_BK26_44_L, Ymax_idx , 0x001F );
8779     MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Umax_idx , 0x001F );
8780     MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Vmax_idx << 8 , 0x1F00 );
8781     MApi_XC_Write2ByteMask(REG_FSC_BK26_46_L, confidence, 0x3FFF );
8782 
8783 }
8784 
8785 //-------------------------------------------------------------------------------------------------
8786 /// LSE PQ function
8787 //  1. Zone plate patch
8788 //-------------------------------------------------------------------------------------------------
8789 
MDrv_UFSC_PQ_LSE_Patch(void)8790 void MDrv_UFSC_PQ_LSE_Patch(void)
8791 {
8792     static int iir_std_stat = 0;
8793     int std_stat_TH = 5;
8794        int reg_std_stat =  MDrv_UFSC_Read2Byte(REG_FSC_BK2C_79_L);
8795     int totalPixelCount = (( MDrv_UFSC_Read2Byte( REG_FSC_BK55_19_L ) << 16 ) + MDrv_UFSC_Read2Byte( REG_FSC_BK55_18_L ));
8796     int totalPixelYSum= ( MDrv_UFSC_Read2Byte( REG_FSC_BK55_1B_L ) << 16 ) + MDrv_UFSC_Read2Byte( REG_FSC_BK55_1A_L );
8797 
8798     totalPixelCount = (totalPixelCount / 256);
8799 
8800     if (totalPixelCount == 0)
8801         return;
8802     //printf("totalPixelCount:%d  ;totalPixelYSum%d \n",totalPixelCount,totalPixelYSum);
8803 
8804     int APL = (totalPixelYSum / totalPixelCount);
8805 
8806     /* IIR states */
8807     reg_std_stat = ((iir_std_stat*3 )+ reg_std_stat ) >> 2;
8808     iir_std_stat = reg_std_stat;
8809 
8810     APL = (APL == 0) ? 1 : APL;
8811 
8812     iir_std_stat = (iir_std_stat / APL );
8813 
8814     if ((iir_std_stat > std_stat_TH) || (APL < 20))
8815     {
8816         MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x00, 0x0F);//reg_lse_local_cplx_lut_gain
8817         MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0000 , 0x0100);//reg_lse_nlm_gain_en
8818         MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0000 , 0x0100);//reg_lse_uc_en
8819         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x03);//reg_time_of_cross_weight
8820         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x18);//reg_time_of_x_weight
8821         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x00 , 0xF0);//reg_main_lti_jaggy_min
8822         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x1F00);//reg_main_lti_jaggy_slope
8823         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x8000 , 0x8000);//reg_main_lti_jaggy_en
8824     }
8825     else
8826     {
8827         MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x08, 0x0F);//reg_lse_local_cplx_lut_gain
8828         MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0100 , 0x0100);//reg_lse_nlm_gain_en
8829         MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0100 , 0x0100);//reg_lse_uc_en
8830         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x03, 0x03);//reg_time_of_cross_weight
8831         MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x18, 0x18);//reg_time_of_x_weight
8832         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x40 , 0xF0);//reg_main_lti_jaggy_min
8833         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0400 , 0x1F00);//reg_main_lti_jaggy_slope
8834         MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x8000);//reg_main_lti_jaggy_en
8835     }
8836 
8837     //printf("reg_std_stat:%d ; iir_std_stat %d APL %d\n",reg_std_stat,iir_std_stat,APL);
8838 
8839 
8840 }
8841 
8842 
normFactor(int avgBLKN)8843 int normFactor(int avgBLKN)
8844 {
8845 	int normFac;
8846 	if (avgBLKN > 32768)
8847 		normFac = 11;
8848 	else if (avgBLKN > 16384)
8849 		normFac = 10;
8850 	else if (avgBLKN > 8192)
8851 		normFac = 9;
8852 	else if (avgBLKN > 4096)
8853 		normFac = 8;
8854 	else if (avgBLKN > 2048)
8855 		normFac = 7;
8856 	else if (avgBLKN > 1024)
8857 		normFac = 6;
8858 	else if (avgBLKN > 512)
8859 		normFac = 5;
8860 	else if (avgBLKN > 256)
8861 		normFac = 4;
8862 	else if (avgBLKN > 128)
8863 		normFac = 3;
8864 	else if (avgBLKN > 64)
8865 		normFac = 2;
8866 	else if (avgBLKN > 32)
8867 		normFac = 1;
8868 	else if (avgBLKN > 16)
8869 		normFac = 0;
8870 	else
8871 		normFac = 0;
8872 	return normFac;
8873 }
8874 
normFactorWidth(int avgBLKN)8875 int normFactorWidth(int avgBLKN)
8876 {
8877 	int normFac = 0;
8878 
8879 	if (avgBLKN > 1048576*1024)
8880 		normFac = 25;
8881 	else if (avgBLKN > 1048576*512)
8882 		normFac = 24;
8883 	else if (avgBLKN > 1048576*256)
8884 		normFac = 23;
8885 	else if (avgBLKN > 1048576*128)
8886 		normFac = 22;
8887 	else if (avgBLKN > 1048576*64)
8888 		normFac = 21;
8889 	else if (avgBLKN > 1048576*32)
8890 		normFac = 20;
8891 	else if (avgBLKN > 1048576*16)
8892 		normFac = 19;
8893 	else if (avgBLKN > 1048576*8)
8894 		normFac = 18;
8895 	else if (avgBLKN > 1048576*4)
8896 		normFac = 17;
8897 	else if (avgBLKN > 1048576*2)
8898 		normFac = 16;
8899 	else if (avgBLKN > 1048576)
8900 		normFac = 15;
8901 	else if (avgBLKN > 524288)
8902 		normFac = 14;
8903 	else if (avgBLKN > 262144)
8904 		normFac = 13;
8905 	else if (avgBLKN > 131072)
8906 		normFac = 12;
8907 	else if (avgBLKN > 65536)
8908 		normFac = 11;
8909 	else if (avgBLKN > 32768)
8910 		normFac = 10;
8911 	else if (avgBLKN > 16384)
8912 		normFac = 9;
8913 	else if (avgBLKN > 8192)
8914 		normFac = 8;
8915 	else if (avgBLKN > 4096)
8916 		normFac = 7;
8917 	else if (avgBLKN > 2048)
8918 		normFac = 6;
8919 	else if (avgBLKN > 1024)
8920 		normFac = 5;
8921 	else if (avgBLKN > 512)
8922 		normFac = 4;
8923 	else if (avgBLKN > 256)
8924 		normFac = 3;
8925 	else if (avgBLKN > 128)
8926 		normFac = 2;
8927 	else if (avgBLKN > 64)
8928 		normFac = 1;
8929 	else if (avgBLKN > 32)
8930 		normFac = 0;
8931 	else if (avgBLKN > 16)
8932 		normFac = -1;
8933 	else if (avgBLKN > 8)
8934 		normFac = -2;
8935 	else
8936 		normFac = 0;
8937 	return normFac;
8938 }
heightEstimate(int FrameWidth)8939 int heightEstimate(int FrameWidth)
8940 {
8941 	if (FrameWidth < 720)
8942 		return FrameWidth*3/4;
8943 	else if (FrameWidth == 720)
8944 		return 480;
8945 	else if ((FrameWidth>720) && (FrameWidth<1440))
8946 		return FrameWidth*9/16;
8947 	else if (FrameWidth == 1440)
8948 		return 900;
8949 	else if ((FrameWidth>1440) && (FrameWidth<1920))
8950 		return FrameWidth*9/16;
8951 	else if (FrameWidth==1920)
8952 		return 1080;
8953 	else if (FrameWidth>=3840)
8954 		return 2160;
8955 	else //if (frameWidth>1920)
8956 		return FrameWidth*9/16;
8957 }
DBK_StPtLeft(int width,MS_U8 * BLKN_adj,int rangeLeft,int rangeRight)8958 int DBK_StPtLeft( int width, MS_U8 *BLKN_adj, int rangeLeft, int rangeRight) //Left to right search
8959 {
8960 	int newSP=0;
8961 	int candiValue = 0;
8962 	int candiPos = 0;//-1
8963 	int ThValue = 2;
8964 	int bin=0;
8965 	int pl2=0, pl1=0, pr1=0, pr2=0;
8966 	int l1=0, r1=0;
8967 	for(bin = rangeLeft; bin < rangeRight; bin++)
8968 	{
8969 		int L1Index  = __minmax(bin-width  , 0, frameWidth-1);
8970 		int L1Index2 = __minmax(bin-width-1, 0, frameWidth-1);
8971 		pl1 = __max(BLKN_adj[L1Index], BLKN_adj[L1Index2]);
8972 
8973 		if (pl1 == BLKN_adj[L1Index])
8974 			l1 = L1Index;
8975 		else if (pl1 == BLKN_adj[L1Index2])
8976 			l1 = L1Index2;
8977 
8978 		int L2Index  = __minmax(l1 -width  , 0, frameWidth-1);
8979 		int L2Index2 = __minmax(l1 -width-1, 0, frameWidth-1);
8980 		pl2 = __max(BLKN_adj[L2Index], BLKN_adj[L2Index2]);
8981 
8982 		int R1Index  = __minmax(bin+width  , 0, frameWidth-1);
8983 		int R1Index2 = __minmax(bin+width+1, 0, frameWidth-1);
8984 		pr1 = __max(BLKN_adj[R1Index], BLKN_adj[R1Index2]);
8985 
8986 		if (pr1 == BLKN_adj[R1Index])
8987 			r1 = R1Index;
8988 		else if (pr1 == BLKN_adj[R1Index2])
8989 			r1 = R1Index2;
8990 
8991 		int R2Index  = __minmax(r1+width  , 0, frameWidth-1);
8992 		int R2Index2 = __minmax(r1+width+1, 0, frameWidth-1);
8993 
8994 		pr2 = __max(BLKN_adj[R2Index], BLKN_adj[R2Index2]);
8995 
8996 		newSP = BLKN_adj[bin] + pl1 + pl2 + pr1 + pr2;
8997 
8998 		if (newSP > candiValue)
8999 		{
9000 			candiValue = newSP;
9001 			candiPos = bin;
9002 		}
9003 	}
9004 	if (candiValue > ThValue)
9005 		return candiPos;
9006 	else
9007 		return 9999;//-1
9008 }
DBK_StPtRight(int width,MS_U8 * BLKN_adj,int rangeLeft,int rangeRight)9009 int DBK_StPtRight( int width, MS_U8 *BLKN_adj, int rangeLeft, int rangeRight) //right to left
9010 {
9011 	int newSP=0;
9012 	int candiValue = 0;
9013 	int candiPos = -1;
9014 	int ThValue = 2;
9015 	int bin=0;
9016 	int pl2=0, pl1=0, pr1=0, pr2=0;
9017 	int l1=0, r1=0;
9018 	for(bin = rangeRight-1; bin >= rangeLeft; bin--)
9019 	{
9020 		int L1Index  = __minmax(bin-width  , 0, frameWidth-1);
9021 		int L1Index2 = __minmax(bin-width-1, 0, frameWidth-1);
9022 		pl1 = __max(BLKN_adj[L1Index], BLKN_adj[L1Index2]);
9023 
9024 		if (pl1 == BLKN_adj[L1Index])
9025 			l1 = L1Index;
9026 		else if (pl1 == BLKN_adj[L1Index2])
9027 			l1 = L1Index2;
9028 
9029 		int L2Index  = __minmax(l1 -width  , 0, frameWidth-1);
9030 		int L2Index2 = __minmax(l1 -width-1, 0, frameWidth-1);
9031 		pl2 = __max(BLKN_adj[L2Index], BLKN_adj[L2Index2]);
9032 
9033 		int R1Index  = __minmax(bin+width  , 0, frameWidth-1);
9034 		int R1Index2 = __minmax(bin+width+1, 0, frameWidth-1);
9035 		pr1 = __max(BLKN_adj[R1Index], BLKN_adj[R1Index2]);
9036 
9037 		if (pr1 == BLKN_adj[R1Index])
9038 			r1 = R1Index;
9039 		else if (pr1 == BLKN_adj[R1Index2])
9040 			r1 = R1Index2;
9041 
9042 		int R2Index  = __minmax(r1+width  , 0, frameWidth-1);
9043 		int R2Index2 = __minmax(r1+width+1, 0, frameWidth-1);
9044 		pr2 = __max(BLKN_adj[R2Index], BLKN_adj[R2Index2]);
9045 
9046 		newSP = BLKN_adj[bin] + pl1 + pl2 + pr1 + pr2;
9047 
9048 		if (newSP > candiValue)
9049 		{
9050 			candiValue = newSP;
9051 			candiPos = bin;
9052 		}
9053 	}
9054 	if (candiValue > ThValue)
9055 		return candiPos;
9056 	else
9057 		return 9999;//-1
9058 }
9059 
DBK_WidthPartHW(void * pInstance,int * WidthDiffHW,int * avg,MS_U8 u8SD2HDValue)9060 int DBK_WidthPartHW(void *pInstance,int *WidthDiffHW, int* avg, MS_U8 u8SD2HDValue)
9061 {
9062 	int idx;
9063 	int maxWidthDiff  = 0;
9064 	int minWidthDiff  = 0x7FFFFFFF;
9065 	int min2WidthDiff = 0x7FFFFFFF;
9066 	int min3WidthDiff = 0x7FFFFFFF;
9067 	int min4WidthDiff = 0x7FFFFFFF;
9068 	int minIdx = -1, min2Idx = -1, min3Idx = -1, min4Idx = -1;// maxIdx = -1;
9069 
9070 	int DiffThrd = 2048;
9071 
9072 	WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_40_L,0xFFFF) ; // width 4
9073 	WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_41_L,0xFFFF) ; // width 5
9074 	WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_42_L,0xFFFF) ; // width 6
9075 	WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_43_L,0xFFFF) ; // width 7
9076 	WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_44_L,0xFFFF) ; // width 8
9077 	WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_45_L,0xFFFF) ; // width 9
9078 	WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_46_L,0xFFFF) ; // width 10
9079 	WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_47_L,0xFFFF) ; // width 11
9080 	WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_48_L,0xFFFF) ; // width 12
9081 	WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_49_L,0xFFFF) ; // width 13
9082 	WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4A_L,0xFFFF) ; // width 14
9083 	WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4B_L,0xFFFF) ; // width 15
9084 	WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4C_L,0xFFFF) ; // width 16
9085 	WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4D_L,0xFFFF) ; // width 17
9086 	WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4E_L,0xFFFF) ; // width 18
9087 	WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4F_L,0xFFFF) ; // width 19
9088 	WidthDiffHW[16] = MApi_XC_R2BYTEMSK(REG_SC_BK60_50_L,0xFFFF) ; // width 20
9089 	WidthDiffHW[17] = MApi_XC_R2BYTEMSK(REG_SC_BK60_51_L,0xFFFF) ; // width 21
9090 	WidthDiffHW[18] = MApi_XC_R2BYTEMSK(REG_SC_BK60_52_L,0xFFFF) ; // width 22
9091 	WidthDiffHW[19] = MApi_XC_R2BYTEMSK(REG_SC_BK60_53_L,0xFFFF) ; // width 23
9092 	WidthDiffHW[20] = MApi_XC_R2BYTEMSK(REG_SC_BK60_54_L,0xFFFF) ; // width 24
9093 	WidthDiffHW[21] = MApi_XC_R2BYTEMSK(REG_SC_BK60_55_L,0xFFFF) ; // width 25
9094 	WidthDiffHW[22] = MApi_XC_R2BYTEMSK(REG_SC_BK60_56_L,0xFFFF) ; // width 26
9095 	WidthDiffHW[23] = MApi_XC_R2BYTEMSK(REG_SC_BK60_57_L,0xFFFF) ; // width 27
9096 	WidthDiffHW[24] = MApi_XC_R2BYTEMSK(REG_SC_BK60_58_L,0xFFFF) ; // width 28
9097 	WidthDiffHW[25] = MApi_XC_R2BYTEMSK(REG_SC_BK60_59_L,0xFFFF) ; // width 29
9098 	WidthDiffHW[26] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5A_L,0xFFFF) ; // width 30
9099 	WidthDiffHW[27] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5B_L,0xFFFF) ; // width 31
9100 	WidthDiffHW[28] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5C_L,0xFFFF) ; // width 32
9101 	WidthDiffHW[29] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5D_L,0xFFFF) ; // width 33
9102 	WidthDiffHW[30] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5E_L,0xFFFF) ; // width 34
9103 	WidthDiffHW[31] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5F_L,0xFFFF) ; // width 35
9104 	for(idx = 1 ; idx < paraSize ; idx++)
9105 	{
9106 		if (WidthDiffHW[idx] > maxWidthDiff)
9107 		{
9108 			maxWidthDiff = WidthDiffHW[idx];
9109 //			maxIdx = idx;
9110 		}
9111 	}
9112 	for(idx = 1 ; idx < paraSize -1; idx+=2)
9113 	{
9114 		if ( (idx==3 || idx==11 || idx==19 || idx==27) && (WidthDiffHW[idx+1] - WidthDiffHW[idx ] <= DiffThrd) )
9115 		{
9116 			WidthDiffHW[idx+1]= __min(WidthDiffHW[idx ], WidthDiffHW[idx+1]);
9117 			WidthDiffHW[idx  ]= maxWidthDiff;
9118 		}
9119 		else if ( (idx==7) && ( (WidthDiffHW[idx  ] - WidthDiffHW[idx-1 ] <= DiffThrd) || (WidthDiffHW[idx  ] - WidthDiffHW[idx+1 ] <= DiffThrd)) )
9120 		{
9121 			WidthDiffHW[idx  ]= __min3(WidthDiffHW[idx ], WidthDiffHW[idx-1], WidthDiffHW[idx+1]);
9122 			WidthDiffHW[idx-1]= maxWidthDiff;
9123 			WidthDiffHW[idx+1]= maxWidthDiff;
9124 		}
9125 	}
9126 	for(idx = 1 ; idx < paraSize ; idx++)
9127 	{
9128 		(*avg) += WidthDiffHW[idx];
9129 
9130 		if (WidthDiffHW[idx] < minWidthDiff)
9131 		{
9132 			min4WidthDiff = min3WidthDiff;
9133 			min4Idx = min3Idx;
9134 			min3WidthDiff = min2WidthDiff;
9135 			min3Idx = min2Idx;
9136 			min2WidthDiff = minWidthDiff;
9137 			min2Idx = minIdx;
9138 
9139 			minWidthDiff = WidthDiffHW[idx];
9140 			minIdx = idx;
9141 		}
9142 		else if (WidthDiffHW[idx] < min2WidthDiff)
9143 		{
9144 			min4WidthDiff = min3WidthDiff;
9145 			min4Idx = min3Idx;
9146 			min3WidthDiff = min2WidthDiff;
9147 			min3Idx = min2Idx;
9148 
9149 			min2WidthDiff = WidthDiffHW[idx];
9150 			min2Idx = idx;
9151 		}
9152 		else if (WidthDiffHW[idx] < min3WidthDiff)
9153 		{
9154 			min4WidthDiff = min3WidthDiff;
9155 			min4Idx = min3Idx;
9156 
9157 			min3WidthDiff = WidthDiffHW[idx];
9158 			min3Idx = idx;
9159 		}
9160 		else if (WidthDiffHW[idx] < min4WidthDiff)
9161 		{
9162 			min4WidthDiff = WidthDiffHW[idx];
9163 			min4Idx = idx;
9164 		}
9165 	}
9166 	*avg = (*avg) / (paraSize-1);
9167 
9168 
9169 	if ( ((minIdx == 7) || (min2Idx == 7) || (min3Idx == 7) || (min4Idx == 7)) && ((minIdx == 28) || (min2Idx == 28) || (min3Idx == 28) || (min4Idx == 28)) && ( ((minIdx == 16) || (min2Idx == 16) || (min3Idx == 16) || (min4Idx == 16)) || ((minIdx == 17) || (min2Idx == 17) || (min3Idx == 17) || (min4Idx == 17)) ))
9170 	{
9171 		if (u8SD2HDValue==0)
9172 			return 7;
9173 	}
9174 	else if ( ((minIdx == 16 || min2Idx == 16 || min3Idx == 16) || (minIdx == 18 || min2Idx == 18 || min3Idx == 18) ) && (minIdx == 17 || min2Idx == 17 || min3Idx == 17)   )
9175 	{
9176 		if (u8SD2HDValue>=60)
9177 			return 17;
9178 	}
9179 
9180 
9181 	if (minIdx == 4 || min2Idx == 4 || min3Idx == 4 || min4Idx == 4)
9182 	{
9183 		return 4;
9184 	}
9185 	else if (minIdx == 12 || min2Idx == 12 || min3Idx == 12 || min4Idx == 12)
9186 	{
9187 		return 12;
9188 	}
9189 	else
9190 	{
9191 		return -1;
9192 	}
9193 }
9194 
DBK_WidthPartTop(void * pInstance,int * WidthDiffHW,int * MaxMinDiff,int * avg,MS_U8 u8SD2HDValue)9195 int DBK_WidthPartTop(void * pInstance,int *WidthDiffHW, int* MaxMinDiff, int* avg, MS_U8 u8SD2HDValue)
9196 {
9197 	int bin;
9198 	int minValue = 0x7FFFFFFF;
9199 	int maxValue = 0;
9200 	int normFac, minIndex;
9201 
9202 	minIndex = DBK_WidthPartHW(pInstance,WidthDiffHW, avg, u8SD2HDValue);
9203 	if (minIndex == -1)
9204 	{
9205 		for (bin =0; bin<paraSize;bin++)
9206 		{
9207 			if (WidthDiffHW[bin] > maxValue )
9208 			{
9209 				maxValue = WidthDiffHW[bin];
9210 			}
9211 			if (WidthDiffHW[bin] < minValue )
9212 			{
9213 				minValue = WidthDiffHW[bin];
9214 			}
9215 		}
9216 
9217 		*MaxMinDiff = maxValue - minValue;
9218 		normFac = normFactorWidth(*MaxMinDiff);
9219 		for (bin=0;bin<paraSize;bin++)
9220 		{
9221 			WidthDiffHW[bin] = (WidthDiffHW[bin] - minValue) >> normFac;
9222 		}
9223 		*avg = (*avg-minValue) >> normFac;
9224 		*MaxMinDiff = (*MaxMinDiff) >>normFac;
9225 
9226 		return -1;
9227 	}
9228 	else
9229 		return minIndex;
9230 }
DBK_VerifyWidthMark(MS_U8 * BLKN_adj,int width,int iniIndex,MS_U8 markDefValue)9231 int DBK_VerifyWidthMark( MS_U8 *BLKN_adj, int width, int iniIndex, MS_U8 markDefValue)
9232 {
9233 
9234 	int restart=0;
9235 
9236 	int misscnt = 0;
9237 	int ThValue = 2; //threshold value for BLKN_adj
9238 	int hitrate = 0;
9239 	int cnt = 0;
9240 	int bin, CurH, sp;
9241 	MS_BOOL hit;
9242 	int n8[50];
9243 	int maxOri, maxOriInd, offset;
9244 	int maxLocal, sndLocal, maxIndex, sndIndex;
9245 	int pos_fac, range, dummy, candiSP;
9246 	offset = 4;//8;
9247 	if (width >= 16)
9248 		offset = 8;//16;
9249 
9250 	misscnt = 0;
9251 	//initialize start points
9252 	sp = iniIndex;
9253 	range = (width*2+4)>>3;
9254 	dummy = ThValue *(width + offset)/offset;
9255 
9256 	hitrate++;
9257 	cnt++;
9258 	//right hand side
9259 	for (CurH=sp+width; CurH<frameWidth*3/4-(width+1)/2; )
9260 	{
9261 		maxOri = 0;
9262 		maxOriInd = -1;
9263 		maxLocal = 0;
9264 		sndLocal = 0;
9265 		maxIndex = 0;
9266 		sndIndex = 0;
9267 		for (bin=0; bin<width;bin++)
9268 		{
9269 			int curIndex = __minmax(CurH+(bin-(width-1)/2), 0, frameWidth-1);
9270 			if (BLKN_adj[curIndex]-markDefValue > maxOri)
9271 			{
9272 				maxOri = BLKN_adj[curIndex]-markDefValue;
9273 				maxOriInd = bin;
9274 			}
9275 
9276 			if ( (bin<=(width/4)) || (bin>=(width*3/4)) )
9277 				n8[bin] =0;
9278 			else
9279 			{
9280 				pos_fac = (width+1)/2 - abs(bin-(width-1)/2) + offset; //16 = offset
9281 				n8[bin]= ( (BLKN_adj[curIndex]-markDefValue) * pos_fac + (offset/2) )/offset;
9282 				if ( n8[bin] > maxLocal)
9283 				{
9284 					//test
9285 					sndLocal = maxLocal;
9286 					sndIndex = maxIndex;
9287 
9288 					maxLocal = n8[bin];
9289 					maxIndex = bin;
9290 				}
9291 				//test
9292 				else if (n8[bin] > sndLocal)
9293 				{
9294 					sndLocal = n8[bin];
9295 					sndIndex = bin;
9296 				}
9297 			}
9298 		}
9299 
9300 
9301 		//test
9302 		if( abs(sndIndex-maxIndex) > range)
9303 		{
9304 			sndLocal = 0;
9305 			sndIndex = 0;
9306 		}
9307 
9308 		int curIndex = __minmax(CurH+(maxIndex-(width-1)/2), 0, frameWidth-1);
9309 		hit = ( maxOri <= BLKN_adj[curIndex]-markDefValue )|| ( (maxOriInd>=__min(maxIndex,maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex,maxIndex+sndIndex) ) );
9310 
9311 		if ( (!hit) || (maxLocal <= dummy) )
9312 		{
9313 			misscnt++;
9314 		}
9315 
9316 		if ( (maxLocal > dummy) && (misscnt <= 2) )
9317 		{
9318 			CurH = CurH+(maxIndex-(width-1)/2); //adjust to max position
9319 			if (hit)
9320 			{
9321 				misscnt=0;
9322 			}
9323 			curIndex = __minmax(CurH+sndIndex, 0, frameWidth-1);
9324 			if (BLKN_adj[curIndex]-markDefValue > ThValue ) // fill the gap between top 2 strength within range 4
9325 			{
9326 				CurH = CurH + ((sndIndex)/2); // move to center
9327 			}
9328 			CurH += width;
9329 			hitrate++;
9330 			cnt++;
9331 		}
9332 		else if (misscnt > 2)
9333 		{
9334 			if (misscnt>5)
9335 			{
9336 				return 0;
9337 			}
9338 
9339 			candiSP = DBK_StPtLeft( width, BLKN_adj, CurH, __min(CurH+40, frameWidth*3/4));
9340 			if (candiSP != 9999)
9341 			{
9342 				restart++;
9343 				misscnt = 0;
9344 				CurH = candiSP;
9345 			}
9346 			else
9347 			{
9348 				CurH += 40;
9349 			}
9350 			cnt++;
9351 		}
9352 		else
9353 		{
9354 			CurH += width;
9355 			cnt++;
9356 		}
9357 	}
9358 	misscnt=0;
9359 	//left hand side
9360 	for (CurH=sp-width; CurH >= frameWidth*1/4+(width+1)/2;)
9361 	{
9362 		maxOri = 0;
9363 		maxOriInd = -1;
9364 		maxLocal = 0;
9365 		maxIndex = 0;
9366 		sndLocal = 0;
9367 		sndIndex = 0;
9368 		for (bin=0; bin<width;bin++)
9369 		{
9370 			int curIndex = __minmax(CurH+(bin-(width+1)/2), 0, frameWidth-1);
9371 			if (BLKN_adj[curIndex]-markDefValue > maxOri)
9372 			{
9373 				maxOri = BLKN_adj[curIndex]-markDefValue;
9374 				maxOriInd = bin;
9375 			}
9376 			if ( (bin<=width/4) || (bin>=width*3/4) )
9377 				n8[bin] =0;
9378 			else
9379 			{
9380 				pos_fac = (width+1)/2 - abs(bin-(width+1)/2) + offset; //16 = offset
9381 				n8[bin]= ((BLKN_adj[curIndex]-markDefValue) * pos_fac + (offset/2) )/offset;
9382 				if (n8[bin] > maxLocal)
9383 				{
9384 					//test
9385 					sndLocal = maxLocal;
9386 					sndIndex = maxIndex;
9387 
9388 					maxLocal = n8[bin];
9389 					maxIndex = bin;
9390 				}
9391 				//test
9392 				else if (n8[bin] > sndLocal)
9393 				{
9394 					sndLocal = n8[bin];
9395 					sndIndex = bin;
9396 				}
9397 			}
9398 		}
9399 		//test
9400 		if( abs(sndIndex-maxIndex) > range)
9401 		{
9402 			sndLocal = 0;
9403 			sndIndex = 0;
9404 		}
9405 		//if maximum inside range
9406 		int curIndex = __minmax(CurH+(maxIndex-(width+1)/2), 0, frameWidth-1);
9407 		hit = ( maxOri <= BLKN_adj[curIndex]-markDefValue ) || ( (maxOriInd>=__min(maxIndex,maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex,maxIndex+sndIndex) ) );
9408 		if ( (!hit) || (maxLocal <= dummy) )
9409 		{
9410 			misscnt++;
9411 		}
9412 		if ((maxLocal > dummy) && (misscnt <= 2) )
9413 		{
9414 			CurH = CurH+(maxIndex-(width+1)/2); //adjust to max position
9415 			if (hit)
9416 			{
9417 				misscnt=0;
9418 			}
9419 			curIndex = __minmax(CurH+sndIndex, 0, frameWidth-1);
9420 			if (BLKN_adj[curIndex]-markDefValue > ThValue )
9421 			{
9422 				CurH = CurH + ((sndIndex)/2); // move to center
9423 			}
9424 			CurH -= width;
9425 			hitrate++;
9426 			cnt++;
9427 		}
9428 		else if (misscnt > 2)
9429 		{
9430 			if (misscnt > 5)
9431 			{
9432 				return 0;
9433 			}
9434 			candiSP = DBK_StPtRight(width, BLKN_adj, __max((CurH-40), frameWidth*1/4), CurH+1);
9435 			if (candiSP != 9999)
9436 			{
9437 				restart++;
9438 				misscnt = 0;
9439 				CurH = candiSP;
9440 			}
9441 			else
9442 			{
9443 				CurH -= 40;
9444 			}
9445 			cnt++;
9446 		}
9447 		else
9448 		{
9449 			CurH -= width;
9450 			cnt++;
9451 		}
9452 	}
9453 	if (cnt > 0)
9454 		return ( (hitrate*256/cnt) - 8*restart);
9455 	else
9456 		return 0;
9457 }
9458 
DBK_VerifyWidthPart(int * kk2,MS_U8 * BLKN_adj,int partIndex,int * maxHitRate,int * minIndex,int * cnt,int sp,MS_U8 u8SD2HDValue,MS_U8 markDefValue)9459 void DBK_VerifyWidthPart(  int *kk2, MS_U8* BLKN_adj, int partIndex, int* maxHitRate, int* minIndex, int* cnt, int sp, MS_U8 u8SD2HDValue, MS_U8 markDefValue)
9460 {
9461 
9462 
9463 	int hitrate = 0;
9464 	int width, range, bin; //w2, X2, sp
9465 	int X2term;
9466 	int minWidth = 0;
9467 
9468 	if (kk2[partIndex] == 1)
9469 	{
9470 		width = paraWidth[partIndex];
9471 		if (*minIndex >= 0)
9472 		{
9473 			minWidth = paraWidth[*minIndex];
9474 		}
9475 		hitrate = DBK_VerifyWidthMark( BLKN_adj, width, sp, markDefValue); //replace with mark function
9476 		//test for IIR stability
9477 
9478 		if (width == WidthIIR)
9479 			hitrate = hitrate+16;
9480 
9481 		if ( (u8SD2HDValue>=60) && (width==21) &&(minWidth==11) )
9482 			hitrate = hitrate+16;
9483 
9484 		if (hitrate < hitrate_threshold)
9485 		{
9486 			kk2[partIndex] = 0;
9487 		}
9488 		else if (hitrate > *maxHitRate )
9489 		{
9490 			*maxHitRate = hitrate;
9491 			*minIndex = partIndex;
9492 			*cnt = 1;
9493 		}
9494 		else if (((*maxHitRate-hitrate) <= (hitRateDiffThr*3))
9495 			&& (((width == 8) && ((minWidth%4) == 0))||(( (width == 11) && (minWidth == 32)))))
9496 		{
9497 			if ( (minWidth*2+3)/6 == width )
9498 			{
9499 				X2term = -1;
9500 				for (bin =0; bin<paraSize;bin++)
9501 				{
9502 					if (paraWidth[bin] == (width+1)/2 )
9503 						X2term = bin;
9504 
9505 				}
9506 
9507 				if ((X2term>=0) && (kk2[X2term] == 1 ))
9508 				{
9509 					kk2[X2term] = 0;
9510 					*cnt = *cnt-1;
9511 				}
9512 			}
9513 
9514 			*minIndex = partIndex;
9515 
9516 		}
9517 		else if ( (*maxHitRate-hitrate) <= hitRateDiffThr)
9518 		{
9519 			range = (width*2+4)>>3;
9520 
9521 			if ( abs(minWidth - width) <= range )
9522 			{
9523 				if ( (width == 21) || (width == 8) || (width == 11)) //priorty of common width
9524 				{
9525 					*minIndex = partIndex;
9526 				}
9527 				else if ( ( minWidth== 21) || (minWidth == 8) || (minWidth == 11)) //priorty of common width
9528 				{
9529 					kk2[partIndex] = 0;
9530 				}
9531 				else //add for test
9532 					*cnt = *cnt+1;
9533 			}
9534 			else
9535 			{
9536 				(*cnt)++;
9537 			}
9538 		}
9539 	}
9540 }
9541 
DBK_ComputeWidthPart(int * WidthDiffHW,int * WidthCandidate,int avg)9542 int DBK_ComputeWidthPart(  int *WidthDiffHW, int* WidthCandidate, int avg)
9543 {
9544 	int WTh = avg;
9545 	int minIndex=0;
9546 	int NumW=0;
9547 	int bin;
9548 
9549 	MS_BOOL if8 = 0, if11 = 0, if21 = 0, if32 = 0;
9550 
9551 	for (bin=0;bin<paraSize;bin++)
9552 	{
9553 		if (WidthDiffHW[bin]<= WTh)
9554 			WidthCandidate[bin] = 1;
9555 		else
9556 			WidthCandidate[bin] = 0;
9557 	}
9558 
9559 	if (1)
9560 	{
9561 		if (WidthCandidate[4] == 1 ) //8
9562 		{
9563 			if (WidthCandidate[3] == 1) //7
9564 				WidthCandidate[3]  = 0;
9565 			if (WidthCandidate[11] == 1) // 15
9566 				WidthCandidate[11] = 0;
9567 			if (WidthCandidate[12] == 1) // 16
9568 				WidthCandidate[12] = 0;
9569 			if (WidthCandidate[19] == 1) // 23
9570 				WidthCandidate[19] = 0;
9571 			if (WidthCandidate[20] == 1) // 24
9572 				WidthCandidate[20] = 0;
9573 			if8 = 1;
9574 		}
9575 		if (WidthCandidate[7] == 1 ) //11
9576 		{
9577 			if (WidthCandidate[6] == 1) //10
9578 				WidthCandidate[6]  = 0;
9579 			if (WidthCandidate[8] == 1) //12
9580 				WidthCandidate[8]  = 0;
9581 
9582 			if11 = 1;
9583 		}
9584 		if ( ( WidthCandidate[16] == 1 ) || ( WidthCandidate[17] == 1 ) ||( WidthCandidate[18] == 1 ) ) //20 21 22
9585 		{
9586 			WidthCandidate[16] = 0;
9587 			WidthCandidate[17] = 1;
9588 			WidthCandidate[18] = 0;
9589 			if21 = 1;
9590 		}
9591 		if ( WidthCandidate[27] == 1 && WidthCandidate[28] == 1)
9592 			if32 = 1;
9593 		if (if11 && if21 && if32) //11/21/32 all true -> source = 11 ->delete 21
9594 		{
9595 			WidthCandidate[17] = 0;
9596 		}
9597 		if (if8 || if11 || if21)
9598 		{
9599 			if (WidthCandidate[27] == 1) // 31
9600 				WidthCandidate[27] = 0;
9601 			if (WidthCandidate[28] == 1) // 32
9602 				WidthCandidate[28] = 0;
9603 		}
9604 	}
9605 	for (bin=0;bin<paraSize;bin++) // count number of frequencies
9606 	{
9607 		if (WidthCandidate[bin] == 1)
9608 		{
9609 			minIndex = bin;
9610 			NumW++;
9611 		}
9612 	}
9613 
9614 	if (NumW == 1)
9615 	{
9616 		return minIndex;
9617 	}
9618 	else
9619 	{
9620 		return -1;
9621 	}
9622 }
9623 
DBK_BlocknessAdjPart(long * histogram,MS_U8 * BLKN_adj,int * zeroCnt,int partIndex,MS_U8 markValue,MS_U8 markDefValue,int ADJTIMESLOT)9624 int DBK_BlocknessAdjPart(long* histogram, MS_U8 *BLKN_adj, int* zeroCnt, int partIndex, MS_U8 markValue, MS_U8 markDefValue, int ADJTIMESLOT)
9625 {
9626 
9627 	//int frameUnit = __max(frameWidth*frameHeight, 1);
9628 	//int avgBLKN = 0;
9629 	//int normFac = 0;
9630 	//const int localWidth = 10;
9631 	//int ThrHei = 2*frameHeight;
9632 	int valid = 0;
9633 	//int bin,
9634        int CurH;
9635 
9636 	//MS_U8 markNorm = markValue;
9637 	//int movingSum = 0;
9638 	//int blkness;
9639 
9640 	int IniPos, EndPos;
9641 
9642     if ( (partIndex < ADJTIMESLOT) && ADJTIMESLOT>0)
9643 	{
9644 		IniPos = frameWidth*(partIndex)/ADJTIMESLOT;
9645 		EndPos = frameWidth*(partIndex+1)/ADJTIMESLOT;
9646 	}
9647 	else
9648 	{
9649 		IniPos = 0;
9650 		EndPos = 0;
9651 	}
9652 	//if ( 0 )
9653 	//{
9654 	//	markNorm = markValue;
9655 	//}
9656 
9657 
9658 	for(CurH = IniPos; CurH < EndPos; CurH++)
9659 	{
9660 		//avgBLKN = 0;
9661 		//normFac = 0;
9662 		int L1 = __minmax(CurH-1, 0, frameWidth-1);
9663 		int L2 = __minmax(CurH-2, 0, frameWidth-1);
9664 		int R1 = __minmax(CurH+1, 0, frameWidth-1);
9665 		int R2 = __minmax(CurH+2, 0, frameWidth-1);
9666 		long maxN = __max(__max(histogram[L1], histogram[L2]), __max(histogram[R1], histogram[R2]));
9667 
9668 		if (histogram[CurH] == 0)
9669 				(*zeroCnt)++;
9670 		if ( __max(histogram[CurH], maxN) == histogram[CurH])
9671 				{
9672 			BLKN_adj[CurH] = markValue;
9673 			BLKN_adj[L1] = markValue;
9674 			BLKN_adj[R1] = markValue;
9675 
9676 			CurH += 1;
9677 			if (histogram[CurH] == 0)
9678 				(*zeroCnt)++;
9679 			}
9680 			else
9681 			BLKN_adj[CurH] = markDefValue;
9682 
9683 
9684 
9685 		if (BLKN_adj[CurH] > markDefValue)
9686 			valid++;
9687 	}
9688 
9689 	return valid;
9690 }
9691 
DBK_bypassmark(MS_U8 * BLKN_mark,MS_U8 * BLKN_adj)9692 void DBK_bypassmark(MS_U8* BLKN_mark, MS_U8 *BLKN_adj)
9693 {
9694 	int bin;
9695 	for ( bin=0; bin<frameWidth;bin++ )
9696 	{
9697 		BLKN_mark[bin] = BLKN_adj[bin];
9698 	}
9699 }
DBK_Mark(MS_U8 * BLKN_mark,MS_U8 * BLKN_adj,int width,int iniIndex,MS_U8 markDefValue)9700 int DBK_Mark(MS_U8* BLKN_mark, MS_U8 *BLKN_adj, int width, int iniIndex, MS_U8 markDefValue)//, MS_BOOL *BLKN_cpx)
9701 {
9702 	int restart=0;
9703 	int misscnt = 0;
9704 	int ThValue = 0;
9705 	int hitrate = 0;
9706 	int bin, CurH;
9707 	int candiSP, sp;
9708 	int cnt = 0;
9709 	MS_BOOL hit;
9710 	int offset;
9711 	int n8[50];
9712 	int maxOri, maxOriInd, pos_fac, range, dummy, r;
9713 	int maxLocal = 0;
9714 	int sndLocal = 0;
9715 	int maxIndex = 0;
9716 	int sndIndex = 0;
9717 	misscnt = 0;
9718 	//initialize start points
9719 	sp = iniIndex;
9720 	offset = 4;//8;
9721 	if (width >= 16)
9722 		offset = 8;//16;
9723 	range = (width*2+4)>>3;
9724 	r = (width+4)/8;
9725 	dummy = ThValue *(width + offset)/offset;
9726 
9727 	//sp
9728 
9729     sp=__minmax(sp, 1, frameWidth-2);
9730 	BLKN_mark[sp] = BLKN_adj[sp];
9731 
9732     if (sp>=1)
9733 	BLKN_mark[sp-1] = BLKN_adj[sp-1];
9734 
9735     if (sp<frameWidth-1)
9736 	BLKN_mark[sp+1] = BLKN_adj[sp+1];
9737 
9738 	hitrate++;
9739 	cnt++;
9740 
9741 	//right hand side
9742 	for ( CurH=sp+width; CurH<frameWidth-(width-1)/2; )
9743 	{
9744 		maxOri = 0;
9745 		maxOriInd = -1;
9746 		maxLocal = 0;
9747 		sndLocal = 0;
9748 		maxIndex = -1;
9749 		sndIndex = 0;
9750 		for (bin=0; bin<width;bin++)
9751 		{
9752 			int curIndex = __minmax(CurH+(bin-(width-1)/2), 0, frameWidth-1);
9753 			if( (BLKN_adj[curIndex]-markDefValue) > maxOri)
9754 			{
9755 				maxOri = BLKN_adj[curIndex]-markDefValue;
9756 				maxOriInd = bin;
9757 			}
9758 			if ( (bin<=width/4) || (bin>=width*3/4) )
9759 				n8[bin] =0;
9760 			else
9761 			{
9762 				pos_fac = (width-1)/2 - abs(bin-(width-1)/2) + offset; //16 = offset
9763 				n8[bin]= ((BLKN_adj[curIndex]-markDefValue) * pos_fac + (offset/2) )/offset;
9764 				if ( n8[bin] > maxLocal)
9765 				{
9766 					maxLocal = n8[bin];
9767 					maxIndex = bin;
9768 				}
9769 			}
9770 		}
9771 		int curIndex;
9772 		if (maxIndex!=-1)
9773 		{
9774 		for (bin=(0-range); bin<=range; bin++)
9775 		{
9776 			if( (bin!=0 ) && ((maxIndex+bin) >=0) && ((maxIndex+bin) < width) )
9777 			{
9778 				if (n8[maxIndex+bin] > sndLocal)
9779 				{
9780 					sndLocal = n8[maxIndex+bin];
9781 					sndIndex = bin; //related to maxIndex
9782 				}
9783 			}
9784 		}
9785 		curIndex = __minmax(CurH+(maxIndex-(width-1)/2), 0, frameWidth-1);
9786 		hit = ( maxOri <= BLKN_adj[curIndex]-markDefValue )|| ( (maxOriInd>=__min(maxIndex,maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex,maxIndex+sndIndex) ) );
9787 		}
9788 		else
9789 		{
9790 			curIndex = __minmax(CurH, 0, frameWidth-1);
9791 			hit = 0;
9792 		}
9793 
9794 		if ( (!hit) || (maxLocal <= dummy) )
9795 		{
9796 			misscnt++;
9797 		}
9798 
9799 		if ((maxLocal > dummy) && (misscnt <= 2))
9800 		{
9801 			CurH = CurH+(maxIndex-(width-1)/2); //adjust to max position
9802 
9803 			if (hit)
9804 			{
9805 
9806 				misscnt=0;
9807 				BLKN_mark[CurH] = BLKN_adj[CurH];
9808 			}
9809 			else
9810 			{
9811 				BLKN_mark[CurH] = BLKN_adj[CurH]/2;
9812 			}
9813 			curIndex = __minmax(CurH+sndIndex, 0, frameWidth-1);
9814 			if (BLKN_adj[curIndex]-markDefValue > ThValue ) // fill the gap between top 2 strength within range 4
9815 			{
9816 				if ( (sndIndex <= range-2 ) && (sndIndex > 0) )
9817 				{
9818 					if ( (CurH-1) >=0 )
9819 						BLKN_mark[CurH-1] = BLKN_adj[CurH-1];
9820 					if ( (CurH+sndIndex+1) < frameWidth)
9821 						BLKN_mark[CurH+sndIndex+1] = BLKN_adj[CurH+sndIndex+1];
9822 				}
9823 				else if ( (sndIndex <0) && (sndIndex >= ((-1)*(range-2)) ) )
9824 				{
9825 					if ( (CurH+1) < frameWidth)
9826 						BLKN_mark[CurH+1] = BLKN_adj[CurH+1];
9827 					if ( (CurH+sndIndex-1) >= 0 )
9828 						BLKN_mark[CurH+sndIndex-1] = BLKN_adj[CurH+sndIndex-1];
9829 				}
9830 				for (bin=__min(0, sndIndex); bin<=__max(0, sndIndex);bin++)
9831 				{
9832 					if ((CurH+bin >= 0) && (CurH+bin <frameWidth))
9833 						BLKN_mark[CurH+bin] = BLKN_adj[CurH+bin];
9834 				}
9835 				CurH = CurH + ((sndIndex)/2); // move to center
9836 			}
9837 			CurH += width;
9838 			hitrate++;
9839 			cnt++;
9840 		}
9841 		else if (misscnt > 2)
9842 		{
9843 			candiSP = DBK_StPtLeft( width, (MS_U8*)BLKN_adj, CurH, __min(CurH+40, frameWidth));
9844 			if (candiSP != 9999)
9845 			{
9846 				restart++;
9847 				if (restart > 5)
9848 					return 0;
9849 				if ( (abs(candiSP - CurH)%width) != 0 )
9850 				{
9851 					for (bin=-4;bin<=4;bin++)
9852 					{
9853 						if ( ((CurH+bin) <frameWidth) && (CurH+bin >=0) && (BLKN_mark[CurH+bin]>markDefValue) )
9854 							BLKN_mark[CurH+bin] = markDefValue;
9855 						if ( ((CurH-width+bin) <frameWidth) && ((CurH-width+bin) >=0) && (BLKN_mark[CurH-width+bin]>markDefValue) )
9856 							BLKN_mark[CurH-width+bin] = markDefValue;
9857 						if ( ((CurH-width*2+bin) <frameWidth) && ((CurH-width*2+bin) >=0) && (BLKN_mark[CurH-width*2+bin]>markDefValue) )
9858 							BLKN_mark[CurH-width*2+bin] = markDefValue;
9859 					}
9860 				}
9861 
9862 				misscnt = 0;
9863 				CurH = candiSP;
9864 
9865 
9866 				for (bin=-r;bin<=r;bin++)
9867 				{
9868 					if (((CurH+bin)>=0) && ((CurH+bin) <frameWidth) )
9869 						BLKN_mark[CurH+bin] = BLKN_adj[CurH+bin];
9870 					if (((CurH-width+bin)>=0) && ((CurH-width+bin) <frameWidth) )
9871 						BLKN_mark[CurH-width+bin] = BLKN_adj[CurH-width+bin];
9872 					if (((CurH-width*2+bin)>=0) && ((CurH-width*2+bin) <frameWidth) )
9873 						BLKN_mark[CurH-width*2+bin] = BLKN_adj[CurH-width*2+bin];
9874 				}
9875 
9876 				CurH += width;
9877 			}
9878 			else
9879 			{
9880 				for (bin = CurH; bin< __min((CurH+40), frameWidth); bin= bin+width )
9881 				{
9882 					if (bin-width >= 0 )
9883 					BLKN_mark[bin] = (BLKN_adj[bin]+BLKN_adj[bin-width])/2;
9884 				}
9885 				CurH += 40;
9886 
9887 			}
9888 			cnt++;
9889 		}
9890 		else
9891 		{
9892 			BLKN_mark[CurH] = __max(BLKN_adj[CurH]/2, markDefValue);
9893 			CurH += width;
9894 			cnt++;
9895 		}
9896 	}
9897 
9898 	misscnt=0;
9899 	//left hand side
9900 	for (CurH=sp-width; CurH >= (width)/2;)
9901 	{
9902 		maxOri = 0;
9903 		maxOriInd = -1;
9904 		maxLocal = 0;
9905 		sndLocal = 0;
9906 		maxIndex = -1;
9907 		sndIndex = 0;
9908 		for (bin=0; bin<width;bin++)
9909 		{
9910 			int curIndex = __minmax(CurH+(bin-(width)/2), 0, frameWidth-1);
9911 			if (BLKN_adj[curIndex]-markDefValue > maxOri)
9912 			{
9913 				maxOri = BLKN_adj[curIndex]-markDefValue;
9914 				maxOriInd = bin;
9915 			}
9916 			if ( (bin<=(width/4)) || (bin>=(width*3/4)) )
9917 				n8[bin] =0;
9918 			else
9919 			{
9920 				pos_fac = (width)/2 - abs(bin-(width)/2) + offset; //16 = offset
9921 				n8[bin]= ((BLKN_adj[curIndex]-markDefValue) * pos_fac + (offset/2) )/offset;
9922 				if ( n8[bin] > maxLocal)
9923 				{
9924 					maxLocal = n8[bin];
9925 					maxIndex = bin;
9926 				}
9927 			}
9928 		}
9929 		int curIndex = 0;
9930 		if ( maxIndex != -1)
9931 		{
9932 		for (bin=(0-range); bin<=range; bin++)
9933 		{
9934 			if( (bin!=0) &&  ((maxIndex+bin) >=0) && ((maxIndex+bin) < width) )
9935 			{
9936 				if (n8[maxIndex+bin] > sndLocal)
9937 				{
9938 					sndLocal = n8[maxIndex+bin];
9939 					sndIndex = bin; //related to maxIndex
9940 				}
9941 			}
9942 		}
9943 		curIndex = __minmax(CurH+(maxIndex-(width+1)/2), 0, frameWidth-1);
9944 		hit = ( maxOri <= BLKN_adj[curIndex]-markDefValue ) || ( (maxOriInd>=__min(maxIndex,maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex,maxIndex+sndIndex) ) );
9945 		}
9946 		else
9947 		{
9948 		curIndex = __minmax(CurH, 0, frameWidth-1);
9949 		hit = 0;
9950 
9951 		}
9952 		if ( (!hit) || (maxLocal <= dummy) )
9953 		{
9954 
9955 			misscnt++;
9956 		}
9957 		if ((maxLocal > dummy) && (misscnt <= 2) )
9958 		{
9959 			CurH = CurH+(maxIndex-(width)/2); //adjust to max position
9960 
9961 			if (hit)
9962 			{
9963 
9964 				misscnt=0;
9965 				BLKN_mark[CurH] = BLKN_adj[CurH];
9966 			}
9967 			else
9968 			{
9969 				BLKN_mark[CurH] = __max(BLKN_adj[CurH]/2, markDefValue);
9970 			}
9971 			curIndex = __minmax(CurH+sndIndex, 0, frameWidth-1);
9972 			if (BLKN_adj[curIndex]-markDefValue > ThValue )// fill the gap between top 2 strength within range 4
9973 			{
9974 				if ( (sndIndex <=range-2) && (sndIndex > 0) )
9975 				{
9976 					if (CurH-1 >= 0)
9977 						BLKN_mark[CurH-1] = BLKN_adj[CurH-1];
9978 					if (CurH+sndIndex+1 < frameWidth)
9979 						BLKN_mark[CurH+sndIndex+1] = BLKN_adj[CurH+sndIndex+1];
9980 				}
9981 				else if ( (sndIndex <0) && (sndIndex >= (-1)*(range-2)) )
9982 				{
9983 					if (CurH+1 < frameWidth)
9984 						BLKN_mark[CurH+1] = BLKN_adj[CurH+1];
9985 					if (CurH+sndIndex-1 >= 0)
9986 						BLKN_mark[CurH+sndIndex-1] = BLKN_adj[CurH+sndIndex-1];
9987 				}
9988 				for (bin=__min(0, sndIndex); bin<=__max(0, sndIndex);bin++)
9989 				{
9990 					if ( ((CurH+bin) >= 0) && ((CurH+bin)<frameWidth) )
9991 						BLKN_mark[CurH+bin] = BLKN_adj[CurH+bin];
9992 				}
9993 				CurH = CurH + ((sndIndex)/2); // move to center
9994 			}
9995 			CurH -= width;
9996 			hitrate++;
9997 			cnt++;
9998 		}
9999 		else if (misscnt > 2)
10000 		{
10001 			candiSP = DBK_StPtLeft(width, BLKN_adj, __max((CurH-40), 0), CurH+1);
10002 			if (candiSP != 9999)
10003 			{
10004 				restart++;
10005 				if (restart > 5)
10006 					return 0;
10007 				if ( (abs(candiSP - CurH)%width) != 0 )
10008 				{
10009 					for (bin=-4;bin<=4;bin++)
10010 					{
10011 						if ( ((CurH+bin) >=0) && ((CurH+bin) <  frameWidth) && (BLKN_mark[CurH+bin] > markDefValue) )
10012 							BLKN_mark[CurH+bin] = markDefValue;
10013 						if ( ((CurH+bin+width) >=0) && ((CurH+width+bin) <  frameWidth) && (BLKN_mark[CurH+width+bin] > markDefValue))
10014 							BLKN_mark[CurH+width+bin] = markDefValue;
10015 						if ( ((CurH+bin+width*2) >=0) && ((CurH+width*2+bin) <  frameWidth) && (BLKN_mark[CurH+width*2+bin] > markDefValue))
10016 							BLKN_mark[CurH+width*2+bin] = markDefValue;
10017 					}
10018 				}
10019 
10020 				misscnt = 0;
10021 				CurH = candiSP;
10022 
10023 
10024 				for (bin=-r;bin<=r;bin++)
10025 				{
10026 					if ((CurH+bin >= 0) && (CurH+bin <frameWidth) )
10027 						BLKN_mark[CurH+bin] = BLKN_adj[CurH+bin];
10028 					if (((CurH+width+bin) >= 0) && (CurH+width+bin <frameWidth) )
10029 						BLKN_mark[CurH+width+bin] = BLKN_adj[CurH+width+bin];
10030 					if (((CurH+width*2+bin) >= 0) && ((CurH+width*2+bin) <frameWidth) )
10031 						BLKN_mark[CurH+width*2+bin] = BLKN_adj[CurH+width*2+bin];
10032 				}
10033 				CurH -= width;
10034 			}
10035 			else
10036 			{
10037 				for (bin = CurH; bin > __max((CurH-40), 0); bin= bin-width )
10038 				{
10039 					if (bin+width < frameWidth)
10040 					BLKN_mark[bin] = (BLKN_adj[bin]+BLKN_adj[bin+width])/2;
10041 				}
10042 				CurH -= 40;
10043 			}
10044 			cnt++;
10045 		}
10046 		else
10047 		{
10048 			BLKN_mark[CurH] = __max(BLKN_adj[CurH]/2, markDefValue);
10049 			CurH -= width;
10050 			cnt++;
10051 		}
10052 	}
10053 	//return 256;
10054 	if (cnt>0)
10055 	return (hitrate*256/cnt-8*restart);
10056 	else
10057 		return 0;
10058 }
readHistogramPart(void * pInstance,long * histogram,int partIndex,int SRAMTIMESLOT)10059 int readHistogramPart(void *pInstance,long* histogram, int partIndex, int SRAMTIMESLOT)
10060 {
10061     int data_ack_en;
10062     int bin;
10063 	int IniPos, EndPos;
10064 	if( (partIndex < SRAMTIMESLOT) && (SRAMTIMESLOT!=0) )
10065 	{
10066 		IniPos = frameWidth*partIndex/SRAMTIMESLOT;
10067 		EndPos = frameWidth*(partIndex+1)/SRAMTIMESLOT;
10068 	}
10069 	else
10070 	{
10071 		IniPos = 0;
10072 		EndPos = 0;
10073 	}
10074         //--------- Blockiness Histogram Request start ---------//
10075 	if (partIndex == 0)
10076 	{
10077         // write 1 to request register
10078         MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 1, 0x0001);
10079 	}
10080 
10081 	if (1)
10082 	{
10083         //--------- Blockiness Histogram Acknowledge start ---------//
10084 		data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0D_L, 0x0002);
10085         //--------- Function Process start ---------//
10086         if(data_ack_en)
10087         {
10088             // write 1 to sram_io_en register
10089             MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);
10090 			for(bin = IniPos; bin < EndPos; bin++)
10091             {
10092 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_0E_L, (MS_U16)(0x8000 + bin), 0xFFFF);
10093 				// read data from selected address
10094 				histogram[bin] = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0F_L, 0xFFFF);
10095 			}
10096 			if (partIndex == SRAMTIMESLOT-1)
10097 			{
10098 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0, 0x0001);
10099             }
10100             return 1;
10101         }
10102 		else//(!data_ack_en)
10103         {
10104             return 0;
10105         }
10106     }
10107 }
10108 #if 0
10109 int readHistogramPart(void *pInstance,long* histogram, int partIndex)
10110 {
10111 	int data_ack_en;
10112 	int bin;
10113 	int IniPos, EndPos;
10114 	const int MaxPartIndex = 2;
10115 	if (partIndex == 0)
10116 	{
10117 		IniPos = 0;
10118 		EndPos = frameWidth/3;
10119 	}
10120 	else if (partIndex == 1)
10121 	{
10122 		IniPos = frameWidth/3;
10123 		EndPos = frameWidth*2/3;
10124 	}
10125 	else if (partIndex == 2)
10126 	{
10127 		IniPos = frameWidth*2/3;
10128 		EndPos = frameWidth;
10129 	}
10130 	else
10131 	{
10132 		IniPos = 0;
10133 		EndPos = 0;
10134 	}
10135 	//--------- Blockiness Histogram Request start ---------//
10136 	if (partIndex == 0)
10137 	{
10138 		// write 1 to request register
10139 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 1, 0x0001);
10140 	}
10141 
10142 	if (1)
10143 	{
10144 		//--------- Blockiness Histogram Acknowledge start ---------//
10145 		data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0D_L, 0x0002);
10146 		//--------- Function Process start ---------//
10147 		if(data_ack_en)
10148 		{
10149 			// write 1 to sram_io_en register
10150 			MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);
10151 			for(bin = IniPos; bin < EndPos; bin++)
10152 			{
10153 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_0E_L, (MS_U16)(0x8000 + bin), 0xFFFF);
10154 				// read data from selected address
10155 				histogram[bin] = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0F_L, 0xFFFF) ;
10156 			}
10157 			if (partIndex == MaxPartIndex)
10158 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0, 0x0001);
10159 			return 1;
10160 		}
10161 		else//(!data_ack_en)
10162 		{
10163 			return 0;
10164 		}
10165 	}
10166 }
10167 #endif
resetBKNPart(int value,int partIndex,int * blocknessCheck)10168 int resetBKNPart(int value, int partIndex, int* blocknessCheck)
10169 {
10170 	int bin;
10171 	int IniPos, EndPos;
10172 	if (partIndex == 0)
10173 	{
10174 		IniPos = 0;
10175 		EndPos = frameWidth/3;
10176 	}
10177 	else if (partIndex == 1)
10178 	{
10179 		IniPos = frameWidth/3;
10180 		EndPos = frameWidth*2/3;
10181 	}
10182 	else if (partIndex == 2)
10183 	{
10184 		IniPos = frameWidth*2/3;
10185 		EndPos = frameWidth;
10186 	}
10187 	else
10188 	{
10189 		IniPos = 0;
10190 		EndPos = 0;
10191 	}
10192 
10193 	if (1)
10194 	{
10195 		for(bin=IniPos; bin<EndPos;bin++)
10196 		{
10197 			blocknessCheck[bin] = value;
10198 		}
10199 	}
10200 	return	1;
10201 }
writeToSRAMPart(void * pInstance,int * BlockinessCheck,int partIndex,int SRAMTIMESLOT)10202 int writeToSRAMPart(void *pInstance,int* BlockinessCheck, int partIndex, int SRAMTIMESLOT)
10203 {
10204     int bin;
10205     int ack_flag =0;
10206     int count = 0;
10207     MS_U32 Data0, Data1,  Data2,  Data3, Data;
10208 	int IniPos, EndPos;
10209 
10210 	if( (partIndex < SRAMTIMESLOT) && (SRAMTIMESLOT!=0) )
10211 	{
10212 		IniPos = frameWidth*partIndex/SRAMTIMESLOT;
10213 		EndPos = frameWidth*(partIndex+1)/SRAMTIMESLOT;
10214 	}
10215 	else
10216 	{
10217 		IniPos = 0;
10218 		EndPos = 0;
10219     }
10220 
10221     //WRITE TO BLOCKNESS POSITION SRAM
10222     MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L,0x8000,0x8000);//blkwei  sram IO enable: h0008(0x08) 8000 = 15th bit = 1
10223 
10224         for(bin=IniPos; bin<EndPos;bin=bin+4)
10225         {
10226             Data0 = (BlockinessCheck[bin])    &0xF;
10227             Data1 = (BlockinessCheck[bin+1])&0xF;
10228             Data2 = (BlockinessCheck[bin+2])&0xF;
10229             Data3 = (BlockinessCheck[bin+3])&0xF;
10230 
10231             Data = (Data3<<12)|(Data2<<8)|(Data1<<4)|Data0; // 4 4bit combined to 16bit
10232 
10233             {
10234                 MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, bin/4,0x0FFF);//blkwei  sram io address
10235                 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0B_L,Data,0xFFFF);//blkwei  sram write data
10236                 MApi_XC_W2BYTEMSK(REG_SC_BK0C_09_L,0x8000,0x8000);//blkwei  sram write enable
10237                 ack_flag = (MApi_XC_R2BYTEMSK(REG_SC_BK0C_08_L,0x4000)>>14); // 14th bit of h0008
10238             }
10239 
10240             //Sleep( 1);
10241             count = 0;
10242             while ((ack_flag==0) && (count<=10))
10243             {
10244             count++;
10245 
10246                     MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, bin/4,0x0FFF);//blkwei  sram io address
10247                     MApi_XC_W2BYTEMSK(REG_SC_BK0C_0B_L,Data,0xFFFF);//blkwei  sram write data
10248                     MApi_XC_W2BYTEMSK(REG_SC_BK0C_09_L,0x8000,0x8000);//blkwei  sram write enable
10249                     ack_flag = (MApi_XC_R2BYTEMSK(REG_SC_BK0C_08_L,0x4000)>>14); // 14th bit of h0008
10250                 }
10251             }
10252 
10253 //MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
10254 
10255     return 	1;
10256 }
10257 
SDHDModeCheck(MS_U8 u8SD2HDValue,int width)10258 int SDHDModeCheck( MS_U8 u8SD2HDValue, int width) //Register Settings to hardware
10259 {
10260 	//	MS_U16 test_switch = 0;//(MApi_XC_R2BYTE(REG_SC_BK30_0B_L) & 0x8000 )>>15;
10261 	//	if (test_switch == 0) //new settings
10262 	{
10263 		if( (u8SD2HDValue>=60) && (frameWidth>0x700) && (width >= 0x10) ) //SD to HD mode
10264 		{
10265 			//MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x1, 0x0001); // HD_enable
10266 			//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x6, 0x0007); // pulse_filter_type
10267 			return 2;
10268 		}
10269 		else if ((frameWidth>0x50F) && (width >= 0x10) ) //Scaled 2x+ mode
10270 		{
10271 			//				MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x1, 0x0001); // HD_enable
10272 			//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x6, 0x0007); // pulse_filter_type
10273 			return 5;
10274 		}
10275 		else
10276 		{
10277 			if( (frameWidth>0x700) && (width ==0x8) ) // pure HD mode
10278 			{
10279 				//        	MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0, 0x0001); // HD mode
10280 				//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x2, 0x0007); // HD pulse_filter_type
10281 				return 1;
10282 			}
10283 			else if ((frameWidth>0x700) && (width !=0x8)) // scaled HD, like 1440to1920
10284 			{
10285 				//          MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0, 0x0001); // HD mode
10286 				//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x2, 0x0007); // pulse_filter_type
10287 				return 3;
10288 			}
10289 			else if (width ==0x8)// pure SD mode
10290 			{
10291 				//        	MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0, 0x0001); // SD mode
10292 				//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x2, 0x0007); // pulse_filter_type
10293 				return 0;
10294 			}
10295 			else //unknown mode
10296 			{
10297 				//        	MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0, 0x0001); // SD mode
10298 				//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x2, 0x0007); // pulse_filter_type
10299 				return 4;
10300 			}
10301 		}
10302 	}
10303 }
10304 
10305 //---------------- 3DorderDetect begin --------------//
10306 #define sensio_thrd 3
10307 #define format_up_thrd 500
10308 #define format_low_thrd 100
MDrv_SC_3DorderDetect(void * pInstance)10309 int MDrv_SC_3DorderDetect( void *pInstance)
10310 {
10311 	MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 );  // turn on 3d format detection
10312 
10313 	int PA_count = MApi_XC_R2BYTE(REG_SC_BK3A_20_L);
10314 	int LA_count = MApi_XC_R2BYTE(REG_SC_BK3A_21_L);
10315 	int CB_count = MApi_XC_R2BYTE(REG_SC_BK3A_22_L);
10316 	int sensio_l_even = MApi_XC_R2BYTE(REG_SC_BK3A_23_L);
10317 	int sensio_l_odd  = MApi_XC_R2BYTE(REG_SC_BK3A_24_L);
10318 	int sensio_r_even = MApi_XC_R2BYTE(REG_SC_BK3A_25_L);
10319 	int sensio_r_odd  = MApi_XC_R2BYTE(REG_SC_BK3A_26_L);
10320 
10321 	int sensio_flag = 0;
10322 	int format = 0;  // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
10323 
10324 		int sensio_flag_l_ratio =0;
10325 		int sensio_flag_r_ratio =0;
10326 //	int sensio_L_is_EVEN= 0;  // =1 EVEN;  =0 ODD
10327 //		int sensio_R_is_EVEN= 0;
10328 
10329 		if ((sensio_l_even> sensio_l_odd) && (sensio_l_odd!=0))
10330 		{
10331 			sensio_flag_l_ratio = sensio_l_even/sensio_l_odd;
10332 //		sensio_L_is_EVEN =1;
10333 		}
10334 		else if ((sensio_l_odd> sensio_l_even) && (sensio_l_even!=0))
10335 			sensio_flag_l_ratio = sensio_l_odd/sensio_l_even;
10336 		else
10337 			sensio_flag_l_ratio =-1;
10338 
10339 		if ((sensio_r_even> sensio_r_odd) && (sensio_r_odd!=0))
10340 		{
10341 			sensio_flag_r_ratio = sensio_r_even/sensio_r_odd;
10342 //			sensio_R_is_EVEN =1;
10343 		}
10344 		else if ((sensio_r_odd> sensio_r_even) && (sensio_r_even!=0))
10345 			sensio_flag_r_ratio = sensio_r_odd/sensio_r_even;
10346 		else
10347 			sensio_flag_r_ratio =-1;
10348 
10349 		if (sensio_flag_l_ratio> sensio_thrd && sensio_flag_r_ratio> sensio_thrd)
10350 			sensio_flag =1;
10351 		else
10352 			sensio_flag =0;
10353 
10354 
10355 		// 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
10356 		if(sensio_flag)
10357 		{
10358 			format = 4;
10359 			//MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x0007, 0x0007 );  // debug light
10360 		}
10361 		else
10362 		{
10363 				if  ( ( LA_count < CB_count ) && ( PA_count < CB_count ) )
10364 				{
10365 					format = 3;
10366 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0004, 0x0007 );  // debug light
10367 				}
10368 				else if ( ( LA_count < format_low_thrd ) && (PA_count > format_up_thrd) )
10369 				{
10370 					format = 1;
10371 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0001, 0x0007 );  // debug light
10372 				}
10373 				else if ( ( PA_count < format_low_thrd ) && (LA_count > format_up_thrd) )
10374 				{
10375 					format = 2;
10376 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0002, 0x0007 );  // debug light
10377 				}
10378 				else
10379 				{
10380 					format = 0;
10381 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0007 );  // debug light
10382 				}
10383 
10384 		}
10385 
10386 	//printf( "3D format is : %d\n", format );
10387 	//printf( "PA_count : %d\n", PA_count );
10388 	//printf( "LA_count : %d\n", LA_count );
10389 	//printf( "CB_count : %d\n", CB_count );
10390 	//printf( "sensio_l_even : %d\n", sensio_l_even );
10391 	//printf( "sensio_l_odd  : %d\n", sensio_l_odd );
10392 	//printf( "sensio_r_even : %d\n", sensio_r_even );
10393 	//printf( "sensio_r_odd  : %d\n", sensio_r_odd );
10394 	return format;
10395 
10396 }
10397 
10398 //----------------- 3DorderDetect end ---------------//
10399 
10400 //------------- 3DorderDetect_TBLR begin -----------//
10401 //       only support progressive input soure  	    //
10402 //      every 4 horizontal pixel made one decision  //
10403 //      histogram data has been shifted 1 bit	    //
10404 #define TBLR_low_thrd  16
10405 #define TBLR_high_thrd 20
MDrv_SC_3DorderDetect_TBLR(void * pInstance)10406 int MDrv_SC_3DorderDetect_TBLR(void *pInstance)
10407 {
10408 
10409   MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 );  // turn on 3d format detection
10410 	int FrameWidth  = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
10411 	int FrameHeight = heightEstimate(FrameWidth);
10412 	int totalPix = FrameWidth*FrameHeight/4;
10413 
10414 	//printf("FrameWidth = %d, FrameHeight= %d \n", FrameWidth, FrameHeight );
10415 
10416 	MS_BOOL TBLR_MODE_flag = true ;
10417 	static int TBLR_MODE_CNT = 0 ;
10418 	static MS_BOOL isHistSet = false;
10419 
10420 	int histbin = 0;
10421 	int hist0[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10422 	int hist1[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10423 	int hist2[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10424 	int hist3[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10425 
10426 	int sum0 = 0;
10427 	int sum1 = 0;
10428 	int sum2 = 0;
10429 	int sum3 = 0;
10430 
10431 	int Psum0 = 0;
10432 	int Psum1 = 0;
10433 	int Psum2 = 0;
10434 	int Psum3 = 0;
10435 
10436 	int diff_02= 0;
10437 	int diff_13= 0;
10438 	int diff_03= 0;
10439 	int diff_12= 0;
10440 	int shift = 0;
10441 
10442 	int  sum_Diff_02 = 0;
10443 	int  sum_Diff_13 = 0;
10444 	int  sum_Diff_03 = 0;
10445 	int  sum_Diff_12 = 0;
10446 	int  sum_Diff_total = 0;
10447 
10448 	static int  sum_Diff_TB02 = 0;
10449 	static int  sum_Diff_TB13 = 0;
10450 	static int  sum_Diff_TB03 = 0;
10451 	static int  sum_Diff_TB12 = 0;
10452 	static int  sum_Diff_LR02 = 0;
10453 	static int  sum_Diff_LR13 = 0;
10454 	static int  sum_Diff_LR03 = 0;
10455 	static int  sum_Diff_LR12 = 0;
10456 	static int  curStatus = 0;
10457 
10458 
10459 	if((TBLR_MODE_CNT%2)==0)
10460 		TBLR_MODE_flag= true;
10461 	else if((TBLR_MODE_CNT%2)==1)
10462 		TBLR_MODE_flag= false;
10463 
10464 	if (TBLR_MODE_flag)  // TB
10465 	{
10466 			//printf("----- TB histogram------\n" );
10467 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000,					 0x01FFF );  		// hist win0 x_start
10468 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000, 				 0x01FFF );  		// hist win0 y_start
10469   			MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth 	  -0x0001, 	 0x01FFF );			// hist win0 x_end
10470 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight/4 -0x0001,   0x01FFF );			// hist win0 y_end
10471 
10472 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, 0x0000 , 				 0x01FFF );  		// hist win1 x_start
10473 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, FrameHeight/4  , 		 0x01FFF );  		// hist win1 y_start
10474   			MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth 	  -0x0001,	 0x01FFF );			// hist win1 x_end
10475 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight/2 -0x0001,	 0x01FFF ); 		// hist win1 y_end
10476 
10477 
10478 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, 0x0000,		 			 0x01FFF );  		// hist win2 x_start
10479 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, FrameHeight/2 , 		 0x01FFF );  		// hist win2 y_start
10480  		 	MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth 		-0x0001, 0x01FFF );			// hist win2 x_end
10481 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight*3/4 -0x0001, 0x01FFF );			// hist win2 y_end
10482 
10483 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, 0x0000,					 0x01FFF );  		// hist win3 x_start
10484 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, FrameHeight*3/4 ,		 0x01FFF );  		// hist win3 y_start
10485  			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth  -0x0001, 	 0x01FFF );  		// hist win3 x_end
10486 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001, 	 0x01FFF );  		// hist win3 y_end
10487 
10488 	}
10489 	else
10490 	{
10491 		  //printf("----- LR histogram------\n" );
10492 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000, 0x01FFF );  						// hist win0 x_start
10493 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000, 0x01FFF );  						// hist win0 y_start
10494   			MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth/4 	-0x0001, 	0x01FFF );		// hist win0 x_end
10495 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight		-0x0001,	0x01FFF );		// hist win0 y_end
10496 
10497 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, FrameWidth/4, 				0x01FFF );  	// hist win1 x_start
10498 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, 0x0000  ,					0x01FFF );		// hist win1 y_start
10499   			MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth/2 	-0x0001,	0x01FFF );		// hist win1 x_end
10500 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight		-0x0001 ,	0x01FFF ); 		// hist win1 y_end
10501 
10502 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, FrameWidth/2,		 		0x01FFF );  	// hist win2 x_start
10503 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, 0x0000,					 	0x01FFF );  	// hist win2 y_start
10504  		 	MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth*3/4 	-0x0001,	0x01FFF );		// hist win2 x_end
10505 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight		-0x0001,	0x01FFF );		// hist win2 y_end
10506 
10507 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, FrameWidth*3/4,				0x01FFF );  	// hist win3 x_start
10508 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, 0x0000,						0x01FFF );  	// hist win3 y_start
10509  			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth  -0x0001, 		0x01FFF );  	// hist win3 x_end
10510 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001, 		0x01FFF );  	// hist win3 y_end
10511 
10512 	}
10513 
10514 	if( !isHistSet )
10515 	{
10516 		MApi_XC_W2BYTEMSK(REG_SC_BK3A_39_L, 0x0001, 0x0001);
10517 		isHistSet = true;
10518 		//printf( "set trigger bit\n" );
10519 	}
10520 	MS_BOOL histReady = MApi_XC_R2BYTEMSK(REG_SC_BK3A_39_L, 0x0080) >> 7;  // if histogram is ready
10521 
10522 
10523   if( histReady )
10524   {
10525   	for ( histbin = 0; histbin< 32 ; histbin++ )
10526 		{
10527 			// every 4 pixel in horizontal
10528 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, histbin, 0x001F );  		// select hist bin
10529 
10530 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0000,	 0x0300 );  		// select hist window0
10531 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,	 0x0001 );  		// toggle histogram read
10532 			hist0[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
10533 
10534 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0100,	 0x0300 );  		// select hist window1
10535 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );  		// toggle histogram read
10536 			hist1[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
10537 
10538 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0200,  0x0300 );  		// select hist window2
10539 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );  		// toggle histogram read
10540 			hist2[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
10541 
10542 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0300,  0x0300 );  		// select hist window3
10543 			MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001,  0x0001 );  		// toggle histogram read
10544 			hist3[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
10545 
10546 			sum0 = sum0 + hist0[histbin]*histbin;
10547 			sum1 = sum1 + hist1[histbin]*histbin;
10548 			sum2 = sum2 + hist2[histbin]*histbin;
10549 			sum3 = sum3 + hist3[histbin]*histbin;
10550 
10551 
10552 			Psum0 = Psum0 + hist0[histbin];
10553 			Psum1 = Psum1 + hist1[histbin];
10554 			Psum2 = Psum2 + hist2[histbin];
10555 			Psum3 = Psum3 + hist3[histbin];
10556 
10557 			//printf( "hist[%d] = %d  %d  %d  %d \n", histbin, hist0[histbin], hist1[histbin], hist2[histbin], hist3[histbin]);
10558 
10559 		}
10560 
10561   	//printf( "hist total pixel = %d  %d  %d  %d \n", Psum0, Psum1,Psum2, Psum3 );
10562 
10563 
10564   	sum0 = 4* sum0 / totalPix;
10565 		sum1 = 4* sum1 / totalPix;
10566 		sum2 = 4* sum2 / totalPix;
10567 		sum3 = 4* sum3 / totalPix;
10568 
10569 		shift = ((sum0+ sum1) - (sum2 +  sum3))/2;
10570 
10571 		if ((sum0 - sum2)*(sum1 - sum3) <= 0)
10572 			shift =0;
10573 
10574 		if( abs(shift) >2)
10575 			shift =0;
10576 
10577 		//printf("sum0= %d, sum1=  %d, sum2=  %d, sum3=  %d, shift= %d \n", sum0, sum1, sum2, sum3, shift );
10578 
10579 		//sum all the diff
10580 		sum_Diff_02= 0;
10581 		sum_Diff_13= 0;
10582 		sum_Diff_03= 0;
10583 		sum_Diff_12= 0;
10584 
10585 		for ( histbin = 0; histbin< 32 ; histbin++)
10586 		{
10587 
10588 			  diff_02= abs(hist0[histbin] - hist2[histbin-shift]);
10589 				diff_13= abs(hist1[histbin] - hist3[histbin-shift]);
10590 				diff_03= abs(hist0[histbin] - hist3[histbin-shift]);
10591 				diff_12= abs(hist1[histbin] - hist2[histbin-shift]);
10592 
10593 				if (TBLR_MODE_flag )
10594 				{
10595 					sum_Diff_02 = sum_Diff_02 + diff_02;
10596 					sum_Diff_13 = sum_Diff_13 + diff_13;
10597 					sum_Diff_03 = sum_Diff_03 + diff_03;
10598 					sum_Diff_12 = sum_Diff_12 + diff_12;
10599 
10600 				//	printf(" sum_diff_TB : %d,  %d, %d, %d, , %d, %d, %d, %d \n", sum_Diff_02, sum_Diff_13, sum_Diff_03, sum_Diff_12 , diff_02, diff_13, diff_03, diff_12);
10601 				}
10602 				else
10603 				{
10604 					sum_Diff_02 = sum_Diff_02 + diff_02;
10605 					sum_Diff_13 = sum_Diff_13 + diff_13;
10606 					sum_Diff_03 = sum_Diff_03 + diff_03;
10607 					sum_Diff_12 = sum_Diff_12 + diff_12;
10608 
10609 				//	printf(" sum_diff_LR : %d,  %d, %d, %d, , %d, %d ,%d ,%d \n", sum_Diff_02, sum_Diff_13, sum_Diff_03, sum_Diff_12,  diff_02, diff_13, diff_03, diff_12);
10610 				}
10611 		}
10612 
10613 		sum_Diff_total = __max( sum_Diff_02+ sum_Diff_13+ sum_Diff_03+ sum_Diff_12, 1);
10614 
10615 		//normalization
10616 		if (TBLR_MODE_flag )
10617 		{
10618 			sum_Diff_TB02= sum_Diff_02*100/sum_Diff_total;
10619 			sum_Diff_TB13= sum_Diff_13*100/sum_Diff_total;
10620 			sum_Diff_TB03= sum_Diff_03*100/sum_Diff_total;
10621 			sum_Diff_TB12= sum_Diff_12*100/sum_Diff_total;
10622 		}
10623 		else
10624 		{
10625 			sum_Diff_LR02= sum_Diff_02*100/sum_Diff_total;
10626 			sum_Diff_LR13= sum_Diff_13*100/sum_Diff_total;
10627 			sum_Diff_LR03= sum_Diff_03*100/sum_Diff_total;
10628 			sum_Diff_LR12= sum_Diff_12*100/sum_Diff_total;
10629 		}
10630 
10631 
10632 		if(TBLR_MODE_CNT%2)
10633 		{
10634 
10635 			//	printf("normalized TBdiff : %d %d %d %d \n", sum_Diff_TB02, sum_Diff_TB13, sum_Diff_TB03, sum_Diff_TB12 );
10636 			//	printf("normalized LRdiff : %d %d %d %d \n", sum_Diff_LR02, sum_Diff_LR13, sum_Diff_LR03, sum_Diff_LR12 );
10637 
10638 				if( __max(sum_Diff_LR02, sum_Diff_LR13) <  __max(sum_Diff_LR03, sum_Diff_LR12) &&  __min (sum_Diff_LR02, sum_Diff_LR13) < TBLR_low_thrd && __max(sum_Diff_TB02, sum_Diff_TB13) > TBLR_high_thrd)
10639 				{
10640 					curStatus = 2;//LR
10641 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0020, 0x0070 );  // debug light green
10642 				}
10643 				else if( __max(sum_Diff_TB02, sum_Diff_TB13)<  __max(sum_Diff_TB03, sum_Diff_TB12) && __min (sum_Diff_TB02, sum_Diff_TB13) < TBLR_low_thrd && __max(sum_Diff_LR02, sum_Diff_LR13) > TBLR_high_thrd)
10644 				{
10645 					curStatus = 1;//TB
10646 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0010, 0x0070 );  // debug light red
10647 				}
10648 				else
10649 				{
10650 					curStatus = 0;//Video
10651 					//MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0070 );  // debug light off
10652 				}
10653 
10654 				//printf("3d format is : %d \n", curStatus);
10655 
10656 		}
10657 
10658 		isHistSet = false;
10659 		TBLR_MODE_CNT ++;
10660 	}
10661 
10662 		if (TBLR_MODE_CNT > 300)
10663 		{
10664 				TBLR_MODE_CNT = 0;
10665 		}
10666 		//printf("TBLR_MODE_CNT = %d\n", TBLR_MODE_CNT );
10667 
10668 	return curStatus;
10669 }
10670 // -------------- 3DorderDetect_TBLR end ----------- //
10671 
10672 //-------- 3D source format detection begin ---------//
10673 
MDrv_SC_3DfmtDetect(void * pInstance)10674 int MDrv_SC_3DfmtDetect(void *pInstance)
10675 {
10676 	static int format3D = 0;			// 0:2D, 1:TB, 2:LR(SS), 3:PA, 4:LA, 5:CB, 6:Sensio
10677 	int isCBPALASensio =  MDrv_SC_3DorderDetect(pInstance); // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
10678 	int isTBLR =  MDrv_SC_3DorderDetect_TBLR(pInstance);					//0:2D, 1:TB, 2:LR(SS)
10679 
10680 	if( isCBPALASensio )
10681 		format3D = isCBPALASensio +2;
10682 	else
10683 		format3D = isTBLR;
10684 
10685 		//printf("3D format is = %d\n", format3D );
10686 
10687 	return format3D;
10688 
10689 }
10690 
10691 //--------- 3D source format detection end  ---------//
10692 
FeedBackSD2HD(void * pInstance,int width,MS_U8 u8SD2HDValue)10693 int FeedBackSD2HD(void *pInstance,int width, MS_U8 u8SD2HDValue) // for test to feedback
10694 {
10695 
10696 	MS_BOOL ifSD2HD = ((width >=20 )&& (width<=22) );
10697 
10698 	if (ifSD2HD) //SD to HD format
10699 	{
10700 		return SDHDModeCheck( __min(u8SD2HDValue+20,63) , width);
10701 	}
10702 	else //pure SD or HD format
10703 	{
10704 		return SDHDModeCheck( u8SD2HDValue, width);
10705 	}
10706 }
10707 
WidthToRegister(void * pInstance,int width)10708 void WidthToRegister(void *pInstance,int width) // Write width to register
10709 {
10710 	int   left1,right1;
10711 	if(width<8)
10712 	{
10713 		width = 8;
10714 		left1 = 8;
10715 		right1 = 9;
10716 	}
10717 	else if (width==8) //test 0808 for performance
10718 	{
10719 		left1 = 8;
10720 		right1 = 8;
10721 	}
10722 	else
10723 	{
10724 
10725 		left1 = width - 1; //fix prevent defect
10726 		right1 = (width >=31) ? 31 : width + 1;
10727 	}
10728 	//write interval left && interval right
10729 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_39_L, (MS_U16)((left1<<8)|right1), 0xFFFF);
10730 }
WidthIIR_H(int width)10731 void WidthIIR_H(int width) // Width IIR Protection
10732 {
10733 	int UnstableWidthCnt = 0;
10734 	static int widthPP = 8;
10735 	static int widthP  = 8;
10736 	static int widthC  = 8;
10737 
10738 	if (widthPP!= widthP)
10739 		UnstableWidthCnt++;
10740 	if (widthP!=widthC)
10741 		UnstableWidthCnt++;
10742 	if (widthC!=width)
10743 		UnstableWidthCnt++;
10744 	if (UnstableWidthCnt == 0)
10745 		WidthIIR = width;
10746 	/*	  else if (UnstableWidthCnt == 3)//reduce DBK Strengh
10747 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x2000, 0xF000);
10748 	else if (UnstableWidthCnt == 2)//reduce DBK Strengh
10749 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x4000, 0xF000);
10750 	else if (UnstableWidthCnt == 1)//reduce DBK Strengh
10751 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x6000, 0xF000);
10752 	*/
10753 	widthPP = widthP;
10754 	widthP = widthC;
10755 	widthC = width;
10756 	//DEBUG_LC_5F( UnstableWidthCnt );
10757 }
10758 
10759 static int dbkgain = 0;
10760 static int cpxgain = 0;
10761 
parameterControl(void * pInstance,int frm_Edg,int frm_blk,int frm_Det,int cpxGain,const MS_U32 _hpfHdCntReport,const MS_U32 _hpfSdCntReport)10762 int parameterControl(void *pInstance,int frm_Edg, int frm_blk, int frm_Det, int cpxGain, const MS_U32 _hpfHdCntReport, const MS_U32 _hpfSdCntReport)
10763 {
10764 
10765 	static MS_U32 HDCnt = 0;
10766 	static MS_U32 SDCnt = 0;
10767 
10768 	HDCnt = (_hpfHdCntReport + HDCnt*3 ) >> 2;
10769 	SDCnt = (_hpfSdCntReport + SDCnt*3 ) >> 2;
10770 
10771 
10772 
10773 
10774         MS_BOOL IfComplex1 = (HDCnt > 64000) && (HDCnt <= 80000) && (SDCnt > 200000) && ( frm_blk > 20 );
10775         MS_BOOL IfComplex2 = (HDCnt > 80000) && (SDCnt > 200000) && ( frm_blk > 20 );
10776         MS_BOOL IfViolinLike = (IfComplex1 && (SDCnt > 400000 ) ) || (IfComplex2 && (SDCnt > HDCnt*4 ) ) ;
10777         int ViolinInc = -1;
10778         if (IfViolinLike && (HDCnt>0) )
10779                 ViolinInc = (SDCnt/HDCnt) -3;
10780         MS_BOOL IfFlashStyle = (IfComplex1 && (SDCnt < HDCnt*4 ) ) || (IfComplex2 && (SDCnt < 300000 + (HDCnt-80000) ));
10781         int FlashInc = -1;
10782         if (IfFlashStyle && (HDCnt>0) )
10783                 FlashInc = 4 - (SDCnt/HDCnt) ;
10784 
10785 
10786 	int STR_THR_1, STR_THR_2, STR_THR_3, STR_THR_4;
10787 
10788 	static int ViolinCnt = 0;
10789 	static int FlashSCnt = 0;
10790 	if (IfViolinLike)
10791 	{
10792                         ViolinCnt = (ViolinCnt > 20) ? 20 : (ViolinCnt+ViolinInc );
10793 	}
10794 	else
10795 	{
10796                         ViolinCnt = (ViolinCnt == 0) ? 0 : (ViolinCnt+ViolinInc );
10797 	}
10798 	if (IfFlashStyle)
10799 	{
10800 			FlashSCnt = (FlashSCnt > 20) ? 20 : (FlashSCnt+FlashInc );
10801 	}
10802 	else
10803 	{
10804                         FlashSCnt = (FlashSCnt == 0) ? 0 : (FlashSCnt+FlashInc );
10805 	}
10806 	STR_THR_1 = 80;
10807 	STR_THR_2 = 60;
10808 	STR_THR_3 = 40;
10809 	STR_THR_4 = 20;
10810 	if (ViolinCnt >= 10)
10811 	{
10812 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring
10813 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x0F, 0xFF); // coring thrd
10814 	}
10815 	else if (frm_Edg > STR_THR_1 || (FlashSCnt >= 10 ) )
10816 	{
10817 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring
10818 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x00, 0xFF); // coring thrd
10819 	}
10820 	else if ( (frm_Edg <= STR_THR_1) && (frm_Edg > STR_THR_2) )
10821 	{
10822 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring
10823 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x00, 0xFF); // coring thrd
10824 	}
10825 	else if ((frm_Edg <= STR_THR_2) && (frm_Edg > STR_THR_3))
10826 	{
10827 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring
10828 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x04, 0xFF); // coring thrd
10829 	}
10830 	else if ((frm_Edg <= STR_THR_3) && (frm_Edg > STR_THR_4))
10831 	{
10832 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring on
10833 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x07, 0xFF); // coring thrd
10834 	}
10835 	else if ((frm_Edg <= STR_THR_4) && (frm_Edg > 0))
10836 	{
10837 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring on
10838 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x0A, 0xFF); // coring thrd
10839 	}
10840 	else
10841 	{
10842 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x02, 0x02); // coring on
10843 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x0A, 0xFF); // coring thrd
10844 	}
10845 
10846 //	int dbkcase = 0;
10847 	static int return_value = 0;
10848 
10849 	int dbkgain_cur = 0;
10850 	int cpxgain_cur = 0;
10851 	if (FlashSCnt >= 10)
10852 	{
10853 		frm_blk = frm_blk * 2;
10854 		frm_Det = frm_Det / 2;
10855 		//PRT_TRP("Flash Style!!!\n");
10856 		//MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0007, 0x0077); // extend 1
10857 	}
10858 	else if (ViolinCnt >= 10)
10859 	{
10860 		frm_blk = frm_blk / 2;
10861 		frm_Det = frm_Det * 2;
10862 		//PRT_TRP("Violin Style!!!\n");
10863 		//MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0070, 0x0077); // extend 1
10864 	}
10865 	else
10866 	{
10867 		//MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0077); // extend 1
10868 	}
10869 	if (cpxGain > 0) //BW water flow
10870 	{
10871 		//PRT_TRP("BW water patch!!!\n");
10872 		int cpxGainP = __minmax(8-cpxGain, 0, 0x8);
10873 
10874 		dbkgain_cur = 0xF;
10875 		cpxgain_cur = cpxGainP;
10876 
10877 //		dbkcase = 0;
10878 		return_value = 100;
10879 		//return frm_Edg;
10880 	}
10881 #if 0	//20141002 mikR
10882 	else if (frameWidth <= 800)
10883 	{
10884 //		MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0xA000, 0xA000); //DBK Gain
10885 //		MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x0000, 0xFFFF); //Complex Control
10886 
10887 		dbkgain_cur = 0xA;
10888 		cpxgain_cur = 0x0;
10889 
10890 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x5<<8, 0x0F00); // extend 1
10891 //		dbkcase = 9;
10892 		return_value = 100;
10893 
10894 	}
10895 #endif	//20141002 mikR
10896 	else if (frm_blk > frm_Det*2 && frm_blk > 8)
10897 	{
10898 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0xF000, 0xF000); //DBK Gain
10899 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x0000, 0xFFFF); //Complex Control
10900 
10901 		dbkgain_cur = 0xF;
10902 		cpxgain_cur = 0x0;
10903 
10904 //		dbkcase = 1;
10905 		return_value = 100;
10906 
10907 	}
10908 	else if (frm_blk > frm_Det*3/2 && frm_blk > 8)
10909 	{
10910 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0xC000, 0xF000); //DBK Gain
10911 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x1111, 0xFFFF); //Complex Control
10912 		dbkgain_cur = 0xD;
10913 		cpxgain_cur = 0x0;
10914 
10915 
10916 //		dbkcase = 2;
10917 		return_value = 90;
10918 	}
10919 	else if (frm_blk > frm_Det && frm_blk > 8)
10920 	{
10921 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x8000, 0xF000); //DBK Gain
10922 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x2222, 0xFFFF); //Complex Control
10923 		dbkgain_cur = 0xA;
10924 		cpxgain_cur = 0x2;
10925 
10926 //		dbkcase = 3;
10927 		return_value = 80;
10928 	}
10929 	else if (frm_blk > frm_Det*5/6 && frm_blk > 8)
10930 	{
10931 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x6000, 0xF000); //DBK Gain
10932 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x3333, 0xFFFF); //Complex Control
10933 		dbkgain_cur = 0x9;
10934 		cpxgain_cur = 0x3;
10935 
10936 //		dbkcase = 4;
10937 		return_value = 70;
10938 	}
10939 	else if (frm_blk > frm_Det*4/6 && frm_blk > 8)
10940 	{
10941 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x5000, 0xF000); //DBK Gain
10942 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x4444, 0xFFFF); //Complex Control
10943 		dbkgain_cur = 0x8;
10944 		cpxgain_cur = 0x4;
10945 
10946 		//dbkcase = 5;
10947 		return_value = 60;
10948 	}
10949 	else if (frm_blk > frm_Det*3/6 && frm_blk > 8)
10950 	{
10951 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x4000, 0xF000); //DBK Gain
10952 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x4444, 0xFFFF); //Complex Control
10953 		dbkgain_cur = 0x8;
10954 		cpxgain_cur = 0x5;
10955 
10956 //		dbkcase = 5;
10957 		return_value = 50;
10958 	}
10959 	else if (frm_blk > frm_Det*2/6 && frm_blk > 8)
10960 	{
10961 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x4000, 0xF000); //DBK Gain
10962 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x4444, 0xFFFF); //Complex Control
10963 		dbkgain_cur = 0x6;
10964 		cpxgain_cur = 0x6;
10965 
10966 		//dbkcase = 6;
10967 		return_value = 35;
10968 	}
10969 	else if (frm_blk > frm_Det*1/6 && frm_blk > 8)
10970 	{
10971 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x3000, 0xF000); //DBK Gain
10972 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x5555, 0xFFFF); //Complex Control
10973 		dbkgain_cur = 0x4;
10974 		cpxgain_cur = 0x8;
10975 
10976 		//dbkcase = 7;
10977 		return_value = 20;
10978 	}
10979 	else
10980 	{
10981 		//MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x3000, 0xF000); //DBK Gain
10982 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, 0x6666, 0xFFFF); //Complex Control
10983 		dbkgain_cur = 0x2;
10984 		cpxgain_cur = 0x8;
10985 
10986 		//dbkcase = 8;
10987 		return_value = 0;
10988 
10989 	}
10990 	dbkgain = ( dbkgain * 6 + dbkgain_cur * 2 ) >> 3;
10991 	cpxgain = ( cpxgain * 6 + cpxgain_cur * 2 ) >> 3;
10992 
10993 	MS_U16 DBKUserLevel;
10994 
10995 	DBKUserLevel = MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L,0x0300)>>8;
10996 
10997 	if (DBKUserLevel==1)
10998 	{
10999 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, dbkgain<<12, 0xF000); //DBK Gain//Low
11000 	}
11001 	else if (DBKUserLevel==2)
11002 	{
11003 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, dbkgain<<12, 0xF000); //DBK Gain//Mid
11004 	}
11005 	else if (DBKUserLevel==3)
11006 	{
11007 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, dbkgain<<12, 0xF000); //DBK Gain//High
11008 	}
11009 	else
11010 	{
11011 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, dbkgain<<12, 0xF000); //DBK Gain
11012 	}
11013 	MApi_XC_W2BYTEMSK(REG_SC_BK60_31_L, (cpxgain<<12)+(cpxgain<<8)+(cpxgain<<4)+cpxgain, 0xFFFF); //Complex Control
11014 
11015 //	PRT_TRP("dbkcase = %d, frm_blk = %d, frm_Det = %d \n", dbkcase, frm_blk, frm_Det);
11016 
11017 	return	return_value;
11018 }
11019 
NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)11020 void NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)
11021 {
11022 	int NM_Gain = __minmax( DBKStr/10-7, 1, 3);
11023 	//int NM_Gain = __minmax( DBKStr/10-4, 2, 6); decrease NM_gain by eason.lin 20140206
11024 
11025 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_52_L, NM_Gain, 0x003F);//Y noise masking gain
11026 
11027 	if ( (DBKStr <= 40) || isSceneChange )
11028 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x00, 0x0008); //Y noise masking off
11029 	else
11030 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x08, 0x0008); //Y noise masking on
11031 
11032 }
BlkStrIIRPart(MS_BOOL MarkSuccess,int * BlockinessCheck,MS_U8 * BLKN_mark,MS_U8 markDefValue,int partIndex,int formatMode)11033 void BlkStrIIRPart(MS_BOOL MarkSuccess, int* BlockinessCheck,MS_U8* BLKN_mark, MS_U8 markDefValue, int partIndex, int formatMode) //BLK Strength (mark) IIR
11034 {
11035 	int bin, blk_LPF, fac;
11036 	static MS_U16 BlockinessChecktmp[MaxWidth];
11037 	int PreH, NxtH;
11038 
11039 	if (!MarkSuccess) //mark failed, use mark default value
11040 	{
11041 
11042 		for( bin = 0; bin < frameWidth; bin++ )
11043 		{
11044 			BlockinessCheckPre[bin] = BlockinessCheckIIR[bin];
11045 			BlockinessCheck[bin] = (markDefValue*1+BlockinessCheckIIR[bin]*(IIRStrength-1) )/IIRStrength; //test for IIR
11046 			BlockinessCheckIIR[bin] = BlockinessCheck[bin];
11047 		}
11048 	}
11049 	else //mark success, ready to output BlockinessCheck
11050 	{
11051 		if (partIndex == 0)
11052 		{
11053 			//Extend marked pixels
11054 			for( bin = 0; bin < frameWidth-1; bin++ )
11055 			{
11056 				//setting different software extend bits according to format
11057 				if (formatMode == 0)  				//pure SD
11058 				{
11059 					BlockinessChecktmp[bin] = BLKN_mark[bin];
11060 				}
11061 				else if (formatMode == 1) //pure HD
11062 				{
11063 					PreH = (bin-1>=0)?bin-1:bin;
11064 					NxtH = (bin+1<frameWidth)?bin+1:bin;
11065 
11066 					BlockinessChecktmp[bin] = __max(BLKN_mark[PreH],BLKN_mark[bin]);
11067 				}
11068 				else if (formatMode == 2) //SD to HD
11069 				{
11070 					PreH = (bin-1>=0)?bin-1:bin;
11071 					NxtH = (bin+1<frameWidth)?bin+1:bin;
11072 					BlockinessChecktmp[bin] = __max(BLKN_mark[PreH],BLKN_mark[bin]);
11073 				}
11074 				else if (formatMode == 3) //scaled HD
11075 				{
11076 					PreH = (bin-1>=0)?bin-1:bin;
11077 					NxtH = (bin+1<frameWidth)?bin+1:bin;
11078 					BlockinessChecktmp[bin] = __max(BLKN_mark[PreH],BLKN_mark[bin]);
11079 				}
11080 				else //formatMode == 4
11081 				{
11082 					PreH = (bin-1>=0)?bin-1:bin;
11083 					NxtH = (bin+1<frameWidth)?bin+1:bin;
11084 					BlockinessChecktmp[bin] = __max(BLKN_mark[PreH],BLKN_mark[bin]);
11085 				}
11086 
11087 			}
11088 
11089 		}
11090 		else if (partIndex == 1)
11091 		{
11092 			for( bin = 0; bin < frameWidth; bin++ )
11093 			{
11094 				PreH  = __max(bin-1,0);
11095 				NxtH  = __min(bin+1,frameWidth-1);
11096 
11097 				blk_LPF = (BlockinessChecktmp[PreH]+2*BlockinessChecktmp[bin]+BlockinessChecktmp[NxtH])>>2;
11098 
11099 				fac = abs(blk_LPF-BlockinessCheckPre[bin]);
11100 				//fac = 0;
11101 				BlockinessCheck[bin] = (blk_LPF * (16-fac) + BlockinessCheckIIR[bin] * fac + 8)>>4;
11102 				BlockinessCheckIIR[bin] = BlockinessCheck[bin];
11103 				BlockinessCheckPre[bin] = blk_LPF;
11104 			}
11105 		}
11106 		else
11107 			return;
11108 	}
11109 	/*    else //mark success, ready to output BlockinessCheck
11110 	{
11111 	if (partIndex == 0)
11112 	{
11113 	//Extend marked pixels
11114 	for( bin = 0; bin < frameWidth/2; bin++ )
11115 	{
11116 
11117 	Pre3H = __max(bin-3,0);
11118 	Pre2H = __max(bin-2,0);
11119 	PreH  = __max(bin-1,0);
11120 	NxtH  = __min(bin+1,frameWidth-1);
11121 	Nxt2H = __min(bin+2,frameWidth-1);
11122 	Nxt3H = __min(bin+3,frameWidth-1);
11123 
11124 	if (MApi_XC_R2BYTEMSK(REG_SC_BK30_0F_L, 0x0400) > 0 && formatMode==1 )
11125 	blk_LPF = (BLKN_mark[PreH]+2*BLKN_mark[bin]+BLKN_mark[NxtH])>>2;
11126 	else
11127 	{
11128 	blk_LPF = (BLKN_mark[Pre3H]+BLKN_mark[Pre2H]+2*BLKN_mark[PreH]+8*BLKN_mark[bin]+2*BLKN_mark[NxtH]+BLKN_mark[Nxt2H]+BLKN_mark[Nxt3H])>>4;
11129 	}
11130 
11131 	fac = abs(blk_LPF-BlockinessCheckPre[bin]);
11132 	//fac = 0;
11133 	BlockinessCheck[bin] = (blk_LPF * (16-fac) + BlockinessCheckIIR[bin] * fac + 8)>>4;
11134 	BlockinessCheckIIR[bin] = BlockinessCheck[bin];
11135 	BlockinessCheckPre[bin] = blk_LPF;
11136 
11137 
11138 	}
11139 
11140 	}
11141 	else if (partIndex == 1)
11142 	{
11143 	//for( bin = frameWidth/2; bin < frameWidth; bin++ )
11144 	for( bin = 0; bin < frameWidth; bin++ )
11145 	{
11146 	Pre3H = __max(bin-3,0);
11147 	Pre2H = __max(bin-2,0);
11148 	PreH  = __max(bin-1,0);
11149 	NxtH  = __min(bin+1,frameWidth-1);
11150 	Nxt2H = __min(bin+2,frameWidth-1);
11151 	Nxt3H = __min(bin+3,frameWidth-1);
11152 
11153 	if (MApi_XC_R2BYTEMSK(REG_SC_BK30_0F_L, 0x0400) > 0 && formatMode==1 )
11154 	blk_LPF = (BLKN_mark[PreH]+2*BLKN_mark[bin]+BLKN_mark[NxtH])>>2;
11155 	else
11156 	{
11157 	blk_LPF = (BLKN_mark[Pre3H]+BLKN_mark[Pre2H]+2*BLKN_mark[PreH]+8*BLKN_mark[bin]+2*BLKN_mark[NxtH]+BLKN_mark[Nxt2H]+BLKN_mark[Nxt3H])>>4;
11158 	}
11159 
11160 
11161 	fac = abs(blk_LPF-BlockinessCheckPre[bin]);
11162 	//fac = 0;
11163 	BlockinessCheck[bin] = (blk_LPF * (16-fac) + BlockinessCheckIIR[bin] * fac + 8)>>4;
11164 	BlockinessCheckIIR[bin] = BlockinessCheck[bin];
11165 	BlockinessCheckPre[bin] = blk_LPF;
11166 	}
11167 	}
11168 	else
11169 	return;
11170 	}
11171 	*/
11172 }
11173 
BWPatchDBK(void * pInstance,const XC_LumaHistogramStates lumaHistogram,MS_U32 colorsum,MS_U32 uComplex,MS_BOOL me1Still,MS_U16 mvNotFound,MS_U16 mv0Comfirm)11174 MS_U8 BWPatchDBK(void *pInstance, const XC_LumaHistogramStates lumaHistogram, MS_U32 colorsum, MS_U32 uComplex, MS_BOOL me1Still, MS_U16 mvNotFound, /*MS_U16 nonMv0Comfirm,*/ MS_U16 mv0Comfirm) //cplx gain
11175 {
11176 
11177 	int i, cpxGain;
11178 
11179 	MS_U16 sum   = 0;
11180 	MS_U16 BWSum = 0;
11181 	for(i=0;i<32;i++)
11182 	{
11183 		sum += (lumaHistogram.lumaBin[i]);
11184 		if( (i<=5) || (i>=26) )
11185 			BWSum += lumaHistogram.lumaBin[i] ;
11186 
11187 	}
11188 	//PRT_TRP("BWSum= %d;sum = %d;me1Still =%d; colorsum=%d; uComplex=%d; mvNotFound =%d; nonMv0Comfirm=%d; mv0Comfirm=%d; \n",
11189 	//BWSum, sum, me1Still, colorsum, uComplex, mvNotFound, nonMv0Comfirm, mv0Comfirm);
11190 
11191 
11192 	if( (BWSum > sum * 3/8) && (BWSum < sum * 5/8)&& (colorsum < 0x18) && (!me1Still) && (uComplex > 0x2700)
11193 		&& (mvNotFound > 0x200 ) /*&& (mvNotFound > mv0Comfirm*8)*/ && (mv0Comfirm < 0x10) )
11194 	{
11195 		//DEBUG_LC_5D(pInstance,1);
11196 		cpxGain = 0x8;
11197 
11198 	}
11199 	else if (BWSum < sum * 1/8)
11200 	{
11201 		//DEBUG_LC_5D(pInstance,2);
11202 		cpxGain = 0x0;
11203 
11204 	}
11205 	else
11206 	{
11207 		//		if (sum>0)
11208 		//			cpxGain = (BWSum*8-sum)*8/sum;
11209 		//		else
11210 		cpxGain = 0;
11211 		//DEBUG_LC_5D(pInstance,0);
11212 	}
11213 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_47_L, 			0, 0x0F00); //Cplx gain for black white water flow
11214 	MApi_XC_W2BYTEMSK(REG_SC_BK0C_47_L, cpxGain, 0x000F); //Cplx gain for black white water flow
11215 
11216 	return cpxGain;
11217 }
setHDDefaultParam(void * pInstance)11218 void setHDDefaultParam(void *pInstance)
11219 {
11220 	if (0) //moved to register map
11221 	{
11222 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x4, 0x0004);
11223 		MApi_XC_W2BYTEMSK(REG_SC_BK0C_45_L, 0x00C0, 0x00C0);
11224 
11225 		MApi_XC_W2BYTEMSK(REG_SC_BK60_30_L, 0x0100, 0x0100);
11226 		MApi_XC_W2BYTEMSK(REG_SC_BK60_30_L, 0x0080, 0x0080);
11227 
11228 	}
11229 	return;
11230 }
11231 
DBK_Detect_Partition(void * pInstance,int * BlockinessCheck,long * histogram,int * partiCounter,const MS_U8 _hdsddFilterBaseReport,MS_BOOL isSceneChangeMc,long FrameBLKStrTmp,int MARKTIMESLOT,int ADJTIMESLOT)11232 int DBK_Detect_Partition(void *pInstance, int* BlockinessCheck, long* histogram, int* partiCounter, const MS_U8 _hdsddFilterBaseReport, MS_BOOL isSceneChangeMc, long FrameBLKStrTmp, int MARKTIMESLOT, int ADJTIMESLOT) // deblocking detect new test algorithm
11233 {
11234 	//Declaration
11235 	static MS_U8 markDefValue, markValue;
11236 	static int minIndex = -1;     //minIndex+width_offset = candidate width
11237 	static MS_U8 BLKN_adj[MaxWidth] = {0};   //Normalized histogram
11238 	static MS_U8 BLKN_mark[MaxWidth] = {0}; //blockness marking array
11239 	//static MS_U8 BlockinessCheckIIR[MaxWidth] = { 0 };
11240 	static int iniIndex = 0; 		//initial point for marking
11241 	//For width calculation
11242 	static int WidthCandidate[paraSize];
11243 	static int WidthDiffHW[paraSize];
11244 	static int WidthCandIdx[paraSize];
11245 	static int StartPoint[paraSize];
11246 	static int MaxMinDiff = 0;
11247 	static int WidthAvg = 0;
11248 
11249 	static long FrameBLKStrIIR = 0;
11250 	static int maxHitRate = 0;
11251 	static int cnt = 0;
11252 	static int width, validCount, NumW;
11253 	static MS_BOOL MarkSuccess = 0;
11254 	static MS_U8 u8SD2HDValue;
11255 	static int MarkConfidence = 0;
11256 	int bin;
11257 	static int zeroCnt;
11258 	//static MS_BOOL artificialPattern = 0;
11259 	const int partIni = 0;
11260 	//Partition Parameters
11261 	int BLKADJ_S = partIni+1; // 1
11262 	int BLKADJ_E = BLKADJ_S+ADJTIMESLOT-1; //1
11263 	int BLKNINTW = BLKADJ_E+1;//2
11264 	int BLKCNTNUMW = BLKNINTW+1;//3
11265 	int BLKVRFNINTW_S = BLKCNTNUMW+1;//4
11266 	int BLKVRFNINTW_E = BLKVRFNINTW_S+2;//6
11267 	int BLKOUTWID_S = BLKVRFNINTW_E+1;//7
11268 	int BLKOUTWID_E = BLKOUTWID_S+MARKTIMESLOT-1;//7
11269 	int BLK_FRMSTR = BLKOUTWID_E+1;//8
11270 	int BLKIIR_S = BLK_FRMSTR+1;//9
11271 	int BLKIIR_E = BLKIIR_S+1;//10
11272 	//Partition Parameters End
11273 
11274 	if ( (*partiCounter) == partIni)
11275 	{
11276 		setHDDefaultParam(pInstance);
11277 		u8SD2HDValue = _hdsddFilterBaseReport;
11278 
11279 		if (frameWidth <=800) //SD
11280 		{
11281 			markDefValue = 0x6;
11282 			markValue	   = 0xC;
11283 		}
11284 		else if (frameWidth <=1980) //HD
11285 		{
11286 			markDefValue = 0x4;
11287 			markValue	   = 0x8;
11288 		}
11289 		else if (frameWidth >=3840) //UHD
11290 		{
11291 			markDefValue = 0x4;
11292 			markValue	   = 0x8;
11293 		}
11294 		else
11295 		{
11296 			markDefValue = 0x4;
11297 			markValue	   = 0x8;
11298 		}
11299 		WidthAvg = 0;
11300 		MaxMinDiff = 0;
11301 
11302 		iniIndex = 0;
11303 		minIndex = -1;
11304 		MarkSuccess = 0;
11305 		MarkConfidence = 0;
11306 		zeroCnt = 0;
11307 		validCount = 0;
11308 		//artificialPattern = false;
11309 		for (bin=0; bin < frameWidth; bin++)
11310 		{
11311 			BLKN_mark[bin] = markDefValue;
11312 			BlockinessCheck[bin] = markDefValue;
11313 		}
11314 	}
11315 	else if ( (*partiCounter >= BLKADJ_S) && (*partiCounter <= BLKADJ_E) )
11316 	{
11317 		//--------- Function Process start ---------//
11318 		//Histogram normalization
11319 		validCount += DBK_BlocknessAdjPart(histogram, BLKN_adj, &zeroCnt, (*partiCounter) - BLKADJ_S , markValue, markDefValue, ADJTIMESLOT );	//valid ratio too low -> weak blockness frame
11320 		if (zeroCnt > frameWidth/2 ) //early terminate
11321 		{
11322 			//artificialPattern = true;
11323 			(*partiCounter) = BLK_FRMSTR;
11324 		}
11325 	}
11326 	else if ( ((*partiCounter) == BLKNINTW) )
11327 	{
11328 		MaxMinDiff = 0;
11329 		WidthAvg = 0;
11330 		minIndex = DBK_WidthPartTop(pInstance, WidthDiffHW, &MaxMinDiff, &WidthAvg, u8SD2HDValue);
11331 		if (minIndex == -1)
11332 			minIndex = DBK_ComputeWidthPart( WidthDiffHW, WidthCandidate, WidthAvg);
11333 		else
11334 		{
11335 			for (bin=0;bin<paraSize;bin++)
11336 			{
11337 				if (minIndex==bin)
11338 					WidthCandidate[bin] = 1;
11339 				else
11340 					WidthCandidate[bin] = 0;
11341 			}
11342 		}
11343 	}
11344 	else if ( ((*partiCounter) == BLKCNTNUMW) )
11345 	{
11346 		maxHitRate = 0;
11347 		cnt = 0;
11348 		NumW = 0;
11349 		for (bin=0;bin<paraSize;bin++) // count number of frequencies
11350 		{
11351 			if (WidthCandidate[bin] == 1)
11352 			{
11353 				WidthCandIdx[NumW] = bin;
11354 				NumW++;
11355 				StartPoint[bin] = DBK_StPtLeft(paraWidth[bin], BLKN_adj, frameWidth*1/4, frameWidth*3/4);
11356 				//StartPoint[bin] = DBK_StPtLeft(paraWidth[bin], BLKN_adj, 100, 100 + frameWidth/8 );
11357 			}
11358 		}
11359 	}
11360 	else if ( ((*partiCounter) >= BLKVRFNINTW_S) && ((*partiCounter) <= BLKVRFNINTW_E) )
11361 	{
11362 		if ((*partiCounter)-(BLKVRFNINTW_S) >= NumW-1 )
11363 			(*partiCounter) = BLKVRFNINTW_E;
11364 		if (NumW-((*partiCounter)-BLKVRFNINTW_S)-1 >= 0)
11365 		{
11366 			DBK_VerifyWidthPart( WidthCandidate, BLKN_adj, WidthCandIdx[NumW-((*partiCounter)-BLKVRFNINTW_S)-1], &maxHitRate, &minIndex, &cnt, StartPoint[WidthCandIdx[NumW-((*partiCounter)-BLKVRFNINTW_S)-1]], u8SD2HDValue, markDefValue);
11367     }
11368 	}
11369 	else if ( ((*partiCounter) >= BLKOUTWID_S) && ((*partiCounter) <= BLKOUTWID_E) )
11370 	{
11371 		if (minIndex >= 0 )
11372 		{
11373 			width = paraWidth[minIndex];
11374 			iniIndex = StartPoint[minIndex];
11375 			if (width == 32) //no such pattern yet, only artificials
11376 			{
11377 				minIndex = -1;
11378 				width = 5;
11379 			}
11380 		}
11381 		else
11382 			width = 5;
11383 		//--------- Mark Position and verification start ---------//
11384 		//Check frame blockness strength and mark success
11385 		if( (minIndex == -1) || (validCount<0x10))//(validRatio*width < 256))
11386 			width = WidthIIR;
11387 		else
11388 		{
11389                         if(frameWidth <= 800)
11390                         {
11391 			    DBK_bypassmark(BLKN_mark, BLKN_adj);
11392                             MarkConfidence = 255;
11393                         }
11394                         else
11395                         {
11396         		    if ( WidthIIR==8 && width==16 )
11397 			        MarkConfidence = DBK_Mark(BLKN_mark, BLKN_adj, WidthIIR, iniIndex,  markDefValue)+32;
11398 			    else
11399 				MarkConfidence = DBK_Mark(BLKN_mark, BLKN_adj, width, iniIndex,  markDefValue);
11400                         }
11401 			if ( (*partiCounter) == BLKOUTWID_E )
11402 			{
11403 				MarkSuccess = (MarkConfidence >= hitrate_threshold*1 ) ;
11404 				WidthIIR_H(width);
11405 
11406 				WidthToRegister(pInstance,WidthIIR);
11407 				FeedBackSD2HD(pInstance,WidthIIR, 0);
11408 			}
11409 		}
11410 	}
11411 	else if (((*partiCounter) == BLK_FRMSTR) )
11412 	{
11413 		if ( !MarkSuccess )
11414 			FrameBLKStrTmp = 0;
11415 		FrameBLKStrIIR = (FrameBLKStrTmp + FrameBLKStrIIR*3 )>>2;
11416 		return FrameBLKStrIIR;
11417 	}
11418 	else if ( ((*partiCounter) >= BLKIIR_S) && ((*partiCounter) <= BLKIIR_E) )//mark blockness points	+ IIR
11419 		//BlkStrIIRPart(1/*MarkSuccess*/, BlockinessCheck, BlockinessCheckIIR, BLKN_mark, markDefValue, (*partiCounter)-BLKIIR_S);
11420    		BlkStrIIRPart(MarkSuccess, BlockinessCheck, BLKN_mark, markDefValue, (*partiCounter)-BLKIIR_S, 0);
11421 	else
11422 	{
11423 		//DRVSCA_DBG(PRT_TRP(" Invalid partition number %d\n",partiCounter));
11424 	}
11425 	return -1;
11426 }
11427 #if 0
11428 int DBK_Detect_Partition( void *pInstance,int* BlockinessCheck, long* histogram, int* partiCounter, const MS_U8 _hdsddFilterBaseReport
11429 			 , MS_BOOL isSceneChangeMc, long FrameBLKStrTmp) // deblocking detect new test algorithm
11430 {
11431 	//Declaration
11432 	static MS_U8 markDefValue, markValue;
11433 	static int minIndex = -1;     //minIndex+width_offset = candidate width
11434 	static MS_U8 BLKN_adj[MaxWidth] = {0};   //Normalized histogram
11435 	static MS_U8 BLKN_mark[MaxWidth]; //blockness marking array
11436 	static int iniIndex = 0; 		//initial point for marking
11437 	//For width calculation
11438 	static int WidthCandidate[paraSize];
11439 	static int WidthDiffHW[paraSize];
11440 	static int WidthCandIdx[paraSize];
11441 	static int StartPoint[paraSize];
11442 	static int MaxMinDiff = 0;
11443 	static int WidthAvg = 0;
11444 
11445 //	static long FrameEdg = 0;
11446 //	static long FrameBlk = 0;
11447 //	static long FrameDet = 0;
11448 
11449 	static long FrameBLKStrIIR = 0;
11450 
11451 	static int maxHitRate = 0;
11452 	static int cnt = 0;
11453 	static int width, validCount, NumW;
11454 	static MS_U32 SystemTime1=0;
11455 	static MS_BOOL MarkSuccess = 0;
11456 	//static int formatMode;
11457 	static MS_U8 u8SD2HDValue;
11458 	int MarkConfidence = 0;
11459 	int bin;
11460 //	static MS_U8 cpxGain = 0;
11461 	static int zeroCnt;
11462 
11463 	//Partition Parameters
11464 	const int partIni = 3;
11465 	const int BLKADJ_S = partIni+1; // 4
11466 	const int BLKADJ_E = BLKADJ_S+2; //6
11467 	const int BLKNINTW = BLKADJ_E+1;//7
11468 	const int BLKCNTNUMW = BLKNINTW+1;//8
11469 	const int BLKVRFNINTW_S = BLKCNTNUMW+1;//9
11470 	const int BLKVRFNINTW_E = BLKVRFNINTW_S+2;//11
11471 	const int BLKOUTWID = BLKVRFNINTW_E+1;//12
11472 	const int BLK_FRMSTR = BLKOUTWID+1;//13
11473 	const int BLKIIR_S = BLK_FRMSTR+1;//14
11474 	const int BLKIIR_E = BLKIIR_S+1;//15
11475 	if (isSceneChangeMc)
11476 	{
11477 		FrameBLKStrIIR = FrameBLKStrIIR;///2;
11478 	}
11479 	//Partition Parameters End
11480 
11481 
11482 	if ( (*partiCounter) == partIni)
11483 	{
11484 		setHDDefaultParam();
11485 
11486 		u8SD2HDValue = _hdsddFilterBaseReport;
11487 
11488 		//complex gain control
11489 		//cpxGain = BWPatchDBK(lumaHistogram, colorsum, uComplex, me1Still, mvNotFound, /*nonMv0Comfirm,*/ mv0Comfirm);
11490 
11491 
11492 		//Get mark strength info
11493 		//mark strength 1.3 bits: 8 = 1.0x, 15 = 1.9x (max), 0 = disable pixel based
11494 		MS_U8 markValueIn = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK30_0F_L, 0x00FF);
11495 		if (markValueIn > 0)
11496 		{
11497 			markDefValue = (markValueIn & 0x0F   );
11498 			markValue	   = (markValueIn & 0xF0)>>4;
11499 		}
11500 		else
11501 		{
11502 			markDefValue = 0x4;
11503 			markValue	   = 0x8;
11504 		}
11505 
11506 		WidthAvg = 0;
11507 		MaxMinDiff = 0;
11508 
11509 		iniIndex = 0;
11510 		minIndex = -1;
11511 		MarkSuccess = 0;
11512 		MarkConfidence = 0;
11513 		zeroCnt = 0;
11514 		validCount = 0;
11515 
11516 		SystemTime1=MsOS_GetSystemTime();
11517 		for (bin=0; bin < frameWidth; bin++)
11518 		{
11519 			BLKN_mark[bin] = markDefValue;
11520 			BlockinessCheck[bin] = markDefValue;
11521 		}
11522 		SystemTime1=MsOS_GetSystemTime()-SystemTime1;
11523 	}
11524 	else if ( (*partiCounter >= BLKADJ_S) && (*partiCounter <= BLKADJ_E) )
11525 	{
11526 		//--------- Function Process start ---------//
11527 		//Histogram normalization
11528 		validCount += DBK_BlocknessAdjPart(histogram, BLKN_adj, &zeroCnt, (*partiCounter) - BLKADJ_S , markValue, markDefValue);	//valid ratio too low -> weak blockness frame
11529 		if (zeroCnt > frameWidth/2 ) //early terminate
11530 		{
11531 			(*partiCounter) = BLK_FRMSTR;
11532 		}
11533 
11534 //		validRatio = validCount*256/frameWidth;
11535 	}
11536 	else if ( ((*partiCounter) == BLKNINTW) )
11537 	{
11538 		MaxMinDiff = 0;
11539 		WidthAvg = 0;
11540 		/*        if (u8SD2HDValue >= 60)
11541 		DEBUG_LC_5E(1);
11542 		else if (u8SD2HDValue == 0)
11543 		DEBUG_LC_5E(2);
11544 		else
11545 		DEBUG_LC_5E(0);	*/
11546 		minIndex = DBK_WidthPartTop( WidthDiffHW, &MaxMinDiff, &WidthAvg, u8SD2HDValue);
11547 		if (minIndex == -1)
11548 			minIndex = DBK_ComputeWidthPart( WidthDiffHW, WidthCandidate, WidthAvg);
11549 		else
11550 		{
11551 			for (bin=0;bin<paraSize;bin++)
11552 			{
11553 				if (minIndex==bin)
11554 					WidthCandidate[bin] = 1;
11555 				else
11556 					WidthCandidate[bin] = 0;
11557 			}
11558 		}
11559 	}
11560 	else if ( ((*partiCounter) == BLKCNTNUMW) )
11561 	{
11562 		maxHitRate = 0;
11563 		cnt = 0;
11564 		NumW = 0;
11565 		for (bin=0;bin<paraSize;bin++) // count number of frequencies
11566 		{
11567 			if (WidthCandidate[bin] == 1)
11568 			{
11569 				WidthCandIdx[NumW] = bin;
11570 				NumW++;
11571 				StartPoint[bin] = DBK_StPtLeft(paraWidth[bin], BLKN_adj, frameWidth*1/4, frameWidth*3/4);
11572 			}
11573 		}
11574 	}
11575 	else if ( ((*partiCounter) >= BLKVRFNINTW_S) && ((*partiCounter) <= BLKVRFNINTW_E) )
11576 	{
11577 		if ((*partiCounter)-(BLKVRFNINTW_S) >= NumW-1 )
11578 		{
11579 			(*partiCounter) = BLKVRFNINTW_E;
11580 		}
11581 		if (NumW-((*partiCounter)-BLKVRFNINTW_S)-1 >= 0)
11582 		DBK_VerifyWidthPart( WidthCandidate, BLKN_adj, WidthCandIdx[NumW-((*partiCounter)-BLKVRFNINTW_S)-1], &maxHitRate, &minIndex, &cnt, StartPoint[WidthCandIdx[NumW-((*partiCounter)-BLKVRFNINTW_S)-1]], u8SD2HDValue, markDefValue);
11583 	}
11584 	else if ( (*partiCounter) == BLKOUTWID)
11585 	{
11586 		if (minIndex >= 0 )
11587 		{
11588 			width = paraWidth[minIndex];
11589 			iniIndex = StartPoint[minIndex];
11590 			if (width == 32) //no such pattern yet, only artificials
11591 			{
11592 				minIndex = -1;
11593 				width = 5;
11594 			}
11595 		}
11596 		else
11597 			width = 5;
11598 		//--------- Compute Width and initial points end ---------//
11599 
11600 		//--------- Mark Position and verification start ---------//
11601 		//Check frame blockness strength and mark success
11602 		//DEBUG_LC_Full6bit2(validCount);
11603 		if( (minIndex == -1) || (validCount<0x10))//(validRatio*width < 256))
11604 		{
11605 			width = WidthIIR;
11606 
11607 		}
11608 		else
11609 		{
11610 
11611 			//MarkConfidence = 255;
11612 
11613                         if(frameWidth <= 800)
11614                         {
11615 			    DBK_bypassmark(BLKN_mark, BLKN_adj);
11616                             MarkConfidence = 255;
11617                         }
11618                         else
11619                         {
11620 			if ( WidthIIR==8 && width==16 )
11621 				MarkConfidence = DBK_Mark(BLKN_mark, BLKN_adj, WidthIIR, iniIndex,  markDefValue)+32;
11622 			else
11623 				MarkConfidence = DBK_Mark(BLKN_mark, BLKN_adj, width, iniIndex,  markDefValue);
11624                         }
11625 			//DEBUG_LC_Full6bit(MarkConfidence/4);
11626 
11627 			MarkSuccess = (MarkConfidence >= hitrate_threshold ) ;
11628 			WidthIIR_H(width);
11629 
11630 			//DEBUG_LC_DBKWidth(WidthIIR);
11631 			//write width to register for backward compatibility
11632 			WidthToRegister(WidthIIR);
11633 			//FeedBackSD2HD(WidthIIR, u8SD2HDValue);
11634 			FeedBackSD2HD(WidthIIR, 0);
11635 		}
11636 	}
11637 	else if (((*partiCounter) == BLK_FRMSTR) )
11638 	{
11639 		if ( !MarkSuccess )
11640 			FrameBLKStrTmp = 0;//FrameEdg;
11641 
11642 		FrameBLKStrIIR = (FrameBLKStrTmp + FrameBLKStrIIR*3 )>>2;
11643 
11644 		return FrameBLKStrIIR;
11645 	}
11646 	else if ( ((*partiCounter) == BLKIIR_S)  || ((*partiCounter) == BLKIIR_E) )
11647 	{
11648 		//mark blockness points + IIR
11649 		//BlkStrIIR(MarkSuccess, BlockinessCheck, BLKN_mark, markDefValue, frameWidth);
11650 		BlkStrIIRPart(MarkSuccess, BlockinessCheck, BLKN_mark, markDefValue, (*partiCounter)-BLKIIR_S, 1);
11651 		//BlkStrIIRPart(MarkSuccess, BlockinessCheck, BLKN_mark, markDefValue, (*partiCounter)-BLKIIR_S, formatMode);
11652 		//--------- Mark Position and verification end ---------//
11653 	}
11654 
11655 	//--------- Mark Position and verification end ---------//
11656 	else
11657 	{
11658 		//DRVSCA_DBG(PRT_TRP(" Invalid partition number %d\n",partiCounter));
11659 	}
11660 	return -1;
11661 }
11662 #endif
readVHistogramPart(void * pInstance,long * histogram,int partIndex,int VSRAMTIMESLOT)11663 int readVHistogramPart(void *pInstance,long* histogram, int partIndex, int VSRAMTIMESLOT)
11664 {
11665 	int data_ack_en;
11666 	int bin;
11667 	int IniPos, EndPos;
11668 	if( (partIndex < VSRAMTIMESLOT) && (VSRAMTIMESLOT!=0) )
11669 	{
11670 		IniPos = frameHeight*partIndex/VSRAMTIMESLOT;
11671 		EndPos = frameHeight*(partIndex+1)/VSRAMTIMESLOT;
11672 	}
11673 	else
11674 	{
11675 		IniPos = 0;
11676 		EndPos = 0;
11677 		return 0;
11678 	}
11679 #if 0
11680 	if (partIndex == 0)
11681 	{
11682 		IniPos = 0;
11683 		EndPos = frameHeight/2;
11684 	}
11685 	else if (partIndex == 1)
11686 	{
11687 		IniPos = frameHeight/2;
11688 		EndPos = frameHeight;
11689 	}
11690 	else
11691 	{
11692 		IniPos = 0;
11693 		EndPos = 0;
11694 		return 0;
11695 	}
11696 #endif
11697 	//--------- Blockiness Histogram Request start ---------//
11698 	if (partIndex == 0)
11699 	{
11700 		// write 1 to request register
11701 		MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 1, 0x0001); //reg_bkn_statistic_ack
11702 	}
11703 	if (1)
11704 	{
11705 		//--------- Blockiness Histogram Acknowledge start ---------//
11706 		data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK60_7D_L, 0x0002); //reg_bkn_width_statistic_ack
11707 		//--------- Function Process start ---------//
11708 		if(data_ack_en)
11709 		{
11710 			// write 1 to sram_io_en register
11711 			MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0x0100, 0x0100); //reg_bkn_sram_io_en
11712 			for(bin = IniPos; bin < EndPos; bin++)
11713 			{
11714 				MApi_XC_W2BYTEMSK(REG_SC_BK60_7E_L, (MS_U16)(0x8000 + bin), 0xFFFF); //reg_bkn_ioaddr
11715 				// read data from selected address
11716 				histogram[bin] = MApi_XC_R2BYTEMSK(REG_SC_BK60_7F_L, 0xFFFF) ; //reg_bkn_iordata
11717 
11718 			}
11719 			if (partIndex == VSRAMTIMESLOT-1)
11720 				MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0, 0x0001);//reg_bkn_statistic_ack
11721 			return 1;
11722 		}
11723 		else//(!data_ack_en)
11724 		{
11725 			return 0;
11726 		}
11727 	}
11728 }
11729 
DBK_Mark_Ver(void * pInstance,MS_U8 * BLKN_mark,MS_U8 * BLKN_adj,int width,int iniIndex,MS_U8 markDefValue)11730 int DBK_Mark_Ver(void *pInstance,MS_U8* BLKN_mark, MS_U8 *BLKN_adj, int width, int iniIndex, MS_U8 markDefValue)
11731 {
11732 	int restart=0;
11733 	int misscnt = 0;
11734 	int ThValue = 2;
11735 	int hitrate = 0;
11736 	int bin, CurV, idx, idx1;
11737 	int candiSP, sp;
11738 	MS_BOOL hit;
11739 	int offset;
11740 	int n8[50];
11741 	int maxOri, maxOriInd, pos_fac, range, dummy, r;
11742 	int maxLocal = 0;
11743 	int sndLocal = 0;
11744 	int maxIndex = 0;
11745 	int sndIndex = 0;
11746 	int BLKN_adj_comb;
11747 
11748 	misscnt = 0;
11749 	//initialize start points
11750 	sp = iniIndex;
11751 	offset = 4;//8;
11752 	if (width >= 16)
11753 		offset = 8;//16;
11754 	range = (width*2+4)>>3;
11755 	r = (width+4)/8;
11756 	dummy = ThValue *(width + offset)/offset;
11757 
11758 	//sp
11759 	BLKN_mark[sp] = BLKN_adj[sp];
11760 	BLKN_mark[sp-1] = BLKN_adj[sp-1];
11761 	BLKN_mark[sp+1] = BLKN_adj[sp+1];
11762 	hitrate++;
11763 	//right hand side
11764 	for ( CurV=sp+width; CurV<frameHeight; )
11765 	{
11766 		maxOri = 0;
11767 		maxOriInd = -1;
11768 		maxLocal = 0;
11769 		sndLocal = 0;
11770 		maxIndex = 0;
11771 		sndIndex = 0;
11772 		for (bin=0; bin<width;bin++)
11773 		{
11774 			idx = __minmax(CurV+(bin-(width-1)/2), 0, frameHeight-1);
11775 			idx1= __minmax(idx+1, 0, frameHeight-1);
11776 			BLKN_adj_comb = __min(BLKN_adj[idx], BLKN_adj[idx1]);
11777 			if ( BLKN_adj_comb > maxOri)
11778 			{
11779 				maxOri = BLKN_adj_comb;
11780 				maxOriInd = bin;
11781 			}
11782 			if ( (bin<=width/4) || (bin>=width*3/4) )
11783 				n8[bin] =0;
11784 			else
11785 			{
11786 				pos_fac = (width-1)/2 - abs(bin-(width-1)/2) + offset;
11787 				n8[bin]= (BLKN_adj_comb * pos_fac + (offset/2) )/offset;
11788 				if ( n8[bin] > maxLocal)
11789 				{
11790 					maxLocal = n8[bin];
11791 					maxIndex = bin;
11792 				}
11793 			}
11794 		}
11795 
11796 		for (bin=(0-range); bin<=range; bin++)
11797 		{
11798 			if( (bin!=0 ) && ((maxIndex+bin) >=0) && ((maxIndex+bin) < width) )
11799 			{
11800 				if (n8[maxIndex+bin] > sndLocal)
11801 				{
11802 					sndLocal = n8[maxIndex+bin];
11803 					sndIndex = bin; //related to maxIndex
11804 				}
11805 			}
11806 		}
11807 		idx = __minmax(CurV+(maxIndex-(width-1)/2), 0, frameHeight-1);
11808 		idx1= __minmax(idx+1, 0, frameHeight-1);
11809 		BLKN_adj_comb = __min(BLKN_adj[idx], BLKN_adj[idx1]);
11810 		hit = ( maxOri <= BLKN_adj_comb )|| ( (maxOriInd>=__min(maxIndex, maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex, maxIndex+sndIndex) ) );
11811 
11812 		if ( (!hit) || (maxLocal <= dummy) )
11813 		{
11814 			misscnt++;
11815 		}
11816 		if ((maxLocal > dummy) && (misscnt <= 2))
11817 		{
11818 			CurV = idx; //adjust to max position
11819 
11820 			if (hit)
11821 			{
11822 				misscnt=0;
11823 				BLKN_mark[CurV] = BLKN_adj[CurV];
11824 				if (CurV+1 < frameHeight)
11825 					BLKN_mark[CurV+1] = BLKN_adj[CurV+1];
11826 				if (CurV-1 >= 0)
11827 					BLKN_mark[CurV-1] = BLKN_adj[CurV-1];
11828 			}
11829 			else
11830 			{
11831 				BLKN_mark[CurV] = BLKN_adj[CurV]/2;
11832 				if (CurV+1 < frameHeight)
11833 					BLKN_mark[CurV+1] = BLKN_adj[CurV+1]/2;
11834 				if (CurV-1 >= 0)
11835 					BLKN_mark[CurV-1] = BLKN_adj[CurV-1]/2;
11836 			}
11837 			/* // fill the gap between top 2 strength within range 4, pass in VDBK
11838 			if (BLKN_adj[CurV+sndIndex] > ThValue )
11839 			{
11840 			if ( (sndIndex <= range-2 ) && (sndIndex > 0) )
11841 			{
11842 			if ( (CurV-1) >=0 )
11843 			BLKN_mark[CurV-1] = BLKN_adj[CurV-1];
11844 			if ( (CurV+sndIndex+1) < frameHeight)
11845 			BLKN_mark[CurV+sndIndex+1] = BLKN_adj[CurV+sndIndex+1];
11846 			}
11847 			else if ( (sndIndex <0) && (sndIndex >= ((-1)*(range-2)) ) )
11848 			{
11849 			if ( (CurV+1) < frameHeight)
11850 			BLKN_mark[CurV+1] = BLKN_adj[CurV+1];
11851 			if ( (CurV+sndIndex-1) >= 0 )
11852 			BLKN_mark[CurV+sndIndex-1] = BLKN_adj[CurV+sndIndex-1];
11853 			}
11854 			for (bin=__min(0, sndIndex); bin<=__max(0, sndIndex);bin++)
11855 			{
11856 			if ((CurV+bin >= 0) && (CurV+bin <frameHeight))
11857 			BLKN_mark[CurV+bin] = BLKN_adj[CurV+bin];
11858 			}
11859 			CurV = CurV + ((sndIndex)/2); // move to center
11860 			}*/
11861 			CurV += width;
11862 			hitrate++;
11863 		}
11864 		else if (misscnt > 2)
11865 		{
11866 			candiSP = DBK_StPtLeft( width, (MS_U8*)BLKN_adj, CurV, __min(CurV+40, frameHeight));
11867 			if (candiSP != 9999)
11868 			{
11869 				restart++;
11870 				if (restart > 5)
11871 					return 0;
11872 				if ( (abs(candiSP - CurV)%width) != 0 )
11873 				{
11874 					for (bin=-4;bin<=4;bin++)
11875 					{
11876 						if ( ((CurV+bin) <frameHeight) && (CurV+bin >=0) && (BLKN_mark[CurV+bin]>0) )
11877 							BLKN_mark[CurV+bin] = markDefValue;
11878 						if ( ((CurV-width+bin) <frameHeight) && ((CurV-width+bin) >=0) && (BLKN_mark[CurV-width+bin]>0) )
11879 							BLKN_mark[CurV-width+bin] = markDefValue;
11880 						if ( ((CurV-width*2+bin) <frameHeight) && ((CurV-width*2+bin) >=0) && (BLKN_mark[CurV-width*2+bin]>0) )
11881 							BLKN_mark[CurV-width*2+bin] = markDefValue;
11882 					}
11883 				}
11884 				misscnt = 0;
11885 				CurV = candiSP;
11886 
11887 				for (bin=-r;bin<=r;bin++)
11888 				{
11889 					if (((CurV+bin)>=0) && ((CurV+bin) <frameHeight) )
11890 						BLKN_mark[CurV+bin] = BLKN_adj[CurV+bin];
11891 					if (((CurV-width+bin)>=0) && ((CurV-width+bin) <frameHeight) )
11892 						BLKN_mark[CurV-width+bin] = BLKN_adj[CurV-width+bin];
11893 					if (((CurV-width*2+bin)>=0) && ((CurV-width*2+bin) <frameHeight) )
11894 						BLKN_mark[CurV-width*2+bin] = BLKN_adj[CurV-width*2+bin];
11895 				}
11896 
11897 				CurV += width;
11898 			}
11899 			else
11900 			{
11901 				for (bin = CurV; bin< __min((CurV+40), frameHeight); bin= bin+width )
11902 				{
11903 					if (bin-width >= 0)
11904 					BLKN_mark[bin] = (BLKN_adj[bin]+BLKN_adj[bin-width])/2;
11905 				}
11906 				CurV += 40;
11907 			}
11908 		}
11909 		else
11910 		{
11911 			BLKN_mark[CurV] = BLKN_adj[CurV]/2;
11912 			if (CurV+1 < frameHeight)
11913 				BLKN_mark[CurV+1] = BLKN_adj[CurV+1]/2;
11914 			if (CurV-1 >= 0)
11915 				BLKN_mark[CurV-1] = BLKN_adj[CurV-1]/2;
11916 			CurV += width;
11917 		}
11918 	}
11919 	misscnt=0;
11920 	//left hand side
11921 	for (CurV=sp-width; CurV >= (width)/2;)
11922 	{
11923 		maxOri = 0;
11924 		maxOriInd = -1;
11925 		maxLocal = 0;
11926 		sndLocal = 0;
11927 		maxIndex = 0;
11928 		sndIndex = 0;
11929 		for (bin=0; bin<width;bin++)
11930 		{
11931 			idx = __minmax(CurV+(bin-(width)/2), 0, frameHeight);
11932 			BLKN_adj_comb = __min(BLKN_adj[idx], BLKN_adj[idx+1]);
11933 			if (BLKN_adj_comb > maxOri)
11934 			{
11935 				maxOri = BLKN_adj_comb;
11936 				maxOriInd = bin;
11937 			}
11938 			if ( (bin<=(width/4)) || (bin>=(width*3/4)) )
11939 				n8[bin] =0;
11940 			else
11941 			{
11942 				pos_fac = (width)/2 - abs(bin-(width)/2) + offset;
11943 				n8[bin]= (BLKN_adj_comb * pos_fac + (offset/2) )/offset;
11944 				if ( n8[bin] > maxLocal)
11945 				{
11946 					maxLocal = n8[bin];
11947 					maxIndex = bin;
11948 				}
11949 			}
11950 		}
11951 
11952 		for (bin=(0-range); bin<=range; bin++)
11953 		{
11954 			if( (bin!=0) &&  ((maxIndex+bin) >=0) && ((maxIndex+bin) < width) )
11955 			{
11956 				if (n8[maxIndex+bin] > sndLocal)
11957 				{
11958 					sndLocal = n8[maxIndex+bin];
11959 					sndIndex = bin; //related to maxIndex
11960 				}
11961 			}
11962 		}
11963 		idx = __minmax(CurV+(maxIndex-(width+1)/2), 0, frameHeight);
11964 		idx1= __minmax(idx+1, 0, frameHeight-1);
11965 		BLKN_adj_comb = __min(BLKN_adj[idx], BLKN_adj[idx1]);
11966 		hit = ( maxOri <= BLKN_adj_comb ) || ( (maxOriInd>=__min(maxIndex,maxIndex+sndIndex) )&& (maxOriInd <= __max(maxIndex,maxIndex+sndIndex) ) );
11967 
11968 		if ( (!hit) || (maxLocal <= dummy) )
11969 		{
11970 			misscnt++;
11971 		}
11972 		if ((maxLocal > dummy) && (misscnt <= 2) )
11973 		{
11974 			CurV = idx; //adjust to max position
11975 			if (hit)
11976 			{
11977 
11978 				misscnt=0;
11979 				BLKN_mark[CurV] = BLKN_adj[CurV];
11980 				if (CurV+1 < frameHeight)
11981 					BLKN_mark[CurV+1] = BLKN_adj[CurV+1];
11982 				if (CurV-1 >= 0)
11983 					BLKN_mark[CurV-1] = BLKN_adj[CurV-1];
11984 			}
11985 			else
11986 			{
11987 				BLKN_mark[CurV] = BLKN_adj[CurV]/2;
11988 				if (CurV+1 < frameHeight)
11989 					BLKN_mark[CurV+1] = BLKN_adj[CurV+1]/2;
11990 				if (CurV-1 >= 0)
11991 					BLKN_mark[CurV-1] = BLKN_adj[CurV-1]/2;
11992 			}
11993 
11994 			/*// fill the gap between top 2 strength within range 4
11995 			if (BLKN_adj[CurV+sndIndex] > ThValue )
11996 			{
11997 			if ( (sndIndex <=range-2) && (sndIndex > 0) )
11998 			{
11999 			if (CurV-1 >= 0)
12000 			BLKN_mark[CurV-1] = BLKN_adj[CurV-1];
12001 			if (CurV+sndIndex+1 < frameHeight)
12002 			BLKN_mark[CurV+sndIndex+1] = BLKN_adj[CurV+sndIndex+1];
12003 			}
12004 			else if ( (sndIndex <0) && (sndIndex >= (-1)*(range-2)) )
12005 			{
12006 			if (CurV+1 < frameHeight)
12007 			BLKN_mark[CurV+1] = BLKN_adj[CurV+1];
12008 			if (CurV+sndIndex-1 >= 0)
12009 			BLKN_mark[CurV+sndIndex-1] = BLKN_adj[CurV+sndIndex-1];
12010 			}
12011 			for (bin=__min(0, sndIndex); bin<=__max(0, sndIndex);bin++)
12012 			{
12013 			if ( ((CurV+bin) >= 0) && ((CurV+bin)<frameHeight) )
12014 			BLKN_mark[CurV+bin] = BLKN_adj[CurV+bin];
12015 			}
12016 			CurV = CurV + ((sndIndex)/2); // move to center
12017 			}
12018 			*/
12019 			CurV -= width;
12020 			hitrate++;
12021 			//cnt++;
12022 		}
12023 		else if (misscnt > 2)
12024 		{
12025 			candiSP = DBK_StPtLeft(width, BLKN_adj, __max((CurV-40), 0), CurV+1);
12026 			if (candiSP != 9999)
12027 			{
12028 				restart++;
12029 				if (restart > 5)
12030 					return 0;
12031 				if ( (abs(candiSP - CurV)%width) != 0 )
12032 				{
12033 					for (bin=-4;bin<=4;bin++)
12034 					{
12035 						if ( ((CurV+bin) >=0) && ((CurV+bin) <  frameHeight) && (BLKN_mark[CurV+bin] > 0) )
12036 							BLKN_mark[CurV+bin] = markDefValue;
12037 						if ( ((CurV+bin+width) >=0) && ((CurV+width+bin) <  frameHeight) && (BLKN_mark[CurV+width+bin] > 0))
12038 							BLKN_mark[CurV+width+bin] = markDefValue;
12039 						if ( ((CurV+bin+width*2) >=0) && ((CurV+width*2+bin) <  frameHeight) && (BLKN_mark[CurV+width*2+bin] > 0))
12040 							BLKN_mark[CurV+width*2+bin] = markDefValue;
12041 					}
12042 				}
12043 				misscnt = 0;
12044 				CurV = candiSP;
12045 
12046 
12047 				for (bin=-r;bin<=r;bin++)
12048 				{
12049 					if ((CurV+bin >= 0) && (CurV+bin <frameHeight) )
12050 						BLKN_mark[CurV+bin] = BLKN_adj[CurV+bin];
12051 					if (((CurV+width+bin) >= 0) && (CurV+width+bin <frameHeight) )
12052 						BLKN_mark[CurV+width+bin] = BLKN_adj[CurV+width+bin];
12053 					if (((CurV+width*2+bin) >= 0) && ((CurV+width*2+bin) <frameHeight) )
12054 						BLKN_mark[CurV+width*2+bin] = BLKN_adj[CurV+width*2+bin];
12055 				}
12056 				CurV -= width;
12057 			}
12058 			else
12059 			{
12060 				for (bin = CurV; bin > __max((CurV-40), 0); bin= bin-width )
12061 				{
12062 					if (bin+width<frameHeight)
12063 					BLKN_mark[bin] = (BLKN_adj[bin]+BLKN_adj[bin+width])/2;
12064 				}
12065 				CurV -= 40;
12066 			}
12067 		}
12068 		else
12069 		{
12070 			BLKN_mark[CurV] = BLKN_adj[CurV]/2;
12071 			if (CurV+1 < frameHeight)
12072 				BLKN_mark[CurV+1] = BLKN_adj[CurV+1]/2;
12073 			if (CurV-1 >= 0)
12074 				BLKN_mark[CurV-1] = BLKN_adj[CurV-1]/2;
12075 			CurV -= width;
12076 		}
12077 	}
12078 	return hitrate;
12079 }
12080 
DBK_Mark_Ver_Test(void * pInstance,MS_U8 * BLKN_mark,MS_U8 * BLKN_adj,const int width,const MS_U32 u32IniIndex,MS_U8 markValue,MS_U8 markDefValue)12081 int DBK_Mark_Ver_Test(void *pInstance,MS_U8* BLKN_mark, MS_U8 *BLKN_adj, const int width, const MS_U32 u32IniIndex, MS_U8 markValue, MS_U8 markDefValue)
12082 {
12083 	int hitrate = 0;
12084 	int CurV;
12085 	int MarkTh = 7;
12086 	int L1, R1;
12087 
12088 	//sp
12089 	BLKN_mark[u32IniIndex] = BLKN_adj[u32IniIndex];
12090 	if (u32IniIndex-1 >= 0)
12091 		BLKN_mark[u32IniIndex-1] = BLKN_adj[u32IniIndex-1];
12092 	if (u32IniIndex+1<frameHeight)
12093 		BLKN_mark[u32IniIndex+1] = BLKN_adj[u32IniIndex+1];
12094 	hitrate++;
12095 	//right hand side
12096 	for ( CurV=u32IniIndex+width; CurV<frameHeight; )
12097 	{
12098 
12099 		L1 = (CurV-width)<0?CurV:(CurV-width);
12100 		R1 = (CurV+width)>=frameHeight?CurV:(CurV+width);
12101 
12102 		//BLKN_mark[CurV] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV]*2+__max(BLKN_adj[R1],BLKN_adj[R2]))/*>>1*/, markDefValue, markValue);
12103 		BLKN_mark[CurV] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12104 		if (CurV-1 >= 0)
12105 		{
12106 			L1 = (CurV-1-width)   < 0 ? (CurV-1) : (CurV-1-width);
12107 			R1 = (CurV-1+width)  >= frameHeight ? (CurV-1) : (CurV-1+width);
12108 			//BLKN_mark[CurV-1] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV-1]*2+__max(BLKN_adj[R1],BLKN_adj[R2]))/*>>1*/, markDefValue, markValue);
12109 			BLKN_mark[CurV-1] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV-1]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12110 		}
12111 		if (CurV+1 < frameHeight)
12112 		{
12113 			L1 = (CurV+1-width)   < 0 ? (CurV+1) : (CurV+1-width);
12114 			R1 = (CurV+1+width)   >=frameHeight ? (CurV+1) : (CurV+1+width);
12115 			//BLKN_mark[CurV+1] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV+1]*2+__max(BLKN_adj[R1],BLKN_adj[R2]))/*>>1*/, markDefValue, markValue);
12116 			BLKN_mark[CurV+1] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV+1]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12117 		}
12118 		if (__max3(BLKN_mark[CurV], BLKN_mark[CurV-1], BLKN_mark[CurV+1]) > MarkTh )
12119 			hitrate++;
12120 		CurV += width;
12121 	}
12122 	//left hand side
12123 	for (CurV=u32IniIndex-width; CurV >= 0;)
12124 	{
12125 		L1 = (CurV-width)   < 0 ? CurV : (CurV-width);
12126 		R1 = (CurV+width)   >=frameHeight ? CurV : (CurV+width);
12127 		//BLKN_mark[CurV] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV]*2+__max(BLKN_adj[R1],BLKN_adj[R2]))/*>>1*/, markDefValue, markValue);
12128 		BLKN_mark[CurV] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12129 		if (CurV-1 >= 0)
12130 		{
12131 			L1 = (CurV-1-width)   < 0 ? (CurV-1) : (CurV-1-width);
12132 			R1 = (CurV-1+width)   >=frameHeight ? (CurV-1) : (CurV-1+width);
12133 			//BLKN_mark[CurV-1] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV-1]*2+__max(BLKN_adj[R1],BLKN_adj[R2]) )/*>>1*/, markDefValue, markValue);
12134 			BLKN_mark[CurV-1] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV-1]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12135 		}
12136 		if (CurV+1 < frameHeight)
12137 		{
12138 
12139 			L1 = (CurV+1-width)   < 0 ? (CurV+1) : (CurV+1-width);
12140 			R1 = (CurV+1+width)   >=frameHeight ? (CurV+1) : (CurV+1+width);
12141 
12142 			//BLKN_mark[CurV+1] = __minmax((__max(BLKN_adj[L1], BLKN_adj[L2])+BLKN_adj[CurV+1]*2+__max(BLKN_adj[R1], BLKN_adj[R2]) )/*>>1*/, markDefValue, markValue);
12143 			BLKN_mark[CurV+1] = __minmax((BLKN_adj[L1]+BLKN_adj[CurV+1]*2+BLKN_adj[R1])>>1, markDefValue, markValue);
12144 		}
12145 		if (__max3(BLKN_mark[CurV], BLKN_mark[CurV-1], BLKN_mark[CurV+1]) > MarkTh )
12146 			hitrate++;
12147 		CurV -= width;
12148 	}
12149 	return hitrate;
12150 }
12151 
writeToVSRAMPart(void * pInstance,MS_U8 * BlockinessCheck,int partIndex,int VSRAMTIMESLOT)12152 int writeToVSRAMPart(void *pInstance,MS_U8* BlockinessCheck, int partIndex, int VSRAMTIMESLOT)
12153 {
12154 	int bin;
12155 	int ack_flag =0;
12156 	//static int pos = 0;
12157 	int count = 0;
12158 	MS_U32 Data0, Data1, Data;
12159 	int IniPos, EndPos;
12160 	if( (partIndex < VSRAMTIMESLOT) && (VSRAMTIMESLOT!=0) )
12161 	{
12162 		IniPos = frameHeight*partIndex/VSRAMTIMESLOT;
12163 		EndPos = frameHeight*(partIndex+1)/VSRAMTIMESLOT;
12164 	}
12165 	else
12166 	{
12167 		IniPos = 0;
12168 		EndPos = 0;
12169 		return 0;
12170 	}
12171 	//WRITE TO BLOCKNESS POSITION SRAM
12172 	MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x8000,0x8000);//blkwei  sram IO enable: h0008(0x08) 8000 = 15th bit = 1
12173 
12174 
12175 	for(bin=IniPos; bin<EndPos;bin+=2)
12176 	{
12177 		Data0 = (BlockinessCheck[bin])  &0xF; //4bit
12178 		Data1 = (BlockinessCheck[bin+1])&0xF; //4bit
12179 		Data = (Data1<<4)|Data0; // Two 4bit combined to 8bit
12180 
12181 		MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, bin/2,0x0FFF);//blkwei  sram io address
12182 		MApi_XC_W2BYTEMSK(REG_SC_BK60_79_L,Data,0x00FF);//blkwei  sram write data
12183 		MApi_XC_W2BYTEMSK(REG_SC_BK60_79_L,0x8000,0x8000);//blkwei  sram write enable
12184 
12185 		//Sleep( 1);
12186 		ack_flag = (MApi_XC_R2BYTEMSK(REG_SC_BK60_78_L,0x4000)>>14); // 14th bit of h0008
12187 		count = 0;
12188 		while ((ack_flag==0)&&(count<10))
12189 		{
12190 			count++;
12191 
12192 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, bin/2,0x0FFF);//blkwei  sram io address
12193 			MApi_XC_W2BYTEMSK(REG_SC_BK60_79_L,Data,0x00FF);//blkwei  sram write data
12194 			MApi_XC_W2BYTEMSK(REG_SC_BK60_79_L,0x8000,0x8000);//blkwei  sram write enable
12195 			ack_flag = (MApi_XC_R2BYTEMSK(REG_SC_BK60_78_L,0x4000)>>14); // 14th bit of h0008
12196 		}
12197 	}
12198 	//pos = bin;
12199 	//MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12200 
12201 	return 1;
12202 }
WidthIIR_V(void * pInstance,int width)12203 void WidthIIR_V(void *pInstance,int width) // Width IIR Protection
12204 {
12205 	static int widthPP = 8;
12206 	static int widthP  = 8;
12207 	static int widthC  = 8;
12208 	MS_BOOL sw = 0;
12209 	if( (widthPP== widthP) && (widthP==widthC) && (widthC==width) )
12210 		sw = 1;
12211 	if (sw)
12212 		WidthIIR = width;
12213 	widthPP = widthP;
12214 	widthP = widthC;
12215 	widthC = width;
12216 }
VDBK_WidthPartHW(void * pInstance,int * WidthDiffHW,int * WidthCandidate)12217 int VDBK_WidthPartHW(void *pInstance,int *WidthDiffHW, int* WidthCandidate)
12218 {
12219 	int MaxMinDiff;
12220 	int avg =0;
12221 
12222 	int idx;
12223 	int maxWidthDiff  = 0;
12224 	int minWidthDiff  = 0x7FFFFFFF;
12225 	int min2WidthDiff = 0x7FFFFFFF;
12226 	int min3WidthDiff = 0x7FFFFFFF;
12227 	int min4WidthDiff = 0x7FFFFFFF;
12228 	int outWidth = -1;
12229 	int minIdx   = -1, min2Idx   = -1, min3Idx   = -1, min4Idx   = -1;
12230 	int minWidth = -1, min2Width = -1, min3Width = -1, min4Width = -1;
12231     int DiffThrd = 2048;
12232 	//long ScalingRatio = 1<<20;
12233 	long ScalingRatio = (MApi_XC_R2BYTEMSK(REG_SC_BK23_0A_L,0x00FF)<<16) + MApi_XC_R2BYTEMSK(REG_SC_BK23_09_L,0xFFFF);
12234 	const int OrigWidth = 8;
12235 	long EstWidth = (ScalingRatio*OrigWidth + (1<<19) ) >> 20;
12236 
12237     WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_60_L,0xFFFF); // width 5
12238     WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_61_L,0xFFFF); // width 6
12239     WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_62_L,0xFFFF); // width 7
12240     WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_63_L,0xFFFF); // width 8
12241     WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_64_L,0xFFFF); // width 9
12242     WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_65_L,0xFFFF); // width 10
12243     WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_66_L,0xFFFF); // width 11
12244     WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_67_L,0xFFFF); // width 12
12245     WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_68_L,0xFFFF); // width 13
12246     WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_69_L,0xFFFF); // width 14
12247     WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6A_L,0xFFFF); // width 15
12248     WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6B_L,0xFFFF); // width 16
12249     WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6C_L,0xFFFF); // width 17
12250     WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6D_L,0xFFFF); // width 18
12251     WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6E_L,0xFFFF); // width 19
12252     WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6F_L,0xFFFF); // width 20
12253     for(idx = 0 ; idx < paraVerSize ; idx++)
12254 	{
12255 		if (WidthDiffHW[idx] > maxWidthDiff)
12256 		{
12257 			maxWidthDiff = WidthDiffHW[idx];
12258 		}
12259 	}
12260     for(idx = 0 ; idx < paraVerSize -1; idx+=2)
12261 	{
12262 		if ( (idx==2 || idx==10 ) && (WidthDiffHW[idx+1] - WidthDiffHW[idx ] <= DiffThrd) )
12263 		{
12264 			WidthDiffHW[idx+1]= __min(WidthDiffHW[idx ], WidthDiffHW[idx+1]);
12265 			WidthDiffHW[idx  ]= maxWidthDiff;
12266 		}
12267 	}
12268 
12269 	for(idx = 0 ; idx < paraVerSize ; idx++)
12270 	{
12271 		WidthCandidate[idx] = 0;
12272 		avg += WidthDiffHW[idx];
12273 
12274 		if (WidthDiffHW[idx] < minWidthDiff)
12275 		{
12276 			min4WidthDiff = min3WidthDiff;
12277 			min4Idx = min3Idx;
12278 			min3WidthDiff = min2WidthDiff;
12279 			min3Idx = min2Idx;
12280 			min2WidthDiff = minWidthDiff;
12281 			min2Idx = minIdx;
12282 
12283 			minWidthDiff = WidthDiffHW[idx];
12284 			minIdx = idx;
12285 		}
12286 		else if (WidthDiffHW[idx] < min2WidthDiff)
12287 		{
12288 			min4WidthDiff = min3WidthDiff;
12289 			min4Idx = min3Idx;
12290 			min3WidthDiff = min2WidthDiff;
12291 			min3Idx = min2Idx;
12292 
12293 			min2WidthDiff = WidthDiffHW[idx];
12294 			min2Idx = idx;
12295 		}
12296 		else if (WidthDiffHW[idx] < min3WidthDiff)
12297 		{
12298 			min4WidthDiff = min3WidthDiff;
12299 			min4Idx = min3Idx;
12300 
12301 			min3WidthDiff = WidthDiffHW[idx];
12302 			min3Idx = idx;
12303 		}
12304 		else if (WidthDiffHW[idx] < min4WidthDiff)
12305 		{
12306 			min4WidthDiff = WidthDiffHW[idx];
12307 			min4Idx = idx;
12308 		}
12309 	}
12310 
12311     avg = avg / paraVerSize;
12312 	MaxMinDiff = maxWidthDiff - minWidthDiff;
12313 	if ( minIdx  != -1)
12314 		minWidth  = minIdx +5;
12315 	if ( min2Idx != -1)
12316 		min2Width = min2Idx+5;
12317 	if ( min3Idx != -1)
12318 		min3Width = min3Idx+5;
12319 	if ( min4Idx != -1)
12320 		min4Width = min4Idx+5;
12321 
12322 	//PRT_TRP(" --min4WidthDiff = %d, min4Idx=%d, min4Width =%d \n", min4WidthDiff, min4Idx, min4Width);
12323 	//PRT_TRP(" --min3WidthDiff = %d, min3Idx=%d, min3Width =%d \n", min3WidthDiff, min3Idx, min3Width);
12324 	//PRT_TRP(" --min2WidthDiff = %d, min2Idx=%d, min2Width =%d \n", min2WidthDiff, min2Idx, min2Width);
12325 	//PRT_TRP(" --minWidthDiff  = %d, minIdx =%d, minWidth  =%d \n", minWidthDiff , minIdx , minWidth );
12326 	//PRT_TRP(" --maxWidthDiff  = %d, maxIdx =%d \n", maxWidthDiff , maxIdx );
12327 	//PRT_TRP(" --avg  = %d \n", avg );
12328 	//PRT_TRP(" --MaxMinDiff  = %d \n", MaxMinDiff );
12329 
12330 	WidthCandidate[minIdx ] = 1;
12331 	if (MaxMinDiff > 0)
12332 	{
12333 	if ( (min2WidthDiff-minWidthDiff)*256/MaxMinDiff <48)
12334 		WidthCandidate[min2Idx] = 1;
12335 	if ( (min3WidthDiff-minWidthDiff)*256/MaxMinDiff <48)
12336 		WidthCandidate[min3Idx] = 1;
12337 	if ( (min4WidthDiff-minWidthDiff)*256/MaxMinDiff <48)
12338 		WidthCandidate[min4Idx] = 1;
12339 	}
12340 
12341 	if (minWidth == EstWidth || min2Width == EstWidth || min3Width == EstWidth || min4Width == EstWidth)
12342 		outWidth = EstWidth;
12343 	else if (minWidth == EstWidth*2 || min2Width == EstWidth*2 || min3Width == EstWidth*2 || min4Width == EstWidth*2)
12344 		outWidth = EstWidth;
12345 	else
12346 	{
12347 		if ( abs(min2Width - minWidth) == 1 )
12348 		{
12349 			if (min2Idx < minIdx)
12350 			{
12351 				WidthCandidate[ min2Idx] = 0;
12352 			}
12353 			else
12354 			{
12355 				WidthCandidate[ minIdx] = 0;
12356 			}
12357 		}
12358 		if ( abs(min3Width - minWidth) == 1 )
12359 		{
12360 			if (min3Idx < minIdx)
12361 			{
12362 				WidthCandidate[ min3Idx] = 0;
12363 			}
12364 			else
12365 			{
12366 				WidthCandidate[ minIdx] = 0;
12367 			}
12368 		}
12369 		if ( abs(min4Width - minWidth) == 1 )
12370 		{
12371 			if (min4Idx < minIdx)
12372 			{
12373 				WidthCandidate[ min4Idx] = 0;
12374 			}
12375 			else
12376 			{
12377 				WidthCandidate[ minIdx] = 0;
12378 			}
12379 		}
12380 
12381 		if ( abs(min3Width - min2Width) == 1 )
12382 		{
12383 			if (min3Idx < min2Idx)
12384 			{
12385 				WidthCandidate[ min3Idx] = 0;
12386 			}
12387 			else
12388 			{
12389 				WidthCandidate[ min2Idx] = 0;
12390 			}
12391 		}
12392 		if ( abs(min4Width - min2Width) == 1 )
12393 		{
12394 			if (min4Idx < min2Idx)
12395 			{
12396 				WidthCandidate[ min4Idx] = 0;
12397 			}
12398 			else
12399 			{
12400 				WidthCandidate[ min2Idx] = 0;
12401 			}
12402 		}
12403 		if ( abs(min4Width - min3Width) == 1)
12404 		{
12405 			if (min4Idx < min3Idx)
12406 			{
12407 				WidthCandidate[ min4Idx] = 0;
12408 			}
12409 			else
12410 			{
12411 				WidthCandidate[ min3Idx] = 0;
12412 			}
12413 		}
12414 		if (WidthCandidate[ min4Idx] > 0)
12415 		{
12416 			if ( min4Width == min3Width*2 || min4Width == min2Width*2 || min4Width == minWidth*2 )
12417 			{
12418 				WidthCandidate[ min4Idx] = 0;
12419 			}
12420 			if ( min3Width == min4Width*2 || min3Width == min2Width*2 || min3Width == minWidth*2 )
12421 			{
12422 				WidthCandidate[ min3Idx] = 0;
12423 			}
12424 			if ( min2Width == min4Width*2 || min2Width == min3Width*2 || min2Width == minWidth*2 )
12425 			{
12426 				WidthCandidate[ min2Idx] = 0;
12427 			}
12428 			if ( minWidth == min4Width*2 || minWidth == min3Width*2 || minWidth == min2Width*2 )
12429 			{
12430 				WidthCandidate[ minIdx] = 0;
12431 			}
12432 		}
12433 
12434 		if (WidthCandidate[minIdx] + WidthCandidate[min2Idx] + WidthCandidate[min3Idx] + WidthCandidate[min4Idx] == 1)
12435 		{
12436 			outWidth = WidthCandidate[minIdx]* minWidth + WidthCandidate[min2Idx]* min2Width + WidthCandidate[min3Idx]* min3Width + WidthCandidate[min4Idx]* min4Width;
12437 		}
12438 		else
12439 			outWidth = -1;
12440 	}
12441 	return outWidth;
12442 }
VDBK_BlocknessAdjPart(void * pInstance,long * histogram,MS_U8 * BLKN_adj,int partIndex,MS_U8 markValue,MS_U8 markDefValue,int VSRAMTIMESLOT)12443 int VDBK_BlocknessAdjPart(void *pInstance,long* histogram, MS_U8 *BLKN_adj, int partIndex, MS_U8 markValue, MS_U8 markDefValue, int VSRAMTIMESLOT)
12444 {
12445 	markValue = 0xF;
12446 	markDefValue = 0x0;
12447 
12448 	int avgBLKN = 0;
12449 	const int localWidth = 10;
12450 	int ThrHei = frameWidth;
12451 	int valid = 0;
12452 	int bin, CurV;
12453 	//    MS_U8 markNorm = (markValue+1)/2;
12454 	int movingSum = 0;
12455 	int blkness;
12456 
12457 	int IniPos, EndPos;
12458 	if( (partIndex < VSRAMTIMESLOT) && (VSRAMTIMESLOT!=0) )
12459 	{
12460 		IniPos = frameHeight*partIndex/VSRAMTIMESLOT;
12461 		EndPos = frameHeight*(partIndex+1)/VSRAMTIMESLOT;
12462 	}
12463 	else
12464 	{
12465 		IniPos = 0;
12466 		EndPos = 0;
12467 		return 0;
12468 	}
12469 #if 0
12470 	if (partIndex == 0)
12471 	{
12472 		IniPos = 0;
12473 		EndPos = frameHeight/2;
12474 	}
12475 	else if (partIndex == 1)
12476 	{
12477 		IniPos = frameHeight/2;
12478 		EndPos = frameHeight;
12479 	}
12480 	else
12481 	{
12482 		IniPos = 0;
12483 		EndPos = 0;
12484 		return 0;
12485 	}
12486 #endif
12487 
12488 	for(CurV = IniPos; CurV < EndPos; CurV++)
12489 	{
12490 		if ( ( CurV < (localWidth+1)/2 - 1) || ( CurV > frameHeight - (localWidth+1)/2 ) )
12491 		{
12492 			//Cutoff topmost, downmost positions
12493 			avgBLKN = 0;
12494 			BLKN_adj[CurV] = markDefValue;
12495 		}
12496 		else if (CurV == ( (localWidth+1/2) - 1) || CurV == IniPos )
12497 		{
12498 			movingSum = 0;
12499 			for (bin=-(localWidth+1)/2+1;bin < (localWidth+1)/2;bin++)
12500 			{
12501 				movingSum += histogram[CurV+bin];
12502 			}
12503 			if (localWidth!= 0)
12504 				avgBLKN = movingSum / localWidth;
12505 			else
12506 				avgBLKN = 0;
12507 
12508 			blkness = (histogram[ CurV] - avgBLKN);
12509 			if (blkness > ThrHei*2 )
12510 				BLKN_adj[CurV] = markValue;
12511 			else if (blkness > ThrHei )
12512 				BLKN_adj[CurV] = (markValue+markDefValue)/2;
12513 			else
12514 				BLKN_adj[CurV] = markDefValue;
12515 		}
12516 		else
12517 		{
12518 			movingSum = movingSum - histogram[CurV-(localWidth+1)/2+1] + histogram[CurV+(localWidth+1)/2-1];
12519 			if (localWidth!= 0)
12520 				avgBLKN = movingSum / localWidth;
12521 			else
12522 				avgBLKN = 0;
12523 
12524 			blkness = (histogram[ CurV] - avgBLKN);
12525 			if (blkness > ThrHei*2 )
12526 				BLKN_adj[CurV] = markValue;
12527 			else if (blkness > ThrHei )
12528 				BLKN_adj[CurV] = (markValue+markDefValue)/2;
12529 			else
12530 				BLKN_adj[CurV] = markDefValue;
12531 		}
12532 		if (CurV == frameHeight-1)
12533 			BLKN_adj[CurV+1] = BLKN_adj[CurV]; //duplicate one point for boundary control
12534 
12535 	}
12536 
12537 	return valid;
12538 }
SetVDBKParameter(void * pInstance,int HDBK_Str,int HDBK_Width)12539 void SetVDBKParameter(void *pInstance,int HDBK_Str, int HDBK_Width)
12540 {
12541 	//int bin, CurV;
12542 	int VGain = 0;
12543 	if (1)
12544 	{
12545 		VMStrMax = 0xF;
12546 
12547 		MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0006, 0x0006);
12548 		MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x1000);
12549 		MApi_XC_W2BYTEMSK(REG_SC_BK60_21_L, 0x0147, 0x0377);
12550 		//MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, 0x0811, 0x0F33);
12551 		MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, 0x0011, 0x0033);
12552 
12553 		MApi_XC_W2BYTEMSK(REG_SC_BK60_23_L, 0x8000, 0xFFFF);
12554 		MApi_XC_W2BYTEMSK(REG_SC_BK60_24_L, 0x4088, 0xFFFF);
12555 		MApi_XC_W2BYTEMSK(REG_SC_BK60_25_L, 0x0182, 0x07FF);
12556 		MApi_XC_W2BYTEMSK(REG_SC_BK60_26_L, 0x008F, 0xFFFF);
12557 		MApi_XC_W2BYTEMSK(REG_SC_BK60_27_L, 0x0888, 0x0FFF);
12558 		//Statistics
12559 		MApi_XC_W2BYTEMSK(REG_SC_BK60_28_L, 0x8000, 0xFFFF);
12560 		MApi_XC_W2BYTEMSK(REG_SC_BK60_29_L, 0x4088, 0xFFFF);
12561 		MApi_XC_W2BYTEMSK(REG_SC_BK60_2A_L, 0x0182, 0x07FF);
12562 		MApi_XC_W2BYTEMSK(REG_SC_BK60_2B_L, 0x008F, 0xFFFF);
12563 		MApi_XC_W2BYTEMSK(REG_SC_BK60_2C_L, 0x0888, 0xFFFF);
12564 
12565 	}
12566 	//long VScalingRatio = ( (MApi_XC_R2BYTEMSK(REG_SC_BK23_1D_L,0x00FF)<<16) + MApi_XC_R2BYTEMSK(REG_SC_BK23_1C_L,0xFFFF) ) >>16;
12567 	//PRT_TRP(" --VScalingRatio--(%d) / frameHeight--(%d) ; \n", VScalingRatio, frameHeight);
12568 
12569 	//Use HDBK strength to adjust VDBK controls
12570 	MS_BOOL ifPIP_en = (MApi_XC_R2BYTEMSK(REG_SC_BK20_10_L, 0x0003) == 0x0003);
12571 	if ((ifPIP_en) || (frameWidth <= 800))
12572 		MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0000, 0x0001); //VDBK disable for PIP
12573 	else
12574 		MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0001, 0x0001); //VDBK enable
12575 
12576 	if (HDBK_Width != 8)
12577 	{
12578 
12579 
12580 		if (HDBK_Str >= 80)
12581 		{
12582 			VGain = 0x8;
12583 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12584 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12585 		}
12586 		else if ( HDBK_Str >= 60 && HDBK_Str < 80)
12587 		{
12588 			VGain = 0x8/*(HDBK_Str-40)/(80-40)*/;
12589 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12590 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12591 		}
12592 		else if ( HDBK_Str >= 40 && HDBK_Str < 60)
12593 		{
12594 			VGain = 0x8*(HDBK_Str-20)/(60-20);
12595 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12596 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12597 		}
12598 		else if ( HDBK_Str >= 20 && HDBK_Str < 40)
12599 		{
12600 			VGain = 0x8*(HDBK_Str-20)/(60-20);
12601 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12602 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12603 		}
12604 		else
12605 		{
12606 			VGain = 0x0;
12607 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12608             MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12609 		}
12610 	}
12611 	else //HDBK_Width = 8
12612 	{
12613 
12614 
12615 		if (HDBK_Str >= 80)
12616 		{
12617 			VGain = 0x8;
12618 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12619 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12620 		}
12621 		else if ( HDBK_Str >= 60 && HDBK_Str < 80)
12622 		{
12623 			VGain = 0x8/*(HDBK_Str-40)/(80-40)*/;
12624 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12625 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12626 		}
12627 		else if ( HDBK_Str >= 40 && HDBK_Str < 60)
12628 		{
12629 			VGain = 0x8*(HDBK_Str-20)/(60-20);
12630 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12631 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12632 		}
12633 		else if ( HDBK_Str >= 20 && HDBK_Str < 40)
12634 		{
12635 			VGain = 0x8*(HDBK_Str-20)/(60-20);
12636 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12637 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x2000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12638 		}
12639 		else
12640 		{
12641 			VGain = 0x0;
12642 			MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, VGain<<8, 0x0F00); //v total gain
12643 			MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L,0x0000,0x2000);//blkwei  fun en  h0008(0x08) 8000 = 13th bit = 1
12644 		}
12645 	}
12646 	return;
12647 }
12648 static long vhistogram[MaxHeight] = {0};
VDBK_Detect(void * pInstance,int HDBK_Str,int * cntForDBK,int VSRAMTIMESLOT)12649 int VDBK_Detect( void *pInstance,int HDBK_Str, int* cntForDBK, int VSRAMTIMESLOT)
12650 {
12651 
12652 	static int WidthCal = 0;
12653 	static int HDBK_Width = 0;
12654 	static int VDBK_Width = 0;
12655 	static int WidthDiffHW[paraVerSize];
12656 	static int WidthDiffCand[paraVerSize];
12657 	static MS_U8 BLKN_adj_ver[MaxHeight] = {0};   //Normalized histogram
12658 	static MS_U8 BLKN_mark_ver[MaxHeight]; //blockness marking array
12659 	static MS_U8 BLKN_markext[MaxHeight]; //
12660 	static MS_U8 BLKN_marklpf_ver[MaxHeight] = {0};   //
12661 	int bin, CurV;
12662 
12663 	MS_U32 u32IniIndex = 0;
12664 
12665 	if (*cntForDBK == 0)
12666 	{
12667         if ( MApi_XC_R2BYTEMSK(REG_SC_BK0C_39_L,0xFFFF) == 0x0808 )
12668 			HDBK_Width = 0x8;
12669 		else
12670 			HDBK_Width = ( (MApi_XC_R2BYTEMSK(REG_SC_BK0C_39_L,0xFF00) >> 8 ) + MApi_XC_R2BYTEMSK(REG_SC_BK0C_39_L,0x00FF) ) / 2;
12671 
12672 
12673 		for (bin=0; bin<paraVerSize; bin++)
12674 			WidthDiffCand[bin] = 0;
12675 
12676 		SetVDBKParameter(pInstance,HDBK_Str, HDBK_Width);
12677 		if (HDBK_Str < HDBK_Str_Thrd)
12678 		{
12679 			*cntForDBK = VSRAMTIMESLOT*2+2;
12680 			for (CurV = 0; CurV < frameHeight; CurV++)
12681 			{
12682 				BLKN_marklpf_ver[CurV] = 0;
12683 			}
12684 			return 0;
12685 		}
12686 		WidthCal = VDBK_WidthPartHW(pInstance,WidthDiffHW, WidthDiffCand);
12687 		MApi_XC_W2BYTEMSK(REG_SC_BK30_0F_L, WidthCal<<12, 0xF000); //v width display
12688 	}
12689 	if (*cntForDBK <= (VSRAMTIMESLOT-1) ) //
12690 	{
12691 		int readHistAck;
12692 		readHistAck = readVHistogramPart(pInstance,vhistogram, *cntForDBK, VSRAMTIMESLOT);
12693 		if( (*cntForDBK == VSRAMTIMESLOT-1 )&& readHistAck)
12694 		{
12695 			MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 1, 0x0001);
12696 		}
12697 	}
12698 	else if (*cntForDBK <= (VSRAMTIMESLOT*2-1))
12699 	{
12700 		VDBK_BlocknessAdjPart(pInstance,vhistogram, BLKN_adj_ver, *cntForDBK-2, VMStrMax, VMStrMin, VSRAMTIMESLOT);
12701 	}
12702 	else if (*cntForDBK <= (VSRAMTIMESLOT*2))
12703 	{
12704 
12705 		if (WidthCal != -1)
12706 		{
12707 
12708 			VDBK_Width = WidthCal;
12709 
12710 			if (VDBK_Width == 8)
12711 			{
12712 				u32IniIndex = DBK_StPtLeft( VDBK_Width, BLKN_adj_ver, frameHeight/4, frameHeight*3/4); //Left to right search
12713                 if(u32IniIndex<=MaxHeight)
12714                     DBK_Mark_Ver_Test(pInstance,BLKN_mark_ver, BLKN_adj_ver, VDBK_Width, u32IniIndex, 0xF, 0x0); //0x8, 0x4
12715 			}
12716 			else
12717 			{
12718 				for (CurV = 0; CurV < frameHeight; CurV++)
12719 					BLKN_mark_ver[CurV] = 0;
12720 
12721 			}
12722 		}
12723 		else
12724 		{
12725 			{
12726 				for (CurV = 0; CurV < frameHeight; CurV++)
12727 					BLKN_mark_ver[CurV] = 0;
12728 			}
12729 		}
12730 	}
12731 	else if (*cntForDBK <= (VSRAMTIMESLOT*2+1))
12732 	{
12733 		if ( 1)
12734 		{
12735 			int UpIdx, DnIdx;
12736 			for (CurV = 0; CurV < frameHeight; CurV++)
12737 			{
12738 				UpIdx = CurV - 1;
12739 				DnIdx = CurV + 1;
12740 				if (UpIdx < 0)
12741 				{
12742 					//BLKN_markext[CurV] = __max3(BLKN_mark_ver[CurV ], BLKN_mark_ver[CurV], BLKN_mark_ver[DnIdx]);
12743 					BLKN_markext[CurV] = __max(BLKN_mark_ver[CurV], BLKN_mark_ver[DnIdx]);
12744 				}
12745 				else if (DnIdx >= frameHeight)
12746 				{
12747 					//BLKN_markext[CurV] = __max3(BLKN_mark_ver[UpIdx], BLKN_mark_ver[CurV], BLKN_mark_ver[CurV ]);
12748 					BLKN_markext[CurV] = __max(BLKN_mark_ver[CurV], BLKN_mark_ver[CurV ]);
12749 				}
12750 				else
12751 				{
12752 					//BLKN_markext[CurV] = __max3(BLKN_mark_ver[UpIdx], BLKN_mark_ver[CurV], BLKN_mark_ver[DnIdx]);
12753 					BLKN_markext[CurV] = __max(BLKN_mark_ver[CurV], BLKN_mark_ver[DnIdx]);
12754 				}
12755 			}
12756 		}
12757 	}
12758 	else if (*cntForDBK <= (VSRAMTIMESLOT*2+2))
12759 	{
12760 		if (1)
12761 		{
12762 			int UpIdx, DnIdx;
12763 			for (CurV = 0; CurV < frameHeight; CurV++)
12764 			{
12765 				UpIdx = __minmax(CurV - 1, 0, frameHeight-1);
12766 				DnIdx = __minmax(CurV + 1, 0, frameHeight-1);
12767 				if (UpIdx < 0)
12768 				{
12769 					BLKN_marklpf_ver[CurV] = (BLKN_markext[CurV ]*2 + BLKN_markext[CurV]*4 + BLKN_markext[DnIdx]*2 + 4) >> 3;
12770 				}
12771 				else if (DnIdx >= frameHeight)
12772 				{
12773 					BLKN_marklpf_ver[CurV] = (BLKN_markext[UpIdx]*2 + BLKN_markext[CurV]*4 + BLKN_markext[CurV ]*2 + 4) >> 3;
12774 				}
12775 				else
12776 				{
12777 					BLKN_marklpf_ver[CurV] = (BLKN_markext[UpIdx]*2 + BLKN_markext[CurV]*4 + BLKN_markext[DnIdx]*2 + 4) >> 3;
12778 				}
12779 
12780 			}
12781 		}
12782 	}
12783 	else if (*cntForDBK <= (VSRAMTIMESLOT*3+2))//7,8
12784 	{
12785 		writeToVSRAMPart(pInstance,BLKN_marklpf_ver, *cntForDBK-(VSRAMTIMESLOT*3+1), VSRAMTIMESLOT );
12786 	}
12787 	else
12788 	{
12789 		*cntForDBK+=10;
12790 		return 1;
12791 	}
12792 	return 1;
12793 }
DBK_Frame_Estimate(void * pInstance,const int cntForDBK,long * CurFrameEdgStr,long * FrameBLKEdgIIR,long * CurFrameDetStr,long * FrameBLKDetIIR,long * CurFrameBLKStr,long * FrameBLKStrIIR,MS_BOOL SceneChange)12794 void DBK_Frame_Estimate(void *pInstance, const int cntForDBK, long* CurFrameEdgStr, long* FrameBLKEdgIIR, long* CurFrameDetStr, long* FrameBLKDetIIR, long* CurFrameBLKStr, long* FrameBLKStrIIR, MS_BOOL SceneChange )
12795 {
12796 	static int IIRCurRatio = 4;
12797 	if (SceneChange)
12798 		IIRCurRatio = 12;
12799 	else
12800 		IIRCurRatio = 4;
12801 	const int DETGAINSET = 0x5335;//MApi_XC_R2BYTEMSK(REG_SC_BK30_06_L, 0xFFFF);
12802 	static MS_BOOL swSetting = 0;
12803 	if ( ( cntForDBK >= 7 && cntForDBK <= 12) || ( cntForDBK >= 17 && cntForDBK <= 22) )
12804 	{
12805 		if ( MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) != DETGAINSET)
12806 		{
12807 			MApi_XC_W2BYTEMSK(REG_SC_BK60_39_L, DETGAINSET, 0xFFFF);
12808 			swSetting = 1;
12809 		}
12810 		else
12811 			//if ( cntForDBK != 6 && cntForDBK != 16 )
12812 		{
12813 			if (swSetting == 1)
12814 			{
12815 				swSetting = 0;//wait 1 frame
12816 			}
12817 			else
12818 			{
12819 				*CurFrameBLKStr = ( MApi_XC_R2BYTEMSK(REG_SC_BK0C_61_L, 0xFFFF) << 16 ) + MApi_XC_R2BYTEMSK(REG_SC_BK0C_60_L, 0xFFFF);
12820 				*CurFrameBLKStr = (*CurFrameBLKStr)*8/(frameWidth*frameHeight);
12821 				*FrameBLKStrIIR = ( (*FrameBLKStrIIR)*(16-IIRCurRatio) + (*CurFrameBLKStr)*IIRCurRatio )/16;
12822 			}
12823 		}
12824 		if (cntForDBK == 12 || cntForDBK == 22)
12825 		{
12826 			MApi_XC_W2BYTEMSK(REG_SC_BK60_39_L, 0x0000, 0xFFFF);
12827 			swSetting = 1;
12828 		}
12829 	}
12830 	else
12831 	{
12832 		if ( MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) != 0x0000 )
12833 		{
12834 			MApi_XC_W2BYTEMSK(REG_SC_BK60_39_L, 0x0000, 0xFFFF);
12835 			swSetting = 1;
12836 		}
12837 		//if (cntForDBK != 11 && cntForDBK != 21)
12838 		else
12839 		{
12840 			if (swSetting == 1)
12841 			{
12842 				swSetting = 0;//wait 1 frame
12843 			}
12844 			else
12845 			{
12846 				(*CurFrameEdgStr) = ( MApi_XC_R2BYTEMSK(REG_SC_BK0C_61_L, 0xFFFF) << 16 ) + MApi_XC_R2BYTEMSK(REG_SC_BK0C_60_L, 0xFFFF);
12847 				(*CurFrameEdgStr) = (*CurFrameEdgStr)*8/(frameWidth*frameHeight);
12848 				(*FrameBLKEdgIIR) = ((*FrameBLKEdgIIR)*(16-IIRCurRatio) + (*CurFrameEdgStr)*IIRCurRatio )/16;
12849 			}
12850 		}
12851 		if (cntForDBK == 6 || cntForDBK == 16 )
12852 		{
12853 			MApi_XC_W2BYTEMSK(REG_SC_BK60_39_L, DETGAINSET, 0xFFFF);
12854 			swSetting = 1;
12855 		}
12856 	}
12857 	(*CurFrameDetStr) = __max((*FrameBLKEdgIIR) - (*FrameBLKStrIIR), 0);
12858 	(*FrameBLKDetIIR) = (*CurFrameDetStr);
12859 	//FrameBLKDetIIR = (FrameBLKDetIIR*12 + CurFrameDetStr*4 )/16;
12860 
12861 }
DBK_Crma_Enable(void * pInstance)12862 void DBK_Crma_Enable(void *pInstance) //Register Settings to hardware
12863 {
12864 		MS_BOOL DBK_En = (MApi_XC_R2BYTEMSK(REG_SC_BK0C_40_L, 0x0001) == 1)
12865 					&& (MApi_XC_R2BYTEMSK(REG_SC_BK0C_10_L, 0x0001) == 1)
12866 					&& (MApi_XC_R2BYTEMSK(REG_SC_BK0C_70_L, 0x0001) == 0);
12867 		if (!DBK_En)
12868 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 0, 0x0001);
12869 		else
12870 				MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 1, 0x0001);
12871 }
12872 
DMS_SDHDModeCheck(void * pInstance,MS_U8 u8SD2HDValue)12873 void DMS_SDHDModeCheck(void *pInstance, MS_U8 u8SD2HDValue) //Register Settings to hardware
12874 {
12875 
12876 
12877 	if( (u8SD2HDValue>=60) && (frameWidth>0x700)  ) //SD to HD mode
12878 		MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x4000, 0x4000); // HD_enable
12879 	else
12880 		MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x0000, 0x4000);
12881 }
12882 static MS_U16 g_u16BK0A_24 = 0;
12883 static MS_U16 g_u16BK0C_10 = 0;
12884 static MS_U16 g_u16BK0C_39 = 0;
12885 static MS_U16 g_u16BK0C_3A = 0;
12886 static MS_U16 g_u16BK0C_40 = 0;
12887 //static MS_U16 g_u16BK0C_41 = 0;
12888 static MS_U16 g_u16BK0C_42 = 0;
12889 static MS_U16 g_u16BK26_10 = 0;
12890 static MS_U16 g_u16BK26_11 = 0;
12891 static MS_U16 g_u16BK26_12 = 0;
12892 static MS_U16 g_u16BK26_13 = 0;
12893 static MS_U16 g_u16BK26_18 = 0;
12894 
12895 /******************************************************************************/
12896 ///Film mode control for Any Candence
12897 ///@param bEnable \     IN: Enable/Disable control
12898 /******************************************************************************/
Hal_PQ_FilmMode_AnyCandence_Enable(void * pInstance,MS_BOOL bEnable)12899 void Hal_PQ_FilmMode_AnyCandence_Enable(void *pInstance,MS_BOOL bEnable)
12900 {
12901 	MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, (bEnable ? (BIT(15)) : 0), BIT(15));
12902 	_bAnyCandenceEnable = bEnable;
12903 }
12904 
12905 /******************************************************************************/
12906 ///Store the Current value
12907 /******************************************************************************/
Hal_PQ_StoreCurrentValue(void * pInstance)12908 void Hal_PQ_StoreCurrentValue(void *pInstance)
12909 {
12910 	//for AnyCandence Film Mode
12911 	g_u16BK0A_24 = MApi_XC_R2BYTEMSK(REG_SC_BK0A_24_L, BIT(15));
12912 
12913 	//for DBK
12914 	g_u16BK0C_10 = MApi_XC_R2BYTE(REG_SC_BK0C_10_L);
12915 	g_u16BK0C_39 = MApi_XC_R2BYTE(REG_SC_BK0C_39_L);
12916 	g_u16BK0C_3A = MApi_XC_R2BYTE(REG_SC_BK0C_3A_L);
12917 	g_u16BK0C_40 = MApi_XC_R2BYTE(REG_SC_BK0C_40_L);
12918 	//g_u16BK0C_41 = MApi_XC_R2BYTE(REG_SC_BK0C_41_L);
12919 	g_u16BK0C_42 = MApi_XC_R2BYTE(REG_SC_BK0C_42_L);
12920 
12921 	//for DMS
12922 	g_u16BK26_10 = MApi_XC_R2BYTE(REG_SC_BK26_10_L);
12923 	g_u16BK26_11 = MApi_XC_R2BYTE(REG_SC_BK26_11_L);
12924 	g_u16BK26_12 = MApi_XC_R2BYTE(REG_SC_BK26_12_L);
12925 	g_u16BK26_13 = MApi_XC_R2BYTE(REG_SC_BK26_13_L);
12926 	g_u16BK26_18 = MApi_XC_R2BYTE(REG_SC_BK26_18_L);
12927 }
12928 
12929 /******************************************************************************/
12930 ///Store the Current value
12931 /******************************************************************************/
Hal_PQ_ReStoreToDefault(void * pInstance)12932 void Hal_PQ_ReStoreToDefault(void *pInstance)
12933 {
12934 	//for AnyCandence Film Mode
12935 	MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, g_u16BK0A_24, BIT(15));
12936 
12937 	//for DBK
12938 	MApi_XC_W2BYTE(REG_SC_BK0C_10_L, g_u16BK0C_10);
12939 	MApi_XC_W2BYTE(REG_SC_BK0C_39_L, g_u16BK0C_39);
12940 	MApi_XC_W2BYTE(REG_SC_BK0C_3A_L, g_u16BK0C_3A);
12941 	MApi_XC_W2BYTE(REG_SC_BK0C_40_L, g_u16BK0C_40);
12942 	//MApi_XC_W2BYTE(REG_SC_BK0C_41_L, g_u16BK0C_41);
12943 	MApi_XC_W2BYTE(REG_SC_BK0C_42_L, g_u16BK0C_42);
12944 
12945 	//for DMS
12946 	MApi_XC_W2BYTE(REG_SC_BK26_10_L, g_u16BK26_10);
12947 	MApi_XC_W2BYTE(REG_SC_BK26_11_L, g_u16BK26_11);
12948 	MApi_XC_W2BYTE(REG_SC_BK26_12_L, g_u16BK26_12);
12949 	MApi_XC_W2BYTE(REG_SC_BK26_13_L, g_u16BK26_13);
12950 	MApi_XC_W2BYTE(REG_SC_BK26_18_L, g_u16BK26_18);
12951 }
12952 #define FPLL_PHASE_VAR_LIMIT    (0x10)          // If phase error variation exceed this, means un-stable
12953 #define FPLL_PRD_THRESHOLD      (0x100)         // The PRD must be smaller than this value to indicate almost finished PRD lock
12954 #define FPLL_PRD_VAR_LIMIT      (0x10)          // If PRD variation exceed this, means un-stable
12955 
12956 //static MS_BOOL _Hal_PQ_FrameLockCheck (void *pInstance)
_Hal_PQ_FrameLockCheck(void * pInstance)12957 MS_BOOL _Hal_PQ_FrameLockCheck (void *pInstance)
12958 {
12959     MS_U16 u16NewPhase,u16NewPrd;
12960     static MS_U16 _u16OrigPhase,_u16OrigPrd;
12961 
12962     u16NewPrd = MApi_XC_R2BYTEMSK(REG_LPLL_13_L, 0xFFFF);
12963     u16NewPhase = MApi_XC_R2BYTEMSK(REG_LPLL_11_L, 0xFFFF);
12964 
12965     if((u16NewPrd < FPLL_PRD_THRESHOLD) && (abs(_u16OrigPrd - u16NewPrd) < FPLL_PRD_VAR_LIMIT)
12966         && (abs(_u16OrigPhase - u16NewPhase) < FPLL_PHASE_VAR_LIMIT))
12967     {
12968         _u16OrigPhase = u16NewPhase;
12969         _u16OrigPrd = u16NewPrd;
12970         return TRUE;
12971     }
12972     else
12973     {
12974         _u16OrigPhase = u16NewPhase;
12975         _u16OrigPrd = u16NewPrd;
12976         return FALSE;
12977     }
12978 }
12979 
12980 static MS_BOOL bFakeOutCusEnable = TRUE;
12981 
Hal_PQ_SetFakeOutEnable(void * pInstance,MS_BOOL bEnable)12982 MS_BOOL Hal_PQ_SetFakeOutEnable(void *pInstance,MS_BOOL bEnable)
12983 {
12984     bFakeOutCusEnable = bEnable;
12985     return TRUE;
12986 }
12987 
12988 #define ENABLE_SCALER_DEFEATHERING           0x01   //BK22_7C_L
12989 #define ENABLE_SCALER_DEFLICKERING           0x02
12990 #define ENABLE_SCALER_DEBOUNCING             0x04
12991 #define ENABLE_SCALER_D3D_DRIVER             0x08
12992 
12993 #define ENABLE_SCALER_AUTO_DBK_DRIVER        0x01   //BK22_7C_H[0]
12994 #define ENABLE_SCALER_MCDI_DRIVER            0x02   //BK22_7C_H[1]
12995 #define ENABLE_SCALER_MCNR_DRIVER            0x04   //BK22_7C_H[2]
12996 #define ENABLE_SCALER_SDHD_DETECT_DRIVER     0x08   //BK22_7C_H[3]
12997 
12998 #define ENABLE_SCALER_CCS_DRIVER             0x20   //BK22_7C_H[5]
12999 #define ENABLE_SCALER_DHD_DRIVER             0x40   //BK22_7C_H[6]
13000 #define ENABLE_SCALER_AUTO_DBK_NMR_DRIVER    0x80   //BK22_7C_H[7]
13001 #define ENABLE_SR_DRIVER    0x01  //BK2C30_3F_H[0]
13002 
13003 //-------------------------------------------------------------------------------------------------
13004 /// this function does adaptive tuning periodic
13005 //-------------------------------------------------------------------------------------------------
13006 
Hal_PQ_AdaptiveTuning(void * pInstance)13007 void Hal_PQ_AdaptiveTuning(void *pInstance)
13008 {
13009 
13010     MS_BOOL ukoSabihS_en = 0;
13011     MS_BOOL isUkosabihsMcSweep = false, isUkosabihsMotionSweep = false;
13012     MS_BOOL isUkosabihsForFilm = 0;
13013     static MS_U8 u8PreviousVcnt = 0;
13014     MS_U8 u8CurrentVcnt;
13015     MS_U8 ColorSum;
13016     //MS_U32 MR_Offset;
13017     //	MS_U16 MR_OffsetME1, MR_OffsetME2;
13018     MS_U32 u32MotionValue,u32MotionValue2,/*u32MotionValue3,*/TotalFeather,TotalMvComfirm;
13019     MS_U16 u16MotionValue4;
13020     MS_U32 uComplex,FeatherSum,u32MotionValue_Sum;
13021        MS_U8 NE_confirm = 0;
13022 
13023     XC_ApiStatus stXCStatus;
13024     memset(&stXCStatus, 0x00, sizeof(stXCStatus));
13025 
13026     MS_BOOL me1Still;
13027     MS_BOOL movingWithoutFeather;
13028     MS_BOOL isMcOutOfSearchRange;
13029     MS_U8 estNoise = 0;
13030     MS_U16 nonMv0Comfirm,mv0Comfirm,mvNotFound,nonMv0ComfirmME2,mv0ComfirmME2,mvNotFoundME2;//nonMv0Comfirm_noIIR,mv0Comfirm_noIIR,mvNotFound_noIIR;
13031     //	MS_U16 mvNotFoundME2,mvNotFound_noIIR;
13032     MS_U16 isFeatherAndMotion = false;
13033 
13034     MS_U16 me1IsMv0, me1IsNonMv0, me1IsNotFound;
13035     MS_U16 me2IsMv0, me2IsNonMv0, me2IsNotFound;
13036     MS_BOOL isSceneChangeMc, isSceneChangeY, isSceneChange = 0;//isScenceChangeByNotFound = 0;
13037     MS_BOOL isAbihsot = false; /* Toshixa */
13038     MS_BOOL isHBurstMoving = false, isHBurst = false;//isLowLuma;
13039     static MS_BOOL isMcFilm = false;
13040 //	static MS_BOOL isMcFilmAny = false;
13041     static MS_BOOL isMcFilmHd = false;
13042     static MS_BOOL isMcFilmukoSabihS = false;
13043 
13044     MS_BOOL isMcFilmSlowMotion = true;
13045 
13046     //MS_BOOL isLrLetterBox = false;
13047     MS_BOOL isL139 = FALSE, isL107 = FALSE, isL153 =FALSE, isUkosabihsMotion = FALSE, isUkosabihsMc = FALSE, isUkosabihsMv0 = FALSE;// isSWoman = FALSE;
13048 //	MS_BOOL isWeakMcNrFilm = false; /* for delay one frame issue */
13049     MS_BOOL Bouncing_status,bBouncing_Status2,Feather_sum_status,Feather_sum_status2;
13050     XC_FilmStates filmstatus;
13051     XC_OpFrameStates opFrameStatus;
13052     MS_BOOL isOpFrameChanged;
13053 
13054     static XC_OpFrameStates prevOpFrameStatus;
13055 
13056     XC_Me1HisStates ME1HisStates_1,ME1HisStates_2;
13057     XC_GMvStates GMV;
13058 //	static MS_U8 u8SDHDDReport = 0;
13059     static MS_U8 _timeSharingID = 0;
13060 
13061     static MS_U8 timingSegment = 0;
13062     static MS_U8 _hdsddFilterBaseReport;
13063     static MS_U32 _hpfHdCntReport;
13064     static MS_U32 _hpfSdCntReport;
13065        static MS_U32 hdNactCnt;
13066     static MS_U32 _hdFilterBaseReport;
13067     static MS_U32 _hpfSdTolerantReport;
13068     static MS_U32 _hpfHdTolerantReport;
13069 
13070     static MS_U32 _hpfHdCntReport3;
13071     static MS_U32 _hpfSdCntReport3;
13072 
13073 
13074 //	static MS_BOOL isMEReset;
13075     MS_BOOL isZoomMoving = false;
13076     MS_BOOL isBigFeather = false;
13077     MS_BOOL isSdHqvJaggedTest = false;
13078     XC_LumaHistogramStates lumaHistogramStates;
13079     static XC_HpfDefaultRegSetting hpfDefaultReg;
13080 
13081     MS_BOOL isSourceChange;
13082     MS_BOOL isSourceChangeForME = false;
13083     MS_BOOL isSourceChangeFlag = false;
13084 
13085     MS_U32 inSearchUseFeather;
13086     MS_BOOL isArtifactPattern = false;
13087 //	MS_BOOL isMv0Comfirm = false;
13088     MS_BOOL isSparsePattern = false;
13089 
13090     MS_BOOL isNoLumaCplx = false;
13091     //DBK Variables
13092 
13093     static MS_BOOL sceneChg = false;
13094     static MS_BOOL sceneChgP1 = false;
13095     static MS_BOOL sceneChgP2 = false;
13096 
13097 
13098     static long histogram[MaxWidth] = {0};
13099     static int blocknessCheck[MaxWidth] = {0};
13100     long FrameBLKStrTmp = 0;
13101     static int blkConfidence = 0;
13102     int blkReturnValue = 0;
13103     int SRAMTIMESLOT = 4;
13104     int MARKTIMESLOT = 1;
13105     int ADJTIMESLOT = 3;
13106     int VSRAMTIMESLOT = 2;
13107 
13108 
13109     int readDBKHistAck = 0;
13110     int cntForVDBK = 0;
13111     MS_BOOL DBKFastUpEnable = false;
13112     MS_BOOL DBKDebugModeOn  = false;
13113     static MS_U8 cpxGain = 0;
13114 
13115     static int cntForDBK = 0; //counter for deblocking
13116     static long CurFrameEdgStr = 0;
13117     static long FrameBLKEdgIIR = 0;
13118     static long CurFrameDetStr = 0;
13119     static long FrameBLKDetIIR = 0;
13120     static long CurFrameBLKStr = 0;
13121     static long FrameBLKStrIIR = 0;
13122 
13123     //
13124     //****** Check VCnt******//
13125     //
13126     u8CurrentVcnt = MDrv_SC_read_v_cnt(pInstance);
13127     if (u8PreviousVcnt == u8CurrentVcnt)
13128     {
13129     	return;
13130     }
13131     else
13132     {
13133     	u8PreviousVcnt = u8CurrentVcnt;
13134     }
13135 
13136     if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW))
13137     {
13138 	    //MDrv_SC_Edison_ME1_SetStatisticsWindow(pInstance,stXCStatus.stCropWin.width, stXCStatus.stCropWin.height);
13139 	    if(stXCStatus.bInterlace)
13140 	    {
13141 	    	MDrv_SC_Edison_ME1_SetStatisticsWindow(pInstance,stXCStatus.ScaledCropWin.width, (stXCStatus.ScaledCropWin.height)/2);
13142 	    }
13143 	    else
13144 	    {
13145 	    	MDrv_SC_Edison_ME1_SetStatisticsWindow(pInstance,stXCStatus.ScaledCropWin.width, stXCStatus.ScaledCropWin.height);
13146 	    }
13147     }
13148 	frameWidth  = __minmax(stXCStatus.ScaledCropWin.width,  1, MaxWidth );
13149 	frameHeight = __minmax(stXCStatus.ScaledCropWin.height, 1, MaxHeight);
13150 #if 1
13151 	if (frameWidth >= 3840) //UHD
13152 	{
13153 		SRAMTIMESLOT = 4;
13154 		ADJTIMESLOT  = 4;
13155 		VSRAMTIMESLOT = 3;
13156 	}
13157 	else if (frameWidth >= 1920)	//HD
13158 	{
13159 		SRAMTIMESLOT = 3;
13160 		ADJTIMESLOT  = 3;
13161 		VSRAMTIMESLOT = 2;
13162 	}
13163 	else if (frameWidth <= 800)	//SD
13164 	{
13165 		SRAMTIMESLOT = 1;
13166 		ADJTIMESLOT  = 1;
13167 		VSRAMTIMESLOT = 1;
13168 	}
13169 	else //Unknown source
13170 	{
13171 		SRAMTIMESLOT = 3;
13172 		ADJTIMESLOT  = 3;
13173 		VSRAMTIMESLOT = 2;
13174 	}
13175 	int HDBK_PARTIOVER= SRAMTIMESLOT+9+MARKTIMESLOT+ADJTIMESLOT; //19
13176 	int DBK_PARTIOVER = HDBK_PARTIOVER+SRAMTIMESLOT+VSRAMTIMESLOT*3+2-1; //20~27, no V now
13177 
13178 #endif
13179 
13180 	//
13181     //****** Get input resolution info******//
13182 	//
13183 	if( stXCStatus.u16H_SizeAfterPreScaling >= 1280 )
13184 	{
13185 		_bIsHDSource= true;
13186 	}
13187 	else
13188 	{
13189 		_bIsHDSource= false;
13190 	}
13191 
13192 	//
13193 	//****** source change******//
13194 	//
13195 	isSourceChange = MDrv_SC_SourceChange(pInstance); //Trace the rising signal for source change
13196 	isSourceChangeForME = (MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0002)>>1) ;//hold for 35frames
13197 	isSourceChangeFlag = MDrv_SC_SourceChangeFlag(pInstance,isSourceChange);		//hold for 4 frames
13198 
13199 	//
13200 	//****** save HPF original setting******/
13201 	//
13202 	hpfDefaultReg = MDrv_SC_SaveHpfSetting( pInstance,isSourceChangeFlag );
13203 
13204 	// Get adaptive function control
13205 	MS_U8 u8Ctrl  = MDrv_SC_get_adaptive_ctrl(pInstance);
13206 	MS_U8 u8Ctrl2 = MDrv_SC_get_adaptive_ctrl2(pInstance);
13207         MS_U8 u8UFSCCtrl3 = MDrv_UFSC_get_adaptive_ctrl3();
13208 	//MS_U8 u8Ctrl3 = MDrv_SC_get_adaptive_ctrl3();
13209 	//MS_U8 u8Ctrl4 = MDrv_SC_get_adaptive_ctrl4();
13210 	//MS_U8 u8Ctrl5 = MDrv_SC_get_adaptive_ctrl5();
13211 
13212 	//
13213 	//****** Get motion value******//
13214 	//
13215     u32MotionValue = MDrv_SC_read_motion_value1(pInstance);
13216     u32MotionValue2 = MDrv_SC_read_motion_value2(pInstance);
13217     //u32MotionValue3 = MDrv_SC_read_motion_value3(pInstance);
13218     u16MotionValue4 = MDrv_SC_read_motion_value4(pInstance); /* Edison new arrive ( this is no-history motion */
13219 
13220     /*MR_OffsetME1 =*/ MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(pInstance, &me1IsMv0, &me1IsNonMv0, &me1IsNotFound );
13221     /*MR_OffsetME2 =*/ MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(pInstance, &me2IsMv0, &me2IsNonMv0, &me2IsNotFound );
13222 
13223     u32MotionValue_Sum = u32MotionValue2; //+ ( u16MotionValue4*1 );
13224     //luma, color, complex
13225     lumaHistogramStates = MDrv_SC_GetLumaHistogram(pInstance);
13226     ColorSum = MDrv_SC_A5_ColorPixelSum(pInstance); // #pixels of specified color window
13227     uComplex = MDrv_SC_Agate_ComplexSum(pInstance);
13228     //DEBUG_LC_uComplex(uComplex);
13229 
13230     //
13231     //******scene change******//
13232     //
13233     isSceneChangeMc = MDrv_SC_Agate_SceneChangeMc( pInstance,me1IsMv0, me1IsNonMv0, me1IsNotFound, me2IsMv0, me2IsNonMv0, me2IsNotFound );
13234     isSceneChangeY = MDrv_SC_Agate_SceneChangeY( pInstance,lumaHistogramStates );
13235     isSceneChange = ( isSceneChangeMc | isSceneChangeY );
13236 
13237     //Feather
13238     inSearchUseFeather = MDrv_SC_McInSearchRangeUseFeather(pInstance);
13239 
13240     TotalFeather = MDrv_SC_Agate_TotalFeather(pInstance); //clamp at 255
13241     FeatherSum = MDrv_SC_TotalFeather_Sum(pInstance); //no clamp
13242 
13243     //MV
13244     //nonMv0Comfirm_noIIR = MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(pInstance);
13245     //	mv0Comfirm_noIIR = MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(pInstance);
13246     nonMv0Comfirm = MDrv_SC_Agate_ME1_nonMv0Comfirm(pInstance);
13247     mv0Comfirm = MDrv_SC_Agate_ME1_mv0Comfirm(pInstance);
13248     mvNotFound = MDrv_SC_Agate_ME1_mvNotFound(pInstance);
13249     //	mvNotFound_noIIR = MDrv_SC_Agate_ME1_mvNotFound_noIIR(pInstance);
13250     //	mvNotFoundME2 = MDrv_SC_Agate_ME2_mvNotFound(pInstance);
13251     nonMv0ComfirmME2 = MDrv_SC_Agate_ME2_nonMv0Comfirm(pInstance);
13252     mv0ComfirmME2 = MDrv_SC_Agate_ME2_mv0Comfirm(pInstance);
13253     mvNotFoundME2 = MDrv_SC_Agate_ME2_mvNotFound(pInstance);
13254 
13255     ME1HisStates_1 = MDrv_SC_Agate_Hierarchy1(pInstance);
13256     ME1HisStates_2 = MDrv_SC_Agate_Hierarchy2(pInstance,ME1HisStates_1);
13257     GMV = MDrv_SC_Agate_GMV(pInstance, ME1HisStates_1, ME1HisStates_2 );
13258 
13259     //isMv0Comfirm = ( mv0Comfirm_noIIR > 0xA0 ) ? true : false;
13260 
13261     Bouncing_status = MDrv_SC_Bouncing_Status(u32MotionValue_Sum);
13262     bBouncing_Status2 = MDrv_SC_Bouncing_Status2(u16MotionValue4);
13263 
13264     //Frame Organization: Film and OPFrame
13265 
13266     opFrameStatus = MDrv_SC_OpFrame_Status(pInstance);
13267     isOpFrameChanged = ( opFrameStatus.curOpFrame != prevOpFrameStatus.curOpFrame );
13268 
13269     filmstatus = MDrv_SC_Film_Status(pInstance);
13270     isMcFilm	= MDrv_SC_McFilmLike(pInstance ,opFrameStatus, _bIsHDSource );
13271     isMcFilmHd	= MDrv_SC_McFilmLikeHd(pInstance, opFrameStatus, _bIsHDSource );
13272     //isMcFilmAny	= MDrv_SC_McFilmLikeAny( opFrameStatus, isMcFilm, _bIsHDSource );
13273     //Time Sharing ID
13274     _timeSharingID = MDrv_SC_TimeSharing(pInstance, opFrameStatus, &timingSegment, isSourceChangeFlag);
13275 
13276     //
13277     //******DI status******//
13278     //
13279     TotalMvComfirm = MDrv_SC_Agate_TotalMvComfirm(pInstance);
13280     me1Still = MDrv_SC_Agate_ME1Still(pInstance);
13281     isFeatherAndMotion = MDrv_SC_Agate_FeatherAndMotion(pInstance);
13282     movingWithoutFeather = MDrv_SC_Agate_MovingWithoutFeather(pInstance);
13283     //isScenceChangeByNotFound = MDrv_SC_ScenceChangeDetectByNotFound(mvNotFound_noIIR);
13284     Feather_sum_status= MDrv_SC_TotalFeather_Sum_Status(pInstance, isFeatherAndMotion, ( !_bIsHDSource ), &Feather_sum_status2 );
13285 
13286     //for different picture size case
13287     XC_ApiStatus DrvStatus;
13288     memset(&DrvStatus, 0x0, sizeof(XC_ApiStatus));
13289     MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
13290     if((DrvStatus.stCropWin.width)==0)
13291     {
13292         (DrvStatus.stCropWin.width)=1;
13293     }
13294 
13295      if((DrvStatus.stCropWin.height)==0)
13296     {
13297         (DrvStatus.stCropWin.height)=1;
13298     }
13299 
13300     if((DrvStatus.stCapWin.width)==0)
13301     {
13302         (DrvStatus.stCapWin.width)=1;
13303     }
13304 
13305     if((DrvStatus.stCapWin.height)==0)
13306     {
13307         (DrvStatus.stCapWin.height)=1;
13308     }
13309 
13310     normalize_factor  = ((256 * (DrvStatus.stCropWin.width) * (DrvStatus.stCropWin.height))/( (DrvStatus.stCapWin.width) * (DrvStatus.stCapWin.height)));
13311 
13312 	//
13313 	//****** Letter Box LR******//
13314 	//
13315   	//if (!isSourceChangeFlag)
13316 	//	isLrLetterBox = MDrv_SC_Edison_LrLetterBox( opFrameStatus, hpfDefaultReg, _timeSharingID,  timingSegment );
13317 	XC_LetterBoxState letterBoxState = MDrv_SC_Letter_Box_Driver(pInstance, /*_bIsHDSource,*/ isSceneChange, isSourceChangeFlag, isOpFrameChanged );
13318 
13319 	//
13320 	//******DBK status******//
13321 	//
13322 #ifdef DBG_SD2HD_LC
13323     DEBUG_LC_Full6bit(pInstance,_hdsddFilterBaseReport);
13324 #endif
13325 
13326 	//isLowLuma = MDrv_SC_LowLumaDetection();
13327 
13328     DBK_Frame_Estimate( pInstance,cntForDBK, &CurFrameEdgStr, &FrameBLKEdgIIR, &CurFrameDetStr, &FrameBLKDetIIR, &CurFrameBLKStr, &FrameBLKStrIIR, isSceneChange );
13329 
13330 	// hdsdd filter base reporter
13331 	// Only DBK Use
13332 	if (!isSourceChangeFlag)
13333     {
13334         _hdsddFilterBaseReport = MDrv_SC_SDHD_FilterBaseReport(pInstance, _timeSharingID, &_hpfHdCntReport, &_hpfSdCntReport, hpfDefaultReg, timingSegment  , &hdNactCnt);
13335         _hdFilterBaseReport = MDrv_SC_dynamicHDfilterBaseReport(pInstance, _timeSharingID, u32MotionValue, isUkosabihsMv0,  hpfDefaultReg, timingSegment  );
13336         _hpfSdTolerantReport = MDrv_SC_hpfTolerantReport(pInstance, _timeSharingID, hpfDefaultReg, &_hpfHdTolerantReport, timingSegment  );
13337         MDrv_SC_SDHD_FilterOneReport(pInstance, _timeSharingID, &_hpfHdCntReport3, &_hpfSdCntReport3, hpfDefaultReg, timingSegment  );
13338     }
13339 
13340 #if 0
13341 	MS_U8 _hdsddFilterBaseReportDbg = _hdsddFilterBaseReport / 15;
13342 	if( _hdsddFilterBaseReportDbg == 0 )
13343 		MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0000 );
13344 	else if( _hdsddFilterBaseReportDbg == 1 )
13345 		MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0002 );
13346 	else if( _hdsddFilterBaseReportDbg == 2 )
13347 		MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0022 );
13348 	else if( _hdsddFilterBaseReportDbg == 3 )
13349 		MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0222 );
13350 	else
13351 		MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x2222 );
13352 #endif
13353 
13354 
13355 	if (u8Ctrl2 & ENABLE_SCALER_AUTO_DBK_DRIVER)  //Edison_DBK_driver 0x01
13356 	{
13357 		//DEBUG_LC_Turn_On(pInstance);
13358 
13359 		DBK_Crma_Enable(pInstance);
13360 		DBKDebugModeOn = (MApi_XC_R2BYTEMSK(REG_SC_BK0C_40_L, 0x0080)>0)?1:0;
13361 		DBKFastUpEnable = (MApi_XC_R2BYTEMSK(REG_SC_BK30_0F_L, 0x1000)&& (DBKDebugModeOn == 0 )  );
13362 #ifdef DBG_DBK_LC
13363 		DEBUG_LC_FrameEdg(pInstance,FrameBLKEdgIIR);
13364 		DEBUG_LC_FrameBlk(pInstance,FrameBLKStrIIR);
13365 		DEBUG_LC_FrameDet(pInstance,FrameBLKDetIIR);
13366 #endif
13367 		//				DEBUG_LC_ColorSum(pInstance,ColorSum);
13368 
13369 		if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW) == FALSE)
13370 		{
13371 			PRT_TRP("MApi_XC_GetStatus failed because of InitData wrong, please update header file and compile again\n");
13372 		}
13373 
13374 		sceneChgP2 = sceneChgP1;
13375 		sceneChgP1 = sceneChg;
13376 		sceneChg   = isSceneChangeY;
13377 
13378 		if ( ((sceneChg==1)||(sceneChgP1==1)||(sceneChgP2==1) )&& DBKFastUpEnable && !DBKDebugModeOn)
13379 		{
13380 			//reset
13381 			MApi_XC_W2BYTEMSK(REG_SC_BK0C_39_L, (MS_U16)((0x08<<8)|0x08), 0xFFFF); //width
13382 			//MApi_XC_W2BYTEMSK(REG_SC_BK30_0F_L, 0x8<<4, 0x00F0); //markValue
13383 			//MApi_XC_W2BYTEMSK(REG_SC_BK30_0F_L, 0x4   , 0x000F); //markDefValue
13384 			MApi_XC_W2BYTEMSK(REG_SC_BK0C_47_L, 0x0   , 0x000F); //Cplx gain for black white water flow
13385 			FrameBLKEdgIIR = 60;
13386 			FrameBLKStrIIR = 30;
13387 			FrameBLKDetIIR = 30;
13388 
13389 			if (sceneChg == 1)
13390 			{
13391 				resetBKNPart(0x8, 0, blocknessCheck);
13392 				resetBKNPart(0x8, 1, blocknessCheck);
13393 				resetBKNPart(0x8, 2, blocknessCheck);
13394 			}
13395 			else if (sceneChgP1 == 1)
13396 			{
13397 				resetBKNPart(0x8, 0, BlockinessCheckIIR);
13398 				resetBKNPart(0x8, 1, BlockinessCheckIIR);
13399 				resetBKNPart(0x8, 2, BlockinessCheckIIR);
13400 			}
13401 			else if (sceneChgP2 == 1)
13402 			{
13403 				resetBKNPart(0x8, 0, BlockinessCheckPre);
13404 				resetBKNPart(0x8, 1, BlockinessCheckPre);
13405 				resetBKNPart(0x8, 2, BlockinessCheckPre);
13406 				cntForDBK = DBK_PARTIOVER;
13407 			}
13408 			else
13409 			{
13410 				//DRVSCA_DBG(PRT_TRP("===========ghost hitting wall===========\n"));
13411 			}
13412 
13413 		}
13414 		else
13415 		{
13416 			FrameBLKStrTmp = parameterControl(pInstance,FrameBLKEdgIIR, FrameBLKStrIIR, FrameBLKDetIIR, cpxGain, _hpfHdCntReport3, _hpfSdCntReport3);
13417 
13418 			if ( (cntForDBK >= 0) && (cntForDBK < SRAMTIMESLOT ) )	// Read Histogram
13419 			//if ( (cntForDBK == 0) || (cntForDBK == 1) || (cntForDBK == 2) )	// Read Histogram
13420 			{
13421 				MApi_XC_W2BYTEMSK(REG_SC_BK60_35_L, 0x3FFF, 0x3FFF);
13422 				MApi_XC_W2BYTEMSK(REG_SC_BK60_3D_L, 0x3FFF, 0x3FFF);
13423 
13424 				readDBKHistAck = readHistogramPart(pInstance,histogram, cntForDBK, SRAMTIMESLOT);
13425 
13426 				if( (cntForDBK == SRAMTIMESLOT - 1 )&& readDBKHistAck)
13427 				//if( (cntForDBK == 2 )&& readDBKHistAck)
13428 				{
13429 					MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 1, 0x0001);
13430 				}
13431 				if (readDBKHistAck)
13432 					cntForDBK++;
13433 			}
13434 			else if ( (cntForDBK >= SRAMTIMESLOT) && (cntForDBK < HDBK_PARTIOVER) )
13435 			//else if ( (cntForDBK > 2) && (cntForDBK < HDBK_PARTIOVER) )
13436 			{
13437 				cpxGain = BWPatchDBK(pInstance,lumaHistogramStates, ColorSum, uComplex, me1Still, mvNotFound, /*nonMv0Comfirm,*/ mv0Comfirm);
13438 
13439 				int cntForHDBK = 0;
13440 				cntForHDBK = cntForDBK - SRAMTIMESLOT;
13441 				blkReturnValue = DBK_Detect_Partition(pInstance, blocknessCheck, histogram, &cntForHDBK, _hdsddFilterBaseReport, isSceneChange, FrameBLKStrTmp, MARKTIMESLOT, ADJTIMESLOT);
13442 				cntForDBK = cntForHDBK + SRAMTIMESLOT;
13443 				if ( blkReturnValue != -1)
13444 				{
13445 					blkConfidence = blkReturnValue;
13446 
13447 				}
13448 				cntForDBK++;
13449 			}
13450 			else if ((cntForDBK >= HDBK_PARTIOVER) && (cntForDBK < HDBK_PARTIOVER+SRAMTIMESLOT) )
13451 			//else if ((cntForDBK == HDBK_PARTIOVER) || (cntForDBK == HDBK_PARTIOVER+1) ||(cntForDBK == HDBK_PARTIOVER+2))
13452 			{
13453 				//WRITE TO BLOCKNESS POSITION SRAM
13454 				writeToSRAMPart(pInstance,blocknessCheck, (cntForDBK-HDBK_PARTIOVER), SRAMTIMESLOT);
13455 				cntForDBK++;
13456 			}
13457 			else if (cntForDBK >= HDBK_PARTIOVER+SRAMTIMESLOT )
13458 			{
13459 				cntForVDBK = cntForDBK - (HDBK_PARTIOVER+SRAMTIMESLOT);
13460 				VDBK_Detect( pInstance,blkConfidence, &cntForVDBK, VSRAMTIMESLOT );
13461 				cntForDBK = cntForVDBK + (HDBK_PARTIOVER+SRAMTIMESLOT);
13462 				if (cntForDBK >= DBK_PARTIOVER)
13463 					cntForDBK = 0;
13464 				else
13465 					cntForDBK++;
13466 			}
13467 			else
13468 				cntForDBK = 0;
13469 
13470 		}
13471 
13472         if(u8Ctrl2 & ENABLE_SCALER_AUTO_DBK_NMR_DRIVER)
13473         {
13474 		NoiseMaskingControl(FrameBLKStrTmp,isSceneChange);
13475         }
13476 	}
13477 
13478 
13479 	if(u8Ctrl2 & ENABLE_SCALER_MCDI_DRIVER) //Edison_UCDi_driver 0x02
13480 	{
13481 
13482 		MDrv_SC_KFC_EODiW_Motionless(pInstance); /*2012-07-26 Author:sam.hung*/
13483 #if HQV_JAGGY_PATTERN_ENBLE
13484         if(!_bIsHDSource)   //SD case
13485         isSdHqvJaggedTest = MDrv_SC_HQV_JaggedTestPattern( pInstance,GMV );
13486 	//printf("HQV_JAGGY_PATTERN_ENBLE == %d\n\n",HQV_JAGGY_PATTERN_ENBLE);
13487 #endif
13488 	MDrv_SC_Agate_SubMvPanScan( pInstance,GMV, isSceneChangeMc, isSdHqvJaggedTest, u16MotionValue4 );
13489 	MDrv_SC_EODi_Armored( pInstance,GMV, mv0Comfirm , nonMv0Comfirm);
13490 
13491 	//isMcFilmSlowMotion = _bIsHDSource ? MDrv_SC_McFilmLikeForSlowMotion( u32MotionValue2, GMV ) : false;
13492     isSparsePattern = MDrv_SC_ukoSabihS_SparsePattern(pInstance, mvNotFound, mvNotFoundME2, mv0Comfirm, nonMv0Comfirm, mv0ComfirmME2, nonMv0ComfirmME2, _bIsHDSource); /*FOR VG846 sparse content pattern*/
13493 
13494 #if SHIBASOKU_ENABLE
13495     isHBurstMoving = MDrv_SC_ukoSabihS_HBurstMoving(pInstance, _hpfSdTolerantReport/*_hpfSdCntReport*/ );
13496     isHBurst = MDrv_SC_ukoSabihS_HBurst(pInstance, _hpfSdTolerantReport/*_hpfSdCntReport*/, uComplex );
13497     ukoSabihS_en = MDrv_SC_Agate_ukoSabihS(pInstance,&stXCStatus, GMV,nonMv0Comfirm, filmstatus, isMcFilmukoSabihS, &isUkosabihsMotion, &isUkosabihsMc, &isUkosabihsForFilm, mv0Comfirm, &isUkosabihsMv0, _bIsHDSource);
13498     isUkosabihsMcSweep = MDrv_SC_sweep_ukoSabihS( pInstance, GMV,	nonMv0Comfirm, mv0Comfirm, filmstatus, isMcFilm, uComplex, &isUkosabihsMotionSweep );
13499     isUkosabihsMc = ( isUkosabihsMc & (!isBigFeather) );  /*isBigFeather for Ukosabihs scence change */
13500     isBigFeather = (isFeatherAndMotion > 0x100)? true	:	false;
13501     isArtifactPattern = MDrv_SC_ukoSabihS_ArtifactPattern(pInstance,_hpfHdTolerantReport,_bIsHDSource);
13502     isNoLumaCplx =  MDrv_SC_ukoSabihS_noLumaCplx(pInstance); //=>no chroma
13503     isMcFilmukoSabihS	= MDrv_SC_McFilmUkoSabihS(pInstance, opFrameStatus, _bIsHDSource, _hpfHdCntReport );
13504 #else
13505     isBigFeather = isBigFeather;
13506     isMcFilmukoSabihS = isMcFilmukoSabihS;
13507     isUkosabihsForFilm = isUkosabihsForFilm;
13508 #endif
13509 
13510 
13511     isMcOutOfSearchRange = MDrv_SC_McOutOfSearchRange( pInstance,mvNotFound, mv0Comfirm, nonMv0Comfirm, isFeatherAndMotion, GMV );
13512 
13513     if((_bIsHDSource)&& KURO_PATTERN_ENABLE == 1)   //HD case
13514     {
13515         isMcFilmSlowMotion  = MDrv_SC_McFilmLikeForSlowMotion( pInstance,u32MotionValue2, GMV ); /*fot Kuro increase SST */
13516         //printf("McFilmLikeForSlowMotion ==1\n\n");
13517     }
13518     else
13519     {
13520 	isMcFilmSlowMotion = false;
13521         //printf("McFilmLikeForSlowMotion ==0\n\n");
13522     }
13523 
13524 //isZoomMoving = _bIsHDSource ? false : MDrv_SC_ZoomMoving( GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
13525     if(!_bIsHDSource)   //SD case for S Tree and Flower
13526     {
13527         isZoomMoving = MDrv_SC_ZoomMoving(pInstance, GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
13528     }
13529     else
13530     {
13531         isZoomMoving = false;
13532     }
13533 
13534 #if LG_SPECIFIC_PATTERN_ENABLE
13535     if(!_bIsHDSource)   //SD case
13536     {
13537 			isL139 = MDrv_SC_Agate_L139(pInstance, TotalMvComfirm, ColorSum, uComplex, me1Still, ME1HisStates_2 );
13538 			isL153 = MDrv_SC_Agate_L153(pInstance, movingWithoutFeather, ColorSum, uComplex, ME1HisStates_2 );
13539 			isL107 = MDrv_SC_Agate_L107(pInstance, TotalMvComfirm, uComplex, GMV, u32MotionValue, TotalFeather, 2/*HDMI only*/ );
13540 			//isSWoman = MDrv_SC_SBlueShirt(pInstance,nonMv0Comfirm, mv0Comfirm, mvNotFound, mvNotFoundME2, uComplex, ME1HisStates_2, GMV );
13541         //isWeakMcNrFilm = filmstatus.film_act;
13542 	isAbihsot = false;
13543     }
13544     else    //HD case
13545     {
13546         isL139 = false;
13547         isL153 = false;
13548         isL107 = false;
13549         //isSWoman = false;
13550         //isWeakMcNrFilm = false;
13551         isAbihsot = false;
13552     }
13553 #else
13554     movingWithoutFeather = movingWithoutFeather;
13555     TotalMvComfirm = TotalMvComfirm;
13556     TotalFeather = TotalFeather;
13557 #endif
13558 
13559 //Double Control
13560 		MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(pInstance, inSearchUseFeather, isMcFilm );
13561 		MDrv_SC_KFC_8bitMotionGain_Ctrl(pInstance, ( (isZoomMoving) & (!isSceneChangeMc)) , isMcFilm, isMcFilmSlowMotion );
13562 
13563 		MDrv_SC_featherSstGain_Ctrl(pInstance, isMcFilmSlowMotion ); /* for kuro propeller.. */
13564 		MDrv_SC_featherSstOffset_Ctrl(pInstance, opFrameStatus, isMcFilmSlowMotion, ( (isZoomMoving) & (!isSceneChangeMc) )); /* for kuro propeller.. */
13565 
13566 		MDrv_SC_MotionLimitGain_Ctrl(pInstance, isL153 );
13567       MDrv_SC_UCDi_Weight_Boundary_Ctrl(pInstance, ME1HisStates_1 ); /*patch for Boundary flicker issue when vertical scroll*/
13568 		MDrv_SC_MCDi_En_Ctrl(pInstance, ( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | Bouncing_status | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ) );
13569 
13570     MDrv_SC_Force_Motion_Ctrl( pInstance,isL139, ( isUkosabihsMotion | isUkosabihsMotionSweep ) );
13571     MDrv_SC_Force_Mcdi_Ctrl(pInstance,isUkosabihsMc);
13572     MDrv_SC_KFC_EODiW_Ctrl( pInstance,( isUkosabihsMc | isUkosabihsMcSweep ) );
13573     MDrv_SC_Mcdi_EODiW_Ctrl( pInstance,( isUkosabihsMc | isUkosabihsMcSweep ), isL107 );
13574     MDrv_SC_KFC_Ctrl( pInstance,isAbihsot );
13575     MDrv_SC_UCDi_OP1_HisWeight_Ctrl(pInstance,Bouncing_status,Feather_sum_status,filmstatus, ColorSum, FeatherSum, _bIsHDSource);
13576     MDrv_SC_SPF_OP1_HisWeight_Ctrl(pInstance,Bouncing_status);
13577     MDrv_SC_SST_Ctrl(pInstance,( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | bBouncing_Status2 | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ), FeatherSum, _bIsHDSource);
13578 
13579 }
13580     /*isMEReset =*/ MDrv_SC_Agate_ME_Reset(pInstance,u32MotionValue2,isSceneChangeMc,isSceneChangeY, isSourceChangeForME);
13581 
13582     if(u8Ctrl2 & ENABLE_SCALER_MCNR_DRIVER)  //Edison_UCNR_driver 0x04
13583     {
13584         NE_confirm = MDrv_SC_GetNoiseLevel(pInstance, &estNoise, &letterBoxState, &stXCStatus, stXCStatus.bInterlace, isOpFrameChanged );
13585         MDrv_SC_NR_Driver_E28( pInstance,u16MotionValue4, /*blkConfidence,*/ /*_hpfHdTolerantReport,*/ &lumaHistogramStates, &filmstatus, &GMV, isUkosabihsMotion, isSceneChange, stXCStatus.bInterlace, _bIsHDSource, isSourceChangeFlag, isOpFrameChanged ,&estNoise, NE_confirm);
13586 #ifdef DBG_SCCHG_LC
13587 	DEBUG_LC_42( pInstance,isSceneChangeY, isSceneChangeMc );
13588 #endif
13589     }
13590 
13591     if(u8Ctrl2 & ENABLE_SCALER_SDHD_DETECT_DRIVER)  //Edison_SDHD_driver 0x08
13592     {
13593         MDrv_SC_Edision_stillFeatherDetection( pInstance,u32MotionValue, isUkosabihsMotion, _hdFilterBaseReport, isHBurstMoving, isHBurst, isUkosabihsMv0, isMcFilmHd/*, isSceneChange*/, _hpfSdTolerantReport );
13594 
13595         static int DMS_SD2HD_Cnt = 0;
13596 	// DMS SDtoHD mode
13597         MS_BOOL GMV_StillLike = (_bIsHDSource) && (GMV.minMvXdir >= 31) && (GMV.minMvXdir <= 33) && (GMV.minMvYdir >= 7) && (GMV.minMvYdir <= 9) ;
13598         MS_BOOL SD2HDCntLike1  = ( (_hpfHdCntReport>>7) > 2) && ( (_hpfHdCntReport>>7) < 8);
13599         MS_BOOL SD2HDCntLike2  = ( (_hpfSdCntReport>>3) > (_hpfHdCntReport*6) );
13600         MS_BOOL DBKLike = (FrameBLKEdgIIR > 31) && (FrameBLKEdgIIR < 80);
13601 	//DEBUG_LC_Full6bit3(__minmax((_hpfHdCntReport>>7), 0, 63) );
13602 	//DEBUG_LC_Full6bit4(__minmax((FrameBLKEdgIIR>>1), 0, 63) );
13603 #if 0
13604 		if ( GMV_StillLike )
13605 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
13606 		else
13607 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
13608 
13609 		if ( SD2HDCntLike1 )
13610 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0700, 0x0700);
13611 		else
13612 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0700);
13613 
13614 		if ( SD2HDCntLike2 )
13615 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0070, 0x0070);
13616 		else
13617 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0070);
13618 
13619 		if ( DBKLike )
13620 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0007, 0x0007);
13621 		else
13622 			MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0007);
13623 #endif
13624         if (isSceneChange || isSourceChangeFlag)
13625         {
13626             DMS_SD2HD_Cnt = 0;
13627         }
13628         else if ( GMV_StillLike && SD2HDCntLike1 && SD2HDCntLike2 && DBKLike )
13629         {
13630             DMS_SD2HD_Cnt += 4;
13631         }
13632         else
13633         {
13634             if (!GMV_StillLike)
13635                 DMS_SD2HD_Cnt -= 1;
13636             if (!SD2HDCntLike1)
13637                 DMS_SD2HD_Cnt -= 1;
13638             if (!SD2HDCntLike2)
13639                 DMS_SD2HD_Cnt -= 1;
13640             if (!DBKLike)
13641                 DMS_SD2HD_Cnt -= 1;
13642         }
13643             DMS_SD2HD_Cnt = __minmax(DMS_SD2HD_Cnt, 0, 63);
13644             DMS_SDHDModeCheck(pInstance,DMS_SD2HD_Cnt);
13645         }
13646 
13647 
13648     if(u8Ctrl2 & ENABLE_SCALER_CCS_DRIVER)  //Edison_CCS_driver 0x20
13649     {
13650     	//MDrv_SC_Edison_CCS_driver(ukoSabihS_en);
13651     	MDrv_SC_Edison_CCS_driver(pInstance,ukoSabihS_en|isSparsePattern); //Add isSparsePattern for TG59 Variable Dot pattern(Pure Color pattern)
13652     }
13653 
13654     if(u8Ctrl2 & ENABLE_SCALER_DHD_DRIVER)  //Edison_DHD_driver 0x40
13655     {
13656         //		u8SDHDDReport = false;
13657         MDrv_SC_Edison_DHD_driver(pInstance,uComplex, nonMv0Comfirm, me1Still, mv0Comfirm, GMV, _hpfHdCntReport);
13658         MDrv_SC_Edison_DHD_Weather_driver(pInstance,uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
13659         MDrv_SC_Edison_DHD_GSLSM_driver(pInstance,uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
13660         MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(filmstatus);
13661         //MDrv_SC_Edison_DHD_Stadium_driver(pInstance,isMcFilmHd,filmstatus);
13662     }
13663 
13664     if(u8Ctrl & ENABLE_SCALER_D3D_DRIVER)  //Edison_Detect_3D_Source_driver
13665     {
13666     	 MDrv_SC_3DfmtDetect(pInstance); //2012.7.24 mark
13667     }
13668 
13669     if (u8Ctrl & ENABLE_SCALER_DEFEATHERING)
13670     {
13671     	MDrv_SC_de_feathering(pInstance,u32MotionValue);
13672     }
13673 
13674     if (u8Ctrl & ENABLE_SCALER_DEFLICKERING)
13675     {
13676     	MDrv_SC_de_flickering(pInstance,u32MotionValue);
13677     }
13678 
13679     if (u8Ctrl & ENABLE_SCALER_DEBOUNCING)
13680     {
13681     	MDrv_SC_de_bouncing(pInstance,u32MotionValue2);
13682     }
13683 
13684     if( (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(14)) == BIT(14))
13685             || (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(15)) == BIT(15)) )
13686     {
13687         if(!_Hal_PQ_FrameLockCheck(pInstance)) // Make not frame LOCKED then turn off FilmMode
13688         {
13689             MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
13690             MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
13691         }
13692         else    // Make sure frame LOCKED then turn on FilmMode
13693         {
13694             if(bFakeOutCusEnable)
13695             {
13696                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, 0, BIT(1)); //hardware film mode ENABLE
13697                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, 0, BIT(1) | BIT(2)); //software film mode ENABLE
13698             }
13699             else
13700             {
13701                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
13702                 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
13703             }
13704         }
13705     }
13706 //
13707 //******UFSC DRIVER******//
13708 //
13709     MS_U16 FSC_estNoise=0;
13710     MS_U8 FSC_estConfirm=0;
13711 
13712     //NE transfer from SOC GetNoiseLevel
13713     FSC_estNoise = __minmax(estNoise/10, 0, 15);
13714     FSC_estConfirm = __minmax( NE_confirm, 1, 8);
13715 
13716     // SR enhancement strength
13717     int srEnhStr = (MDrv_UFSC_Read2Byte( REG_FSC_BK30_3E_L)& 0x003F ); // 1.5
13718     static XC_BackgroundState backgroundState;
13719     MDrv_UFSC_PQ_BNF_status( &backgroundState, isOpFrameChanged );
13720 
13721     // OSD info
13722     MS_BOOL isOSDActive = MDrv_UFSC_Read2Byte(REG_FSC_BK132_4A_L)>>11;
13723     static MS_U8 osdW = 0;
13724     if( isOSDActive )
13725     {
13726         osdW = osdW < 253 ? osdW + 2 : 255;
13727     }
13728     else
13729     {
13730         osdW = osdW > 16 ? osdW - 16 : 0;
13731     }
13732 
13733     static int dsStdCnt = 0, frNNCnt = 0, frNNCnt2 = 0;
13734     static int frDsSum = 0, frFetSum = 0, frNNSum = 0;
13735     {
13736         int dsStdCntTmp = MDrv_UFSC_Read2Byte(REG_FSC_BK2C_79_L) + MDrv_UFSC_Read2Byte(REG_FSC_BKAC_79_L);
13737         int frNNCntTmp = MDrv_UFSC_Read2Byte(REG_FSC_BK72_31_L) + MDrv_UFSC_Read2Byte(REG_FSC_BKF2_31_L);
13738         int frNNCnt2Tmp = MDrv_UFSC_Read2Byte(REG_FSC_BK72_33_L) + MDrv_UFSC_Read2Byte(REG_FSC_BKF2_33_L); // not changed with settings
13739 
13740         int frDsSumTmp = ( (MDrv_UFSC_Read2Byte(REG_FSC_BK72_7B_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BK72_7A_L)
13741                     + (MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7B_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7A_L) ) >> 1;
13742         int frFetSumTmp = ( (MDrv_UFSC_Read2Byte(REG_FSC_BK72_7D_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BK72_7C_L)
13743                     + (MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7D_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7C_L) ) >> 1;
13744         int frNNSumTmp = ( (MDrv_UFSC_Read2Byte(REG_FSC_BK72_7F_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BK72_7E_L)
13745                     + (MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7F_L) << 16) + MDrv_UFSC_Read2Byte(REG_FSC_BKF2_7E_L) ) >> 1;
13746 
13747         dsStdCnt = ( dsStdCntTmp + dsStdCnt*3 ) >> 2;
13748         frNNCnt = ( frNNCntTmp + frNNCnt*3 ) >> 2;
13749         frNNCnt2 = ( frNNCnt2Tmp + frNNCnt2*3 ) >> 2;
13750         frDsSum = ( frDsSumTmp + frDsSum*3 ) >> 2;
13751         frFetSum = ( frFetSumTmp + frFetSum*3 ) >> 2;
13752         frNNSum = ( frNNSumTmp + frNNSum*3 ) >> 2;
13753     }
13754 
13755 #if 1
13756     int menuW, edgePatW; // for menu and dragon ball like edge pattern
13757     {
13758         // menu pattern
13759     menuW = __max( 0, (int)backgroundState.cplxRawCnt - ((int)backgroundState.dswRawCnt * 3) );
13760     menuW = __min( 256, menuW );
13761     menuW = 256 - menuW;
13762 
13763     int cplxW = __max( 0 , (int)backgroundState.cplxRawCnt - 4096 ) >> 4;
13764     menuW = __max( 0, menuW - cplxW );
13765 
13766     int fetDsW = __max( 0, frFetSum - frDsSum ) >> 2;
13767     menuW = __max( 0, menuW - fetDsW );
13768 
13769     int fetW = __max( 0, frFetSum - 512 ) >> 2;
13770     menuW = __max( 0, menuW - fetW );
13771 
13772     // OSD
13773     menuW = __max( menuW, osdW );
13774     }
13775     {
13776     // edge pattern : dragon ball, AUO_0011,12
13777     edgePatW = (__max( 0, (int)backgroundState.cplxRawCnt - ( ((int)backgroundState.dswRawCnt * 19) >> 3 )))>>2;
13778     edgePatW = __min( 256, edgePatW );
13779     edgePatW = 256 - edgePatW;
13780 
13781     int dsFetW = __max( 0, frDsSum - frFetSum );
13782     dsFetW = __min( 256, dsFetW );
13783     int stdW = __max( 0, dsStdCnt - 1024 ) >> 2;
13784     dsFetW = __max( 0, dsFetW - stdW );
13785     edgePatW = __max( 0, edgePatW - dsFetW );
13786 
13787     //int flatW = max( 0 , 4096 - (int)backgroundState.cplxRawCnt ) >> 1;
13788     //edgePatW = max( 0, edgePatW - flatW );
13789     }
13790     int fHdW;
13791     {
13792         fHdW = __max( 0,  65536 - (int)_hpfHdCntReport ) >> 6;
13793     //fHdW = max( 0,  16384 - (int)hpfHdCntReport ) >> 4;
13794         fHdW = __min( 256, fHdW );
13795     }
13796 
13797     int sdW;
13798     {
13799         sdW = __max( 0, 2048 - (int)_hpfHdCntReport ) >> 2;
13800         sdW = __min( 256, sdW );
13801         sdW = __max( 0 , sdW - __max( edgePatW, menuW )/*edgePatW*/ );
13802 
13803         int hdClampW = __max( 0, (int)hdNactCnt - (int)65536 ) >> 3;
13804         sdW = __max( 0 , sdW - hdClampW );
13805 
13806     //printf( "SDW : %d\n", sdW );
13807     }
13808 #endif
13809 
13810     if (u8UFSCCtrl3 & ENABLE_SR_DRIVER)
13811     {
13812         MDrv_UFSC_PQ_LSE( frNNCnt2, menuW, edgePatW, sdW, srEnhStr );
13813         MDrv_UFSC_PQ_NLM( &backgroundState, menuW, edgePatW, srEnhStr );
13814         MDrv_UFSC_PQ_PreEnh( fHdW, sdW, FSC_estNoise, FSC_estConfirm, srEnhStr );
13815         MDrv_UFSC_PQ_PostPK3x3( menuW, edgePatW, fHdW, sdW, srEnhStr );
13816         MDrv_UFSC_PQ_HASC( sdW, srEnhStr );
13817         MDrv_UFSC_PQ_P2M( menuW, edgePatW, srEnhStr );
13818         MDrv_UFSC_PQ_ANN( frNNCnt2 );
13819         MDrv_UFSC_PQ_DMS_referBNF( &backgroundState );
13820         MDrv_UFSC_PQ_LSE_Patch();
13821     }
13822 
13823 	MDrv_SC_ResetSourceChange( pInstance,isSourceChangeForME );
13824 
13825 	prevOpFrameStatus = opFrameStatus;
13826 }
13827 
13828 #undef DRV_SCALER_ADAPTIVE_C
13829 
13830