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