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 #include <linux/random.h>
104 #endif
105 // Common Definition
106 #include "MsCommon.h"
107 #include "MsOS.h"
108
109 // Internal Definition
110 #include "hwreg_utility2.h"
111 #include "color_reg.h"
112
113 #include "drvXC_IOPort.h"
114 #include "apiXC.h"
115 #include "apiXC_Dlc.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 XC_LetterBoxState lbState;
147 static MS_S32 frameWidth;
148 static MS_S32 frameHeight;
149 static MS_U8 lbConfirmLevel = 0;
150 static MS_U16 GuardBandWidth = 0x40;
151 #define MaxWidth 4097
152 #define MaxHeight 2161
153 //DBK Variables
154 #define paraSize 32
155 #define paraVerSize 16
156 static MS_S32 WidthIIR = 8,VWidthIIR = 8;
157 //PQ driver SD HD report W IIR
158 static MS_U32 u32SdW = 0, u32FhdW = 0;
159
160 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}};
161
162 // Threshold for blockness check
163 const int hitrate_threshold = 128; // 160/256
164 const int hitRateDiffThr = 16; // 16/256
165 //Patch switching control
166 #define HQV_JAGGY_PATTERN_ENBLE 0
167 #define SHIBASOKU_ENABLE 1
168 #define LG_SPECIFIC_PATTERN_ENABLE 0
169 #define SZ_PATTERN_ENABLE 1
170 #define SEC_HQV_PATTERN 0
171 #define KURO_PATTERN_ENABLE 0
172 #define HOUSE_MD_PATTERN_ENABLE 0
173
174 #define MCNR_LUT_LOAD_FROM_QMAP 1
175 #define PDNR_LUT_LOAD_FROM_QMAP 1
176
177 #define FOR_FULL_RANGE 0
178 #if !defined(MSOS_TYPE_LINUX_KERNEL)
179 extern __attribute__((weak))MS_U8 MApi_XC_DLC_GetAverageValue(void);
180 #endif
181 //-------------------------------------------------------------------------------------------------
182 // Local Variables
183 //-------------------------------------------------------------------------------------------------
184
185
186 //-------------------------------------------------------------------------------------------------
187 // Debug Functions
188 //-------------------------------------------------------------------------------------------------
189
190 /******************************************************************************/
191 /// Debug Info Control
192 /******************************************************************************/
DEBUG_LC_Turn_On(void)193 void DEBUG_LC_Turn_On(void)
194 {
195 MApi_XC_W2BYTEMSK(REG_SC_BK30_38_L, 0x0001, 0x0001 );
196 MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0002, 0x0002 );
197 }
198
DEBUG_LC(const MS_U16 lightReg,const MS_U8 val,const MS_U8 color)199 void DEBUG_LC( const MS_U16 lightReg, const MS_U8 val, const MS_U8 color )
200 {
201 if( val == 0 )
202 MApi_XC_W2BYTEMSK(lightReg, ( color << (val<<2) ), ( 0x7 << (val<<2) ) );
203 else if( val == 1 )
204 MApi_XC_W2BYTE(lightReg, ( color << 4 ) | color );
205 else if( val == 2 )
206 MApi_XC_W2BYTE(lightReg, ( color << 8 ) | ( color << 4 ) | color );
207 else
208 MApi_XC_W2BYTE(lightReg, ( color << 12 ) | ( color << 8 ) | ( color << 4 ) | color );
209 }
210
DEBUG_LC_40(const MS_U8 a)211 void DEBUG_LC_40( const MS_U8 a )
212 {
213 if( (a > 0x00) && (a < 0x04) )
214 {
215 MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0001 );
216 }
217 else if( (a > 0x03) && (a < 0x10) )
218 {
219 MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0011 );
220 }
221 else if( (a > 0x0F) && (a < 0x40) )
222 {
223 MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0111 );
224 }
225 else if( (a > 0x3F) /*&& (a < 0x100)*/ )
226 {
227 MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x1111 );
228 }
229 else
230 {
231 MApi_XC_W2BYTE(REG_SC_BK30_40_L, 0x0000 );
232 }
233 }
234
DEBUG_LC_41(const MS_U8 a)235 void DEBUG_LC_41( const MS_U8 a )
236 {
237 if( (a > 0) && (a < 4) )
238 {
239 MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0002 );
240 }
241 else if( (a > 3) && (a < 8) )
242 {
243 MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0022 );
244 }
245 else if( (a > 7) && (a < 12) )
246 {
247 MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0222 );
248 }
249 else if( (a > 11) )
250 {
251 MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x2222 );
252 }
253 else
254 {
255 MApi_XC_W2BYTE(REG_SC_BK30_41_L, 0x0000 );
256 }
257 }
258
DEBUG_LC_42(const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY)259 void DEBUG_LC_42( const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY )
260 {
261 if( isSceneChangeMc )
262 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0003, 0x0007);
263 else
264 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0007);
265
266 if( isSceneChangeY )
267 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0040, 0x0070);
268 else
269 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x0000, 0x0070);
270 }
271
DEBUG_LC_43(MS_U8 noiseLevel)272 void DEBUG_LC_43( MS_U8 noiseLevel )
273 {
274 /*
275 if( noiseLevel < 0 )
276 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x1111, 0x7777 );
277 else
278 */
279 {
280 MS_U8 val = noiseLevel >> 5;
281 if( val == 0 )
282 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0000, 0x7777);
283 else if( val == 1 )
284 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0002, 0x7777);
285 else if( val == 2 )
286 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0022, 0x7777);
287 else if( val == 3 )
288 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x0222, 0x7777);
289 else
290 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x2222, 0x7777);
291 }
292 }
293
DEBUG_LC_55(const MS_U8 GG)294 void DEBUG_LC_55( const MS_U8 GG )
295 {
296
297 //BK30_40~BK30_5F
298 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
299 //LSB(low byte) = left, MSB(high byte) = right
300 if ( GG == 1 )//white
301 {
302 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
303 }
304 else if (GG == 2)//green
305 {
306 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x2222, 0x7777);
307 }
308 else//black
309 {
310 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
311 }
312 }
313
DEBUG_LC_56(const MS_U8 GG)314 void DEBUG_LC_56( const MS_U8 GG )
315 {
316
317 //BK30_40~BK30_5F
318 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
319 //LSB(low byte) = left, MSB(high byte) = right
320 if ( GG == 1 )//white
321 {
322 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
323 }
324 else if (GG == 2)//green
325 {
326 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x2222, 0x7777);
327 }
328 else//black
329 {
330 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
331 }
332 }
DEBUG_LC_57(const MS_U8 GG)333 void DEBUG_LC_57( const MS_U8 GG )
334 {
335
336 //BK30_40~BK30_5F
337 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
338 //LSB(low byte) = left, MSB(high byte) = right
339 if ( GG == 1 )//white
340 {
341 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
342 }
343 else if (GG == 2)//green
344 {
345 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x2222, 0x7777);
346 }
347 else//black
348 {
349 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
350 }
351 }
352
DEBUG_LC_5D(const MS_U8 GG)353 void DEBUG_LC_5D( const MS_U8 GG )
354 {
355
356 //BK30_40~BK30_5F
357 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
358 //LSB(low byte) = left, MSB(high byte) = right
359 if ( GG == 1 )//white
360 {
361 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
362 }
363 else if (GG == 2)//green
364 {
365 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x2222, 0x7777);
366 }
367 else//black
368 {
369 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
370 }
371 }
DEBUG_LC_5E(const MS_U8 GG)372 void DEBUG_LC_5E( const MS_U8 GG )
373 {
374
375 //BK30_40~BK30_5F
376 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
377 //LSB(low byte) = left, MSB(high byte) = right
378 if ( GG == 1 )
379 {
380 MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x7777, 0x7777);
381 }
382 else if (GG == 2)
383 {
384 MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x2222, 0x7777);
385 }
386 else
387 {
388 MApi_XC_W2BYTEMSK(REG_SC_BK30_5E_L, 0x0000, 0x7777);
389 }
390 }
DEBUG_LC_5F(const MS_U8 GG)391 void DEBUG_LC_5F( const MS_U8 GG )
392 {
393
394 //BK30_40~BK30_5F
395 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
396 //LSB(low byte) = left, MSB(high byte) = right
397 if ( GG == 1 )
398 {
399 MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x7777, 0x7777);
400 }
401 else if (GG == 2)
402 {
403 MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x2222, 0x7777);
404 }
405 else
406 {
407 MApi_XC_W2BYTEMSK(REG_SC_BK30_5F_L, 0x0000, 0x7777);
408 }
409 }
410
411 //Add by Bella for SHDH debug 8/30
412 //Renamed by Probex Sep.06 2013
DEBUG_LC_Full6bit(const MS_U8 data)413 void DEBUG_LC_Full6bit( const MS_U8 data )
414 {
415 //BK30_50, BK30_54, BK30_58
416 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
417 //LSB(low byte) = left, MSB(high byte) = right
418
419 if ( data <= 7 )
420 {
421
422 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, data, 0x7777);
423 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
424 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
425
426 }
427 else if ( data <= 14 )
428 {
429 MS_U16 dataExpression = ( (data-7) << 4) + 7;
430 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
431 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
432 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
433 }
434 else if ( data <= 21)
435 {
436 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
437 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
438 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
439 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
440 }
441 else if (data <= 28 )
442 {
443 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
444 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, dataExpression, 0x7777);
445 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x0000, 0x7777);
446 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
447 }
448 else if (data <= 35)
449 {
450 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
451 MS_U16 dataExpression = ( data-28 );
452 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
453 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
454
455 }
456 else if (data <= 42 )
457 {
458 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
459 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
460 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
461 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
462 }
463 else if (data <= 49 )
464 {
465 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
466 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
467 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
468 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
469
470 }
471 else if (data <= 56 )
472 {
473 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
474 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
475 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, dataExpression, 0x7777);
476 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x0000, 0x7777);
477 }
478 else if (data <= 63 )
479 {
480 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
481 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
482 MS_U16 dataExpression = (data - 56 );
483 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, dataExpression, 0x7777);
484 }
485 else //>64
486 {
487 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x7777, 0x7777);
488 MApi_XC_W2BYTEMSK(REG_SC_BK30_54_L, 0x7777, 0x7777);
489 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x7777, 0x7777);
490 }
491 }
DEBUG_LC_Full6bit2(const MS_U8 data)492 void DEBUG_LC_Full6bit2( const MS_U8 data )
493 {
494 //BK30_51, BK30_55, BK30_59
495 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
496 //LSB(low byte) = left, MSB(high byte) = right
497
498 if ( data <= 7 )
499 {
500
501 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, data, 0x7777);
502 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
503 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
504
505 }
506 else if ( data <= 14 )
507 {
508 MS_U16 dataExpression = ( (data-7) << 4) + 7;
509 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
510 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
511 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
512 }
513 else if ( data <= 21)
514 {
515 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
516 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
517 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
518 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
519 }
520 else if (data <= 28 )
521 {
522 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
523 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, dataExpression, 0x7777);
524 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
525 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
526 }
527 else if (data <= 35)
528 {
529 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
530 MS_U16 dataExpression = ( data-28 );
531 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
532 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
533
534 }
535 else if (data <= 42 )
536 {
537 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
538 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
539 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
540 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
541 }
542 else if (data <= 49 )
543 {
544 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
545 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
546 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
547 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
548
549 }
550 else if (data <= 56 )
551 {
552 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
553 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
554 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, dataExpression, 0x7777);
555 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
556 }
557 else if (data <= 63 )
558 {
559 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
560 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
561 MS_U16 dataExpression = (data - 56 );
562 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, dataExpression, 0x7777);
563 }
564 else
565 {
566 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
567 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
568 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
569 }
570 }
DEBUG_LC_Full6bit3(const MS_U8 data)571 void DEBUG_LC_Full6bit3( const MS_U8 data )
572 {
573 //BK30_52, BK30_56, BK30_5A
574 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
575 //LSB(low byte) = left, MSB(high byte) = right
576
577 if ( data <= 7 )
578 {
579
580 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, data, 0x7777);
581 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
582 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
583
584 }
585 else if ( data <= 14 )
586 {
587 MS_U16 dataExpression = ( (data-7) << 4) + 7;
588 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
589 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
590 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
591 }
592 else if ( data <= 21)
593 {
594 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
595 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
596 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
597 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
598 }
599 else if (data <= 28 )
600 {
601 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
602 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, dataExpression, 0x7777);
603 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
604 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
605 }
606 else if (data <= 35)
607 {
608 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
609 MS_U16 dataExpression = ( data-28 );
610 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
611 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
612
613 }
614 else if (data <= 42 )
615 {
616 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
617 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
618 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
619 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
620 }
621 else if (data <= 49 )
622 {
623 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
624 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
625 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
626 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
627
628 }
629 else if (data <= 56 )
630 {
631 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
632 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
633 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, dataExpression, 0x7777);
634 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
635 }
636 else if (data <= 63 )
637 {
638 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
639 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
640 MS_U16 dataExpression = (data - 56 );
641 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, dataExpression, 0x7777);
642 }
643 else
644 {
645 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
646 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
647 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
648 }
649 }
DEBUG_LC_Full6bit4(const MS_U8 data)650 void DEBUG_LC_Full6bit4( const MS_U8 data )
651 {
652 //BK30_53, BK30_57, BK30_5B
653 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
654 //LSB(low byte) = left, MSB(high byte) = right
655
656 if ( data <= 7 )
657 {
658
659 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, data, 0x7777);
660 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
661 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
662
663 }
664 else if ( data <= 14 )
665 {
666 MS_U16 dataExpression = ( (data-7) << 4) + 7;
667 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
668 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
669 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
670 }
671 else if ( data <= 21)
672 {
673 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
674 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
675 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
676 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
677 }
678 else if (data <= 28 )
679 {
680 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
681 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, dataExpression, 0x7777);
682 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
683 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
684 }
685 else if (data <= 35)
686 {
687 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
688 MS_U16 dataExpression = ( data-28 );
689 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
690 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
691
692 }
693 else if (data <= 42 )
694 {
695 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
696 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
697 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
698 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
699 }
700 else if (data <= 49 )
701 {
702 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
703 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
704 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
705 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
706
707 }
708 else if (data <= 56 )
709 {
710 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
711 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
712 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, dataExpression, 0x7777);
713 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
714 }
715 else if (data <= 63 )
716 {
717 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
718 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
719 MS_U16 dataExpression = (data - 56 );
720 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, dataExpression, 0x7777);
721 }
722 else
723 {
724 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
725 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
726 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
727 }
728 }
DEBUG_LC_Full6bit5(const MS_U8 data)729 void DEBUG_LC_Full6bit5( const MS_U8 data )
730 {
731 //BK30_50, BK30_54, BK30_58
732 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
733 //LSB(low byte) = left, MSB(high byte) = right
734
735 if ( data <= 7 )
736 {
737
738 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, data, 0x7777);
739 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
740 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
741
742 }
743 else if ( data <= 14 )
744 {
745 MS_U16 dataExpression = ( (data-7) << 4) + 7;
746 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
747 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
748 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
749 }
750 else if ( data <= 21)
751 {
752 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
753 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
754 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
755 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
756 }
757 else if (data <= 28 )
758 {
759 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
760 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, dataExpression, 0x7777);
761 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0000, 0x7777);
762 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
763 }
764 else if (data <= 35)
765 {
766 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
767 MS_U16 dataExpression = ( data-28 );
768 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
769 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
770
771 }
772 else if (data <= 42 )
773 {
774 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
775 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
776 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
777 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
778 }
779 else if (data <= 49 )
780 {
781 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
782 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
783 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
784 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
785
786 }
787 else if (data <= 56 )
788 {
789 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
790 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
791 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, dataExpression, 0x7777);
792 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x0000, 0x7777);
793 }
794 else if (data <= 63 )
795 {
796 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
797 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
798 MS_U16 dataExpression = (data - 56 );
799 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, dataExpression, 0x7777);
800 }
801 else //>64
802 {
803 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7777, 0x7777);
804 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x7777, 0x7777);
805 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, 0x7777, 0x7777);
806 }
807 }
DEBUG_LC_Full6bit6(const MS_U8 data)808 void DEBUG_LC_Full6bit6( const MS_U8 data )
809 {
810 //BK30_50, BK30_54, BK30_58
811 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
812 //LSB(low byte) = left, MSB(high byte) = right
813
814 if ( data <= 7 )
815 {
816
817 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, data, 0x7777);
818 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
819 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
820
821 }
822 else if ( data <= 14 )
823 {
824 MS_U16 dataExpression = ( (data-7) << 4) + 7;
825 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
826 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
827 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
828 }
829 else if ( data <= 21)
830 {
831 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
832 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
833 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
834 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
835 }
836 else if (data <= 28 )
837 {
838 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
839 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, dataExpression, 0x7777);
840 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x0000, 0x7777);
841 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
842 }
843 else if (data <= 35)
844 {
845 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
846 MS_U16 dataExpression = ( data-28 );
847 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
848 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
849
850 }
851 else if (data <= 42 )
852 {
853 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
854 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
855 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
856 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
857 }
858 else if (data <= 49 )
859 {
860 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
861 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
862 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
863 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
864
865 }
866 else if (data <= 56 )
867 {
868 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
869 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
870 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, dataExpression, 0x7777);
871 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x0000, 0x7777);
872 }
873 else if (data <= 63 )
874 {
875 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
876 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
877 MS_U16 dataExpression = (data - 56 );
878 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, dataExpression, 0x7777);
879 }
880 else //>64
881 {
882 MApi_XC_W2BYTEMSK(REG_SC_BK30_41_L, 0x7777, 0x7777);
883 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, 0x7777, 0x7777);
884 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, 0x7777, 0x7777);
885 }
886 }
DEBUG_LC_Full6bit7(const MS_U8 data)887 void DEBUG_LC_Full6bit7( const MS_U8 data )
888 {
889 //BK30_50, BK30_54, BK30_58
890 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
891 //LSB(low byte) = left, MSB(high byte) = right
892
893 if ( data <= 7 )
894 {
895
896 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, data, 0x7777);
897 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
898 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
899
900 }
901 else if ( data <= 14 )
902 {
903 MS_U16 dataExpression = ( (data-7) << 4) + 7;
904 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
905 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
906 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
907 }
908 else if ( data <= 21)
909 {
910 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
911 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
912 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
913 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
914 }
915 else if (data <= 28 )
916 {
917 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
918 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, dataExpression, 0x7777);
919 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x7777);
920 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
921 }
922 else if (data <= 35)
923 {
924 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
925 MS_U16 dataExpression = ( data-28 );
926 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
927 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
928
929 }
930 else if (data <= 42 )
931 {
932 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
933 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
934 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
935 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
936 }
937 else if (data <= 49 )
938 {
939 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
940 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
941 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
942 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
943
944 }
945 else if (data <= 56 )
946 {
947 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
948 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
949 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, dataExpression, 0x7777);
950 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x0000, 0x7777);
951 }
952 else if (data <= 63 )
953 {
954 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
955 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
956 MS_U16 dataExpression = (data - 56 );
957 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, dataExpression, 0x7777);
958 }
959 else //>64
960 {
961 MApi_XC_W2BYTEMSK(REG_SC_BK30_42_L, 0x7777, 0x7777);
962 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x7777, 0x7777);
963 MApi_XC_W2BYTEMSK(REG_SC_BK30_4A_L, 0x7777, 0x7777);
964 }
965 }
DEBUG_LC_Full6bit8(const MS_U8 data)966 void DEBUG_LC_Full6bit8( const MS_U8 data )
967 {
968 //BK30_50, BK30_54, BK30_58
969 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
970 //LSB(low byte) = left, MSB(high byte) = right
971
972 if ( data <= 7 )
973 {
974 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, data, 0x7777);
975 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
976 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
977 }
978 else if ( data <= 14 )
979 {
980 MS_U16 dataExpression = ( (data-7) << 4) + 7;
981 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
982 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
983 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
984 }
985 else if ( data <= 21)
986 {
987 MS_U16 dataExpression = ( (data-14) << 8) + (7<<4) + 7;
988 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
989 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
990 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
991 }
992 else if (data <= 28 )
993 {
994 MS_U16 dataExpression = ( (data-21) << 12) + (7<<8) + (7<<4) + 7;
995 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, dataExpression, 0x7777);
996 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x0000, 0x7777);
997 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
998 }
999 else if (data <= 35)
1000 {
1001 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1002 MS_U16 dataExpression = ( data-28 );
1003 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1004 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1005
1006 }
1007 else if (data <= 42 )
1008 {
1009 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1010 MS_U16 dataExpression = (( data-35 )<< 4) + 7;
1011 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1012 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1013 }
1014 else if (data <= 49 )
1015 {
1016 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1017 MS_U16 dataExpression = (( data-42 )<< 8) + (7 << 4) +7;
1018 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1019 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1020
1021 }
1022 else if (data <= 56 )
1023 {
1024 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1025 MS_U16 dataExpression = (( data-49 )<< 12) + (7 << 8) + (7 << 4) + 7;
1026 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, dataExpression, 0x7777);
1027 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x0000, 0x7777);
1028 }
1029 else if (data <= 63 )
1030 {
1031 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1032 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1033 MS_U16 dataExpression = (data - 56 );
1034 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, dataExpression, 0x7777);
1035 }
1036 else //>64
1037 {
1038 MApi_XC_W2BYTEMSK(REG_SC_BK30_43_L, 0x7777, 0x7777);
1039 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, 0x7777, 0x7777);
1040 MApi_XC_W2BYTEMSK(REG_SC_BK30_4B_L, 0x7777, 0x7777);
1041 }
1042 }
DEBUG_LC_DBKWidth(const MS_U8 width)1043 void DEBUG_LC_DBKWidth( const MS_U8 width )
1044 {
1045 //BK30_40~BK30_5F
1046 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1047 //LSB(low byte) = left, MSB(high byte) = right
1048 if ( width == 8 )
1049 {
1050 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0222, 0x0777);
1051 }
1052 else if ( width == 16 )
1053 {
1054 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0444, 0x0777);
1055 }
1056 else if ( width <=22 && width>=20 )
1057 {
1058 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0555, 0x0777);
1059 }
1060 else
1061 {
1062 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0111, 0x0777);
1063 }
1064 }
DEBUG_LC_DBKDET(const MS_U8 GG)1065 void DEBUG_LC_DBKDET( const MS_U8 GG )
1066 {
1067
1068 //BK30_40~BK30_5F
1069 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1070 //LSB(low byte) = left, MSB(high byte) = right
1071 if ( GG == 0 )
1072 {
1073 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x7000, 0x7000);
1074 }
1075 if ( GG == 1 )
1076 {
1077 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x6000, 0x7000); //yellow
1078 }
1079 else if (GG == 2)
1080 {
1081 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x5000, 0x7000); //purple
1082 }
1083 else if (GG == 3)
1084 {
1085 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x4000, 0x7000); //4 = cyan
1086 }
1087 else if (GG == 4)
1088 {
1089 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x3000, 0x7000); //3 = blue
1090 }
1091 else if (GG == 5)
1092 {
1093 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x2000, 0x7000); //2 = green
1094 }
1095 else if (GG == 6)
1096 {
1097 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x0000, 0x7000);
1098
1099 }
1100 else
1101 {
1102 MApi_XC_W2BYTEMSK(REG_SC_BK30_5C_L, 0x1111, 0x7000);
1103 }
1104 }
DEBUG_LC_FrameEdg(const MS_U16 inValue)1105 void DEBUG_LC_FrameEdg( const MS_U16 inValue )
1106 {
1107 //BK30_40~BK30_5F
1108 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1109 //LSB(low byte) = left, MSB(high byte) = right
1110
1111 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1112
1113 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1114 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1115 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1116 {
1117 TH1 = 100;
1118 TH2 = 80;
1119 TH3 = 60;
1120 TH4 = 50;
1121 TH5 = 40;
1122 TH6 = 30;
1123 TH7 = 20;
1124 TH8 = 10;
1125 }
1126 if ( inValue> TH1 )
1127 {
1128 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7777, 0x7777);
1129 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1130 }
1131 else if ( inValue> TH2 )
1132 {
1133 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7770, 0x7777);
1134 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1135 }
1136 else if ( inValue> TH3 )
1137 {
1138 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7700, 0x7777);
1139 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1140 }
1141 else if ( inValue> TH4 )
1142 {
1143 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x7000, 0x7777);
1144 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1145 }
1146 else if ( inValue > TH5 )
1147 {
1148 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1149 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7777, 0x7777);
1150 }
1151 else if ( inValue > TH6 )
1152 {
1153 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1154 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7770, 0x7777);
1155 }
1156 else if ( inValue > TH7 )
1157 {
1158 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1159 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7700, 0x7777);
1160 }
1161 else if ( inValue > TH8 )
1162 {
1163 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1164 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x7000, 0x7777);
1165 }
1166 else
1167 {
1168 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x7777);
1169 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, 0x0000, 0x7777);
1170 }
1171 }
DEBUG_LC_FrameBlk(const MS_U16 inValue)1172 void DEBUG_LC_FrameBlk( const MS_U16 inValue )
1173 {
1174 //BK30_40~BK30_5F
1175 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1176 //LSB(low byte) = left, MSB(high byte) = right
1177
1178 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1179
1180 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1181 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1182 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1183 //if (HD_control == false)
1184 {
1185 TH1 = 100;
1186 TH2 = 80;
1187 TH3 = 60;
1188 TH4 = 50;
1189 TH5 = 40;
1190 TH6 = 30;
1191 TH7 = 20;
1192 TH8 = 10;
1193 }
1194 if ( inValue> TH1 )
1195 {
1196 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7777, 0x7777);
1197 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1198 }
1199 else if ( inValue> TH2 )
1200 {
1201 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7770, 0x7777);
1202 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1203 }
1204 else if ( inValue> TH3 )
1205 {
1206 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7700, 0x7777);
1207 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1208 }
1209 else if ( inValue> TH4 )
1210 {
1211 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x7000, 0x7777);
1212 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1213 }
1214 else if ( inValue > TH5 )
1215 {
1216 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1217 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7777, 0x7777);
1218 }
1219 else if ( inValue > TH6 )
1220 {
1221 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1222 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7770, 0x7777);
1223 }
1224 else if ( inValue > TH7 )
1225 {
1226 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1227 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7700, 0x7777);
1228 }
1229 else if ( inValue > TH8 )
1230 {
1231 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1232 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x7000, 0x7777);
1233 }
1234 else
1235 {
1236 MApi_XC_W2BYTEMSK(REG_SC_BK30_56_L, 0x0000, 0x7777);
1237 MApi_XC_W2BYTEMSK(REG_SC_BK30_57_L, 0x0000, 0x7777);
1238 }
1239 }
DEBUG_LC_FrameDet(const MS_U16 inValue)1240 void DEBUG_LC_FrameDet( const MS_U16 inValue )
1241 {
1242 //BK30_40~BK30_5F
1243 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1244 //LSB(low byte) = left, MSB(high byte) = right
1245
1246 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1247
1248 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1249 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1250 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1251 //if (HD_control == false)
1252 {
1253 TH1 = 100;
1254 TH2 = 80;
1255 TH3 = 60;
1256 TH4 = 50;
1257 TH5 = 40;
1258 TH6 = 30;
1259 TH7 = 20;
1260 TH8 = 10;
1261 }
1262 if ( inValue> TH1 )
1263 {
1264 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7777, 0x7777);
1265 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1266 }
1267 else if ( inValue> TH2 )
1268 {
1269 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7770, 0x7777);
1270 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1271 }
1272 else if ( inValue> TH3 )
1273 {
1274 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7700, 0x7777);
1275 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1276 }
1277 else if ( inValue> TH4 )
1278 {
1279 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x7000, 0x7777);
1280 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1281 }
1282 else if ( inValue > TH5 )
1283 {
1284 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1285 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7777, 0x7777);
1286 }
1287 else if ( inValue > TH6 )
1288 {
1289 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1290 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7770, 0x7777);
1291 }
1292 else if ( inValue > TH7 )
1293 {
1294 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1295 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7700, 0x7777);
1296 }
1297 else if ( inValue > TH8 )
1298 {
1299 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1300 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x7000, 0x7777);
1301 }
1302 else
1303 {
1304 MApi_XC_W2BYTEMSK(REG_SC_BK30_5A_L, 0x0000, 0x7777);
1305 MApi_XC_W2BYTEMSK(REG_SC_BK30_5B_L, 0x0000, 0x7777);
1306 }
1307 }
1308
DEBUG_LC_ColorSum(const MS_U16 inValue)1309 void DEBUG_LC_ColorSum( const MS_U16 inValue )
1310 {
1311 //BK30_40~BK30_5F
1312 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1313 //LSB(low byte) = left, MSB(high byte) = right
1314
1315 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1316
1317 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1318 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1319 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1320
1321 {
1322 TH1 = 100;
1323 TH2 = 80;
1324 TH3 = 60;
1325 TH4 = 50;
1326 TH5 = 40;
1327 TH6 = 30;
1328 TH7 = 20;
1329 TH8 = 10;
1330 }
1331 if ( inValue> TH1 )
1332 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7777, 0x7777);
1333 else if ( inValue> TH2 )
1334 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7774, 0x7777);
1335 else if ( inValue> TH3 )
1336 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7770, 0x7777);
1337 else if ( inValue> TH4 )
1338 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7740, 0x7777);
1339 else if ( inValue > TH5 )
1340 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7700, 0x7777);
1341 else if ( inValue > TH6 )
1342 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7400, 0x7777);
1343 else if ( inValue > TH7 )
1344 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x7000, 0x7777);
1345 else if ( inValue > TH8 )
1346 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x4000, 0x7777);
1347 else
1348 MApi_XC_W2BYTEMSK(REG_SC_BK30_55_L, 0x0000, 0x7777);
1349 }
DEBUG_LC_uComplex(const MS_U16 inValue)1350 void DEBUG_LC_uComplex( const MS_U16 inValue )
1351 {
1352 //BK30_40~BK30_5F
1353 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1354 //LSB(low byte) = left, MSB(high byte) = right
1355
1356 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1357
1358 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1359 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1360 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1361
1362 {
1363 TH1 = 0x1000;
1364 TH2 = 0x0800;
1365 TH3 = 0x0400;
1366 TH4 = 0x0200;
1367 TH5 = 0x0100;
1368 TH6 = 0x0080;
1369 TH7 = 0x0040;
1370 TH8 = 0x0020;
1371 }
1372 if ( inValue> TH1 )
1373 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7777, 0x7777);
1374 else if ( inValue> TH2 )
1375 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7774, 0x7777);
1376 else if ( inValue> TH3 )
1377 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7770, 0x7777);
1378 else if ( inValue> TH4 )
1379 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7740, 0x7777);
1380 else if ( inValue > TH5 )
1381 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7700, 0x7777);
1382 else if ( inValue > TH6 )
1383 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7400, 0x7777);
1384 else if ( inValue > TH7 )
1385 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x7000, 0x7777);
1386 else if ( inValue > TH8 )
1387 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x4000, 0x7777);
1388 else
1389 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, 0x0000, 0x7777);
1390
1391 }
DEBUG_LC_SDCnt(const MS_U16 inValue)1392 void DEBUG_LC_SDCnt( const MS_U16 inValue )
1393 {
1394 //BK30_40~BK30_5F
1395 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1396 //LSB(low byte) = left, MSB(high byte) = right
1397
1398 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1399
1400 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1401 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1402 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1403
1404 {
1405 TH1 = 50000;
1406 TH2 = 20000;
1407 TH3 = 8000;
1408 TH4 = 3000;
1409 TH5 = 1000;
1410 TH6 = 300;
1411 TH7 = 100;
1412 TH8 = 10;
1413 }
1414 if ( inValue> TH1 )
1415 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7777, 0x7777);
1416 else if ( inValue> TH2 )
1417 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7774, 0x7777);
1418 else if ( inValue> TH3 )
1419 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7770, 0x7777);
1420 else if ( inValue> TH4 )
1421 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7740, 0x7777);
1422 else if ( inValue > TH5 )
1423 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7700, 0x7777);
1424 else if ( inValue > TH6 )
1425 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7400, 0x7777);
1426 else if ( inValue > TH7 )
1427 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x7000, 0x7777);
1428 else if ( inValue > TH8 )
1429 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x4000, 0x7777);
1430 else
1431 MApi_XC_W2BYTEMSK(REG_SC_BK30_59_L, 0x0000, 0x7777);
1432 }
DEBUG_LC_HDCnt(const MS_U16 inValue)1433 void DEBUG_LC_HDCnt( const MS_U16 inValue )
1434 {
1435 //BK30_40~BK30_5F
1436 //1 = red, 2 = green, 3 = blue, 4 = cyan, 5 =purple, 6 = yellow, 7 = white
1437 //LSB(low byte) = left, MSB(high byte) = right
1438
1439 //long HDCONTROLVALUE = MApi_XC_R2BYTEMSK(REG_SC_BK60_39_L, 0xFFFF) + MApi_XC_R2BYTEMSK(REG_SC_BK60_3A_L, 0x00FF);
1440
1441 //MS_BOOL HD_control = HDCONTROLVALUE > 0 ? true : false ;
1442 //PRT_TRP("HDCONTROLVALUE = %d;HD_control = %d;inValue = %d\n", HDCONTROLVALUE, HD_control, inValue);
1443 int TH1, TH2, TH3, TH4, TH5, TH6, TH7, TH8;
1444
1445 {
1446 TH1 = 4000;
1447 TH2 = 1000;
1448 TH3 = 500;
1449 TH4 = 250;
1450 TH5 = 120;
1451 TH6 = 60;
1452 TH7 = 30;
1453 TH8 = 10;
1454 }
1455 if ( inValue> TH1 )
1456 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7777, 0x7777);
1457 else if ( inValue> TH2 )
1458 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7774, 0x7777);
1459 else if ( inValue> TH3 )
1460 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7770, 0x7777);
1461 else if ( inValue> TH4 )
1462 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7740, 0x7777);
1463 else if ( inValue > TH5 )
1464 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7700, 0x7777);
1465 else if ( inValue > TH6 )
1466 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7400, 0x7777);
1467 else if ( inValue > TH7 )
1468 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x7000, 0x7777);
1469 else if ( inValue > TH8 )
1470 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x4000, 0x7777);
1471 else
1472 MApi_XC_W2BYTEMSK(REG_SC_BK30_5D_L, 0x0000, 0x7777);
1473 }
1474 /******************************************************************************/
1475 // Debug Info Control
1476 /******************************************************************************/
1477
1478
1479
1480
1481 //-------------------------------------------------------------------------------------------------
1482 // Local Functions
1483 //-------------------------------------------------------------------------------------------------
1484
1485
1486 //-------------------------------------------------------------------------------------------------
1487 // Global Functions
1488 //-------------------------------------------------------------------------------------------------
__minmax(int a,int b,int c)1489 int __minmax(int a, int b, int c) // make sure b < c
1490 {
1491 if (a<=b)
1492 return b;
1493 else if (a >= c)
1494 return c;
1495 else
1496 return a;
1497 }
1498
__max(int a,int b)1499 int __max(int a, int b)
1500 {
1501 if (a>=b)
1502 return a;
1503 else
1504 return b;
1505 }
1506
__max3(int a,int b,int c)1507 int __max3(int a, int b, int c)
1508 {
1509 if ( (a>=b) && (a>=c) )
1510 return a;
1511 else if ((b>=a) && (b>=c) )
1512 return b;
1513 else
1514 return c;
1515 }
1516
__min(int a,int b)1517 int __min(int a, int b)
1518 {
1519 if (a>=b)
1520 return b;
1521 else
1522 return a;
1523 }
1524
__min3(int a,int b,int c)1525 int __min3(int a, int b, int c)
1526 {
1527 if ( (a<=b) && (a<=c) )
1528 return a;
1529 else if ((b<=a) && (b<=c) )
1530 return b;
1531 else
1532 return c;
1533 }
1534
1535 /******************************************************************************/
1536 ///Get control register for adaptive tuning function
1537 ///@return MS_U32: Read two byte for FSC
1538 ///Add by Bella 20150707
1539 /******************************************************************************/
MDrv_Read2Byte(MS_U64 AddresL)1540 MS_U16 MDrv_Read2Byte( MS_U64 AddresL) //Eva modify U8 --> U16
1541 {
1542 MS_U16 u16Value= 0;
1543
1544 u16Value= (MS_U16)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)));
1545
1546 return u16Value;
1547 }
1548
1549 /******************************************************************************/
1550 ///Get control register for adaptive tuning function
1551 ///@return MS_U32: Read two byte and MASK for FSC
1552 ///Add by Bella 20150707
1553 /******************************************************************************/
MDrv_Read2ByteMSK(MS_U64 AddresL,MS_U16 mask)1554 MS_U16 MDrv_Read2ByteMSK( MS_U64 AddresL, MS_U16 mask)
1555 {
1556 MS_U16 u16Value= 0;
1557
1558 u16Value= (MS_U16)((MApi_XC_ReadByte(AddresL+1) << 8) |(MApi_XC_ReadByte(AddresL)))&mask;
1559
1560 return u16Value;
1561 }
1562
1563 /******************************************************************************/
1564 ///Get control register for adaptive tuning function
1565 ///@return MS_U8: Control status
1566 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl(void)1567 MS_U8 MDrv_SC_get_adaptive_ctrl(void)
1568 {
1569 MS_U8 u8Ctrl = 0;
1570
1571 u8Ctrl = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF);
1572
1573 return u8Ctrl;
1574 }
1575
1576 /******************************************************************************/
1577 ///Get control register for adaptive tuning function
1578 ///@return MS_U8: Control status
1579 /******************************************************************************/
MDrv_SC_get_adaptive_ctrl2(void)1580 MS_U8 MDrv_SC_get_adaptive_ctrl2(void)
1581 {
1582 MS_U8 u8Ctrl = 0;
1583
1584 u8Ctrl = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_7C_L, 0xFF00) >> 8);
1585
1586 return u8Ctrl;
1587 }
1588
1589 /******************************************************************************/
1590 ///Get control register for adaptive tuning function
1591 ///@return MS_U8: Control status
1592 /******************************************************************************/
MDrv_UFSC_get_adaptive_ctrl3(void)1593 MS_U8 MDrv_UFSC_get_adaptive_ctrl3(void)
1594 {
1595 MS_U8 u8UFSCCtrl = 0;
1596
1597 u8UFSCCtrl =MDrv_Read2ByteMSK(REG_FSC_BK30_3F_L, 0xFFFF)>>8;
1598
1599 return u8UFSCCtrl;
1600 }
1601
1602 /******************************************************************************/
1603 /// Agate Function
1604 /******************************************************************************/
MDrv_SC_Agate_ME1_SetStatisticsWindow(void)1605 void MDrv_SC_Agate_ME1_SetStatisticsWindow( void )
1606 {
1607 MS_U32 u32MaxHblkSize = 0, u32MaxVblkSize = 0;
1608
1609 u32MaxHblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0x00FF); //ME2_H Max
1610 u32MaxVblkSize = MApi_XC_R2BYTEMSK(REG_SC_BK17_02_L, 0xFF00) >> 8; //ME2_V Max
1611
1612 u32MaxHblkSize = u32MaxHblkSize - 1;
1613 u32MaxVblkSize = u32MaxVblkSize - 1;
1614
1615 MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L, u32MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1616 MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L, u32MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1617 }
1618
MDrv_SC_Edison_ME1_SetStatisticsWindow(MS_U32 u16Width,MS_U16 u16Height)1619 void MDrv_SC_Edison_ME1_SetStatisticsWindow(MS_U32 u16Width, MS_U16 u16Height)
1620 {
1621 MS_U16 u16MaxHblkSize = 0, u16MaxVblkSize = 0;
1622
1623 u16MaxHblkSize = (u16Width/10); //ME2_H Max
1624 u16MaxVblkSize = (u16Height/6); //ME2_V Max
1625
1626 u16MaxHblkSize = u16MaxHblkSize - 4;
1627 u16MaxVblkSize = u16MaxVblkSize - 4;
1628
1629 MApi_XC_W2BYTEMSK( REG_SC_BK17_5C_L, u16MaxHblkSize<<8 , 0xFF00 ); /*reg_stat_xblk_end*/
1630 MApi_XC_W2BYTEMSK( REG_SC_BK17_5D_L, u16MaxVblkSize<<8 , 0xFF00 ); /*reg_stat_yblk_end*/
1631 }
1632
MDrv_SC_Edison_GMV_reload(const XC_GMvStates gMv)1633 void MDrv_SC_Edison_GMV_reload( const XC_GMvStates gMv )
1634 {
1635 MS_BOOL bisPanScan = FALSE;
1636 static MS_U8 iir_cnt = 0;
1637 MS_S8 MvXdir = 0;
1638 MS_S8 MvYdir = 0;
1639
1640 if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 ) && ( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) ) //pan-scan case
1641 {
1642 bisPanScan = true;
1643 }
1644 else
1645 {
1646 bisPanScan = false;
1647 }
1648
1649 if( bisPanScan )
1650 {
1651 iir_cnt = 120; //default:240
1652 }
1653 else
1654 {
1655 if( iir_cnt != 0 )
1656 iir_cnt--;
1657 }
1658
1659 MvXdir = gMv.minMvXdir - 32;
1660 MvYdir = gMv.minMvYdir - 8;
1661
1662 //ME1 refer GMV
1663 if( iir_cnt == 0 )
1664 {
1665 MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03 , 0x000F );
1666 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<0) , 0x007F );
1667 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0x1F00 );
1668 MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1669 }
1670 else
1671 {
1672 MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x02 , 0x000F );
1673 MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x01<<8) , 0xFF00 ); //ME1 favor GMV enable
1674
1675 //Set ME1 MVX
1676 if( MvXdir >= 0 )
1677 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvXdir , 0x007F );
1678 else
1679 {
1680 if( MvXdir == -32)
1681 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0060 , 0x007F );
1682 else if( MvXdir == -31)
1683 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0061 , 0x007F );
1684 else if( MvXdir == -30)
1685 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0062 , 0x007F );
1686 else if( MvXdir == -29)
1687 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0063 , 0x007F );
1688 else if( MvXdir == -28)
1689 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0064 , 0x007F );
1690 else if( MvXdir == -27)
1691 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0065 , 0x007F );
1692 else if( MvXdir == -26)
1693 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0066 , 0x007F );
1694 else if( MvXdir == -25)
1695 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0067 , 0x007F );
1696 else if( MvXdir == -24)
1697 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0068 , 0x007F );
1698 else if( MvXdir == -23)
1699 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0069 , 0x007F );
1700 else if( MvXdir == -22)
1701 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006A , 0x007F );
1702 else if( MvXdir == -21)
1703 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006B , 0x007F );
1704 else if( MvXdir == -20)
1705 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006C , 0x007F );
1706 else if( MvXdir == -19)
1707 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006D , 0x007F );
1708 else if( MvXdir == -18)
1709 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006E , 0x007F );
1710 else if( MvXdir == -17)
1711 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x006F , 0x007F );
1712 else if( MvXdir == -16)
1713 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0070 , 0x007F );
1714 else if( MvXdir == -15)
1715 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0071 , 0x007F );
1716 else if( MvXdir == -14)
1717 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0072 , 0x007F );
1718 else if( MvXdir == -13)
1719 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0073 , 0x007F );
1720 else if( MvXdir == -12)
1721 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0074 , 0x007F );
1722 else if( MvXdir == -11)
1723 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0075 , 0x007F );
1724 else if( MvXdir == -10)
1725 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0076 , 0x007F );
1726 else if( MvXdir == -9)
1727 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0077 , 0x007F );
1728 else if( MvXdir == -8)
1729 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0078 , 0x007F );
1730 else if( MvXdir == -7)
1731 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x0079 , 0x007F );
1732 else if( MvXdir == -6)
1733 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007A , 0x007F );
1734 else if( MvXdir == -5)
1735 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007B , 0x007F );
1736 else if( MvXdir == -4)
1737 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007C , 0x007F );
1738 else if( MvXdir == -3)
1739 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007D , 0x007F );
1740 else if( MvXdir == -2)
1741 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007E , 0x007F );
1742 else if( MvXdir == -1)
1743 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x007F , 0x007F );
1744 }
1745
1746 //Set ME1 MVY
1747 if( MvYdir >= 0 )
1748 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, MvYdir<<8 , 0x1F00 );
1749 else
1750 {
1751 if( MvYdir == -8)
1752 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1800 , 0x1F00 );
1753 else if( MvYdir == -7)
1754 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1900 , 0x1F00 );
1755 else if( MvYdir == -6)
1756 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1A00 , 0x1F00 );
1757 else if( MvYdir == -5)
1758 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1B00 , 0x1F00 );
1759 else if( MvYdir == -4)
1760 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1C00 , 0x1F00 );
1761 else if( MvYdir == -3)
1762 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1D00 , 0x1F00 );
1763 else if( MvYdir == -2)
1764 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1E00 , 0x1F00 );
1765 else if( MvYdir == -1)
1766 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, 0x1F00 , 0x1F00 );
1767 }
1768 }
1769 }
1770
1771 #define REG_MCDI_EODIW_SHIFT_MAX 3
1772 #define REG_MCDI_EODIW_SHIFT_MIN 1
1773 #define REG_MCDI_EODIW_AB_MAX_GAIN_MAX 12
1774 #define REG_MCDI_EODIW_AB_MAX_GAIN_MIN 4
1775 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MAX 6
1776 #define REG_MCDI_EODIW_MIN_SAD_GAIN_MIN 1
MDrv_SC_Agate_SubMvPanScan(const XC_GMvStates gMv,const MS_BOOL isSceneChange,const MS_BOOL isSdHqvJaggedTest,const MS_U16 motion)1777 void MDrv_SC_Agate_SubMvPanScan( const XC_GMvStates gMv, const MS_BOOL isSceneChange, const MS_BOOL isSdHqvJaggedTest, const MS_U16 motion )
1778 {
1779 MS_BOOL bisSubMvPanScan = FALSE;
1780 static MS_U8 u8iir_cnt = 0;
1781 MS_BOOL bisMv0 = ( ( gMv.minMvXdir == 32 ) && ( gMv.minMvYdir == 8 ) ) ? true : false;
1782 static MS_U8 u8isMv0Cnt = 0;
1783 static MS_U8 u8isSubMvPanScanCnt = 0;
1784
1785 static MS_U16 u16reg_mcdi_eodiw_shift = REG_MCDI_EODIW_SHIFT_MAX;
1786 static MS_U16 u16reg_mcdi_eodiw_ab_max_gain = REG_MCDI_EODIW_AB_MAX_GAIN_MIN;
1787 static MS_U16 u16reg_mcdi_eodiw_min_sad_gain = REG_MCDI_EODIW_MIN_SAD_GAIN_MAX;
1788
1789
1790 if( bisMv0 && ( motion < 0x100 ) )
1791 {
1792 if( u8isMv0Cnt < 20 )
1793 u8isMv0Cnt++;
1794 }
1795 else
1796 {
1797 if( u8isMv0Cnt > 0 )
1798 u8isMv0Cnt--;
1799 }
1800
1801 if( ( gMv.h1XYsum > 10 ) && ( gMv.h2XYsum > 10 )
1802 &&( gMv.h1XYdiff < 5 ) && ( gMv.h2XYdiff < 5 ) && gMv.yMvIsMovingOdd )
1803 {
1804 bisSubMvPanScan = true;
1805 }
1806 else
1807 {
1808 bisSubMvPanScan = false;
1809 }
1810
1811
1812 if( bisSubMvPanScan )
1813 {
1814 if( u8isSubMvPanScanCnt < 20 )
1815 u8isSubMvPanScanCnt++;
1816 }
1817 else
1818 {
1819 if( u8isSubMvPanScanCnt > 0 )
1820 u8isSubMvPanScanCnt--;
1821 }
1822
1823
1824 //PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1825 //PRT_TRP(" isSubMvPanScan(%d)\n", isSubMvPanScan);
1826
1827 if( ( u8isSubMvPanScanCnt > 5 ) || isSdHqvJaggedTest )
1828 {
1829 u8iir_cnt = 240;
1830 }
1831 else
1832 {
1833 if( u8iir_cnt != 0 )
1834 u8iir_cnt--;
1835 }
1836
1837 if( isSceneChange || ( u8isMv0Cnt > 10 ) ) /* for pattern stable, if only check GMV-Mv0 have problem */
1838 u8iir_cnt = 0;
1839
1840 if( u8iir_cnt == 0 )
1841 {
1842 if( u16reg_mcdi_eodiw_shift < REG_MCDI_EODIW_SHIFT_MAX )
1843 u16reg_mcdi_eodiw_shift++;
1844
1845 if( u16reg_mcdi_eodiw_ab_max_gain > REG_MCDI_EODIW_AB_MAX_GAIN_MIN )
1846 u16reg_mcdi_eodiw_ab_max_gain--;
1847
1848 if( u16reg_mcdi_eodiw_min_sad_gain < REG_MCDI_EODIW_MIN_SAD_GAIN_MAX )
1849 u16reg_mcdi_eodiw_min_sad_gain++;
1850 }
1851 else/* do sub pixel */
1852 {
1853 if( u16reg_mcdi_eodiw_shift > REG_MCDI_EODIW_SHIFT_MIN )
1854 u16reg_mcdi_eodiw_shift--;
1855
1856 if( u16reg_mcdi_eodiw_ab_max_gain < REG_MCDI_EODIW_AB_MAX_GAIN_MAX )
1857 u16reg_mcdi_eodiw_ab_max_gain++;
1858
1859 if( u16reg_mcdi_eodiw_min_sad_gain > REG_MCDI_EODIW_MIN_SAD_GAIN_MIN )
1860 u16reg_mcdi_eodiw_min_sad_gain--;
1861 }
1862
1863 MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, u16reg_mcdi_eodiw_shift , 0x000F );
1864 MApi_XC_W2BYTEMSK( REG_SC_BK22_29_L, (u16reg_mcdi_eodiw_ab_max_gain<<12) , 0xF000 );
1865
1866 //Dummy to control write value, add by Bella 20150708
1867 if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x0F00)!=0x0000)
1868 {
1869 MApi_XC_W2BYTEMSK(REG_SC_BK22_2A_L, MApi_XC_R2BYTE(REG_SC_BK23_5D_L), 0x0F00);
1870 }
1871 else
1872 {
1873 MApi_XC_W2BYTEMSK( REG_SC_BK22_2A_L, (u16reg_mcdi_eodiw_min_sad_gain<<8) , 0x0F00 );
1874 }
1875 }
1876
MDrv_SC_Agate_PanScan_Church(const XC_GMvStates gMv,const MS_U16 nonMv0Comfirm,const MS_U32 uComplex,const MS_BOOL meStill,const MS_BOOL isHDsource)1877 void MDrv_SC_Agate_PanScan_Church( const XC_GMvStates gMv, const MS_U16 nonMv0Comfirm, const MS_U32 uComplex, const MS_BOOL meStill, const MS_BOOL isHDsource )
1878 {
1879 MS_BOOL bisPanScanV = FALSE;
1880 static MS_U8 iir_cnt = 0;
1881 MS_U32 colorSum = 0;
1882
1883 colorSum = MApi_XC_R2BYTE(REG_SC_BK1A_6E_L);
1884 colorSum = colorSum / 8;
1885
1886 if( (gMv.h1XYsum > 10) && (gMv.h2XYsum > 10) && (gMv.h1XYdiff < 3) && (gMv.h2XYdiff < 3)
1887 && (gMv.minMvXdir == 32) && (nonMv0Comfirm > 6) &&(colorSum > 0x80) && (uComplex > 0x100)
1888 && (uComplex < 0x600) && (meStill == false) && (isHDsource == false) ) //vertical moving
1889 {
1890 bisPanScanV = true;
1891 }
1892 else
1893 {
1894 bisPanScanV = false;
1895 }
1896
1897 if( bisPanScanV )
1898 {
1899 iir_cnt = 120; //default:240
1900 }
1901 else
1902 {
1903 if( iir_cnt != 0 )
1904 iir_cnt--;
1905 }
1906
1907 if( isHDsource )
1908 iir_cnt = 0;
1909
1910 if( iir_cnt == 0 )
1911 {
1912 MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x03 , 0x000F );
1913 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x00<<8) , 0xFF00 );
1914 MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x00<<8) , 0xFF00 );
1915 MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x10) , 0x00FF );
1916 }
1917 else
1918 {
1919 MApi_XC_W2BYTEMSK( REG_SC_BK17_50_L, 0x01 , 0x000F );
1920 MApi_XC_W2BYTEMSK( REG_SC_BK17_51_L, (0x02<<8) , 0xFF00 );
1921 MApi_XC_W2BYTEMSK( REG_SC_BK17_52_L, (0x02<<8) , 0xFF00 );
1922 MApi_XC_W2BYTEMSK( REG_SC_BK17_54_L, (0x6C) , 0x00FF );
1923 }
1924 }
1925
MDrv_SC_FilmReorder(const XC_OpFrameStates opFrameStatus)1926 void MDrv_SC_FilmReorder( const XC_OpFrameStates opFrameStatus )
1927 {
1928 static XC_FilmRoStates filmRoStates;
1929 static MS_BOOL init = true;
1930 static MS_U8 samplingTime = 0;
1931 // MS_BOOL isPoolOfFull;
1932 int vaildCnt = 0;
1933 int i = 0;
1934
1935 samplingTime++;
1936
1937 if( init )
1938 {
1939 for( i=0; i < 16 ; i++ )
1940 {
1941 filmRoStates.motion[i] = 0;
1942 filmRoStates.unmatch_1[i] = 0;
1943 filmRoStates.unmatch_3[i] = 0;
1944 filmRoStates.vaildCnt[i] = 0;
1945 filmRoStates.vaild[i] = false;
1946 }
1947 init = false;
1948 }
1949
1950 /* Step0. loading states */
1951 filmRoStates.motion[opFrameStatus.curOpFrame] = MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0xFFFF);
1952 filmRoStates.unmatch_1[opFrameStatus.curOpFrame] = MApi_XC_R2BYTEMSK(REG_SC_BK0A_0A_L, 0xFFFF);
1953 filmRoStates.unmatch_3[opFrameStatus.curOpFrame] = MApi_XC_R2BYTEMSK(REG_SC_BK0A_0B_L, 0xFFFF);
1954
1955 if( filmRoStates.vaildCnt[opFrameStatus.curOpFrame] < 255 )
1956 filmRoStates.vaildCnt[opFrameStatus.curOpFrame]++;
1957
1958 filmRoStates.vaild[opFrameStatus.curOpFrame] = true;
1959
1960 /* Step1. 1s do clean unflash counter */
1961 if( samplingTime == 60 )
1962 {
1963 for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1964 {
1965 if( filmRoStates.vaildCnt[i] < 10 )
1966 {
1967 filmRoStates.vaild[i] = false;
1968 }
1969 }
1970 samplingTime = 0;/* reset of sampling time */
1971 }
1972
1973 /* Step2. Check pool is full */
1974 vaildCnt = 0;
1975 for( i = 0; i < opFrameStatus.maxOpFrame; i++ )
1976 {
1977 if( filmRoStates.vaild[i] )
1978 vaildCnt++;
1979 }
1980 // isPoolOfFull = ( vaildCnt > (opFrameStatus.maxOpFrame/2) ) ? true : false;
1981
1982 }
1983
MDrv_SC_SaveHpfSetting(const MS_U8 isSourceChange)1984 XC_HpfDefaultRegSetting MDrv_SC_SaveHpfSetting( const MS_U8 isSourceChange )
1985 {
1986 static XC_HpfDefaultRegSetting reg;
1987
1988 if( isSourceChange == 1 )
1989 {
1990
1991 reg.HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
1992 reg.HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
1993
1994 reg.HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
1995 reg.HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
1996
1997 reg.HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF) );
1998 reg.HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF) );
1999
2000 reg.HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F) );
2001 reg.HDSDD_overflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2002
2003 //reg.HDSD_detection_letter_box_enable = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080) >> 7 );
2004 }
2005 return reg;
2006 }
2007
2008 #if 0
2009 void print_hpfSetting(void)
2010 {
2011 MS_BOOL HDSDD0_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0001) );
2012 MS_BOOL HDSDD1_det_mode = (MS_BOOL)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0010) >> 4 );
2013
2014 MS_U8 HDSDD0_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0700) >> 8 );
2015 MS_U8 HDSDD1_det_mode_shift = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x7000) >> 12 );
2016
2017 MS_U16 HDSDD0_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_71_L, 0xFFFF) );
2018 MS_U16 HDSDD1_det_mode_threshold = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_72_L, 0xFFFF) );
2019
2020 MS_U8 HDSDD_underflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x003F) );
2021 MS_U8 HDSDD_overflow_threshold = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK02_73_L, 0x3F00) >> 8 );
2022
2023 MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2024 //MS_U16 boundarystart = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7C_L, 0x1FFF) );
2025 //MS_U16 boundaryend = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_7D_L, 0x1FFF) );
2026 MS_U16 uxx = (MS_U16)( MApi_XC_R2BYTEMSK(REG_SC_BK02_70_L, 0x0080) );
2027
2028 //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",
2029 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);
2030
2031 //PRT_TRP("widthCur = %d, boundarystart = %d, boundaryend = %d, uxx = %d\n", widthCur, boundarystart, boundaryend, uxx);
2032 }
2033 #endif
2034
MDrv_SC_hpfDefaultRelod(const XC_HpfDefaultRegSetting defaultReg)2035 void MDrv_SC_hpfDefaultRelod( const XC_HpfDefaultRegSetting defaultReg )
2036 {
2037 //const int boundary = 10;
2038 //MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
2039
2040
2041 // MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
2042 // MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
2043
2044 // MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF); /*for HD repot*/
2045 // MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
2046
2047 // MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
2048 // MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
2049
2050 // MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, defaultReg.HDSDD0_det_mode , 0x0001); /* mode */
2051 // MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode)<<4, 0x0010); /* mode */
2052
2053 #if FOR_FULL_RANGE
2054 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x01D8, 0xFFFF); //Reset for Full range in Maserati
2055 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4000, 0x7000);
2056
2057 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x01D8, 0xFFFF); /*for HD repot*/ //Reset for Full range in Maserati
2058 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0200, 0x0700); /*for HD repot*/
2059
2060 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0000, 0x003F); /* underflow */ //Reset for Full range in Maserati
2061 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3F00, 0x3F00); /* overflow *///Reset for Full range in Maserati
2062
2063 #else //for limit range settings
2064 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0190, 0xFFFF);
2065 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4000, 0x7000);
2066
2067 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF); /*for HD repot*/
2068 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0200, 0x0700); /*for HD repot*/
2069
2070
2071 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
2072 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
2073 #endif
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(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2195 MS_BOOL MDrv_SC_McFilmLike( 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(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd,MS_U32 _hpfHdCntReport)2245 MS_BOOL MDrv_SC_McFilmUkoSabihS( 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(const MS_U16 motion4)2315 MS_U8 MDrv_SC_Motion4StillCnt( 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(const MS_U16 me13x3MwMax,const MS_U16 mv0Cost)2348 MS_U8 MDrv_SC_Me1Still( 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(const MS_U16 me13x3MwMin,const MS_U16 mv0Cost)2366 MS_U8 MDrv_SC_McSmallMoving( 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(const XC_OpFrameStates opFrameStatusCur,MS_BOOL isHd)2384 MS_BOOL MDrv_SC_McFilmLikeHd( 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(const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmLike,MS_BOOL isHd)2431 MS_BOOL MDrv_SC_McFilmLikeAny( 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(const MS_U32 motion,const XC_GMvStates gMv)2499 MS_BOOL MDrv_SC_McFilmLikeForSlowMotion( 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(const XC_GMvStates gMv)2539 MS_BOOL MDrv_SC_HQV_JaggedTestPattern( 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(const XC_GMvStates gMv,const MS_U16 mvNotFound,const MS_U32 _hdFilterBaseReport,const MS_U32 u32MotionValue_Sum)2560 void MDrv_SC_HQV_RandomNoise( 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(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( 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(const XC_GMvStates gMv,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm)2646 void MDrv_SC_EODi_Armored( 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(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( 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(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( 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(const XC_Me1HisStates H1,const XC_Me1HisStates H2)2958 XC_GMvStates MDrv_SC_Agate_GMV( const XC_Me1HisStates H1, const XC_Me1HisStates H2 )
2959 {
2960 XC_GMvStates gMv;
2961 memset(&gMv, 0x0, sizeof(XC_GMvStates));
2962 // MS_BOOL yIsMovingOdd;
2963 // MS_BOOL xIsMovingOdd;
2964 // MS_BOOL isMovingOdd;
2965
2966 const MS_U8 const_GMV_X_LUT[9][8] =
2967 {
2968 {0, 1, 2, 3, 4, 5, 6, 7 },
2969 {8, 9, 10, 11, 12, 13, 14, 15},
2970 {16, 17, 18, 19, 20, 21, 22, 23},
2971 {24, 25, 26, 27, 28, 29, 30, 31},
2972 {33, 34, 35, 36, 37, 38, 39, 40},
2973 {41, 42, 43, 44, 45, 46, 47, 48},
2974 {49, 50, 51, 52, 53, 54, 55, 56},
2975 {57, 58, 59, 60, 61, 62, 63, 64},
2976 {32, 32, 32, 32, 32, 32, 32, 32}
2977 };
2978
2979 const MS_U8 const_GMV_Y_LUT[9][2] =
2980 {
2981 {0, 1},
2982 {2, 3},
2983 {4, 5},
2984 {6, 7},
2985 {9, 10},
2986 {11, 12},
2987 {13, 14},
2988 {15, 16},
2989 {8, 8}
2990 };
2991
2992 MS_U8 x_h1_idx = H1.minMvXdir;
2993 MS_U8 x_h2_idx = ( H1.minMvXdir == 8 ) ? 0 : H2.minMvXdir;
2994 MS_U8 y_h1_idx = H1.minMvYdir;
2995 MS_U8 y_h2_idx = ( H1.minMvYdir == 8 ) ? 0 : H2.minMvYdir;
2996
2997 MS_U8 gm_x = const_GMV_X_LUT[x_h1_idx][x_h2_idx];
2998 MS_U8 gm_y = const_GMV_Y_LUT[y_h1_idx][y_h2_idx];
2999
3000 // xIsMovingOdd = ( gm_x % 2 ) ? true : false;
3001 // yIsMovingOdd = ( gm_y % 2 ) ? true : false;
3002 // isMovingOdd = ( xIsMovingOdd | yIsMovingOdd );
3003
3004 gMv.minMvXdir = gm_x;
3005 //gMv.minMvXbin = H1.minMvXBin;
3006 gMv.h1XYdiff = abs(H1.minMvXBin-H1.minMvYBin);
3007 gMv.h1XYsum = H1.minMvXBin+H1.minMvYBin;
3008 gMv.minMvYdir = gm_y;
3009 //gMv.minMvYbin = H1.minMvYBin;
3010 gMv.h2XYdiff = abs(H2.minMvXBin-H2.minMvYBin);
3011 gMv.h2XYsum = H2.minMvXBin+H2.minMvYBin;
3012 gMv.yMvIsMovingOdd = ( gm_y % 2 ) ? true : false;
3013 #if 1
3014 //MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L, (gm_x<<8), 0xFF00);
3015 //MApi_XC_W2BYTEMSK(REG_SC_BK30_08_L, gm_y, 0x00FF);
3016
3017 //DEBUG_LC_Full6bit(gm_x);
3018 //DEBUG_LC_Full6bit2(gm_y);
3019
3020 //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L, (gMv.h2XYdiff), 0xFFFF);
3021 //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L, (gMv.h1XYdiff<<8), 0xFF00);
3022 //MApi_XC_W2BYTEMSK(REG_SC_BK30_09_L, gMv.h2XYdiff, 0x00FF);
3023 //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L, (gMv.h2XYsum), 0xFFFF);
3024 //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L, (((gMv.h1XYsum)>>2)<<8), 0xFF00);
3025 //MApi_XC_W2BYTEMSK(REG_SC_BK30_0A_L, ((gMv.h2XYsum)>>2), 0x00FF);
3026 #endif
3027
3028 return gMv;
3029 }
3030
MDrv_SC_Agate_Hierarchy2(const XC_Me1HisStates H1)3031 XC_Me1HisStates MDrv_SC_Agate_Hierarchy2( const XC_Me1HisStates H1 )
3032 {
3033 MS_U8 me1_X_histogram[8];
3034 MS_U8 me1_Y_histogram[2];
3035 MS_U8 minXdir = 0, minXdirBin = 0;
3036 MS_U8 minYdir = 0, minYdirBin = 0;
3037 XC_Me1HisStates H2States;
3038 int dir = 0;
3039
3040 MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L, H1.minMvXdir , 0x0007 ); /*reg_gmv_h_hier2_sel*/
3041 MApi_XC_W2BYTEMSK( REG_SC_BK17_5E_L, H1.minMvYdir<<4 , 0x0070 ); /*reg_gmv_h_hier2_sel*/
3042
3043 me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0x00FF);
3044 me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_64_L, 0xFF00) >> 8;
3045 me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0x00FF);
3046 me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_65_L, 0xFF00) >> 8;
3047 me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0x00FF);
3048 me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_66_L, 0xFF00) >> 8;
3049 me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0x00FF);
3050 me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_67_L, 0xFF00) >> 8;
3051
3052 me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0x00FF);
3053 me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6C_L, 0xFF00) >> 8;
3054
3055 /*FOR Vertical move 8 pixels*/
3056 if((H1.minMvYdir == 7)&&(abs (H1.minMvYBin -(me1_Y_histogram[0] +me1_Y_histogram[1] ))>3))//MV = 7 or 8
3057 {
3058 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)
3059 }
3060 else if(H1.minMvYdir == 6 )//MV = 5or 6
3061 {
3062 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)
3063 }
3064
3065 //find max histogram
3066 minXdir = 0;
3067 minXdirBin = 0;
3068 for (dir=0; dir<=7 ; dir++)
3069 {
3070 if( minXdirBin < me1_X_histogram[dir] )
3071 {
3072 minXdir = dir;
3073 minXdirBin = me1_X_histogram[dir];
3074 }
3075 }
3076
3077 minYdir = 0;
3078 minYdirBin = 0;
3079 for (dir=0; dir<=1 ; dir++)
3080 {
3081 if( minYdirBin < me1_Y_histogram[dir] )
3082 {
3083 minYdir = dir;
3084 minYdirBin = me1_Y_histogram[dir];
3085 }
3086 }
3087
3088 if( H1.minMvXdir == 8 ) //MV0
3089 {
3090 H2States.minMvXdir = H1.minMvXdir;
3091 H2States.minMvXBin = H1.minMvXBin;
3092 }
3093 else
3094 {
3095 H2States.minMvXdir = minXdir;
3096 H2States.minMvXBin = minXdirBin;
3097 }
3098
3099 if( H1.minMvYdir == 8 )
3100 {
3101 H2States.minMvYdir = H1.minMvYdir;
3102 H2States.minMvYBin = H1.minMvYBin;
3103 }
3104 else
3105 {
3106 H2States.minMvYdir = minYdir;
3107 H2States.minMvYBin = minYdirBin;
3108 }
3109
3110 return H2States;
3111 }
3112
MDrv_SC_Agate_Hierarchy1(void)3113 XC_Me1HisStates MDrv_SC_Agate_Hierarchy1( void )
3114 {
3115 MS_U8 me1_X_histogram[9];
3116 MS_U8 me1_Y_histogram[9];
3117 MS_U8 minXdir = 0, minXdirBin = 0;
3118 MS_U8 minYdir = 0, minYdirBin = 0;
3119 XC_Me1HisStates H1States;
3120 int dir = 0;
3121
3122 me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
3123 me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
3124 me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
3125 me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
3126 me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
3127 me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
3128 me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
3129 me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
3130 me1_X_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
3131
3132 me1_Y_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0x00FF);
3133 me1_Y_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_68_L, 0xFF00) >> 8;
3134 me1_Y_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0x00FF);
3135 me1_Y_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_69_L, 0xFF00) >> 8;
3136 me1_Y_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0x00FF);
3137 me1_Y_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6A_L, 0xFF00) >> 8;
3138 me1_Y_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0x00FF);
3139 me1_Y_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_6B_L, 0xFF00) >> 8;
3140 me1_Y_histogram[8] = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0xFF00) >> 8;
3141
3142 minXdir = 0;
3143 minXdirBin = 0;
3144 for ( dir = 0; dir <= 8 ; dir ++ )
3145 {
3146 if( minXdirBin < me1_X_histogram[dir] )
3147 {
3148 minXdir = dir;
3149 minXdirBin = me1_X_histogram[dir];
3150 }
3151 }
3152
3153 minYdir = 0;
3154 minYdirBin = 0;
3155 for ( dir = 0; dir <= 8 ; dir ++ )
3156 {
3157 if( minYdirBin < me1_Y_histogram[dir] )
3158 {
3159 minYdir = dir;
3160 minYdirBin = me1_Y_histogram[dir];
3161 }
3162 }
3163 H1States.minMvXdir = minXdir;
3164 H1States.minMvXBin = minXdirBin;
3165 H1States.minMvYdir = minYdir;
3166 H1States.minMvYBin = minYdirBin;
3167
3168 return H1States;
3169 }
3170
3171 /******************************************************************************/
3172 /// Einstein Function
3173 ///
3174 /******************************************************************************/
MDrv_RegC_pdnr_me1_smv_nr_strength(const MS_U8 smvw,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3175 void MDrv_RegC_pdnr_me1_smv_nr_strength( const MS_U8 smvw, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3176 {
3177 static MS_U8 qMapDefault = 3;
3178 MS_U8 setValue;
3179 static MS_BOOL allowW = false;
3180 MS_U8 smallMovingW;
3181
3182 smallMovingW = 15 - (smvw >> 4);
3183
3184 if( (isSourceChange == 1) && (allowW == false) )
3185 {
3186 qMapDefault = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK2A_66_L, 0x0F00) >> 8 );
3187 allowW = true;
3188 }
3189
3190 if( sceneChange )
3191 setValue = 0x0; /* motion gain is Max when scene change happen */
3192 else if( smallMovingW > qMapDefault )
3193 setValue = qMapDefault;
3194 else
3195 setValue = smallMovingW;
3196
3197 if( allowW )
3198 MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, setValue << 8 , 0x0F00);
3199 }
3200
MDrv_Adaptive_Coring(const MS_U8 noiseLevel,const MS_U8 isSourceChange,const MS_BOOL sceneChange)3201 void MDrv_Adaptive_Coring( const MS_U8 noiseLevel, const MS_U8 isSourceChange, const MS_BOOL sceneChange )
3202 {
3203 static MS_U8 qMapPostCoringTh1;
3204 static MS_U8 qMapPostCoringTh2;
3205 static MS_U8 noiseL1Cnt = 0, noiseL2Cnt = 0;
3206
3207 if( isSourceChange )
3208 {
3209 qMapPostCoringTh1 = (MS_U8)MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x000F );
3210 qMapPostCoringTh2 = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK19_13_L, 0x00F0 ) >> 4 );
3211
3212 noiseL1Cnt = noiseL2Cnt = 0;
3213 }
3214 else if( sceneChange )
3215 {
3216 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh1 , 0x000F );
3217 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, qMapPostCoringTh2 << 4 , 0x00F0 );
3218
3219 noiseL1Cnt = noiseL2Cnt = 0;
3220 }
3221 else
3222 {
3223 if( noiseLevel > 0x40 )
3224 {
3225 if( noiseL1Cnt < 16 )
3226 ++noiseL1Cnt;
3227 }
3228 else if( noiseL1Cnt > 0 )
3229 --noiseL1Cnt;
3230
3231 if( noiseLevel > 0x80 )
3232 {
3233 if( noiseL2Cnt < 16 )
3234 ++noiseL2Cnt;
3235 }
3236 else if( noiseL2Cnt > 0 )
3237 --noiseL2Cnt;
3238
3239 MS_U8 postCoringTh1 = ( 0x9 * noiseL2Cnt + 0xE * (16 - noiseL2Cnt) + 8 ) >> 4;
3240 MS_U8 postCoringTh2 = ( 0xB * noiseL2Cnt + 0xF * (16 - noiseL2Cnt) + 8 ) >> 4;
3241
3242 postCoringTh1 = ( postCoringTh1 * noiseL1Cnt + qMapPostCoringTh1 * (16 - noiseL1Cnt) + 8 ) >> 4;
3243 postCoringTh2 = ( postCoringTh2 * noiseL1Cnt + qMapPostCoringTh2 * (16 - noiseL1Cnt) + 8 ) >> 4;
3244
3245 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh1 , 0x000F );
3246 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, postCoringTh2 << 4 , 0x00F0 );
3247 }
3248 }
3249
3250 /******************************************************************************/
3251 /// Agate Function
3252 ///
3253 /******************************************************************************/
3254
3255
MDrv_SC_Edison_D3D_driver(void)3256 void MDrv_SC_Edison_D3D_driver( void )
3257 {
3258 MS_U16 LT_Lev[32];
3259 MS_U16 RB_Lev[32];
3260 MS_U8 idx = 0;
3261
3262 static MS_U32 DIF_LR_sum = 0xFFFF;
3263 static MS_U32 DIF_TB_sum = 0xFFFF;
3264 // static MS_U8 D3D_mode=0; //0: video, 1: LR mode, 2:TB mode
3265 static MS_U8 D3D_ready=0;
3266 static MS_U8 LRTB_Cnt=0;
3267 static MS_U32 DIF_LR_sum_prv=0xFFFF;
3268 static MS_U32 DIF_TB_sum_prv=0xFFFF;
3269 static MS_BOOL begin_d3d = false;
3270 // static MS_U16 CB_status = 0;
3271
3272 //first time
3273 if( (LRTB_Cnt == 0) && (begin_d3d == false))
3274 {
3275 MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3276 begin_d3d = true;
3277 }
3278
3279 if( D3D_ready )
3280 {
3281 LT_Lev[0] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_10_L, 0xFFFF);
3282 LT_Lev[1] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_11_L, 0xFFFF);
3283 LT_Lev[2] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_12_L, 0xFFFF);
3284 LT_Lev[3] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_13_L, 0xFFFF);
3285 LT_Lev[4] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_14_L, 0xFFFF);
3286 LT_Lev[5] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_15_L, 0xFFFF);
3287 LT_Lev[6] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_16_L, 0xFFFF);
3288 LT_Lev[7] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_17_L, 0xFFFF);
3289 LT_Lev[8] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_18_L, 0xFFFF);
3290 LT_Lev[9] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_19_L, 0xFFFF);
3291 LT_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1A_L, 0xFFFF);
3292 LT_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1B_L, 0xFFFF);
3293 LT_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1C_L, 0xFFFF);
3294 LT_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1D_L, 0xFFFF);
3295 LT_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1E_L, 0xFFFF);
3296 LT_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_1F_L, 0xFFFF);
3297 LT_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_20_L, 0xFFFF);
3298 LT_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_21_L, 0xFFFF);
3299 LT_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_22_L, 0xFFFF);
3300 LT_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_23_L, 0xFFFF);
3301 LT_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_24_L, 0xFFFF);
3302 LT_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_25_L, 0xFFFF);
3303 LT_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_26_L, 0xFFFF);
3304 LT_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_27_L, 0xFFFF);
3305 LT_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_28_L, 0xFFFF);
3306 LT_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_29_L, 0xFFFF);
3307 LT_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2A_L, 0xFFFF);
3308 LT_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2B_L, 0xFFFF);
3309 LT_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2C_L, 0xFFFF);
3310 LT_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2D_L, 0xFFFF);
3311 LT_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2E_L, 0xFFFF);
3312 LT_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_2F_L, 0xFFFF);
3313
3314 RB_Lev[0] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_30_L, 0xFFFF);
3315 RB_Lev[1] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_31_L, 0xFFFF);
3316 RB_Lev[2] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_32_L, 0xFFFF);
3317 RB_Lev[3] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_33_L, 0xFFFF);
3318 RB_Lev[4] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_34_L, 0xFFFF);
3319 RB_Lev[5] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_35_L, 0xFFFF);
3320 RB_Lev[6] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_36_L, 0xFFFF);
3321 RB_Lev[7] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_37_L, 0xFFFF);
3322 RB_Lev[8] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_38_L, 0xFFFF);
3323 RB_Lev[9] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_39_L, 0xFFFF);
3324 RB_Lev[10] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3A_L, 0xFFFF);
3325 RB_Lev[11] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3B_L, 0xFFFF);
3326 RB_Lev[12] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3C_L, 0xFFFF);
3327 RB_Lev[13] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3D_L, 0xFFFF);
3328 RB_Lev[14] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3E_L, 0xFFFF);
3329 RB_Lev[15] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_3F_L, 0xFFFF);
3330 RB_Lev[16] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_40_L, 0xFFFF);
3331 RB_Lev[17] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_41_L, 0xFFFF);
3332 RB_Lev[18] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_42_L, 0xFFFF);
3333 RB_Lev[19] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_43_L, 0xFFFF);
3334 RB_Lev[20] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_44_L, 0xFFFF);
3335 RB_Lev[21] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_45_L, 0xFFFF);
3336 RB_Lev[22] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_46_L, 0xFFFF);
3337 RB_Lev[23] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_47_L, 0xFFFF);
3338 RB_Lev[24] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_48_L, 0xFFFF);
3339 RB_Lev[25] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_49_L, 0xFFFF);
3340 RB_Lev[26] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4A_L, 0xFFFF);
3341 RB_Lev[27] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4B_L, 0xFFFF);
3342 RB_Lev[28] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4C_L, 0xFFFF);
3343 RB_Lev[29] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4D_L, 0xFFFF);
3344 RB_Lev[30] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4E_L, 0xFFFF);
3345 RB_Lev[31] = MApi_XC_R2BYTEMSK(REG_SC_BK1D_4F_L, 0xFFFF);
3346
3347
3348 if( 0 == (LRTB_Cnt % 2) )
3349 {
3350 DIF_LR_sum = 0;
3351 for( idx = 0; idx < 32; idx++ )
3352 {
3353 DIF_LR_sum = DIF_LR_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3354 }
3355
3356 //IIR filter
3357 DIF_LR_sum = (DIF_LR_sum_prv*3 + DIF_LR_sum)/4;
3358 DIF_LR_sum_prv = DIF_LR_sum;
3359 }
3360 else
3361 {
3362 DIF_TB_sum = 0;
3363 for( idx = 0; idx < 32; idx++ )
3364 {
3365 DIF_TB_sum = DIF_TB_sum + abs( LT_Lev[idx] - RB_Lev[idx] );
3366 }
3367
3368 //IIR filter
3369 DIF_TB_sum = (DIF_TB_sum_prv*3 + DIF_TB_sum)/4;
3370 DIF_TB_sum_prv = DIF_TB_sum;
3371 }
3372
3373 //checkboard status
3374 // CB_status = MApi_XC_R2BYTEMSK(REG_SC_BK1D_53_L, 0xFFFF);
3375 #if 0
3376 if((DIF_TB_sum > (4*DIF_LR_sum)) && (DIF_LR_sum < 1000))
3377 D3D_mode = 1; //LR mode
3378 else if((DIF_LR_sum > (4*DIF_TB_sum)) && (DIF_TB_sum < 1000))
3379 D3D_mode = 2; //TB mode
3380 else if( CB_status > 1000 )
3381 D3D_mode = 3; //Checkboard mode
3382 else if( (DIF_LR_sum < 400) && (DIF_TB_sum < 400) )
3383 D3D_mode = 4; //repeat previous frame
3384 else
3385 D3D_mode = 0; //video
3386 #endif
3387 //for next D3D frame trigger
3388 if( 0 == (LRTB_Cnt % 2) )
3389 MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x02, 0x02); //for next frame: top-bottom
3390 else
3391 MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x00, 0x02); //for next frame: side-by-side
3392
3393 MApi_XC_W2BYTEMSK(REG_SC_BK1D_50_L, 0x0001, 0x0001);
3394 }
3395
3396 //for next start
3397 if( LRTB_Cnt >= 1 )
3398 {
3399 LRTB_Cnt=0;
3400 }
3401 else
3402 {
3403 LRTB_Cnt++;
3404 }
3405
3406 //wait ready signal
3407 D3D_ready = MApi_XC_R2BYTEMSK(REG_SC_BK1D_50_L, 0x0080)>>7;
3408 }
3409
MDrv_SC_ResetSourceChange(const MS_BOOL sourceChangeForME)3410 void MDrv_SC_ResetSourceChange(const MS_BOOL sourceChangeForME ) //review MERESET
3411 {
3412
3413 static MS_U8 u8CurFrameCnt1 = 0;
3414 static MS_U8 u8CurFrameCnt2 = 0;
3415 static MS_BOOL meReset = false;
3416 static MS_BOOL isReset = false;
3417
3418 if(sourceChangeForME == 1 )
3419 {
3420 if(u8CurFrameCnt1 != 60 )
3421 u8CurFrameCnt1++;
3422 }
3423 else
3424 u8CurFrameCnt1 = 0;
3425
3426 if( meReset )
3427 {
3428 if(u8CurFrameCnt2 != 60 )
3429 u8CurFrameCnt2++;
3430 }
3431 else
3432 u8CurFrameCnt2 = 0;
3433
3434 if( (u8CurFrameCnt1 == 30) && (!meReset) )
3435 {
3436 meReset = true;
3437 }
3438
3439 if( (u8CurFrameCnt2 == 5) && meReset )
3440 {
3441 meReset = false;
3442 isReset = true;
3443 }
3444 else
3445 {
3446 isReset = false;
3447 }
3448
3449 if(isReset)
3450 {
3451 MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, 0x0000, 0x0002); /* Reset Init Bit */
3452 u8CurFrameCnt1 = 0;
3453 }
3454 }
MDrv_SC_Agate_ME_Reset(const MS_U32 u32MotionValue2,const MS_BOOL isSceneChangeMc,const MS_BOOL isSceneChangeY,const MS_BOOL isSourceChange)3455 MS_BOOL MDrv_SC_Agate_ME_Reset( const MS_U32 u32MotionValue2, const MS_BOOL isSceneChangeMc, const MS_BOOL isSceneChangeY, const MS_BOOL isSourceChange )//review MERESET
3456 {
3457 static MS_U8 u8CurFrameCnt1 = 0;
3458 static MS_U8 u8CurFrameCnt2 = 0;
3459 static MS_BOOL meReset = false;
3460 MS_BOOL meResetFlag = false;
3461
3462 if (u32MotionValue2 == 0 )
3463 {
3464 if(u8CurFrameCnt1 != 60 )
3465 u8CurFrameCnt1++;
3466 }
3467 else
3468 {
3469 u8CurFrameCnt1 = 0;
3470 }
3471
3472 if ( meReset )
3473 {
3474 if(u8CurFrameCnt2 != 60 )
3475 u8CurFrameCnt2++;
3476 }
3477 else
3478 {
3479 u8CurFrameCnt2 = 0;
3480 }
3481
3482 if( (u8CurFrameCnt1 == 30) && (!meReset) )
3483 {
3484 meReset = true;
3485 }
3486
3487 if( (u8CurFrameCnt2 == 5) && meReset )
3488 {
3489 meReset = false;
3490 meResetFlag = true;
3491 }
3492 else
3493 {
3494 meResetFlag = false;
3495 }
3496
3497 if( meReset || isSceneChangeMc || isSceneChangeY || isSourceChange)
3498 {
3499 MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L, 0x0011, 0x0011);
3500 }
3501 else
3502 {
3503 MApi_XC_W2BYTEMSK(REG_SC_BK17_79_L, 0x0000, 0x0011);
3504 }
3505 return meResetFlag;
3506 }
3507
3508 /******************************************************************************/
3509 ///Read ME value (F2 ME status)
3510 ///@return MS_U16: Motion value
3511 /******************************************************************************/
MDrv_SC_read_avgMcnrMovingWeightMin(void)3512 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMin(void)
3513 {
3514 MS_U16 cur;
3515 static MS_U16 prv = 0;
3516
3517 cur = MApi_XC_R2BYTE(REG_SC_BK09_68_L);
3518 cur = ((prv*3 )+ cur ) >> 2;
3519 prv = cur;
3520
3521 return prv;
3522 }
3523
MDrv_SC_read_avgMcnrMovingWeight(void)3524 MS_U16 MDrv_SC_read_avgMcnrMovingWeight(void)
3525 {
3526 MS_U16 cur;
3527 static MS_U16 prv = 0;
3528
3529 cur = MApi_XC_R2BYTE(REG_SC_BK09_6A_L);
3530 cur = ((prv*3 )+ cur ) >> 2;
3531 prv = cur;
3532
3533 return prv;
3534 }
3535
MDrv_SC_read_avgMcnrMovingWeightMax(void)3536 MS_U16 MDrv_SC_read_avgMcnrMovingWeightMax(void)
3537 {
3538 MS_U16 cur;
3539 static MS_U16 prv = 0;
3540
3541 cur = MApi_XC_R2BYTE(REG_SC_BK09_6B_L);
3542 cur = ((prv*3 )+ cur ) >> 2;
3543 prv = cur;
3544
3545 return prv;
3546 }
3547
MDrv_SC_read_avgMv0MovingWeight(void)3548 MS_U16 MDrv_SC_read_avgMv0MovingWeight(void)
3549 {
3550 MS_U16 cur;
3551 static MS_U16 prv = 0;
3552
3553 cur = MApi_XC_R2BYTE(REG_SC_BK09_69_L);
3554 cur = ((prv*3 )+ cur ) >> 2;
3555 prv = cur;
3556
3557 return prv;
3558 }
3559
MDrv_SC_read_me2SadDiff(void)3560 MS_U16 MDrv_SC_read_me2SadDiff(void)
3561 {
3562 MS_U16 cur;
3563 static MS_U16 prv = 0;
3564
3565 cur = MApi_XC_R2BYTE(REG_SC_BK09_6C_L);
3566 cur = ((prv*3 )+ cur ) >> 2;
3567 prv = cur;
3568
3569 return prv;
3570 }
3571
3572 /******************************************************************************/
3573 ///Read motion value (F2 motion status)
3574 ///@return MS_U8: Motion value
3575 /******************************************************************************/
MDrv_SC_read_motion_value1(void)3576 MS_U32 MDrv_SC_read_motion_value1(void)
3577 {
3578 MS_U32 u32MotionValue = 0;
3579 MS_U32 u32RegMadi_1C = 0, u32RegMadi_1B = 0, u32RegMadi_1A = 0;
3580
3581 u32RegMadi_1C = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F);
3582 u32RegMadi_1B = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xFF00);
3583 u32RegMadi_1A = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0x00FF);
3584
3585 u32RegMadi_1C = u32RegMadi_1C * 0x10000UL;
3586
3587 u32MotionValue = (u32RegMadi_1C + u32RegMadi_1B + u32RegMadi_1A) ;
3588
3589 DRVSCA_DBG(PRT_TRP("MotionValue = 0x%x\n", u32MotionValue));
3590
3591 return u32MotionValue;
3592 }
3593
3594 /******************************************************************************/
3595 ///Read motion value (Motion count status)
3596 ///@return MS_U8: Motion value
3597 /******************************************************************************/
MDrv_SC_read_motion_value2(void)3598 MS_U32 MDrv_SC_read_motion_value2(void)
3599 {
3600 MS_U32 u32MotionValue = 0;
3601
3602 u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_1A_L, 0x7F);
3603
3604 return u32MotionValue;
3605 }
3606
3607 /******************************************************************************/
3608 ///Read motion value (Motion count status)
3609 ///@return MS_U32: Motion value
3610 /******************************************************************************/
MDrv_SC_read_motion_value3(void)3611 MS_U32 MDrv_SC_read_motion_value3(void)
3612 {
3613 MS_U32 u32MotionValue = 0;
3614
3615 u32MotionValue = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK0A_18_L, 0x0FFF);
3616
3617 return u32MotionValue;
3618 }
3619
MDrv_SC_read_motion_value4(void)3620 MS_U16 MDrv_SC_read_motion_value4(void)
3621 {
3622 MS_U16 motionValue = 0;
3623
3624 motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0x7FFF);
3625
3626 return motionValue;
3627 }
3628
3629 //-------------------------------------------------------------------------------------------------
3630 /// Read motion value (Motion count status)
3631 /// @return MS_U8: Motion value
3632 //-------------------------------------------------------------------------------------------------
Hal_PQ_GetCurrentMotionValue(void * pInstance)3633 MS_U8 Hal_PQ_GetCurrentMotionValue(void *pInstance)
3634 {
3635 MS_U8 u8MotionValue = 0;
3636
3637 u8MotionValue = (MS_U8)((MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0x3F) << 2)
3638 |(MApi_XC_R2BYTEMSK(REG_SC_BK22_0D_L, 0xC000) >> 6));
3639
3640 return u8MotionValue;
3641 }
3642
3643 /******************************************************************************/
3644 ///Read VCnt value
3645 ///@return MS_U8: VCnt value
3646 /******************************************************************************/
MDrv_SC_read_v_cnt(void)3647 MS_U8 MDrv_SC_read_v_cnt(void)
3648 {
3649 MS_U8 u8VCnt = 0;
3650 u8VCnt = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK22_0E_L, 0xC0) >> 6);
3651 return u8VCnt;
3652 }
3653
3654 /******************************************************************************/
3655 ///Read SDHDD Detect Threshold value
3656 ///@return MS_U16: HDSDD_Det_Threshold value
3657 /******************************************************************************/
MDrv_SC_read_HDSDD_Det_Threshold_value(void)3658 MS_U16 MDrv_SC_read_HDSDD_Det_Threshold_value(void)
3659 {
3660 MS_U16 u16Value = 0;
3661
3662 u16Value = 0x30; //(MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK22_7F_L, 0xFFFF);
3663
3664 return u16Value;
3665 }
3666
3667 /******************************************************************************/
3668 ///Read DLC 32 section Histogram Data
3669 ///@return MS_U16: 32 section Histogram Data
3670 /******************************************************************************/
3671
MDrv_SC_GetLumaHistogram(void)3672 XC_LumaHistogramStates MDrv_SC_GetLumaHistogram(void)
3673 {
3674 //all registers move to UFSC BK55 in Maserati
3675 XC_LumaHistogramStates lumaStatus;
3676 int i = 0;
3677 lumaStatus.lumaBin[0] = MDrv_Read2Byte( REG_FSC_BK55_30_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_31_L , 0x000F)<<16);
3678 lumaStatus.lumaBin[1] = MDrv_Read2Byte( REG_FSC_BK55_32_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_33_L , 0x000F)<<16);
3679 lumaStatus.lumaBin[2] = MDrv_Read2Byte( REG_FSC_BK55_34_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_35_L , 0x000F)<<16);
3680 lumaStatus.lumaBin[3] = MDrv_Read2Byte( REG_FSC_BK55_36_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_37_L , 0x000F)<<16);
3681 lumaStatus.lumaBin[4] = MDrv_Read2Byte( REG_FSC_BK55_38_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_39_L , 0x000F)<<16);
3682 lumaStatus.lumaBin[5] = MDrv_Read2Byte( REG_FSC_BK55_3A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3B_L , 0x000F)<<16);
3683 lumaStatus.lumaBin[6] = MDrv_Read2Byte( REG_FSC_BK55_3C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3D_L , 0x000F)<<16);
3684 lumaStatus.lumaBin[7] = MDrv_Read2Byte( REG_FSC_BK55_3E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_3F_L , 0x000F)<<16);
3685 lumaStatus.lumaBin[8] = MDrv_Read2Byte( REG_FSC_BK55_40_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_41_L , 0x000F)<<16);
3686 lumaStatus.lumaBin[9] = MDrv_Read2Byte( REG_FSC_BK55_42_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_43_L , 0x000F)<<16);
3687 lumaStatus.lumaBin[10] = MDrv_Read2Byte( REG_FSC_BK55_44_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_45_L , 0x000F)<<16);
3688 lumaStatus.lumaBin[11] = MDrv_Read2Byte( REG_FSC_BK55_46_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_47_L , 0x000F)<<16);
3689 lumaStatus.lumaBin[12] = MDrv_Read2Byte( REG_FSC_BK55_48_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_49_L , 0x000F)<<16);
3690 lumaStatus.lumaBin[13] = MDrv_Read2Byte( REG_FSC_BK55_4A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4B_L , 0x000F)<<16);
3691 lumaStatus.lumaBin[14] = MDrv_Read2Byte( REG_FSC_BK55_4C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4D_L , 0x000F)<<16);
3692 lumaStatus.lumaBin[15] = MDrv_Read2Byte( REG_FSC_BK55_4E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_4F_L , 0x000F)<<16);
3693 lumaStatus.lumaBin[16] = MDrv_Read2Byte( REG_FSC_BK55_50_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_51_L , 0x000F)<<16);
3694 lumaStatus.lumaBin[17] = MDrv_Read2Byte( REG_FSC_BK55_52_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_53_L , 0x000F)<<16);
3695 lumaStatus.lumaBin[18] = MDrv_Read2Byte( REG_FSC_BK55_54_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_55_L , 0x000F)<<16);
3696 lumaStatus.lumaBin[19] = MDrv_Read2Byte( REG_FSC_BK55_56_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_57_L , 0x000F)<<16);
3697 lumaStatus.lumaBin[20] = MDrv_Read2Byte( REG_FSC_BK55_58_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_59_L , 0x000F)<<16);
3698 lumaStatus.lumaBin[21] = MDrv_Read2Byte( REG_FSC_BK55_5A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5B_L , 0x000F)<<16);
3699 lumaStatus.lumaBin[22] = MDrv_Read2Byte( REG_FSC_BK55_5C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5D_L , 0x000F)<<16);
3700 lumaStatus.lumaBin[23] = MDrv_Read2Byte( REG_FSC_BK55_5E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_5F_L , 0x000F)<<16);
3701 lumaStatus.lumaBin[24] = MDrv_Read2Byte( REG_FSC_BK55_60_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_61_L , 0x000F)<<16);
3702 lumaStatus.lumaBin[25] = MDrv_Read2Byte( REG_FSC_BK55_62_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_63_L , 0x000F)<<16);
3703 lumaStatus.lumaBin[26] = MDrv_Read2Byte( REG_FSC_BK55_64_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_65_L , 0x000F)<<16);
3704 lumaStatus.lumaBin[27] = MDrv_Read2Byte( REG_FSC_BK55_66_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_67_L , 0x000F)<<16);
3705 lumaStatus.lumaBin[28] = MDrv_Read2Byte( REG_FSC_BK55_68_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_69_L , 0x000F)<<16);
3706 lumaStatus.lumaBin[29] = MDrv_Read2Byte( REG_FSC_BK55_6A_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6B_L , 0x000F)<<16);
3707 lumaStatus.lumaBin[30] = MDrv_Read2Byte( REG_FSC_BK55_6C_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6D_L , 0x000F)<<16);
3708 lumaStatus.lumaBin[31] = MDrv_Read2Byte( REG_FSC_BK55_6E_L )+(MDrv_Read2ByteMSK( REG_FSC_BK55_6F_L , 0x000F)<<16);
3709
3710 for (i=0; i<32; i++)
3711 {
3712 lumaStatus.lumaBin[i]= lumaStatus.lumaBin[i]>>4;
3713 }
3714
3715 return lumaStatus;
3716 }
3717
3718 #define Confirm_Gain 5
MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(MS_U16 * me1IsMv0,MS_U16 * me1IsNonMv0,MS_U16 * me1IsNotFound)3719 MS_U16 MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset(MS_U16 *me1IsMv0, MS_U16 *me1IsNonMv0, MS_U16 *me1IsNotFound )
3720 {
3721 MS_U16 MV0_Comfirm = 0, nonMV0_Comfirm = 0, MV_Contradict = 0;
3722 static MS_U16 Prev_MV0_Comfirm = 0;
3723 static MS_U16 Prev_nonMV0_Comfirm = 0;
3724 static MS_U16 Prev_MV_Contradict = 0;
3725 MS_U16 MV_Comfirm = 0;
3726 MS_U16 MR_Offset = 0;
3727
3728 MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
3729 nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
3730 MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
3731
3732 MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3733 Prev_MV0_Comfirm = MV0_Comfirm;
3734
3735 nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3736 Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3737
3738 MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3739 Prev_MV_Contradict = MV_Contradict;
3740
3741 MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3742
3743 if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3744 MR_Offset = nonMV0_Comfirm;
3745 else
3746 MR_Offset = 0;
3747
3748 *me1IsMv0 = MV0_Comfirm;
3749 *me1IsNonMv0 = nonMV0_Comfirm;
3750 *me1IsNotFound = MV_Contradict;
3751
3752 return MR_Offset;
3753 }
3754
MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(MS_U16 * me2IsMv0,MS_U16 * me2IsNonMv0,MS_U16 * me2IsNotFound)3755 MS_U16 MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset(MS_U16 *me2IsMv0, MS_U16 *me2IsNonMv0, MS_U16 *me2IsNotFound)
3756 {
3757 MS_U16 MV0_Comfirm = 0, nonMV0_Comfirm = 0, MV_Contradict = 0;
3758 static MS_U16 Prev_MV0_Comfirm = 0;
3759 static MS_U16 Prev_nonMV0_Comfirm = 0;
3760 static MS_U16 Prev_MV_Contradict = 0;
3761 MS_U16 MV_Comfirm = 0;
3762 MS_U16 MR_Offset = 0;
3763
3764 MV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
3765 nonMV0_Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
3766 MV_Contradict = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
3767
3768 MV0_Comfirm = (Prev_MV0_Comfirm * 3 + MV0_Comfirm) >> 2;
3769 Prev_MV0_Comfirm = MV0_Comfirm;
3770
3771 nonMV0_Comfirm = (Prev_nonMV0_Comfirm * 3 + nonMV0_Comfirm) >> 2;
3772 Prev_nonMV0_Comfirm = nonMV0_Comfirm;
3773
3774 MV_Contradict = (Prev_MV_Contradict * 3 + MV_Contradict) >> 2;
3775 Prev_MV_Contradict = MV_Contradict;
3776
3777 MV_Comfirm = MV0_Comfirm + nonMV0_Comfirm;
3778
3779 if(MV_Comfirm > (MV_Contradict * Confirm_Gain))
3780 MR_Offset = nonMV0_Comfirm;
3781 else
3782 MR_Offset = 0;
3783
3784 *me2IsMv0 = MV0_Comfirm;
3785 *me2IsNonMv0 = nonMV0_Comfirm;
3786 *me2IsNotFound = MV_Contradict;
3787
3788 return MR_Offset;
3789 }
3790
3791 #define ScenceChange_TH 0x1000
MDrv_SC_Agate_SceneChangeY(const XC_LumaHistogramStates lumaHistogram)3792 MS_BOOL MDrv_SC_Agate_SceneChangeY( const XC_LumaHistogramStates lumaHistogram )
3793 {
3794 //XC_DLC_ApiStatus DLC_Status;
3795 //MApi_XC_DLC_GetStatus_Ex(&DLC_Status,MAIN_WINDOW);
3796 static MS_U16 Pre_LumaHistogram[32], Max_HistogramDiff = 0;
3797 MS_U16 HistogramDiff = 0;
3798 int i = 0;
3799
3800 for(i=0;i<32;i++)
3801 {
3802 if(lumaHistogram.lumaBin[i] >= Pre_LumaHistogram[i])
3803 {
3804 HistogramDiff = lumaHistogram.lumaBin[i] - Pre_LumaHistogram[i];
3805 }
3806 else
3807 {
3808 HistogramDiff = Pre_LumaHistogram[i] - lumaHistogram.lumaBin[i];
3809 }
3810
3811 if(HistogramDiff > Max_HistogramDiff)
3812 {
3813 Max_HistogramDiff = HistogramDiff;
3814 }
3815
3816 Pre_LumaHistogram[i] = lumaHistogram.lumaBin[i];
3817 }
3818
3819 if( Max_HistogramDiff > ScenceChange_TH )
3820 {
3821 Max_HistogramDiff = 0;
3822 return true;
3823 }
3824 else
3825 {
3826 Max_HistogramDiff = 0;
3827 return false;
3828 }
3829 }
3830
MDrv_SC_Agate_SceneChangeMc(const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0,const MS_U16 me1IsNotFound,const MS_U16 me2IsMv0,const MS_U16 me2IsNonMv0,const MS_U16 me2IsNotFound)3831 MS_BOOL MDrv_SC_Agate_SceneChangeMc(const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0, const MS_U16 me1IsNotFound,
3832 const MS_U16 me2IsMv0, const MS_U16 me2IsNonMv0, const MS_U16 me2IsNotFound)
3833 {
3834 MS_U16 me1Comfirm = 0;
3835 MS_U16 me2Comfirm = 0;
3836 static MS_BOOL isNotFound = false;
3837 static MS_BOOL isScencChange = false;
3838
3839 static MS_U8 notFoundDelayCnt = 0;
3840 static MS_U8 scencChangeDelayCnt = 0;
3841
3842 me1Comfirm = me1IsMv0 + me1IsNonMv0;
3843 me2Comfirm = me2IsMv0 + me2IsNonMv0;
3844
3845 if((me1IsNotFound > me1Comfirm*5)&&(me2IsNotFound > me2Comfirm*5) &&
3846 (me1IsNotFound > 0x10) && (me2IsNotFound > 0x10) )/* not found*/
3847 {
3848 isNotFound = true;
3849 }
3850
3851 if( isNotFound )
3852 {
3853 if( notFoundDelayCnt != 60 )
3854 notFoundDelayCnt++;
3855 }
3856
3857 if( notFoundDelayCnt > 10 )
3858 {
3859 if((me1IsNotFound*5 < me1Comfirm)&&(me2IsNotFound*5 < me2Comfirm) &&
3860 (me1Comfirm > 0x10) && (me2Comfirm > 0x10) )/* found */
3861 {
3862 isScencChange = true;
3863 }
3864 else
3865 {
3866 isScencChange = false;
3867 }
3868
3869 notFoundDelayCnt = 0;
3870 isNotFound = false;
3871 }
3872
3873 if( isScencChange )
3874 {
3875 if( scencChangeDelayCnt != 60 )
3876 scencChangeDelayCnt++;
3877 }
3878
3879 if( scencChangeDelayCnt > 5 )
3880 {
3881 scencChangeDelayCnt = 0;
3882 isScencChange = false;
3883 }
3884
3885 return isScencChange;
3886 }
3887
3888 #define HIS_MOTION_TH 0x0A
MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)3889 MS_BOOL MDrv_SC_Bouncing_Status(const MS_U32 u32MotionValue)
3890 {
3891 if( u32MotionValue < HIS_MOTION_TH )
3892 {
3893 return TRUE; //Still pattern
3894 }
3895 else
3896 {
3897 return FALSE; //Moving pattern
3898 }
3899 }
3900
3901 #define HIS_MOTION_TH2 0x30
MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)3902 MS_BOOL MDrv_SC_Bouncing_Status2(const MS_U32 u32MotionValue)
3903 {
3904 if( u32MotionValue < HIS_MOTION_TH2 )
3905 {
3906 return TRUE; //Still pattern
3907 }
3908 else
3909 {
3910 return FALSE; //Moving pattern
3911 }
3912 }
3913
3914
3915 #define Feather_Sum_TH 0x1500
3916 #define Feather_Sum_TH2 0x230
MDrv_SC_TotalFeather_Sum_Status(const MS_U16 featherAndMotion,const MS_BOOL isSD_source,MS_BOOL * Feather_sum_status2)3917 MS_BOOL MDrv_SC_TotalFeather_Sum_Status(const MS_U16 featherAndMotion, const MS_BOOL isSD_source, MS_BOOL *Feather_sum_status2 )
3918 {
3919 MS_U32 SD2HD_Feather = 0;
3920 static MS_U32 SD2HD_Feather_iir = 0;
3921 MS_BOOL isFeatherAndMotion = ( featherAndMotion > 0x10 ) ? true : false;
3922
3923 MS_BOOL isFeather1 = FALSE, isFeather2 = FALSE;
3924
3925 static MS_U8 confirm_cnt1 = 0;
3926 static MS_U8 confirm_cnt2 = 0;
3927
3928 SD2HD_Feather = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
3929 SD2HD_Feather = ((SD2HD_Feather_iir*3 )+ SD2HD_Feather ) >> 2;
3930 SD2HD_Feather_iir = SD2HD_Feather;
3931
3932 if( (SD2HD_Feather_iir > Feather_Sum_TH2) &&(isSD_source) && (!isFeatherAndMotion) )
3933 //*Feather_sum_status2 = true;
3934 isFeather2 = true;
3935 else
3936 //*Feather_sum_status2 = false;
3937 isFeather2 = false;
3938
3939 if( (SD2HD_Feather_iir > Feather_Sum_TH) &&(isSD_source) && (!isFeatherAndMotion) )
3940 isFeather1 = true;
3941 else
3942 isFeather1 = false;
3943
3944 if( isFeather2 )
3945 {
3946 if( confirm_cnt2 < 120 )
3947 confirm_cnt2++;
3948 }
3949 else
3950 {
3951 confirm_cnt2 = 0;
3952 }
3953
3954 if( isFeather1 )
3955 {
3956 if( confirm_cnt1 < 120 )
3957 confirm_cnt1++;
3958 }
3959 else
3960 {
3961
3962 confirm_cnt1 = 0;
3963 }
3964
3965
3966 if( confirm_cnt2 > 60 )
3967 *Feather_sum_status2 = true;
3968 else
3969 *Feather_sum_status2 = false;
3970
3971 return ( confirm_cnt1 > 60 );
3972 }
3973
MDrv_SC_ScenceChangeDetectByNotFound(const MS_U16 mvNotFound_noIIR)3974 MS_BOOL MDrv_SC_ScenceChangeDetectByNotFound(const MS_U16 mvNotFound_noIIR)
3975 {
3976 static MS_U16 mvNotFound_noIIR_pre = 0;
3977 MS_U16 Diff_notFound = 0;
3978
3979 if(mvNotFound_noIIR > mvNotFound_noIIR_pre)
3980 {
3981 Diff_notFound = mvNotFound_noIIR - mvNotFound_noIIR_pre;
3982 }
3983 else
3984 {
3985 Diff_notFound = mvNotFound_noIIR_pre - mvNotFound_noIIR;
3986 }
3987
3988 if(Diff_notFound > 0x10)
3989 {
3990 if( (mvNotFound_noIIR > (mvNotFound_noIIR_pre*2)) || (mvNotFound_noIIR < (mvNotFound_noIIR_pre*2)) )
3991 {
3992 mvNotFound_noIIR_pre = mvNotFound_noIIR;
3993 return true;
3994 }
3995 else
3996 {
3997 mvNotFound_noIIR_pre = mvNotFound_noIIR;
3998 return false;
3999 }
4000 }
4001 else
4002 {
4003 return false;
4004 }
4005 }
4006
4007 #define TIME_SHARING_DELAY 5
4008 #define TIME_SHARING_MAX_ID 5 //Eva add one 0804
MDrv_SC_TimeSharing(const XC_OpFrameStates opFrameStatusCur,MS_U8 * timingSegment,MS_BOOL isSourceChangeFlag)4009 MS_U8 MDrv_SC_TimeSharing( const XC_OpFrameStates opFrameStatusCur, MS_U8 *timingSegment , MS_BOOL isSourceChangeFlag)
4010 {
4011 static XC_OpFrameStates opFrameStatusLast;
4012 static MS_U8 timingId = 0;
4013
4014 if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4015 timingId++;
4016
4017 if( timingId == (TIME_SHARING_DELAY*TIME_SHARING_MAX_ID) || isSourceChangeFlag == 1)
4018 timingId = 0;
4019
4020 opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4021
4022 // return
4023 *timingSegment = ( timingId % TIME_SHARING_DELAY ) ;
4024 return ( timingId / TIME_SHARING_DELAY );
4025 }
4026
MDrv_SC_OpFrame_Status(void)4027 XC_OpFrameStates MDrv_SC_OpFrame_Status(void)
4028 {
4029 XC_OpFrameStates opFrameStatus;
4030
4031 opFrameStatus.curOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_3A_L, 0x00F0) >> 4 );
4032 opFrameStatus.maxOpFrame = (MS_U8)( MApi_XC_R2BYTEMSK(REG_SC_BK12_19_L, 0x001F) >> 0 );
4033
4034 return opFrameStatus;
4035 }
4036
MDrv_SC_Film_Status(void)4037 XC_FilmStates MDrv_SC_Film_Status(void)
4038 {
4039 XC_FilmStates filmstatus;
4040
4041 filmstatus.film22 = FALSE;
4042 filmstatus.film32 = FALSE;
4043 filmstatus.filmany = FALSE;
4044 filmstatus.film_act = FALSE;
4045
4046 if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0008) == 0x0008) // film22
4047 {
4048 filmstatus.film22 = TRUE;
4049 }
4050 if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0010) == 0x0010) // film32
4051 {
4052 filmstatus.film32 = TRUE;
4053 }
4054
4055 if((MS_U16)MApi_XC_R2BYTEMSK(REG_SC_BK0A_21_L, 0x0040) == 0x0040) // film any
4056 {
4057 filmstatus.filmany = TRUE;
4058 }
4059
4060 if(filmstatus.film22 ||filmstatus.film32 ||filmstatus.filmany)
4061 {
4062 filmstatus.film_act = TRUE;
4063 }
4064
4065 return filmstatus;
4066 }
4067
MDrv_SC_KFC_EODiW_Ctrl(const MS_BOOL isUkosabihsMc)4068 void MDrv_SC_KFC_EODiW_Ctrl( const MS_BOOL isUkosabihsMc )
4069 {
4070 MS_U16 reg = 0;
4071
4072 if( isUkosabihsMc )
4073 reg = 0x0000; /* disable kfcEodiW */
4074 else
4075 reg = 0x00C0; /* enable kfcEodiW */
4076
4077 MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x00C0 );
4078 }
4079
MDrv_SC_Mcdi_EODiW_Ctrl(const MS_BOOL isUkosabihsMc,const MS_BOOL isL107)4080 void MDrv_SC_Mcdi_EODiW_Ctrl( const MS_BOOL isUkosabihsMc, const MS_BOOL isL107 )
4081 {
4082 MS_U16 reg = 0;
4083
4084 if( isUkosabihsMc || isL107 )
4085 {
4086 reg = 0x0000; /* disable mcEodiW */
4087 //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==0\n\n");
4088 }
4089 else
4090 {
4091 reg = 0x0080; /* enable mcEodiW */
4092 //printf("MDrv_SC_Mcdi_EODiW_Ctrl ==80\n\n");
4093 }
4094
4095 MApi_XC_W2BYTEMSK( REG_SC_BK22_28_L, reg, 0x0080 );
4096 }
4097
MDrv_SC_Force_Mcdi_Ctrl(const MS_BOOL isUkosabihsMc)4098 void MDrv_SC_Force_Mcdi_Ctrl( const MS_BOOL isUkosabihsMc)
4099 {
4100 MS_U16 reg_force_mcdi = 0;
4101
4102 if( isUkosabihsMc )
4103 reg_force_mcdi = 0x8080;
4104 else
4105 reg_force_mcdi = 0x0000;
4106
4107 MApi_XC_W2BYTEMSK( REG_SC_BK2A_2F_L, reg_force_mcdi , 0xFFFF );
4108 }
4109
MDrv_SC_Force_Motion_Ctrl(const MS_BOOL isL139,const MS_BOOL isUkosabihsMotion)4110 void MDrv_SC_Force_Motion_Ctrl( const MS_BOOL isL139, const MS_BOOL isUkosabihsMotion )
4111 {
4112 MS_U16 reg_force_motion;
4113 MS_U32 mv0_feather, nonMv0_feather;
4114 MS_U32 total_feather;
4115
4116 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4117 nonMv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
4118
4119 total_feather = mv0_feather + nonMv0_feather;
4120
4121 if( (isUkosabihsMotion)&&(total_feather< 0x1200))
4122 {
4123 reg_force_motion = 0x008F; /* full motion */
4124 }
4125 else if( isL139 )
4126 {
4127 reg_force_motion = 0x0080; /* full still */
4128 }
4129 else
4130 {
4131 reg_force_motion = 0x0000;
4132 }
4133
4134 MApi_XC_W2BYTEMSK(REG_SC_BK22_78_L, reg_force_motion, 0x00FF);
4135 }
4136
4137 #define reg_mcdi_feather_gain_MaxValue 0x02
4138 #define reg_mcdi_feather_gain_MinValue 0x00
MDrv_SC_KFC_Ctrl(const MS_BOOL isAbihsot)4139 void MDrv_SC_KFC_Ctrl( const MS_BOOL isAbihsot )
4140 {
4141 static MS_U16 u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4142
4143 if( isAbihsot )
4144 {
4145 if(u16regmcdifeathergain > reg_mcdi_feather_gain_MinValue)
4146 u16regmcdifeathergain--;
4147 else
4148 u16regmcdifeathergain = reg_mcdi_feather_gain_MinValue;
4149 }
4150 else
4151 {
4152 if(u16regmcdifeathergain < reg_mcdi_feather_gain_MaxValue)
4153 u16regmcdifeathergain++;
4154 else
4155 u16regmcdifeathergain = reg_mcdi_feather_gain_MaxValue;
4156 }
4157
4158 //Dummy to control write value, add by Bella 20150708
4159 if((MApi_XC_R2BYTE(REG_SC_BK23_5D_L)&0x000F)!=0x0000)
4160 {
4161 MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, MApi_XC_R2BYTE(REG_SC_BK23_5D_L), 0x0F00);
4162 }
4163 else
4164 {
4165 MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)u16regmcdifeathergain << 8, 0x0F00);
4166 }
4167 }
MDrv_SC_SourceChange(void)4168 MS_BOOL MDrv_SC_SourceChange(void)
4169 {
4170 static MS_BOOL bprevSourceChange = false;
4171
4172 MS_BOOL sourceChangeInitReg = MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0001);
4173 sourceChangeInitReg = sourceChangeInitReg&&(!bprevSourceChange);
4174
4175 if( sourceChangeInitReg == 1 )
4176 {
4177 MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, sourceChangeInitReg << 1, 0x0002);
4178 }
4179 else
4180 MApi_XC_W2BYTEMSK(REG_SC_BK30_07_L, 0x0000, 0x0001);
4181
4182 bprevSourceChange = sourceChangeInitReg;
4183 return sourceChangeInitReg;
4184 }
4185
MDrv_SC_SourceChangeFlag(MS_BOOL SourceChangeLastTime)4186 MS_BOOL MDrv_SC_SourceChangeFlag(MS_BOOL SourceChangeLastTime)
4187 {
4188 static MS_BOOL bsourceChangeFrm1 = false;
4189 static MS_BOOL bsourceChangeFrm2 = false;
4190 static MS_BOOL bsourceChangeFrm3 = false;
4191
4192 MS_BOOL sourceChangeFlag = bsourceChangeFrm1 || bsourceChangeFrm2 || bsourceChangeFrm3 || SourceChangeLastTime;
4193
4194 bsourceChangeFrm1 = bsourceChangeFrm2;
4195 bsourceChangeFrm2 = bsourceChangeFrm3;
4196 bsourceChangeFrm3 = SourceChangeLastTime;
4197
4198
4199 return sourceChangeFlag;
4200 }
4201
4202 #define VerticalMovingUdRatio_MaxValue 0x0F
4203 #define VerticalMovingUdRatio_MinValue 0x07
MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(const MS_U32 inSearchUseFeather,MS_BOOL isfilmLike)4204 void MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl(const MS_U32 inSearchUseFeather, MS_BOOL isfilmLike )
4205 {
4206 static MS_U16 u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4207
4208 if( inSearchUseFeather > 0x300 )
4209 {
4210 if ( u16VerticalMovingUdRatioValue > VerticalMovingUdRatio_MinValue)
4211 u16VerticalMovingUdRatioValue--;
4212 else
4213 u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MinValue;
4214 }
4215 else
4216 {
4217 if ( u16VerticalMovingUdRatioValue < VerticalMovingUdRatio_MaxValue)
4218 u16VerticalMovingUdRatioValue++;
4219 else
4220 u16VerticalMovingUdRatioValue = VerticalMovingUdRatio_MaxValue;
4221 }
4222
4223 if ( isfilmLike )
4224 MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, 0, 0x000F);
4225 else
4226 MApi_XC_W2BYTEMSK(REG_SC_BK2A_28_L, (MS_U16)u16VerticalMovingUdRatioValue, 0x000F);
4227
4228 }
4229
4230 #define KFC_8bitMotionGain_MaxValue 0x08
4231 #define KFC_8bitMotionGain_MinValue 0x04 //0 have feather issue.
MDrv_SC_KFC_8bitMotionGain_Ctrl(const MS_BOOL isZoomIn,const MS_BOOL isFilmLike,const MS_BOOL McSmallMoving)4232 void MDrv_SC_KFC_8bitMotionGain_Ctrl(const MS_BOOL isZoomIn, const MS_BOOL isFilmLike, const MS_BOOL McSmallMoving )
4233 {
4234 static MS_U16 u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4235
4236 if( isFilmLike || McSmallMoving )
4237 {
4238 if ( u16KFC8bitMotionGainValue < 0x0F/*Max*/ )
4239 u16KFC8bitMotionGainValue++;
4240 else
4241 u16KFC8bitMotionGainValue = 0x0F;
4242 }
4243 else if( isZoomIn )
4244 {
4245 //MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x1000, 0x1000);
4246 if ( u16KFC8bitMotionGainValue > KFC_8bitMotionGain_MinValue)
4247 u16KFC8bitMotionGainValue--;
4248 else
4249 u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MinValue;
4250 }
4251 else
4252 {
4253 //MApi_XC_W2BYTEMSK(REG_SC_BK22_7A_L, 0x0000, 0x1000);
4254 if ( u16KFC8bitMotionGainValue < KFC_8bitMotionGain_MaxValue)
4255 u16KFC8bitMotionGainValue++;
4256 else
4257 u16KFC8bitMotionGainValue = KFC_8bitMotionGain_MaxValue;
4258 }
4259
4260 MApi_XC_W2BYTEMSK(REG_SC_BK2A_3B_L, (MS_U16)u16KFC8bitMotionGainValue<<4, 0x00F0);
4261 }
4262
4263 #define DNR_DIV_MAX 4
MDrv_SC_DNR_DIV0_Ctrl(const MS_BOOL isWeakMcNrFilm,const MS_U8 isSourceChange)4264 void MDrv_SC_DNR_DIV0_Ctrl( const MS_BOOL isWeakMcNrFilm, const MS_U8 isSourceChange )
4265 {
4266 static MS_U8 orgDiv0 = 0;
4267 static MS_U8 curDiv0 = 0;
4268
4269 if( isSourceChange )
4270 orgDiv0 = (MS_U8)(MApi_XC_R2BYTEMSK(REG_SC_BK06_27_L, 0x001C)) >> 2;
4271
4272
4273 if( isWeakMcNrFilm )
4274 {
4275 if( curDiv0 < DNR_DIV_MAX )
4276 curDiv0++;
4277 }
4278 else
4279 {
4280 if( curDiv0 > orgDiv0 )
4281 curDiv0--;
4282 }
4283
4284 MApi_XC_W2BYTEMSK(REG_SC_BK06_27_L, ( curDiv0 << 2 ), 0x001C);
4285 }
4286
4287 #define REG_W3_FinialGain_MAX 0x0F
4288 #define REG_W3_FinialGain_MIN 0x08
MDrv_SC_MCNR_PatchW3FinalGain_Ctrl(const MS_BOOL isWeakMcNrFilm)4289 void MDrv_SC_MCNR_PatchW3FinalGain_Ctrl( const MS_BOOL isWeakMcNrFilm )
4290 {
4291 static MS_U8 reg_patch_w3_final_gain = REG_W3_FinialGain_MIN;
4292
4293 if( isWeakMcNrFilm )
4294 {
4295 if( reg_patch_w3_final_gain < REG_W3_FinialGain_MAX )
4296 reg_patch_w3_final_gain++;
4297 }
4298 else
4299 {
4300 if( reg_patch_w3_final_gain > REG_W3_FinialGain_MIN )
4301 reg_patch_w3_final_gain--;
4302 }
4303
4304 MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, ( reg_patch_w3_final_gain << 4 ), 0x00F0 );
4305 }
4306
MDrv_SC_MotionLimitGain_Ctrl(const MS_BOOL isL153)4307 void MDrv_SC_MotionLimitGain_Ctrl( const MS_BOOL isL153 )
4308 {
4309 if( isL153 )
4310 {
4311 MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
4312 }
4313 else
4314 {
4315 MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
4316 }
4317 }
4318
MDrv_SC_UCDi_Weight_Boundary_Ctrl(const XC_Me1HisStates H1)4319 void MDrv_SC_UCDi_Weight_Boundary_Ctrl( const XC_Me1HisStates H1)
4320 {
4321 MS_BOOL isHorizontalscroll = ( H1.minMvXdir != 8 ) ? true : false;
4322 if( isHorizontalscroll )
4323 {
4324 MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x1807, 0xFFFF);
4325 }
4326 else
4327 {
4328 MApi_XC_W2BYTEMSK(REG_SC_BK22_77_L, 0x0000, 0xFFFF);
4329 }
4330 }
4331
4332 #define FeatherSstGain_Max 0x0F
4333 #define FeatherSstGain_Min 0x02
MDrv_SC_featherSstGain_Ctrl(const MS_BOOL isMcFilmSlowMotion)4334 void MDrv_SC_featherSstGain_Ctrl( const MS_BOOL isMcFilmSlowMotion )
4335 {
4336 static MS_U8 reg_featherSstGain = FeatherSstGain_Min;
4337
4338 if( isMcFilmSlowMotion )
4339 {
4340 if( reg_featherSstGain < FeatherSstGain_Max )
4341 reg_featherSstGain++;
4342 }
4343 else
4344 {
4345 if( reg_featherSstGain > FeatherSstGain_Min )
4346 reg_featherSstGain--;
4347 }
4348
4349 MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstGain << 12 ), 0xF000);
4350 }
4351
4352 #define FeatherSstOffset_Max 0x01 /* default */
4353 #define FeatherSstOffset_Min 0x00
MDrv_SC_featherSstOffset_Ctrl(const XC_OpFrameStates opFrameStatusCur,const MS_BOOL isMcFilmSlowMotion,const MS_BOOL favorStill)4354 void MDrv_SC_featherSstOffset_Ctrl( const XC_OpFrameStates opFrameStatusCur, const MS_BOOL isMcFilmSlowMotion, const MS_BOOL favorStill )
4355 {
4356 static MS_U8 reg_featherSstOffset = FeatherSstOffset_Max;
4357 static XC_OpFrameStates opFrameStatusLast;
4358 static MS_U8 frameCnt = 0;
4359
4360 if( opFrameStatusCur.curOpFrame != opFrameStatusLast.curOpFrame )
4361 {
4362 if( frameCnt < 16 )
4363 frameCnt++;
4364 else
4365 frameCnt = 0;
4366 }
4367
4368 if( isMcFilmSlowMotion )
4369 {
4370 if( reg_featherSstOffset > FeatherSstOffset_Min )
4371 reg_featherSstOffset--;
4372 }
4373 else if( favorStill )
4374 {
4375 if( frameCnt == 15 )
4376 {
4377 if( reg_featherSstOffset < 0x0F/* max of offset value */ )
4378 reg_featherSstOffset++;
4379 }
4380 }
4381 else
4382 {
4383 if( reg_featherSstOffset < FeatherSstOffset_Max )
4384 reg_featherSstOffset++;
4385 else if( reg_featherSstOffset > FeatherSstOffset_Max )
4386 reg_featherSstOffset--;
4387 }
4388
4389 //PRT_TRP("==reg_featherSstOffset=%x\n",reg_featherSstOffset);
4390
4391 opFrameStatusLast.curOpFrame = opFrameStatusCur.curOpFrame;
4392
4393 //Dummy to control write value, add by Bella 20150708
4394 if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x0F00)!=0x0000)
4395 {
4396 MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x0F00);
4397 }
4398 else
4399 {
4400 MApi_XC_W2BYTEMSK(REG_SC_BK2A_29_L, (MS_U16)(reg_featherSstOffset << 8 ), 0x0F00);
4401 }
4402 }
4403
MDrv_SC_NR_CheckMotionBigChange(const MS_BOOL isHDSrc,MS_BOOL * motionBigChange,MS_BOOL * motionBigChange2)4404 void MDrv_SC_NR_CheckMotionBigChange( const MS_BOOL isHDSrc, MS_BOOL *motionBigChange, MS_BOOL *motionBigChange2 )
4405 {
4406 static MS_U16 motionValuePrv;
4407 MS_U16 motionValue = 0;
4408
4409 motionValue = MApi_XC_R2BYTEMSK(REG_SC_BK0A_2E_L, 0xFFFF);
4410
4411 *motionBigChange = false;
4412 *motionBigChange2 = false;
4413 if ( motionValue != motionValuePrv )
4414 {
4415 *motionBigChange =
4416 ( motionValue & 0x7fff ) > 0x80 && ( ( motionValue & 0x7fff ) /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4417 ( motionValuePrv & 0x7fff ) > 0x80 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4418
4419 if ( isHDSrc )
4420 *motionBigChange2 =
4421 ( motionValue & 0x7fff ) > 0x800 && ( ( motionValue & 0x7fff ) /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4422 ( motionValuePrv & 0x7fff ) > 0x800 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4423 else
4424 *motionBigChange2 =
4425 ( motionValue & 0x7fff ) > 0x200 && ( ( motionValue & 0x7fff ) /8 > ( motionValuePrv & 0x7fff ) ) ? true :
4426 ( motionValuePrv & 0x7fff ) > 0x200 && ( ( motionValuePrv & 0x7fff ) /8 > ( motionValue & 0x7fff ) ) ? true : false;
4427
4428 }
4429 motionValuePrv = motionValue;
4430 }
4431
4432 #define ME_MovingWeight_Max_SD 0x10
4433 #define ME_MovingWeight_Max_HD 0x10
4434 #define ME_MovingWeight_Max2_SD 0x12
4435 #define ME_MovingWeight_Max2_HD 0x12
4436 #define ME_MovingWeight_Min 0x08
4437
4438 #define MCNR_MOTIONGAIN_MAX2 0xC
4439 #define MCNR_MOTIONGAIN_MAX 0x8
4440 #define MCNR_MOTIONGAIN_MIN 0x7
4441
4442 #define PDNR_MOTIONGAIN_MAX2 0xC
4443 #define PDNR_MOTIONGAIN_MAX 0x8
4444 #define PDNR_MOTIONGAIN_MIN 0x4
4445
MDrv_SC_NR_Driver(const XC_FilmStates filmstatus,const MS_BOOL isHDSrc)4446 void MDrv_SC_NR_Driver( const XC_FilmStates filmstatus, const MS_BOOL isHDSrc )
4447 {
4448 static MS_U8 movingWeight = ME_MovingWeight_Max_SD;
4449 static MS_U8 mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4450 static MS_U8 pdnr_motionGain = 0x8;
4451 static MS_U8 isFilmandMotion = 0;
4452 static MS_U8 stillFrameCnt = 0;
4453
4454 // special patch for HQVSD random noise pattern
4455 static MS_U8 patchHQVSDSlowMotionScenCnt = 0;
4456 MS_U8 me1_X_histogram[8];
4457 MS_U16 mv0featheringCnt = 0;
4458 MS_U16 mvhistogramMV0Cnt = 0;
4459 MS_U16 mvhistogramNonMV0Cnt = 0;
4460 // special patch for sec woman in dark
4461 static MS_U8 patchSecWomanInDarkScnenCnt = 0;
4462 static MS_U8 mcnrUpdateTableLevelCnt = 0x80;
4463 MS_U8 mcnrUpdateTableLevel = 0;
4464 MS_U16 mcnrMoveStep = 0;
4465
4466 MS_U32 me1_mv0blk = 0, me1_nonMv0blk = 0;
4467 MS_U32 me2_mv0blk = 0, me2_nonMv0blk = 0;
4468 MS_BOOL movingBlkMoreThanMV0Blk1 = FALSE;
4469 MS_BOOL movingBlkMoreThanMV0Blk2 = FALSE;
4470 MS_BOOL isStill = FALSE;
4471 MS_BOOL isfilmNotfilm22 = FALSE;
4472
4473 MS_BOOL motionBigChange = FALSE, motionBigChange2 = FALSE;
4474 MDrv_SC_NR_CheckMotionBigChange( isHDSrc, &motionBigChange, &motionBigChange2 );
4475
4476 // read status
4477 me1_mv0blk = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
4478 me1_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
4479 me2_mv0blk = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
4480 me2_nonMv0blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
4481
4482 movingBlkMoreThanMV0Blk1 =
4483 isHDSrc ? ( ( me2_nonMv0blk == 0XFFF ) || ( ( me2_nonMv0blk > 0x1000 ) && ( me2_nonMv0blk > me1_mv0blk*2 ) ) ):
4484 ( ( me1_nonMv0blk > 0x40 ) && ( me1_nonMv0blk > me1_mv0blk/2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me1_mv0blk/2 ) );
4485
4486 movingBlkMoreThanMV0Blk2 =
4487 isHDSrc ? ( ( me1_nonMv0blk > 0x10 ) && ( me1_nonMv0blk > me1_mv0blk*2 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk*2 ) ) :
4488 ( ( me1_nonMv0blk > 0x10 ) && ( me1_nonMv0blk > me1_mv0blk/8 ) ) || ( ( me2_nonMv0blk > 0x100 ) && ( me2_nonMv0blk > me2_mv0blk/4 ) );
4489
4490 isStill = ( ( me1_mv0blk > 0x40 ) && ( me1_mv0blk > me1_nonMv0blk/8 ) ) ||
4491 ( ( me1_mv0blk > 0x4 ) && ( me1_nonMv0blk == 0 ) && ( me2_nonMv0blk < 0x40 ) ); // patch for sony tree
4492
4493 // special patch for HQVSD random noise pattern
4494 me1_X_histogram[0] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF);
4495 me1_X_histogram[1] = MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8;
4496 me1_X_histogram[2] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF);
4497 me1_X_histogram[3] = MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8;
4498 me1_X_histogram[4] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF);
4499 me1_X_histogram[5] = MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8;
4500 me1_X_histogram[6] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF);
4501 me1_X_histogram[7] = MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8;
4502
4503 mv0featheringCnt = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4504 mvhistogramMV0Cnt = MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF);
4505 mvhistogramNonMV0Cnt = me1_X_histogram[0] + me1_X_histogram[1] + me1_X_histogram[2] + me1_X_histogram[3] +
4506 me1_X_histogram[4] + me1_X_histogram[5] + me1_X_histogram[6] + me1_X_histogram[7];
4507
4508 if ( motionBigChange || motionBigChange2 )
4509 patchHQVSDSlowMotionScenCnt = 0;
4510 else if ( mv0featheringCnt == 0 && // mv0 feathering count
4511 me2_mv0blk > 0x140 && me2_nonMv0blk < 0xC0 &&
4512 mvhistogramNonMV0Cnt < 8 &&
4513 mvhistogramMV0Cnt < 0x20 )
4514 {
4515 if ( patchHQVSDSlowMotionScenCnt <= 0xf0 )
4516 patchHQVSDSlowMotionScenCnt ++;
4517 }
4518 else
4519 {
4520 if ( patchHQVSDSlowMotionScenCnt > 0x10 )
4521 patchHQVSDSlowMotionScenCnt -= 0x10;
4522 else
4523 patchHQVSDSlowMotionScenCnt = 0;
4524 }
4525
4526 // special patch for sec woman in dark
4527 // 1. when in dark scene
4528 if ( mv0featheringCnt ==0 && // mv0 feathering count
4529 me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x25 &&
4530 mvhistogramNonMV0Cnt < 4 && mvhistogramMV0Cnt < 8 )
4531 {
4532 if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4533 patchSecWomanInDarkScnenCnt ++;
4534 }
4535 else if (
4536 me2_nonMv0blk > me2_mv0blk/4 && me2_nonMv0blk > 0x30 &&
4537 mvhistogramNonMV0Cnt < 8 && mvhistogramMV0Cnt < 0x20 )
4538 {
4539 if ( patchSecWomanInDarkScnenCnt < 0xf0 )
4540 patchSecWomanInDarkScnenCnt ++;
4541 }
4542 else
4543 {
4544 if ( patchSecWomanInDarkScnenCnt > 0x10 )
4545 patchSecWomanInDarkScnenCnt -= 0x10;
4546 else
4547 patchSecWomanInDarkScnenCnt = 0;
4548 }
4549
4550
4551 mcnrMoveStep = 4; //(MApi_XC_R2BYTE(REG_SC_BK30_08_L)) >> 8;
4552 if ( isHDSrc || motionBigChange || motionBigChange2 )
4553 {
4554 mcnrUpdateTableLevelCnt = 0x80;
4555 }
4556 else if ( patchHQVSDSlowMotionScenCnt >= 0x10 )
4557 {
4558 if ( mcnrUpdateTableLevelCnt < 0xF0 )
4559 mcnrUpdateTableLevelCnt += mcnrMoveStep;
4560 }
4561 else if ( patchSecWomanInDarkScnenCnt >= 0x10 )
4562 {
4563 if ( mcnrUpdateTableLevelCnt > 10 )
4564 mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4565 }
4566 else // go back to 0x80
4567 {
4568 if ( mcnrUpdateTableLevelCnt > 0x80 )
4569 mcnrUpdateTableLevelCnt -= mcnrMoveStep;
4570 else if ( mcnrUpdateTableLevelCnt < 0x80 )
4571 mcnrUpdateTableLevelCnt += mcnrMoveStep;
4572 }
4573 mcnrUpdateTableLevel = mcnrUpdateTableLevelCnt >> 4;
4574
4575 if ( false == isHDSrc )
4576 {
4577 // Reduce PDNR
4578 if ( mcnrUpdateTableLevel <= 2 )
4579 {
4580 MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x4444 );
4581 MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x4444 );
4582 MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x3333 );
4583 MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x3300 );
4584
4585 MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x4444 );
4586 MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x4444 );
4587 MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x3333 );
4588 MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x3300 );
4589
4590 MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x2222 );
4591 MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x1111 );
4592 }
4593 else if ( mcnrUpdateTableLevel <= 6 )
4594 {
4595 MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x6666 );
4596 MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x5555 );
4597 MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x5555 );
4598 MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x4400 );
4599
4600 MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x6666 );
4601 MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x5555 );
4602 MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x5555 );
4603 MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x4400 );
4604
4605 MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x3333 );
4606 MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x2211 );
4607 }
4608 else //if ( mcnrUpdateTableLevel <= 10 ) // 6 ~ 10 default
4609 {
4610 MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, 0x8888 );
4611 MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, 0x7777 );
4612 MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, 0x6666 );
4613 MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, 0x6600 );
4614
4615 MApi_XC_W2BYTE(REG_SC_BK2A_24_L, 0x8888 );
4616 MApi_XC_W2BYTE(REG_SC_BK2A_25_L, 0x7777 );
4617 MApi_XC_W2BYTE(REG_SC_BK2A_26_L, 0x6666 );
4618 MApi_XC_W2BYTE(REG_SC_BK2A_27_L, 0x6600 );
4619
4620 MApi_XC_W2BYTE(REG_SC_BK2A_20_L, 0x4444 );
4621 MApi_XC_W2BYTE(REG_SC_BK2A_21_L, 0x4432 );
4622 }
4623
4624 // Increase Chroma NR
4625 if ( mcnrUpdateTableLevel >= 0xC )
4626 {
4627 MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xCCCC );
4628 MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xCCCC );
4629 MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xCCBA );
4630 MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x8640 );
4631 }
4632 else if ( mcnrUpdateTableLevel >= 0xA )
4633 {
4634 MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0xAAAA );
4635 MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0xAAAA );
4636 MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0xA865 );
4637 MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x4320 );
4638 }
4639 else //default
4640 {
4641 MApi_XC_W2BYTE(REG_SC_BK2A_30_L, 0x8888 );
4642 MApi_XC_W2BYTE(REG_SC_BK2A_31_L, 0x7766 );
4643 MApi_XC_W2BYTE(REG_SC_BK2A_32_L, 0x5432 );
4644 MApi_XC_W2BYTE(REG_SC_BK2A_33_L, 0x0000 );
4645 }
4646 }
4647
4648 isfilmNotfilm22 = ( filmstatus.filmany || filmstatus.film32 ); // keep film22 as same NR strength
4649 if ( isfilmNotfilm22 )
4650 {
4651 if ( movingBlkMoreThanMV0Blk2 )
4652 isFilmandMotion = 0x10;
4653 else if ( isFilmandMotion != 0 )
4654 isFilmandMotion --;
4655 }
4656 else
4657 isFilmandMotion = 0;
4658
4659 // patch of increase or reduce MV0moving weight
4660 if ( movingBlkMoreThanMV0Blk1 /*|| motionBigChange2*/ )
4661 movingWeight = ME_MovingWeight_Min;
4662 else if( movingBlkMoreThanMV0Blk2 )
4663 {
4664 if( movingWeight > ME_MovingWeight_Min )
4665 movingWeight--;
4666 else
4667 movingWeight = ME_MovingWeight_Min;
4668 }
4669 else if ( isStill || mcnrUpdateTableLevel >= 0xA )
4670 {
4671 if ( isHDSrc )
4672 {
4673 if( movingWeight < ME_MovingWeight_Max2_HD )
4674 movingWeight++;
4675 else
4676 movingWeight = ME_MovingWeight_Max2_HD;
4677 }
4678 else
4679 {
4680 if( movingWeight < ME_MovingWeight_Max2_SD )
4681 movingWeight++;
4682 else
4683 movingWeight = ME_MovingWeight_Max2_SD;
4684 }
4685 }
4686 else
4687 {
4688 if ( isHDSrc )
4689 {
4690 if( movingWeight < ME_MovingWeight_Max_HD )
4691 movingWeight++;
4692 else
4693 movingWeight = ME_MovingWeight_Max_HD;
4694 }
4695 else
4696 {
4697 if( movingWeight < ME_MovingWeight_Max_SD )
4698 movingWeight++;
4699 else
4700 movingWeight = ME_MovingWeight_Max_SD;
4701 }
4702 }
4703
4704 MApi_XC_W2BYTEMSK(REG_SC_BK17_19_L, ( movingWeight<<8 ) | movingWeight, 0x1F1F);
4705
4706 // 2. patch mcnr/pdnr motion gain
4707 if ( motionBigChange2 ) // for scene change or film mode moving
4708 {
4709 mcnr_motionGain = MCNR_MOTIONGAIN_MAX2;
4710 }
4711 else if ( motionBigChange ) // reduce MCNR when mv is changing...
4712 {
4713 if( mcnr_motionGain < MCNR_MOTIONGAIN_MAX )
4714 mcnr_motionGain ++;
4715 //else
4716 // mcnr_motionGain = MCNR_MOTIONGAIN_MAX;
4717 }
4718 else //PDNR default park at min
4719 {
4720 if( mcnr_motionGain > MCNR_MOTIONGAIN_MIN )
4721 mcnr_motionGain --;
4722 else
4723 mcnr_motionGain = MCNR_MOTIONGAIN_MIN;
4724 }
4725
4726 // reduce PDNR when bigChange, film & motion
4727 if ( motionBigChange2 )
4728 {
4729 pdnr_motionGain = PDNR_MOTIONGAIN_MAX2;
4730 }
4731 else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion || mcnrUpdateTableLevel <= 0x4 )
4732 {
4733 if( pdnr_motionGain < PDNR_MOTIONGAIN_MAX )
4734 pdnr_motionGain ++;
4735 else
4736 pdnr_motionGain = PDNR_MOTIONGAIN_MAX;
4737 }
4738 else if ( isStill || mcnrUpdateTableLevel >= 0xA ) // for sony temple tree, only reduce NR when isStill
4739 {
4740 if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4741 pdnr_motionGain --;
4742 else
4743 pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4744 }
4745 else
4746 {
4747 if( pdnr_motionGain > PDNR_MOTIONGAIN_MIN )
4748 pdnr_motionGain --;
4749 else
4750 pdnr_motionGain = PDNR_MOTIONGAIN_MIN;
4751 }
4752
4753 MApi_XC_W2BYTEMSK(REG_SC_BK2A_10_L, mcnr_motionGain<<8, 0x0F00);
4754 MApi_XC_W2BYTEMSK(REG_SC_BK2A_15_L, (pdnr_motionGain<<4) | pdnr_motionGain, 0x00FF);
4755
4756
4757 // Adjust NR table... strong NR table can reduce Noise
4758 if ( isStill )
4759 {
4760 if ( stillFrameCnt < 0x80 )
4761 stillFrameCnt ++;
4762 }
4763 else if ( motionBigChange || movingBlkMoreThanMV0Blk2 || isFilmandMotion )
4764 {
4765 stillFrameCnt = 0;
4766 }
4767
4768 }
4769
4770
MDrv_SC_MCDi_En_Ctrl(const MS_BOOL disable)4771 void MDrv_SC_MCDi_En_Ctrl( const MS_BOOL disable )
4772 {
4773 if( disable )
4774 {
4775 MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0000, 0x0080); // disable MCDi
4776 MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, 0x0000, 0x0002); // disable MCDi_KFC
4777 MApi_XC_W2BYTEMSK(REG_SC_BK22_10_L, 0x0080, 0x0080); // ensable MADi_DFK
4778 //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0080, 0x0080); // Enable MADi_SST
4779 }
4780 else
4781 {
4782 MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, 0x0080, 0x0080);// enable MCDi
4783 MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, 0x0002, 0x0002); // disable MCDi_KFC
4784 MApi_XC_W2BYTEMSK(REG_SC_BK22_10_L, 0x0000, 0x0080); // disable MADi_DFK
4785 //MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, 0x0000, 0x0080); // disable MADi_SST
4786 }
4787 }
4788
MDrv_SC_SST_Ctrl(const MS_BOOL disable,const MS_U32 FeatherSum,const MS_BOOL isHDSrc)4789 void MDrv_SC_SST_Ctrl( const MS_BOOL disable, const MS_U32 FeatherSum, const MS_BOOL isHDSrc )
4790 {
4791 static MS_BOOL reg_sst_en = true;
4792 MS_U32 mv0_feather;
4793 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4794 if( disable ||((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc)&&(SZ_PATTERN_ENABLE ==1))) //Add feathersum for TSB#3 capter4 white noise
4795 {
4796 reg_sst_en = false;
4797 }
4798 else
4799 {
4800 reg_sst_en = true;
4801 }
4802
4803 MApi_XC_W2BYTEMSK(REG_SC_BK2A_04_L, (MS_U16)(reg_sst_en << 8), 0x0100);
4804
4805 }
4806
checkHQVMovingBarPatch(const MS_U8 colorSum)4807 MS_BOOL checkHQVMovingBarPatch( const MS_U8 colorSum ) // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4808 {
4809 MS_BOOL isHQVMovingBarPattern = false;
4810
4811 if ( // BK17
4812 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0x00FF) ) < 0x4 &&
4813 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_60_L, 0xFF00) >> 8 ) < 0x4 &&
4814 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0x00FF) ) < 0x4 &&
4815 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_61_L, 0xFF00) >> 8 ) < 0x4 &&
4816 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0x00FF) ) < 0x4 &&
4817 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_62_L, 0xFF00) >> 8 ) < 0x4 &&
4818 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0x00FF) ) < 0x4 &&
4819 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_63_L, 0xFF00) >> 8 ) < 0x4 &&
4820 ( MApi_XC_R2BYTEMSK(REG_SC_BK17_5F_L, 0x00FF) ) > 0x40 &&
4821 // BK2A
4822 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF) ) > 0xB00 &&
4823 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7B_L, 0xFFFF) ) < 0x50 &&
4824 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_7F_L, 0xFFFF) ) < 0x40 &&
4825 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_74_L, 0xFFFF) ) < 0x100 &&
4826 ( MApi_XC_R2BYTEMSK(REG_SC_BK2A_77_L, 0xFFFF) ) < 0x100 &&
4827 colorSum == 0 )
4828 isHQVMovingBarPattern = true;
4829 return isHQVMovingBarPattern;
4830 }
4831
4832 #define UCDi_OP1_HisWeight_MaxValue 0x0E // history weight = 6
4833 #define UCDi_OP1_HisWeight_MinValue 0x04 // history weight = 2
MDrv_SC_UCDi_OP1_HisWeight_Ctrl(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)4834 void MDrv_SC_UCDi_OP1_HisWeight_Ctrl(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)
4835 {
4836 static MS_U32 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4837 static MS_U32 mv0_feather_prv = 0x0000;
4838 MS_U32 mv0_feather;
4839 MS_U8 u8MotionValue;
4840
4841 u8MotionValue = MApi_XC_R2BYTE(REG_SC_BK0A_1A_L)& 0x007F;
4842
4843 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
4844 //Add iir filter
4845 mv0_feather = (mv0_feather_prv*3 + mv0_feather)/4;
4846 mv0_feather_prv = mv0_feather;
4847
4848 if((u8MotionValue<0x0A) && (SZ_PATTERN_ENABLE ==1))//Add for AV patterns, titles are shaking issue
4849 {
4850 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4851 //printf("u8MotionValue = %d, SZ_PATTERN_ENABLE = %d\n\n",u8MotionValue, SZ_PATTERN_ENABLE);
4852 }
4853 else if(((FeatherSum > 0x1200)&&(mv0_feather>0x1100)&&(!isHDSrc))&& (SZ_PATTERN_ENABLE ==1)) //Add feathersum for TSB#3 capter4 white noise
4854 {
4855 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4856 MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0000, 0x0002);
4857 //printf("FeatherSum = %d, mv0_feather = %d\n\n",(int)FeatherSum, (int)mv0_feather);
4858 }
4859 else if( Bouncing_status || Feather_sum_status )
4860 {
4861 reg_uc_his_weight = UCDi_OP1_HisWeight_MinValue;
4862 MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4863 //printf("Bouncing_status = %d, Feather_sum_status = %d\n\n",Bouncing_status, Feather_sum_status);
4864 }
4865 #if SEC_HQV_PATTERN
4866 else if ( checkHQVMovingBarPatch( colorSum ) ) // special patch for SEC : HQV 2.0 moving white bar, need to reduce history weight
4867 {
4868 if( reg_uc_his_weight > 0x8 )
4869 reg_uc_his_weight--;
4870 MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4871 //printf("reg_uc_his_weight = %d\n\n",(int)reg_uc_his_weight);
4872 }
4873 #endif
4874 else
4875 {
4876 MApi_XC_W2BYTEMSK(REG_SC_BK2A_50_L, 0x0002, 0x0002);
4877 if( reg_uc_his_weight < UCDi_OP1_HisWeight_MaxValue )
4878 reg_uc_his_weight++;
4879 else
4880 reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4881 //printf("else reg_uc_his_weight= %d\n\n",(int)reg_uc_his_weight);
4882 }
4883
4884 if(filmstatus.film_act)
4885 {
4886 reg_uc_his_weight = UCDi_OP1_HisWeight_MaxValue;
4887 }
4888
4889 //Dummy to control write value, add by Bella 20150708
4890 if((MApi_XC_R2BYTE(REG_SC_BK23_5C_L)&0x000E)!=0x0000)
4891 {
4892 MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, MApi_XC_R2BYTE(REG_SC_BK23_5C_L), 0x000E);
4893 }
4894 else
4895 {
4896 MApi_XC_W2BYTEMSK(REG_SC_BK2A_02_L, reg_uc_his_weight, 0x000E);
4897 }
4898
4899 }
4900
4901 #define SPF_OP1_HisWeight_MaxValue 0x06 // history weight = 6
4902 #define SPF_OP1_HisWeight_MinValue 0x02 // history weight = 2
MDrv_SC_SPF_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status)4903 void MDrv_SC_SPF_OP1_HisWeight_Ctrl(const MS_BOOL Bouncing_status)
4904 {
4905 static MS_U32 reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4906
4907 if( Bouncing_status )
4908 {
4909 reg_uc_his_weight = SPF_OP1_HisWeight_MinValue;
4910 #ifdef DBG_HISW8T_LC
4911 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0007, 0x000F );
4912 #endif
4913 }
4914 else
4915 {
4916 if( reg_uc_his_weight < SPF_OP1_HisWeight_MaxValue )
4917 reg_uc_his_weight++;
4918 else
4919 reg_uc_his_weight = SPF_OP1_HisWeight_MaxValue;
4920 #ifdef DBG_HISW8T_LC
4921 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, 0x0000, 0x000F );
4922 #endif
4923 }
4924
4925 MApi_XC_W2BYTEMSK(REG_SC_BK09_5C_L, reg_uc_his_weight, 0x0007);
4926
4927 }
4928
4929 //
4930 // MV0 comfirm for such as like "Piano Bar" motionless pattern
4931 //
4932 #define KFCnonHistoryMotionDivideMode_MaxValue 0x02
4933 #define KFCnonHistoryMotionDivideMode_MinValue 0x01
4934
MDrv_SC_KFC_EODiW_Motionless(void)4935 void MDrv_SC_KFC_EODiW_Motionless(void)
4936 {
4937 MS_U32 mv0Comfirm = 0, nonMV0Comfirm = 0, mvNotFound = 0, luma = 0;
4938 static MS_U32 prevMV0Comfirm = 0;
4939 static MS_U32 prevNonMV0Comfirm = 0;
4940 static MS_U32 prevMvNotFound = 0;
4941 static MS_U32 prevLuma = 0;
4942 static MS_U32 prevComfirmValue = 0;
4943 MS_U32 comfirmValue = 0;
4944 static MS_U32 prevComfirmValue2 = 0;
4945 MS_U32 comfirmValue2 =0;
4946 static MS_U32 KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4947
4948 mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK09_78_L);
4949 nonMV0Comfirm = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
4950 mvNotFound = MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
4951 luma = MDrv_Read2Byte(REG_FSC_BK55_1A_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1B_L, 0x000F )<<16); //move to UFSC in Maserati
4952
4953 mv0Comfirm = (prevMV0Comfirm * 3 + mv0Comfirm) >> 2;
4954 prevMV0Comfirm = mv0Comfirm;
4955
4956 nonMV0Comfirm = (prevNonMV0Comfirm * 3 + nonMV0Comfirm) >> 2;
4957 prevNonMV0Comfirm = nonMV0Comfirm;
4958
4959 mvNotFound = (prevMvNotFound * 3 + mvNotFound) >> 2;
4960 prevMvNotFound = mvNotFound;
4961
4962 luma = (prevLuma * 3 + luma) >> 2;
4963 prevLuma = luma;
4964 // ================================================== //
4965 /* mv0 check !! */
4966 if(mv0Comfirm > (mvNotFound * 20) )
4967 comfirmValue = mv0Comfirm - mvNotFound * 20;
4968 else
4969 comfirmValue = 0;
4970
4971 comfirmValue = (prevComfirmValue * 3 + comfirmValue) >> 2;
4972 prevComfirmValue = comfirmValue;
4973
4974 // ================================================== //
4975 /* Small moving check !! */
4976 if(mv0Comfirm > (nonMV0Comfirm * 1) )
4977 comfirmValue2 = mv0Comfirm - nonMV0Comfirm * 1;
4978 else
4979 comfirmValue2 = 0;
4980
4981 comfirmValue2 = (prevComfirmValue2 * 3 + comfirmValue2) >> 2;
4982 prevComfirmValue2 = comfirmValue2;
4983
4984 // ================================================== //
4985 if( (comfirmValue > 100) && (comfirmValue2 > 100) && (luma < 0x2000) )
4986 {
4987 //KFCnonHistoryMotionDivideMode = 0x00;
4988 if(KFCnonHistoryMotionDivideMode > KFCnonHistoryMotionDivideMode_MinValue)
4989 KFCnonHistoryMotionDivideMode--;
4990 else
4991 KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MinValue;
4992 }
4993 else
4994 {
4995 if(KFCnonHistoryMotionDivideMode < KFCnonHistoryMotionDivideMode_MaxValue)
4996 KFCnonHistoryMotionDivideMode++;
4997 else
4998 KFCnonHistoryMotionDivideMode = KFCnonHistoryMotionDivideMode_MaxValue;
4999 }
5000 /* Main window KFC non-history motion divide mode */
5001 MApi_XC_W2BYTEMSK(REG_SC_BK22_28_L, KFCnonHistoryMotionDivideMode << 4, 0x0030);
5002 }
5003
MDrv_SC_Edison_VectorNR0(const MS_U16 isFeatherAndMotion,const MS_BOOL isMcFilm,const MS_BOOL isLrLetterBox,const MS_U32 uComplex,const MS_U16 mv0Comfirm,const MS_BOOL isMcOutOfSearchRange)5004 void MDrv_SC_Edison_VectorNR0( const MS_U16 isFeatherAndMotion, const MS_BOOL isMcFilm,
5005 const MS_BOOL isLrLetterBox, const MS_U32 uComplex, const MS_U16 mv0Comfirm,
5006 const MS_BOOL isMcOutOfSearchRange )
5007 {
5008 MS_U16 FAM = 0;
5009 static MS_U16 FAM_iir = 0;
5010 static MS_U8 _noFeatherCnt = 0;
5011 MS_BOOL mcnr_vector0 = FALSE;
5012 MS_BOOL isCplx = FALSE;
5013 MS_BOOL isRealMv0 = FALSE;
5014
5015 isRealMv0 = ( mv0Comfirm > 0x20 ) ? true : false;
5016 isCplx = ( uComplex > 0x1500 ) ? true : false;
5017
5018 FAM = isFeatherAndMotion;
5019 FAM = ((FAM_iir*3 )+ FAM ) >> 2;
5020 FAM_iir = FAM;
5021
5022 if( FAM_iir < 5 )
5023 {
5024 if( _noFeatherCnt <= 64)
5025 _noFeatherCnt++;
5026 }
5027 else
5028 {
5029 _noFeatherCnt = 0;
5030 }
5031
5032 mcnr_vector0 = ( _noFeatherCnt > 50 ) ? true : false;
5033
5034 if ( ( mcnr_vector0 && isCplx && isRealMv0 ) || isMcFilm || isLrLetterBox || isMcOutOfSearchRange )
5035 {
5036 MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0002, 0x0002); /*F2 Force MNR interpolation MV enable*/
5037 MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5038 }
5039 else/*disable*/
5040 {
5041 MApi_XC_W2BYTEMSK(REG_SC_BK17_70_L, 0x0000, 0x0002); /*F2 Force MNR interpolation MV enable*/
5042 MApi_XC_W2BYTEMSK(REG_SC_BK17_72_L, 0x0000, 0x3F3F); /*F2 Force MCNR interpolation YMV/XMV */
5043 }
5044 }
5045
5046 #define L139_COLORSUM 0x0A /*CVBS*/
MDrv_SC_Agate_L139(const MS_U32 mvComfirm,const MS_U32 colorSum,const MS_U32 uComplex,const MS_BOOL meStill,const XC_Me1HisStates H2)5047 MS_BOOL MDrv_SC_Agate_L139( 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*/ )
5048 {
5049 MS_BOOL me1IsMv0 = 0;
5050 MS_BOOL isL139 = 0;
5051
5052 if((H2.minMvXdir == 8) && (H2.minMvYdir == 8) &&(H2.minMvXBin > 13) && (H2.minMvYBin > 13))
5053 {
5054 me1IsMv0 = true;
5055 }
5056 else
5057 {
5058 me1IsMv0 = false;
5059 }
5060
5061 if( (mvComfirm > 95) && (colorSum < L139_COLORSUM)&&(uComplex > 3456) && meStill && me1IsMv0 )
5062 {
5063 isL139 = true;
5064 }
5065 else
5066 {
5067 isL139 = false;
5068 }
5069 //printf("isL139== %d \n\n",isL139);
5070 return isL139;
5071 }
5072
MDrv_SC_Agate_L107(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)5073 MS_BOOL MDrv_SC_Agate_L107( 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 )
5074 {
5075 MS_BOOL mvComfirmId = FALSE, colorId = FALSE, cplxId = FALSE, motionId = FALSE, featherId = FALSE;
5076 MS_BOOL notFoundMvId = FALSE, foundMvId = FALSE, foundNonMv0Id = FALSE;
5077 MS_BOOL gMvId = FALSE;
5078 MS_BOOL L107 = FALSE;
5079
5080 MS_U32 notFoundMv = 0;
5081 static MS_U32 notFoundMv_iir = 0;
5082 MS_U32 foundMv0 = 0;
5083 static MS_U32 foundMv0_iir = 0;
5084 MS_U32 foundNonMv0 = 0;
5085 static MS_U32 foundNonMv0_iir = 0;
5086 MS_U32 colorSum = 0;
5087 static MS_U32 colorSum_iir = 0;
5088
5089 foundMv0 = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5090 foundMv0 = ((foundMv0_iir*3 )+ foundMv0 ) >> 2;
5091 foundMv0_iir = foundMv0;
5092
5093 foundNonMv0 = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5094 foundNonMv0 = ((foundNonMv0_iir*3 )+ foundNonMv0 ) >> 2;
5095 foundNonMv0_iir = foundNonMv0;
5096
5097 notFoundMv = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5098 notFoundMv = ((notFoundMv_iir*3 )+ notFoundMv ) >> 2;
5099 notFoundMv_iir = notFoundMv;
5100
5101 colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
5102 colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5103 colorSum_iir = colorSum;
5104
5105 motionId = (u32MotionValue > 0x2C00) ? true : false;
5106 mvComfirmId = ( mvComfirm < 16 ) ? true : false;
5107 if( inputSource == 1 ) /*CVBS*/
5108 colorId = ( (colorSum > 0x2300) && (colorSum < 0x2B00) ) ? true : false;
5109 else if( inputSource == 2 )
5110 colorId = ( (colorSum > 0x1700) && (colorSum < 0x1B00) ) ? true : false;
5111 else
5112 colorId = false;
5113
5114 cplxId = ( (uComplex > 0x200) && (uComplex < 0x600) ) ? true : false;
5115 featherId = ( (total_feather < 0x40) && (total_feather > 0x20) ) ? true : false;
5116
5117 foundMvId =( (foundMv0_iir < 0x90) && (foundMv0_iir > 0x50) ) ? true : false;
5118 foundNonMv0Id =( (foundNonMv0_iir < 0x20) && (foundNonMv0_iir > 0x01) ) ? true : false;
5119 notFoundMvId = ( notFoundMv_iir < 0x2F ) ? true : false;
5120
5121 if( ( gMv.h1XYsum > 10) && ( gMv.h2XYsum > 10)&&( gMv.h1XYdiff < 5)
5122 && ( gMv.h2XYdiff < 5) &&( gMv.minMvXdir == 0x20) && (gMv.minMvYdir == 8))
5123 {
5124 gMvId = true;
5125 }
5126 else
5127 {
5128 gMvId = false;
5129 }
5130
5131 if( mvComfirmId && colorId && cplxId && gMvId && motionId && featherId
5132 &&foundMvId && foundNonMv0Id && notFoundMvId )
5133 {
5134 L107 = true;
5135 }
5136 else
5137 {
5138 L107 = false;
5139 }
5140 //printf("isL107 == %d\n\n",L107);
5141 return L107;
5142 }
5143
MDrv_SC_Agate_L153(const MS_BOOL movingWithoutFeather,const MS_U32 colorSum,const MS_U32 uComplex,const XC_Me1HisStates H2)5144 MS_BOOL MDrv_SC_Agate_L153( const MS_BOOL movingWithoutFeather, const MS_U32 colorSum, const MS_U32 uComplex, const XC_Me1HisStates H2 )
5145 {
5146 MS_BOOL notXmoving = FALSE;
5147 MS_BOOL YmovingNotFocus = FALSE;
5148 MS_BOOL CplxRange = FALSE;
5149 MS_BOOL withoutColor = FALSE;
5150 MS_BOOL L153 = FALSE;
5151
5152 if( colorSum < 5 )
5153 withoutColor = true;
5154 else
5155 withoutColor = false;
5156
5157 if((H2.minMvXdir == 8) && (H2.minMvXBin > 10))
5158 notXmoving = true;
5159 else
5160 notXmoving = false;
5161
5162 if( H2.minMvYBin < 5)
5163 YmovingNotFocus = true;
5164 else
5165 YmovingNotFocus = false;
5166
5167 if(( uComplex > 0x200 ) && ( uComplex < 0x300 ))
5168 CplxRange = true;
5169 else
5170 CplxRange = false;
5171
5172 if(notXmoving && YmovingNotFocus && movingWithoutFeather && withoutColor && CplxRange)
5173 {
5174 L153 = true;
5175 //MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0000, 0x000F);
5176 }
5177 else
5178 {
5179 L153 = false;
5180 //MApi_XC_W2BYTEMSK(REG_SC_BK2A_36_L, 0x0008, 0x000F);
5181 }
5182 //printf("L153 == %d \n\n",L153);
5183 return L153;
5184 }
5185
MDrv_SC_AbihsotArtifactFeatherPattern(const MS_BOOL Feather_sum_status,const MS_BOOL Feather_sum_status2,const MS_U16 me1IsMv0,const MS_U16 me1IsNonMv0)5186 MS_BOOL MDrv_SC_AbihsotArtifactFeatherPattern(const MS_BOOL Feather_sum_status, const MS_BOOL Feather_sum_status2,
5187 const MS_U16 me1IsMv0, const MS_U16 me1IsNonMv0 )
5188 {
5189 static MS_BOOL isAbihsot = false;
5190 static MS_BOOL isStill = false;
5191 static MS_BOOL isStillFeather = false;
5192
5193 isStill = ( me1IsMv0 > me1IsNonMv0*26 ) ? true : false;
5194
5195 isStillFeather = ( isStill && Feather_sum_status2 ) ? true : false;
5196
5197 if( Feather_sum_status || isStillFeather )
5198 {
5199 isAbihsot = true;
5200 }
5201 else
5202 {
5203 isAbihsot = false;
5204 }
5205
5206 return ( isAbihsot );
5207 }
5208
MDrv_SC_SBlueShirt(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)5209 MS_BOOL MDrv_SC_SBlueShirt(const MS_U16 nonMv0Comfirm, const MS_U16 mv0Comfirm, const MS_U16 mvNotFound ,
5210 const MS_U16 mvNotFoundME2, const MS_U32 uComplex, const XC_Me1HisStates H2, const XC_GMvStates gMv )
5211 {
5212 MS_BOOL XmovingNotFocus = FALSE;
5213 MS_BOOL Cplx_Range = FALSE;
5214 MS_BOOL is_SBlueWoman = FALSE,isSBlueShirtWoman = FALSE;
5215
5216 if((gMv.h2XYdiff < 0x10) && (nonMv0Comfirm < 0x55) &&
5217 (mv0Comfirm < 0x40)&& (mvNotFound < 0x100)&& (mvNotFoundME2 > 0x350) )
5218 {
5219 is_SBlueWoman = true;
5220 }
5221 else
5222 {
5223 is_SBlueWoman = false;
5224 }
5225
5226 if( H2.minMvXBin < 0x15)
5227 XmovingNotFocus = true;
5228 else
5229 XmovingNotFocus = false;
5230
5231 if(( uComplex > 2000 ) && ( uComplex < 3000 ))
5232 Cplx_Range = true;
5233 else
5234 Cplx_Range = false;
5235
5236 if(XmovingNotFocus && is_SBlueWoman && Cplx_Range)
5237 {
5238 isSBlueShirtWoman = true;
5239 }
5240 else
5241 {
5242 isSBlueShirtWoman = false;
5243 }
5244
5245 return isSBlueShirtWoman;
5246 }
5247
5248
5249 #define L107_FEATHER_GAIN_MAX 2
5250 #define L107_FEATHER_GAIN_MIN 0
5251 #define L107_CPLX_OFFSET_MAX 6
5252 #define L107_CPLX_OFFSET_MIN 0
5253 #define L107_CPLX_GAIN_MAX 15
5254 #define L107_CPLX_GAIN_MIN 4
MDrv_SC_A5_L107(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)5255 MS_BOOL MDrv_SC_A5_L107(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 )
5256 {
5257 static MS_U32 reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX ;
5258 static MS_U32 reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX ;
5259 static MS_U32 reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN ;
5260 MS_BOOL bL107_en = FALSE;
5261
5262 if((IsVerticalMoving < 20) && (IsHorizontalMoving < 200) && (total_feather < 100)
5263 && (mvComfirm > 200) && (colorSum > 200) && (u32MotionValue > 0x3500) && (uComplex < 0x700))
5264 {
5265 bL107_en = TRUE;
5266
5267 if( reg_mcdi_feather_gain > L107_FEATHER_GAIN_MIN )
5268 reg_mcdi_feather_gain--;
5269 else
5270 reg_mcdi_feather_gain = L107_FEATHER_GAIN_MIN;
5271
5272 if( reg_mcdi_cplx_offset > L107_CPLX_OFFSET_MIN )
5273 reg_mcdi_cplx_offset--;
5274 else
5275 reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MIN;
5276
5277 if( reg_mcdi_cplx_gain < L107_CPLX_GAIN_MAX )
5278 reg_mcdi_cplx_gain++;
5279 else
5280 reg_mcdi_cplx_gain = L107_CPLX_GAIN_MAX;
5281 }
5282 else
5283 {
5284 bL107_en = FALSE;
5285
5286 if( reg_mcdi_feather_gain < L107_FEATHER_GAIN_MAX )
5287 reg_mcdi_feather_gain++;
5288 else
5289 reg_mcdi_feather_gain = L107_FEATHER_GAIN_MAX;
5290
5291 if( reg_mcdi_cplx_offset < L107_CPLX_OFFSET_MAX )
5292 reg_mcdi_cplx_offset++;
5293 else
5294 reg_mcdi_cplx_offset = L107_CPLX_OFFSET_MAX;
5295
5296 if( reg_mcdi_cplx_gain > L107_CPLX_GAIN_MIN )
5297 reg_mcdi_cplx_gain--;
5298 else
5299 reg_mcdi_cplx_gain = L107_CPLX_GAIN_MIN;
5300 }
5301 MApi_XC_W2BYTEMSK(REG_SC_BK2A_2D_L, (MS_U16)reg_mcdi_feather_gain<<12, 0xF000); // 2 to 0
5302 MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_offset<<4, 0x00F0);// 6 to 0
5303 MApi_XC_W2BYTEMSK(REG_SC_BK2A_2E_L, (MS_U16)reg_mcdi_cplx_gain<<8, 0x0F00);// 4 to F
5304
5305 return bL107_en;
5306 }
5307
MDrv_SC_Agate_ComplexSum(void)5308 MS_U32 MDrv_SC_Agate_ComplexSum(void)
5309 {
5310 static MS_U32 IsComplex_iir = 0xFFFF;
5311 MS_U32 IsComplex = 0;
5312
5313 IsComplex = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5314
5315 IsComplex = (IsComplex_iir*3 + IsComplex ) >> 2;
5316 IsComplex_iir = IsComplex;
5317
5318 return IsComplex_iir;
5319 }
5320
MDrv_SC_A5_KFC_IsVerticalMoving(void)5321 MS_U32 MDrv_SC_A5_KFC_IsVerticalMoving( void )
5322 {
5323 MS_U32 u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5324 MS_U32 me_vertical = 0;
5325 static MS_U32 IsVerticalMoving_iir = 0;
5326
5327 u32_mvc = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5328 u32_mvu = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5329 u32_mvd = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5330
5331 if ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd))
5332 {
5333 if( u32_mvu > (u32_mvc+u32_mvd)/2 )
5334 me_vertical = (u32_mvu - (u32_mvc+u32_mvd)/2);
5335 else
5336 me_vertical = 0;
5337 }
5338 else if((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) )
5339 {
5340 if( u32_mvd > (u32_mvc+u32_mvu)/2 )
5341 me_vertical = (u32_mvd - (u32_mvc+u32_mvu)/2);
5342 else
5343 me_vertical = 0;
5344 }
5345 else
5346 {
5347 me_vertical = 0;
5348 }
5349
5350 if( me_vertical > 255 )
5351 me_vertical = 255;
5352
5353 me_vertical = (IsVerticalMoving_iir*3 + me_vertical ) >> 2;
5354 IsVerticalMoving_iir = me_vertical;
5355
5356 _bVerticalMovingForDHD = (((u32_mvu > 0x100) && (u32_mvu > u32_mvd*2) && (u32_mvu > u32_mvc)) //moving up
5357 ||( (u32_mvd > 0x100) && (u32_mvd > u32_mvu*2) && (u32_mvd > u32_mvc)) //moving down
5358 ||( ((u32_mvu + u32_mvd) > 0x100) && ((u32_mvu/8 + u32_mvd/8) > u32_mvc))); // u/d motion is much than mvc
5359
5360 return me_vertical;
5361 }
5362
MDrv_SC_A5_ColorPixelSum(void)5363 MS_U32 MDrv_SC_A5_ColorPixelSum(void)
5364 {
5365 MS_U32 colorSum;
5366 static MS_U32 colorSum_iir = 0;
5367
5368 colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC IN Masrati
5369 colorSum = colorSum / 8;
5370
5371 if( colorSum > 255 )
5372 colorSum = 255;
5373
5374 colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
5375 colorSum_iir = colorSum;
5376
5377 return colorSum_iir;
5378 }
5379
MDrv_SC_Agate_TotalFeather(void)5380 MS_U32 MDrv_SC_Agate_TotalFeather(void)
5381 {
5382 MS_U32 mv0_feather, nonMv0_feather;
5383 MS_U32 total_feather;
5384 static MS_U32 total_feather_iir = 255;
5385
5386 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5387 nonMv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5388
5389 total_feather = ( mv0_feather + nonMv0_feather ) / 4;
5390
5391 if( total_feather > 255 )
5392 total_feather = 255;
5393
5394 total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5395 total_feather_iir = total_feather;
5396
5397 return total_feather_iir;
5398 }
5399
MDrv_SC_TotalFeather_Sum(void)5400 MS_U32 MDrv_SC_TotalFeather_Sum(void)
5401 {
5402 MS_U32 mv0_feather, nonMv0_feather;
5403 MS_U32 total_feather;
5404 static MS_U32 total_feather_iir = 0;
5405
5406 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5407 nonMv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5408
5409 total_feather = mv0_feather + nonMv0_feather;
5410
5411 total_feather = ((total_feather_iir*3 )+ total_feather ) >> 2;
5412 total_feather_iir = total_feather;
5413
5414 return total_feather_iir;
5415 }
5416
5417 #define OOSRF_Gain 4
5418 #define OOSRF_Power 2
MDrv_SC_McInSearchRangeUseFeather(void)5419 MS_U32 MDrv_SC_McInSearchRangeUseFeather( void )
5420 {
5421 MS_U32 before_MC_feather = 0, after_MC_feather = 0;
5422 MS_U32 MC_OOSRF = 0;
5423 static MS_U32 Prev_before_MC_feather = 0;
5424 static MS_U32 Prev_after_MC_feather = 0;
5425
5426 before_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L) ;//mv0_feather
5427 after_MC_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);//nonMv0_feather
5428
5429 before_MC_feather = (Prev_before_MC_feather*3 + before_MC_feather ) >> 2;
5430 Prev_before_MC_feather = before_MC_feather;
5431
5432 after_MC_feather = (Prev_after_MC_feather*3 + after_MC_feather ) >> 2;
5433 Prev_after_MC_feather = after_MC_feather;
5434
5435 if( before_MC_feather > (after_MC_feather*OOSRF_Gain) >> OOSRF_Power )//mv0_feather >> nonMv0_feather: MCDI is correct, therefore in search range
5436 MC_OOSRF = before_MC_feather - ((after_MC_feather*OOSRF_Gain) >> OOSRF_Power) ;
5437 else
5438 MC_OOSRF = 0;
5439
5440 return MC_OOSRF; // "Big": in seach range "Small": out of seach range
5441 }
5442
5443 #define TOTAL_MV_TIME 10
MDrv_SC_Agate_TotalMvComfirm(void)5444 MS_U32 MDrv_SC_Agate_TotalMvComfirm(void)
5445 {
5446 MS_U32 mv0 = 0, nonMv0 = 0, notFound = 0;
5447 MS_U32 total_mv = 0, mvComfirm = 0;
5448 static MS_U32 mvComfirm_iir = 0;
5449
5450 mv0 = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5451 nonMv0 = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5452 notFound = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5453
5454 total_mv = mv0 + nonMv0;
5455
5456 if( total_mv > (notFound*TOTAL_MV_TIME))
5457 mvComfirm = total_mv - notFound*TOTAL_MV_TIME;
5458 else
5459 mvComfirm = 0;
5460
5461 if( mvComfirm > 255 )
5462 mvComfirm = 255;
5463
5464 mvComfirm = ((mvComfirm_iir*3 )+ mvComfirm ) >> 2;
5465 mvComfirm_iir = mvComfirm;
5466
5467 return mvComfirm_iir;
5468 }
5469
MDrv_SC_Agate_ME1_nonMv0Comfirm(void)5470 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm(void)
5471 {
5472 MS_U16 nonmv0Comfirm = 0;
5473 static MS_U16 nonmv0Comfirm_iir = 0;
5474
5475 nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5476
5477 nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5478 nonmv0Comfirm_iir = nonmv0Comfirm;
5479
5480 return nonmv0Comfirm_iir;
5481 }
5482
MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void)5483 MS_U16 MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR(void)
5484 {
5485 MS_U16 nonmv0Comfirm = 0;
5486
5487 nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5488 return nonmv0Comfirm;
5489 }
5490
MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void)5491 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm_noIIR(void)
5492 {
5493 MS_U16 mv0Comfirm = 0;
5494
5495 mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5496 return mv0Comfirm;
5497 }
5498
MDrv_SC_Agate_ME1_mvNotFound(void)5499 MS_U16 MDrv_SC_Agate_ME1_mvNotFound(void)
5500 {
5501 MS_U16 mvNotFound = 0;
5502 static MS_U16 mvNotFound_iir = 0;
5503
5504 mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5505
5506 mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5507 mvNotFound_iir = mvNotFound;
5508
5509 return mvNotFound_iir;
5510 }
5511
5512 #if 0
5513 MS_U16 MDrv_SC_Agate_ME1_mvNotFound_noIIR(void)
5514 {
5515 MS_U16 mvNotFound_noIIR = 0;
5516
5517 mvNotFound_noIIR = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
5518
5519 return mvNotFound_noIIR;
5520 }
5521 #endif
5522
MDrv_SC_Agate_ME1_mv0Comfirm(void)5523 MS_U16 MDrv_SC_Agate_ME1_mv0Comfirm(void)
5524 {
5525 MS_U16 mv0Comfirm = 0;
5526 static MS_U16 mv0Comfirm_iir = 0;
5527
5528 mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5529
5530 mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5531 mv0Comfirm_iir = mv0Comfirm;
5532
5533 return mv0Comfirm_iir;
5534 }
5535
MDrv_SC_Agate_ME2_nonMv0Comfirm(void)5536 MS_U16 MDrv_SC_Agate_ME2_nonMv0Comfirm(void)
5537 {
5538 MS_U16 nonmv0Comfirm = 0;
5539 static MS_U16 nonmv0Comfirm_iir = 0;
5540
5541 nonmv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
5542
5543 nonmv0Comfirm = ((nonmv0Comfirm_iir*3 )+ nonmv0Comfirm ) >> 2;
5544 nonmv0Comfirm_iir = nonmv0Comfirm;
5545
5546 return nonmv0Comfirm_iir;
5547 }
5548
MDrv_SC_Agate_ME2_mv0Comfirm(void)5549 MS_U16 MDrv_SC_Agate_ME2_mv0Comfirm(void)
5550 {
5551 MS_U16 mv0Comfirm = 0;
5552 static MS_U16 mv0Comfirm_iir = 0;
5553
5554 mv0Comfirm = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
5555
5556 mv0Comfirm = ((mv0Comfirm_iir*3 )+ mv0Comfirm ) >> 2;
5557 mv0Comfirm_iir = mv0Comfirm;
5558
5559 return mv0Comfirm_iir;
5560 }
5561
MDrv_SC_Agate_ME2_mvNotFound(void)5562 MS_U16 MDrv_SC_Agate_ME2_mvNotFound(void)
5563 {
5564 MS_U16 mvNotFound = 0;
5565 static MS_U16 mvNotFound_iir = 0;
5566
5567 mvNotFound = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
5568
5569 mvNotFound = ((mvNotFound_iir*3 )+ mvNotFound ) >> 2;
5570 mvNotFound_iir = mvNotFound;
5571
5572 return mvNotFound_iir;
5573 }
5574
MDrv_SC_McOutOfSearchRange(const MS_U16 mvNotFound,const MS_U16 mv0Comfirm,const MS_U16 nonMv0Comfirm,const MS_U16 isFeatherAndMotion,const XC_GMvStates gMv)5575 MS_BOOL MDrv_SC_McOutOfSearchRange( const MS_U16 mvNotFound, const MS_U16 mv0Comfirm, const MS_U16 nonMv0Comfirm, const MS_U16 isFeatherAndMotion, const XC_GMvStates gMv )
5576 {
5577
5578 MS_BOOL isBigGmvDiff = (( abs(32 - gMv.minMvXdir) > 15 ) || ( abs(8 - gMv.minMvYdir) > 4 ) ) ? true : false;
5579 MS_BOOL isOutOfSearchRange = 0;
5580 static MS_U8 isCnt = 0;
5581
5582 int notFound = (int)mvNotFound;
5583 int mv0 = (int) mv0Comfirm;
5584 int nonmv0 = (int) nonMv0Comfirm;
5585
5586 /* where are nonMv0Comfirm ??? >_< */
5587 isOutOfSearchRange = ( (notFound > ((mv0+nonmv0)*8)) && ( (notFound) > 0x80 ) ) ? true : false;
5588
5589 if( isOutOfSearchRange && (isFeatherAndMotion > 5) && isBigGmvDiff )
5590 {
5591 if( isCnt < 255 )
5592 isCnt++;
5593 }
5594 else
5595 {
5596 if( isCnt > 0 )
5597 isCnt--;
5598 }
5599
5600 return ( isCnt > 15 ) ? true : false;
5601 }
5602
5603 /*Added for VG846 Sparse Pattern to avoid forcing MCDi function */
MDrv_SC_ukoSabihS_SparsePattern(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)5604 MS_BOOL MDrv_SC_ukoSabihS_SparsePattern( 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 )
5605 {
5606
5607 MS_BOOL isSparse = 0;
5608
5609 int notFound = (int)mvNotFound;
5610 int notFoundME2 = (int)mvNotFoundME2;
5611 int MVConfirm = (int) mv0Comfirm;
5612 int MVConfirmME2 = (int) mv0ComfirmME2;
5613 int nonmv0 = (int) nonMv0Comfirm;
5614 int nonmv0ME2 = (int) nonMv0ComfirmME2;
5615 int notFoundTH = 0;
5616 int notFoundME2TH = 0;
5617
5618 /*if(isHDSrc)
5619 {
5620 isSparse = ( notFound > 0x200 ) && ( notFoundME2 > 0xF00 ) ? true : false;
5621 }
5622 else
5623 {
5624 isSparse = ( notFound > 0x40 ) && ( notFoundME2 > 0x800 ) ? true : false;
5625 }*/
5626
5627 if(isHDSrc)
5628 {
5629 notFoundTH = (0x200* normalize_factor)/256;
5630 notFoundME2TH = (0xF00* normalize_factor)/256;
5631 }
5632 else
5633 {
5634 notFoundTH = (0x40* normalize_factor)/256;
5635 notFoundME2TH = (0x800* normalize_factor)/256;
5636 }
5637 isSparse = ( notFound > notFoundTH ) && ( notFoundME2 > notFoundME2TH ) ? true : false;
5638
5639 if (isSparse && (notFound >(MVConfirm+nonmv0))&& (notFoundME2 >(MVConfirmME2+nonmv0ME2)))
5640 {
5641 return true;
5642 }
5643 else
5644 {
5645 return false;
5646 }
5647
5648 }
5649
5650
MDrv_SC_Agate_FeatherAndMotion(void)5651 MS_U16 MDrv_SC_Agate_FeatherAndMotion(void)
5652 {
5653 MS_U16 FAM = 0;
5654 FAM = MApi_XC_R2BYTE(REG_SC_BK2A_7F_L); //feather and motion pixels
5655 return FAM;
5656 }
5657
MDrv_SC_ukoSabihS_HBurstMoving(const MS_U32 _hpfSdCntReport)5658 MS_BOOL MDrv_SC_ukoSabihS_HBurstMoving( const MS_U32 _hpfSdCntReport )
5659 {
5660 MS_U32 mv0_feather = 0;
5661 MS_BOOL isHBurst_act = FALSE;
5662 static MS_U8 u8HBurstConfirmCnt = 0;
5663
5664 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5665
5666 isHBurst_act = ( ((mv0_feather) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5667
5668 if(isHBurst_act)
5669 {
5670 if(u8HBurstConfirmCnt <= 0x20)
5671 {
5672 u8HBurstConfirmCnt++;
5673 }
5674 }
5675 else
5676 {
5677 u8HBurstConfirmCnt = 0;
5678 }
5679
5680 if(u8HBurstConfirmCnt > 10)
5681 {
5682 return true;
5683 }
5684 else
5685 {
5686 return false;
5687 }
5688 }
5689
MDrv_SC_ukoSabihS_ArtifactPattern(const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc)5690 MS_BOOL MDrv_SC_ukoSabihS_ArtifactPattern( const MS_U32 _hpfHdTolerantReport,const MS_BOOL isHDSrc )
5691 {
5692 MS_BOOL isArtifactPattern_act = 0;
5693 static MS_U8 u8ArtifactPatternConfirmCnt = 0;
5694
5695 if(isHDSrc)
5696 {
5697 isArtifactPattern_act = ( _hpfHdTolerantReport > 0x18000 ) ? true : false;
5698 }
5699 else
5700 {
5701 isArtifactPattern_act = ( _hpfHdTolerantReport > 0x4000 ) ? true : false;
5702 }
5703
5704 if(isArtifactPattern_act)
5705 {
5706 if(u8ArtifactPatternConfirmCnt < 20)
5707 {
5708 u8ArtifactPatternConfirmCnt++;
5709 }
5710 }
5711 else
5712 {
5713 if(u8ArtifactPatternConfirmCnt > 0)
5714 {
5715 u8ArtifactPatternConfirmCnt--;
5716 }
5717 }
5718
5719 if(u8ArtifactPatternConfirmCnt > 10)
5720 {
5721 return true;
5722 }
5723 else
5724 {
5725 return false;
5726 }
5727
5728 //return isHBurstMoving;
5729 }
5730
MDrv_SC_ukoSabihS_noLumaCplx(void)5731 MS_BOOL MDrv_SC_ukoSabihS_noLumaCplx( void )
5732 {
5733 MS_U8 reg_main_max_pixel_sat = 0;
5734 MS_U8 reg_main_min_pixel_sat = 0;
5735
5736 MS_U16 reg_feather_and_motion_pixel = 0;
5737
5738 static MS_U8 confirmCnt = 0;
5739
5740 reg_main_max_pixel_sat = (MS_U8)( MDrv_Read2Byte(REG_FSC_BK1A_61_L) & 0x00FF ); //Move to UFSC in Maserati
5741 reg_main_min_pixel_sat = (MS_U8)( MDrv_Read2Byte(REG_FSC_BK1A_61_L) & 0xFF00 ) >> 8; //Move to UFSC in Maserati
5742 reg_feather_and_motion_pixel = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5743
5744 if( ( reg_main_min_pixel_sat == 0 ) &&
5745 ( reg_main_max_pixel_sat == 0 ) &&
5746 ( reg_feather_and_motion_pixel > 0x5000 ) )
5747 {
5748 if( confirmCnt < 30 )
5749 confirmCnt++;
5750 }
5751 else
5752 confirmCnt = 0;
5753
5754 return ( confirmCnt > 20 );
5755 }
5756
MDrv_SC_ukoSabihS_HBurst(const MS_U32 _hpfSdCntReport,const MS_U32 uComplex)5757 MS_BOOL MDrv_SC_ukoSabihS_HBurst( const MS_U32 _hpfSdCntReport, const MS_U32 uComplex )
5758 {
5759 MS_BOOL isHBurst = FALSE;
5760
5761 isHBurst = ( ((uComplex) > (_hpfSdCntReport*100)) && ( _hpfSdCntReport < 0x10 ) ) ? true : false;
5762
5763 return isHBurst;
5764 }
5765
MDrv_SC_Agate_ME1Still(void)5766 MS_BOOL MDrv_SC_Agate_ME1Still(void)
5767 {
5768 MS_U32 mv0 = 0, nonMv0 = 0;
5769 MS_BOOL isStill = FALSE;
5770
5771 static MS_U32 mv0_iir = 0;
5772 static MS_U32 nonMv0_iir = 0;
5773
5774 mv0 = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
5775 nonMv0 = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
5776
5777 if( mv0_iir > (nonMv0_iir*6) )
5778 isStill = true;
5779 else
5780 isStill = false;
5781
5782 mv0 = ((mv0_iir*3 )+ mv0 ) >> 2;
5783 mv0_iir = mv0;
5784
5785 nonMv0 = ((nonMv0_iir*3 )+ nonMv0 ) >> 2;
5786 nonMv0_iir = nonMv0;
5787
5788 return isStill;
5789 }
5790
MDrv_SC_Agate_MovingWithoutFeather(void)5791 MS_BOOL MDrv_SC_Agate_MovingWithoutFeather(void)
5792 {
5793 MS_U32 mv0_feather = 0, nonMv0_feather = 0;
5794 MS_BOOL isMovingWithoutFeather = FALSE;
5795
5796 static MS_U32 mv0_feather_iir = 0;
5797 static MS_U32 nonMv0_feather_iir = 0;
5798
5799 mv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_77_L);
5800 nonMv0_feather = MApi_XC_R2BYTE(REG_SC_BK2A_7B_L);
5801
5802 if( mv0_feather_iir > (nonMv0_feather_iir*60) )
5803 isMovingWithoutFeather = true;
5804 else
5805 isMovingWithoutFeather = false;
5806
5807 mv0_feather = ((mv0_feather_iir*3 )+ mv0_feather ) >> 2;
5808 mv0_feather_iir = mv0_feather;
5809
5810 nonMv0_feather = ((nonMv0_feather_iir*3 )+ nonMv0_feather ) >> 2;
5811 nonMv0_feather_iir = nonMv0_feather;
5812
5813 return isMovingWithoutFeather;
5814 }
5815
5816 /******************************************************************************/
5817 ///Extend MCNR Driver
5818 /******************************************************************************/
MDrv_SC_Extend_UCNR_driver(void)5819 void MDrv_SC_Extend_UCNR_driver(void)
5820 {
5821 MS_U32 u32_is_mv0 = 0, u32_non_mv0 = 0, u32_mvNotFound = 0, u32_mvc = 0, u32_mvu = 0, u32_mvd = 0;
5822 MS_BOOL me_not_confirm = FALSE, me_vertical = FALSE, still_pattern = FALSE;
5823 static MS_U8 u8notConfirmCnt;
5824 // static MS_U32 last_u32_mvNotFound;
5825
5826 u32_is_mv0 = MApi_XC_R2BYTE(REG_SC_BK2A_78_L);
5827 u32_non_mv0 = MApi_XC_R2BYTE(REG_SC_BK2A_79_L);
5828 u32_mvNotFound = MApi_XC_R2BYTE(REG_SC_BK2A_7A_L);
5829 u32_mvc = MApi_XC_R2BYTE(REG_SC_BK2A_7C_L);
5830 u32_mvu = MApi_XC_R2BYTE(REG_SC_BK2A_7D_L);
5831 u32_mvd = MApi_XC_R2BYTE(REG_SC_BK2A_7E_L);
5832
5833 /////////////////////////////////////////////////////////////////
5834 // NR Patch 1
5835 /////////////////////////////////////////////////////////////////
5836
5837 me_not_confirm = (u32_is_mv0 < 0x0200) && (u32_non_mv0 < 0x0200) ;
5838 me_vertical = ((u32_mvu > u32_mvc) && (u32_mvu > u32_mvd) && (u32_mvu > 0x200))
5839 ||((u32_mvd > u32_mvc) && (u32_mvd > u32_mvu) && (u32_mvd > 0x200));
5840
5841 still_pattern = (u32_is_mv0 < 0x0020) && (u32_non_mv0 < 0x0020) && (u32_mvNotFound < 0x0020);
5842
5843 if(!still_pattern)
5844 {
5845 if(false == me_not_confirm)
5846 {
5847 if(u8notConfirmCnt > 0)
5848 {
5849 u8notConfirmCnt--;
5850 }
5851 }
5852 else
5853 {
5854 if(u8notConfirmCnt <= 0x40)
5855 {
5856 u8notConfirmCnt++;
5857 }
5858 }
5859 }
5860
5861 if ( (u8notConfirmCnt > 0x30)|| me_vertical ) // low nr strength
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 MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0064, 0x00FF); // moving picture, increase random motion
5872 }
5873 else
5874 {
5875 MApi_XC_W2BYTEMSK(REG_SC_BK2A_08_L, (MS_U16)0xAAAA, 0xFFFF);
5876 MApi_XC_W2BYTEMSK(REG_SC_BK2A_09_L, (MS_U16)0xAAAA, 0xFFFF);
5877 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0A_L, (MS_U16)0xAAAA, 0xFFFF);
5878 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0B_L, (MS_U16)0xAAAA, 0xFFFF);
5879 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0C_L, (MS_U16)0xAAAA, 0xFFFF);
5880 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0D_L, (MS_U16)0xAA98, 0xFFFF);
5881 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0E_L, (MS_U16)0x7654, 0xFFFF);
5882 MApi_XC_W2BYTEMSK(REG_SC_BK2A_0F_L, (MS_U16)0x3210, 0xFFFF);
5883 }
5884
5885 if ( (u32_is_mv0 > 0x200) && ((u32_is_mv0/2) > u32_non_mv0) && ((u32_is_mv0/2) > u32_mvNotFound) )
5886 {
5887 MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // still picture, reduce random motion
5888 }
5889 else if(u32_non_mv0 > u32_is_mv0)
5890 {
5891 MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // moving picture, increase random motion
5892 }
5893 else
5894 {
5895 MApi_XC_W2BYTEMSK(REG_SC_BK2A_1B_L, (MS_U16)0x0044, 0x00FF); // default random motion
5896 }
5897
5898 //last_u32_mvNotFound = u32_mvNotFound;
5899 }
5900
5901 /******************************************************************************/
5902 ///Noise Estimation Driver
5903 /******************************************************************************/
MDrv_SC_GetNoiseLevel(MS_U8 * estNoise,const XC_LetterBoxState * letterBoxState,const XC_ApiStatus * stXCStatus,const MS_BOOL bInterlace,const MS_BOOL isOpFrameChanged)5904 MS_U8 MDrv_SC_GetNoiseLevel( MS_U8 *estNoise, const XC_LetterBoxState *letterBoxState, const XC_ApiStatus *stXCStatus, const MS_BOOL bInterlace, const MS_BOOL isOpFrameChanged )
5905 {
5906 const int defaultnoise = 35;
5907 static int noiseIIR = 35;
5908 static int noisehistory[5] = {0,0,0,0,0};
5909 static MS_BOOL long_noisehistory[11] = {0,0,0,0,0,0,0,0,0,0,0};
5910 static int safenoise = 0;
5911 static int resetcount = 0;
5912 MS_U8 reg_noise_confirm_level = 2;
5913 static MS_BOOL is_ne_set = false;
5914
5915 int avgpixeldiff = defaultnoise;
5916 int NE_histogram[25];
5917 int MV0count = 0;
5918
5919 if( isOpFrameChanged )
5920 {
5921 MS_U16 height = bInterlace ? stXCStatus->ScaledCropWin.height/2 : stXCStatus->ScaledCropWin.height;
5922 MS_U16 width = stXCStatus->ScaledCropWin.width;
5923
5924 MS_U16 hSt = (letterBoxState->lbCntL + 49 )/ 10;
5925 MS_U16 hEnd = ( __max( width - letterBoxState->lbCntR - 50, 0 ) ) / 10;
5926
5927 MS_U16 vSt = (letterBoxState->lbCntT + 29 )/ 6;
5928 MS_U16 vEnd = ( __max( height - letterBoxState->lbCntB - 30, 0 ) ) / 6;
5929
5930 MApi_XC_W2BYTE(REG_SC_BK39_0E_L, (hEnd << 8) | hSt );
5931 MApi_XC_W2BYTE(REG_SC_BK39_0F_L, (vEnd << 8) | vSt );
5932
5933 MS_U16 total_block_num=__max((vEnd+1)/4-(vSt+3)/4,0)*__max((hEnd+1)/4-(hSt+3)/4,0);
5934
5935
5936 if( !is_ne_set )
5937 {
5938 MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
5939 is_ne_set = true;
5940
5941 MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, 0x0000, 0x0100);
5942 MApi_XC_W2BYTEMSK(REG_SC_BK39_0D_L, 0x0001, 0x0001); // active window en
5943 }
5944 else if (MApi_XC_R2BYTEMSK(REG_SC_BK39_08_L, 0x0080)!=0)//ready
5945 {
5946 NE_histogram[0]=MApi_XC_R2BYTEMSK(REG_SC_BK39_10_L,0x07FF);
5947 NE_histogram[1]=MApi_XC_R2BYTEMSK(REG_SC_BK39_11_L,0x07FF);
5948 NE_histogram[2]=MApi_XC_R2BYTEMSK(REG_SC_BK39_12_L,0x07FF);
5949 NE_histogram[3]=MApi_XC_R2BYTEMSK(REG_SC_BK39_13_L,0x07FF);
5950 NE_histogram[4]=MApi_XC_R2BYTEMSK(REG_SC_BK39_14_L,0x07FF);
5951 NE_histogram[5]=MApi_XC_R2BYTEMSK(REG_SC_BK39_15_L,0x07FF);
5952 NE_histogram[6]=MApi_XC_R2BYTEMSK(REG_SC_BK39_16_L,0x07FF);
5953 NE_histogram[7]=MApi_XC_R2BYTEMSK(REG_SC_BK39_17_L,0x07FF);
5954 NE_histogram[8]=MApi_XC_R2BYTEMSK(REG_SC_BK39_18_L,0x07FF);
5955 NE_histogram[9]=MApi_XC_R2BYTEMSK(REG_SC_BK39_19_L,0x07FF);
5956 NE_histogram[10]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1A_L,0x07FF);
5957 NE_histogram[11]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1B_L,0x07FF);
5958 NE_histogram[12]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1C_L,0x07FF);
5959 NE_histogram[13]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1D_L,0x07FF);
5960 NE_histogram[14]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1E_L,0x07FF);
5961 NE_histogram[15]=MApi_XC_R2BYTEMSK(REG_SC_BK39_1F_L,0x07FF);
5962 NE_histogram[16]=MApi_XC_R2BYTEMSK(REG_SC_BK39_20_L,0x07FF);
5963 NE_histogram[17]=MApi_XC_R2BYTEMSK(REG_SC_BK39_21_L,0x07FF);
5964 NE_histogram[18]=MApi_XC_R2BYTEMSK(REG_SC_BK39_22_L,0x07FF);
5965 NE_histogram[19]=MApi_XC_R2BYTEMSK(REG_SC_BK39_23_L,0x07FF);
5966 NE_histogram[20]=MApi_XC_R2BYTEMSK(REG_SC_BK39_24_L,0x07FF);
5967 NE_histogram[21]=MApi_XC_R2BYTEMSK(REG_SC_BK39_25_L,0x07FF);
5968 NE_histogram[22]=MApi_XC_R2BYTEMSK(REG_SC_BK39_26_L,0x07FF);
5969 NE_histogram[23]=MApi_XC_R2BYTEMSK(REG_SC_BK39_27_L,0x07FF);
5970 NE_histogram[24]=MApi_XC_R2BYTEMSK(REG_SC_BK39_28_L,0x07FF);
5971
5972 int i;
5973 for (i = 4; i > 0; i-- )
5974 noisehistory[i]=noisehistory[i-1];
5975 for (i = 10; i > 0; i-- )
5976 long_noisehistory[i]=long_noisehistory[i-1];
5977 for (i=0;i<25;i++)
5978 MV0count+=NE_histogram[i];
5979 if (MV0count<total_block_num/12 || total_block_num<24)
5980 {
5981 if (safenoise>0)
5982 {
5983 avgpixeldiff=safenoise;
5984 resetcount++;
5985 reg_noise_confirm_level=8;
5986 }
5987 else
5988 {
5989 avgpixeldiff=noiseIIR;
5990 reg_noise_confirm_level=0;
5991 }
5992 noisehistory[0]=0;
5993 long_noisehistory[0]=0;
5994 }
5995 else
5996 {
5997 int maxhis=1;
5998 int maxval=0;
5999 for (i=0;i<24;i++)
6000 {
6001 int curva;
6002 if (i==0)
6003 curva=2*NE_histogram[i]+NE_histogram[i+1];
6004 else if (i==23)
6005 curva=2*NE_histogram[i]+NE_histogram[i-1];
6006 else
6007 curva=NE_histogram[i-1]+2*NE_histogram[i]+NE_histogram[i+1];
6008
6009 if (curva>maxval)
6010 {
6011 maxval=curva;
6012 maxhis=i;
6013 }
6014 }
6015 int thre1=4;
6016 int thre2=13;
6017 if (maxhis>12)
6018 {
6019 thre1=3;
6020 thre2=10;
6021 }
6022 if ((maxval>total_block_num/10 && (maxval-NE_histogram[maxhis])*10/MV0count>=thre1 && NE_histogram[maxhis] * 100 / MV0count>thre2))// || MV0count<total_block_num/24)
6023 {
6024 noisehistory[0]=10*maxhis+5;
6025 long_noisehistory[0]=1;
6026 int nonzerocount=0;
6027 int historytotal=0;
6028 int firstnoise=0;
6029 int long_nonzerocount=0;
6030 for ( i=0;i<5;i++)
6031 {
6032 historytotal=historytotal+noisehistory[i];
6033 if (noisehistory[i]>0)
6034 {
6035 nonzerocount++;
6036 firstnoise=noisehistory[i];
6037 }
6038 }
6039 for ( i=0;i<11;i++)
6040 long_nonzerocount+=long_noisehistory[i];
6041 if (nonzerocount>=3 && (maxhis<=3 || long_nonzerocount>=7))
6042 {
6043 int removefirstavg=(historytotal-firstnoise)/(nonzerocount-1);
6044 if ((removefirstavg+20)<firstnoise)
6045 safenoise=removefirstavg;
6046 else
6047 safenoise=historytotal/nonzerocount;
6048 resetcount=0;
6049 avgpixeldiff=noisehistory[0];
6050 reg_noise_confirm_level=8;
6051 }
6052 else if (safenoise>0)
6053 {
6054 avgpixeldiff=safenoise;
6055 resetcount++;
6056 reg_noise_confirm_level=8;
6057 }
6058 else
6059 {
6060 avgpixeldiff=noisehistory[0];
6061 reg_noise_confirm_level=1;
6062 }
6063 }
6064 else
6065 {
6066 noisehistory[0]=0;
6067 long_noisehistory[0]=0;
6068 if (safenoise>0)
6069 {
6070 avgpixeldiff=safenoise;
6071 resetcount++;
6072 reg_noise_confirm_level=8;
6073 }
6074 else
6075 {
6076 avgpixeldiff=10*maxhis+5;
6077 reg_noise_confirm_level=1;
6078 }
6079 }
6080 }
6081 if (resetcount>8)
6082 {
6083 safenoise=0;
6084 resetcount=0;
6085 }
6086 int tmpcount=0;
6087 int prenoise=0;
6088 for ( i = 0; i < 5; i++ )
6089 {
6090 if (noisehistory[i]<250 && noisehistory[i]>0)
6091 {
6092 tmpcount++;
6093 prenoise=prenoise+noisehistory[i];
6094 }
6095 }
6096 if (tmpcount>0)
6097 prenoise=prenoise/tmpcount;
6098 int reg_ne_mv0cost_th =2*prenoise/10;
6099 reg_ne_mv0cost_th = reg_ne_mv0cost_th > 3 ? reg_ne_mv0cost_th : 3;
6100 if (tmpcount==0)
6101 reg_ne_mv0cost_th =60;
6102 MApi_XC_W2BYTEMSK(REG_SC_BK39_0A_L, reg_ne_mv0cost_th, 0x003F);
6103
6104 if (reg_noise_confirm_level==8)
6105 noiseIIR = (noiseIIR*3+avgpixeldiff) >> 2;
6106
6107 MApi_XC_W2BYTEMSK(REG_SC_BK39_08_L, 0x0001, 0x0001);
6108 is_ne_set = true;
6109 }
6110 }
6111
6112 *estNoise = (MS_U8)( noiseIIR <= 255 ? noiseIIR : 255 );
6113
6114 return reg_noise_confirm_level;
6115 }
6116
6117 /******************************************************************************/
6118 ///UCNR Driver
6119 /******************************************************************************/
Hal_PQ_LoadMCNRLutQmapSetting()6120 MS_BOOL Hal_PQ_LoadMCNRLutQmapSetting()
6121 {
6122 //UCNR LUT
6123 #if MCNR_LUT_LOAD_FROM_QMAP
6124 m_stMCNRLutQmapSetting.mcnrLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_08_L);
6125 m_stMCNRLutQmapSetting.mcnrLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_09_L);
6126 m_stMCNRLutQmapSetting.mcnrLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_0A_L);
6127 m_stMCNRLutQmapSetting.mcnrLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_0B_L);
6128 m_stMCNRLutQmapSetting.mcnrLut[4] = MApi_XC_R2BYTE(REG_SC_BK2A_0C_L);
6129 m_stMCNRLutQmapSetting.mcnrLut[5] = MApi_XC_R2BYTE(REG_SC_BK2A_0D_L);
6130 m_stMCNRLutQmapSetting.mcnrLut[6] = MApi_XC_R2BYTE(REG_SC_BK2A_0E_L);
6131 m_stMCNRLutQmapSetting.mcnrLut[7] = MApi_XC_R2BYTE(REG_SC_BK2A_0F_L);
6132 #else
6133 m_stMCNRLutQmapSetting.mcnrLut[0] = 0xFFEE;
6134 m_stMCNRLutQmapSetting.mcnrLut[1] = 0xDDCC;
6135 m_stMCNRLutQmapSetting.mcnrLut[2] = 0xBBAA;
6136 m_stMCNRLutQmapSetting.mcnrLut[3] = 0x9988;
6137 m_stMCNRLutQmapSetting.mcnrLut[4] = 0x7766;
6138 m_stMCNRLutQmapSetting.mcnrLut[5] = 0x5544;
6139 m_stMCNRLutQmapSetting.mcnrLut[6] = 0x3322;
6140 m_stMCNRLutQmapSetting.mcnrLut[7] = 0x1100;
6141 #endif
6142
6143 //PDNR LUT
6144 #if PDNR_LUT_LOAD_FROM_QMAP
6145 m_stMCNRLutQmapSetting.pdnrlowLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_1C_L);
6146 m_stMCNRLutQmapSetting.pdnrlowLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_1D_L);
6147 m_stMCNRLutQmapSetting.pdnrlowLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_1E_L);
6148 m_stMCNRLutQmapSetting.pdnrlowLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_1F_L);
6149 m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_20_L);
6150 m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_21_L);
6151 m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_22_L);
6152 m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_23_L);
6153 m_stMCNRLutQmapSetting.pdnrhighLut[0] = MApi_XC_R2BYTE(REG_SC_BK2A_24_L);
6154 m_stMCNRLutQmapSetting.pdnrhighLut[1] = MApi_XC_R2BYTE(REG_SC_BK2A_25_L);
6155 m_stMCNRLutQmapSetting.pdnrhighLut[2] = MApi_XC_R2BYTE(REG_SC_BK2A_26_L);
6156 m_stMCNRLutQmapSetting.pdnrhighLut[3] = MApi_XC_R2BYTE(REG_SC_BK2A_27_L);
6157 #else
6158 m_stMCNRLutQmapSetting.pdnrlowLut[0] = 0x8888;
6159 m_stMCNRLutQmapSetting.pdnrlowLut[1] = 0x8888;
6160 m_stMCNRLutQmapSetting.pdnrlowLut[2] = 0x7654;
6161 m_stMCNRLutQmapSetting.pdnrlowLut[3] = 0x3210;
6162 m_stMCNRLutQmapSetting.pdnrlow2Lut[0] = 0x2100;
6163 m_stMCNRLutQmapSetting.pdnrlow2Lut[1] = 0x0000;
6164 m_stMCNRLutQmapSetting.pdnrlow2Lut[2] = 0x0000;
6165 m_stMCNRLutQmapSetting.pdnrlow2Lut[3] = 0x0000;
6166 if(_bIsHDSource)
6167 {
6168 m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8888;
6169 m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x8888;
6170 m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x8887;
6171 m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x6420;
6172 }
6173 else
6174 {
6175 m_stMCNRLutQmapSetting.pdnrhighLut[0] = 0x8876;
6176 m_stMCNRLutQmapSetting.pdnrhighLut[1] = 0x5432;
6177 m_stMCNRLutQmapSetting.pdnrhighLut[2] = 0x1000;
6178 m_stMCNRLutQmapSetting.pdnrhighLut[3] = 0x0000;
6179 }
6180 #endif
6181
6182 return true;
6183 }
6184
MDrv_SC_NR_LUT_Aux(MS_U16 nr_lut,MS_U8 sc)6185 MS_U16 MDrv_SC_NR_LUT_Aux( MS_U16 nr_lut, MS_U8 sc)
6186 {
6187 sc = sc < 16 ? sc : 16;
6188
6189 MS_U8 h0 = (nr_lut >> 0) & 0xF;
6190 MS_U8 h1 = (nr_lut >> 4) & 0xF;
6191 MS_U8 h2 = (nr_lut >> 8) & 0xF;
6192 MS_U8 h3 = (nr_lut >> 12) & 0xF;
6193
6194 XC_ApiStatus DrvStatus = {0};
6195 MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
6196 if ((!DrvStatus.bInterlace) && (DrvStatus.u16InputVFreq < 300)) //reduce gain value if 24p
6197 {
6198 h0 = ((h0 * sc)/3) >> 4;
6199 h1 = ((h1 * sc)/3) >> 4;
6200 h2 = ((h2 * sc)/3) >> 4;
6201 h3 = ((h3 * sc)/3) >> 4;
6202 }
6203 else
6204 {
6205 h0 = (h0 * sc) >> 4;
6206 h1 = (h1 * sc) >> 4;
6207 h2 = (h2 * sc) >> 4;
6208 h3 = (h3 * sc) >> 4;
6209 }
6210
6211 return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6212 }
6213
MDrv_SC_NR_LUT_Offset_Aux(MS_U16 nr_lut,MS_U8 sc)6214 MS_U16 MDrv_SC_NR_LUT_Offset_Aux( MS_U16 nr_lut, MS_U8 sc)
6215 {
6216 sc = sc < 0xF ? sc : 0xF;
6217
6218 MS_U8 h0 = (nr_lut >> 0) & 0xF;
6219 MS_U8 h1 = (nr_lut >> 4) & 0xF;
6220 MS_U8 h2 = (nr_lut >> 8) & 0xF;
6221 MS_U8 h3 = (nr_lut >> 12) & 0xF;
6222
6223 h0 = (h0 > sc) ? h0 - sc : 0;
6224 h1 = (h1 > sc) ? h1 - sc : 0;
6225 h2 = (h2 > sc) ? h2 - sc : 0;
6226 h3 = (h3 > sc) ? h3 - sc : 0;
6227
6228 return (h3 << 12) | (h2 << 8) | (h1 << 4) | (h0 << 0);
6229 }
6230
MDrv_SC_Luma_PK_LUT_Aux(const MS_U8 table[],MS_U8 sc)6231 MS_U16 MDrv_SC_Luma_PK_LUT_Aux( const MS_U8 table[], MS_U8 sc)
6232 {
6233 sc = sc < 16 ? sc : 16;
6234
6235 MS_U8 h0 = ( 8 * (16-sc) + table[0] * sc + 8) >> 4;
6236 MS_U8 h1 = ( 8 * (16-sc) + table[1] * sc + 8) >> 4;
6237 MS_U8 h2 = ( 8 * (16-sc) + table[2] * sc + 8) >> 4;
6238 MS_U8 h3 = ( 8 * (16-sc) + table[3] * sc + 8) >> 4;
6239
6240 return (h0 << 12) | (h1 << 8) | (h2 << 4) | (h3 << 0);
6241 }
6242
MDrv_SC_Set_PDNR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6243 void MDrv_SC_Set_PDNR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6244 {
6245 MApi_XC_W2BYTE(REG_SC_BK2A_1C_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[0], gain ) );
6246 MApi_XC_W2BYTE(REG_SC_BK2A_1D_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[1], gain ) );
6247 MApi_XC_W2BYTE(REG_SC_BK2A_1E_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[2], gain ) );
6248 MApi_XC_W2BYTE(REG_SC_BK2A_1F_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlowLut[3], gain ) );
6249 MApi_XC_W2BYTE(REG_SC_BK2A_20_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[0], gain ) );
6250 MApi_XC_W2BYTE(REG_SC_BK2A_21_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[1], gain ) );
6251 MApi_XC_W2BYTE(REG_SC_BK2A_22_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[2], gain ) );
6252 MApi_XC_W2BYTE(REG_SC_BK2A_23_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrlow2Lut[3], gain ) );
6253 MApi_XC_W2BYTE(REG_SC_BK2A_24_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[0], gain ) );
6254 MApi_XC_W2BYTE(REG_SC_BK2A_25_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[1], gain ) );
6255 MApi_XC_W2BYTE(REG_SC_BK2A_26_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[2], gain ) );
6256 MApi_XC_W2BYTE(REG_SC_BK2A_27_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.pdnrhighLut[3], gain ) );
6257 }
6258
MDrv_SC_Set_MCNR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6259 void MDrv_SC_Set_MCNR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6260 {
6261 MApi_XC_W2BYTE(REG_SC_BK2A_08_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[0], gain ) );
6262 MApi_XC_W2BYTE(REG_SC_BK2A_09_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[1], gain ) );
6263 MApi_XC_W2BYTE(REG_SC_BK2A_0A_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[2], gain ) );
6264 MApi_XC_W2BYTE(REG_SC_BK2A_0B_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[3], gain ) );
6265 MApi_XC_W2BYTE(REG_SC_BK2A_0C_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[4], gain ) );
6266 MApi_XC_W2BYTE(REG_SC_BK2A_0D_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[5], gain ) );
6267 MApi_XC_W2BYTE(REG_SC_BK2A_0E_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[6], gain ) );
6268 MApi_XC_W2BYTE(REG_SC_BK2A_0F_L, MDrv_SC_NR_LUT_Aux( m_stMCNRLutQmapSetting.mcnrLut[7], gain ) );
6269 }
6270
MDrv_SC_Set_PostDINR_Gain(MS_U8 gain,MS_BOOL isSourceChange)6271 void MDrv_SC_Set_PostDINR_Gain( MS_U8 gain, MS_BOOL isSourceChange )
6272 {
6273 static MS_U16 lut[4];
6274 if( isSourceChange )
6275 {
6276 lut[0] = MApi_XC_R2BYTE(REG_SC_BK61_08_L);
6277 lut[1] = MApi_XC_R2BYTE(REG_SC_BK61_09_L);
6278 lut[2] = MApi_XC_R2BYTE(REG_SC_BK61_0A_L);
6279 lut[3] = MApi_XC_R2BYTE(REG_SC_BK61_0B_L);
6280 }
6281 else
6282 {
6283 MApi_XC_W2BYTE(REG_SC_BK61_08_L, MDrv_SC_NR_LUT_Aux( lut[0], gain ) );
6284 MApi_XC_W2BYTE(REG_SC_BK61_09_L, MDrv_SC_NR_LUT_Aux( lut[1], gain ) );
6285 MApi_XC_W2BYTE(REG_SC_BK61_0A_L, MDrv_SC_NR_LUT_Aux( lut[2], gain ) );
6286 MApi_XC_W2BYTE(REG_SC_BK61_0B_L, MDrv_SC_NR_LUT_Aux( lut[3], gain ) );
6287 }
6288 }
6289
MDrv_SC_Set_Luma_PK_Gain(MS_U8 gain)6290 void MDrv_SC_Set_Luma_PK_Gain( MS_U8 gain )
6291 {
6292 const MS_U8 tableL[4] = { 2, 2, 8, 8 };
6293 const MS_U8 tableH[4] = { 10, 8, 8, 6 };
6294
6295 MApi_XC_W2BYTE(REG_SC_BK19_55_L, 0x21 );
6296 MApi_XC_W2BYTE(REG_SC_BK19_56_L, MDrv_SC_Luma_PK_LUT_Aux( tableL, gain ) );
6297 MApi_XC_W2BYTE(REG_SC_BK19_57_L, MDrv_SC_Luma_PK_LUT_Aux( tableH, gain ) );
6298 }
6299
MDrv_SC_GMV_Stability(MS_U16 * gmvDiff,MS_U8 * gmvAvgX,MS_U8 * gmvAvgY,const XC_GMvStates * GMV,const MS_BOOL isOpFrameChanged)6300 void MDrv_SC_GMV_Stability( MS_U16 *gmvDiff, MS_U8 *gmvAvgX, MS_U8 *gmvAvgY, const XC_GMvStates *GMV, const MS_BOOL isOpFrameChanged )
6301 {
6302 static XC_GMvStates gmvHist[8];
6303 static MS_U8 histPos = 0;
6304 static MS_U16 mvDiff = 0;
6305 static MS_U16 mvAvgX = 0, mvAvgY = 0;
6306
6307 if( isOpFrameChanged )
6308 {
6309 gmvHist[histPos] = *GMV;
6310 histPos = histPos < 7 ? histPos+1 : 0;
6311
6312 mvDiff = 0;
6313 mvAvgX = mvAvgY = 0;
6314 int i;
6315 for( i = 0 ; i < 8 ; ++i )
6316 {
6317 if( i != 0 )
6318 mvDiff += abs( gmvHist[i].minMvXdir - gmvHist[i-1].minMvXdir ) + abs( gmvHist[i].minMvYdir - gmvHist[i-1].minMvYdir );
6319 mvAvgY += gmvHist[i].minMvYdir;
6320 mvAvgX += gmvHist[i].minMvXdir;
6321 }
6322 mvAvgY = ( mvAvgY + 4 ) >> 3;
6323 mvAvgX = ( mvAvgX + 4 ) >> 3;
6324 }
6325
6326 *gmvDiff = mvDiff;
6327 *gmvAvgX = mvAvgX;
6328 *gmvAvgY = mvAvgY;
6329 }
6330
MDrv_SC_NR_HouseMD_Patch(const MS_U16 me1NotFoundBlk,const XC_LumaHistogramStates * lumaHistogramStates,const MS_BOOL isSceneChange)6331 MS_U8 MDrv_SC_NR_HouseMD_Patch(
6332 /*const MS_U8 gmvAvgX, const MS_U8 gmvAvgY, const int blkConfidence,*/ const MS_U16 me1NotFoundBlk, const XC_LumaHistogramStates *lumaHistogramStates,
6333 const MS_BOOL isSceneChange
6334 )
6335 {
6336 static MS_U8 u8LowLumaVerMovingCnt = 0;
6337
6338 MS_U32 darkSum = 0, lowLumaSum = 0, avgLuma = 0, totalSum = 0;
6339 int i = 0;
6340 for( i = 0 ; i < 32 ; ++i )
6341 {
6342 if( i < 4 ) darkSum += lumaHistogramStates->lumaBin[i];
6343 if( i < 8 ) lowLumaSum += lumaHistogramStates->lumaBin[i];
6344 totalSum += lumaHistogramStates->lumaBin[i];
6345 avgLuma += lumaHistogramStates->lumaBin[i] * i;
6346 }
6347 if( totalSum != 0 )
6348 {
6349 avgLuma /= totalSum;
6350 darkSum = darkSum * 256 / totalSum;
6351 lowLumaSum = lowLumaSum * 256 / totalSum;
6352 }
6353 else
6354 {
6355 avgLuma = 0;
6356 darkSum = 0;
6357 lowLumaSum = 0;
6358 }
6359
6360 MS_U16 u16TopCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6361 MS_U16 u16BottomCnt = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6362
6363 //PRT_TRP( "Luma dark, low, avg: %d, %d, %d\n", (int)darkSum, (int)lowLumaSum, (int)avgLuma );
6364
6365 if(
6366 ( u8LowLumaVerMovingCnt <= 8 ? (darkSum > 170) : (darkSum > 160) )
6367 && lowLumaSum > 230
6368 && avgLuma < 4
6369 /*&& blkConfidence > 70*/
6370 && me1NotFoundBlk > 0x300
6371 && ( u8LowLumaVerMovingCnt <= 8 ? (u16TopCnt > 0xFF || u16BottomCnt > 0xFF) : (u16TopCnt > 0xF || u16BottomCnt > 0xF) )
6372 )
6373 {
6374 u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt < 64 ? u8LowLumaVerMovingCnt+1 : 64;
6375 }
6376 else
6377 {
6378 u8LowLumaVerMovingCnt = u8LowLumaVerMovingCnt > 0 ? u8LowLumaVerMovingCnt-1 : 0;
6379 }
6380
6381 if( isSceneChange )
6382 {
6383 u8LowLumaVerMovingCnt = 0;
6384 }
6385
6386 //MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, isVerMoving ? 0x0020 : 0x0010, 0x00F0 );
6387
6388 return u8LowLumaVerMovingCnt;
6389 }
6390
6391 #define NR_DIRECT_OVERWRITE_EN 0
MDrv_SC_NR_Driver_E28(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)6392 void MDrv_SC_NR_Driver_E28
6393 (
6394 const MS_U16 u16MotionValue4,
6395 /* const int blkConfidence,*/
6396 //const MS_U32 hpfHdTolerantReport,
6397 const XC_LumaHistogramStates *lumaHistogramStates,
6398 const XC_FilmStates *filmstatus,
6399 //const XC_LetterBoxState *letterBoxState,
6400 //const XC_ApiStatus *stXCStatus,
6401 const XC_GMvStates *GMV,
6402 const MS_BOOL isUkosabihsMotion,
6403 const MS_BOOL isSceneChangeExt,
6404 const MS_BOOL bInterlace,
6405 const MS_BOOL isHDSrc,
6406 const MS_BOOL isSourceChange,
6407 const MS_BOOL isOpFrameChanged,
6408 const MS_U8 *estNoise,
6409 const MS_U8 NE_confirm
6410 )
6411 {
6412 // Update MCNR/PDNR LUT from Qmap
6413 MS_BOOL bMCNR_LUT_Reload = (MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L, 0x0400)>>8);
6414 if(bMCNR_LUT_Reload)
6415 {
6416 if(Hal_PQ_LoadMCNRLutQmapSetting())
6417 MApi_XC_W2BYTEMSK(REG_SC_BK30_0C_L, 0x0000, 0x0400);
6418 }
6419
6420 // debug en
6421 MS_BOOL dbgEn = MApi_XC_R2BYTEMSK(REG_SC_BK30_38_L, 0x0001 ) & (MApi_XC_R2BYTEMSK(REG_SC_BK30_39_L, 0x0001 ));
6422 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_3A_L, 0x0003, 0x0003 );
6423
6424 static MS_BOOL prevIsSceneChangeExt = 0;
6425 MS_BOOL isSceneChange = 0;
6426 if( (!prevIsSceneChangeExt) && isSceneChangeExt )
6427 isSceneChange = 1;
6428
6429 prevIsSceneChangeExt = isSceneChangeExt;
6430
6431 static MS_U8 mcnrMotionCnt = 0;
6432 static MS_U8 noiseLevel = 0;
6433 //static MS_U8 smvFrameCnt = 0;
6434 static MS_U8 panScanCnt = 0;
6435
6436 /* Get UCNR Status */
6437 MS_U16 me1MovingWeight3x3Min = MDrv_SC_read_avgMcnrMovingWeightMin();
6438 //MS_U16 me1MovingWeight3x3Max = MDrv_SC_read_avgMcnrMovingWeightMax();
6439 MS_U16 me1MovingWeight = MDrv_SC_read_avgMcnrMovingWeight();
6440 MS_U16 me1Mv0Cost = MDrv_SC_read_avgMv0MovingWeight();
6441 MS_U16 me2SadDiff = MDrv_SC_read_me2SadDiff();
6442
6443 MS_U16 mcnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_70_L);
6444 //MS_U16 mcnr2WPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_71_L);
6445 MS_U16 pdnrWPixCnt = MApi_XC_R2BYTE(REG_SC_BK09_72_L);
6446
6447 MS_U8 smallMovingW = MDrv_SC_McSmallMoving( me1MovingWeight3x3Min, me1Mv0Cost );
6448 if (dbgEn)
6449 DEBUG_LC_40( smallMovingW );
6450
6451 MS_U8 motion4StillCnt = MDrv_SC_Motion4StillCnt( u16MotionValue4 ); // 0 ~ 15
6452 //MS_U8 stillW = MDrv_SC_Me1Still( me1MovingWeight3x3Max, me1Mv0Cost );
6453
6454 /*1D motion status*/
6455 MS_U16 mv0pixels = MApi_XC_R2BYTE(REG_SC_BK09_78_L);
6456 MS_U16 nonMv0Pixels = MApi_XC_R2BYTE(REG_SC_BK09_79_L);
6457 MS_U16 mvNotFoundPixels = MApi_XC_R2BYTE(REG_SC_BK09_7A_L);
6458
6459 /*2D motion status*/
6460 MS_U16 me1Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_48_L);
6461 MS_U16 me1NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_49_L);
6462 MS_U16 me1NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4A_L);
6463 MS_U16 me2Mv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4B_L);
6464 MS_U16 me2NonMv0Blk = MApi_XC_R2BYTE(REG_SC_BK17_4C_L);
6465 MS_U16 me2NotFoundBlk = MApi_XC_R2BYTE(REG_SC_BK17_4D_L);
6466
6467 static MS_BOOL lastEN = 0;
6468
6469
6470 if( isSceneChange || isSourceChange )
6471 noiseLevel = 0;
6472 else
6473 {
6474 //NE_confirm = MDrv_SC_GetNoiseLevel( &estNoise, letterBoxState, stXCStatus, bInterlace, isOpFrameChanged );
6475 if (NE_confirm==8)
6476 lastEN=1;
6477 else if (NE_confirm==0 || NE_confirm==1)
6478 lastEN=0;
6479 if( NE_confirm == 8 || (NE_confirm==2 && lastEN==1))
6480 noiseLevel = *estNoise;
6481 else
6482 noiseLevel = 0;
6483 }
6484 //printf("noise level : %d, %d\n", noiseLevel, NE_confirm);
6485 //printf("noise opframe change : %d\n", (int)isOpFrameChanged);
6486
6487 // NE adaptive debug en
6488 MS_BOOL neAdptDbgEn = /*(MApi_XC_R2BYTE(REG_SC_BK2A_51_L) == 0x0100) && */(!isUkosabihsMotion);
6489
6490 // NE adaptive dnr4w_max
6491 MS_U8 dnr4Max = noiseLevel > 40 ? (noiseLevel-40)/4 + 0xC : 0xC;
6492 dnr4Max = dnr4Max < 0xF ? dnr4Max : 0xF;
6493 dnr4Max = neAdptDbgEn ? dnr4Max : 0xC;
6494 MApi_XC_W2BYTEMSK(REG_SC_BK2A_4D_L, dnr4Max << 12, 0xF000 );
6495
6496 // NE adaptive mcnr noise level
6497 MS_U8 nlMax = noiseLevel > 40 ? (noiseLevel-40)/4 + 8 : 8;
6498 nlMax = nlMax < 0xF ? nlMax : 0xF;
6499 nlMax = neAdptDbgEn ? nlMax : 8;
6500 MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, nlMax << 8, 0x0F00 );
6501
6502 MS_U16 gmvDiff = 0;
6503 MS_U8 gmvAvgX = 0, gmvAvgY = 0;
6504 MDrv_SC_GMV_Stability( &gmvDiff, &gmvAvgX, &gmvAvgY, GMV, isOpFrameChanged );
6505 //printf( "GMV diff, avgX, avgY: %d, %d %d\n", gmvDiff, gmvAvgX, gmvAvgY );
6506
6507 //DEBUG_LC_41( motion4StillCnt );
6508 //DEBUG_LC_43( noiseLevel );
6509 //printf( "noise level : %d\n", noiseLevel );
6510
6511 // force film-like/m2s weight to max if source is progressive/film
6512 if( (!bInterlace) || filmstatus->film_act )
6513 {
6514 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0xE000, 0xFF00);
6515 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x5000, 0xF000 );
6516 }
6517 else
6518 {
6519 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6E_L, 0x0000, 0xFF00);
6520 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x3000, 0xF000 );
6521 }
6522
6523 MS_U16 mcnrWPixCntThL, pdnrWPixCntThL, mcnrWPixCntThH, pdnrWPixCntThH;
6524 // MS_U16 smvTh;
6525 MS_U16 panScanThL, panScanThH;
6526 MS_U16 almostStillTh;
6527 if( isHDSrc )
6528 {
6529 mcnrWPixCntThL = 0xF0;
6530 pdnrWPixCntThL = 0xF0;
6531 mcnrWPixCntThH = 0x3800;
6532 pdnrWPixCntThH = 0x3800;
6533 panScanThH = 0x3000;
6534 panScanThL = 0x2000;
6535 almostStillTh = 0x200;
6536 #if 0
6537 if( noiseLevel > 0x40 )
6538 smvTh = 0xFF;
6539 else
6540 smvTh = 0x00;
6541 #endif
6542 }
6543 else
6544 {
6545 mcnrWPixCntThL = 0xF0;
6546 pdnrWPixCntThL = 0xF0;
6547 mcnrWPixCntThH = 0x980; //0x580;
6548 pdnrWPixCntThH = 0xB80; //0xA00;
6549 panScanThH = 0x800;
6550 panScanThL = 0x500;
6551 almostStillTh = 0x30;
6552 #if 0
6553 if( noiseLevel > 0x40 )
6554 smvTh = 0xFF;
6555 else
6556 smvTh = 0x00;
6557 #endif
6558 }
6559
6560 static MS_BOOL isStill = true, isStillDelay = true, isStillNoSceneChane = true, isStillDelayNoSceneChane = true;
6561 if( (mcnrWPixCnt < mcnrWPixCntThL && pdnrWPixCnt < pdnrWPixCntThL && motion4StillCnt > 8 )
6562 || ( mcnrWPixCnt < mcnrWPixCntThH && pdnrWPixCnt < pdnrWPixCntThH && motion4StillCnt > 12 )
6563 )
6564 {
6565 mcnrMotionCnt = 0;
6566 isStill = isStillDelay = true;
6567 isStillNoSceneChane = isStillDelayNoSceneChane = isSceneChange ? false : true;
6568 }
6569 else
6570 {
6571 if( mcnrMotionCnt > 16 )
6572 {
6573 isStill = isStillNoSceneChane = false;
6574
6575 if( mcnrMotionCnt > 32 )
6576 isStillDelay = isStillDelayNoSceneChane = false;
6577 else
6578 {
6579 isStillDelay = true;
6580 isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6581 ++mcnrMotionCnt;
6582 }
6583 }
6584 else
6585 {
6586 isStill = isStillDelay = true;
6587 isStillNoSceneChane = ( isSceneChange || !isStillNoSceneChane ) ? false : true;
6588 isStillDelayNoSceneChane = ( isSceneChange || !isStillDelayNoSceneChane ) ? false : true;
6589 ++mcnrMotionCnt;
6590 }
6591 }
6592
6593 // reduce pdnr weight by ME1 smv at small moving or almost still scenes
6594 // MS_BOOL isAlmostStill;
6595 if( me1MovingWeight < almostStillTh )
6596 {
6597 // isAlmostStill = true;
6598 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0010, 0x00F0 );
6599 }
6600 else
6601 {
6602 // isAlmostStill = false;
6603 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0020, 0x00F0 );
6604 }
6605
6606 // panScan
6607 static MS_BOOL isPanScan = false;
6608 if( me1MovingWeight > panScanThH )
6609 {
6610 if( panScanCnt < 16 )
6611 ++panScanCnt;
6612 }
6613 else
6614 {
6615 if( !(isPanScan && me1MovingWeight > panScanThL) )
6616 {
6617 if( panScanCnt > 0 )
6618 --panScanCnt;
6619 }
6620 }
6621
6622 if( panScanCnt > 6 )
6623 {
6624 isPanScan = true;
6625 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0100, 0x0F00 );
6626 }
6627 else
6628 {
6629 isPanScan = false;
6630 if( dbgEn ) MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, 0x0200, 0x0F00 );
6631 }
6632
6633 // low texture moving
6634 static MS_U8 lowTexMovingCnt = 0; // 0~32
6635 MS_BOOL isMe1Moving = false, isMe2Moving = false, is1DLowTexMoving = false;
6636 if( me1Mv0Blk < 0x20 && me1NonMv0Blk < 0x40 && me1NotFoundBlk > 0x3D0 && me1MovingWeight > 0x500/*0x1300*/ )
6637 {
6638 isMe1Moving = true;
6639 }
6640
6641 if( me2Mv0Blk < 0x800 && me2NonMv0Blk > 0x700 && me2NotFoundBlk > 0xD00 )
6642 {
6643 isMe2Moving = true;
6644 }
6645
6646 if( mv0pixels < 0x2FF && nonMv0Pixels < 0xF00 && mvNotFoundPixels < 0x160 )
6647 {
6648 is1DLowTexMoving = true;
6649 }
6650
6651 if( isMe1Moving && isMe2Moving && is1DLowTexMoving )
6652 {
6653 if( lowTexMovingCnt < 32 )
6654 ++lowTexMovingCnt;
6655 }
6656 else if( lowTexMovingCnt > 0 )
6657 {
6658 --lowTexMovingCnt;
6659 }
6660
6661 MS_BOOL isLowTexMoving = false;
6662 if( lowTexMovingCnt > 8 )
6663 {
6664 // enable keep detail
6665 isLowTexMoving = true;
6666 MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0x1000, 0xF000);
6667 }
6668 else
6669 {
6670 MApi_XC_W2BYTEMSK(REG_SC_BK2A_18_L, 0xF000, 0xF000);
6671 }
6672
6673 static MS_U8 pdnrGain = 16;
6674 static MS_U8 me1NRStrength = 0xF;
6675
6676 // isUkosabihsMotion then reduce PDNR table
6677 if( isUkosabihsMotion && isPanScan && !isLowTexMoving )
6678 {
6679 // maximum PDNR gain 12
6680 pdnrGain = pdnrGain > 12 ? pdnrGain-1 : (pdnrGain < 12 ? pdnrGain + 1 : pdnrGain );
6681 // reduce ME1_moving_w_nr_strength to 3
6682 me1NRStrength = me1NRStrength > 3 ? me1NRStrength - 1 : me1NRStrength;
6683 }
6684 // isLowTexMoving or isUkosabihsMotion but me1 moving weight is small then turn off PDNR
6685 else if( ( isUkosabihsMotion && !isPanScan ) || isLowTexMoving )
6686 {
6687 // turn off PDNR
6688 pdnrGain = pdnrGain > 6 ? pdnrGain - 6 : 0;
6689 me1NRStrength = me1NRStrength < 0xE ? me1NRStrength + 2 : 0xF;
6690 }
6691 else
6692 {
6693 pdnrGain = pdnrGain < 10 ? pdnrGain + 6 : 16;
6694 me1NRStrength = me1NRStrength < 0xB ? me1NRStrength + 4 : 0xF;
6695 }
6696
6697 static MS_U8 maxSnrStrength = 32;
6698 // isUkosabihsMotion || isPanScan then turn off SNR
6699 if( isUkosabihsMotion || isPanScan )
6700 maxSnrStrength = maxSnrStrength > 0 ? maxSnrStrength-1 : 0;
6701 else
6702 maxSnrStrength = maxSnrStrength < 32 ? maxSnrStrength+1 : 32;
6703
6704 // max SNR Weight
6705 MApi_XC_W2BYTEMSK(REG_SC_BK2A_69_L, maxSnrStrength << 8, 0x3F00);
6706
6707 #if HOUSE_MD_PATTERN_ENABLE
6708 // House MD patch
6709 MS_U8 u8LowLumaVerMovingCnt = MDrv_SC_NR_HouseMD_Patch( /*gmvAvgX, gmvAvgY, blkConfidence, */me1NotFoundBlk, lumaHistogramStates, isSceneChange );
6710 #else
6711 static MS_U8 u8LowLumaVerMovingCnt = 0;
6712 #endif
6713
6714
6715 // force 2D for stable vertical moving
6716 static MS_U8 force2DCnt = 0;
6717 static MS_U8 force1Dcnt = 0;
6718 //if( isUkosabihsMotion && gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7)
6719 if( isUkosabihsMotion && gmvDiff < 2 &&
6720 ( (gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) || ( abs( gmvAvgX - 32 ) < 16 && abs( gmvAvgX - 32 ) > 9 ) )
6721 )
6722 {
6723 if( force2DCnt < 32 )
6724 ++force2DCnt;
6725 }
6726 else if( gmvDiff < 5 &&
6727 (gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7) && isPanScan && ( abs( gmvAvgX - 32 ) < 3) )
6728 {
6729 if( force2DCnt < 32 )
6730 ++force2DCnt;
6731 }
6732 else
6733 {
6734 if( force2DCnt > 0 )
6735 --force2DCnt;
6736 }
6737
6738 // force 1D if small moving horizontal burst ( me2 not stable )
6739 if( !isUkosabihsMotion /*&& hpfHdTolerantReport > 0xC000*/ && me1Mv0Cost > 0x1900 && me2SadDiff < 0x100 )
6740 {
6741 if( force1Dcnt < 32 )
6742 ++force1Dcnt;
6743 }
6744 else
6745 {
6746 if( force1Dcnt > 0 )
6747 --force1Dcnt;
6748 }
6749
6750 if( !isUkosabihsMotion && u8LowLumaVerMovingCnt > 8 )
6751 {
6752 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4100, 0x7F00 );
6753 MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0000, 0x0008 );
6754 }
6755 else
6756 {
6757 MApi_XC_W2BYTEMSK(REG_SC_BK2A_07_L, 0x0008, 0x0008 );
6758
6759 if( force2DCnt > 16 )
6760 {
6761 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x4000, 0x7F00 );
6762 }
6763 else if( force1Dcnt > 16 )
6764 {
6765 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x6000, 0x7F00 );
6766 }
6767 else if( force2DCnt < 8 || force1Dcnt < 8 )
6768 {
6769 MApi_XC_W2BYTEMSK(REG_SC_BK2A_6D_L, 0x0000, 0x7F00 );
6770 }
6771 }
6772
6773 // still and vertical pan scan
6774 static MS_U8 mcnrGain = 16;
6775 if( isUkosabihsMotion )
6776 {
6777 if( gmvDiff < 2 && gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6778 {
6779 // stable vertical moving
6780 mcnrGain = mcnrGain > 8 ? mcnrGain - 1 : ( mcnrGain < 8 ? mcnrGain + 1 : 8 );
6781 }
6782 else if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 && abs( gmvAvgX - 32 ) < 16 )
6783 {
6784 mcnrGain = mcnrGain > 4 ? mcnrGain - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6785 }
6786 else if( abs( gmvAvgY - 8 ) >= 7 || abs( gmvAvgX - 32 ) >= 16 )
6787 {
6788 // high mv vertical moving
6789 mcnrGain = mcnrGain > 0 ? mcnrGain - 1 : 0;
6790 }
6791 else
6792 {
6793 mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6794 }
6795 }
6796 else if( isPanScan )
6797 {
6798 // not isUkosabihsMotion
6799 if( gmvAvgY != 8 && abs( gmvAvgY - 8 ) < 7 )
6800 {
6801 if( force2DCnt > 16 )
6802 {
6803 mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6804 }
6805 else
6806 {
6807 mcnrGain = mcnrGain > 4 ? mcnrGain - 1 : ( mcnrGain < 4 ? mcnrGain + 1 : 4 );
6808 }
6809 }
6810 else if( abs( gmvAvgY - 8 ) >= 7 )
6811 {
6812 // high mv vertical moving
6813 mcnrGain = mcnrGain > 0 ? mcnrGain - 1 : 0;
6814 }
6815 else
6816 {
6817 mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6818 }
6819 }
6820 else if( (abs( gmvAvgX - 32 ) >= 16) && (force2DCnt < 16) )
6821 {
6822 // motion is out of 1D search range
6823 // MCNR creates contours
6824 mcnrGain = mcnrGain > 8 ? mcnrGain - 1 : mcnrGain;
6825 pdnrGain = pdnrGain < 20 ? pdnrGain + 2 : pdnrGain;
6826 }
6827 else
6828 {
6829 //mcnrGain = mcnrGain < 16 ? mcnrGain + 1 : 16;
6830 //mcnrGain = isSceneChange ? 16 : ( mcnrGain < 16 ? mcnrGain + 1 : 16 );
6831 mcnrGain = isSceneChange ? 16 : ( mcnrGain < 12 ? mcnrGain + 4 :16 );
6832 }
6833
6834 //20160126 marked by Bella due to still pattern in this condition has too much noise
6835 // direct overwrite
6836 if (NR_DIRECT_OVERWRITE_EN)
6837 {
6838 if( isStillNoSceneChane /*isStill*/ || ( isStillDelayNoSceneChane/*isStillDelay*/ && gmvAvgY != 8) )
6839 {
6840 mcnrGain = 3;
6841 }
6842 }
6843
6844 // MCNR gain
6845 MDrv_SC_Set_MCNR_Gain( mcnrGain, isSourceChange );
6846
6847 // direct overwite
6848 if (NR_DIRECT_OVERWRITE_EN)
6849 {
6850 if( isStill || isSceneChange )
6851 {
6852 pdnrGain = 0;
6853 }
6854 }
6855
6856 // PDNR gain
6857 MDrv_SC_Set_PDNR_Gain( pdnrGain, isSourceChange ); // For UCNR delay Issue: 1078573, solution: open this line and mark"MDrv_SC_Set_PDNR_Gain( ( isStill || isSceneChange ) ? 0 : pdnrGain,isSourceChange );" by Jay Huang
6858 //MDrv_SC_Set_PDNR_Gain( ( isStill || isSceneChange ) ? 0 : pdnrGain,isSourceChange );
6859 // ME1_moving_w_nr_strength
6860 MApi_XC_W2BYTEMSK(REG_SC_BK2A_66_L, me1NRStrength << 12, 0xF000);
6861
6862
6863 // For BWS1&UCNR both ON, image sticking @scene change (turn on UCNR dither @scene change 12 times.)
6864 // 2014.9.16 Ryan
6865 static MS_U16 SceneCnt=0;
6866 if( ((MApi_XC_R2BYTE(REG_SC_BK08_01_L)& 0x0001) == 0x0000) && (isSceneChangeExt) ) //Due to compress issue, when BWS enable and scenechange, dither enable
6867 {
6868 SceneCnt = 12; //
6869 }
6870 else
6871 {
6872 if(SceneCnt>0)
6873 {
6874 SceneCnt = SceneCnt - 1;
6875 }
6876 else
6877 {
6878 SceneCnt = 0;
6879 }
6880 }
6881
6882 if(SceneCnt>0)
6883 {
6884 MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x003C, 0x007F);
6885 }
6886 else
6887 {
6888 MApi_XC_W2BYTEMSK(REG_SC_BK2A_5C_L, 0x007F, 0x007F);
6889 }
6890
6891
6892 static MS_U8 postDINRGain = 16;
6893 if( isUkosabihsMotion || isPanScan || is1DLowTexMoving )
6894 {
6895 postDINRGain = postDINRGain > 4 ? postDINRGain - 4 : 0;
6896 }
6897 else
6898 {
6899 postDINRGain = postDINRGain < 16 ? postDINRGain + 1 : 16;
6900 }
6901
6902 // PostDI NR gain
6903 MDrv_SC_Set_PostDINR_Gain( postDINRGain, isSourceChange );
6904
6905 //printf( "Gain : %d, %d, %d \n", mcnrGain, pdnrGain, postDINRGain );
6906
6907 #if 0
6908 // luma peaking
6909 if( isPanScan && gmvAvgX != 32 && gmvAvgY == 8 && !isUkosabihsMotion )
6910 {
6911 MDrv_SC_Set_Luma_PK_Gain( panScanCnt );
6912 }
6913 else
6914 {
6915 MDrv_SC_Set_Luma_PK_Gain( 0 );
6916 }
6917 #endif
6918
6919 if( dbgEn )
6920 {
6921 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe1Moving ? 0x0002 : 0x0001), 0x000F );
6922 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isMe2Moving ? 0x0020 : 0x0010), 0x00F0 );
6923 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (is1DLowTexMoving ? 0x0200 : 0x0100), 0x0F00 );
6924 MApi_XC_W2BYTEMSK(REG_SC_BK30_45_L, (isLowTexMoving ? 0x2000 : 0x1000), 0xF000 );
6925
6926 MApi_XC_W2BYTEMSK(REG_SC_BK30_44_L, (pdnrGain == 0) ? 0x0001 : 0x0002, 0x000F );
6927
6928 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, isUkosabihsMotion ? 0x0020 : 0x0010, 0x00F0 );
6929 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, force1Dcnt > 16 ? 0x0200 : 0x0100, 0x0F00 );
6930 MApi_XC_W2BYTEMSK(REG_SC_BK30_46_L, mcnrGain == 16 ? 0x2000 : 0x1000, 0xF000 );
6931 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isSceneChange ? 0x0002 : 0x0001), 0x000F );
6932 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, (isStillNoSceneChane ? 0x0020 : 0x0010), 0x00F0 );
6933
6934 MApi_XC_W2BYTEMSK(REG_SC_BK30_47_L, ( ( (NE_confirm == 8) || (NE_confirm==2 && lastEN==1) ) ? 0x2000 : 0x1000), 0xF000 );
6935
6936 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 10 ? 0x0002 : 0x0), 0x000F );
6937 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 20 ? 0x0020 : 0x0), 0x00F0 );
6938 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 30 ? 0x0200 : 0x0), 0x0F00 );
6939 MApi_XC_W2BYTEMSK(REG_SC_BK30_48_L, (noiseLevel > 40 ? 0x2000 : 0x0), 0xF000 );
6940
6941 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 50 ? 0x0002 : 0x0), 0x000F );
6942 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 60 ? 0x0020 : 0x0), 0x00F0 );
6943 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 70 ? 0x0200 : 0x0), 0x0F00 );
6944 MApi_XC_W2BYTEMSK(REG_SC_BK30_49_L, (noiseLevel > 80 ? 0x2000 : 0x0), 0xF000 );
6945
6946 MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, (noiseLevel > 90 ? 0x0002 : 0x0), 0x000F );
6947 MApi_XC_W2BYTEMSK(REG_SC_BK30_51_L, (noiseLevel > 100 ? 0x0020 : 0x0), 0x00F0 );
6948 MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, (noiseLevel > 110 ? 0x0200 : 0x0), 0x0F00 );
6949 MApi_XC_W2BYTEMSK(REG_SC_BK30_53_L, (noiseLevel > 120 ? 0x2000 : 0x0), 0xF000 );
6950 }
6951
6952 // adaptive coring
6953 //MDrv_Adaptive_Coring( noiseLevel, isSourceChange, isSceneChange );
6954 }
6955 /******************************************************************************/
6956 ///LetterBox Driver
6957 /******************************************************************************/
MDrv_SC_Letter_Box_Driver(const MS_BOOL isSceneChange,const MS_BOOL isSourceChange,const MS_BOOL isOpFrameChanged)6958 XC_LetterBoxState MDrv_SC_Letter_Box_Driver( /*const MS_BOOL isHDSrc,*/ const MS_BOOL isSceneChange, const MS_BOOL isSourceChange, const MS_BOOL isOpFrameChanged )
6959 {
6960 //static MS_U8 lbConfirmLevel = 0;
6961 static MS_U8 triggerCnt = 0;
6962 static MS_U8 hisPos = 0;
6963 static MS_U8 hisCnt = 0;
6964 static MS_U16 au16HisCntT[16] = {0};
6965 static MS_U16 au16HisCntB[16] = {0};
6966 static MS_U16 au16HisCntL[16] = {0};
6967 static MS_U16 au16HisCntR[16] = {0};
6968 static MS_U16 cntIIRT = 0, cntIIRB = 0, cntIIRL = 0, cntIIRR = 0;
6969 static MS_U16 prevMinCntT = 0, prevMinCntB = 0, prevMinCntL = 0, prevMinCntR = 0;
6970 //static XC_LetterBoxState lbState;
6971
6972 MS_U16 triggerMask = MApi_XC_R2BYTEMSK(REG_SC_BK0B_15_L, 0xF000) >> 12;
6973 triggerMask = triggerMask < 3 ? 3 : triggerMask;
6974
6975 MApi_XC_W2BYTEMSK(REG_SC_BK0B_05_L, 0x7F, 0x1FFF );
6976
6977 if( isSceneChange || isSourceChange )
6978 {
6979 lbConfirmLevel = 0;
6980 hisCnt = 0;
6981 memset( au16HisCntT, 0xFF, sizeof(au16HisCntT) );
6982 memset( au16HisCntB, 0xFF, sizeof(au16HisCntB) );
6983 memset( au16HisCntL, 0xFF, sizeof(au16HisCntL) );
6984 memset( au16HisCntR, 0xFF, sizeof(au16HisCntR) );
6985 }
6986
6987 if( isOpFrameChanged )
6988 {
6989 if( (triggerCnt & triggerMask) == 0 )
6990 {
6991 au16HisCntT[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0D_L, 0x03FF );
6992 au16HisCntB[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0E_L, 0x03FF );
6993 au16HisCntL[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_0F_L, 0x07FF );
6994 au16HisCntR[hisPos] = MApi_XC_R2BYTEMSK(REG_SC_BK0B_10_L, 0x07FF );
6995
6996 MS_U16 minCntT = au16HisCntT[0], minCntB = au16HisCntB[0], minCntL = au16HisCntL[0], minCntR = au16HisCntR[0];
6997 int i;
6998 for( i = 1 ; i < 16 ; ++i )
6999 {
7000 minCntT = au16HisCntT[i] < minCntT ? au16HisCntT[i] : minCntT;
7001 minCntB = au16HisCntB[i] < minCntB ? au16HisCntB[i] : minCntB;
7002 minCntL = au16HisCntL[i] < minCntL ? au16HisCntL[i] : minCntL;
7003 minCntR = au16HisCntR[i] < minCntR ? au16HisCntR[i] : minCntR;
7004 }
7005
7006 if( hisPos == 15 )
7007 hisPos = 0;
7008 else
7009 ++hisPos;
7010
7011 if( hisCnt < 16 )
7012 ++hisCnt;
7013
7014 MS_U16 conf = abs( (int)(minCntT + minCntB + minCntL + minCntR) - (int)(prevMinCntT + prevMinCntB + prevMinCntL + prevMinCntR) );
7015 conf = conf < 256 ? 255 - conf : 0;
7016 if ( minCntL == 0x01FFF || minCntR == 0x01FFF || minCntT == 0x01FFF || minCntB == 0x01FFF)
7017 conf = 0;
7018
7019 lbConfirmLevel = (lbConfirmLevel*6 + conf*2 )>> 3;
7020 lbState.lbComfirmLevel = conf;
7021 lbState.lbCntT = cntIIRT = ( cntIIRT * 7 + minCntT ) >> 3;
7022 lbState.lbCntB = cntIIRB = ( cntIIRB * 7 + minCntB ) >> 3;
7023 lbState.lbCntL = cntIIRL = ( cntIIRL * 7 + minCntL ) >> 3;
7024 lbState.lbCntR = cntIIRR = ( cntIIRR * 7 + minCntR ) >> 3;
7025
7026 prevMinCntT = minCntT;
7027 prevMinCntB = minCntB;
7028 prevMinCntL = minCntL;
7029 prevMinCntR = minCntR;
7030 /*
7031 if( isHDSrc )
7032 {
7033 int ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7034 lbState.lbRatioC = ratio < 256 ? ratio : 255;
7035
7036 ratio = 0x1FA4000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7037 lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7038
7039 ratio = 0x1FA4000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7040 lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7041 }
7042 else
7043 {
7044 int ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080-cntIIRT-cntIIRB) );
7045 lbState.lbRatioC = ratio < 256 ? ratio : 255;
7046
7047 ratio = 0x546000 / ( (int)(1920) * (int)(1080-cntIIRT-cntIIRB) );
7048 lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7049
7050 ratio = 0x546000 / ( (int)(1920-cntIIRL-cntIIRR) * (int)(1080) );
7051 lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7052 }*/
7053 int windowWidth = __max((int)(frameWidth-cntIIRL-cntIIRR), 1);
7054 int windowHeight = __max((int)(frameHeight-cntIIRT-cntIIRB), 1);
7055 int ratio = 0x1FA40000 / ( windowWidth * windowHeight );
7056 lbState.lbRatioC = ratio < 256 ? ratio : 255;
7057
7058 ratio = 0x1FA40000 / ( frameWidth * windowHeight );
7059 lbState.lbRatioTB = ratio < 256 ? ratio : 255;
7060
7061 ratio = 0x1FA40000 / ( windowWidth * frameHeight );
7062 lbState.lbRatioLR = ratio < 256 ? ratio : 255;
7063
7064
7065 MApi_XC_W2BYTEMSK(REG_SC_BK0B_15_L, cntIIRL, 0x01FF);
7066 MApi_XC_W2BYTEMSK(REG_SC_BK0B_16_L, cntIIRR, 0x01FF);
7067
7068 //PRT_TRP( "Letter Box L : %03d, R : %03d, confirm : %03d, ratio C/TB/LR : %02d.%2d, %02d.%2d, %02d.%2d \n", cntIIRL, cntIIRR, conf,
7069 //lbState.lbRatioC/16, (lbState.lbRatioC&0xF)*10/16, lbState.lbRatioTB/16, (lbState.lbRatioTB&0xF)*10/16, lbState.lbRatioLR/16, (lbState.lbRatioLR&0xF)*10/16 );
7070 }
7071 ++triggerCnt;
7072
7073 if (lbConfirmLevel > 224 && !(isSceneChange ||isSourceChange) && (lbState.lbCntL > 100) && (lbState.lbCntR > 100) )
7074 {
7075 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7076 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, lbState.lbCntL + 50, 0x1FFF);
7077 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, frameWidth - lbState.lbCntR - 50, 0x1FFF);
7078 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
7079 }
7080 else
7081 {
7082 const int boundary = 10;
7083 MS_U16 widthCur = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0x0FFF);/* cur width */
7084
7085 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0080, 0x0080);
7086 MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, boundary, 0x1FFF); /* set start */
7087 MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, widthCur-boundary, 0x1FFF);/* set end */
7088 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
7089 }
7090 }
7091
7092 return lbState;
7093 }
7094
7095 /******************************************************************************/
7096 ///DeFeathering
7097 ///@param u32MotionValue \ IN: Motion value
7098 /******************************************************************************/
MDrv_SC_de_feathering(MS_U32 u32MotionValue)7099 void MDrv_SC_de_feathering(MS_U32 u32MotionValue)
7100 {
7101 static MS_U32 u32DeFeatherCntLv1 = 0;
7102 static MS_U32 u32DeFeatherCntLv2 = 0;
7103 static MS_U32 u32DeFeatherCntLv3 = 0;
7104 MS_U8 u8SST_Static_Core_TH = 0;
7105
7106 MS_U8 u8SST_Dynamic_Core_TH =0; //YY for SZ feathering 151201
7107 MS_U8 u8SST_Motion_TH =0; //YY for SZ feathering 151201
7108
7109 MS_U32 reg_defethering_lv1_cnt = 0;
7110 MS_U32 reg_defethering_lv2_cnt = 0;
7111 MS_U32 reg_mdp_cnt = 0;
7112
7113 reg_defethering_lv1_cnt = 0x0A;
7114 reg_defethering_lv2_cnt = 0x08;
7115 reg_mdp_cnt = 0x01;
7116
7117 // motion level count
7118 if(u32MotionValue >= DEFETHERING_LV1_TH)
7119 {
7120 if(u32DeFeatherCntLv1 < reg_defethering_lv1_cnt)
7121 u32DeFeatherCntLv1++;
7122 }
7123 else
7124 {
7125 if(u32DeFeatherCntLv1 >= reg_mdp_cnt)
7126 u32DeFeatherCntLv1 = u32DeFeatherCntLv1 - reg_mdp_cnt;
7127 }
7128
7129 if(u32MotionValue >= DEFETHERING_LV2_TH)
7130 {
7131 if(u32DeFeatherCntLv2 < reg_defethering_lv2_cnt)
7132 u32DeFeatherCntLv2++;
7133 }
7134 else
7135 {
7136 if(u32DeFeatherCntLv2 >= reg_mdp_cnt)
7137 u32DeFeatherCntLv2 = u32DeFeatherCntLv2 - reg_mdp_cnt;
7138 }
7139
7140 if(u32MotionValue >= DEFETHERING_LV3_TH)
7141 {
7142 if(u32DeFeatherCntLv3 < DEFETHERING_LV3_CNT)
7143 u32DeFeatherCntLv3++;
7144 }
7145 else
7146 {
7147 if(u32DeFeatherCntLv3 >= reg_mdp_cnt)
7148 u32DeFeatherCntLv3 = u32DeFeatherCntLv3 - reg_mdp_cnt;
7149 }
7150
7151 //DeFeathering begin
7152 if(u32DeFeatherCntLv1 >= reg_defethering_lv1_cnt)
7153 {
7154 u8SST_Static_Core_TH = SST_STATIC_CORE_TH_LV1_VALUE;
7155 u8SST_Motion_TH = SST_MOTION_TH_LV1_VALUE; //YY for SZ feathering 151201
7156 u8SST_Dynamic_Core_TH = SST_DYNAMIC_CORE_TH_LV1_VALUE; //YY for SZ feathering 151201
7157 }
7158 else if(u32DeFeatherCntLv2 >= reg_defethering_lv2_cnt)
7159 {
7160 u8SST_Static_Core_TH = SST_STATIC_CORE_TH_LV2_VALUE;
7161 u8SST_Motion_TH = SST_MOTION_TH_LV2_VALUE; //YY for SZ feathering 151201
7162 u8SST_Dynamic_Core_TH = SST_DYNAMIC_CORE_TH_LV2_VALUE; //YY for SZ feathering 151201
7163 }
7164 else if(u32DeFeatherCntLv3 >= DEFETHERING_LV3_CNT)
7165 {
7166 u8SST_Static_Core_TH = SST_STATIC_CORE_TH_LV3_VALUE;
7167 u8SST_Motion_TH = SST_MOTION_TH_LV3_VALUE; //YY for SZ feathering 151201
7168 u8SST_Dynamic_Core_TH = SST_DYNAMIC_CORE_TH_LV3_VALUE; //YY for SZ feathering 151201
7169 }
7170 else
7171 {
7172 u8SST_Static_Core_TH = SST_STATIC_CORE_TH_LV4_VALUE;
7173 u8SST_Motion_TH = SST_MOTION_TH_LV4_VALUE; //YY for SZ feathering 151201
7174 u8SST_Dynamic_Core_TH = SST_DYNAMIC_CORE_TH_LV4_VALUE; //YY for SZ feathering 151201
7175 }
7176
7177 MApi_XC_W2BYTEMSK(REG_SC_BK22_1A_L, (MS_U16)u8SST_Static_Core_TH, 0xFF);
7178 MApi_XC_W2BYTEMSK(REG_SC_BK22_18_L, (MS_U16)u8SST_Motion_TH, 0x000F);
7179 MApi_XC_W2BYTEMSK(REG_SC_BK22_19_L, (MS_U16)u8SST_Dynamic_Core_TH, 0x003F);
7180 }
7181
7182 /******************************************************************************/
7183 ///DeFlickering
7184 ///@param u32MotionValue \ IN: Motion value
7185 /******************************************************************************/
MDrv_SC_de_flickering(MS_U32 u32MotionValue)7186 void MDrv_SC_de_flickering(MS_U32 u32MotionValue)
7187 {
7188 static MS_S32 s32DeFlickerCnt = 0;
7189 MS_U32 reg_m_feat_smooth_hle_th = 0, reg_m_feat_smooth_shrink = 0;
7190
7191 reg_m_feat_smooth_hle_th = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0xF000); // Feat Smooth HLE TH
7192 reg_m_feat_smooth_shrink = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_1E_L, 0x8F);
7193
7194 if(u32MotionValue >= DEFLICKERING_TH)
7195 {
7196 if(s32DeFlickerCnt < 65535)
7197 s32DeFlickerCnt++;
7198 }
7199 else
7200 {
7201 s32DeFlickerCnt = 0;
7202 }
7203
7204 if(s32DeFlickerCnt >= DEFLICKERING_CNT)
7205 {
7206 reg_m_feat_smooth_hle_th += 0x0300;
7207 reg_m_feat_smooth_shrink += 0x10;
7208 }
7209 else
7210 {
7211 reg_m_feat_smooth_hle_th += 0x0700;
7212 reg_m_feat_smooth_shrink += 0x30;
7213 }
7214
7215 MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_shrink, 0xFF);
7216 MApi_XC_W2BYTEMSK(REG_SC_BK22_1E_L, reg_m_feat_smooth_hle_th, 0xFF00);
7217 }
7218
7219 /******************************************************************************/
7220 ///DeBouncing
7221 ///@param u32MotionValue \ IN: Motion value
7222 /******************************************************************************/
7223 #define DEBOUNCING_GAIN 1 //0
MDrv_SC_de_bouncing(MS_U32 u32MotionValue)7224 void MDrv_SC_de_bouncing(MS_U32 u32MotionValue)
7225 {
7226 static MS_S32 s32DeBouncingCnt = 0;
7227 MS_U32 u32RegHisWtF2 = 0;
7228 MS_U32 u32regdebouncingth = 0;
7229 int reg_debouncing_cnt = 0;
7230
7231 u32regdebouncingth = 0x0A;
7232 reg_debouncing_cnt = 0x03;
7233
7234 u32RegHisWtF2 = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK22_0A_L, 0xF8); // history ratio weighting
7235
7236 if(u32MotionValue <= u32regdebouncingth * DEBOUNCING_GAIN)
7237 {
7238 s32DeBouncingCnt = 0;
7239 }
7240 else
7241 {
7242 if(s32DeBouncingCnt < 65535)
7243 s32DeBouncingCnt++;
7244 }
7245
7246 if(s32DeBouncingCnt >= reg_debouncing_cnt)
7247 {
7248 u32RegHisWtF2 += 0x06; // history = 6 moving
7249 }
7250 else
7251 {
7252 u32RegHisWtF2 += 0x03; // history = 3 still
7253 }
7254 MApi_XC_W2BYTEMSK(REG_SC_BK22_0A_L, u32RegHisWtF2, 0xFF);
7255 }
7256
7257 /******************************************************************************/
7258
MDrv_SC_Edison_DHD_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm,XC_GMvStates gMV,MS_U32 _hpfHdCntReport)7259 void MDrv_SC_Edison_DHD_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm, XC_GMvStates gMV, MS_U32 _hpfHdCntReport )
7260 {
7261 // dhd stadium patch: lower dhd strength
7262 static MS_U32 u32filmCnt = 0;
7263 int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7264
7265 MS_U32 exactFeatherCnt = 0;
7266 static MS_U32 pre_exactFeatherCnt = 0;
7267 MS_BOOL isMv0 = ( ( gMV.minMvXdir == 32 ) && ( gMV.minMvYdir == 8 ) ) ? true : false;
7268
7269 exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7270 exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7271 pre_exactFeatherCnt = exactFeatherCnt;
7272
7273 MS_U32 colorSum = 0;
7274 static MS_U32 colorSum_iir = 0;
7275
7276 colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
7277
7278 colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7279 colorSum_iir = colorSum;
7280
7281 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
7282 {
7283 u32filmCnt++;
7284
7285 if( u32filmCnt >= 50 )
7286 {
7287 u32filmCnt = 50;
7288 }
7289 }
7290 else if((gMV.h2XYsum > 0x30)&& (gMV.h2XYdiff <= 0x06)&& (!isMv0) && (nonMv0Comfirm>0x40) && mv0Comfirm < 0x20 )//shibasoku pan
7291 {
7292
7293 u32filmCnt++;
7294
7295 if( u32filmCnt >= 50 )
7296 {
7297 u32filmCnt = 50;
7298 }
7299 }
7300 else if ( _hpfHdCntReport > 0xFFFF )
7301 {
7302
7303 u32filmCnt++;
7304
7305 if( u32filmCnt >= 50 )
7306 {
7307 u32filmCnt = 50;
7308 }
7309 }
7310 else
7311 {
7312 if( u32filmCnt == 0 )
7313 {
7314 u32filmCnt = 0;
7315 }
7316 else
7317 {
7318 u32filmCnt--;
7319 }
7320 }
7321
7322 if( u32filmCnt <= 2 )
7323 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00, 0x0F00); //dhd user weight
7324 else if( u32filmCnt == 3 )
7325 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0C00, 0x0F00); //dhd user weight
7326 else if( u32filmCnt == 4 )
7327 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0B00, 0x0F00); //dhd user weight
7328 else if( u32filmCnt == 5 )
7329 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0900, 0x0F00); //dhd user weight
7330 else if( u32filmCnt == 6 )
7331 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0700, 0x0F00); //dhd user weight
7332 else if( u32filmCnt == 7 )
7333 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0500, 0x0F00); //dhd user weight
7334 else if( u32filmCnt == 8 )
7335 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0300, 0x0F00); //dhd user weight
7336 else if( u32filmCnt == 9 )
7337 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0100, 0x0F00); //dhd user weight
7338 else if( u32filmCnt >= 10 )
7339 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00); //dhd user weight
7340
7341 }
7342
MDrv_SC_Edison_DHD_Weather_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7343 void MDrv_SC_Edison_DHD_Weather_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7344 {
7345 // dhd weather patch: enhance dhd strength
7346 static MS_U32 u32filmCnt = 0;
7347 int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7348
7349 MS_U32 exactFeatherCnt = 0;
7350 static MS_U32 pre_exactFeatherCnt = 0;
7351
7352 exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7353 exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7354 pre_exactFeatherCnt = exactFeatherCnt;
7355
7356
7357 MS_U32 colorSum = 0;
7358 static MS_U32 colorSum_iir = 0;
7359
7360 colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC in Maserati
7361
7362 colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7363 colorSum_iir = colorSum;
7364
7365 if((uComplex>0x800) && (mv0Comfirm > 0x140) && (nonMv0Comfirm < 0x40) && (me1Still == true) && (check_width>0x700) && (exactFeatherCnt < 0x10) && (colorSum > 0x700) )
7366 {
7367 u32filmCnt++;
7368
7369 if( u32filmCnt >= 24 )
7370 {
7371 u32filmCnt = 24;
7372 }
7373 }
7374 else
7375 {
7376 if( u32filmCnt > 0 )
7377 u32filmCnt = u32filmCnt - 2;
7378 }
7379
7380 if( check_width>0x700 )
7381 {
7382
7383 if( u32filmCnt <= 2 )
7384 {
7385 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0040, 0x00FF); //dhd c edge diff(hor).
7386 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xA000, 0xFF00); //dhd y edge diff(hor).
7387 }
7388 else if( u32filmCnt == 3 )
7389 {
7390 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0054, 0x00FF); //dhd c edge diff(hor).
7391 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xAB00, 0xFF00); //dhd y edge diff(hor).
7392 }
7393 else if( u32filmCnt == 4 )
7394 {
7395 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0068, 0x00FF); //dhd c edge diff(hor).
7396 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xB600, 0xFF00); //dhd y edge diff(hor).
7397 }
7398 else if( u32filmCnt == 5 )
7399 {
7400 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x007C, 0x00FF); //dhd c edge diff(hor).
7401 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xC100, 0xFF00); //dhd y edge diff(hor).
7402 }
7403 else if( u32filmCnt == 6 )
7404 {
7405 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x0090, 0x00FF); //dhd c edge diff(hor).
7406 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xCC00, 0xFF00); //dhd y edge diff(hor).
7407 }
7408 else if( u32filmCnt == 7 )
7409 {
7410 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00A4, 0x00FF); //dhd c edge diff(hor).
7411 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xD700, 0xFF00); //dhd y edge diff(hor).
7412 }
7413 else if( u32filmCnt == 8 )
7414 {
7415 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00B8, 0x00FF); //dhd c edge diff(hor).
7416 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xE200, 0xFF00); //dhd y edge diff(hor).
7417 }
7418 else if( u32filmCnt == 9 )
7419 {
7420 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00CC, 0x00FF); //dhd c edge diff(hor).
7421 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xED00, 0xFF00); //dhd y edge diff(hor).
7422 }
7423 else if( u32filmCnt >= 10 )
7424 {
7425 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0x00E0, 0x00FF); //dhd c edge diff(hor).
7426 MApi_XC_W2BYTEMSK(REG_SC_BK05_26_L, 0xF800, 0xFF00); //dhd y edge diff(hor).
7427 }
7428
7429 }
7430
7431 }
7432
MDrv_SC_Edison_DHD_GSLSM_driver(MS_U32 uComplex,MS_U16 nonMv0Comfirm,MS_BOOL me1Still,MS_U16 mv0Comfirm)7433 void MDrv_SC_Edison_DHD_GSLSM_driver( MS_U32 uComplex, MS_U16 nonMv0Comfirm, MS_BOOL me1Still, MS_U16 mv0Comfirm )
7434 {
7435 // dhd patch for global still & local moving region( dot-crawl on dirty background ): enhance dhd strength
7436 static MS_U32 u32filmCnt = 0;
7437 int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7438
7439 MS_U32 exactFeatherCnt = 0;
7440 static MS_U32 pre_exactFeatherCnt = 0;
7441
7442 exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7443 exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7444 pre_exactFeatherCnt = exactFeatherCnt;
7445
7446 MS_U32 colorSum = 0;
7447 static MS_U32 colorSum_iir = 0;
7448
7449 colorSum = MDrv_Read2Byte(REG_FSC_BK55_1E_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1F_L, 0x000F )<<16); //move to UFSC inMaserati
7450
7451 colorSum = ((colorSum_iir*3 )+ colorSum ) >> 2;
7452 colorSum_iir = colorSum;
7453
7454 if((uComplex>0x800) && (mv0Comfirm >= nonMv0Comfirm*3) && (me1Still == true) && (check_width>0x700) && ((exactFeatherCnt > 0x40) || (exactFeatherCnt < 0x10 && colorSum > 0xB00) ) ) //exactFeatherCnt < 0x10 && colorSum > 0xB00 for weather
7455 {
7456 u32filmCnt++;
7457
7458 if( u32filmCnt >= 24 )
7459 {
7460 u32filmCnt = 24;
7461 }
7462 }
7463 else
7464 {
7465 if( u32filmCnt > 0 )
7466 u32filmCnt = u32filmCnt - 2;
7467 }
7468
7469 if( check_width>0x700 )
7470 {
7471 if( u32filmCnt <= 2 )
7472 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0024, 0x00FF); //dhd y(n), y(n-4) diff.
7473 else if( u32filmCnt == 3 )
7474 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0026, 0x00FF); //dhd y(n), y(n-4) diff.
7475 else if( u32filmCnt == 4 )
7476 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0029, 0x00FF); //dhd y(n), y(n-4) diff.
7477 else if( u32filmCnt == 5 )
7478 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002B, 0x00FF); //dhd y(n), y(n-4) diff.
7479 else if( u32filmCnt == 6 )
7480 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x002E, 0x00FF); //dhd y(n), y(n-4) diff.
7481 else if( u32filmCnt == 7 )
7482 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0030, 0x00FF); //dhd y(n), y(n-4) diff.
7483 else if( u32filmCnt == 8 )
7484 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0033, 0x00FF); //dhd y(n), y(n-4) diff.
7485 else if( u32filmCnt == 9 )
7486 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0035, 0x00FF); //dhd y(n), y(n-4) diff.
7487 else if( u32filmCnt >= 10 )
7488 MApi_XC_W2BYTEMSK(REG_SC_BK05_22_L, 0x0038, 0x00FF); //dhd y(n), y(n-4) diff.
7489 }
7490
7491 }
7492
7493 //
7494 //To do (merge with MDrv_SC_Edison_DHD_driver)
7495 //
MDrv_SC_Edison_DHD_Stadium_driver(MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)7496 void MDrv_SC_Edison_DHD_Stadium_driver(MS_BOOL isMcFilmHd,const XC_FilmStates filmstatus)
7497 {
7498
7499 int check_width = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
7500 int currentGain = MApi_XC_R2BYTEMSK(REG_SC_BK05_2B_L, 0x0F00) >> 8 ;
7501 if( check_width > 0x700 )
7502 {
7503 if( isMcFilmHd || filmstatus.filmany) //disable DHD when Film timing
7504 //if( filmstatus.film_act )
7505 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7506 else
7507 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7508 }
7509 else
7510 {
7511 if( filmstatus.filmany) //disable DHD when SD film-any
7512 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, 0x0000, 0x0F00);
7513 else
7514 MApi_XC_W2BYTEMSK(REG_SC_BK05_2B_L, (currentGain<<8), 0x0F00);
7515 }
7516
7517 }
7518
7519 //
7520 //To adjust the CCS_MR HisWeight Ctrl
7521 //
7522 #define CCS_MR_HisWeight_MaxValue 0x1F
7523 #define CCS_MR_HisWeight_MinValue 0x18
MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)7524 void MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(const XC_FilmStates filmstatus)
7525 {
7526 static MS_U8 Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7527
7528 if( (filmstatus.film32) |(filmstatus.filmany))
7529 {
7530 Reg_CCS_MR_Weight = CCS_MR_HisWeight_MaxValue;
7531 }
7532 else
7533 {
7534 if( Reg_CCS_MR_Weight > CCS_MR_HisWeight_MinValue )
7535 Reg_CCS_MR_Weight--;
7536 else
7537 Reg_CCS_MR_Weight = CCS_MR_HisWeight_MinValue;
7538 }
7539 MApi_XC_W2BYTEMSK(REG_SC_BK06_77_L, Reg_CCS_MR_Weight<<8, 0x1F00);
7540 }
7541
7542
7543 /******************************************************************************/
7544 ///CCS Driver
7545 /******************************************************************************/
7546
MDrv_SC_Edison_CCS_driver(const MS_BOOL ukoSabihS_en)7547 void MDrv_SC_Edison_CCS_driver( const MS_BOOL ukoSabihS_en )
7548 {
7549 // horizontal moving => lower ccs weight
7550 static MS_U32 u32CCSvideoCnt = 0;
7551 MS_BOOL isMvPanScan = FALSE;
7552
7553 //if((gMv.h1XYsum >10) && (gMv.h2XYsum > 10) && ( gMv.h1XYdiff < 5) && (gMv.h2XYdiff < 5))
7554 if( ukoSabihS_en )
7555 {
7556 isMvPanScan = true;
7557 }
7558 else
7559 {
7560 isMvPanScan = false;
7561 }
7562
7563 if(isMvPanScan)
7564 {
7565 u32CCSvideoCnt++;
7566
7567 if( u32CCSvideoCnt >= 20 )
7568 {
7569 u32CCSvideoCnt = 20;
7570 }
7571 }
7572 else
7573 {
7574 if( u32CCSvideoCnt == 0 )
7575 {
7576 u32CCSvideoCnt = 0;
7577 }
7578 else
7579 {
7580 u32CCSvideoCnt--;
7581 }
7582 }
7583
7584 if( u32CCSvideoCnt <= 2 )
7585 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000F, 0x000F); //ccs user weight
7586 else if( u32CCSvideoCnt == 3 )
7587 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000D, 0x000F); //ccs user weight
7588 else if( u32CCSvideoCnt == 4 )
7589 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x000B, 0x000F); //ccs user weight
7590 else if( u32CCSvideoCnt == 5 )
7591 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0009, 0x000F); //ccs user weight
7592 else if( u32CCSvideoCnt == 6 )
7593 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0007, 0x000F); //ccs user weight
7594 else if( u32CCSvideoCnt == 7 )
7595 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0005, 0x000F); //ccs user weight
7596 else if( u32CCSvideoCnt == 8 )
7597 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0003, 0x000F); //ccs user weight
7598 else if( u32CCSvideoCnt == 9 )
7599 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0001, 0x000F); //ccs user weight
7600 else if( u32CCSvideoCnt >= 10 )
7601 MApi_XC_W2BYTEMSK(REG_SC_BK05_53_L, 0x0000, 0x000F); //ccs user weight
7602 }
7603
MDrv_SC_LowLumaDetection(void)7604 MS_BOOL MDrv_SC_LowLumaDetection(void)
7605 {
7606 MS_BOOL isLowLuma = FALSE;
7607 MS_U16 MaxL_pixel = 0;
7608
7609 MaxL_pixel = MApi_XC_R2BYTE(REG_SC_BK1A_0B_L)&0x00FF;
7610
7611 if((MaxL_pixel<100)&&(MApi_XC_DLC_GetAverageValue()< 120))
7612 {
7613 isLowLuma = true;
7614 }
7615 else
7616 {
7617 isLowLuma = false;
7618 }
7619
7620 return isLowLuma;
7621 }
7622
LumaAGCLUT(const MS_U8 LumaCheck)7623 MS_U8 LumaAGCLUT(const MS_U8 LumaCheck )
7624 {
7625 MS_U8 lumaAgcGain = 0;
7626
7627 if( LumaCheck > 120 )
7628 lumaAgcGain = 6;
7629 else if( ( LumaCheck > 114 ) && ( LumaCheck <= 120 ))
7630 lumaAgcGain = 7;
7631 else if( ( LumaCheck > 104 ) && ( LumaCheck <= 114 ))
7632 lumaAgcGain = 8;
7633 else if( ( LumaCheck > 94 ) && ( LumaCheck <= 104 ))
7634 lumaAgcGain = 8;
7635 else if( ( LumaCheck > 83 ) && ( LumaCheck <= 94 ))
7636 lumaAgcGain = 9;
7637 else if( ( LumaCheck > 73 ) && ( LumaCheck <= 83 ))
7638 lumaAgcGain = 10;
7639 else if( ( LumaCheck > 62 ) && ( LumaCheck <= 73 ))
7640 lumaAgcGain = 11;
7641 else if( ( LumaCheck > 51 ) && ( LumaCheck <= 62 ))
7642 lumaAgcGain = 13;
7643 else if( ( LumaCheck > 40 ) && ( LumaCheck <= 51 ))
7644 lumaAgcGain = 15;
7645 else if( ( LumaCheck > 26 ) && ( LumaCheck <= 40 ))
7646 lumaAgcGain = 17;
7647 else
7648 lumaAgcGain = 15;
7649
7650 return lumaAgcGain;
7651 }
7652
7653 #define HD_ACT_TH 10
7654 #define HDSDD_SPEED 1
7655 #define HDSDD_DIV 0
7656 #define HD_SPEED 2
7657 #define SD_SPEED 4
7658
MDrv_SC_Edision_stillFeatherDetection(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)7659 void MDrv_SC_Edision_stillFeatherDetection(const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMotion,
7660 const MS_U32 _hpfHdCntReport, const MS_BOOL isHBurstMoving, const MS_BOOL isHBurst, const MS_BOOL isUkosabihsMv0,
7661 const MS_BOOL isMcFilmHd/*, const MS_BOOL isSceneChange*/, const MS_U32 _hpfSdCntReport )
7662 {
7663 MS_U32 exactFeatherCnt = 0;
7664 static MS_U32 pre_exactFeatherCnt = 0;
7665
7666 MS_U32 HD_ConfirmCnt_Reg = 0;
7667 static MS_U32 HD_ConfirmCnt_Reg_post = 0;
7668 static MS_U16 HD_ConfirmCnt = 0;
7669
7670 MS_U8 u8MinPixel = 0;
7671 static MS_U8 u8PrevMinPixel = 0;
7672
7673 MS_U8 u8MaxPixel = 0;
7674 static MS_U8 u8PrevMaxPixel = 0;
7675
7676 MS_U32 Luma = 0;
7677 static MS_U32 LumaPrev = 0;
7678 MS_U8 LumaCheck = 0;
7679
7680 MS_U16 Cplx = 0;
7681 static MS_U16 CplxPrev = 0;
7682 MS_U8 CplxCheck = 0;
7683
7684 MS_U8 lumaAgcGain = 0;
7685 MS_BOOL cplxLumaPatch = false;
7686
7687 MS_U8 featherRatio = 0;
7688
7689 // MS_BOOL XXX;
7690
7691 MS_BOOL isMovingImage = ( u32MotionValue!=0 ) ? true : false;
7692
7693 MS_BOOL isWithoutHsignal = ( _hpfSdCntReport < 0x10 ) ? true : false;
7694
7695 // XXX = isSceneChange;
7696 exactFeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7697 exactFeatherCnt = ( pre_exactFeatherCnt*3 + exactFeatherCnt ) >> 2;
7698 pre_exactFeatherCnt = exactFeatherCnt;
7699
7700 u8MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF);//move to UFSC in Maserati
7701 u8MaxPixel = (u8PrevMaxPixel*3 + u8MaxPixel ) >> 2;
7702 u8PrevMaxPixel = u8MaxPixel;
7703
7704 u8MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8; //move to UFSC in Maserati
7705 u8MinPixel = (u8PrevMinPixel*3 + u8MinPixel ) >> 2;
7706 u8PrevMinPixel = u8MinPixel;
7707
7708 Luma = MDrv_Read2Byte(REG_FSC_BK55_1A_L)+(MDrv_Read2ByteMSK( REG_FSC_BK55_1B_L, 0x000F )<<16);//move to UFSC in Maserati
7709 Luma = (LumaPrev*3 + Luma ) >> 2;
7710 LumaPrev = Luma;
7711
7712 Cplx = MApi_XC_R2BYTEMSK(REG_SC_BK2A_78_L, 0xFFFF);
7713 Cplx = (CplxPrev*3 + Cplx ) >> 2;
7714 CplxPrev = Cplx;
7715
7716 {
7717 LumaCheck = Luma >> 8;
7718 CplxCheck = Cplx >> 8;
7719 lumaAgcGain = LumaAGCLUT( LumaCheck );
7720 cplxLumaPatch = ( CplxCheck > ( LumaCheck * lumaAgcGain ) >> 3 ) ? true : false;
7721 }
7722
7723 if( ( isUkosabihsMv0 && !isMovingImage) || isMcFilmHd )
7724 featherRatio = 5;
7725 else if( !isUkosabihsMotion && isMovingImage )
7726 featherRatio = 2;
7727 else
7728 featherRatio = 4;
7729
7730 if((exactFeatherCnt > 0x20)&&( exactFeatherCnt > (_hpfHdCntReport*featherRatio)))
7731 {
7732 if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7733 HD_ConfirmCnt = 0xFF;
7734 else
7735 HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7736 }
7737 else
7738 {
7739 if(HD_ConfirmCnt < 1)
7740 HD_ConfirmCnt = 0;
7741 else
7742 HD_ConfirmCnt = HD_ConfirmCnt - 1;
7743 }
7744
7745 if( HD_ConfirmCnt > 0x80 )
7746 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7747 else
7748 HD_ConfirmCnt_Reg = 0;
7749
7750 HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7751
7752 if( HD_ConfirmCnt_Reg > 0x3F )
7753 HD_ConfirmCnt_Reg = 0x3F;
7754
7755 if( cplxLumaPatch )
7756 {
7757 HD_ConfirmCnt_Reg_post = 0;
7758 }
7759 else if( isWithoutHsignal )
7760 {
7761 HD_ConfirmCnt_Reg_post = 0;
7762 }
7763 else if( (isHBurst || isHBurstMoving || isUkosabihsMotion ) && HD_ConfirmCnt_Reg != 0 )
7764 {
7765 if( HD_ConfirmCnt_Reg_post < 8 )
7766 HD_ConfirmCnt_Reg_post = 0;
7767 else
7768 HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7769 }
7770 else if( u8MaxPixel < 25 && HD_ConfirmCnt_Reg != 0 )
7771 {
7772 if( HD_ConfirmCnt_Reg_post < 8 )
7773 HD_ConfirmCnt_Reg_post = 0;
7774 else
7775 HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg_post - 8;
7776 }
7777 else
7778 HD_ConfirmCnt_Reg_post = HD_ConfirmCnt_Reg;
7779
7780 //121 weight
7781
7782 MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg_post, 0x001F);
7783
7784 }
7785
MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void)7786 void MDrv_SC_Edison_NEW_SDHD_DETECT_driver(void)
7787 {
7788 MS_U32 HDcnt_Act = 0;
7789 MS_U32 FeatherCnt = 0;
7790 MS_U32 SDcnt_Act = 0;
7791 MS_U32 NEW_FeatherCnt = 0;
7792 MS_U32 HD_ConfirmCnt_Reg = 0;
7793
7794 static MS_U32 PreHDcnt_Act = 0;
7795 static MS_U32 PreSDcnt_Act = 0;
7796 static MS_U32 PreFeatherCnt = 0;
7797 static MS_U32 PreNEW_FeatherCnt = 0;
7798 static MS_U16 HD_ConfirmCnt = 0;//0xFF; // 0x7FFF == 0
7799
7800 HDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7801 HDcnt_Act = ( PreHDcnt_Act*3 + HDcnt_Act ) >> 2;
7802 PreHDcnt_Act = HDcnt_Act;
7803
7804 SDcnt_Act = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7805 SDcnt_Act = ( PreSDcnt_Act*3 + SDcnt_Act ) >> 2;
7806 PreSDcnt_Act = SDcnt_Act;
7807
7808 FeatherCnt = MApi_XC_R2BYTE(REG_SC_BK23_56_L); //New add for A1 chip
7809 FeatherCnt = ( PreFeatherCnt*3 + FeatherCnt ) >> 2;
7810 PreFeatherCnt = FeatherCnt;
7811
7812 NEW_FeatherCnt = (MApi_XC_R2BYTE(REG_SC_BK23_6D_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK23_6C_L);
7813 NEW_FeatherCnt = ( PreNEW_FeatherCnt*3 + NEW_FeatherCnt ) >> 2;
7814 PreNEW_FeatherCnt = NEW_FeatherCnt;
7815
7816 if( (NEW_FeatherCnt > 0x80) && (SDcnt_Act > 0x1800) && (NEW_FeatherCnt < 0xF00) && (HDcnt_Act < 0x3000))
7817 {
7818 if(HD_ConfirmCnt > (0xFF - SD_SPEED))
7819 HD_ConfirmCnt = 0xFF;
7820 else
7821 HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
7822 }
7823 else
7824 {
7825 if(HD_ConfirmCnt < 1)
7826 HD_ConfirmCnt = 0;
7827 else
7828 HD_ConfirmCnt = HD_ConfirmCnt - 1;
7829 }
7830
7831 if( HD_ConfirmCnt > 0x80 )
7832 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x80;
7833 else
7834 HD_ConfirmCnt_Reg = 0;
7835
7836 HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
7837
7838 if( HD_ConfirmCnt_Reg > 0x3F )
7839 HD_ConfirmCnt_Reg = 0x3F;
7840
7841 //121 weight
7842 MApi_XC_W2BYTEMSK(REG_SC_BK23_54_L, (MS_U16)HD_ConfirmCnt_Reg, 0x003F);
7843 }
7844
7845 #define TIMEID_hpfTolerantReport 2
MDrv_SC_hpfTolerantReport(const MS_U8 _timeSharingID,const XC_HpfDefaultRegSetting defaultReg,MS_U32 * _hpfHdTolerantReport,const MS_U8 timingSegment)7846 MS_U32 MDrv_SC_hpfTolerantReport( const MS_U8 _timeSharingID, const XC_HpfDefaultRegSetting defaultReg, MS_U32 *_hpfHdTolerantReport, const MS_U8 timingSegment )
7847 {
7848 static MS_U32 _return_sd = 0;
7849 static MS_U32 _return_hd = 0;
7850
7851 if( _timeSharingID == TIMEID_hpfTolerantReport )
7852 {
7853 if( timingSegment == 0 )
7854 {
7855 MDrv_SC_hpfDefaultRelod( defaultReg );
7856 //else if( timingSegment == 1 ) /* Set Regiater */
7857 //{
7858
7859 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x0100, 0xFFFF);
7860 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<12, 0x7000);
7861
7862 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0280, 0xFFFF); /*for HD repot*/
7863 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x06)<<8, 0x0700); /*for HD repot*/
7864
7865 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0000 , 0x003F); /* underflow */
7866 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3F00, 0x3F00); /* overflow */
7867 }
7868 else if ( timingSegment > 1)
7869 {
7870 _return_sd = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7871
7872 _return_hd = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7873
7874
7875 }
7876 }
7877 else
7878 {
7879 //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold, 0xFFFF);
7880 //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD1_det_mode_shift)<<12, 0x7000);
7881
7882 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF); /*for HD repot*/
7883 //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7884
7885 //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, defaultReg.HDSDD_underflow_threshold , 0x003F); /* underflow */
7886 //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, (defaultReg.HDSDD_overflow_threshold)<<8, 0x3F00); /* overflow */
7887 }
7888
7889 *_hpfHdTolerantReport = _return_hd;
7890
7891 return _return_sd;
7892 }
7893
7894 #define TIMEID_dynamicHDfilterBaseReport 1
MDrv_SC_dynamicHDfilterBaseReport(const MS_U8 _timeSharingID,const MS_U32 u32MotionValue,const MS_BOOL isUkosabihsMv0,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)7895 MS_U32 MDrv_SC_dynamicHDfilterBaseReport( const MS_U8 _timeSharingID, const MS_U32 u32MotionValue, const MS_BOOL isUkosabihsMv0, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 timingSegment )
7896 {
7897
7898 MS_BOOL isStillImage = ( u32MotionValue < 10 ) ? true : false;
7899 MS_U32 hdRepot= 0;
7900 static MS_U32 _return = 0;
7901
7902 if( _timeSharingID == TIMEID_dynamicHDfilterBaseReport )
7903 {
7904 if( timingSegment == 0 )
7905 {
7906 MDrv_SC_hpfDefaultRelod( defaultReg );
7907 //else if( timingSegment == 1 ) /* Set Regiater */
7908 //{
7909 if( ( isUkosabihsMv0 && isStillImage) )
7910 {
7911 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0100, 0xFFFF);
7912 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x02)<<8, 0x0700);
7913 }
7914 else
7915 {
7916 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7917 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7918 }
7919 }
7920 else if ( timingSegment > 1)
7921 {
7922 hdRepot = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7923
7924 _return = hdRepot;
7925 }
7926 }
7927 else
7928 {
7929 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold, 0xFFFF); /*for HD repot*/
7930 //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (defaultReg.HDSDD0_det_mode_shift)<<8, 0x0700); /*for HD repot*/
7931 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x0190, 0xFFFF);
7932 //MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, (0x04)<<8, 0x0700);
7933 }
7934 return _return;
7935 }
7936
7937 #define TIMEID_FilterBaseReport 0
MDrv_SC_SDHD_FilterBaseReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment,MS_U32 * hdNactCntRet)7938 MS_U8 MDrv_SC_SDHD_FilterBaseReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 timingSegment , MS_U32 *hdNactCntRet )
7939 {
7940 MS_U8 u8Luma = 0;
7941 MS_U16 u16MinPixel = 0,u16MaxPixel = 0, MaxMinPixel = 0;
7942 static MS_U32 HDcnt_Act = 0, hdNactCnt = 0;
7943 static MS_U32 SDcnt_Act = 0;
7944 MS_U32 HDcnt_Act_Cur = 0;
7945 MS_U32 SDcnt_Act_Cur = 0;
7946 MS_U32 hdNactCntCur;
7947 static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
7948 static MS_U8 u8PrevLuma = 0;
7949 static MS_U16 u16PrevMinPixel = 0;
7950 static MS_U16 u16PrevMaxPixel = 0;
7951 MS_U32 HD_ConfirmCnt_Reg = 0;
7952 MS_U32 HDSDD_Det_threshold = 0;
7953 static MS_U8 _return = 0;
7954
7955 if( _timeSharingID == TIMEID_FilterBaseReport )
7956 {
7957 if( timingSegment == 0 )
7958 {
7959 MDrv_SC_hpfDefaultRelod( defaultReg );
7960 //else if( timingSegment == 1 ) /* Set Regiater */
7961 //{
7962 u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
7963 // int AVG_LUMA = MApi_XC_DLC_GetAverageValue();
7964 u8PrevLuma = u8Luma;
7965
7966 u16MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF); //Register move to UFSC in Maserati
7967 u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
7968 u16PrevMaxPixel = u16MaxPixel;
7969
7970 u16MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8; //Register move to UFSC in Maserati
7971 u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
7972 u16PrevMinPixel = u16MinPixel;
7973
7974 MaxMinPixel = u16MaxPixel - u16MinPixel;
7975
7976 if(u8Luma>=0xFF)
7977 u8Luma = 0xFF;
7978
7979 HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
7980
7981 if(HDSDD_Det_threshold >=0xFFFF)
7982 HDSDD_Det_threshold=0xFFFF;
7983
7984 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
7985 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
7986 }
7987 else if( timingSegment == 1 )
7988 {
7989
7990 }
7991 else /* Run */
7992 {
7993 HDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
7994 SDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
7995 hdNactCntCur = (MApi_XC_R2BYTE(REG_SC_BK02_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_78_L)
7996 + (MApi_XC_R2BYTE(REG_SC_BK82_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK82_78_L);
7997
7998 //printf("PQ_LSE: MDrv_SC_SDHD_FilterBaseReport, HDcnt_Act_Cur = %d SDcnt_Act_Cur = %d hdNactCntCur = %d \n",HDcnt_Act_Cur,SDcnt_Act_Cur,hdNactCntCur);
7999
8000 HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act) >> 1;
8001 SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act) >> 1;
8002
8003 *_hpfHdCntReport = HDcnt_Act;
8004 *_hpfSdCntReport = SDcnt_Act;
8005 *hdNactCntRet = hdNactCnt = (hdNactCntCur+ hdNactCnt) >> 1;
8006
8007 if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8008 {
8009 if(HD_ConfirmCnt < HD_SPEED)
8010 HD_ConfirmCnt = 0;
8011 else
8012 HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8013 }
8014 else if( SDcnt_Act != 0 )
8015 {
8016 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8017 HD_ConfirmCnt = 0x80;
8018 else
8019 HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8020 }
8021 else
8022 {
8023 if(HD_ConfirmCnt < 1)
8024 HD_ConfirmCnt = 0;
8025 else
8026 HD_ConfirmCnt = HD_ConfirmCnt - 1;
8027 }
8028
8029 if( HD_ConfirmCnt > 0x20 )
8030 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8031 else
8032 HD_ConfirmCnt_Reg = 0;
8033
8034 HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8035
8036 if( HD_ConfirmCnt_Reg > 0x3F )
8037 HD_ConfirmCnt_Reg = 0x3F;
8038
8039 _return = HD_ConfirmCnt_Reg;
8040 }
8041 }
8042 else
8043 {
8044 // return to the original condition
8045 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8046 //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8047 }
8048
8049 return _return;
8050 }
MDrv_UFSC_PQ_2DPK(int menuW,MS_U16 sdw,MS_U16 fhdw,MS_U32 srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)8051 void MDrv_UFSC_PQ_2DPK(int menuW, MS_U16 sdw, MS_U16 fhdw , MS_U32 srEnhStr ,XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
8052 {
8053
8054 MS_U8 u8Ufsc2DPKfinalGain;
8055 MS_U8 u8FHDfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_13_L) >>8)&0x7F;
8056 MS_U8 u8HDfnlGain = 0 ;
8057 MS_U8 u8ArtificialfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_1A_L) >> 8)&0x7F;
8058 MS_U8 u8OsdfnlGain = ( MDrv_Read2Byte(REG_FSC_BK30_16_L) >> 8)&0x7F;
8059
8060 u8Ufsc2DPKfinalGain = ( fhdw*u8FHDfnlGain + (256-fhdw)*u8HDfnlGain )/256;
8061 u8Ufsc2DPKfinalGain = ( menuW*u8OsdfnlGain + (256-menuW)*u8Ufsc2DPKfinalGain) >>8;
8062 u8Ufsc2DPKfinalGain = ( u16ArtiW*u8ArtificialfnlGain + (256-u16ArtiW)*u8Ufsc2DPKfinalGain)>>8;
8063 u8Ufsc2DPKfinalGain = (u8Ufsc2DPKfinalGain* srEnhStr )>>5;
8064 PqWriteReg->UFSCPk2DfinalGain = u8Ufsc2DPKfinalGain;
8065
8066
8067 MS_U8 u8Ufsc2dpkHdGainFhdPtn = MDrv_Read2Byte(REG_FSC_BK30_14_L)&0x1F; //0x08;
8068 MS_U8 u8Ufsc2dpkHdGainHdPtn = (MDrv_Read2Byte(REG_FSC_BK30_14_L)>>8)&0x1F; //0x00;
8069 MS_U8 u8Ufsc2dpkHdGainSdPtn = MDrv_Read2Byte(REG_FSC_BK30_15_L)&0x1F ; //0x10;
8070
8071 MS_U8 u8Ufsc2dpkHdGain;
8072 u8Ufsc2dpkHdGain = ( u8Ufsc2dpkHdGainHdPtn*(256-fhdw) + u8Ufsc2dpkHdGainFhdPtn*fhdw )>>8;
8073 u8Ufsc2dpkHdGain = ( u8Ufsc2dpkHdGain*(256-sdw) + u8Ufsc2dpkHdGainSdPtn*sdw )>>8;
8074 u8Ufsc2dpkHdGain = __minmax(u8Ufsc2dpkHdGain , 0 , 0x1F);
8075
8076 MApi_XC_Write2ByteMask( REG_FSC_BK5F_62_L, u8Ufsc2dpkHdGain , 0x001F );
8077 }
MDrv_SC_2DPK_PQ(MS_U16 sdw,MS_U16 fhdw,MS_U32 srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)8078 void MDrv_SC_2DPK_PQ(MS_U16 sdw, MS_U16 fhdw , MS_U32 srEnhStr ,XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
8079 {
8080 MS_U8 u8SdGain = MDrv_Read2Byte(REG_FSC_BK30_20_L)&0xFF;
8081 MS_U8 u8FhdGain = MDrv_Read2Byte(REG_FSC_BK30_20_L)>>8;
8082 MS_U8 u8HdGain = MDrv_Read2Byte(REG_FSC_BK30_21_L)&0xFF;
8083 MS_U8 u8SCArtificialfnlGain = MDrv_Read2Byte(REG_FSC_BK30_1A_L)&0x7F;
8084 MS_U8 u8HdFhdGainBld;
8085 MS_U16 u16FinalGainBld;
8086
8087 u8HdFhdGainBld = ( fhdw*u8FhdGain + (256-fhdw)*u8HdGain )/256;
8088 u16FinalGainBld = ( sdw*u8SdGain + (256-sdw)*u8HdFhdGainBld )/256;
8089 u16FinalGainBld = ( u16ArtiW*u8SCArtificialfnlGain + (256-u16ArtiW)*u16FinalGainBld)>>8;
8090 u16FinalGainBld = ( u16FinalGainBld * srEnhStr )>>5;
8091 u16FinalGainBld = __minmax(u16FinalGainBld,0,127); //7bit gain
8092 PqWriteReg->Pk2DfinalGain = u16FinalGainBld;
8093
8094 //printf("Eva: SDGain = %d , FhdGain = %d , HdGain = %d FHDbld = %d finalBld = %d\n",u8SdGain,u8FhdGain,u8HdGain,u8HdFhdGainBld,u16FinalGainBld);
8095 //u16FinalGainBld = u16FinalGainBld << 8;
8096 //MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, u16FinalGainBld , 0xFF00);
8097
8098 }
8099
MDrv_UFSC_PQ_SPNN(int menuW,int edgePatW,int srEnhStr,int sdW2,int fHdW2,XC_PqWriteReg * PqWriteReg)8100 void MDrv_UFSC_PQ_SPNN( int menuW, int edgePatW, int srEnhStr , int sdW2 , int fHdW2 ,XC_PqWriteReg *PqWriteReg)
8101 {
8102 MS_U8 u8ReduceW = __max(menuW,edgePatW);
8103 MS_U8 u8SpnnLgain = ( fHdW2*0x06 + (256-fHdW2)*0x08 ) >>8 ;
8104 u8SpnnLgain = (u8SpnnLgain*srEnhStr) >> 5;
8105 u8SpnnLgain = u8SpnnLgain*( 256 - u8ReduceW ) >> 8;
8106 u8SpnnLgain = (u8SpnnLgain*srEnhStr)>>5;
8107 PqWriteReg-> SPNNGL = u8SpnnLgain;
8108
8109 MS_U8 u8SpnnHgain = 0x04;
8110 u8SpnnHgain = u8SpnnHgain*( 256 - u8ReduceW ) >> 8;
8111 u8SpnnHgain = (u8SpnnHgain*srEnhStr)>>5;
8112 PqWriteReg-> SPNNGH = u8SpnnHgain;
8113
8114
8115 //MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u8SpnnLgain , 0x001F );
8116 //MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u8SpnnHgain <<8 , 0x1F00 );
8117 }
MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(XC_PqWriteReg * PqWriteReg,MS_U8 u8UFSCCtrl3,MS_U8 ENABLE_SR_DRIVER)8118 void MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(XC_PqWriteReg *PqWriteReg , MS_U8 u8UFSCCtrl3 ,MS_U8 ENABLE_SR_DRIVER)
8119 {
8120 #define maserati_2dpk_side_effect_issue
8121 #define UI_LINK_ALL_IP //for when UI bypass(=0) It looked still has enhancement
8122 //UI Sharpness control register
8123 MS_U8 u8UISharpnessGain = MDrv_Read2Byte(REG_FSC_BK30_11_L)&0xFF;
8124 // re-mapping 0~63 to 0~100 center: 0x1A : 50
8125 MS_U8 min_ui = 0;
8126 MS_U8 max_ui = 63;
8127 MS_U8 center_ui = 0x1A;
8128 //u8UISharpnessGain = minmax( u8UISharpnessGain - center_ui , min_ui - center_ui , max_ui - center_ui);
8129
8130 //re-mapping 0~63 to 0~128 center: 0x1A : 64
8131 MS_U8 u8Mode = (MDrv_Read2Byte(REG_FSC_BK30_10_L)>>7)&0x01;
8132
8133 if(u8Mode == 0){
8134 if(u8UISharpnessGain < center_ui)
8135 u8UISharpnessGain = (64*(u8UISharpnessGain - min_ui))/(center_ui-min_ui);
8136 else
8137 u8UISharpnessGain = 64 + (64*(u8UISharpnessGain - center_ui)/(max_ui - center_ui));
8138 }
8139 else if(u8Mode == 1)
8140 u8UISharpnessGain = (64-center_ui) + u8UISharpnessGain ;
8141
8142 u8UISharpnessGain = __minmax(u8UISharpnessGain , 0 , 128);
8143
8144 MS_U8 u8SharpnessFor2DPK;
8145 #ifdef maserati_2dpk_side_effect_issue
8146 u8SharpnessFor2DPK = __minmax( u8UISharpnessGain , 0 , 64 ); //soc 2dpk only can decrease strength for hw issue
8147 #else
8148 u8SharpnessFor2DPK = u8UISharpnessGain;
8149 #endif
8150
8151
8152 //2DPK write final gain register
8153 /*MS_U16 u16Pk2DFinalGain = PqWriteReg-> Pk2DfinalGain;
8154 MS_U32 posGain = PqWriteReg-> P3x3pkPosfinalGain;
8155 MS_U32 negGain = PqWriteReg-> P3x3pkNegfinalGain;*/
8156 MS_U16 u16Pk2DFinalGain,u16ErcEdgeG,u16ErcDetailG2,u16ErcDetailG3,u16NlmGain,u16UfscPk2DFinalGain ;
8157 MS_U32 posGain,negGain;
8158 MS_U16 u16SpnnLG, u16SpnnHG;
8159
8160 MS_U16 u16LdefinalGain,u16LdefinalGainH,u16Prepk3x3finalGain,u16P2mfinalGain;
8161
8162
8163 /***** for DS FSC SD pattern too weak issue *****/
8164 /*MS_BOOL ds_sd_enhance_disable = (MDrv_Read2Byte(REG_FSC_BK30_10_L)>>8)&0x01;
8165 MS_BOOL ip_ds_en = (MApi_XC_R2BYTE(REG_SC_BK1F_10_L)>>9)&0x1;
8166 MS_BOOL op_ds_en = (MApi_XC_R2BYTE(REG_SC_BK1F_10_L)>>11)&0x1;
8167 MS_U16 u16InputHeight = MApi_XC_R2BYTE(REG_SC_BK01_06_L);
8168 MS_U16 u16InputWidth = MApi_XC_R2BYTE(REG_SC_BK01_07_L);
8169 MS_U32 u32TargetResolution = 337; //720*480>>10
8170 MS_U32 u32InputResolution = (u16InputHeight*u16InputWidth)>>10;
8171 u32InputResolution = minmax(u32InputResolution, u32TargetResolution>>2 ,u32TargetResolution);
8172 */
8173 //printf("EVATEST DS_EN = %d %d , W = %d H = %d \n",ip_ds_en,op_ds_en,u16InputWidth,u16InputHeight);
8174 /*if(ip_ds_en == 1 && op_ds_en == 1){
8175 MS_U16 u16DsSC2DPKsdGain;
8176 u16DsSC2DPKsdGain = PqWriteReg->Pk2DfinalGain;
8177 u16DsSC2DPKsdGain = (u16DsSC2DPKsdGain*u32InputResolution)/u32TargetResolution;
8178 PqWriteReg->Pk2DfinalGain = u16DsSC2DPKsdGain;
8179 } */
8180 if( u8UFSCCtrl3 & ENABLE_SR_DRIVER)
8181 {
8182 u16Pk2DFinalGain = PqWriteReg-> Pk2DfinalGain;
8183 posGain = PqWriteReg-> P3x3pkPosfinalGain;
8184 negGain = PqWriteReg-> P3x3pkNegfinalGain;
8185 u16ErcEdgeG = PqWriteReg-> ERCEdgeG;
8186
8187 u16ErcDetailG2 = PqWriteReg-> ERCDetailG2;
8188 u16ErcDetailG3 = PqWriteReg-> ERCDetailG3;
8189 u16NlmGain = PqWriteReg-> NLMGain;
8190 u16SpnnLG = PqWriteReg-> SPNNGL;
8191 u16SpnnHG = PqWriteReg-> SPNNGH;
8192
8193 u16LdefinalGain = PqWriteReg-> LdefinalGain;
8194 u16LdefinalGainH = PqWriteReg-> LdefinalGainH;
8195 u16Prepk3x3finalGain = PqWriteReg-> Prepk3x3finalGain;
8196 u16P2mfinalGain = PqWriteReg-> P2mfinalGain;
8197
8198
8199 /*if(ip_ds_en == 1 && op_ds_en == 1 && ds_sd_enhance_disable != 1){
8200 MS_U16 u16DsSC2DPKsdGain;
8201 u16DsSC2DPKsdGain = u16Pk2DFinalGain;
8202 u16DsSC2DPKsdGain = (u16DsSC2DPKsdGain*u32TargetResolution)/u32InputResolution;
8203 u16Pk2DFinalGain = u16DsSC2DPKsdGain;
8204 }*/
8205
8206 u16Pk2DFinalGain = (u16Pk2DFinalGain*u8SharpnessFor2DPK)>>6;
8207 u16Pk2DFinalGain = __minmax( u16Pk2DFinalGain , 0 , 63 );
8208
8209 u16UfscPk2DFinalGain = PqWriteReg->UFSCPk2DfinalGain;
8210 u16UfscPk2DFinalGain = (u16UfscPk2DFinalGain*u8UISharpnessGain)>>6;
8211 u16UfscPk2DFinalGain = __minmax( u16UfscPk2DFinalGain , 0 , 63 );
8212
8213 posGain = (posGain*u8UISharpnessGain)>>6;
8214 posGain = __minmax(posGain, 0 , 0xFF);
8215 negGain = (negGain*u8UISharpnessGain)>>6;
8216 negGain = __minmax(negGain, 0 , 0xFF);
8217 u16ErcEdgeG = (u16ErcEdgeG*u8UISharpnessGain)>>6;
8218 u16ErcEdgeG = __minmax(u16ErcEdgeG, 0 , 0x003F);
8219
8220 u16ErcDetailG2 = (u16ErcDetailG2*u8UISharpnessGain)>>6;
8221 u16ErcDetailG2 = __minmax(u16ErcDetailG2, 0 , 0x003F);
8222 u16ErcDetailG3 = (u16ErcDetailG3*u8UISharpnessGain)>>6;
8223 u16ErcDetailG3 = __minmax(u16ErcDetailG3, 0 , 0x003F);
8224 u16NlmGain = (u16NlmGain*u8UISharpnessGain)>>6;
8225 u16NlmGain = __minmax(u16NlmGain, 0 , 0x00FF);
8226
8227 u16SpnnLG = (u16SpnnLG*u8UISharpnessGain)>>6;
8228 u16SpnnLG = __minmax(u16SpnnLG, 0 , 0x001F);
8229 u16SpnnHG = (u16SpnnHG*u8UISharpnessGain)>>6;
8230 u16SpnnHG = __minmax(u16SpnnHG, 0 , 0x001F);
8231
8232 #ifdef UI_LINK_ALL_IP
8233 u16LdefinalGain = (u16LdefinalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8234 u16LdefinalGain = __minmax(u16LdefinalGain, 0 , 0x1F);
8235
8236 u16LdefinalGainH = (u16LdefinalGainH * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8237 u16LdefinalGainH = __minmax(u16LdefinalGainH, 0 , 0x1F);
8238
8239 u16Prepk3x3finalGain = (u16Prepk3x3finalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8240 u16Prepk3x3finalGain = __minmax(u16Prepk3x3finalGain, 0 , 0x3F);
8241
8242 u16P2mfinalGain = (u16P2mfinalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8243 u16P2mfinalGain = __minmax(u16P2mfinalGain, 0 , 0x3F);
8244 #endif
8245 //2DPK write final register
8246 u16Pk2DFinalGain = u16Pk2DFinalGain << 8;
8247 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, u16Pk2DFinalGain , 0x7F00);
8248
8249 //Post3x3PK write final gain register
8250 MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
8251 MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
8252
8253 //ERC write register
8254 MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, u16ErcEdgeG<<8, 0x3F00 );
8255 MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG2<<8, 0x3F00 );
8256 MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG3, 0x003F );
8257
8258 //NLM write register
8259 MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, u16NlmGain<<8, 0xFF00 );
8260
8261 //UFSC 2DPK write register
8262 MApi_XC_Write2ByteMask( REG_FSC_BK19_13_L, u16UfscPk2DFinalGain << 8 , 0x7F00);
8263
8264 //SPNN write register
8265 MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnLG , 0x001F );
8266 MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnHG <<8 , 0x1F00 );
8267
8268 //pre_enhance LDE write register
8269 MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGain<<8, 0x1F00 );
8270 MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGainH, 0x001F );
8271
8272 //pre_enhance PK3x3 write register
8273 MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, u16Prepk3x3finalGain, 0x003F );
8274
8275 //P2M write register
8276 MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, u16P2mfinalGain, 0x003F );
8277
8278 }
8279 else
8280 {
8281 u16Pk2DFinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_13_L, 0x003F ) ;//0x20;
8282 u16UfscPk2DFinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_16_L, 0x003F ) ;
8283 posGain = MDrv_Read2ByteMSK( REG_FSC_BK30_12_L, 0x00FF ) ;//0x30;
8284 negGain = MDrv_Read2ByteMSK( REG_FSC_BK30_12_L, 0xFF00 )>>8 ;//0x30;
8285
8286 u16LdefinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3A_L, 0x001F ) ;
8287 u16LdefinalGainH = MDrv_Read2ByteMSK( REG_FSC_BK30_3A_L, 0x1F00 )>>8 ;
8288 u16Prepk3x3finalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3B_L, 0x003F ) ;
8289 u16P2mfinalGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3B_L, 0x3F00 )>>8 ;
8290 u16NlmGain = MDrv_Read2ByteMSK( REG_FSC_BK30_3C_L, 0x00FF ) ;
8291 u16ErcEdgeG = MDrv_Read2ByteMSK( REG_FSC_BK30_3C_L, 0x3F00 )>>8 ;
8292 u16ErcDetailG2 = MDrv_Read2ByteMSK( REG_FSC_BK30_3D_L, 0x003F ) ;
8293 u16ErcDetailG3 = MDrv_Read2ByteMSK( REG_FSC_BK30_3D_L, 0x3F00 )>>8 ;
8294 u16SpnnLG = MDrv_Read2ByteMSK( REG_FSC_BK30_09_L, 0x001F ) ;
8295 u16SpnnHG = MDrv_Read2ByteMSK( REG_FSC_BK30_09_L, 0x1F00 )>>8 ;
8296
8297
8298 /*if(ip_ds_en == 1 && op_ds_en == 1 && ds_sd_enhance_disable != 1){
8299 MS_U16 u16DsSC2DPKsdGain;
8300 u16DsSC2DPKsdGain = u16Pk2DFinalGain;
8301 u16DsSC2DPKsdGain = (u16DsSC2DPKsdGain*u32TargetResolution)/u32InputResolution;
8302 u16Pk2DFinalGain = u16DsSC2DPKsdGain;
8303 }*/
8304 u16Pk2DFinalGain = u16Pk2DFinalGain*u8SharpnessFor2DPK>>6;
8305 u16Pk2DFinalGain = __minmax( u16Pk2DFinalGain , 0 , 63 );
8306
8307 u16UfscPk2DFinalGain = (u16UfscPk2DFinalGain*u8UISharpnessGain)>>6;
8308 u16UfscPk2DFinalGain = __minmax( u16UfscPk2DFinalGain , 0 , 63 );
8309
8310 posGain = posGain*u8UISharpnessGain>>6;
8311 posGain = __minmax(posGain, 0 , 0xFF);
8312 negGain = negGain*u8UISharpnessGain>>6;
8313 negGain = __minmax(negGain, 0 , 0xFF);
8314
8315 //these function only decrease ui sharpness
8316 #ifdef UI_LINK_ALL_IP
8317
8318 u16LdefinalGain =(u16LdefinalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8319 u16LdefinalGainH = (u16LdefinalGainH * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8320 u16Prepk3x3finalGain = (u16Prepk3x3finalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8321 u16P2mfinalGain = (u16P2mfinalGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8322 u16NlmGain = (u16NlmGain * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8323 u16ErcEdgeG = (u16ErcEdgeG * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8324 u16ErcDetailG2 = (u16ErcDetailG2 * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8325 u16ErcDetailG3 = (u16ErcDetailG3 * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8326 u16SpnnLG = (u16SpnnLG * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8327 u16SpnnHG = (u16SpnnHG * __minmax(u8UISharpnessGain,0,64) )>>6; //only decrease can't enhance IP
8328
8329 #endif
8330 //2DPK write final register
8331 u16Pk2DFinalGain = u16Pk2DFinalGain << 8;
8332 MApi_XC_W2BYTEMSK(REG_SC_BK19_13_L, u16Pk2DFinalGain , 0x7F00);
8333
8334 //UFSC 2DPK write register
8335 MApi_XC_Write2ByteMask( REG_FSC_BK19_13_L, u16UfscPk2DFinalGain << 8 , 0x7F00);
8336
8337 //Post3x3PK write final gain register
8338 MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
8339 MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
8340
8341 //pre_enhance LDE write register
8342 MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGain<<8, 0x1F00 );
8343 MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, u16LdefinalGainH, 0x001F );
8344
8345 //pre_enhance PK3x3 write register
8346 MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, u16Prepk3x3finalGain, 0x003F );
8347
8348 //P2M write register
8349 MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, u16P2mfinalGain, 0x003F );
8350
8351
8352 //ERC write register
8353 MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, u16ErcEdgeG<<8, 0x3F00 );
8354 MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG2<<8, 0x3F00 );
8355 MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, u16ErcDetailG3, 0x003F );
8356
8357 //NLM write register
8358 MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, u16NlmGain<<8, 0xFF00 );
8359
8360 //SPNN write register
8361 MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnLG , 0x001F );
8362 MApi_XC_Write2ByteMask( REG_FSC_BK74_41_L, u16SpnnHG <<8 , 0x1F00 );
8363 }
8364
8365
8366 }
8367
8368 #define TIMEID_sdhdFilterBaseReport 4
MDrv_SC_SDHD_U11BaseReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport4,MS_U32 * _hpfSdCntReport4,const MS_U8 timingSegment,MS_U32 * hdNactCntRet4)8369 void MDrv_SC_SDHD_U11BaseReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport4, MS_U32 *_hpfSdCntReport4, const MS_U8 timingSegment , MS_U32 *hdNactCntRet4 )
8370 {
8371 static MS_U32 HDcnt_Act = 0, hdNactCnt = 0;
8372 static MS_U32 SDcnt_Act = 0;
8373 MS_U32 HDcnt_Act_Cur = 0;
8374 MS_U32 SDcnt_Act_Cur = 0;
8375 MS_U32 hdNactCntCur;
8376 static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
8377 MS_U32 HD_ConfirmCnt_Reg = 0;
8378 //static MS_U8 _return = 0;
8379
8380 if( _timeSharingID == TIMEID_sdhdFilterBaseReport )
8381 {
8382 if( timingSegment == 0 )
8383 {
8384 //MDrv_SC_hpfDefaultRelod( defaultReg );
8385
8386 MS_U16 TH1 = MDrv_Read2Byte(REG_FSC_BK30_24_L);
8387 MS_U16 TH2 = MDrv_Read2Byte(REG_FSC_BK30_25_L);
8388 MS_U16 TH3 = MDrv_Read2Byte(REG_FSC_BK30_26_L);
8389 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x4411, 0xFFFF);
8390 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, 0x00C8, 0xFFFF);
8391 //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, 0x00C8, 0xFFFF);
8392 //MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x0814, 0xFFFF);
8393 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, TH1, 0xFFFF);
8394 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, TH2, 0xFFFF);
8395 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, TH3, 0xFFFF);
8396 MApi_XC_W2BYTEMSK(REG_SC_BK02_7F_L, 0x0030, 0xFFFF);
8397
8398 }
8399 else if( timingSegment == 1 )
8400 {
8401
8402 }
8403 else /* Run */
8404 {
8405 HDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8406 SDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8407 hdNactCntCur = (MApi_XC_R2BYTE(REG_SC_BK02_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_78_L)
8408 + (MApi_XC_R2BYTE(REG_SC_BK82_79_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK82_78_L);
8409
8410 //printf("PQ_LSE: MY MDrv_SC_SDHD_FilterBaseReport, HDcnt_Act_Cur = %d SDcnt_Act_Cur = %d hdNactCntCur = %d \n",HDcnt_Act_Cur,SDcnt_Act_Cur,hdNactCntCur);
8411
8412 HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act) >> 1;
8413 SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act) >> 1;
8414
8415 *_hpfHdCntReport4 = HDcnt_Act;
8416 *_hpfSdCntReport4 = SDcnt_Act;
8417 *hdNactCntRet4 = hdNactCnt = (hdNactCntCur+ hdNactCnt) >> 1;
8418
8419 if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8420 {
8421 if(HD_ConfirmCnt < HD_SPEED)
8422 HD_ConfirmCnt = 0;
8423 else
8424 HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8425 }
8426 else if( SDcnt_Act != 0 )
8427 {
8428 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8429 HD_ConfirmCnt = 0x80;
8430 else
8431 HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8432 }
8433 else
8434 {
8435 if(HD_ConfirmCnt < 1)
8436 HD_ConfirmCnt = 0;
8437 else
8438 HD_ConfirmCnt = HD_ConfirmCnt - 1;
8439 }
8440
8441 if( HD_ConfirmCnt > 0x20 )
8442 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8443 else
8444 HD_ConfirmCnt_Reg = 0;
8445
8446 HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8447
8448 if( HD_ConfirmCnt_Reg > 0x3F )
8449 HD_ConfirmCnt_Reg = 0x3F;
8450
8451 //_return = HD_ConfirmCnt_Reg;
8452 }
8453 }
8454
8455
8456 //return _return;
8457 }
8458
8459 #define TIMEID_FilterOneReport 3
MDrv_SC_SDHD_FilterOneReport(const MS_U8 _timeSharingID,MS_U32 * _hpfHdCntReport,MS_U32 * _hpfSdCntReport,const XC_HpfDefaultRegSetting defaultReg,const MS_U8 timingSegment)8460 MS_U8 MDrv_SC_SDHD_FilterOneReport( const MS_U8 _timeSharingID, MS_U32 *_hpfHdCntReport, MS_U32 *_hpfSdCntReport, const XC_HpfDefaultRegSetting defaultReg, const MS_U8 timingSegment )
8461 {
8462 MS_U8 u8Luma;
8463 MS_U16 u16MinPixel,u16MaxPixel, MaxMinPixel;
8464 static MS_U32 HDcnt_Act = 0;
8465 static MS_U32 SDcnt_Act = 0;
8466 MS_U32 HDcnt_Act_Cur;
8467 MS_U32 SDcnt_Act_Cur;
8468 static MS_U16 HD_ConfirmCnt = 0;//xFF; // 0x7FFF == 0
8469 static MS_U8 u8PrevLuma = 0;
8470 static MS_U16 u16PrevMinPixel = 0;
8471 static MS_U16 u16PrevMaxPixel = 0;
8472 MS_U32 HD_ConfirmCnt_Reg;
8473 MS_U32 HDSDD_Det_threshold;
8474 static MS_U8 _return = 0;
8475
8476 if( _timeSharingID == TIMEID_FilterOneReport )
8477 {
8478 if( timingSegment == 0 )
8479 {
8480 MDrv_SC_hpfDefaultRelod( defaultReg );
8481 u8Luma=(MS_U32)((MS_U32)u8PrevLuma*3 + MApi_XC_DLC_GetAverageValue())>>2;
8482
8483 u8PrevLuma = u8Luma;
8484
8485 u16MaxPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0x00FF); //move to UFSC in Maserati
8486 u16MaxPixel = (u16PrevMaxPixel*3 + u16MaxPixel ) >> 2;
8487 u16PrevMaxPixel = u16MaxPixel;
8488
8489 u16MinPixel = MDrv_Read2ByteMSK(REG_FSC_BK1A_0B_L, 0xFF00)>>8; //move to UFSC in Maserati
8490 u16MinPixel = (u16PrevMinPixel*3 + u16MinPixel ) >> 2;
8491 u16PrevMinPixel = u16MinPixel;
8492
8493 MaxMinPixel = u16MaxPixel - u16MinPixel;
8494
8495 if(u8Luma>=0xFF)
8496 u8Luma = 0xFF;
8497
8498 HDSDD_Det_threshold = ((MaxMinPixel*6)>>2) + ((u8Luma*5)>>2);
8499
8500 if(HDSDD_Det_threshold >=0xFFFF)
8501 HDSDD_Det_threshold=0xFFFF;
8502
8503 MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, (MS_U16)HDSDD_Det_threshold, 0xFFFF);
8504 MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, (MS_U16)(HDSDD_Det_threshold>>1), 0xFFFF);
8505
8506 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x1000, 0x7000);
8507 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0100, 0x0700); /*for HD repot*/
8508
8509 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0001); /* mode */
8510 MApi_XC_W2BYTEMSK(REG_SC_BK02_70_L, 0x0000 , 0x0010); /* mode */
8511
8512
8513 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x000C, 0x003F); /* underflow */
8514 MApi_XC_W2BYTEMSK(REG_SC_BK02_73_L, 0x3200, 0x3F00); /* overflow */
8515
8516
8517 }
8518 else if( timingSegment == 1 )
8519 {
8520
8521 }
8522 else /* Run */
8523 {
8524 HDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8525 SDcnt_Act_Cur = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8526
8527 HDcnt_Act = (HDcnt_Act_Cur+ HDcnt_Act*3) >> 2;
8528 SDcnt_Act = (SDcnt_Act_Cur+ SDcnt_Act*3) >> 2;
8529
8530 *_hpfHdCntReport = HDcnt_Act;
8531 *_hpfSdCntReport = SDcnt_Act;
8532
8533
8534 if( (HDcnt_Act > HD_ACT_TH) && (SDcnt_Act != 0) )
8535 {
8536 if(HD_ConfirmCnt < HD_SPEED)
8537 HD_ConfirmCnt = 0;
8538 else
8539 HD_ConfirmCnt = HD_ConfirmCnt - HD_SPEED;
8540 }
8541 else if( SDcnt_Act != 0 )
8542 {
8543 if(HD_ConfirmCnt > (0x80 - SD_SPEED))
8544 HD_ConfirmCnt = 0x80;
8545 else
8546 HD_ConfirmCnt = HD_ConfirmCnt + SD_SPEED;
8547 }
8548 else
8549 {
8550 if(HD_ConfirmCnt < 1)
8551 HD_ConfirmCnt = 0;
8552 else
8553 HD_ConfirmCnt = HD_ConfirmCnt - 1;
8554 }
8555
8556 if( HD_ConfirmCnt > 0x20 )
8557 HD_ConfirmCnt_Reg = HD_ConfirmCnt - 0x20;
8558 else
8559 HD_ConfirmCnt_Reg = 0;
8560
8561 HD_ConfirmCnt_Reg = (HD_ConfirmCnt_Reg*HDSDD_SPEED) >> HDSDD_DIV;
8562
8563 if( HD_ConfirmCnt_Reg > 0x3F )
8564 HD_ConfirmCnt_Reg = 0x3F;
8565
8566 _return = HD_ConfirmCnt_Reg;
8567 }
8568 }
8569 else
8570 {
8571 // return to the original condition
8572 //MApi_XC_W2BYTEMSK(REG_SC_BK02_71_L, defaultReg.HDSDD0_det_mode_threshold , 0xFFFF);
8573 //MApi_XC_W2BYTEMSK(REG_SC_BK02_72_L, defaultReg.HDSDD1_det_mode_threshold , 0xFFFF);
8574 }
8575
8576 return _return;
8577 }
8578
MDrv_SC_Edison_NEW_SDHD_DETECT_report(void)8579 MS_U8 MDrv_SC_Edison_NEW_SDHD_DETECT_report(void)
8580 {
8581 MS_U32 HDcnt_Act[5] = {0,0,0,0,0};
8582 MS_U32 SDcnt_Act[5] = {0,0,0,0,0};
8583 MS_U32 FeatherCnt[5] = {0,0,0,0,0};
8584 MS_U32 SDcnt_NonAct[5] = {0,0,0,0,0};
8585 static MS_U32 HDcnt_Act_prv[5] = {0,0,0,0,0};
8586 static MS_U32 SDcnt_Act_prv[5] = {0,0,0,0,0};
8587 static MS_U32 FeatherCnt_prv[5] = {0,0,0,0,0};
8588 static MS_U32 SDcnt_NonAct_prv[5] = {0,0,0,0,0};
8589 static MS_U8 SD2HD_CNT = 0;
8590 static MS_U16 HD_ConfirmCnt[5] = {0,0,0,0,0};//xFF;
8591 static MS_U32 HD_ConfirmCnt_Reg[5] = {0,0,0,0,0};
8592 static MS_U32 HD_ConfirmCnt_Reg_f_prv = 0;
8593 MS_U32 HD_ConfirmCnt_Reg_f = 0;
8594
8595 if( SD2HD_CNT == 0 )
8596 {
8597 //empty stage
8598 }
8599 else if( SD2HD_CNT == 1 )
8600 {
8601 //Detect corner logo
8602 //left-side
8603 HDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8604 SDcnt_Act[0] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8605 SDcnt_NonAct[0] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8606 FeatherCnt[0] = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8607
8608 //IIR result
8609 HDcnt_Act[0] = (HDcnt_Act_prv[0]*3 + HDcnt_Act[0])/4;
8610 SDcnt_Act[0] = (SDcnt_Act_prv[0]*3 + SDcnt_Act[0])/4;
8611 SDcnt_NonAct[0] = (SDcnt_NonAct_prv[0]*3 + SDcnt_NonAct[0])/4;
8612 FeatherCnt[0] = (FeatherCnt_prv[0]*3 + FeatherCnt[0])/4;
8613 HDcnt_Act_prv[0] = HDcnt_Act[0];
8614 SDcnt_Act_prv[0] = SDcnt_Act[0];
8615 SDcnt_NonAct_prv[0] = SDcnt_NonAct[0];
8616 FeatherCnt_prv[0] = FeatherCnt[0];
8617
8618 if((HDcnt_Act[0] > HD_ACT_TH) && (SDcnt_Act[0] != 0)) //debugging
8619 {
8620 if(HD_ConfirmCnt[0] < HD_SPEED*5)
8621 HD_ConfirmCnt[0] = 0;
8622 else
8623 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - HD_SPEED*5;
8624 }
8625 else if( SDcnt_Act[0] != 0 ) //w/o consider feathering
8626 {
8627 if(HD_ConfirmCnt[0] > (0xFF - SD_SPEED*5))
8628 HD_ConfirmCnt[0] = 0xFF;
8629 else
8630 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] + SD_SPEED*5;
8631 }
8632 else
8633 {
8634 if(HD_ConfirmCnt[0] < 1)
8635 HD_ConfirmCnt[0] = 0;
8636 else
8637 HD_ConfirmCnt[0] = HD_ConfirmCnt[0] - 1;
8638 }
8639
8640 if( HD_ConfirmCnt[0] > 0x80 )
8641 HD_ConfirmCnt_Reg[0] = HD_ConfirmCnt[0] - 0x80;
8642 else
8643 HD_ConfirmCnt_Reg[0] = 0;
8644
8645 HD_ConfirmCnt_Reg[0] = (HD_ConfirmCnt_Reg[0]*HDSDD_SPEED) >> HDSDD_DIV;
8646
8647 if( HD_ConfirmCnt_Reg[0] > 0x3F )
8648 HD_ConfirmCnt_Reg[0] = 0x3F;
8649
8650 //for SD2HD_CNT == 2 window size
8651 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 480, 0x1FFF);
8652 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1440, 0x1FFF);
8653 }
8654 else if( SD2HD_CNT == 2 )
8655 {
8656 //empty stage
8657 }
8658 else if( SD2HD_CNT == 3 )
8659 {
8660 HDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8661 SDcnt_Act[1] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8662 SDcnt_NonAct[1] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8663 FeatherCnt[1] = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8664
8665 //IIR result
8666 HDcnt_Act[1] = (HDcnt_Act_prv[1]*3 + HDcnt_Act[1])/4;
8667 SDcnt_Act[1] = (SDcnt_Act_prv[1]*3 + SDcnt_Act[1])/4;
8668 SDcnt_NonAct[1] = (SDcnt_NonAct_prv[1]*3 + SDcnt_NonAct[1])/4;
8669 FeatherCnt[1] = (FeatherCnt_prv[1]*3 + FeatherCnt[1])/4;
8670 HDcnt_Act_prv[1] = HDcnt_Act[1];
8671 SDcnt_Act_prv[1] = SDcnt_Act[1];
8672 SDcnt_NonAct_prv[1] = SDcnt_NonAct[1];
8673 FeatherCnt_prv[1] = FeatherCnt[1];
8674
8675 if( (HDcnt_Act[1] > HD_ACT_TH) && (SDcnt_Act[1] != 0) )
8676 {
8677 if(HD_ConfirmCnt[1] < HD_SPEED*5)
8678 HD_ConfirmCnt[1] = 0;
8679 else
8680 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - HD_SPEED*5;
8681
8682 }
8683 else if( SDcnt_Act[1] != 0 ) //w/o consider feathering
8684 {
8685 if(HD_ConfirmCnt[1] > (0xFF - SD_SPEED*5))
8686 HD_ConfirmCnt[1] = 0xFF;
8687 else
8688 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] + SD_SPEED*5;
8689 }
8690 else
8691 {
8692 if(HD_ConfirmCnt[1] < 1)
8693 HD_ConfirmCnt[1] = 0;
8694 else
8695 HD_ConfirmCnt[1] = HD_ConfirmCnt[1] - 1;
8696 }
8697
8698 if( HD_ConfirmCnt[1] > 0x80 )
8699 HD_ConfirmCnt_Reg[1] = HD_ConfirmCnt[1] - 0x80;
8700 else
8701 HD_ConfirmCnt_Reg[1] = 0;
8702
8703 HD_ConfirmCnt_Reg[1] = (HD_ConfirmCnt_Reg[1]*HDSDD_SPEED) >> HDSDD_DIV;
8704
8705 if( HD_ConfirmCnt_Reg[1] > 0x3F )
8706 HD_ConfirmCnt_Reg[1] = 0x3F;
8707
8708 //for SD2HD_CNT == 4 window size
8709 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 640, 0x1FFF);
8710 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1280, 0x1FFF);
8711 }
8712 else if( SD2HD_CNT == 4 )
8713 {
8714 //empty stage
8715 }
8716 else if( SD2HD_CNT == 5 )
8717 {
8718 HDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_75_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_74_L);
8719 SDcnt_Act[2] = (MApi_XC_R2BYTE(REG_SC_BK02_77_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_76_L);
8720 SDcnt_NonAct[2] = (MApi_XC_R2BYTE(REG_SC_BK02_7B_L) << 16) + MApi_XC_R2BYTE(REG_SC_BK02_7A_L);
8721 FeatherCnt[2] = MApi_XC_R2BYTE(REG_SC_BK23_56_L);
8722
8723 //IIR result
8724 HDcnt_Act[2] = (HDcnt_Act_prv[2]*3 + HDcnt_Act[2])/4;
8725 SDcnt_Act[2] = (SDcnt_Act_prv[2]*3 + SDcnt_Act[2])/4;
8726 SDcnt_NonAct[2] = (SDcnt_NonAct_prv[2]*3 + SDcnt_NonAct[2])/4;
8727 FeatherCnt[2] = (FeatherCnt_prv[2]*3 + FeatherCnt[2])/4;
8728 HDcnt_Act_prv[2] = HDcnt_Act[2];
8729 SDcnt_Act_prv[2] = SDcnt_Act[2];
8730 SDcnt_NonAct_prv[2] = SDcnt_NonAct[2];
8731 FeatherCnt_prv[2] = FeatherCnt[2];
8732
8733 if( (HDcnt_Act[2] > HD_ACT_TH) && (SDcnt_Act[2] != 0) )
8734 {
8735 if(HD_ConfirmCnt[2] < HD_SPEED*5)
8736 HD_ConfirmCnt[2] = 0;
8737 else
8738 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - HD_SPEED*5;
8739
8740 }
8741 else if( SDcnt_Act[2] != 0 ) //w/o consider feathering
8742 {
8743 if(HD_ConfirmCnt[2] > (0xFF - SD_SPEED*5))
8744 HD_ConfirmCnt[2] = 0xFF;
8745 else
8746 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] + SD_SPEED*5;
8747 }
8748 else
8749 {
8750 if(HD_ConfirmCnt[2] < 1)
8751 HD_ConfirmCnt[2] = 0;
8752 else
8753 HD_ConfirmCnt[2] = HD_ConfirmCnt[2] - 1;
8754 }
8755
8756 if( HD_ConfirmCnt[2] > 0x80 )
8757 HD_ConfirmCnt_Reg[2] = HD_ConfirmCnt[2] - 0x80;
8758 else
8759 HD_ConfirmCnt_Reg[2] = 0;
8760
8761 HD_ConfirmCnt_Reg[2] = (HD_ConfirmCnt_Reg[2]*HDSDD_SPEED) >> HDSDD_DIV;
8762
8763 if( HD_ConfirmCnt_Reg[2] > 0x3F )
8764 HD_ConfirmCnt_Reg[2] = 0x3F;
8765
8766 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7C_L, 40, 0x1FFF);
8767 //MApi_XC_W2BYTEMSK(REG_SC_BK02_7D_L, 1880, 0x1FFF);
8768 }
8769
8770 if( SD2HD_CNT == 5 )
8771 {
8772 HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg[2] + ((HD_ConfirmCnt_Reg[0] + HD_ConfirmCnt_Reg[1]*3 )>>2);
8773
8774 HD_ConfirmCnt_Reg_f = (HD_ConfirmCnt_Reg_f_prv*3 + HD_ConfirmCnt_Reg_f+2)/4;
8775
8776 if( HD_ConfirmCnt_Reg_f >= 0x3E )
8777 HD_ConfirmCnt_Reg_f = 0x3F;
8778 else if( HD_ConfirmCnt_Reg_f <= 0x02 )
8779 HD_ConfirmCnt_Reg_f = 0;
8780
8781 HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f;
8782 }
8783 else
8784 {
8785 HD_ConfirmCnt_Reg_f = HD_ConfirmCnt_Reg_f_prv;
8786 //HD_ConfirmCnt_Reg_f_prv = HD_ConfirmCnt_Reg_f_prv;
8787 }
8788
8789 //for next frame start
8790 if( SD2HD_CNT == 5 )
8791 SD2HD_CNT = 0;
8792 else
8793 SD2HD_CNT++;
8794
8795 return HD_ConfirmCnt_Reg_f;
8796 }
8797
MDrv_UFSC_PQ_BNF_status(XC_BackgroundState * backgroundState,MS_BOOL isOpFrameChanged)8798 void MDrv_UFSC_PQ_BNF_status( XC_BackgroundState *backgroundState, MS_BOOL isOpFrameChanged ) //Left half histogram data
8799 {
8800 static MS_U16 iir_Ymax = 0;
8801 static MS_U16 iir_Umax = 0;
8802 static MS_U16 iir_Vmax = 0;
8803 static MS_U32 iir_pbgrate = 0;
8804 static MS_U32 iir_flatSkinCnt = 0;
8805 static MS_U32 iir_cplxCnt = 0;
8806 static MS_U32 iir_prvBgCnt = 0;
8807 static MS_U32 iir_skinRawCnt = 0;
8808 static MS_U32 iir_cplxRawCnt = 0;
8809 static MS_U32 iir_dswRawCnt = 0;
8810
8811 MS_U32 BNF_Yhist[32], BNF_Uhist[32], BNF_Vhist[32];
8812 static MS_BOOL SetStatus = false;
8813 MS_U16 i, Ymax, Umax, Vmax;
8814 MS_U32 Ymax_cnt, Umax_cnt, Vmax_cnt, maxYUVcnt;
8815 MS_U32 totalPixel, pbgrate;
8816
8817 MApi_XC_Write2ByteMask(REG_FSC_BK4D_39_L, 0 , 0x0FFF );
8818 MApi_XC_Write2ByteMask(REG_FSC_BK4D_3B_L, frameWidth/2-1 , 0x0FFF );
8819 MApi_XC_Write2ByteMask(REG_FSC_BK4D_3C_L, frameHeight-1 , 0x0FFF );
8820
8821 MApi_XC_Write2ByteMask(REG_FSC_BKCD_39_L, GuardBandWidth , 0x0FFF );
8822 MApi_XC_Write2ByteMask(REG_FSC_BKCD_3B_L, GuardBandWidth+ frameWidth/2-1 , 0x0FFF );
8823 MApi_XC_Write2ByteMask(REG_FSC_BKCD_3C_L, frameHeight-1 , 0x0FFF );
8824
8825
8826 if ( isOpFrameChanged )
8827 {
8828 if( !SetStatus )
8829 {
8830 MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0004 );
8831 MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0004 , 0x0004 );
8832
8833 SetStatus = true;
8834 }
8835 else if (( MDrv_Read2Byte(REG_FSC_BK4D_51_L)& 0x0008 ) && SetStatus )
8836 {
8837 // Y histogram
8838 MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0000 , 0x0003 );
8839 for( i = 0 ; i < 32 ; ++i )
8840 {
8841 MS_U16 sh = ((i&0x3)<<2);
8842 BNF_Yhist[i] = ( MDrv_Read2Byte(REG_FSC_BK4D_58_L+ (i<<1) ) << 3 )
8843 + ( (MDrv_Read2ByteMSK(REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8844 + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8845 + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8846 }
8847
8848 #if 0
8849 totalPixel = 0;
8850 //printf(" --- Y historgam -- \n");
8851 for ( i = 0 ; i < 32; i ++)
8852 {
8853 totalPixel = totalPixel + BNF_Yhist[i];
8854 //printf("Yhist[%d] = %d\n", i, BNF_Yhist[i]);
8855 }
8856 //printf("total pixel = %d\n", totalPixel );
8857 #endif
8858 // U histogram
8859 MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0001 , 0x0003 );
8860 for( i = 0 ; i < 32 ; ++i )
8861 {
8862 MS_U16 sh = ((i&0x3)<<2);
8863 BNF_Uhist[i] = ( MDrv_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8864 + ( (MDrv_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8865 + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8866 + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8867 }
8868 #if 0
8869 totalPixel = 0;
8870 //printf(" --- U historgam -- \n");
8871 for ( i = 0 ; i < 32; i ++)
8872 {
8873 totalPixel = totalPixel + BNF_Uhist[i];
8874 //printf("Uhist[%d] = %d\n", i, BNF_Uhist[i]);
8875 }
8876 //printf("total pixel = %d\n", totalPixel );
8877 #endif
8878
8879
8880 // V histogram
8881 MApi_XC_Write2ByteMask(REG_FSC_BK4D_51_L, 0x0002 , 0x0003 );
8882 for( i = 0 ; i < 32 ; ++i )
8883 {
8884 MS_U16 sh = ((i&0x3)<<2);
8885 BNF_Vhist[i] = ( MDrv_Read2Byte( REG_FSC_BK4D_58_L + (i<<1) ) << 3 )
8886 + ( (MDrv_Read2ByteMSK( REG_FSC_BK4D_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) )
8887 + ( MDrv_Read2Byte( REG_FSC_BKCD_58_L + (i<<1) ) << 3 )
8888 + ( (MDrv_Read2ByteMSK( REG_FSC_BKCD_78_L + ((i>>2)<<1), (0x7000 >> sh))) >> (12-sh) );
8889 }
8890 #if 0
8891 totalPixel = 0;
8892 //printf(" --- V historgam -- \n");
8893 for ( i = 0 ; i < 32; i ++)
8894 {
8895 totalPixel = totalPixel + BNF_Vhist[i];
8896 //printf("Vhist[%d] = %d\n", i, BNF_Vhist[i]);
8897 }
8898 //printf("total pixel = %d\n", totalPixel );
8899 #endif
8900
8901
8902 Ymax = 0;
8903 Umax = 0;
8904 Vmax = 0;
8905 Ymax_cnt = 0;
8906 Umax_cnt = 0;
8907 Vmax_cnt = 0;
8908
8909 for ( i = 0; i< 32; i++ )
8910 {
8911 if ( BNF_Yhist[i] > Ymax_cnt )
8912 {
8913 Ymax = i << 4;
8914 Ymax_cnt = BNF_Yhist[i];
8915 }
8916
8917 if ( BNF_Uhist[i] > Umax_cnt )
8918 {
8919 Umax = i << 4;
8920 Umax_cnt = BNF_Uhist[i];
8921 }
8922
8923 if ( BNF_Vhist[i] > Vmax_cnt )
8924 {
8925 Vmax = i << 4 ;
8926 Vmax_cnt = BNF_Vhist[i];
8927 }
8928
8929 }
8930
8931 maxYUVcnt = __min3(Ymax_cnt, Umax_cnt, Vmax_cnt);
8932 totalPixel = ( frameWidth* frameHeight ) >> 5;
8933 pbgrate = (totalPixel!=0) ? (maxYUVcnt*5000)/totalPixel : 0;
8934
8935 Ymax = ((3*iir_Ymax)+ Ymax ) >> 2;
8936 iir_Ymax = Ymax;
8937
8938 Umax = ((3*iir_Umax)+ Umax ) >> 2;
8939 iir_Umax = Umax;
8940
8941 Vmax = ((3*iir_Vmax )+ Vmax ) >> 2;
8942 iir_Vmax = Vmax;
8943
8944 pbgrate = ((iir_pbgrate*3 )+ pbgrate) >> 2;
8945 iir_pbgrate = pbgrate;
8946
8947 Ymax = ( Ymax + 8 )>> 4;
8948 Umax = ( Umax + 8 )>> 4;
8949 Vmax = ( Vmax + 8 )>> 4;
8950
8951
8952 #if 0
8953 //printf(" max Ybin = %d, cnt = %d \n", Ymax, Ymax_cnt );
8954 //printf(" max Ubin = %d, cnt = %d \n", Umax, Umax_cnt );
8955 //printf(" max Vbin = %d, cnt = %d \n", Vmax, Vmax_cnt );
8956 //printf(" totalPixel = %d \n", totalPixel );
8957 //printf(" maxYUVcnt = %d \n", maxYUVcnt );
8958 //printf(" pbgrate = %d \n", pbgrate );
8959 #endif
8960
8961 MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Ymax , 0x001F );
8962 MApi_XC_Write2ByteMask(REG_FSC_BK4D_42_L, Umax << 8 , 0x1F00 );
8963 MApi_XC_Write2ByteMask(REG_FSC_BK4D_43_L, Vmax , 0x001F );
8964 MApi_XC_Write2ByteMask(REG_FSC_BK4D_45_L, pbgrate , 0xDFFF );
8965
8966 MS_U32 flatSkinCnt = ( (MDrv_Read2ByteMSK(REG_FSC_BK4D_53_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_52_L )
8967 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_53_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_52_L ) ) >> 1;
8968 MS_U32 cplxCnt = (( MDrv_Read2ByteMSK(REG_FSC_BK4D_55_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_54_L )
8969 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_55_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_54_L ) ) >> 1;
8970 MS_U32 prvBgCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_57_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_56_L )
8971 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_57_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_56_L ) ) >> 1;
8972 MS_U32 skinRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4B_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_4A_L )
8973 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4B_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_4A_L ) ) >> 1;
8974 MS_U32 cplxRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4D_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_4C_L )
8975 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4D_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_4C_L ) ) >> 1;
8976 MS_U32 dswRawCnt = ((MDrv_Read2ByteMSK(REG_FSC_BK4D_4F_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BK4D_4E_L )
8977 + (MDrv_Read2ByteMSK(REG_FSC_BKCD_4F_L, 0x0007 ) << 16) + MDrv_Read2Byte(REG_FSC_BKCD_4E_L ) ) >> 1;
8978
8979
8980 flatSkinCnt = ((iir_flatSkinCnt*3 )+ flatSkinCnt) >> 2;
8981 iir_flatSkinCnt = flatSkinCnt;
8982
8983 cplxCnt = ((iir_cplxCnt*3 )+ cplxCnt) >> 2;
8984 iir_cplxCnt = cplxCnt;
8985
8986 prvBgCnt = ((iir_prvBgCnt*3 )+ prvBgCnt) >> 2;
8987 iir_prvBgCnt = prvBgCnt;
8988
8989 skinRawCnt = ((iir_skinRawCnt*3 )+ skinRawCnt) >> 2;
8990 iir_skinRawCnt = skinRawCnt;
8991
8992 cplxRawCnt = ((iir_cplxRawCnt*3 )+ cplxRawCnt) >> 2;
8993 iir_cplxRawCnt = cplxRawCnt;
8994
8995 dswRawCnt = ((iir_dswRawCnt*3 )+ dswRawCnt) >> 2;
8996 iir_dswRawCnt = dswRawCnt;
8997
8998
8999 backgroundState->flatSkinCnt = flatSkinCnt;
9000 backgroundState->cplxCnt = cplxCnt;
9001 backgroundState->prvBgCnt = prvBgCnt;
9002 backgroundState->skinRawCnt = skinRawCnt;
9003 backgroundState->cplxRawCnt = cplxRawCnt;
9004 backgroundState->dswRawCnt = dswRawCnt;
9005
9006 backgroundState->pbgY = Ymax;
9007 backgroundState->pbgU = Umax;
9008 backgroundState->pbgV = Vmax;
9009 backgroundState->pbgrate = pbgrate;
9010
9011 SetStatus = false;
9012 }
9013 }
9014
9015 }
MDrv_UFSC_PQ_BNF(int sdw2)9016 void MDrv_UFSC_PQ_BNF(int sdw2) //Eva
9017 {
9018 short bgw_fnl_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2D_L, 0x00ff);
9019 short ori_fnl_gain = MDrv_Read2ByteMSK(REG_FSC_BK30_2D_L, 0xFf00)>>8;
9020 short bld_fnl_gain = ( sdw2*bgw_fnl_gain_sd + (256-sdw2)*ori_fnl_gain ) /256;
9021 bld_fnl_gain = __minmax( bld_fnl_gain ,0 ,0x1f);
9022
9023 MApi_XC_Write2ByteMask( REG_FSC_BK4D_36_L ,bld_fnl_gain<<8, 0x1f00 );
9024
9025 //decrease skin protection
9026 short skinsum_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0x000f);
9027 short ori_skinsum_gain = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0x00f0)>>4;
9028 short bld_skinsum_gain = ( sdw2*skinsum_gain_sd + (256-sdw2)*ori_skinsum_gain ) /256;
9029 bld_skinsum_gain = __minmax( bld_skinsum_gain ,0 ,0xf);
9030
9031 MApi_XC_Write2ByteMask( REG_FSC_BK4D_2A_L ,bld_skinsum_gain<<12, 0xf000 );
9032
9033 //printf("BNFDBG: gain sd = %d , hd = %d , bld = %d \n",bgw_fnl_gain_sd,ori_fnl_gain,bld_fnl_gain);
9034 //printf("BNFDBG: gain sd = %d , hd = %d , bld = %d \n",skinsum_gain_sd,ori_skinsum_gain,bld_skinsum_gain);
9035 }
MDrv_UFSC_PQ_LSE(int frNNCnt2,int menuW,int edgePatW,int srEnhStr,int sdW2,int fHdW2,XC_PqWriteReg * PqWriteReg)9036 void MDrv_UFSC_PQ_LSE( int frNNCnt2, int menuW, int edgePatW, int srEnhStr , int sdW2 , int fHdW2 , XC_PqWriteReg *PqWriteReg)
9037 {
9038 #define LSE_EDGE_G_LB 8
9039
9040 //printf( "PQ_LSE: frNNCnt2 = %d , menuW = %d , edgePatW = %d\n", frNNCnt2, menuW , edgePatW );
9041 //printf( "PQ_LSE: sdW2 = %d , srEnhStr = %d \n", sdW2, srEnhStr );
9042
9043 //int artW = max( menuW, edgePatW ); //remove bcz maserati has ERC edge patch
9044
9045 // CG pattern
9046 int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
9047 nnW = __min( 256, nnW );
9048
9049 // LSE adaptive edge gain
9050 int edgeGain = MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x003F);
9051 int edgeGainLb = LSE_EDGE_G_LB;
9052 edgeGain = __max( edgeGain, edgeGainLb );
9053
9054 //int reduceW = max( artW, artW/*sdW2*/ ); //remove bcz maserati has ERC edge patch
9055 int sdfhdEdgeGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x3F00 ) >> 8 );
9056 edgeGain = (edgeGain*(256-fHdW2) + sdfhdEdgeGain *fHdW2)>>8;
9057
9058 //int adptGain = max( 0, edgeGain * (512-reduceW) >> 9 ); //remove bcz maserati has ERC edge patch
9059 int adptGain = edgeGain ;
9060 adptGain = (adptGain * (256-nnW)) >> 8;
9061 adptGain = (adptGain * srEnhStr) >> 5;
9062 PqWriteReg-> ERCEdgeG = adptGain;
9063 //adptGain = min( adptGain, 0x003F );
9064 //MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, adptGain<<8, 0x3F00 );
9065
9066 // detail gain
9067 int reduceW = __max(0,256 - nnW);//max( 0, 256 - min( (sdW2>>1), nnW ) );
9068 /*{
9069 int detGain0SD = MDrv_Read2ByteMSK( REG_FSC_BK30_22_L, 0x003F);
9070 int detGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_38_L, 0x3F00 ) >> 8 );
9071 detGain = ( sdW2 * detGain0SD + (256 - sdW2)*detGain )/256;
9072 detGain = ( detGain * reduceW) >> 8;
9073 detGain = ( detGain * srEnhStr ) >> 5;
9074 detGain = min( 0x003f, detGain );
9075 MApi_XC_Write2ByteMask( REG_FSC_BK75_58_L, detGain, 0x003F );
9076
9077 }*/
9078 {
9079 int detGain1SD = MDrv_Read2ByteMSK( REG_FSC_BK30_22_L, 0x3F00)>>8;
9080 int detGain = MDrv_Read2ByteMSK( REG_FSC_BK30_39_L, 0x003F );
9081 detGain = ( sdW2 * detGain1SD + (256 - sdW2)*detGain )/256;
9082 detGain = (detGain * reduceW) >> 8;
9083 detGain = ( detGain * srEnhStr ) >> 5;
9084 PqWriteReg-> ERCDetailG2 = detGain;
9085 //detGain = min( 0x003f, detGain );
9086 //MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain<<8, 0x3F00 );
9087
9088 }
9089 {
9090 int detGain2SD = MDrv_Read2ByteMSK( REG_FSC_BK30_23_L, 0x003F);
9091 int detGain = ( MDrv_Read2ByteMSK( REG_FSC_BK30_39_L, 0x3F00 ) >> 8 );
9092 detGain = ( sdW2 * detGain2SD + (256 - sdW2)*detGain )/256;
9093 detGain = ( detGain * reduceW) >> 8;
9094 detGain = ( detGain * srEnhStr ) >> 5;
9095 PqWriteReg-> ERCDetailG3 = detGain;
9096 //detGain = min( 0x003f, detGain );
9097 //MApi_XC_Write2ByteMask( REG_FSC_BK75_59_L, detGain, 0x003F );
9098
9099 }
9100 // lut gain
9101 //int finalLutGain = 0x08 + ( (0x08*sdW2) >> 8 );
9102 //MApi_XC_Write2ByteMask( REG_FSC_BK75_1C_L, finalLutGain, 0x001F );
9103
9104 //Eva modify fhd 25 ac bld more blur
9105 short fhd_bld_gain_min = MDrv_Read2ByteMSK(REG_FSC_BK30_2E_L, 0xff00)>>8;
9106 short hd_bld_gain_min = 0x20;
9107 short final_gain_min = ( fHdW2*fhd_bld_gain_min + (256-fHdW2)*hd_bld_gain_min )/256;
9108 final_gain_min = __minmax(final_gain_min , 0, 0x1ff);
9109 MApi_XC_Write2ByteMask( REG_FSC_BK75_1A_L, final_gain_min, 0x01FF );
9110
9111 }
9112
MDrv_UFSC_PQ_NLM(XC_BackgroundState * backgroundState,int menuW,int edgePatW,int srEnhStr,int sdw2,XC_PqWriteReg * PqWriteReg)9113 void MDrv_UFSC_PQ_NLM( XC_BackgroundState *backgroundState, int menuW, int edgePatW, int srEnhStr , int sdw2 , XC_PqWriteReg *PqWriteReg)
9114 {
9115 //NLM DS patch gain sd pattern use ds patch but hd pattern not use
9116 int ds_patch_gain_sd = MDrv_Read2ByteMSK(REG_FSC_BK30_2F_L, 0xff00)>>8;//0x18;
9117 int ds_patch_gain_final;
9118 ds_patch_gain_final = (sdw2*ds_patch_gain_sd + (256-sdw2)*0)/256;
9119 MApi_XC_Write2ByteMask( REG_FSC_BK70_2A_L, ds_patch_gain_final <<8, 0x3F00 );
9120
9121 // coring
9122 MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, __max( edgePatW, menuW ) >> 3, 0x00FF );
9123
9124 // NLM gain for skin, this should use colour adaptive
9125 int pbSkinW = __max( 0, (int)backgroundState->flatSkinCnt - 1200) >> 2;
9126 pbSkinW = __min( 16, pbSkinW );
9127
9128 // NLM gain
9129 int finGain = /*0xA*/MDrv_Read2ByteMSK( REG_FSC_BK30_30_L, 0x00FF ) - ( (4 * pbSkinW) >> 4 );
9130 finGain = ( finGain * srEnhStr ) >> 5;
9131 PqWriteReg-> NLMGain = finGain;
9132 //finGain = min( 0x00FF, finGain );
9133 //MApi_XC_Write2ByteMask( REG_FSC_BK70_31_L, finGain<<8, 0xFF00 );
9134
9135 //printf( "pbSkinW, NLM gain : %d, %d\n", pbSkinW, finGain );
9136
9137 }
9138
MDrv_UFSC_PQ_PreEnh(int fHdw2,int sdw2,MS_U16 estNoise,MS_U8 estConfirm,int srEnhStr,XC_PqWriteReg * PqWriteReg)9139 void MDrv_UFSC_PQ_PreEnh( int fHdw2, int sdw2, MS_U16 estNoise,MS_U8 estConfirm, int srEnhStr,XC_PqWriteReg *PqWriteReg )
9140 {
9141 // BLTI bias gain
9142 int biasGain = ( 0x10 * fHdw2 ) >> 8;
9143 if( fHdw2 == 256 )
9144 {
9145 biasGain = ( 0x10 * (256-sdw2) + 0x20 * sdw2 ) >> 8;
9146 }
9147
9148 MApi_XC_Write2ByteMask( REG_FSC_BK4C_52_L, biasGain, 0x007F );
9149
9150 // LTI ac thrd
9151 int acThrd = ( 0x04 * (256-sdw2) + 0x1C * sdw2 ) >> 8;
9152 MApi_XC_Write2ByteMask( REG_FSC_BK4C_53_L, acThrd<<8, 0xFF00 );
9153
9154 // Pre PK3x3
9155 int finGain = (( MDrv_Read2ByteMSK( REG_FSC_BK30_30_L, 0x3F00 ) >> 8 ) * srEnhStr );
9156 finGain = finGain*(256-fHdw2)>>8;//for maserati 2dpk issue
9157 finGain = finGain* srEnhStr >> 5;
9158 finGain = __minmax(finGain,0,0x3F);
9159 PqWriteReg-> Prepk3x3finalGain = finGain;
9160
9161 //finGain = __min( 0x3F00, finGain );
9162 //MApi_XC_Write2ByteMask( REG_FSC_BK4C_48_L, finGain, 0x003F );
9163
9164 // LDE
9165 #ifdef BFEvaModify
9166 int ldeDarkGain = MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x1F00) >> 8 ;
9167 int ldeDarkGainSD = MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x001F) ;
9168 int ldeDarkGainFHD = (ldeDarkGain + ldeDarkGainSD) >> 1;
9169 int ldeGain = ( ldeDarkGain/*0xA*/ * (256 - fHdw2) + ldeDarkGainFHD/*0x12*/ * fHdw2 ) >> 8;
9170 if( fHdw2 == 256 )
9171 {
9172 ldeGain = ( ldeDarkGainFHD * (256-sdw2) + ldeDarkGainSD/*0x1A*/ * sdw2 ) >> 8;
9173 }
9174 #else
9175 int ldeDarkGain = MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x1F00) >> 8 ;
9176 int ldeDarkGainSD= MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x001F) ;
9177 int ldeDarkGainFHD=MDrv_Read2ByteMSK( REG_FSC_BK30_32_L, 0x1F00)>>8 ;
9178 int ldeGain = ( ldeDarkGain/*0xA*/ * (256 - fHdw2) + ldeDarkGainFHD/*0x12*/ * fHdw2 ) >> 8;
9179 if( fHdw2 == 256 )
9180 {
9181 ldeGain = ( ldeDarkGainFHD * (256-sdw2) + ldeDarkGainSD/*0x05*/ * sdw2 ) >> 8;
9182 }
9183 #endif
9184
9185 MS_U8 report_noise = __minmax(estNoise,0,15);
9186 report_noise = (report_noise == 15) ? 16 : report_noise;
9187 MS_U8 report_confirm = __minmax(estConfirm-1,0,7);
9188 report_confirm = __max(0,report_confirm - 2) * 4;
9189 report_confirm = __minmax( report_confirm, 0, 16 );
9190
9191 int noiseW = estNoise - (16-report_confirm);
9192 noiseW = 16 - __minmax( noiseW, 0, 16 );
9193 // back to default while noise is large
9194 ldeGain = ( ldeDarkGain * (16-noiseW) + ldeGain/*0xA*/ * noiseW ) >> 4;
9195 ldeGain = ( ldeGain * srEnhStr ) >> 5;
9196 ldeGain = __minmax(ldeGain,0,0x1F);
9197 PqWriteReg-> LdefinalGain = ldeGain;
9198
9199 //MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGain<<8, 0x1F00 );
9200
9201 int ldeGainH =( MDrv_Read2ByteMSK( REG_FSC_BK30_31_L, 0x001F )/*0xA*/ * noiseW ) >> 4;
9202 ldeGainH = ( ldeGainH * srEnhStr ) >> 5;
9203 ldeGainH = __minmax(ldeGainH,0,0x1F);
9204 PqWriteReg-> LdefinalGainH = ldeGainH;
9205 //MApi_XC_Write2ByteMask( REG_FSC_BK4C_25_L, ldeGainH, 0x001F );
9206 }
9207
MDrv_UFSC_PQ_PostPK3x3(int menuW,int edgePatW,int fHdW,int sdW,int srEnhStr,XC_PqWriteReg * PqWriteReg,MS_U16 u16ArtiW)9208 void MDrv_UFSC_PQ_PostPK3x3( int menuW, int edgePatW, int fHdW, int sdW, int srEnhStr , XC_PqWriteReg *PqWriteReg ,MS_U16 u16ArtiW)
9209 {
9210 // ds_minw
9211 edgePatW = __max( edgePatW, menuW );
9212 fHdW = __max( 0, fHdW - edgePatW );
9213 int dsmin = MDrv_Read2ByteMSK( REG_FSC_BK30_33_L, 0xFF00) >> 8;
9214 int dsminSD = __min( 0x00FF, dsmin + MDrv_Read2ByteMSK( REG_FSC_BK30_34_L, 0x00FF) );
9215 int dsminFHD = (dsmin*170 + dsminSD*86) >> 8;
9216 int dsminW = ( dsmin * (256-fHdW) + /*0x20*/dsminFHD * fHdW ) >> 8;
9217 if( fHdW == 256 )
9218 {
9219 dsminW = ( /*0x20*/dsminFHD * (256-sdW) + /*0x60*/dsminSD * sdW ) >> 8;
9220 }
9221 MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, dsminW<<8, 0xFF00 );
9222
9223 // ds gain
9224 //int dsw = MApi_XC_R2BYTEMSK( REG_SC_BK30_32_H, 0xFF );
9225 //int dswSD = MApi_XC_R2BYTEMSK( REG_SC_BK30_33_L, 0xFF );
9226 int dsGain = 0xB/*dsw*/ - ( ((0xB/*dswSD*/)*fHdW ) >> 8 );
9227 //int dsGain = ( dsw * (256-fHdW) + dswSD * fHdW ) >> 8;
9228 MApi_XC_Write2ByteMask( REG_FSC_BK76_42_L, (dsGain&0xFF), 0x00FF );
9229
9230 int post3x3pkGain_FHD = MDrv_Read2ByteMSK(REG_FSC_BK30_2F_L , 0x00ff);
9231 int post3x3pkGain_Arti_pos = MDrv_Read2ByteMSK(REG_FSC_BK30_1B_L , 0x00ff);
9232 int post3x3pkGain_Arti_neg = MDrv_Read2ByteMSK(REG_FSC_BK30_1B_L , 0xff00)>>8;
9233 int posGain = ( 0x30*(256-fHdW) + post3x3pkGain_FHD*fHdW )>>8;
9234 posGain = ( posGain*(256-sdW) + 0x18*sdW )>>8;
9235 posGain = ( posGain*(256-u16ArtiW) + post3x3pkGain_Arti_pos*u16ArtiW )>>8;
9236 posGain = ( posGain * srEnhStr ) >> 5;
9237 posGain = __min( 0xFF, posGain );
9238 PqWriteReg-> P3x3pkPosfinalGain = posGain;
9239 //MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, posGain, 0x00FF );
9240
9241 int negGain = ( 0x30*(256-fHdW) + post3x3pkGain_FHD*fHdW )>>8;
9242 negGain = ( negGain*(256-u16ArtiW) + post3x3pkGain_Arti_neg*u16ArtiW )>>8;
9243 negGain = ( negGain * srEnhStr ) >> 5;
9244 negGain = __min( 0xFF, negGain );
9245 PqWriteReg-> P3x3pkNegfinalGain = negGain;
9246 //MApi_XC_Write2ByteMask( REG_FSC_BK76_44_L, negGain<<8, 0xFF00 );
9247
9248
9249 }
9250
MDrv_UFSC_PQ_HASC(int sdW,int srEnhStr)9251 void MDrv_UFSC_PQ_HASC( int sdW, int srEnhStr )
9252 {
9253 int lowGain = /*0x28*/( MDrv_Read2ByteMSK( REG_FSC_BK30_36_L, 0x7F00 ) >> 8 )
9254 + ( (/*0x38*/MDrv_Read2ByteMSK( REG_FSC_BK30_37_L, 0x007F ) * sdW) >> 8 );
9255 lowGain = ( lowGain * srEnhStr ) >> 5;
9256 lowGain = __min( lowGain, 0x007F );
9257 MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, lowGain<<8, 0x7F00 );
9258
9259 int highGain = ( /*0x18*/MDrv_Read2ByteMSK( REG_FSC_BK30_36_L, 0x007F ) * srEnhStr ) >> 5;
9260 highGain = __min( 0x007F, highGain );
9261 MApi_XC_Write2ByteMask( REG_FSC_BK74_2E_L, highGain, 0x007F );
9262 }
9263
MDrv_UFSC_PQ_P2M(int menuW,int edgePatW,int srEnhStr,XC_PqWriteReg * PqWriteReg)9264 void MDrv_UFSC_PQ_P2M( int menuW, int edgePatW, int srEnhStr , XC_PqWriteReg *PqWriteReg)
9265 {
9266 int gain = ( /*9*/( MDrv_Read2ByteMSK( REG_FSC_BK30_37_L, 0x3F00 )>>8 ) * (256 - __max(edgePatW, menuW)) ) >> 8;
9267 gain = (gain * srEnhStr ) >> 5;
9268 gain = __min( 0x3F00, gain );
9269 PqWriteReg-> P2mfinalGain = gain;
9270 //MApi_XC_Write2ByteMask( REG_FSC_BK72_41_L, gain, 0x003F );
9271 }
9272
MDrv_UFSC_PQ_ANN(int frNNCnt2)9273 void MDrv_UFSC_PQ_ANN( int frNNCnt2 )
9274 {
9275 // CG pattern
9276 int nnW = __max( 0, frNNCnt2 - 2048 ) >> 3;
9277 nnW = __min( 256, nnW );
9278 int artNNW = __max( 0, frNNCnt2 - 8192 ) >> 4;
9279 artNNW = __min( 256, artNNW );
9280
9281 int colorGain = ( 0x10 * (256-nnW) + 0x7 * nnW ) >> 8;
9282 colorGain = ( colorGain * (256-artNNW) + 0x04 * artNNW ) >> 8;
9283 int colorOffset = ( artNNW * 0x18 ) >> 8;
9284
9285 int strictGain = ( 0x20 * (256-nnW) + 0x4 * nnW ) >> 8;
9286 strictGain = ( strictGain * (256-artNNW) + 0x2 * artNNW ) >> 8;
9287 int strictOffset = ( 0x17 * nnW ) >> 8;
9288 strictOffset = ( strictOffset * (256-artNNW) + 0x0 * artNNW ) >> 8;
9289
9290 int nnGain = ( 0x10 * (256-artNNW) + 0x18 * artNNW ) >> 8;
9291
9292 MApi_XC_Write2ByteMask( REG_FSC_BK72_25_L, ((colorGain<<8)+colorOffset), 0xFF00 );
9293 MApi_XC_Write2ByteMask( REG_FSC_BK72_26_L, ((strictGain<<8)+strictOffset), 0xFF00 );
9294 MApi_XC_Write2ByteMask( REG_FSC_BK72_2D_L, nnGain, 0x001F );
9295
9296 }
9297
MDrv_UFSC_PQ_DMS_referBNF(XC_BackgroundState * backgroundState)9298 void MDrv_UFSC_PQ_DMS_referBNF( XC_BackgroundState *backgroundState )
9299 {
9300
9301 MS_U16 Ymax_idx = backgroundState->pbgY;
9302 MS_U16 Umax_idx = backgroundState->pbgU;
9303 MS_U16 Vmax_idx = backgroundState->pbgV;
9304 MS_U32 confidence = backgroundState->pbgrate;
9305
9306
9307 MApi_XC_Write2ByteMask(REG_FSC_BK26_44_L, Ymax_idx , 0x001F );
9308 MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Umax_idx , 0x001F );
9309 MApi_XC_Write2ByteMask(REG_FSC_BK26_45_L, Vmax_idx << 8 , 0x1F00 );
9310 MApi_XC_Write2ByteMask(REG_FSC_BK26_46_L, confidence, 0x3FFF );
9311
9312 }
9313
9314 //-------------------------------------------------------------------------------------------------
9315 /// LSE PQ function
9316 // 1. Zone plate patch
9317 //-------------------------------------------------------------------------------------------------
9318
MDrv_UFSC_PQ_LSE_Patch(void)9319 void MDrv_UFSC_PQ_LSE_Patch(void)
9320 {
9321 static int iir_std_stat = 0;
9322 //int std_stat_TH = 5;
9323 int reg_std_stat = MDrv_Read2Byte(REG_FSC_BK2C_79_L);
9324 int totalPixelCount = (( MDrv_Read2Byte( REG_FSC_BK55_19_L ) << 16 ) + MDrv_Read2Byte( REG_FSC_BK55_18_L ));
9325 int totalPixelYSum= ( MDrv_Read2Byte( REG_FSC_BK55_1B_L ) << 16 ) + MDrv_Read2Byte( REG_FSC_BK55_1A_L );
9326
9327 totalPixelCount = (totalPixelCount / 256);
9328
9329 if (totalPixelCount == 0)
9330 return;
9331 //printf("totalPixelCount:%d ;totalPixelYSum%d \n",totalPixelCount,totalPixelYSum);
9332
9333 int APL = (totalPixelYSum / totalPixelCount);
9334
9335 /* IIR states */
9336 reg_std_stat = ((iir_std_stat*3 )+ reg_std_stat ) >> 2;
9337 iir_std_stat = reg_std_stat;
9338
9339 APL = (APL == 0) ? 1 : APL;
9340
9341 iir_std_stat = (iir_std_stat / APL );
9342
9343 /*if ((iir_std_stat > std_stat_TH) || (APL < 20))
9344 {
9345 MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x00, 0x0F);//reg_lse_local_cplx_lut_gain
9346 MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0000 , 0x0100);//reg_lse_nlm_gain_en
9347 MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0000 , 0x0100);//reg_lse_uc_en
9348 MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x03);//reg_time_of_cross_weight
9349 MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x00, 0x18);//reg_time_of_x_weight
9350 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x00 , 0xF0);//reg_main_lti_jaggy_min
9351 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x1F00);//reg_main_lti_jaggy_slope
9352 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x8000 , 0x8000);//reg_main_lti_jaggy_en
9353 }
9354 else
9355 {
9356 MApi_XC_Write2ByteMask(REG_FSC_BK75_18_L, 0x08, 0x0F);//reg_lse_local_cplx_lut_gain
9357 MApi_XC_Write2ByteMask(REG_FSC_BK71_31_L, 0x0100 , 0x0100);//reg_lse_nlm_gain_en
9358 MApi_XC_Write2ByteMask(REG_FSC_BK71_30_L, 0x0100 , 0x0100);//reg_lse_uc_en
9359 MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x03, 0x03);//reg_time_of_cross_weight
9360 MApi_XC_Write2ByteMask(REG_FSC_BK57_22_L, 0x18, 0x18);//reg_time_of_x_weight
9361 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x40 , 0xF0);//reg_main_lti_jaggy_min
9362 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0400 , 0x1F00);//reg_main_lti_jaggy_slope
9363 MApi_XC_Write2ByteMask(REG_FSC_BK56_25_L, 0x0000 , 0x8000);//reg_main_lti_jaggy_en
9364 }
9365
9366 //printf("reg_std_stat:%d ; iir_std_stat %d APL %d\n",reg_std_stat,iir_std_stat,APL);
9367
9368
9369 }*/ //Eva modify
9370
9371
9372
9373 }
heightEstimate(int FrameWidth)9374 int heightEstimate(int FrameWidth)
9375 {
9376 if (FrameWidth < 720)
9377 return FrameWidth*3/4;
9378 else if (FrameWidth == 720)
9379 return 480;
9380 else if ((FrameWidth>720) && (FrameWidth<1440))
9381 return FrameWidth*9/16;
9382 else if (FrameWidth == 1440)
9383 return 900;
9384 else if ((FrameWidth>1440) && (FrameWidth<1920))
9385 return FrameWidth*9/16;
9386 else if (FrameWidth==1920)
9387 return 1080;
9388 else if (FrameWidth>=3840)
9389 return 2160;
9390 else //if (frameWidth>1920)
9391 return FrameWidth*9/16;
9392 }
9393 //---------------- 3DorderDetect begin --------------//
9394 #define sensio_thrd 3
9395 #define format_up_thrd 500
9396 #define format_low_thrd 100
MDrv_SC_3DorderDetect(void)9397 int MDrv_SC_3DorderDetect( void)
9398 {
9399 MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 ); // turn on 3d format detection
9400
9401 int PA_count = MApi_XC_R2BYTE(REG_SC_BK3A_20_L);
9402 int LA_count = MApi_XC_R2BYTE(REG_SC_BK3A_21_L);
9403 int CB_count = MApi_XC_R2BYTE(REG_SC_BK3A_22_L);
9404 int sensio_l_even = MApi_XC_R2BYTE(REG_SC_BK3A_23_L);
9405 int sensio_l_odd = MApi_XC_R2BYTE(REG_SC_BK3A_24_L);
9406 int sensio_r_even = MApi_XC_R2BYTE(REG_SC_BK3A_25_L);
9407 int sensio_r_odd = MApi_XC_R2BYTE(REG_SC_BK3A_26_L);
9408
9409 int sensio_flag = 0;
9410 int format = 0; // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9411
9412 int sensio_flag_l_ratio =0;
9413 int sensio_flag_r_ratio =0;
9414 // int sensio_L_is_EVEN= 0; // =1 EVEN; =0 ODD
9415 // int sensio_R_is_EVEN= 0;
9416
9417 if ((sensio_l_even> sensio_l_odd) && (sensio_l_odd!=0))
9418 {
9419 sensio_flag_l_ratio = sensio_l_even/sensio_l_odd;
9420 // sensio_L_is_EVEN =1;
9421 }
9422 else if ((sensio_l_odd> sensio_l_even) && (sensio_l_even!=0))
9423 sensio_flag_l_ratio = sensio_l_odd/sensio_l_even;
9424 else
9425 sensio_flag_l_ratio =-1;
9426
9427 if ((sensio_r_even> sensio_r_odd) && (sensio_r_odd!=0))
9428 {
9429 sensio_flag_r_ratio = sensio_r_even/sensio_r_odd;
9430 // sensio_R_is_EVEN =1;
9431 }
9432 else if ((sensio_r_odd> sensio_r_even) && (sensio_r_even!=0))
9433 sensio_flag_r_ratio = sensio_r_odd/sensio_r_even;
9434 else
9435 sensio_flag_r_ratio =-1;
9436
9437 if (sensio_flag_l_ratio> sensio_thrd && sensio_flag_r_ratio> sensio_thrd)
9438 sensio_flag =1;
9439 else
9440 sensio_flag =0;
9441
9442
9443 // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9444 if(sensio_flag)
9445 {
9446 format = 4;
9447 //MApi_XC_W2BYTEMSK(REG_SC_BK30_50_L, 0x0007, 0x0007 ); // debug light
9448 }
9449 else
9450 {
9451 if ( ( LA_count < CB_count ) && ( PA_count < CB_count ) )
9452 {
9453 format = 3;
9454 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0004, 0x0007 ); // debug light
9455 }
9456 else if ( ( LA_count < format_low_thrd ) && (PA_count > format_up_thrd) )
9457 {
9458 format = 1;
9459 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0001, 0x0007 ); // debug light
9460 }
9461 else if ( ( PA_count < format_low_thrd ) && (LA_count > format_up_thrd) )
9462 {
9463 format = 2;
9464 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0002, 0x0007 ); // debug light
9465 }
9466 else
9467 {
9468 format = 0;
9469 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0007 ); // debug light
9470 }
9471
9472 }
9473
9474 //printf( "3D format is : %d\n", format );
9475 //printf( "PA_count : %d\n", PA_count );
9476 //printf( "LA_count : %d\n", LA_count );
9477 //printf( "CB_count : %d\n", CB_count );
9478 //printf( "sensio_l_even : %d\n", sensio_l_even );
9479 //printf( "sensio_l_odd : %d\n", sensio_l_odd );
9480 //printf( "sensio_r_even : %d\n", sensio_r_even );
9481 //printf( "sensio_r_odd : %d\n", sensio_r_odd );
9482 return format;
9483
9484 }
9485
9486 //----------------- 3DorderDetect end ---------------//
9487
9488 //------------- 3DorderDetect_TBLR begin -----------//
9489 // only support progressive input soure //
9490 // every 4 horizontal pixel made one decision //
9491 // histogram data has been shifted 1 bit //
9492 #define TBLR_low_thrd 16
9493 #define TBLR_high_thrd 20
MDrv_SC_3DorderDetect_TBLR(void)9494 int MDrv_SC_3DorderDetect_TBLR(void)
9495 {
9496
9497 MApi_XC_W2BYTEMSK(REG_SC_BK3A_01_L, 0x0000, 0x0010 ); // turn on 3d format detection
9498 int FrameWidth = MApi_XC_R2BYTEMSK(REG_SC_BK12_0F_L, 0xFFFF);
9499 int FrameHeight = heightEstimate(FrameWidth);
9500 int totalPix = FrameWidth*FrameHeight/4;
9501
9502 //printf("FrameWidth = %d, FrameHeight= %d \n", FrameWidth, FrameHeight );
9503
9504 MS_BOOL TBLR_MODE_flag = true ;
9505 static int TBLR_MODE_CNT = 0 ;
9506 static MS_BOOL isHistSet = false;
9507
9508 int histbin = 0;
9509 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};
9510 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};
9511 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};
9512 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};
9513
9514 int sum0 = 0;
9515 int sum1 = 0;
9516 int sum2 = 0;
9517 int sum3 = 0;
9518
9519 int Psum0 = 0;
9520 int Psum1 = 0;
9521 int Psum2 = 0;
9522 int Psum3 = 0;
9523
9524 int diff_02= 0;
9525 int diff_13= 0;
9526 int diff_03= 0;
9527 int diff_12= 0;
9528 int shift = 0;
9529
9530 int sum_Diff_02 = 0;
9531 int sum_Diff_13 = 0;
9532 int sum_Diff_03 = 0;
9533 int sum_Diff_12 = 0;
9534 int sum_Diff_total = 0;
9535
9536 static int sum_Diff_TB02 = 0;
9537 static int sum_Diff_TB13 = 0;
9538 static int sum_Diff_TB03 = 0;
9539 static int sum_Diff_TB12 = 0;
9540 static int sum_Diff_LR02 = 0;
9541 static int sum_Diff_LR13 = 0;
9542 static int sum_Diff_LR03 = 0;
9543 static int sum_Diff_LR12 = 0;
9544 static int curStatus = 0;
9545
9546
9547 if((TBLR_MODE_CNT%2)==0)
9548 TBLR_MODE_flag= true;
9549 else if((TBLR_MODE_CNT%2)==1)
9550 TBLR_MODE_flag= false;
9551
9552 if (TBLR_MODE_flag) // TB
9553 {
9554 //printf("----- TB histogram------\n" );
9555 MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000, 0x01FFF ); // hist win0 x_start
9556 MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000, 0x01FFF ); // hist win0 y_start
9557 MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth -0x0001, 0x01FFF ); // hist win0 x_end
9558 MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight/4 -0x0001, 0x01FFF ); // hist win0 y_end
9559
9560 MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, 0x0000 , 0x01FFF ); // hist win1 x_start
9561 MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, FrameHeight/4 , 0x01FFF ); // hist win1 y_start
9562 MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth -0x0001, 0x01FFF ); // hist win1 x_end
9563 MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight/2 -0x0001, 0x01FFF ); // hist win1 y_end
9564
9565
9566 MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, 0x0000, 0x01FFF ); // hist win2 x_start
9567 MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, FrameHeight/2 , 0x01FFF ); // hist win2 y_start
9568 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth -0x0001, 0x01FFF ); // hist win2 x_end
9569 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight*3/4 -0x0001, 0x01FFF ); // hist win2 y_end
9570
9571 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, 0x0000, 0x01FFF ); // hist win3 x_start
9572 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, FrameHeight*3/4 , 0x01FFF ); // hist win3 y_start
9573 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth -0x0001, 0x01FFF ); // hist win3 x_end
9574 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001, 0x01FFF ); // hist win3 y_end
9575
9576 }
9577 else
9578 {
9579 //printf("----- LR histogram------\n" );
9580 MApi_XC_W2BYTEMSK(REG_SC_BK3A_40_L, 0x0000, 0x01FFF ); // hist win0 x_start
9581 MApi_XC_W2BYTEMSK(REG_SC_BK3A_41_L, 0x0000, 0x01FFF ); // hist win0 y_start
9582 MApi_XC_W2BYTEMSK(REG_SC_BK3A_42_L, FrameWidth/4 -0x0001, 0x01FFF ); // hist win0 x_end
9583 MApi_XC_W2BYTEMSK(REG_SC_BK3A_43_L, FrameHeight -0x0001, 0x01FFF ); // hist win0 y_end
9584
9585 MApi_XC_W2BYTEMSK(REG_SC_BK3A_44_L, FrameWidth/4, 0x01FFF ); // hist win1 x_start
9586 MApi_XC_W2BYTEMSK(REG_SC_BK3A_45_L, 0x0000 , 0x01FFF ); // hist win1 y_start
9587 MApi_XC_W2BYTEMSK(REG_SC_BK3A_46_L, FrameWidth/2 -0x0001, 0x01FFF ); // hist win1 x_end
9588 MApi_XC_W2BYTEMSK(REG_SC_BK3A_47_L, FrameHeight -0x0001 , 0x01FFF ); // hist win1 y_end
9589
9590 MApi_XC_W2BYTEMSK(REG_SC_BK3A_48_L, FrameWidth/2, 0x01FFF ); // hist win2 x_start
9591 MApi_XC_W2BYTEMSK(REG_SC_BK3A_49_L, 0x0000, 0x01FFF ); // hist win2 y_start
9592 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4A_L, FrameWidth*3/4 -0x0001, 0x01FFF ); // hist win2 x_end
9593 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4B_L, FrameHeight -0x0001, 0x01FFF ); // hist win2 y_end
9594
9595 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4C_L, FrameWidth*3/4, 0x01FFF ); // hist win3 x_start
9596 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4D_L, 0x0000, 0x01FFF ); // hist win3 y_start
9597 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4E_L, FrameWidth -0x0001, 0x01FFF ); // hist win3 x_end
9598 MApi_XC_W2BYTEMSK(REG_SC_BK3A_4F_L, FrameHeight -0x0001, 0x01FFF ); // hist win3 y_end
9599
9600 }
9601
9602 if( !isHistSet )
9603 {
9604 MApi_XC_W2BYTEMSK(REG_SC_BK3A_39_L, 0x0001, 0x0001);
9605 isHistSet = true;
9606 //printf( "set trigger bit\n" );
9607 }
9608 MS_BOOL histReady = MApi_XC_R2BYTEMSK(REG_SC_BK3A_39_L, 0x0080) >> 7; // if histogram is ready
9609
9610
9611 if( histReady )
9612 {
9613 for ( histbin = 0; histbin< 32 ; histbin++ )
9614 {
9615 // every 4 pixel in horizontal
9616 MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, histbin, 0x001F ); // select hist bin
9617
9618 MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0000, 0x0300 ); // select hist window0
9619 MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001, 0x0001 ); // toggle histogram read
9620 hist0[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9621
9622 MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0100, 0x0300 ); // select hist window1
9623 MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001, 0x0001 ); // toggle histogram read
9624 hist1[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9625
9626 MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0200, 0x0300 ); // select hist window2
9627 MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001, 0x0001 ); // toggle histogram read
9628 hist2[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9629
9630 MApi_XC_W2BYTEMSK(REG_SC_BK3A_50_L, 0x0300, 0x0300 ); // select hist window3
9631 MApi_XC_W2BYTEMSK(REG_SC_BK3A_51_L, 0x0001, 0x0001 ); // toggle histogram read
9632 hist3[histbin] = MApi_XC_R2BYTE(REG_SC_BK3A_52_L);
9633
9634 sum0 = sum0 + hist0[histbin]*histbin;
9635 sum1 = sum1 + hist1[histbin]*histbin;
9636 sum2 = sum2 + hist2[histbin]*histbin;
9637 sum3 = sum3 + hist3[histbin]*histbin;
9638
9639
9640 Psum0 = Psum0 + hist0[histbin];
9641 Psum1 = Psum1 + hist1[histbin];
9642 Psum2 = Psum2 + hist2[histbin];
9643 Psum3 = Psum3 + hist3[histbin];
9644
9645 //printf( "hist[%d] = %d %d %d %d \n", histbin, hist0[histbin], hist1[histbin], hist2[histbin], hist3[histbin]);
9646
9647 }
9648
9649 //printf( "hist total pixel = %d %d %d %d \n", Psum0, Psum1,Psum2, Psum3 );
9650
9651
9652 sum0 = 4* sum0 / totalPix;
9653 sum1 = 4* sum1 / totalPix;
9654 sum2 = 4* sum2 / totalPix;
9655 sum3 = 4* sum3 / totalPix;
9656
9657 shift = ((sum0+ sum1) - (sum2 + sum3))/2;
9658
9659 if ((sum0 - sum2)*(sum1 - sum3) <= 0)
9660 shift =0;
9661
9662 if( abs(shift) >2)
9663 shift =0;
9664
9665 //printf("sum0= %d, sum1= %d, sum2= %d, sum3= %d, shift= %d \n", sum0, sum1, sum2, sum3, shift );
9666
9667 //sum all the diff
9668 sum_Diff_02= 0;
9669 sum_Diff_13= 0;
9670 sum_Diff_03= 0;
9671 sum_Diff_12= 0;
9672
9673 for ( histbin = 0; histbin< 32 ; histbin++)
9674 {
9675
9676 diff_02= abs(hist0[histbin] - hist2[histbin-shift]);
9677 diff_13= abs(hist1[histbin] - hist3[histbin-shift]);
9678 diff_03= abs(hist0[histbin] - hist3[histbin-shift]);
9679 diff_12= abs(hist1[histbin] - hist2[histbin-shift]);
9680
9681 if (TBLR_MODE_flag )
9682 {
9683 sum_Diff_02 = sum_Diff_02 + diff_02;
9684 sum_Diff_13 = sum_Diff_13 + diff_13;
9685 sum_Diff_03 = sum_Diff_03 + diff_03;
9686 sum_Diff_12 = sum_Diff_12 + diff_12;
9687
9688 // 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);
9689 }
9690 else
9691 {
9692 sum_Diff_02 = sum_Diff_02 + diff_02;
9693 sum_Diff_13 = sum_Diff_13 + diff_13;
9694 sum_Diff_03 = sum_Diff_03 + diff_03;
9695 sum_Diff_12 = sum_Diff_12 + diff_12;
9696
9697 // 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);
9698 }
9699 }
9700
9701 sum_Diff_total = __max( sum_Diff_02+ sum_Diff_13+ sum_Diff_03+ sum_Diff_12, 1);
9702
9703 //normalization
9704 if (TBLR_MODE_flag )
9705 {
9706 sum_Diff_TB02= sum_Diff_02*100/sum_Diff_total;
9707 sum_Diff_TB13= sum_Diff_13*100/sum_Diff_total;
9708 sum_Diff_TB03= sum_Diff_03*100/sum_Diff_total;
9709 sum_Diff_TB12= sum_Diff_12*100/sum_Diff_total;
9710 }
9711 else
9712 {
9713 sum_Diff_LR02= sum_Diff_02*100/sum_Diff_total;
9714 sum_Diff_LR13= sum_Diff_13*100/sum_Diff_total;
9715 sum_Diff_LR03= sum_Diff_03*100/sum_Diff_total;
9716 sum_Diff_LR12= sum_Diff_12*100/sum_Diff_total;
9717 }
9718
9719
9720 if(TBLR_MODE_CNT%2)
9721 {
9722
9723 // printf("normalized TBdiff : %d %d %d %d \n", sum_Diff_TB02, sum_Diff_TB13, sum_Diff_TB03, sum_Diff_TB12 );
9724 // printf("normalized LRdiff : %d %d %d %d \n", sum_Diff_LR02, sum_Diff_LR13, sum_Diff_LR03, sum_Diff_LR12 );
9725
9726 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)
9727 {
9728 curStatus = 2;//LR
9729 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0020, 0x0070 ); // debug light green
9730 }
9731 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)
9732 {
9733 curStatus = 1;//TB
9734 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0010, 0x0070 ); // debug light red
9735 }
9736 else
9737 {
9738 curStatus = 0;//Video
9739 //MApi_XC_W2BYTEMSK(REG_SC_BK30_52_L, 0x0000, 0x0070 ); // debug light off
9740 }
9741
9742 //printf("3d format is : %d \n", curStatus);
9743
9744 }
9745
9746 isHistSet = false;
9747 TBLR_MODE_CNT ++;
9748 }
9749
9750 if (TBLR_MODE_CNT > 300)
9751 {
9752 TBLR_MODE_CNT = 0;
9753 }
9754 //printf("TBLR_MODE_CNT = %d\n", TBLR_MODE_CNT );
9755
9756 return curStatus;
9757 }
9758 // -------------- 3DorderDetect_TBLR end ----------- //
9759
9760 //-------- 3D source format detection begin ---------//
MDrv_SC_3DfmtDetect(void)9761 int MDrv_SC_3DfmtDetect(void)
9762 {
9763 static int format3D = 0; // 0:2D, 1:TB, 2:LR(SS), 3:PA, 4:LA, 5:CB, 6:Sensio
9764 int isCBPALASensio = MDrv_SC_3DorderDetect(); // 0:2D, 1:PA, 2:LA, 3:CB, 4:Sensio
9765 int isTBLR = MDrv_SC_3DorderDetect_TBLR(); //0:2D, 1:TB, 2:LR(SS)
9766
9767 if( isCBPALASensio )
9768 format3D = isCBPALASensio +2;
9769 else
9770 format3D = isTBLR;
9771
9772 //printf("3D format is = %d\n", format3D );
9773
9774 return format3D;
9775
9776 }
9777 //--------- 3D source format detection end ---------//
NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)9778 void NoiseMaskingControl(int DBKStr,MS_BOOL isSceneChange)
9779 {
9780 int NM_Gain = __minmax( DBKStr/10-7, 1, 3);
9781 MApi_XC_W2BYTEMSK(REG_SC_BK0C_52_L, NM_Gain, 0x003F);//Y noise masking gain
9782 if (isSceneChange )
9783 {
9784 MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x00, 0x0008); //Y noise masking off
9785 }
9786 else
9787 {
9788 MApi_XC_W2BYTEMSK(REG_SC_BK0C_50_L, 0x08, 0x0008); //Y noise masking on
9789 }
9790 }
normFactorWidth(MS_U32 u32AvgBLKN)9791 MS_S8 normFactorWidth(MS_U32 u32AvgBLKN)
9792 {
9793 MS_S8 s8NormFac = 0;
9794 if (u32AvgBLKN > 1048576*1024)
9795 {
9796 s8NormFac = 25;
9797 }
9798 else if (u32AvgBLKN > 1048576*512)
9799 {
9800 s8NormFac = 24;
9801 }
9802 else if (u32AvgBLKN > 1048576*256)
9803 {
9804 s8NormFac = 23;
9805 }
9806 else if (u32AvgBLKN > 1048576*128)
9807 {
9808 s8NormFac = 22;
9809 }
9810 else if (u32AvgBLKN > 1048576*64)
9811 {
9812 s8NormFac = 21;
9813 }
9814 else if (u32AvgBLKN > 1048576*32)
9815 {
9816 s8NormFac = 20;
9817 }
9818 else if (u32AvgBLKN > 1048576*16)
9819 {
9820 s8NormFac = 19;
9821 }
9822 else if (u32AvgBLKN > 1048576*8)
9823 {
9824 s8NormFac = 18;
9825 }
9826 else if (u32AvgBLKN > 1048576*4)
9827 {
9828 s8NormFac = 17;
9829 }
9830 else if (u32AvgBLKN > 1048576*2)
9831 {
9832 s8NormFac = 16;
9833 }
9834 else if (u32AvgBLKN > 1048576)
9835 {
9836 s8NormFac = 15;
9837 }
9838 else if (u32AvgBLKN > 524288)
9839 {
9840 s8NormFac = 14;
9841 }
9842 else if (u32AvgBLKN > 262144)
9843 {
9844 s8NormFac = 13;
9845 }
9846 else if (u32AvgBLKN > 131072)
9847 {
9848 s8NormFac = 12;
9849 }
9850 else if (u32AvgBLKN > 65536)
9851 {
9852 s8NormFac = 11;
9853 }
9854 else if (u32AvgBLKN > 32768)
9855 {
9856 s8NormFac = 10;
9857 }
9858 else if (u32AvgBLKN > 16384)
9859 {
9860 s8NormFac = 9;
9861 }
9862 else if (u32AvgBLKN > 8192)
9863 {
9864 s8NormFac = 8;
9865 }
9866 else if (u32AvgBLKN > 4096)
9867 {
9868 s8NormFac = 7;
9869 }
9870 else if (u32AvgBLKN > 2048)
9871 {
9872 s8NormFac = 6;
9873 }
9874 else if (u32AvgBLKN > 1024)
9875 {
9876 s8NormFac = 5;
9877 }
9878 else if (u32AvgBLKN > 512)
9879 {
9880 s8NormFac = 4;
9881 }
9882 else if (u32AvgBLKN > 256)
9883 {
9884 s8NormFac = 3;
9885 }
9886 else if (u32AvgBLKN > 128)
9887 {
9888 s8NormFac = 2;
9889 }
9890 else if (u32AvgBLKN > 64)
9891 {
9892 s8NormFac = 1;
9893 }
9894 else if (u32AvgBLKN > 32)
9895 {
9896 s8NormFac = 0;
9897 }
9898 else if (u32AvgBLKN > 16)
9899 {
9900 s8NormFac = -1;
9901 }
9902 else if (u32AvgBLKN > 8)
9903 {
9904 s8NormFac = -2;
9905 }
9906 else
9907 {
9908 s8NormFac = 0;
9909 }
9910
9911 return s8NormFac;
9912 }
readVHistogramPart(MS_U8 u8PartIndex)9913 MS_U8 readVHistogramPart(MS_U8 u8PartIndex)
9914 {
9915 MS_U8 u8Data_ack_en;
9916 MS_U16 u16MarkGain_ack_en;
9917 MS_U8 u8SuccessAct = 0;
9918 //MS_U16 u16Blkwei_Err= 0;
9919 static MS_U8 u8RequestFlag = 0;
9920
9921 //--------- Blockiness Histogram Request start ---------//
9922 if (u8PartIndex == 0 && u8RequestFlag == 0)
9923 {
9924 // write 1 to request register
9925 MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 1, 0x0001); //reg_bkn_statistic_ack
9926 u8RequestFlag = 1;
9927 //printf("V Sequence Request 1 \n");
9928 }
9929 //--------- Blockiness Histogram Acknowledge start ---------//
9930 u8Data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK60_7D_L, 0x0002); //reg_bkn_width_statistic_ack
9931 MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, 0x8000, 0x8000);//blk_wei sram io enable
9932 //u16Blkwei_Err = MApi_XC_R2BYTEMSK(REG_SC_BK47_7B_L, 0x0100);//blk_wei_err
9933 u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_78_L, 0x2000);
9934 //printf("V Sequence blk_wei IO 1 u16Blkwei_Err:%d u8Data_ack_en:%d u16MarkGain_ack_en:%d\n",u16Blkwei_Err,u8Data_ack_en,u16MarkGain_ack_en);
9935 //--------- Function Process start ---------//
9936 if(u8Data_ack_en)
9937 {
9938 // write 1 to sram_io_en register
9939 MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0x0100, 0x0100); //reg_bkn_sram_io_en
9940 //printf("V Sequence sram_io_en 1\n");
9941 if(u16MarkGain_ack_en)
9942 {
9943 MApi_XC_W2BYTEMSK(REG_SC_BK60_7D_L, 0, 0x0001);//reg_bkn_statistic_ack
9944 u8SuccessAct = 1;
9945 u8RequestFlag = 0;
9946 //printf("V Sequence Request 0\n");
9947 }
9948 }
9949 else//(!data_ack_en)
9950 {
9951 u8SuccessAct = 0;
9952 }
9953
9954 return u8SuccessAct;
9955
9956 }
9957
readHistogramPart(MS_U8 u8CountForDBK)9958 MS_U8 readHistogramPart(MS_U8 u8CountForDBK)
9959 {
9960 MS_U8 u8Data_ack_en;
9961 MS_U16 u16MarkGain_ack_en;
9962 MS_U8 u8SuccessAct = 0;
9963 //MS_U16 u16Blkwei_Err= 0;
9964 static MS_U8 u8RequestFlag = 0;
9965
9966 //MS_U16 u16Bin;
9967
9968 //--------- Blockiness Histogram Request start ---------//
9969 if (u8CountForDBK == 0 && u8RequestFlag == 0)
9970 {
9971 // write 1 to request register
9972 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 1, 0x0001);
9973 u8RequestFlag = 1;
9974 //printf("Sequence Request 1 \n");
9975 }
9976
9977 //--------- Blockiness Histogram Acknowledge start ---------//
9978 u8Data_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0D_L, 0x0002);
9979 MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, 0x8000, 0x8000);//blk_wei sram io enable
9980 //u16Blkwei_Err = MApi_XC_R2BYTEMSK(REG_SC_BK47_0B_L, 0x0100);//blk_wei_err
9981 u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_08_L, 0x2000);
9982 //printf("Sequence blk_wei IO 1 u16Blkwei_Err:%d u8Data_ack_en:%d u16MarkGain_ack_en:%d\n",u16Blkwei_Err,u8Data_ack_en,u16MarkGain_ack_en);
9983
9984 //--------- Function Process start ---------//
9985 if(u8Data_ack_en)//&& u16Blkwei_Err == 0)
9986 {
9987
9988 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);//sram_io_en
9989 //printf("Sequence sram_io_en 1\n");
9990 //u16MarkGain_ack_en = MApi_XC_R2BYTEMSK(REG_SC_BK47_08_L, 0x2000);
9991 if(u16MarkGain_ack_en)
9992 {
9993
9994 #if 0
9995 // write 1 to sram_io_en register
9996 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0x0100, 0x0100);
9997 for(u16Bin = u16Initial_point; u16Bin < u16End_point; u16Bin++)
9998 {
9999 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0E_L, (MS_U16)(0x8000 + u16Bin), 0xFFFF);
10000 // read data from selected address
10001 au16Histogram[u16Bin] = MApi_XC_R2BYTEMSK(REG_SC_BK0C_0F_L, 0xFFFF);
10002 }
10003 #endif
10004 MApi_XC_W2BYTEMSK(REG_SC_BK0C_0D_L, 0, 0x0001);
10005 u8SuccessAct = 1;
10006 u8RequestFlag = 0;
10007 //printf("Sequence Request 0\n");
10008 }
10009 }
10010 else//(!data_ack_en)
10011 {
10012 u8SuccessAct = 0;
10013 }
10014
10015 return u8SuccessAct;
10016 }
VStartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)10017 MS_U8 VStartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)
10018 {
10019 static MS_U8 u8BufferCount = 1;
10020 MS_U8 u8BufferIndex =0;
10021 static MS_U8 u8StartPositionBuffer[10] = {0};
10022 MS_U16 u16StartPositionSum = 0;
10023 MS_U8 u8StartPositionAvg = 0;
10024 static MS_U8 u8StartPositionLast = 255;
10025 static MS_U8 u8StartPositionConfidence = 0;
10026 MS_U8 u8ConfidenceLevel = 7;
10027 static MS_U8 u8BufferFull = 0;
10028 MS_U8 u8BufferLoop = 0;
10029
10030 if(isSceneChangeY)
10031 {
10032 u8StartPositionLast = 255;
10033 u8BufferFull = 0;
10034 }
10035
10036 if(u8StartPositionLast == 255)
10037 {
10038 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10039 }
10040 else
10041 {
10042 if(u8StartPositionLast == u8StartPosition)
10043 {
10044 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10045 u8StartPositionConfidence++;
10046 u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10047 }
10048 else
10049 {
10050 u8StartPositionConfidence--;
10051 u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10052 if(u8StartPositionConfidence > u8ConfidenceLevel)
10053 {
10054 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPositionLast;
10055 }
10056 else
10057 {
10058 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10059 }
10060 }
10061 }
10062 u8StartPositionLast = u8StartPositionBuffer[u8BufferCount - 1];
10063
10064 //printf("u8BufferIndex:%d u8StartPosition:%d u8StartPositionLast:%d\n",(u8BufferCount-1),u8StartPosition,u8StartPositionLast);
10065
10066 if(u8BufferFull)
10067 {
10068 u8BufferLoop = 10;
10069 }
10070 else
10071 {
10072 u8BufferLoop = u8BufferCount;
10073 }
10074
10075 for(u8BufferIndex = 0;u8BufferIndex<u8BufferLoop;u8BufferIndex++)
10076 {
10077 u16StartPositionSum+= u8StartPositionBuffer[u8BufferIndex];
10078 //printf("u8StartPositionBuffer[%d]:%d u8BufferCount:%d\n",u8BufferIndex,u8StartPositionBuffer[u8BufferIndex],u8BufferCount);
10079 }
10080 u8StartPositionAvg = u16StartPositionSum/u8BufferLoop;
10081 //printf("u8StartPositionAvg:%d u8StartPositionConfidence:%d \n",u8StartPositionAvg,u8StartPositionConfidence);
10082
10083 if(u8BufferCount == 10)
10084 {
10085 u8BufferCount = 1;
10086 u8BufferFull = 1;
10087 }
10088 else
10089 {
10090 u8BufferCount++;
10091 }
10092 return u8StartPositionAvg;
10093 }
StartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)10094 MS_U8 StartPositionAverage(MS_U8 u8StartPosition,MS_BOOL isSceneChangeY)
10095 {
10096 static MS_U8 u8BufferCount = 1;
10097 MS_U8 u8BufferIndex =0;
10098 static MS_U8 u8StartPositionBuffer[10] = {0};
10099 MS_U16 u16StartPositionSum = 0;
10100 MS_U8 u8StartPositionAvg = 0;
10101 static MS_U8 u8StartPositionLast = 255;
10102 static MS_U8 u8StartPositionConfidence = 0;
10103 MS_U8 u8ConfidenceLevel = 7;
10104 static MS_U8 u8BufferFull = 0;
10105 MS_U8 u8BufferLoop = 0;
10106
10107 if(isSceneChangeY)
10108 {
10109 u8StartPositionLast = 255;
10110 u8BufferFull = 0;
10111 }
10112
10113 if(u8StartPositionLast == 255)
10114 {
10115 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10116 }
10117 else
10118 {
10119 if(u8StartPositionLast == u8StartPosition)
10120 {
10121 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10122 u8StartPositionConfidence++;
10123 u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10124 }
10125 else
10126 {
10127 u8StartPositionConfidence--;
10128 u8StartPositionConfidence = __minmax(u8StartPositionConfidence,0,10);
10129 if(u8StartPositionConfidence > u8ConfidenceLevel)
10130 {
10131 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPositionLast;
10132 }
10133 else
10134 {
10135 u8StartPositionBuffer[u8BufferCount - 1] = u8StartPosition;
10136 }
10137 }
10138 }
10139 u8StartPositionLast = u8StartPositionBuffer[u8BufferCount - 1];
10140
10141 //printf("u8BufferIndex:%d u8StartPosition:%d u8StartPositionLast:%d\n",(u8BufferCount-1),u8StartPosition,u8StartPositionLast);
10142
10143 if(u8BufferFull)
10144 {
10145 u8BufferLoop = 10;
10146 }
10147 else
10148 {
10149 u8BufferLoop = u8BufferCount;
10150 }
10151
10152 for(u8BufferIndex = 0;u8BufferIndex<u8BufferLoop;u8BufferIndex++)
10153 {
10154 u16StartPositionSum+= u8StartPositionBuffer[u8BufferIndex];
10155 //printf("u8StartPositionBuffer[%d]:%d u8BufferCount:%d\n",u8BufferIndex,u8StartPositionBuffer[u8BufferIndex],u8BufferCount);
10156 }
10157 u8StartPositionAvg = u16StartPositionSum/u8BufferLoop;
10158 //printf("u8StartPositionAvg:%d u8StartPositionConfidence:%d \n",u8StartPositionAvg,u8StartPositionConfidence);
10159
10160 if(u8BufferCount == 10)
10161 {
10162 u8BufferCount = 1;
10163 u8BufferFull = 1;
10164 }
10165 else
10166 {
10167 u8BufferCount++;
10168 }
10169
10170 return u8StartPositionAvg;
10171 }
VDBK_FindStartPosition(MS_U8 u8VWidth,MS_BOOL isSceneChangeY)10172 MS_U8 VDBK_FindStartPosition(MS_U8 u8VWidth,MS_BOOL isSceneChangeY)
10173 {
10174 MS_U32 u32AccMax[32] = {0};
10175 MS_U32 u32AccMaxSum[32] = {0};
10176 MS_U32 u32Max = 0;
10177 MS_U8 u8StartPosition = 0;
10178 MS_U8 u8StartPositionAverage = 0;
10179 MS_U8 u8FindIndex = 0;
10180 MS_U8 u8InitailPosition = 0;
10181 //printf("easter befor read\n");
10182 u32AccMax[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_40_L, 0x1FFF);
10183 u32AccMax[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_41_L, 0x1FFF);
10184 u32AccMax[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_42_L, 0x1FFF);
10185 u32AccMax[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_43_L, 0x1FFF);
10186 u32AccMax[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_44_L, 0x1FFF);
10187 u32AccMax[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_45_L, 0x1FFF);
10188 u32AccMax[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_46_L, 0x1FFF);
10189 u32AccMax[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_47_L, 0x1FFF);
10190 u32AccMax[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_48_L, 0x1FFF);
10191 u32AccMax[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_49_L, 0x1FFF);
10192 u32AccMax[10] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4A_L, 0x1FFF);
10193 u32AccMax[11] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4B_L, 0x1FFF);
10194 u32AccMax[12] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4C_L, 0x1FFF);
10195 u32AccMax[13] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4D_L, 0x1FFF);
10196 u32AccMax[14] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4E_L, 0x1FFF);
10197 u32AccMax[15] = MApi_XC_R2BYTEMSK(REG_SC_BK47_4F_L, 0x1FFF);
10198 u32AccMax[16] = MApi_XC_R2BYTEMSK(REG_SC_BK47_50_L, 0x1FFF);
10199 u32AccMax[17] = MApi_XC_R2BYTEMSK(REG_SC_BK47_51_L, 0x1FFF);
10200 u32AccMax[18] = MApi_XC_R2BYTEMSK(REG_SC_BK47_52_L, 0x1FFF);
10201 u32AccMax[19] = MApi_XC_R2BYTEMSK(REG_SC_BK47_53_L, 0x1FFF);
10202 u32AccMax[20] = MApi_XC_R2BYTEMSK(REG_SC_BK47_54_L, 0x1FFF);
10203 u32AccMax[21] = MApi_XC_R2BYTEMSK(REG_SC_BK47_55_L, 0x1FFF);
10204 u32AccMax[22] = MApi_XC_R2BYTEMSK(REG_SC_BK47_56_L, 0x1FFF);
10205 u32AccMax[23] = MApi_XC_R2BYTEMSK(REG_SC_BK47_57_L, 0x1FFF);
10206 u32AccMax[24] = MApi_XC_R2BYTEMSK(REG_SC_BK47_58_L, 0x1FFF);
10207 u32AccMax[25] = MApi_XC_R2BYTEMSK(REG_SC_BK47_59_L, 0x1FFF);
10208 u32AccMax[26] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5A_L, 0x1FFF);
10209 u32AccMax[27] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5B_L, 0x1FFF);
10210 u32AccMax[28] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5C_L, 0x1FFF);
10211 u32AccMax[29] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5D_L, 0x1FFF);
10212 u32AccMax[30] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5E_L, 0x1FFF);
10213 u32AccMax[31] = MApi_XC_R2BYTEMSK(REG_SC_BK47_5F_L, 0x1FFF);
10214 //printf("easter findstart\n");
10215 u8InitailPosition = MApi_XC_R2BYTEMSK(REG_SC_BK47_64_L, 0x00FF);
10216
10217 for(u8FindIndex = 0;u8FindIndex<u8VWidth;u8FindIndex++)
10218 {
10219 if(u8FindIndex ==0)
10220 {
10221 u32AccMaxSum[0] = u32AccMax[u8VWidth - 1] + u32AccMax[0] + u32AccMax[1];
10222 }
10223 else if(u8FindIndex == (u8VWidth - 1))
10224 {
10225 u32AccMaxSum[u8VWidth - 1] = u32AccMax[u8VWidth - 2] + u32AccMax[u8VWidth - 1] + u32AccMax[1];
10226 }
10227 else
10228 {
10229 u32AccMaxSum[u8FindIndex] = u32AccMax[u8FindIndex - 1] + u32AccMax[u8FindIndex] + u32AccMax[u8FindIndex + 1];
10230 }
10231
10232 if(u8VWidth == 8 || u8VWidth == 11)
10233 {
10234 if(u32AccMax[u8FindIndex]>2*u32Max)
10235 {
10236 u32Max = u32AccMax[u8FindIndex];
10237 u8StartPosition = u8InitailPosition + u8FindIndex;
10238 }
10239 else if(u32AccMax[u8FindIndex]>u32Max)
10240 {
10241 u32Max = u32AccMax[u8FindIndex];
10242 u8StartPosition = u8InitailPosition + u8FindIndex;
10243 }
10244 }
10245 else
10246 {
10247 if(u32AccMaxSum[u8FindIndex]>u32Max)
10248 {
10249 u32Max = u32AccMaxSum[u8FindIndex];
10250 u8StartPosition = u8InitailPosition + u8FindIndex;
10251 }
10252 }
10253 //printf("u32AccMaxSum:%d u32AccMax:%d u32Max:%d\n",u32AccMaxSum[u8FindIndex],u32AccMax[u8FindIndex],u32Max);
10254
10255 }
10256
10257
10258 u8StartPositionAverage = VStartPositionAverage(u8StartPosition,isSceneChangeY);
10259
10260 MApi_XC_W2BYTEMSK(REG_SC_BK47_61_L, u8StartPositionAverage, 0x1FFF);//set start to Max->Mark
10261 return u8StartPositionAverage;
10262 }
DBK_FindStartPosition(MS_U8 u8Width,MS_BOOL isSceneChangeY)10263 MS_U8 DBK_FindStartPosition(MS_U8 u8Width,MS_BOOL isSceneChangeY)
10264 {
10265 MS_U32 u32AccMax[32] = {0};
10266 MS_U32 u32AccMaxSum[32] = {0};
10267 MS_U32 u32Max = 0;
10268 MS_U8 u8StartPosition = 0;
10269 MS_U8 u8StartPositionAverage = 0;
10270 MS_U8 u8FindIndex = 0;
10271 MS_U8 u8InitailPosition = 0;
10272 //printf("easter befor read\n");
10273 u32AccMax[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_10_L, 0x1FFF);
10274 u32AccMax[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_11_L, 0x1FFF);
10275 u32AccMax[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_12_L, 0x1FFF);
10276 u32AccMax[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_13_L, 0x1FFF);
10277 u32AccMax[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_14_L, 0x1FFF);
10278 u32AccMax[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_15_L, 0x1FFF);
10279 u32AccMax[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_16_L, 0x1FFF);
10280 u32AccMax[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_17_L, 0x1FFF);
10281 u32AccMax[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_18_L, 0x1FFF);
10282 u32AccMax[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK47_19_L, 0x1FFF);
10283 u32AccMax[10] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1A_L, 0x1FFF);
10284 u32AccMax[11] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1B_L, 0x1FFF);
10285 u32AccMax[12] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1C_L, 0x1FFF);
10286 u32AccMax[13] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1D_L, 0x1FFF);
10287 u32AccMax[14] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1E_L, 0x1FFF);
10288 u32AccMax[15] = MApi_XC_R2BYTEMSK(REG_SC_BK47_1F_L, 0x1FFF);
10289 u32AccMax[16] = MApi_XC_R2BYTEMSK(REG_SC_BK47_20_L, 0x1FFF);
10290 u32AccMax[17] = MApi_XC_R2BYTEMSK(REG_SC_BK47_21_L, 0x1FFF);
10291 u32AccMax[18] = MApi_XC_R2BYTEMSK(REG_SC_BK47_22_L, 0x1FFF);
10292 u32AccMax[19] = MApi_XC_R2BYTEMSK(REG_SC_BK47_23_L, 0x1FFF);
10293 u32AccMax[20] = MApi_XC_R2BYTEMSK(REG_SC_BK47_24_L, 0x1FFF);
10294 u32AccMax[21] = MApi_XC_R2BYTEMSK(REG_SC_BK47_25_L, 0x1FFF);
10295 u32AccMax[22] = MApi_XC_R2BYTEMSK(REG_SC_BK47_26_L, 0x1FFF);
10296 u32AccMax[23] = MApi_XC_R2BYTEMSK(REG_SC_BK47_27_L, 0x1FFF);
10297 u32AccMax[24] = MApi_XC_R2BYTEMSK(REG_SC_BK47_28_L, 0x1FFF);
10298 u32AccMax[25] = MApi_XC_R2BYTEMSK(REG_SC_BK47_29_L, 0x1FFF);
10299 u32AccMax[26] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2A_L, 0x1FFF);
10300 u32AccMax[27] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2B_L, 0x1FFF);
10301 u32AccMax[28] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2C_L, 0x1FFF);
10302 u32AccMax[29] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2D_L, 0x1FFF);
10303 u32AccMax[30] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2E_L, 0x1FFF);
10304 u32AccMax[31] = MApi_XC_R2BYTEMSK(REG_SC_BK47_2F_L, 0x1FFF);
10305 //printf("easter findstart\n");
10306 u8InitailPosition = MApi_XC_R2BYTEMSK(REG_SC_BK47_34_L, 0x00FF);
10307 if(u8Width == 8)
10308 {
10309 MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0x0000, 0xC000); //markline_toler_pts 0->3
10310 MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x000F, 0x00FF); //max statistic thrd/toler_pts
10311 }
10312 else if(u8Width == 11)
10313 {
10314 MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0x4000, 0xC000); //markline_toler_pts 0->3
10315 MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x000F, 0x00FF); //max statistic thrd/toler_pts
10316 }
10317 else
10318 {
10319 MApi_XC_W2BYTEMSK(REG_SC_BK47_33_L, 0xC000, 0xC000); //markline_toler_pts 0->3
10320 MApi_XC_W2BYTEMSK(REG_SC_BK47_0B_L, 0x00C4, 0x00FF); //max statistic thrd/toler_pts
10321 }
10322
10323 for(u8FindIndex = 0;u8FindIndex<u8Width;u8FindIndex++)
10324 {
10325 if(u8FindIndex ==0)
10326 {
10327 u32AccMaxSum[0] = u32AccMax[u8Width - 1] + u32AccMax[0] + u32AccMax[1];
10328 }
10329 else if(u8FindIndex == (u8Width - 1))
10330 {
10331 u32AccMaxSum[u8Width - 1] = u32AccMax[u8Width - 2] + u32AccMax[u8Width - 1] + u32AccMax[1];
10332 }
10333 else
10334 {
10335 u32AccMaxSum[u8FindIndex] = u32AccMax[u8FindIndex - 1] + u32AccMax[u8FindIndex] + u32AccMax[u8FindIndex + 1];
10336 }
10337
10338 if(u8Width == 8 || u8Width == 11)
10339 {
10340 if(u32AccMax[u8FindIndex]>2*u32Max)
10341 {
10342 u32Max = u32AccMax[u8FindIndex];
10343 u8StartPosition = u8InitailPosition + u8FindIndex;
10344 }
10345 else if(u32AccMax[u8FindIndex]>u32Max)
10346 {
10347 u32Max = u32AccMax[u8FindIndex];
10348 u8StartPosition = u8InitailPosition + u8FindIndex;
10349 }
10350 }
10351 else
10352 {
10353 if(u32AccMaxSum[u8FindIndex]>u32Max)
10354 {
10355 u32Max = u32AccMaxSum[u8FindIndex];
10356 u8StartPosition = u8InitailPosition + u8FindIndex;
10357 }
10358 }
10359 //printf("u32AccMaxSum:%d u32AccMax:%d u32Max:%d\n",u32AccMaxSum[u8FindIndex],u32AccMax[u8FindIndex],u32Max);
10360
10361 }
10362
10363
10364 u8StartPositionAverage = StartPositionAverage(u8StartPosition,isSceneChangeY);
10365
10366 MApi_XC_W2BYTEMSK(REG_SC_BK47_31_L, u8StartPositionAverage, 0x1FFF);//set start to Max->Mark
10367 return u8StartPositionAverage;
10368 }
VDBK_WidthPartHW(MS_BOOL isSceneChangeY,MS_U16 * u16WidthDiffHW,MS_U16 * u16MaxMinDiff,MS_U16 * u16WidthAvg,MS_S16 * as16MinDiffIndex,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 * u8VwidthConfidence)10369 MS_S8 VDBK_WidthPartHW(MS_BOOL isSceneChangeY,MS_U16 *u16WidthDiffHW,MS_U16 *u16MaxMinDiff,MS_U16 *u16WidthAvg,MS_S16 *as16MinDiffIndex
10370 ,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 *u8VwidthConfidence)
10371 {
10372 MS_U32 u32Avg =0;
10373 MS_U8 u8Index;
10374 MS_U32 u32MaxWidthDiff = 0;
10375 MS_U32 u32MinWidthDiff = 0x7FFFFFFF;
10376 MS_U32 u32Min2WidthDiff = 0x7FFFFFFF;
10377 MS_U32 u32Min3WidthDiff = 0x7FFFFFFF;
10378 MS_U32 u32Min4WidthDiff = 0x7FFFFFFF;
10379 MS_S8 s8OutWidth = -1;
10380 MS_S8 s8MinIdx = -1, s8min2Idx = -1, s8min3Idx = -1, s8min4Idx = -1;
10381 MS_S8 s8MinWidth = -1, s8min2Width = -1, s8min3Width = -1, s8min4Width = -1;
10382 MS_U16 u16DiffThrd = 2048;
10383 static MS_S8 s8ReferHconfidence = 0,s8Vwidthconfidence = 0;
10384 //long ScalingRatio = 1<<20;
10385 // long ScalingRatio = (MApi_XC_R2BYTEMSK(REG_SC_BK23_0A_L,0x00FF)<<16) + MApi_XC_R2BYTEMSK(REG_SC_BK23_09_L,0xFFFF);
10386 //const int OrigWidth = 8;
10387 //long EstWidth = (ScalingRatio*OrigWidth + (1<<19) ) >> 20;
10388 if(isSceneChangeY)
10389 {
10390 s8ReferHconfidence = 0;
10391 s8Vwidthconfidence = 0;
10392 }
10393
10394 u16WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_60_L,0xFFFF); // width 5
10395 u16WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_61_L,0xFFFF); // width 6
10396 u16WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_62_L,0xFFFF); // width 7
10397 u16WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_63_L,0xFFFF); // width 8
10398 u16WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_64_L,0xFFFF); // width 9
10399 u16WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_65_L,0xFFFF); // width 10
10400 u16WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_66_L,0xFFFF); // width 11
10401 u16WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_67_L,0xFFFF); // width 12
10402 u16WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_68_L,0xFFFF); // width 13
10403 u16WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_69_L,0xFFFF); // width 14
10404 u16WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6A_L,0xFFFF); // width 15
10405 u16WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6B_L,0xFFFF); // width 16
10406 u16WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6C_L,0xFFFF); // width 17
10407 u16WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6D_L,0xFFFF); // width 18
10408 u16WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6E_L,0xFFFF); // width 19
10409 u16WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_6F_L,0xFFFF); // width 20
10410 for(u8Index = 0 ; u8Index < paraVerSize ; u8Index++)
10411 {
10412 if (u16WidthDiffHW[u8Index] > u32MaxWidthDiff)
10413 {
10414 u32MaxWidthDiff = u16WidthDiffHW[u8Index];
10415 }
10416 //printf("V states width :%d u16WidthDiffHW:%d\n",u8Index+5,u16WidthDiffHW[u8Index]);
10417 }
10418 for(u8Index = 0 ; u8Index < paraVerSize -1; u8Index+=2)
10419 {
10420 if ( (u8Index==2 || u8Index==10 ) && (u16WidthDiffHW[u8Index+1] - u16WidthDiffHW[u8Index ] <= u16DiffThrd) )
10421 {
10422 u16WidthDiffHW[u8Index+1]= __min(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index+1]);
10423 u16WidthDiffHW[u8Index ]= u32MaxWidthDiff;
10424 }
10425 }
10426
10427 for(u8Index = 0 ; u8Index < paraVerSize ; u8Index++)
10428 {
10429 u32Avg += u16WidthDiffHW[u8Index];
10430
10431 if (u16WidthDiffHW[u8Index] < u32MinWidthDiff)
10432 {
10433 u32Min4WidthDiff = u32Min3WidthDiff;
10434 s8min4Idx = s8min3Idx;
10435 u32Min3WidthDiff = u32Min2WidthDiff;
10436 s8min3Idx = s8min2Idx;
10437 u32Min2WidthDiff = u32MinWidthDiff;
10438 s8min2Idx = s8MinIdx;
10439
10440 u32MinWidthDiff = u16WidthDiffHW[u8Index];
10441 s8MinIdx = u8Index;
10442
10443 }
10444 else if (u16WidthDiffHW[u8Index] < u32Min2WidthDiff)
10445 {
10446 u32Min4WidthDiff = u32Min3WidthDiff;
10447 s8min4Idx = s8min3Idx;
10448 u32Min3WidthDiff = u32Min2WidthDiff;
10449 s8min3Idx = s8min2Idx;
10450
10451 u32Min2WidthDiff = u16WidthDiffHW[u8Index];
10452 s8min2Idx = u8Index;
10453
10454 }
10455 else if (u16WidthDiffHW[u8Index] < u32Min3WidthDiff)
10456 {
10457 u32Min4WidthDiff = u32Min3WidthDiff;
10458 s8min4Idx = s8min3Idx;
10459
10460 u32Min3WidthDiff = u16WidthDiffHW[u8Index];
10461 s8min3Idx = u8Index;
10462
10463 }
10464 else if (u16WidthDiffHW[u8Index] < u32Min4WidthDiff)
10465 {
10466 u32Min4WidthDiff = u16WidthDiffHW[u8Index];
10467 s8min4Idx = u8Index;
10468 }
10469 }
10470
10471 *u16WidthAvg = u32Avg / paraVerSize;
10472 *u16MaxMinDiff = u32MaxWidthDiff - u32MinWidthDiff;
10473
10474 if ( s8MinIdx != -1)
10475 {
10476 s8MinWidth = s8MinIdx +5;
10477 }
10478 if ( s8min2Idx != -1)
10479 {
10480 s8min2Width = s8min2Idx+5;
10481 }
10482 if ( s8min3Idx != -1)
10483 {
10484 s8min3Width = s8min3Idx+5;
10485 }
10486 if ( s8min4Idx != -1)
10487 {
10488 s8min4Width = s8min4Idx+5;
10489 }
10490
10491 as16MinDiffIndex[0] = s8MinIdx;
10492 as16MinDiffIndex[1] = s8min2Idx;
10493 as16MinDiffIndex[2] = s8min3Idx;
10494 as16MinDiffIndex[3] = s8min4Idx;
10495 //PRT_TRP(" --min4WidthDiff = %d, min4Idx=%d, min4Width =%d \n", min4WidthDiff, min4Idx, min4Width);
10496 //PRT_TRP(" --min3WidthDiff = %d, min3Idx=%d, min3Width =%d \n", min3WidthDiff, min3Idx, min3Width);
10497 //PRT_TRP(" --min2WidthDiff = %d, min2Idx=%d, min2Width =%d \n", min2WidthDiff, min2Idx, min2Width);
10498 //PRT_TRP(" --minWidthDiff = %d, minIdx =%d, minWidth =%d \n", minWidthDiff , minIdx , minWidth );
10499 //PRT_TRP(" --maxWidthDiff = %d, maxIdx =%d \n", maxWidthDiff , maxIdx );
10500 //PRT_TRP(" --avg = %d \n", avg );
10501 //PRT_TRP(" --MaxMinDiff = %d \n", MaxMinDiff );
10502 //printf("V states s8MinWidth:%d ,s8min2Width:%d , s8min3Width:%d ,s8min4Width:%d\n",s8MinWidth ,s8min2Width , s8min3Width,s8min4Width);
10503 //printf("V states u8HwidthConfidence:%d\n",u8HwidthConfidence);
10504 if (u8HwidthConfidence > 10)
10505 {
10506 if(u8Widdth == 8)
10507 {
10508 if((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10509 ||(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10510 {
10511 s8OutWidth = 8;
10512 s8ReferHconfidence++;
10513 s8Vwidthconfidence--;
10514 }
10515 }
10516 else if(u8Widdth == 11)
10517 {
10518 if((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10519 ||(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10520 {
10521 s8OutWidth = 8;
10522 s8ReferHconfidence++;
10523 s8Vwidthconfidence--;
10524 }
10525 else if(s8MinWidth == 11 ||s8min2Width == 11|| s8min3Width == 11|| s8min4Width == 11)
10526 {
10527 s8OutWidth = 11;
10528 s8ReferHconfidence++;
10529 s8Vwidthconfidence--;
10530 }
10531 }
10532 else if (u8Widdth == 16)
10533 {
10534 if(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16)
10535 {
10536 s8OutWidth = 16;
10537 s8ReferHconfidence++;
10538 s8Vwidthconfidence--;
10539 }
10540 else if((s8MinWidth == 17 ||s8min2Width == 17|| s8min3Width == 17|| s8min4Width == 17)
10541 &&(s8MinWidth == 18 ||s8min2Width == 18|| s8min3Width == 18|| s8min4Width == 18))
10542 {
10543 s8OutWidth = 18;
10544 s8ReferHconfidence++;
10545 s8Vwidthconfidence--;
10546 }
10547 }
10548 else if (u8Widdth == 21)
10549 {
10550 if((s8MinWidth == 17 ||s8min2Width == 17|| s8min3Width == 17|| s8min4Width == 17)
10551 &&(s8MinWidth == 18 ||s8min2Width == 18|| s8min3Width == 18|| s8min4Width == 18))
10552 {
10553 s8OutWidth = 18;
10554 s8ReferHconfidence++;
10555 s8Vwidthconfidence--;
10556 }
10557 }
10558 }
10559 else if ((s8MinWidth == 8 ||s8min2Width == 8 || s8min3Width == 8 || s8min4Width == 8)
10560 &&(s8MinWidth == 16 || s8min2Width == 16 || s8min3Width == 16 || s8min4Width == 16))
10561 {
10562 s8OutWidth = 8;
10563 s8ReferHconfidence--;
10564 s8Vwidthconfidence++;
10565 }
10566 else
10567 {
10568 s8OutWidth = -1;
10569 s8Vwidthconfidence--;
10570 s8ReferHconfidence--;
10571 }
10572 s8ReferHconfidence = __minmax(s8ReferHconfidence,0,16);
10573 s8Vwidthconfidence = __minmax(s8Vwidthconfidence,0,16);
10574 if(s8Vwidthconfidence >15)
10575 {
10576 s8ReferHconfidence = 0;
10577 }
10578
10579 if(s8ReferHconfidence >15)
10580 {
10581 s8Vwidthconfidence = 0;
10582 }
10583
10584 *u8VwidthConfidence = __max(s8ReferHconfidence,s8Vwidthconfidence);
10585
10586 return s8OutWidth;
10587 }
DBK_WidthPartHW(MS_U16 * u16WidthDiffHW,MS_U16 * u16Avg,MS_BOOL isSceneChangeY,MS_U8 * u8WidthConfidence)10588 MS_S8 DBK_WidthPartHW(MS_U16 *u16WidthDiffHW, MS_U16* u16Avg,MS_BOOL isSceneChangeY,MS_U8 *u8WidthConfidence)
10589 {
10590 MS_U8 u8Index;
10591 MS_U32 u32MaxWidthDiff = 0;
10592 MS_U32 u32MinWidthDiff = 0x7FFFFFFF;
10593 MS_U32 u32Min2WidthDiff = 0x7FFFFFFF;
10594 MS_U32 u32Min3WidthDiff = 0x7FFFFFFF;
10595 MS_U32 u32Min4WidthDiff = 0x7FFFFFFF;
10596 MS_S8 s8MinIdx = -1, s8Min2Idx = -1, s8Min3Idx = -1, s8Min4Idx = -1;// maxIdx = -1;
10597 static MS_U8 u8TempWidth = 4;
10598 MS_U16 u16DiffThrd = 2048;
10599 static MS_S16 s16ConfidenceLevel8 = 0,s16ConfidenceLevel11 = 0,s16ConfidenceLevel16 = 0,s16ConfidenceLevel21 = 0;
10600 int log_en = 5;
10601 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10602 if(isSceneChangeY)
10603 {
10604 //printf("H isSceneChangeY:[%d]\n",isSceneChangeY);
10605 s16ConfidenceLevel8 = 0;
10606 s16ConfidenceLevel11 = 0;
10607 s16ConfidenceLevel16 = 0;
10608 s16ConfidenceLevel21 = 0;
10609 }
10610 u16WidthDiffHW[0 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_40_L,0xFFFF) ; // width 4
10611 u16WidthDiffHW[1 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_41_L,0xFFFF) ; // width 5
10612 u16WidthDiffHW[2 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_42_L,0xFFFF) ; // width 6
10613 u16WidthDiffHW[3 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_43_L,0xFFFF) ; // width 7
10614 u16WidthDiffHW[4 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_44_L,0xFFFF) ; // width 8
10615 u16WidthDiffHW[5 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_45_L,0xFFFF) ; // width 9
10616 u16WidthDiffHW[6 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_46_L,0xFFFF) ; // width 10
10617 u16WidthDiffHW[7 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_47_L,0xFFFF) ; // width 11
10618 u16WidthDiffHW[8 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_48_L,0xFFFF) ; // width 12
10619 u16WidthDiffHW[9 ] = MApi_XC_R2BYTEMSK(REG_SC_BK60_49_L,0xFFFF) ; // width 13
10620 u16WidthDiffHW[10] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4A_L,0xFFFF) ; // width 14
10621 u16WidthDiffHW[11] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4B_L,0xFFFF) ; // width 15
10622 u16WidthDiffHW[12] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4C_L,0xFFFF) ; // width 16
10623 u16WidthDiffHW[13] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4D_L,0xFFFF) ; // width 17
10624 u16WidthDiffHW[14] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4E_L,0xFFFF) ; // width 18
10625 u16WidthDiffHW[15] = MApi_XC_R2BYTEMSK(REG_SC_BK60_4F_L,0xFFFF) ; // width 19
10626 u16WidthDiffHW[16] = MApi_XC_R2BYTEMSK(REG_SC_BK60_50_L,0xFFFF) ; // width 20
10627 u16WidthDiffHW[17] = MApi_XC_R2BYTEMSK(REG_SC_BK60_51_L,0xFFFF) ; // width 21
10628 u16WidthDiffHW[18] = MApi_XC_R2BYTEMSK(REG_SC_BK60_52_L,0xFFFF) ; // width 22
10629 u16WidthDiffHW[19] = MApi_XC_R2BYTEMSK(REG_SC_BK60_53_L,0xFFFF) ; // width 23
10630 u16WidthDiffHW[20] = MApi_XC_R2BYTEMSK(REG_SC_BK60_54_L,0xFFFF) ; // width 24
10631 u16WidthDiffHW[21] = MApi_XC_R2BYTEMSK(REG_SC_BK60_55_L,0xFFFF) ; // width 25
10632 u16WidthDiffHW[22] = MApi_XC_R2BYTEMSK(REG_SC_BK60_56_L,0xFFFF) ; // width 26
10633 u16WidthDiffHW[23] = MApi_XC_R2BYTEMSK(REG_SC_BK60_57_L,0xFFFF) ; // width 27
10634 u16WidthDiffHW[24] = MApi_XC_R2BYTEMSK(REG_SC_BK60_58_L,0xFFFF) ; // width 28
10635 u16WidthDiffHW[25] = MApi_XC_R2BYTEMSK(REG_SC_BK60_59_L,0xFFFF) ; // width 29
10636 u16WidthDiffHW[26] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5A_L,0xFFFF) ; // width 30
10637 u16WidthDiffHW[27] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5B_L,0xFFFF) ; // width 31
10638 u16WidthDiffHW[28] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5C_L,0xFFFF) ; // width 32
10639 u16WidthDiffHW[29] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5D_L,0xFFFF) ; // width 33
10640 u16WidthDiffHW[30] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5E_L,0xFFFF) ; // width 34
10641 u16WidthDiffHW[31] = MApi_XC_R2BYTEMSK(REG_SC_BK60_5F_L,0xFFFF) ; // width 35
10642
10643 for(u8Index = 1 ; u8Index < paraSize ; u8Index++)
10644 {
10645 if (u16WidthDiffHW[u8Index] > u32MaxWidthDiff)
10646 {
10647 u32MaxWidthDiff = u16WidthDiffHW[u8Index];
10648 }
10649 }
10650
10651 for(u8Index = 1 ; u8Index < paraSize -1; u8Index+=2)
10652 {
10653 if ( (u8Index==3 || u8Index==11 || u8Index==19 || u8Index==27) && (u16WidthDiffHW[u8Index+1] - u16WidthDiffHW[u8Index ] <= u16DiffThrd) )
10654 {
10655 u16WidthDiffHW[u8Index+1]= __min(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index+1]);
10656 u16WidthDiffHW[u8Index ]= u32MaxWidthDiff;
10657 }
10658 else if ( (u8Index==7) && ( (u16WidthDiffHW[u8Index ] - u16WidthDiffHW[u8Index-1 ] <= u16DiffThrd) || (u16WidthDiffHW[u8Index ] - u16WidthDiffHW[u8Index+1 ] <= u16DiffThrd)) )
10659 {
10660 u16WidthDiffHW[u8Index ]= __min3(u16WidthDiffHW[u8Index ], u16WidthDiffHW[u8Index-1], u16WidthDiffHW[u8Index+1]);
10661 u16WidthDiffHW[u8Index-1]= u32MaxWidthDiff;
10662 u16WidthDiffHW[u8Index+1]= u32MaxWidthDiff;
10663 }
10664 }
10665
10666 for(u8Index = 1 ; u8Index < paraSize ; u8Index++)
10667 {
10668 (*u16Avg) += u16WidthDiffHW[u8Index];
10669 if (u16WidthDiffHW[u8Index] < u32MinWidthDiff)
10670 {
10671 u32Min4WidthDiff = u32Min3WidthDiff;
10672 s8Min4Idx = s8Min3Idx;
10673 u32Min3WidthDiff = u32Min2WidthDiff;
10674 s8Min3Idx = s8Min2Idx;
10675 u32Min2WidthDiff = u32MinWidthDiff;
10676 s8Min2Idx = s8MinIdx;
10677 u32MinWidthDiff = u16WidthDiffHW[u8Index];
10678 s8MinIdx = u8Index;
10679 }
10680 else if (u16WidthDiffHW[u8Index] < u32Min2WidthDiff)
10681 {
10682 u32Min4WidthDiff = u32Min3WidthDiff;
10683 s8Min4Idx = s8Min3Idx;
10684 u32Min3WidthDiff = u32Min2WidthDiff;
10685 s8Min3Idx = s8Min2Idx;
10686 u32Min2WidthDiff = u16WidthDiffHW[u8Index];
10687 s8Min2Idx = u8Index;
10688 }
10689 else if (u16WidthDiffHW[u8Index] < u32Min3WidthDiff)
10690 {
10691 u32Min4WidthDiff = u32Min3WidthDiff;
10692 s8Min4Idx = s8Min3Idx;
10693 u32Min3WidthDiff = u16WidthDiffHW[u8Index];
10694 s8Min3Idx = u8Index;
10695 }
10696 else if (u16WidthDiffHW[u8Index] < u32Min4WidthDiff)
10697 {
10698 u32Min4WidthDiff = u16WidthDiffHW[u8Index];
10699 s8Min4Idx = u8Index;
10700 }
10701 }
10702
10703 *u16Avg = (*u16Avg) / (paraSize-1);
10704
10705 s16ConfidenceLevel8 = __minmax(s16ConfidenceLevel8,0,16);
10706 s16ConfidenceLevel11 = __minmax(s16ConfidenceLevel11,0,16);
10707 s16ConfidenceLevel16 = __minmax(s16ConfidenceLevel16,0,16);
10708 s16ConfidenceLevel21 = __minmax(s16ConfidenceLevel21,0,16);
10709 if(s16ConfidenceLevel8>15)
10710 {
10711 s16ConfidenceLevel11 = 0;
10712 s16ConfidenceLevel16 = 0;
10713 s16ConfidenceLevel21 = 0;
10714 }
10715 else if(s16ConfidenceLevel11>15)
10716 {
10717 s16ConfidenceLevel8 = 0;
10718 s16ConfidenceLevel16 = 0;
10719 s16ConfidenceLevel21 = 0;
10720 }
10721 else if(s16ConfidenceLevel16>15)
10722 {
10723 s16ConfidenceLevel8 = 0;
10724 s16ConfidenceLevel11 = 0;
10725 s16ConfidenceLevel21 = 0;
10726 }
10727 else if(s16ConfidenceLevel21>15)
10728 {
10729 s16ConfidenceLevel8 = 0;
10730 s16ConfidenceLevel16 = 0;
10731 s16ConfidenceLevel11 = 0;
10732 }
10733
10734 if(log_en==5)
10735 {
10736 //printf("s8MinIdx:%d s8Min2Idx:%d s8Min3Idx:%d s8Min4Idx:%d\n",s8MinIdx,s8Min2Idx,s8Min3Idx,s8Min4Idx);
10737 //printf("u16ConfidenceLevel8:%d u16ConfidenceLevel11:%d\n",s16ConfidenceLevel8,s16ConfidenceLevel11);
10738 //printf("u16ConfidenceLevel16:%d u16ConfidenceLevel21:%d\n",s16ConfidenceLevel16,s16ConfidenceLevel21);
10739 }
10740 *u8WidthConfidence = __max3(s16ConfidenceLevel8,s16ConfidenceLevel11,s16ConfidenceLevel16);
10741 *u8WidthConfidence = __max((*u8WidthConfidence),s16ConfidenceLevel21);
10742 /*if(u8TempWidth == 4 )//&& s16ConfidenceLevel8>10)
10743 {
10744 if((abs(s8MinIdx-u8TempWidth) <2)||(abs(s8Min2Idx-u8TempWidth) <2)||(abs(s8Min3Idx-u8TempWidth) <2)||(abs(s8Min4Idx-u8TempWidth) <2))
10745 {
10746 return 4;
10747 }
10748 }
10749 else*/
10750 if(u8TempWidth == 7 && s16ConfidenceLevel11>10)
10751 {
10752 if ((((s8MinIdx == 7) || (s8Min2Idx == 7) || (s8Min3Idx == 7) || (s8Min4Idx == 7))|| ((s8MinIdx == 16) || (s8Min2Idx == 16) || (s8Min3Idx == 16) || (s8Min4Idx == 16))
10753 || ((s8MinIdx == 17) || (s8Min2Idx == 17) || (s8Min3Idx == 17) || (s8Min4Idx == 17)) ) && ((s8MinIdx == 28) || (s8Min2Idx == 28) || (s8Min3Idx == 28) || (s8Min4Idx == 28)))
10754 {
10755 s16ConfidenceLevel11++;
10756 return 7;
10757 }
10758 else if((abs(s8MinIdx-u8TempWidth) <2)||(abs(s8Min2Idx-u8TempWidth) <2)||(abs(s8Min3Idx-u8TempWidth) <2)||(abs(s8Min4Idx-u8TempWidth) <2))
10759 {
10760 s16ConfidenceLevel11--;
10761 return 7;
10762 }
10763 }
10764 else if(u8TempWidth == 17 && s16ConfidenceLevel21>10)
10765 {
10766 if ((((s8MinIdx == 16 || s8Min2Idx == 16 || s8Min3Idx == 16) || (s8MinIdx == 18 || s8Min2Idx == 18 || s8Min3Idx == 18) ) && (s8MinIdx == 17 || s8Min2Idx == 17 || s8Min3Idx == 17)))
10767 {
10768 s16ConfidenceLevel21++;
10769 u8TempWidth = 17;
10770 return 17;
10771 }
10772 else if((abs(s8MinIdx-u8TempWidth) <4)||(abs(s8Min2Idx-u8TempWidth) <4)||(abs(s8Min3Idx-u8TempWidth) <4)||(abs(s8Min4Idx-u8TempWidth) <4))
10773 {
10774 s16ConfidenceLevel21--;
10775 return 17;
10776 }
10777 }
10778
10779 if ((((s8MinIdx == 7) || (s8Min2Idx == 7) || (s8Min3Idx == 7) || (s8Min4Idx == 7))|| ((s8MinIdx == 16) || (s8Min2Idx == 16) || (s8Min3Idx == 16) || (s8Min4Idx == 16))
10780 || ((s8MinIdx == 17) || (s8Min2Idx == 17) || (s8Min3Idx == 17) || (s8Min4Idx == 17)) ) && ((s8MinIdx == 28) || (s8Min2Idx == 28) || (s8Min3Idx == 28) || (s8Min4Idx == 28)))
10781 {
10782 if(u8TempWidth == 7)
10783 {
10784 s16ConfidenceLevel11++;
10785 }
10786 else
10787 {
10788 s16ConfidenceLevel8--;
10789 s16ConfidenceLevel16--;
10790 s16ConfidenceLevel21--;
10791 }
10792 u8TempWidth = 7;
10793 return 7;
10794 }
10795 else if ((((s8MinIdx == 16 || s8Min2Idx == 16 || s8Min3Idx == 16) || (s8MinIdx == 18 || s8Min2Idx == 18 || s8Min3Idx == 18) ) && (s8MinIdx == 17 || s8Min2Idx == 17 || s8Min3Idx == 17)))
10796 {
10797 if(u8TempWidth == 17)
10798 {
10799 s16ConfidenceLevel21++;
10800 }
10801 else
10802 {
10803 s16ConfidenceLevel8--;
10804 s16ConfidenceLevel16--;
10805 s16ConfidenceLevel11--;
10806 }
10807 u8TempWidth = 17;
10808 return 17;
10809 }
10810
10811 if (s8MinIdx == 4 || s8Min2Idx == 4 || s8Min3Idx == 4 || s8Min4Idx == 4)
10812 {
10813 if(u8TempWidth == 4)
10814 {
10815 s16ConfidenceLevel8++;
10816 }
10817 else
10818 {
10819 s16ConfidenceLevel11--;
10820 s16ConfidenceLevel16--;
10821 s16ConfidenceLevel21--;
10822 }
10823 u8TempWidth = 4;
10824 return 4;
10825 }
10826 else if (s8MinIdx == 12 || s8Min2Idx == 12 || s8Min3Idx == 12 || s8Min4Idx == 12)
10827 {
10828 if(u8TempWidth == 12)
10829 {
10830 s16ConfidenceLevel16++;
10831 }
10832 else
10833 {
10834 s16ConfidenceLevel8--;
10835 s16ConfidenceLevel11--;
10836 s16ConfidenceLevel21--;
10837 }
10838 u8TempWidth = 12;
10839 return 12;
10840 }
10841
10842 return -1;
10843 }
DBK_WidthPartTop(MS_U16 * u16WidthDiffHW,MS_U16 * u16MaxMinDiff,MS_U16 * u16Avg,MS_BOOL isSceneChangeY,MS_U8 * u8WidthConfidence)10844 MS_S8 DBK_WidthPartTop(MS_U16 *u16WidthDiffHW, MS_U16* u16MaxMinDiff, MS_U16* u16Avg,MS_BOOL isSceneChangeY,MS_U8* u8WidthConfidence)
10845 {
10846 MS_U8 u8Bin;
10847 MS_U32 u32MinValue = 0x7FFFFFFF;
10848 MS_U16 u16MaxValue = 0;
10849 MS_S8 s8NormFac;
10850 MS_S8 s8MinIndex;
10851 s8MinIndex = DBK_WidthPartHW(u16WidthDiffHW, u16Avg,isSceneChangeY,u8WidthConfidence);
10852 if (s8MinIndex == -1)
10853 {
10854 for (u8Bin =0; u8Bin<paraSize;u8Bin++)
10855 {
10856 if (u16WidthDiffHW[u8Bin] > u16MaxValue )
10857 {
10858 u16MaxValue = u16WidthDiffHW[u8Bin];
10859 }
10860
10861 if (u16WidthDiffHW[u8Bin] < u32MinValue )
10862 {
10863 u32MinValue = u16WidthDiffHW[u8Bin];
10864 }
10865 }
10866 *u16MaxMinDiff = u16MaxValue - u32MinValue;
10867 s8NormFac = normFactorWidth(*u16MaxMinDiff);
10868 if(s8NormFac >0)
10869 {
10870 for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10871 {
10872 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue) >> s8NormFac;
10873 }
10874 *u16Avg = (*u16Avg-u32MinValue) >> s8NormFac;
10875 *u16MaxMinDiff = (*u16MaxMinDiff) >>s8NormFac;
10876 }
10877 else if(s8NormFac ==0)
10878 {
10879 for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10880 {
10881 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue);
10882 }
10883 *u16Avg = (*u16Avg-u32MinValue);
10884 *u16MaxMinDiff = (*u16MaxMinDiff);
10885 }
10886 else
10887 {
10888 s8NormFac = 0-s8NormFac;
10889 for (u8Bin=0;u8Bin<paraSize;u8Bin++)
10890 {
10891 u16WidthDiffHW[u8Bin] = (u16WidthDiffHW[u8Bin] - u32MinValue) << s8NormFac;
10892 }
10893 *u16Avg = (*u16Avg-u32MinValue) <<s8NormFac;
10894 *u16MaxMinDiff = (*u16MaxMinDiff) <<s8NormFac;
10895 }
10896 return -1;
10897 }
10898 else
10899 {
10900 return s8MinIndex;
10901 }
10902 }
WidthIIR_V(MS_U8 u8Width)10903 void WidthIIR_V(MS_U8 u8Width) // Width IIR Protection
10904 {
10905 static MS_U8 u8HysteresisCount = 0;
10906 static MS_U8 u8LastWidth = 8;
10907 int log_en = 5;
10908 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10909 if(u8HysteresisCount<6)
10910 {
10911 if(log_en==5)
10912 {
10913 //printf("V new width:%d last width:%d final width:%d hysteresisCount:%d\n",u8Width,u8LastWidth,WidthIIR,u8HysteresisCount);
10914 }
10915
10916 if(u8Width == u8LastWidth)
10917 {
10918 u8HysteresisCount = 0;
10919 VWidthIIR = u8Width;
10920 }
10921 else
10922 {
10923 u8HysteresisCount++;
10924 VWidthIIR = u8LastWidth;
10925 }
10926 }
10927 else
10928 {
10929 VWidthIIR = u8Width;
10930 u8HysteresisCount = 0;
10931 }
10932 u8LastWidth = VWidthIIR;
10933 }
WidthIIR_H(MS_U8 u8Width)10934 void WidthIIR_H(MS_U8 u8Width) // Width IIR Protection
10935 {
10936 static MS_U8 u8HysteresisCount = 0;
10937 static MS_U8 u8LastWidth = 8;
10938 int log_en = 5;
10939 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
10940 if(u8HysteresisCount<6)
10941 {
10942 if(log_en==5)
10943 {
10944 //printf("new width:%d last width:%d final width:%d hysteresisCount:%d\n",u8Width,u8LastWidth,WidthIIR,u8HysteresisCount);
10945 }
10946
10947 if(u8Width == u8LastWidth)
10948 {
10949 u8HysteresisCount = 0;
10950 WidthIIR = u8Width;
10951 }
10952 else
10953 {
10954 u8HysteresisCount++;
10955 WidthIIR = u8LastWidth;
10956 }
10957 }
10958 else
10959 {
10960 WidthIIR = u8Width;
10961 u8HysteresisCount = 0;
10962 }
10963 u8LastWidth = WidthIIR;
10964 }
VDBK_ComputeWidthPart(MS_BOOL isSceneChangeY,MS_U16 * u16WidthDiffHW,MS_U8 u8LastminWidth,MS_U16 u16MaxMinDiff,MS_U16 u16WidthAvg,MS_U8 u8VWidthConfidence,MS_S16 * as16MinDiffIndex)10965 MS_S8 VDBK_ComputeWidthPart(MS_BOOL isSceneChangeY,MS_U16 *u16WidthDiffHW,MS_U8 u8LastminWidth
10966 ,MS_U16 u16MaxMinDiff,MS_U16 u16WidthAvg,MS_U8 u8VWidthConfidence,MS_S16 *as16MinDiffIndex)
10967 {
10968 MS_U8 u8WidthCandidate[paraSize] ={0};
10969 MS_U16 u16minWidthDiff = 0,u16min2WidthDiff = 0,u16min3WidthDiff = 0,u16min4WidthDiff = 0;
10970 MS_S8 s8minWidth = 0,s8min2Width = 0,s8min3Width = 0,s8min4Width = 0;
10971 //MS_U8 u8SNRmin = 0,u8SNR2min = 0,u8SNR3min = 0,u8SNR4min = 0;
10972 MS_S16 s16minIdx = -1,s16min2Idx = -1,s16min3Idx = -1,s16min4Idx = -1,s16OutWidth = -1;
10973
10974 //if(isSceneChangeY)
10975 //{
10976 //u8VNconfidence = 0;
10977 //}
10978
10979 s16minIdx = as16MinDiffIndex[0];
10980 s16min2Idx = as16MinDiffIndex[1];
10981 s16min3Idx = as16MinDiffIndex[2];
10982 s16min4Idx = as16MinDiffIndex[3];
10983
10984 if(s16minIdx != -1)
10985 {
10986 s8minWidth = s16minIdx + 5;
10987 u16minWidthDiff = u16WidthDiffHW[s16minIdx];
10988 }
10989 if(s16min2Idx != -1)
10990 {
10991 s8min2Width = s16min2Idx + 5;
10992 u16min2WidthDiff = u16WidthDiffHW[s16min2Idx];
10993 }
10994 if(s16min3Idx != -1)
10995 {
10996 s8min3Width = s16min3Idx + 5;
10997 u16min3WidthDiff = u16WidthDiffHW[s16min3Idx];
10998 }
10999 if(s16min4Idx != -1)
11000 {
11001 s8min4Width = s16min4Idx + 5;
11002 u16min4WidthDiff = u16WidthDiffHW[s16min4Idx];
11003 }
11004 //printf("Revise s16minIdx:%d,s16min2Idx:%d,s16min3Idx:%d,s16min4Idx:%d\n",s8minWidth,s8min2Width,s8min3Width,s8min4Width);
11005 //printf("Revise u16minWidthDiff:%d ,u16min2WidthDiff:%d ,u16min3WidthDiff:%d ,u16min4WidthDiff:%d\n",u16minWidthDiff,u16min2WidthDiff,u16min3WidthDiff,u16min4WidthDiff);
11006 //printf("Revise u16MaxMinDiff:%d\n",u16MaxMinDiff);
11007 #if 0
11008 if(u16WidthAvg > 0)
11009 {
11010 if(u16minWidthDiff > u16WidthAvg)
11011 {
11012 u8SNRmin = 0;
11013 }
11014 else
11015 {
11016 u8SNRmin = (u16WidthAvg -u16minWidthDiff)*100/u16WidthAvg;
11017 }
11018
11019 if(u16min2WidthDiff > u16WidthAvg)
11020 {
11021 u8SNR2min = 0;
11022 }
11023 else
11024 {
11025 u8SNR2min = (u16WidthAvg -u16min2WidthDiff)*100/u16WidthAvg;
11026 }
11027
11028 if(u16min3WidthDiff > u16WidthAvg)
11029 {
11030 u8SNR3min = 0;
11031 }
11032 else
11033 {
11034 u8SNR3min = (u16WidthAvg -u16min3WidthDiff)*100/u16WidthAvg;
11035 }
11036
11037 if(u16min4WidthDiff > u16WidthAvg)
11038 {
11039 u8SNR4min = 0;
11040 }
11041 else
11042 {
11043 u8SNR4min = (u16WidthAvg -u16min4WidthDiff)*100/u16WidthAvg;
11044 }
11045 }
11046 #endif
11047 //printf("V states H maxmindiff :%d\n",u16MaxMinDiff);
11048 //printf("V states u16minWidthDiff SNR:%d width :%d\n",u8SNRmin,s8minWidth);
11049 //printf("V states u16min2WidthDiff SNR:%d width :%d\n",u8SNR2min,s8min2Width);
11050 //printf("V states u16min3WidthDiff SNR:%d width :%d\n",u8SNR3min,s8min3Width);
11051 //printf("V states u16min4WidthDiff SNR:%d width :%d\n",u8SNR4min,s8min4Width);
11052 if(s16minIdx >=0 && s16min2Idx>=0 && s16min3Idx>=0 && s16min4Idx>=0)
11053 {
11054 u8WidthCandidate[s16minIdx] = 1;
11055 if (u16MaxMinDiff > 0)
11056 {
11057 if ( (u16min2WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11058 {
11059 u8WidthCandidate[s16min2Idx] = 1;
11060 }
11061
11062 if ( (u16min3WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11063 {
11064 u8WidthCandidate[s16min3Idx] = 1;
11065 }
11066
11067 if ( (u16min4WidthDiff-u16minWidthDiff)*256/u16MaxMinDiff <48)
11068 {
11069 u8WidthCandidate[s16min4Idx] = 1;
11070 }
11071 }
11072 //printf("V states PRE-u8WidthCandidate: 1:%d 2:%d 3:%d 4:%d\n",u8WidthCandidate[s16minIdx],u8WidthCandidate[s16min2Idx],u8WidthCandidate[s16min3Idx],u8WidthCandidate[s16min4Idx]);
11073 if(u8WidthCandidate[u8LastminWidth - 5] == 1 && u8VWidthConfidence >10)
11074 {
11075 return u8LastminWidth;
11076 }
11077 else
11078 {
11079 if(u8WidthCandidate[s16min2Idx] == 1)
11080 {
11081 if ( abs(s8min2Width - s8minWidth) == 1 )
11082 {
11083 if (s16min2Idx < s16minIdx)
11084 {
11085 u8WidthCandidate[ s16min2Idx] = 0;
11086 }
11087 else
11088 {
11089 u8WidthCandidate[ s16minIdx] = 0;
11090 }
11091 }
11092 }
11093
11094 if(u8WidthCandidate[s16min3Idx] == 1)
11095 {
11096 if ( abs(s8min3Width - s8minWidth) == 1 )
11097 {
11098 if (s16min3Idx < s16minIdx)
11099 {
11100 u8WidthCandidate[ s16min3Idx] = 0;
11101 }
11102 else
11103 {
11104 u8WidthCandidate[ s16minIdx] = 0;
11105 }
11106 }
11107 }
11108
11109 if(u8WidthCandidate[s16min4Idx] == 1)
11110 {
11111 if ( abs(s8min4Width - s8minWidth) == 1 )
11112 {
11113 if (s16min4Idx < s16minIdx)
11114 {
11115 u8WidthCandidate[ s16min4Idx] = 0;
11116 }
11117 else
11118 {
11119 u8WidthCandidate[ s16minIdx] = 0;
11120 }
11121 }
11122 }
11123
11124
11125 if ( abs(s8min3Width - s8min2Width) == 1 )
11126 {
11127 if (s16min3Idx < s16min2Idx)
11128 {
11129 u8WidthCandidate[ s16min3Idx] = 0;
11130 }
11131 else
11132 {
11133 u8WidthCandidate[ s16min2Idx] = 0;
11134 }
11135 }
11136
11137 if ( abs(s8min4Width - s8min2Width) == 1 )
11138 {
11139 if (s16min4Idx < s16min2Idx)
11140 {
11141 u8WidthCandidate[ s16min4Idx] = 0;
11142 }
11143 else
11144 {
11145 u8WidthCandidate[ s16min2Idx] = 0;
11146 }
11147 }
11148
11149 if ( abs(s8min4Width - s8min3Width) == 1)
11150 {
11151 if (s16min4Idx < s16min3Idx)
11152 {
11153 u8WidthCandidate[ s16min4Idx] = 0;
11154 }
11155 else
11156 {
11157 u8WidthCandidate[ s16min3Idx] = 0;
11158 }
11159 }
11160
11161 if (u8WidthCandidate[ s16min4Idx] > 0)
11162 {
11163 if ( s8min4Width == s8min3Width*2 || s8min4Width == s8min2Width*2 || s8min4Width == s8minWidth*2 )
11164 {
11165 u8WidthCandidate[ s16min4Idx] = 0;
11166 }
11167
11168 if ( s8min3Width == s8min4Width*2 || s8min3Width == s8min2Width*2 || s8min3Width == s8minWidth*2 )
11169 {
11170 u8WidthCandidate[ s16min3Idx] = 0;
11171 }
11172
11173 if ( s8min2Width == s8min4Width*2 || s8min2Width == s8min3Width*2 || s8min2Width == s8minWidth*2 )
11174 {
11175 u8WidthCandidate[ s16min2Idx] = 0;
11176 }
11177
11178 if ( s8minWidth == s8min4Width*2 || s8minWidth == s8min3Width*2 || s8minWidth == s8min2Width*2 )
11179 {
11180 u8WidthCandidate[ s16minIdx] = 0;
11181 }
11182 }
11183 //printf("V states u8WidthCandidate: 1:%d 2:%d 3:%d 4:%d\n",u8WidthCandidate[s16minIdx],u8WidthCandidate[s16min2Idx],u8WidthCandidate[s16min3Idx],u8WidthCandidate[s16min4Idx]);
11184 if (u8WidthCandidate[s16minIdx] + u8WidthCandidate[s16min2Idx] + u8WidthCandidate[s16min3Idx] + u8WidthCandidate[s16min4Idx] == 1)
11185 {
11186 s16OutWidth = u8WidthCandidate[s16minIdx]* s8minWidth + u8WidthCandidate[s16min2Idx]* s8min2Width + u8WidthCandidate[s16min3Idx]* s8min3Width + u8WidthCandidate[s16min4Idx]* s8min4Width;
11187 }
11188 else
11189 {
11190 s16OutWidth = -1;
11191 }
11192 }
11193 }
11194
11195 return s16OutWidth;
11196 }
DBK_ComputeWidthPart(MS_U16 * u16WidthDiffHW,MS_U8 u8LastminIdex,MS_U16 u16Avg,MS_U8 u8WidthConfidence)11197 MS_S8 DBK_ComputeWidthPart( MS_U16 *u16WidthDiffHW,MS_U8 u8LastminIdex, MS_U16 u16Avg,MS_U8 u8WidthConfidence)
11198 {
11199 MS_BOOL bWidthCandidate[paraSize];
11200 MS_U16 u16WTh = u16Avg;
11201 MS_U8 u8MinIndex=0;
11202 MS_U8 u8NumW=0;
11203 MS_U8 u8Bin;
11204 MS_BOOL bIf8 = 0, bIf11 = 0, bIf21 = 0, bIf32 = 0;
11205
11206 for (u8Bin=0;u8Bin<paraSize;u8Bin++)
11207 {
11208 if (u16WidthDiffHW[u8Bin]<= u16WTh)
11209 {
11210 bWidthCandidate[u8Bin] = 1;
11211 }
11212 else
11213 {
11214 bWidthCandidate[u8Bin] = 0;
11215 }
11216 }
11217
11218 if(bWidthCandidate[u8LastminIdex] ==1 && u8WidthConfidence>10)
11219 {
11220 return u8LastminIdex;
11221 }
11222 else
11223 {
11224 if (bWidthCandidate[4] == 1 ) //8
11225 {
11226 if (bWidthCandidate[3] == 1) //7
11227 bWidthCandidate[3] = 0;
11228 if (bWidthCandidate[11] == 1) // 15
11229 bWidthCandidate[11] = 0;
11230 if (bWidthCandidate[12] == 1) // 16
11231 bWidthCandidate[12] = 0;
11232 if (bWidthCandidate[19] == 1) // 23
11233 bWidthCandidate[19] = 0;
11234 if (bWidthCandidate[20] == 1) // 24
11235 bWidthCandidate[20] = 0;
11236
11237 bIf8 = 1;
11238 }
11239 if (bWidthCandidate[7] == 1 ) //11
11240 {
11241 if (bWidthCandidate[6] == 1) //10
11242 bWidthCandidate[6] = 0;
11243 if (bWidthCandidate[8] == 1) //12
11244 bWidthCandidate[8] = 0;
11245
11246 bIf11 = 1;
11247 }
11248
11249 if ( ( bWidthCandidate[16] == 1 ) || ( bWidthCandidate[17] == 1 ) ||( bWidthCandidate[18] == 1 ) ) //20 21 22
11250 {
11251 bWidthCandidate[16] = 0;
11252 bWidthCandidate[17] = 1;
11253 bWidthCandidate[18] = 0;
11254 bIf21 = 1;
11255 }
11256
11257 if ( bWidthCandidate[27] == 1 && bWidthCandidate[28] == 1)
11258 bIf32 = 1;
11259
11260 if (bIf11 && bIf21 && bIf32) //11/21/32 all true -> source = 11 ->delete 21
11261 {
11262 bWidthCandidate[17] = 0;
11263 }
11264
11265 if (bIf8 || bIf11 || bIf21)
11266 {
11267 if (bWidthCandidate[27] == 1) // 31
11268 bWidthCandidate[27] = 0;
11269 if (bWidthCandidate[28] == 1) // 32
11270 bWidthCandidate[28] = 0;
11271 }
11272
11273 }
11274
11275 for (u8Bin=0;u8Bin<paraSize;u8Bin++) // count number of frequencies
11276 {
11277 if (bWidthCandidate[u8Bin] == 1)
11278 {
11279 u8MinIndex = u8Bin;
11280 u8NumW++;
11281 }
11282 }
11283 if (u8NumW == 1)
11284 {
11285 return u8MinIndex;
11286 }
11287 else
11288 {
11289 return -1;
11290 }
11291 }
WidthToRegister(MS_U8 u8Width)11292 void WidthToRegister(MS_U8 u8Width) // Write width to register
11293 {
11294 MS_U8 u8Left1,u8Right1;
11295 if(u8Width<8)
11296 {
11297 u8Width = 8;
11298 u8Left1 = 8;
11299 u8Right1 = 9;
11300 }
11301 else if (u8Width==8) //test 0808 for performance
11302 {
11303 u8Left1 = 8;
11304 u8Right1 = 8;
11305 }
11306 else
11307 {
11308 u8Left1 = u8Width - 1; //fix prevent defect
11309 u8Right1 = (u8Width >=31) ? 31 : u8Width + 1;
11310 }
11311 //write interval left && interval right
11312 MApi_XC_W2BYTEMSK(REG_SC_BK0C_39_L, (MS_U16)((u8Left1<<8)|u8Right1), 0xFFFF);
11313 }
VDBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 * u8VConfidence2Strength)11314 MS_U8 VDBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 u8Widdth,MS_U8 u8HwidthConfidence,MS_U8 *u8VConfidence2Strength)//width detection with hardware accelaration
11315 {
11316 MS_S8 s8MinWidth = -1; //minIndex+width_offset = candidate width
11317 //For width calculation
11318 //int WidthCandidate[paraSize];
11319 MS_U16 au16WidthDiffHW[paraSize];
11320 MS_S16 as16MinDiffIndex[4] = {0};
11321 MS_U16 u16MaxMinDiff = 0;
11322 MS_U16 u16WidthAvg = 0;
11323 MS_U8 u8Width = 8;
11324 static MS_U8 u8LastminWidth = 8;
11325 MS_U8 u8VWidthConfidence = 0;
11326 // int log_en = 5;
11327 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11328 u16MaxMinDiff = 0;
11329 u16WidthAvg = 0;
11330
11331 s8MinWidth = VDBK_WidthPartHW(isSceneChangeY,au16WidthDiffHW,&u16MaxMinDiff,&u16WidthAvg,as16MinDiffIndex,u8Widdth,u8HwidthConfidence,&u8VWidthConfidence);
11332
11333 if (s8MinWidth == -1)
11334 {
11335 s8MinWidth = VDBK_ComputeWidthPart(isSceneChangeY,au16WidthDiffHW,u8LastminWidth,u16MaxMinDiff,u16WidthAvg,u8VWidthConfidence,as16MinDiffIndex);
11336 }
11337
11338 if (s8MinWidth >=5 && s8MinWidth<= 20) //if (width == 20) //no such pattern yet, only artificials
11339 {
11340 u8Width = s8MinWidth;// + 4;
11341 }
11342 else
11343 {
11344 u8Width = 5;//can't find any possible width set to default value
11345 }
11346
11347 *u8VConfidence2Strength = u8VWidthConfidence;
11348 WidthIIR_V(u8Width);
11349 //WidthToRegister(WidthIIR_V);
11350 //FeedBackSD2HD(WidthIIR, 0);
11351
11352 u8LastminWidth = VWidthIIR;
11353
11354
11355 //printf("**V bforeIIR[%d]********\n",u8Width);
11356 //printf("*********V [%d]*********\n",VWidthIIR);
11357 //printf("**V Confiden[%d]*********\n",u8WidthConfidence);
11358
11359
11360 return VWidthIIR;
11361 }
DBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 * u8HwidthConfidence)11362 MS_U8 DBK_Width_Detect(MS_BOOL isSceneChangeY,MS_U8 *u8HwidthConfidence)//width detection with hardware accelaration
11363 {
11364 MS_S8 s8MinIndex = -1; //minIndex+width_offset = candidate width
11365 //For width calculation
11366 //int WidthCandidate[paraSize];
11367 MS_U16 au16WidthDiffHW[paraSize];
11368 MS_U16 u16MaxMinDiff = 0;
11369 MS_U16 u16WidthAvg = 0;
11370 MS_U8 u8Width = 8;
11371 static MS_U8 u8LastminIdex = 4;
11372 MS_U8 u8WidthConfidence = 0;
11373 int log_en = 5;
11374 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11375 u16MaxMinDiff = 0;
11376 u16WidthAvg = 0;
11377
11378 s8MinIndex = DBK_WidthPartTop( au16WidthDiffHW, &u16MaxMinDiff, &u16WidthAvg,isSceneChangeY,&u8WidthConfidence);
11379 *u8HwidthConfidence = u8WidthConfidence;
11380 if (s8MinIndex == -1)
11381 {
11382 s8MinIndex = DBK_ComputeWidthPart( au16WidthDiffHW ,u8LastminIdex, u16WidthAvg,u8WidthConfidence);
11383 }
11384
11385 if (s8MinIndex >= 0 && s8MinIndex <28) //if (width == 32) //no such pattern yet, only artificials
11386 {
11387 u8Width = s8MinIndex + 4;
11388 }
11389 else
11390 {
11391 u8Width = 8;//can't find any possible width set to default value
11392 }
11393
11394 WidthIIR_H(u8Width);
11395 WidthToRegister(WidthIIR);
11396 //FeedBackSD2HD(WidthIIR, 0);
11397
11398 if(log_en==5)
11399 {
11400 //printf("**bforeIIR[%d]********\n",u8Width);
11401 //printf("*********[%d]*********\n",WidthIIR);
11402 //printf("**Confiden[%d]*********\n",u8WidthConfidence);
11403 }
11404
11405 u8LastminIdex = WidthIIR -4;
11406
11407 return WidthIIR;
11408 }
UIcontrolMpegNR(MS_U8 u8DetailGain_hw,MS_U8 * u8DetailGain_UI_hw)11409 void UIcontrolMpegNR(MS_U8 u8DetailGain_hw,MS_U8 *u8DetailGain_UI_hw)
11410 {
11411 MS_U8 u8UIgain = 0x80;
11412 u8UIgain = MApi_XC_R2BYTEMSK(REG_SC_BK30_0C_L,0x00FF);
11413 (*u8DetailGain_UI_hw) = __minmax(((u8DetailGain_hw*u8UIgain)>>7),0x2,0xF);
11414 }
VSetAdaptiveParameter(MS_U8 u8VWiddth,MS_U8 u8HDBKStrength,MS_U8 u8VConfidence2Strength)11415 void VSetAdaptiveParameter(MS_U8 u8VWiddth,MS_U8 u8HDBKStrength,MS_U8 u8VConfidence2Strength)
11416 {
11417 MS_U32 u32PureBlockSumM = 0;
11418 MS_U32 u32PureBlockSumL = 0;
11419 MS_U32 u32DetailSumM = 0;
11420 MS_U32 u32DetailSumL = 0;
11421 MS_U32 u32PureBlockSumTotal = 0;
11422 MS_U32 u32DetailSumTotal = 0;
11423 MS_U8 u8PostGain = 0xF;
11424 MS_U8 u8VoidGain = 0x8;
11425 MS_S8 s8VDBKGain=6;
11426 MS_U8 u82DfilterDiffth = 0x3F;
11427 static MS_S8 s8VDBKGainTemp = 6;
11428 //double BlockyPercentage = 0.0;
11429 //static double BlockyPercentageIIR = 0.0;
11430 MS_U32 BlockyPercentage = 0.0;
11431 static MS_U32 BlockyPercentageIIR = 0.0;
11432 static MS_BOOL b8Init = FALSE;
11433 MS_BOOL bifPIP_en = (MApi_XC_R2BYTEMSK(REG_SC_BK20_10_L, 0x0003) == 0x0003);
11434 MS_BOOL blineBuffer = (MApi_XC_R2BYTEMSK(REG_SC_BK20_10_L, 0x0010) == 0x0010);
11435 MApi_XC_W2BYTEMSK(REG_SC_BK60_78_L, 0x2000, 0x2000);//weight fun enable
11436 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0006, 0x0006);
11437 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x1000);
11438 MApi_XC_W2BYTEMSK(REG_SC_BK60_21_L, 0x0147, 0x0377);
11439 MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, 0x0011, 0x0033);
11440
11441 MApi_XC_W2BYTEMSK(REG_SC_BK60_23_L, 0x8000, 0xFFFF);
11442 MApi_XC_W2BYTEMSK(REG_SC_BK60_24_L, 0x4088, 0xFFFF);
11443 MApi_XC_W2BYTEMSK(REG_SC_BK60_25_L, 0x0182, 0x07FF);
11444 MApi_XC_W2BYTEMSK(REG_SC_BK60_26_L, 0x008F, 0xFFFF);
11445 MApi_XC_W2BYTEMSK(REG_SC_BK60_27_L, 0x0888, 0x0FFF);
11446 //Statistics
11447 MApi_XC_W2BYTEMSK(REG_SC_BK60_28_L, 0x8000, 0xFFFF);
11448 MApi_XC_W2BYTEMSK(REG_SC_BK60_29_L, 0x4088, 0xFFFF);
11449 MApi_XC_W2BYTEMSK(REG_SC_BK60_2A_L, 0x0182, 0x07FF);
11450 MApi_XC_W2BYTEMSK(REG_SC_BK60_2B_L, 0x008F, 0xFFFF);
11451 MApi_XC_W2BYTEMSK(REG_SC_BK60_2C_L, 0x0888, 0xFFFF);
11452
11453 u32PureBlockSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_69_L, 0xFFFF);
11454 u32PureBlockSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_6A_L, 0xFFFF);
11455 u32DetailSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_6B_L, 0xFFFF);
11456 u32DetailSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_6C_L, 0xFFFF);
11457 u32PureBlockSumTotal = (u32PureBlockSumM<<16) + u32PureBlockSumL;
11458 u32DetailSumTotal = (u32DetailSumM<<16) + u32DetailSumL;
11459 BlockyPercentage = 256*(u32PureBlockSumTotal/(u32PureBlockSumTotal+u32DetailSumTotal));
11460 if(FALSE == b8Init)
11461 {
11462 BlockyPercentageIIR = BlockyPercentage;
11463 b8Init = TRUE;
11464 }
11465 BlockyPercentageIIR = (6*BlockyPercentageIIR + 2*BlockyPercentage + 4)>>3;
11466 //printf("Set u32PureBlockSumM :%d,u32PureBlockSumL :%d,u32DetailSumM :%d,u32DetailSumL :%d\n",u32PureBlockSumM,u32PureBlockSumL,u32DetailSumM,u32DetailSumL);
11467 //printf("Set BlockyPercentage:%d,u32DetailSumTotal:%d,u32PureBlockSumTotal:%d\n",BlockyPercentage,u32DetailSumTotal,u32PureBlockSumTotal);
11468 //printf("V Set u8VWiddth:%d u8HDBKStrength:%d,u8VConfidence2Strength:%d BlockyPercentageIIR:%f\n",u8VWiddth,u8HDBKStrength,u8VConfidence2Strength,BlockyPercentageIIR);
11469
11470 if ((bifPIP_en) || (u8HDBKStrength <= 0x3F))
11471 {
11472 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0000, 0x0001); //VDBK disable for PIP
11473 }
11474 else
11475 {
11476 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x0001, 0x0001); //VDBK enable
11477 }
11478
11479 if(u8VConfidence2Strength > 10)
11480 {
11481 if(u8VWiddth == 8)
11482 {
11483 s8VDBKGain = (BlockyPercentageIIR*64+128)>>8;//Casdade mode BlockyPercentageIIR*64 - 8;
11484 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11485 }
11486 else if(u8VWiddth == 11)
11487 {
11488 s8VDBKGain = ((BlockyPercentageIIR*256+128)>>8) -44;
11489 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11490 }
11491 else
11492 {
11493 s8VDBKGain = 0x0F;
11494 if(1 ==blineBuffer)
11495 {
11496 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x3000, 0x3000); //v filter 5tap
11497 }
11498 else
11499 {
11500 MApi_XC_W2BYTEMSK(REG_SC_BK60_20_L, 0x1000, 0x3000); //v filter 3tap
11501 }
11502 }
11503 u82DfilterDiffth = (MS_U8)((BlockyPercentageIIR*512+128)>>8);
11504 u82DfilterDiffth = __minmax(u82DfilterDiffth,0x3F,0xFF);
11505 s8VDBKGain = __minmax(s8VDBKGain,0x08,0x0F);
11506 s8VDBKGainTemp = s8VDBKGain;
11507 }
11508 else
11509 {
11510 s8VDBKGain = (s8VDBKGainTemp*(10-u8VConfidence2Strength) +6*u8VConfidence2Strength)/10;
11511 }
11512
11513 u82DfilterDiffth = __minmax(u82DfilterDiffth,0x3F,0xFF);
11514 s8VDBKGain = __minmax(s8VDBKGain,0x08,0x0F);
11515 BlockyPercentageIIR = BlockyPercentageIIR;
11516 MApi_XC_W2BYTEMSK(REG_SC_BK60_18_L, u82DfilterDiffth<<8, 0xFF00); // 2D filter diff th
11517 MApi_XC_W2BYTEMSK(REG_SC_BK60_22_L, s8VDBKGain<<8, 0x0F00); //v total gain
11518 MApi_XC_W2BYTEMSK(REG_SC_BK47_60_L, ((u8VoidGain<<12)+(u8PostGain<<8)), 0xFF00); //Post VS Void gain
11519 //printf("set Function V u8VConfidence:%d s8VDBKGain:%d\n",u8VConfidence2Strength,s8VDBKGain);
11520 //printf("Set Function u8DBKGain_hw:%d Blocky:%d\n",s8VDBKGain,BlockyPercentageIIR);
11521 }
SetAdaptiveParameter(MS_U8 u8Widdth,MS_BOOL isSD_source)11522 MS_U8 SetAdaptiveParameter(MS_U8 u8Widdth, MS_BOOL isSD_source)
11523 {
11524 MS_U32 u32PureBlockSumM = 0;
11525 MS_U32 u32PureBlockSumL = 0;
11526 MS_U32 u32DetailSumM = 0;
11527 MS_U32 u32DetailSumL = 0;
11528 MS_U32 u32PureBlockSumTotal = 0;
11529 MS_U32 u32DetailSumTotal = 0;
11530 MS_U8 u8PostGain = 8;
11531 MS_U8 u8VoidGain = 0;
11532 MS_U8 u8DBKGain_hw=0;
11533 MS_U8 u8DBK_coase_TH = 2;
11534 MS_U8 u8DetailGain_hw = 0;
11535 MS_U8 u8STD_Threshold_hw=0;
11536 MS_U32 BlockyPercentage = 0.0;
11537 static MS_U32 BlockyPercentageIIR = 0.0;
11538 static MS_BOOL b8Init = FALSE;
11539 MS_U8 u8DetailGain_UI_hw = 0;
11540
11541 MApi_XC_W2BYTEMSK(REG_SC_BK0C_38_L, 0x0002, 0x00C2);//coring enable
11542 MApi_XC_W2BYTEMSK(REG_SC_BK0C_3D_L, 0x0004, 0x00FF);//coring thrd
11543 MApi_XC_W2BYTEMSK(REG_SC_BK0C_40_L, 0x0002, 0x000E);//coase step
11544 MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0900, 0x0F30);//ref left&right
11545 MApi_XC_W2BYTEMSK(REG_SC_BK0C_08_L, 0x2000, 0x2000);//weight fun enable
11546 MApi_XC_W2BYTEMSK(REG_SC_BK60_30_L, 0x0008, 0x0008);//cont3t
11547 MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0000, 0x0008);//disable real HD
11548 u32PureBlockSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_39_L, 0xFFFF);
11549 u32PureBlockSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_3A_L, 0xFFFF);
11550 u32DetailSumM = MApi_XC_R2BYTEMSK(REG_SC_BK47_3B_L, 0xFFFF);
11551 u32DetailSumL = MApi_XC_R2BYTEMSK(REG_SC_BK47_3C_L, 0xFFFF);
11552 u32PureBlockSumTotal = (u32PureBlockSumM<<16) + u32PureBlockSumL;
11553 u32DetailSumTotal = (u32DetailSumM<<16) + u32DetailSumL;
11554 BlockyPercentage = 256*(u32PureBlockSumTotal/(u32PureBlockSumTotal+u32DetailSumTotal));
11555 if(FALSE == b8Init)
11556 {
11557 BlockyPercentageIIR = BlockyPercentage;
11558 b8Init = TRUE;
11559 }
11560 BlockyPercentageIIR = (6*BlockyPercentageIIR + 2*BlockyPercentage)>>3;
11561
11562 if(u8Widdth == 8)
11563 {
11564 if(BlockyPercentageIIR > 47)
11565 {
11566 u8STD_Threshold_hw = (MS_U8)(((211*BlockyPercentageIIR+128)>>8) - 8);
11567 u8DetailGain_hw = (MS_U8)(((49*BlockyPercentageIIR+128)>>8) -6);
11568 u8DBKGain_hw = (MS_U8)(((42*BlockyPercentageIIR+128)>>8) +1);
11569 u8DBK_coase_TH = (MS_U8)(((13*BlockyPercentageIIR+128)>>8));
11570 }
11571 else if((BlockyPercentageIIR > 38)&&(isSD_source)&&(SZ_PATTERN_ENABLE==1)) //for BOOK1 chapter#5 child face noise pattern
11572 {
11573 u8STD_Threshold_hw = (MS_U8)(((211*BlockyPercentageIIR+128)>>8) - 8);
11574 u8DetailGain_hw = (MS_U8)(((80*BlockyPercentageIIR+128)>>8) -6);
11575 u8DBKGain_hw = (MS_U8)(((42*BlockyPercentageIIR+128)>>8) +1);
11576 u8DBK_coase_TH = (MS_U8)(((13*BlockyPercentageIIR+128)>>8));
11577 }
11578 else
11579 {
11580 u8STD_Threshold_hw = 0x3F;
11581 u8DetailGain_hw = 0x02;
11582 u8DBKGain_hw = 0x08;
11583 u8DBK_coase_TH = 0x02;
11584 }
11585 }
11586 else if(u8Widdth == 11)
11587 {
11588 u8STD_Threshold_hw = 0x8F;
11589 u8DetailGain_hw = 0x0A;
11590 u8DBKGain_hw = 0x0F;
11591 u8DBK_coase_TH = 0x04;
11592 }
11593 else
11594 {
11595 u8STD_Threshold_hw = 0xBF ;
11596 u8DBKGain_hw = 0x0F;
11597 u8DBK_coase_TH = 0x0A;
11598 u8DetailGain_hw = 0x0F;
11599 u8PostGain = 0x04;
11600 u8VoidGain = 0x08;
11601 }
11602 u8STD_Threshold_hw = __minmax(u8STD_Threshold_hw,0x3F,0xFF);
11603 u8DetailGain_hw = __minmax(u8DetailGain_hw,0x02,0x0F);
11604 u8DBKGain_hw = __minmax(u8DBKGain_hw,0x08,0x0F);
11605 u8DBK_coase_TH = __minmax(u8DBK_coase_TH,0x02,0x0A);
11606
11607 UIcontrolMpegNR(u8DetailGain_hw,&u8DetailGain_UI_hw);
11608 //printf("Set u8DetailGain_UI_hw:%d u8DetailGain_hw:%d\n",u8DetailGain_UI_hw,u8DetailGain_hw);
11609 MApi_XC_W2BYTEMSK(REG_SC_BK0C_11_L, u8DBKGain_hw, 0x000F); //DBK Gain
11610 MApi_XC_W2BYTEMSK(REG_SC_BK0C_10_L, u8STD_Threshold_hw<<8, 0xFF00); //DBK STD threshold
11611 MApi_XC_W2BYTEMSK(REG_SC_BK0C_40_L, (u8DBK_coase_TH<<8), 0xFF00); //DBK coase threshold
11612 MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, (u8DetailGain_UI_hw<<12), 0xF000); //blockness gain
11613 MApi_XC_W2BYTEMSK(REG_SC_BK47_30_L, ((u8VoidGain<<12)+(u8PostGain<<8)), 0xFF00); //Post VS Void gain
11614
11615 if(u8Widdth == 21 ||u8Widdth == 16)//Scaling up SD2HD
11616 {
11617 MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0001, 0x0001); //hd mode enable
11618 MApi_XC_W2BYTEMSK(REG_SC_BK0C_71_L, 0x00C0, 0x00C0); //switch to Y 7tap filter
11619 MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 0x0006, 0x0006); //switch to C 7tap filter
11620 MApi_XC_W2BYTEMSK(REG_SC_BK0C_72_L, 0x0000, 0x0006); //smooth step 0
11621 MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0A86, 0x0F87); //blockness extend enable/switch pulse filter
11622 }
11623 else
11624 {
11625 MApi_XC_W2BYTEMSK(REG_SC_BK0C_41_L, 0x0000, 0x0001); //hd mode disable
11626 MApi_XC_W2BYTEMSK(REG_SC_BK0C_71_L, 0x0040, 0x00C0); //switch to Y 5tap filter
11627 MApi_XC_W2BYTEMSK(REG_SC_BK0C_72_L, 0x0002, 0x0006); //smooth step 1
11628 MApi_XC_W2BYTEMSK(REG_SC_BK0C_02_L, 0x0002, 0x0006); //switch to C 3tap filter
11629 MApi_XC_W2BYTEMSK(REG_SC_BK0C_42_L, 0x0905, 0x0F87); //blockness extend disable/switch pulse filter
11630 }
11631
11632 //printf("Set Function u8STD_Threshold_hw:%d u8DetailGain_hw:%d\n",u8STD_Threshold_hw,u8DetailGain_hw);
11633 //printf("Set Function u8DBKGain_hw:%d u8DBK_coase_TH:%d\n",u8DBKGain_hw,u8DBK_coase_TH);
11634 BlockyPercentageIIR = BlockyPercentageIIR;
11635 return u8STD_Threshold_hw;
11636 }
ScenceChangeConfirm(MS_U32 u32StaticCount,MS_BOOL isSceneChangeY)11637 MS_BOOL ScenceChangeConfirm(MS_U32 u32StaticCount,MS_BOOL isSceneChangeY)
11638 {
11639 MS_BOOL bRealSceneChange = 0;
11640 static MS_U8 u8SceneChangeCounter = 0,u32StaticCountTemp = 0,u8CounterForSC = 0;
11641 if(u32StaticCountTemp >20 && u32StaticCount ==0)
11642 {
11643 u8CounterForSC = 1;
11644 }
11645
11646 if(u8CounterForSC ==1)
11647 {
11648 u8SceneChangeCounter++;
11649 if(u8SceneChangeCounter<10)
11650 {
11651 if(isSceneChangeY)
11652 {
11653 bRealSceneChange = 1;
11654 }
11655 }
11656 else
11657 {
11658 u8CounterForSC = 0;
11659 u8SceneChangeCounter = 0;
11660 }
11661 }
11662
11663 u32StaticCountTemp = u32StaticCount;
11664 return bRealSceneChange;
11665 }
Mdrv_PQ_DBK(MS_BOOL isSceneChangeY,MS_U16 u16MotionValue,MS_U16 u16Width,MS_U16 u16height,const MS_BOOL isSD_source)11666 void Mdrv_PQ_DBK(MS_BOOL isSceneChangeY,MS_U16 u16MotionValue,MS_U16 u16Width,MS_U16 u16height, const MS_BOOL isSD_source)
11667 {
11668 //DBK Variables
11669 MS_BOOL bSceneChange = 0;
11670 static MS_BOOL bDBK_initial = 0;
11671 MS_U8 u8ReadDBKHistAck = 0,u8VReadDBKHistAck = 0;
11672 static MS_U8 u8CountForSample = 0;
11673 static MS_U8 u8CountForDBK = 0;
11674 static MS_U8 u8Widdth = 8,u8VWidth = 8;
11675 static MS_U32 u32StaticValueTemp=0,u32StaticCount=0;
11676 //int log_en = 5;
11677 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_01_L, 0x000F); //easter
11678 //MS_U8 u8StartPosition = 0,u8VStartPosition = 0;
11679 //MS_U8 u8SramError = 0;
11680 MS_U8 u8DebugMode = 0;
11681 static MS_U8 u8HwidthConfidence = 0;
11682 static MS_U8 u8VConfidence2Strength = 0;
11683 MS_U8 u8HDBKStrength = 0;
11684 //u8SramError = MApi_XC_R2BYTEMSK(REG_SC_BK47_0B_L, 0x0100)>>8;
11685 u8DebugMode = MApi_XC_R2BYTEMSK(REG_SC_BK47_37_L, 0x0007 ) |MApi_XC_R2BYTEMSK(REG_SC_BK47_67_L, 0x0007 );
11686 MApi_XC_W2BYTEMSK(REG_SC_BK47_08_L, u16Width, 0x1FFF);//set H maxline_addr_end of readout
11687 MApi_XC_W2BYTEMSK(REG_SC_BK47_78_L, u16height, 0x1FFF);//set V maxline_addr_end of readout
11688 MApi_XC_W2BYTEMSK(REG_SC_BK47_30_L, 0x009B, 0x00FF); //HW enable LPF/Extend enable
11689 MApi_XC_W2BYTEMSK(REG_SC_BK47_60_L, 0x008B, 0x00FF); //HW enable LPF/Extend enable
11690
11691
11692 if(u16MotionValue ==0 && u32StaticValueTemp==0)
11693 {
11694 u32StaticCount++;
11695 }
11696 else
11697 {
11698 u32StaticCount = 0;
11699 }
11700 u32StaticValueTemp = u16MotionValue;
11701
11702 bSceneChange = ScenceChangeConfirm(u32StaticCount,isSceneChangeY);
11703
11704 if (bSceneChange)
11705 {
11706 u8CountForDBK = 0;
11707 }
11708 //printf("SC u8CountForDBK:%d\n",u8CountForDBK);
11709 //printf("SC u32StaticCount:%d ,isSceneChangeY:%d\n",u32StaticCount,isSceneChangeY);
11710 //printf("SC bRealSceneChange:%d\n",bSceneChange);
11711
11712 if (u8CountForDBK == 0) // Read Histogram
11713 {
11714 if(u8DebugMode == 0)
11715 {
11716 u8ReadDBKHistAck = readHistogramPart(u8CountForDBK);
11717 u8VReadDBKHistAck = readVHistogramPart(u8CountForDBK);
11718 //printf("easter request histogram\n");
11719 }
11720 bDBK_initial = u8ReadDBKHistAck |u8VReadDBKHistAck;
11721 if((u8ReadDBKHistAck==1)&& (u32StaticCount < 15))
11722 {
11723 u8Widdth = DBK_Width_Detect(bSceneChange,&u8HwidthConfidence);
11724 if(u8Widdth > 2 && u8Widdth<32)
11725 {
11726 MApi_XC_W2BYTEMSK(REG_SC_BK47_32_L, u8Widdth, 0x003F); //Mark width input
11727 MApi_XC_W2BYTEMSK(REG_SC_BK47_34_L, u8Widdth, 0x00FF); //Mark initial input
11728 DBK_FindStartPosition(u8Widdth,bSceneChange);
11729 //printf("H u8Widdth:%d u8StartPosition:%d\n",u8Widdth,u8StartPosition);
11730 }
11731 }
11732
11733 if((u8VReadDBKHistAck==1)&& (u32StaticCount < 15))
11734 {
11735 u8VWidth = VDBK_Width_Detect(bSceneChange,u8Widdth,u8HwidthConfidence,&u8VConfidence2Strength);
11736 if(u8VWidth > 2 && u8VWidth <21)
11737 {
11738 MApi_XC_W2BYTEMSK(REG_SC_BK47_62_L, u8VWidth, 0x003F); //Mark width input
11739 MApi_XC_W2BYTEMSK(REG_SC_BK47_64_L, u8VWidth, 0x00FF); //Mark initial input
11740 VDBK_FindStartPosition(u8VWidth,bSceneChange);
11741 //printf("V u8VWidth:%d u8VStartPosition:%d\n",u8VWidth,u8VStartPosition);
11742 }
11743 }
11744
11745 if (bDBK_initial)
11746 {
11747 u8CountForDBK++;
11748 }
11749 }
11750 else if (u8CountForDBK == 1)
11751 {
11752 if ( bDBK_initial == 1)
11753 {
11754 u8HDBKStrength = SetAdaptiveParameter(u8Widdth, isSD_source);
11755 VSetAdaptiveParameter(u8VWidth,u8HDBKStrength,u8VConfidence2Strength);
11756 //printf("u8HDBKStrength:%d\n",u8HDBKStrength);
11757 }
11758 u8CountForDBK++;
11759 u8CountForSample++;
11760
11761 }
11762
11763 if(u8CountForDBK >= 2)
11764 {
11765 u8CountForDBK = 0;
11766 }
11767
11768 }
DMS_SDHDModeCheck(MS_U8 u8SD2HDValue)11769 void DMS_SDHDModeCheck( MS_U8 u8SD2HDValue) //Register Settings to hardware
11770 {
11771
11772
11773 if( (u8SD2HDValue>=60) && (frameWidth>0x700) ) //SD to HD mode
11774 MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x4000, 0x4000); // HD_enable
11775 else
11776 MApi_XC_W2BYTEMSK(REG_SC_BK26_10_L, 0x0000, 0x4000);
11777 }
11778 static MS_U16 g_u16BK0A_24 = 0;
11779 static MS_U16 g_u16BK0C_10 = 0;
11780 static MS_U16 g_u16BK0C_39 = 0;
11781 static MS_U16 g_u16BK0C_3A = 0;
11782 static MS_U16 g_u16BK0C_40 = 0;
11783 //static MS_U16 g_u16BK0C_41 = 0;
11784 static MS_U16 g_u16BK0C_42 = 0;
11785 static MS_U16 g_u16BK26_10 = 0;
11786 static MS_U16 g_u16BK26_11 = 0;
11787 static MS_U16 g_u16BK26_12 = 0;
11788 static MS_U16 g_u16BK26_13 = 0;
11789 static MS_U16 g_u16BK26_18 = 0;
11790
11791 /******************************************************************************/
11792 ///Film mode control for Any Candence
11793 ///@param bEnable \ IN: Enable/Disable control
11794 /******************************************************************************/
Hal_PQ_FilmMode_AnyCandence_Enable(void * pInstance,MS_BOOL bEnable)11795 void Hal_PQ_FilmMode_AnyCandence_Enable(void *pInstance,MS_BOOL bEnable)
11796 {
11797 MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, (bEnable ? (BIT(15)) : 0), BIT(15));
11798 _bAnyCandenceEnable = bEnable;
11799 }
11800
11801 /******************************************************************************/
11802 ///Store the Current value
11803 /******************************************************************************/
Hal_PQ_StoreCurrentValue(void * pInstance)11804 void Hal_PQ_StoreCurrentValue(void *pInstance)
11805 {
11806 //for AnyCandence Film Mode
11807 g_u16BK0A_24 = MApi_XC_R2BYTEMSK(REG_SC_BK0A_24_L, BIT(15));
11808
11809 //for DBK
11810 g_u16BK0C_10 = MApi_XC_R2BYTE(REG_SC_BK0C_10_L);
11811 g_u16BK0C_39 = MApi_XC_R2BYTE(REG_SC_BK0C_39_L);
11812 g_u16BK0C_3A = MApi_XC_R2BYTE(REG_SC_BK0C_3A_L);
11813 g_u16BK0C_40 = MApi_XC_R2BYTE(REG_SC_BK0C_40_L);
11814 //g_u16BK0C_41 = MApi_XC_R2BYTE(REG_SC_BK0C_41_L);
11815 g_u16BK0C_42 = MApi_XC_R2BYTE(REG_SC_BK0C_42_L);
11816
11817 //for DMS
11818 g_u16BK26_10 = MApi_XC_R2BYTE(REG_SC_BK26_10_L);
11819 g_u16BK26_11 = MApi_XC_R2BYTE(REG_SC_BK26_11_L);
11820 g_u16BK26_12 = MApi_XC_R2BYTE(REG_SC_BK26_12_L);
11821 g_u16BK26_13 = MApi_XC_R2BYTE(REG_SC_BK26_13_L);
11822 g_u16BK26_18 = MApi_XC_R2BYTE(REG_SC_BK26_18_L);
11823 }
11824
11825 /******************************************************************************/
11826 ///Store the Current value
11827 /******************************************************************************/
Hal_PQ_ReStoreToDefault(void * pInstance)11828 void Hal_PQ_ReStoreToDefault(void *pInstance)
11829 {
11830 //for AnyCandence Film Mode
11831 MApi_XC_W2BYTEMSK(REG_SC_BK0A_24_L, g_u16BK0A_24, BIT(15));
11832
11833 //for DBK
11834 MApi_XC_W2BYTE(REG_SC_BK0C_10_L, g_u16BK0C_10);
11835 MApi_XC_W2BYTE(REG_SC_BK0C_39_L, g_u16BK0C_39);
11836 MApi_XC_W2BYTE(REG_SC_BK0C_3A_L, g_u16BK0C_3A);
11837 MApi_XC_W2BYTE(REG_SC_BK0C_40_L, g_u16BK0C_40);
11838 //MApi_XC_W2BYTE(REG_SC_BK0C_41_L, g_u16BK0C_41);
11839 MApi_XC_W2BYTE(REG_SC_BK0C_42_L, g_u16BK0C_42);
11840
11841 //for DMS
11842 MApi_XC_W2BYTE(REG_SC_BK26_10_L, g_u16BK26_10);
11843 MApi_XC_W2BYTE(REG_SC_BK26_11_L, g_u16BK26_11);
11844 MApi_XC_W2BYTE(REG_SC_BK26_12_L, g_u16BK26_12);
11845 MApi_XC_W2BYTE(REG_SC_BK26_13_L, g_u16BK26_13);
11846 MApi_XC_W2BYTE(REG_SC_BK26_18_L, g_u16BK26_18);
11847 }
11848 #define FPLL_PHASE_VAR_LIMIT (0x10) // If phase error variation exceed this, means un-stable
11849 #define FPLL_PRD_THRESHOLD (0x100) // The PRD must be smaller than this value to indicate almost finished PRD lock
11850 #define FPLL_PRD_VAR_LIMIT (0x10) // If PRD variation exceed this, means un-stable
11851
11852 /*static MS_BOOL _Hal_PQ_FrameLockCheck (void)
11853 {
11854 MS_U16 u16NewPhase,u16NewPrd;
11855 static MS_U16 _u16OrigPhase,_u16OrigPrd;
11856
11857 u16NewPrd = MApi_XC_R2BYTEMSK(REG_LPLL_13_L, 0xFFFF);
11858 u16NewPhase = MApi_XC_R2BYTEMSK(REG_LPLL_11_L, 0xFFFF);
11859
11860 if((u16NewPrd < FPLL_PRD_THRESHOLD) && (abs(_u16OrigPrd - u16NewPrd) < FPLL_PRD_VAR_LIMIT)
11861 && (abs(_u16OrigPhase - u16NewPhase) < FPLL_PHASE_VAR_LIMIT))
11862 {
11863 _u16OrigPhase = u16NewPhase;
11864 _u16OrigPrd = u16NewPrd;
11865 return TRUE;
11866 }
11867 else
11868 {
11869 _u16OrigPhase = u16NewPhase;
11870 _u16OrigPrd = u16NewPrd;
11871 return FALSE;
11872 }
11873 }*/
11874
11875 static MS_BOOL bFakeOutCusEnable = TRUE;
11876
Hal_PQ_SetFakeOutEnable(void * pInstance,MS_BOOL bEnable)11877 MS_BOOL Hal_PQ_SetFakeOutEnable(void *pInstance,MS_BOOL bEnable)
11878 {
11879 bFakeOutCusEnable = bEnable;
11880 return TRUE;
11881 }
11882
11883 #define ENABLE_SCALER_DEFEATHERING 0x01 //BK22_7C_L
11884 #define ENABLE_SCALER_DEFLICKERING 0x02
11885 #define ENABLE_SCALER_DEBOUNCING 0x04
11886 #define ENABLE_SCALER_D3D_DRIVER 0x08
11887
11888 #define ENABLE_SCALER_AUTO_DBK_DRIVER 0x01 //BK22_7C_H[0]
11889 #define ENABLE_SCALER_MCDI_DRIVER 0x02 //BK22_7C_H[1]
11890 #define ENABLE_SCALER_MCNR_DRIVER 0x04 //BK22_7C_H[2]
11891 #define ENABLE_SCALER_SDHD_DETECT_DRIVER 0x08 //BK22_7C_H[3]
11892
11893 #define ENABLE_SCALER_CCS_DRIVER 0x20 //BK22_7C_H[5]
11894 #define ENABLE_SCALER_DHD_DRIVER 0x40 //BK22_7C_H[6]
11895 #define ENABLE_SCALER_AUTO_DBK_NMR_DRIVER 0x80 //BK22_7C_H[7]
11896 #define ENABLE_SR_DRIVER 0x01 //BK2C30_3F_H[0]
11897
11898 //-------------------------------------------------------------------------------------------------
11899 /// this function does adaptive tuning periodic
11900 //-------------------------------------------------------------------------------------------------
11901
Hal_PQ_AdaptiveTuning(void * pInstance)11902 void Hal_PQ_AdaptiveTuning(void *pInstance)
11903 {
11904 #if 0
11905 MS_BOOL ukoSabihS_en = 0;
11906 MS_BOOL isUkosabihsMcSweep = false, isUkosabihsMotionSweep = false;
11907 MS_BOOL isUkosabihsForFilm = 0;
11908 static MS_U8 u8PreviousVcnt = 0;
11909 MS_U8 u8CurrentVcnt;
11910 MS_U8 ColorSum;
11911 //MS_U32 MR_Offset;
11912 // MS_U16 MR_OffsetME1, MR_OffsetME2;
11913 MS_U32 u32MotionValue,u32MotionValue2,/*u32MotionValue3,*/TotalFeather,TotalMvComfirm;
11914 MS_U16 u16MotionValue4;
11915 MS_U32 uComplex,FeatherSum,u32MotionValue_Sum;
11916 MS_U8 NE_confirm = 0;
11917
11918 XC_ApiStatus stXCStatus;
11919 memset(&stXCStatus, 0x00, sizeof(stXCStatus));
11920
11921 MS_BOOL me1Still;
11922 MS_BOOL movingWithoutFeather;
11923 MS_BOOL isMcOutOfSearchRange;
11924 MS_U8 estNoise = 0;
11925 MS_U16 nonMv0Comfirm,mv0Comfirm,mvNotFound,nonMv0ComfirmME2,mv0ComfirmME2,mvNotFoundME2;//nonMv0Comfirm_noIIR,mv0Comfirm_noIIR,mvNotFound_noIIR;
11926 // MS_U16 mvNotFoundME2,mvNotFound_noIIR;
11927 MS_U16 isFeatherAndMotion = false;
11928
11929 MS_U16 me1IsMv0, me1IsNonMv0, me1IsNotFound;
11930 MS_U16 me2IsMv0, me2IsNonMv0, me2IsNotFound;
11931 MS_BOOL isSceneChangeMc, isSceneChangeY, isSceneChange = 0;//isScenceChangeByNotFound = 0;
11932 MS_BOOL isAbihsot = false; /* Toshixa */
11933 MS_BOOL isHBurstMoving = false, isHBurst = false;//isLowLuma;
11934 static MS_BOOL isMcFilm = false;
11935 // static MS_BOOL isMcFilmAny = false;
11936 static MS_BOOL isMcFilmHd = false;
11937 static MS_BOOL isMcFilmukoSabihS = false;
11938
11939 MS_BOOL isMcFilmSlowMotion = true;
11940
11941 //MS_BOOL isLrLetterBox = false;
11942 MS_BOOL isL139 = FALSE, isL107 = FALSE, isL153 =FALSE, isUkosabihsMotion = FALSE, isUkosabihsMc = FALSE, isUkosabihsMv0 = FALSE;// isSWoman = FALSE;
11943 // MS_BOOL isWeakMcNrFilm = false; /* for delay one frame issue */
11944 MS_BOOL Bouncing_status,bBouncing_Status2,Feather_sum_status,Feather_sum_status2;
11945 XC_FilmStates filmstatus;
11946 XC_OpFrameStates opFrameStatus;
11947 MS_BOOL isOpFrameChanged;
11948
11949 static XC_OpFrameStates prevOpFrameStatus;
11950
11951 XC_Me1HisStates ME1HisStates_1,ME1HisStates_2;
11952 XC_GMvStates GMV;
11953 //OLD DBK Driver easter 20150805
11954 // static MS_U8 u8SDHDDReport = 0;
11955 static MS_U8 _timeSharingID = 0;
11956
11957 static MS_U8 timingSegment = 0;
11958 static MS_U8 _hdsddFilterBaseReport;
11959 static MS_U32 _hpfHdCntReport;
11960 static MS_U32 _hpfSdCntReport;
11961 static MS_U32 hdNactCnt;
11962 static MS_U32 _hdFilterBaseReport;
11963 static MS_U32 _hpfSdTolerantReport;
11964 static MS_U32 _hpfHdTolerantReport;
11965
11966 static MS_U32 _hpfHdCntReport3;
11967 static MS_U32 _hpfSdCntReport3;
11968
11969 //Eva Add 0804
11970 static MS_U32 hdNactCnt4;
11971 static MS_U32 _hpfHdCntReport4;
11972 static MS_U32 _hpfSdCntReport4;
11973
11974
11975
11976 // static MS_BOOL isMEReset;
11977 MS_BOOL isZoomMoving = false;
11978 MS_BOOL isBigFeather = false;
11979 MS_BOOL isSdHqvJaggedTest = false;
11980 XC_LumaHistogramStates lumaHistogramStates;
11981 static XC_HpfDefaultRegSetting hpfDefaultReg;
11982
11983 MS_BOOL isSourceChange;
11984 MS_BOOL isSourceChangeForME = false;
11985 MS_BOOL isSourceChangeFlag = false;
11986
11987 MS_U32 inSearchUseFeather;
11988 MS_BOOL isArtifactPattern = false;
11989 // MS_BOOL isMv0Comfirm = false;
11990 MS_BOOL isSparsePattern = false;
11991
11992 MS_BOOL isNoLumaCplx = false;
11993 //DBK Variables
11994 //
11995 //****** Check VCnt******//
11996 //
11997 u8CurrentVcnt = MDrv_SC_read_v_cnt();
11998 if (u8PreviousVcnt == u8CurrentVcnt)
11999 {
12000 return;
12001 }
12002 else
12003 {
12004 u8PreviousVcnt = u8CurrentVcnt;
12005 }
12006
12007 if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW))
12008 {
12009 //MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.stCropWin.width, stXCStatus.stCropWin.height);
12010 if(stXCStatus.bInterlace)
12011 {
12012 MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.ScaledCropWin.width, (stXCStatus.ScaledCropWin.height)/2);
12013 }
12014 else
12015 {
12016 MDrv_SC_Edison_ME1_SetStatisticsWindow(stXCStatus.ScaledCropWin.width, stXCStatus.ScaledCropWin.height);
12017 }
12018 }
12019 frameWidth = __minmax(stXCStatus.ScaledCropWin.width, 1, MaxWidth );
12020 frameHeight = __minmax(stXCStatus.ScaledCropWin.height, 1, MaxHeight);
12021
12022 //
12023 //****** Get input resolution info******//
12024 //
12025 if( stXCStatus.u16H_SizeAfterPreScaling >= 1280 )
12026 {
12027 _bIsHDSource= true;
12028 }
12029 else
12030 {
12031 _bIsHDSource= false;
12032 }
12033
12034 //
12035 //****** source change******//
12036 //
12037 isSourceChange = MDrv_SC_SourceChange(); //Trace the rising signal for source change
12038 isSourceChangeForME = (MApi_XC_R2BYTEMSK(REG_SC_BK30_07_L, 0x0002)>>1) ;//hold for 35frames
12039 isSourceChangeFlag = MDrv_SC_SourceChangeFlag(isSourceChange); //hold for 4 frames
12040
12041 //
12042 //****** save HPF original setting******/
12043 //
12044 hpfDefaultReg = MDrv_SC_SaveHpfSetting( isSourceChangeFlag );
12045
12046 //
12047 //******Get adaptive function control******//
12048 //
12049 MS_U8 u8Ctrl = MDrv_SC_get_adaptive_ctrl();
12050 MS_U8 u8Ctrl2 = MDrv_SC_get_adaptive_ctrl2();
12051 MS_U8 u8UFSCCtrl3 = MDrv_UFSC_get_adaptive_ctrl3();
12052 //MS_U8 u8Ctrl4 = MDrv_SC_get_adaptive_ctrl4();
12053 //MS_U8 u8Ctrl5 = MDrv_SC_get_adaptive_ctrl5();
12054
12055 //
12056 //****** Get motion value******//
12057 //
12058 u32MotionValue = MDrv_SC_read_motion_value1();
12059 u32MotionValue2 = MDrv_SC_read_motion_value2();
12060 //u32MotionValue3 = MDrv_SC_read_motion_value3();
12061 u16MotionValue4 = MDrv_SC_read_motion_value4(); /* Edison new arrive ( this is no-history motion */
12062
12063 /*MR_OffsetME1 =*/ MDrv_SC_Agate_ME1_UC_InSearchRange_MR_Offset( &me1IsMv0, &me1IsNonMv0, &me1IsNotFound );
12064 /*MR_OffsetME2 =*/ MDrv_SC_Agate_ME2_UC_InSearchRange_MR_Offset( &me2IsMv0, &me2IsNonMv0, &me2IsNotFound );
12065
12066 u32MotionValue_Sum = u32MotionValue2; //+ ( u16MotionValue4*1 );
12067 //luma, color, complex
12068 lumaHistogramStates = MDrv_SC_GetLumaHistogram();
12069 ColorSum = MDrv_SC_A5_ColorPixelSum(); // #pixels of specified color window
12070 uComplex = MDrv_SC_Agate_ComplexSum();
12071 //DEBUG_LC_uComplex(uComplex);
12072
12073 //
12074 //******scene change******//
12075 //
12076 isSceneChangeMc = MDrv_SC_Agate_SceneChangeMc( me1IsMv0, me1IsNonMv0, me1IsNotFound, me2IsMv0, me2IsNonMv0, me2IsNotFound );
12077 isSceneChangeY = MDrv_SC_Agate_SceneChangeY( lumaHistogramStates );
12078 isSceneChange = ( isSceneChangeMc | isSceneChangeY );
12079
12080 //Feather
12081 inSearchUseFeather = MDrv_SC_McInSearchRangeUseFeather();
12082
12083 TotalFeather = MDrv_SC_Agate_TotalFeather(); //clamp at 255
12084 FeatherSum = MDrv_SC_TotalFeather_Sum(); //no clamp
12085
12086 //MV
12087 //nonMv0Comfirm_noIIR = MDrv_SC_Agate_ME1_nonMv0Comfirm_noIIR();
12088 // mv0Comfirm_noIIR = MDrv_SC_Agate_ME1_mv0Comfirm_noIIR();
12089 nonMv0Comfirm = MDrv_SC_Agate_ME1_nonMv0Comfirm();
12090 mv0Comfirm = MDrv_SC_Agate_ME1_mv0Comfirm();
12091 mvNotFound = MDrv_SC_Agate_ME1_mvNotFound();
12092 //mvNotFound_noIIR = MDrv_SC_Agate_ME1_mvNotFound_noIIR();
12093
12094 nonMv0ComfirmME2 = MDrv_SC_Agate_ME2_nonMv0Comfirm();
12095 mv0ComfirmME2 = MDrv_SC_Agate_ME2_mv0Comfirm();
12096 mvNotFoundME2 = MDrv_SC_Agate_ME2_mvNotFound();
12097
12098 ME1HisStates_1 = MDrv_SC_Agate_Hierarchy1();
12099 ME1HisStates_2 = MDrv_SC_Agate_Hierarchy2(ME1HisStates_1);
12100 GMV = MDrv_SC_Agate_GMV( ME1HisStates_1, ME1HisStates_2 );
12101
12102 //isMv0Comfirm = ( mv0Comfirm_noIIR > 0xA0 ) ? true : false;
12103
12104 Bouncing_status = MDrv_SC_Bouncing_Status(u32MotionValue_Sum);
12105 bBouncing_Status2 = MDrv_SC_Bouncing_Status2(u16MotionValue4);
12106
12107 //Frame Organization: Film and OPFrame
12108
12109 opFrameStatus = MDrv_SC_OpFrame_Status();
12110 isOpFrameChanged = ( opFrameStatus.curOpFrame != prevOpFrameStatus.curOpFrame );
12111
12112 filmstatus = MDrv_SC_Film_Status();
12113 isMcFilm = MDrv_SC_McFilmLike( opFrameStatus, _bIsHDSource );
12114 isMcFilmHd = MDrv_SC_McFilmLikeHd( opFrameStatus, _bIsHDSource );
12115 //isMcFilmAny = MDrv_SC_McFilmLikeAny( opFrameStatus, isMcFilm, _bIsHDSource );
12116 //Time Sharing ID
12117 _timeSharingID = MDrv_SC_TimeSharing( opFrameStatus, &timingSegment, isSourceChangeFlag);
12118
12119 //
12120 //******DI status******//
12121 //
12122 TotalMvComfirm = MDrv_SC_Agate_TotalMvComfirm();
12123 me1Still = MDrv_SC_Agate_ME1Still();
12124 isFeatherAndMotion = MDrv_SC_Agate_FeatherAndMotion();
12125 movingWithoutFeather = MDrv_SC_Agate_MovingWithoutFeather();
12126 //isScenceChangeByNotFound = MDrv_SC_ScenceChangeDetectByNotFound(mvNotFound_noIIR);
12127 Feather_sum_status= MDrv_SC_TotalFeather_Sum_Status( isFeatherAndMotion, ( !_bIsHDSource ), &Feather_sum_status2 );
12128
12129 //for different picture size case
12130 XC_ApiStatus DrvStatus;
12131 memset(&DrvStatus, 0x0, sizeof(XC_ApiStatus));
12132 MApi_XC_GetStatus(&DrvStatus, MAIN_WINDOW);
12133 if((DrvStatus.stCropWin.width)==0)
12134 {
12135 (DrvStatus.stCropWin.width)=1;
12136 }
12137
12138 if((DrvStatus.stCropWin.height)==0)
12139 {
12140 (DrvStatus.stCropWin.height)=1;
12141 }
12142
12143 if((DrvStatus.stCapWin.width)==0)
12144 {
12145 (DrvStatus.stCapWin.width)=1;
12146 }
12147
12148 if((DrvStatus.stCapWin.height)==0)
12149 {
12150 (DrvStatus.stCapWin.height)=1;
12151 }
12152
12153 normalize_factor = ((256 * (DrvStatus.stCropWin.width) * (DrvStatus.stCropWin.height))/( (DrvStatus.stCapWin.width) * (DrvStatus.stCapWin.height)));
12154
12155 //
12156 //****** Letter Box LR******//
12157 //
12158 //if (!isSourceChangeFlag)
12159 // isLrLetterBox = MDrv_SC_Edison_LrLetterBox( opFrameStatus, hpfDefaultReg, _timeSharingID, timingSegment );
12160 XC_LetterBoxState letterBoxState = MDrv_SC_Letter_Box_Driver( /*_bIsHDSource,*/ isSceneChange, isSourceChangeFlag, isOpFrameChanged );
12161
12162 //
12163 //******DBK status******//
12164 //
12165 #ifdef DBG_SD2HD_LC
12166 DEBUG_LC_Full6bit(_hdsddFilterBaseReport);
12167 #endif
12168
12169 //isLowLuma = MDrv_SC_LowLumaDetection();
12170 // hdsdd filter base reporter
12171 // Only DBK Use
12172 if (!isSourceChangeFlag)
12173 {
12174 _hdsddFilterBaseReport = MDrv_SC_SDHD_FilterBaseReport( _timeSharingID, &_hpfHdCntReport, &_hpfSdCntReport, hpfDefaultReg, timingSegment, &hdNactCnt );
12175 _hdFilterBaseReport = MDrv_SC_dynamicHDfilterBaseReport( _timeSharingID, u32MotionValue, isUkosabihsMv0, hpfDefaultReg, timingSegment );
12176 _hpfSdTolerantReport = MDrv_SC_hpfTolerantReport( _timeSharingID, hpfDefaultReg, &_hpfHdTolerantReport, timingSegment );
12177 MDrv_SC_SDHD_FilterOneReport( _timeSharingID, &_hpfHdCntReport3, &_hpfSdCntReport3, hpfDefaultReg, timingSegment );
12178 MDrv_SC_SDHD_U11BaseReport( _timeSharingID, &_hpfHdCntReport4, &_hpfSdCntReport4, timingSegment, &hdNactCnt4 );
12179 }
12180
12181 #if 0
12182 MS_U8 _hdsddFilterBaseReportDbg = _hdsddFilterBaseReport / 15;
12183 if( _hdsddFilterBaseReportDbg == 0 )
12184 MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0000 );
12185 else if( _hdsddFilterBaseReportDbg == 1 )
12186 MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0002 );
12187 else if( _hdsddFilterBaseReportDbg == 2 )
12188 MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0022 );
12189 else if( _hdsddFilterBaseReportDbg == 3 )
12190 MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x0222 );
12191 else
12192 MApi_XC_W2BYTE(REG_SC_BK30_50_L, 0x2222 );
12193 #endif
12194
12195
12196 if (u8Ctrl2 & ENABLE_SCALER_AUTO_DBK_DRIVER) //Edison_DBK_driver 0x01
12197 {
12198 //int log_en = 0;
12199 //log_en = (MS_U32)MApi_XC_R2BYTEMSK(REG_SC_BK30_02_L, 0x000F); //easter 20150805
12200 //if(log_en == 1)
12201 //{
12202 if(MApi_XC_GetStatus(&stXCStatus, MAIN_WINDOW) == FALSE)
12203 {
12204 printf("MApi_XC_GetStatus failed because of InitData wrong, please update header file and compile again %d\n",_hdsddFilterBaseReport);
12205 }
12206 Mdrv_PQ_DBK(isSceneChangeY,u16MotionValue4,stXCStatus.stCropWin.width,stXCStatus.stCropWin.height, ( !_bIsHDSource ));
12207 //}
12208 }
12209
12210
12211 if(u8Ctrl2 & ENABLE_SCALER_MCDI_DRIVER) //Edison_UCDi_driver 0x02
12212 {
12213
12214 MDrv_SC_KFC_EODiW_Motionless(); /*2012-07-26 Author:sam.hung*/
12215 #if HQV_JAGGY_PATTERN_ENBLE
12216 if(!_bIsHDSource) //SD case
12217 isSdHqvJaggedTest = MDrv_SC_HQV_JaggedTestPattern( GMV );
12218 //printf("HQV_JAGGY_PATTERN_ENBLE == %d\n\n",HQV_JAGGY_PATTERN_ENBLE);
12219 #endif
12220 MDrv_SC_Agate_SubMvPanScan( GMV, isSceneChangeMc, isSdHqvJaggedTest, u16MotionValue4 );
12221 MDrv_SC_EODi_Armored( GMV, mv0Comfirm , nonMv0Comfirm);
12222
12223 //isMcFilmSlowMotion = _bIsHDSource ? MDrv_SC_McFilmLikeForSlowMotion( u32MotionValue2, GMV ) : false;
12224
12225 isSparsePattern = MDrv_SC_ukoSabihS_SparsePattern( mvNotFound, mvNotFoundME2, mv0Comfirm, nonMv0Comfirm, mv0ComfirmME2, nonMv0ComfirmME2, _bIsHDSource); /*FOR VG846 sparse content pattern*/
12226
12227 #if SHIBASOKU_ENABLE
12228 isHBurstMoving = MDrv_SC_ukoSabihS_HBurstMoving( _hpfSdTolerantReport/*_hpfSdCntReport*/ );
12229 isHBurst = MDrv_SC_ukoSabihS_HBurst( _hpfSdTolerantReport/*_hpfSdCntReport*/, uComplex );
12230 ukoSabihS_en = MDrv_SC_Agate_ukoSabihS(&stXCStatus, GMV,nonMv0Comfirm, filmstatus, isMcFilmukoSabihS, &isUkosabihsMotion, &isUkosabihsMc, &isUkosabihsForFilm, mv0Comfirm, &isUkosabihsMv0, _bIsHDSource);
12231 isUkosabihsMcSweep = MDrv_SC_sweep_ukoSabihS( GMV, nonMv0Comfirm, mv0Comfirm, filmstatus, isMcFilm, uComplex, &isUkosabihsMotionSweep );
12232 isUkosabihsMc = ( isUkosabihsMc & (!isBigFeather) ); /*isBigFeather for Ukosabihs scence change */
12233 isBigFeather = (isFeatherAndMotion > 0x100)? true : false;
12234 isArtifactPattern = MDrv_SC_ukoSabihS_ArtifactPattern(_hpfHdTolerantReport,_bIsHDSource);
12235 isNoLumaCplx = MDrv_SC_ukoSabihS_noLumaCplx(); //=>no chroma
12236 isMcFilmukoSabihS = MDrv_SC_McFilmUkoSabihS( opFrameStatus, _bIsHDSource, _hpfHdCntReport );
12237 #else
12238 isBigFeather = isBigFeather;
12239 isMcFilmukoSabihS = isMcFilmukoSabihS;
12240 isUkosabihsForFilm = isUkosabihsForFilm;
12241 #endif
12242
12243
12244 isMcOutOfSearchRange = MDrv_SC_McOutOfSearchRange( mvNotFound, mv0Comfirm, nonMv0Comfirm, isFeatherAndMotion, GMV );
12245
12246 if((_bIsHDSource)&& KURO_PATTERN_ENABLE == 1) //HD case
12247 {
12248 isMcFilmSlowMotion = MDrv_SC_McFilmLikeForSlowMotion( u32MotionValue2, GMV ); /*fot Kuro increase SST */
12249 //printf("McFilmLikeForSlowMotion ==1\n\n");
12250 }
12251 else
12252 {
12253 isMcFilmSlowMotion = false;
12254 //printf("McFilmLikeForSlowMotion ==0\n\n");
12255 }
12256
12257 //isZoomMoving = _bIsHDSource ? false : MDrv_SC_ZoomMoving( GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
12258 if(!_bIsHDSource) //SD case for S Tree and Flower
12259 {
12260 isZoomMoving = MDrv_SC_ZoomMoving( GMV, me1IsNonMv0, me1IsNotFound, isFeatherAndMotion, u16MotionValue4 );
12261 }
12262 else
12263 {
12264 isZoomMoving = false;
12265 }
12266
12267 #if LG_SPECIFIC_PATTERN_ENABLE
12268 if(!_bIsHDSource) //SD case
12269 {
12270 isL139 = MDrv_SC_Agate_L139( TotalMvComfirm, ColorSum, uComplex, me1Still, ME1HisStates_2 );
12271 isL153 = MDrv_SC_Agate_L153( movingWithoutFeather, ColorSum, uComplex, ME1HisStates_2 );
12272 isL107 = MDrv_SC_Agate_L107( TotalMvComfirm, uComplex, GMV, u32MotionValue, TotalFeather, 2/*HDMI only*/ );
12273 //isSWoman = MDrv_SC_SBlueShirt(nonMv0Comfirm, mv0Comfirm, mvNotFound, mvNotFoundME2, uComplex, ME1HisStates_2, GMV );
12274 //isWeakMcNrFilm = filmstatus.film_act;
12275 isAbihsot = false;
12276 }
12277 else //HD case
12278 {
12279 isL139 = false;
12280 isL153 = false;
12281 isL107 = false;
12282 //isSWoman = false;
12283 //isWeakMcNrFilm = false;
12284 isAbihsot = false;
12285 }
12286 #else
12287 movingWithoutFeather = movingWithoutFeather;
12288 TotalMvComfirm = TotalMvComfirm;
12289 TotalFeather = TotalFeather;
12290 #endif
12291
12292 //Double Control
12293 MDrv_SC_KFC_VerticalMovingUdRatio_Ctrl( inSearchUseFeather, isMcFilm );
12294 MDrv_SC_KFC_8bitMotionGain_Ctrl( ( (isZoomMoving) & (!isSceneChangeMc)) , isMcFilm, isMcFilmSlowMotion );
12295
12296 MDrv_SC_featherSstGain_Ctrl( isMcFilmSlowMotion ); /* for kuro propeller.. */
12297 MDrv_SC_featherSstOffset_Ctrl( opFrameStatus, isMcFilmSlowMotion, ( (isZoomMoving) & (!isSceneChangeMc) )); /* for kuro propeller.. */
12298
12299 MDrv_SC_MotionLimitGain_Ctrl( isL153 );
12300 MDrv_SC_UCDi_Weight_Boundary_Ctrl( ME1HisStates_1 ); /*patch for Boundary flicker issue when vertical scroll*/
12301 MDrv_SC_MCDi_En_Ctrl( ( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | bBouncing_Status2 | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ) );
12302
12303 MDrv_SC_Force_Motion_Ctrl( isL139, ( isUkosabihsMotion | isUkosabihsMotionSweep ) );
12304 MDrv_SC_Force_Mcdi_Ctrl(isUkosabihsMc);
12305 MDrv_SC_KFC_EODiW_Ctrl( ( isUkosabihsMc | isUkosabihsMcSweep ) );
12306 MDrv_SC_Mcdi_EODiW_Ctrl( ( isUkosabihsMc | isUkosabihsMcSweep ), isL107 );
12307 MDrv_SC_KFC_Ctrl( isAbihsot );
12308 MDrv_SC_UCDi_OP1_HisWeight_Ctrl(Bouncing_status,Feather_sum_status,filmstatus, ColorSum, FeatherSum, _bIsHDSource);
12309 MDrv_SC_SPF_OP1_HisWeight_Ctrl(Bouncing_status);
12310 MDrv_SC_SST_Ctrl(( isNoLumaCplx | isMcFilm | isMcOutOfSearchRange | isArtifactPattern | bBouncing_Status2 | isHBurstMoving | isSceneChangeMc | isMcFilmSlowMotion ), FeatherSum, _bIsHDSource);
12311
12312 }
12313 /*isMEReset =*/ MDrv_SC_Agate_ME_Reset(u32MotionValue2,isSceneChangeMc,isSceneChangeY, isSourceChangeForME);
12314
12315 if(u8Ctrl2 & ENABLE_SCALER_MCNR_DRIVER) //Edison_UCNR_driver 0x04
12316 {
12317 NE_confirm = MDrv_SC_GetNoiseLevel( &estNoise, &letterBoxState, &stXCStatus, stXCStatus.bInterlace, isOpFrameChanged );
12318 MDrv_SC_NR_Driver_E28( u16MotionValue4, /*blkConfidence,*/ /*_hpfHdTolerantReport,*/ &lumaHistogramStates, &filmstatus, &GMV, isUkosabihsMotion, isSceneChange, stXCStatus.bInterlace, _bIsHDSource, isSourceChangeFlag, isOpFrameChanged,&estNoise, NE_confirm);
12319 #ifdef DBG_SCCHG_LC
12320 DEBUG_LC_42( isSceneChangeY, isSceneChangeMc );
12321 #endif
12322 }
12323
12324 if(u8Ctrl2 & ENABLE_SCALER_SDHD_DETECT_DRIVER) //Edison_SDHD_driver 0x08
12325 {
12326 MDrv_SC_Edision_stillFeatherDetection( u32MotionValue, isUkosabihsMotion, _hdFilterBaseReport, isHBurstMoving, isHBurst, isUkosabihsMv0, isMcFilmHd/*, isSceneChange*/, _hpfSdTolerantReport );
12327
12328 static int DMS_SD2HD_Cnt = 0;
12329 // DMS SDtoHD mode
12330 MS_BOOL GMV_StillLike = (_bIsHDSource) && (GMV.minMvXdir >= 31) && (GMV.minMvXdir <= 33) && (GMV.minMvYdir >= 7) && (GMV.minMvYdir <= 9) ;
12331 MS_BOOL SD2HDCntLike1 = ( (_hpfHdCntReport>>7) > 2) && ( (_hpfHdCntReport>>7) < 8);
12332 MS_BOOL SD2HDCntLike2 = ( (_hpfSdCntReport>>3) > (_hpfHdCntReport*6) );
12333 // MS_BOOL DBKLike = (FrameBLKEdgIIR > 31) && (FrameBLKEdgIIR < 80);//easter 20150805
12334 //DEBUG_LC_Full6bit3(minmax((_hpfHdCntReport>>7), 0, 63) );
12335 //DEBUG_LC_Full6bit4(minmax((FrameBLKEdgIIR>>1), 0, 63) );
12336 #if 0
12337 if ( GMV_StillLike )
12338 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x7000, 0x7000);
12339 else
12340 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x7000);
12341
12342 if ( SD2HDCntLike1 )
12343 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0700, 0x0700);
12344 else
12345 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0700);
12346
12347 if ( SD2HDCntLike2 )
12348 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0070, 0x0070);
12349 else
12350 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0070);
12351
12352 if ( DBKLike )
12353 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0007, 0x0007);
12354 else
12355 MApi_XC_W2BYTEMSK(REG_SC_BK30_40_L, 0x0000, 0x0007);
12356 #endif
12357 if (isSceneChange || isSourceChangeFlag)
12358 {
12359 DMS_SD2HD_Cnt = 0;
12360 }
12361 else if ( GMV_StillLike && SD2HDCntLike1 && SD2HDCntLike2)// && )DBKLike )easter 20150805
12362 {
12363 DMS_SD2HD_Cnt += 4;
12364 }
12365 else
12366 {
12367 if (!GMV_StillLike)
12368 DMS_SD2HD_Cnt -= 1;
12369 if (!SD2HDCntLike1)
12370 DMS_SD2HD_Cnt -= 1;
12371 if (!SD2HDCntLike2)
12372 DMS_SD2HD_Cnt -= 1;
12373 //if (!DBKLike) easter 20150805
12374 // DMS_SD2HD_Cnt -= 1;
12375 }
12376 DMS_SD2HD_Cnt = __minmax(DMS_SD2HD_Cnt, 0, 63);
12377 DMS_SDHDModeCheck(DMS_SD2HD_Cnt);
12378 }
12379
12380
12381 if(u8Ctrl2 & ENABLE_SCALER_CCS_DRIVER) //Edison_CCS_driver 0x20
12382 {
12383 //MDrv_SC_Edison_CCS_driver(ukoSabihS_en);
12384 MDrv_SC_Edison_CCS_driver(ukoSabihS_en|isSparsePattern); //Add isSparsePattern for TG59 Variable Dot pattern(Pure Color pattern)
12385 }
12386
12387 if(u8Ctrl2 & ENABLE_SCALER_DHD_DRIVER) //Edison_DHD_driver 0x40
12388 {
12389 // u8SDHDDReport = false;
12390 MDrv_SC_Edison_DHD_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm, GMV, _hpfHdCntReport);
12391 MDrv_SC_Edison_DHD_Weather_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
12392 MDrv_SC_Edison_DHD_GSLSM_driver(uComplex, nonMv0Comfirm, me1Still, mv0Comfirm );
12393 MDrv_SC_DHD_CCS_MR_HisWeight_Ctrl(filmstatus);
12394 //MDrv_SC_Edison_DHD_Stadium_driver(isMcFilmHd,filmstatus);
12395 }
12396
12397 if(u8Ctrl & ENABLE_SCALER_D3D_DRIVER) //Edison_Detect_3D_Source_driver
12398 {
12399 MDrv_SC_3DfmtDetect(); //2012.7.24 mark
12400 }
12401
12402 if (u8Ctrl & ENABLE_SCALER_DEFEATHERING)
12403 {
12404 MDrv_SC_de_feathering(u32MotionValue); //2015.04.27 ricky.chen change back
12405 //MDrv_SC_de_feathering(u16MotionValue4);
12406 }
12407
12408 if (u8Ctrl & ENABLE_SCALER_DEFLICKERING)
12409 {
12410 MDrv_SC_de_flickering(u32MotionValue);
12411 }
12412
12413 if (u8Ctrl & ENABLE_SCALER_DEBOUNCING)
12414 {
12415 MDrv_SC_de_bouncing(u32MotionValue2);
12416 }
12417
12418 if( (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(14)) == BIT(14))
12419 || (MApi_XC_R2BYTEMSK(REG_SC_BK0A_10_L, BIT(15)) == BIT(15)) )
12420 {
12421 if(!_Hal_PQ_FrameLockCheck()) // Make not frame LOCKED then turn off FilmMode
12422 {
12423 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
12424 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
12425 }
12426 else // Make sure frame LOCKED then turn on FilmMode
12427 {
12428 if(bFakeOutCusEnable)
12429 {
12430 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, 0, BIT(1)); //hardware film mode ENABLE
12431 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, 0, BIT(1) | BIT(2)); //software film mode ENABLE
12432 }
12433 else
12434 {
12435 MApi_XC_W2BYTEMSK(REG_SC_BK0A_1E_L, BIT(1), BIT(1)); //hardware film mode DISABLE
12436 MApi_XC_W2BYTEMSK(REG_SC_BK0A_21_L, BIT(1)|BIT(2), BIT(1) | BIT(2)); //software film mode DISABLE
12437 }
12438 }
12439 }
12440 //
12441 //******UFSC DRIVER******//
12442 //
12443 MS_U16 FSC_estNoise=0;
12444 MS_U8 FSC_estConfirm=0;
12445
12446 //NE transfer from SOC GetNoiseLevel
12447 FSC_estNoise = __minmax(estNoise/10, 0, 15);
12448 FSC_estConfirm = __minmax( NE_confirm, 1, 8);
12449
12450 // SR enhancement strength
12451 int srEnhStr = (MDrv_Read2Byte( REG_FSC_BK30_3E_L)& 0x003F ); // 1.5
12452 static XC_BackgroundState backgroundState;
12453 MDrv_UFSC_PQ_BNF_status( &backgroundState, isOpFrameChanged );
12454
12455 // OSD info
12456 MS_BOOL isOSDActive = MDrv_Read2Byte(REG_FSC_BK132_4A_L)>>11;
12457 static MS_U8 osdW = 0;
12458 if( isOSDActive )
12459 {
12460 osdW = osdW < 253 ? osdW + 2 : 255;
12461 }
12462 else
12463 {
12464 osdW = osdW > 16 ? osdW - 16 : 0;
12465 }
12466
12467 static int dsStdCnt = 0, frNNCnt = 0, frNNCnt2 = 0;
12468 static int frDsSum = 0, frFetSum = 0, frNNSum = 0;
12469 {
12470 int dsStdCntTmp = MDrv_Read2Byte(REG_FSC_BK2C_79_L) + MDrv_Read2Byte(REG_FSC_BKAC_79_L);
12471 int frNNCntTmp = MDrv_Read2Byte(REG_FSC_BK72_31_L) + MDrv_Read2Byte(REG_FSC_BKF2_31_L);
12472 int frNNCnt2Tmp = MDrv_Read2Byte(REG_FSC_BK72_33_L) + MDrv_Read2Byte(REG_FSC_BKF2_33_L); // not changed with settings
12473
12474 int frDsSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7B_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7A_L)
12475 + (MDrv_Read2Byte(REG_FSC_BKF2_7B_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7A_L) ) >> 1;
12476 int frFetSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7D_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7C_L)
12477 + (MDrv_Read2Byte(REG_FSC_BKF2_7D_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7C_L) ) >> 1;
12478 int frNNSumTmp = ( (MDrv_Read2Byte(REG_FSC_BK72_7F_L) << 16) + MDrv_Read2Byte(REG_FSC_BK72_7E_L)
12479 + (MDrv_Read2Byte(REG_FSC_BKF2_7F_L) << 16) + MDrv_Read2Byte(REG_FSC_BKF2_7E_L) ) >> 1;
12480
12481 dsStdCnt = ( dsStdCntTmp + dsStdCnt*3 ) >> 2;
12482 frNNCnt = ( frNNCntTmp + frNNCnt*3 ) >> 2;
12483 frNNCnt2 = ( frNNCnt2Tmp + frNNCnt2*3 ) >> 2;
12484 frDsSum = ( frDsSumTmp + frDsSum*3 ) >> 2;
12485 frFetSum = ( frFetSumTmp + frFetSum*3 ) >> 2;
12486 frNNSum = ( frNNSumTmp + frNNSum*3 ) >> 2;
12487 }
12488
12489 #if 1
12490 int menuW, edgePatW; // for menu and dragon ball like edge pattern
12491 {
12492 // menu pattern
12493 menuW = __max( 0, (int)backgroundState.cplxRawCnt - ((int)backgroundState.dswRawCnt * 3) );
12494 menuW = __min( 256, menuW );
12495 menuW = 256 - menuW;
12496
12497 int cplxW = __max( 0 , (int)backgroundState.cplxRawCnt - 4096 ) >> 4;
12498 menuW = __max( 0, menuW - cplxW );
12499
12500 int fetDsW = __max( 0, frFetSum - frDsSum ) >> 2;
12501 menuW = __max( 0, menuW - fetDsW );
12502
12503 int fetW = __max( 0, frFetSum - 512 ) >> 2;
12504 menuW = __max( 0, menuW - fetW );
12505
12506 //printf("PQ_LSE : cplxW = %d , fetDsW = %d fetW = %d frFetSum = %d frDsSum = %d osdW = %d \n",cplxW,fetDsW,fetW,frFetSum,frDsSum,osdW);
12507 // OSD
12508 menuW = __max( menuW, osdW );
12509 }
12510 {
12511 // edge pattern : dragon ball, AUO_0011,12
12512 edgePatW = (__max( 0, (int)backgroundState.cplxRawCnt - ( ((int)backgroundState.dswRawCnt * 19) >> 3 )))>>2;
12513
12514 //printf("PQ_LSE : cplxRawCnt = %d , dswRawCnt = %d \n",(int)backgroundState.cplxRawCnt,(int)backgroundState.dswRawCnt);
12515 edgePatW = __min( 256, edgePatW );
12516 edgePatW = 256 - edgePatW;
12517
12518 int dsFetW = __max( 0, frDsSum - frFetSum );
12519 dsFetW = __min( 256, dsFetW );
12520 int stdW = __max( 0, dsStdCnt - 1024 ) >> 2;
12521 dsFetW = __max( 0, dsFetW - stdW );
12522 edgePatW = __max( 0, edgePatW - dsFetW );
12523
12524 //int flatW = max( 0 , 4096 - (int)backgroundState.cplxRawCnt ) >> 1;
12525 //edgePatW = max( 0, edgePatW - flatW );
12526 }
12527
12528
12529
12530 MS_U16 u16FhdReportOffset = MDrv_Read2Byte(REG_FSC_BK30_17_L) & 0xFFFF;
12531 int fHdW2,fHdW3;
12532 {
12533 int shiftbitnum = MDrv_Read2Byte(REG_FSC_BK30_27_L)>>8;
12534 int offset = u16FhdReportOffset<<shiftbitnum;
12535 int offset2 = u16FhdReportOffset<<(shiftbitnum+1);
12536 fHdW2 = __max( _hpfHdCntReport4 - offset , 0);
12537 fHdW2 = __minmax( fHdW2 >> shiftbitnum , 0 , 256);;
12538
12539 fHdW3 = __max( _hpfHdCntReport4 - offset2 , 0);
12540 fHdW3 = __minmax( fHdW3 >> shiftbitnum , 0 , 256);;
12541
12542
12543 int hdcnt_shift = _hpfHdCntReport4>>8;
12544 int sdcnt_shift = _hpfSdCntReport4>>8;
12545 int bld_alpha;
12546 bld_alpha = __max( sdcnt_shift - ((160*hdcnt_shift)>>6) ,0);
12547 bld_alpha = __minmax( bld_alpha>>3 , 0 , 64 );
12548
12549 int weight_bld = ( bld_alpha*fHdW3 + (64-bld_alpha)*fHdW2 )>>6;
12550 weight_bld = 256-weight_bld;
12551 fHdW2 = weight_bld;
12552
12553 }
12554
12555 int sdW2;
12556 {
12557
12558 int shiftbitnum = MDrv_Read2Byte(REG_FSC_BK30_27_L)&0x00FF;
12559 int offset = 256<<shiftbitnum;
12560 sdW2 = __max( _hpfHdCntReport4 - offset , 0);
12561 sdW2 = __minmax( sdW2 >> shiftbitnum , 0 , 256);
12562 sdW2 = 256 - sdW2;
12563
12564 //sdW2 = max( 0 , sdW2 - max( edgePatW, menuW ) );
12565
12566 }
12567
12568 //printf("EVATEST: sdW2 = %d, fHdW2 = %d, menuW = %d, edgePatW = %d, new_mode_en = %d\n",sdW2,fHdW2,menuW,edgePatW,new_mode_en);
12569
12570 MS_U8 u8iirPre = (MDrv_Read2Byte(REG_FSC_BK30_10_L)&0xF000)>>12;
12571 sdW2 = ( sdW2*(16-u8iirPre) + u32SdW*u8iirPre +8) /16; //iir
12572 fHdW2 = ( fHdW2*(16-u8iirPre) + u32FhdW*u8iirPre +8) /16;
12573
12574 //iir
12575 u32SdW = sdW2;
12576 u32FhdW = fHdW2;
12577
12578
12579 short mode_sel = MDrv_Read2Byte(REG_FSC_BK30_10_L)&0x000f;
12580 if(mode_sel == 1) //SD
12581 {
12582 sdW2 = 256;
12583 fHdW2 = 256;
12584 }
12585 else if(mode_sel == 2) //FHD
12586 {
12587 sdW2 = 0;
12588 fHdW2 = 256;
12589 }
12590 else if(mode_sel == 3) // HD
12591 {
12592 sdW2 = 0;
12593 fHdW2 = 0;
12594 }
12595 else if(mode_sel == 4)
12596 {
12597 edgePatW = 0;
12598 }
12599 else if(mode_sel == 5)
12600 {
12601 menuW = 0;
12602 }
12603 else if(mode_sel == 6)
12604 {
12605 menuW = 0;
12606 edgePatW = 0;
12607 }
12608
12609 //artificial pattern detection
12610 MS_U32 u32ArtiReport;
12611 MS_U16 u16ArtiReportH = MDrv_Read2Byte(REG_FSC_BK4F_47_L)&0xFFFF;
12612 MS_U16 u16ArtiReportL = MDrv_Read2Byte(REG_FSC_BK4F_46_L)&0xFFFF;
12613 u32ArtiReport = (u16ArtiReportH<<16) + u16ArtiReportL;
12614
12615 MS_U32 u32Dist5x5Report;
12616 MS_U16 u16Dist5x5ReportH = MDrv_Read2Byte(REG_FSC_BK4F_45_L)&0xFFFF;
12617 MS_U16 u16Dist5x5ReportL = MDrv_Read2Byte(REG_FSC_BK4F_44_L)&0xFFFF;
12618 u32Dist5x5Report = (u16Dist5x5ReportH<<16) + u16Dist5x5ReportL;
12619
12620 short arti_detect_disable = ( MDrv_Read2Byte(REG_FSC_BK30_10_L) >>4)&0x0001;
12621 MS_U16 u16ArtiWOffset = MDrv_Read2Byte(REG_FSC_BK30_19_L)&0x0FFF;
12622 MS_U16 u16ArtiW = 0;
12623 if(u32Dist5x5Report != 0)
12624 {
12625 u16ArtiW = __minmax( (u32ArtiReport*1024)/u32Dist5x5Report, 0 , 1024 ) ;
12626 u16ArtiW = __minmax( __max( u16ArtiW - u16ArtiWOffset , 0) , 0 , 256 );
12627 }
12628 if( arti_detect_disable == 1)
12629 u16ArtiW = 0;
12630
12631
12632 int hdreport = __minmax( _hpfHdCntReport4 >> 4 , 0 , 0xffff);
12633 int sdreport = __minmax( _hpfSdCntReport4 >> 4 , 0 , 0xffff);
12634
12635 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>11)&0x1) == 1 ){
12636 fHdW2 = MDrv_Read2Byte(REG_FSC_BK30_1E_L);
12637 sdW2 = MDrv_Read2Byte(REG_FSC_BK30_1F_L);
12638 }
12639 MApi_XC_Write2ByteMask(REG_FSC_BK30_28_L , hdreport , 0xFFFF);
12640 short reduce_osd_w = __max( edgePatW, menuW );
12641 MApi_XC_Write2ByteMask(REG_FSC_BK30_29_L , /*fHdW3 reduce_osd_w*/menuW , 0xFFFF);
12642 MApi_XC_Write2ByteMask(REG_FSC_BK30_2A_L , sdreport , 0xFFFF);
12643 MApi_XC_Write2ByteMask(REG_FSC_BK30_2B_L , sdW2 , 0xFFFF);
12644 MApi_XC_Write2ByteMask(REG_FSC_BK30_2C_L , fHdW2 , 0xFFFF);
12645 MApi_XC_Write2ByteMask(REG_FSC_BK30_18_L , /*u16ArtiW*/edgePatW , 0xFFFF);
12646
12647 //printf("SDHD: HDrep = %d , SDrep = %d , Midrep = %d \n",_hpfHdCntReport4,_hpfSdCntReport4,hdNactCnt4);
12648 //printf("Eva: fHdW2 = %d , sdW2 = %d hdNactCnt4 = %d \n",fHdW2,sdW2,hdNactCnt4);
12649 //printf("PQ_LSE: _hpfHdCntReport = %d hdNactCnt = %d\n",_hpfHdCntReport,hdNactCnt);
12650 //printf("MY PQ_LSE: _hpfHdCntReport4 = %d hdNactCnt4 = %d fHdW2 = %d sdW2 = %d \n",_hpfHdCntReport4,hdNactCnt4,fHdW2,sdW2);
12651
12652 #endif
12653
12654 #if 0
12655 XC_PqWriteReg PqWriteReg;
12656 memset(&PqWriteReg,0x0,sizeof(XC_PqWriteReg));
12657
12658 if (u8UFSCCtrl3 & ENABLE_SR_DRIVER)
12659 {
12660 //XC_PqWriteReg PqWriteReg;
12661 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>0)&0x1) != 1 )
12662 MDrv_UFSC_PQ_LSE( frNNCnt2, menuW, edgePatW, srEnhStr ,sdW2 , fHdW2 ,&PqWriteReg);
12663 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>1)&0x1) != 1 )
12664 MDrv_UFSC_PQ_NLM( &backgroundState, menuW, edgePatW, srEnhStr, sdW2 ,&PqWriteReg);
12665 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>2)&0x1) != 1 )
12666 MDrv_UFSC_PQ_PreEnh( fHdW2, sdW2, FSC_estNoise, FSC_estConfirm, srEnhStr ,&PqWriteReg);
12667 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>3)&0x1) != 1 )
12668 MDrv_UFSC_PQ_PostPK3x3( menuW, edgePatW, fHdW2, sdW2, srEnhStr ,&PqWriteReg,u16ArtiW);
12669 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>4)&0x1) != 1 )
12670 MDrv_UFSC_PQ_HASC( sdW2, srEnhStr );
12671 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>5)&0x1) != 1 )
12672 MDrv_UFSC_PQ_P2M( menuW, edgePatW, srEnhStr ,&PqWriteReg);
12673 //MDrv_UFSC_PQ_ANN( frNNCnt2 );
12674 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>6)&0x1) != 1 )
12675 MDrv_UFSC_PQ_DMS_referBNF( &backgroundState );
12676 //MDrv_UFSC_PQ_LSE_Patch();
12677
12678 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>7)&0x1) != 1 )
12679 MDrv_UFSC_PQ_2DPK(/*menuW*/reduce_osd_w ,sdW2,fHdW2,srEnhStr,&PqWriteReg,u16ArtiW);
12680 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>8)&0x1) != 1 )
12681 MDrv_UFSC_PQ_SPNN( menuW, edgePatW, srEnhStr ,sdW2 , fHdW2 ,&PqWriteReg);
12682 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>9)&0x1) != 1 )
12683 MDrv_SC_2DPK_PQ(sdW2,fHdW2,srEnhStr,&PqWriteReg,u16ArtiW);
12684 if( (( MDrv_Read2Byte(REG_FSC_BK30_1D_L) >>10)&0x1) != 1 )
12685 MDrv_UFSC_PQ_BNF(sdW2);
12686
12687 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x2, 0x000F );
12688 }
12689 else{
12690 MApi_XC_W2BYTEMSK(REG_SC_BK30_58_L, 0x1, 0x000F );
12691 }
12692
12693 MDrv_SC_UFSC_WRITE_REG_UI_SHARPNESS(&PqWriteReg , u8UFSCCtrl3 , ENABLE_SR_DRIVER);
12694 #else
12695 UNUSED(u8UFSCCtrl3);
12696 UNUSED(FSC_estNoise);
12697 UNUSED(FSC_estConfirm);
12698 UNUSED(reduce_osd_w);
12699 UNUSED(srEnhStr);
12700 #endif
12701
12702 MDrv_SC_ResetSourceChange( isSourceChangeForME );
12703
12704 prevOpFrameStatus = opFrameStatus;
12705 #else
12706 UNUSED(_bIsHDSource);
12707 UNUSED(u32SdW);
12708 UNUSED(u32FhdW);
12709
12710 #endif
12711
12712 }
12713
12714 #undef DRV_SCALER_ADAPTIVE_C
12715
12716