xref: /utopia/UTPA2-700.0.x/modules/xc/drv/xc/mdrv_sc_3d.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2010 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 
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 /// file    Mdrv_sc_3d.c
97 /// @brief  Driver Interface
98 /// @author MStar Semiconductor Inc.
99 ///////////////////////////////////////////////////////////////////////////////////////////////////
100 #define DRV_SC_3D_C
101 
102 #ifdef MSOS_TYPE_LINUX_KERNEL
103 #include <linux/string.h>
104 #include <linux/slab.h>
105 #else
106 #include <string.h>
107 #endif
108 #include "UFO.h"
109 // Common Definition
110 #include "MsCommon.h"
111 #include "MsOS.h"
112 #include "mhal_xc_chip_config.h"
113 #include "utopia.h"
114 #include "utopia_dapi.h"
115 #include "drvXC_IOPort.h"
116 #include "apiXC.h"
117 #include "apiXC_Adc.h"
118 #include "apiXC_Auto.h"
119 #include "drv_sc_display.h"
120 #include "drv_sc_isr.h"
121 #include "apiXC_PCMonitor.h"
122 #include "apiXC_ModeParse.h"
123 #include "drvXC_HDMI_if.h"
124 #include "mvideo_context.h"
125 #include "drv_sc_ip.h"
126 #if (LD_ENABLE==1)
127 #include "mdrv_ld.h"
128 #include "mdrv_ldalgo.h"
129 #endif
130 #include "mdrv_sc_3d.h"
131 #include "drv_sc_menuload.h"
132 #include "drvXC_ADC_Internal.h"
133 #include "mhal_sc.h"
134 #if FRC_INSIDE
135 #include "mdrv_frc.h"
136 #include "mhal_frc.h"
137 #endif
138 #include "XC_private.h"
139 #include "apiXC_v2.h"
140 #include "drv_sc_ip.h"
141 
142 #include "mhal_pip.h"
143 #include "mhal_mux.h"
144 #include "mhal_ip.h"
145 
146 #include "halCHIP.h"
147 #include "drv_sc_scaling.h"
148 #include "xc_hwreg_utility2.h"
149 #include "mhal_hdmi.h"
150 #include "mdrv_sc_dynamicscaling.h"
151 #include "mhal_dynamicscaling.h"
152 #include "mhal_menuload.h"
153 
154 #ifndef UNUSED
155 #define UNUSED(x) ((x)=(x))
156 #endif
157 
158 #ifndef DISABLE_3D_FUNCTION
159 //----------------------------------------
160 //--------3D macro define-----------------
161 //----------------------------------------
162 
163 #define MS_IPM_BASE0(pInstance, eWin) (MDrv_XC_GetIPMBase(pInstance, 0, eWin))
164 #define MS_IPM_BASE1(pInstance, eWin) (MDrv_XC_GetIPMBase(pInstance, 1, eWin))
165 
166 #ifndef MAX
167 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
168 #endif
169 
170 #ifndef MIN
171 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
172 #endif
173 
174 #ifndef MED
175 #define MED(a,b,c)  (a+b+c-MAX3(a,b,c)-MIN3(a,b,c))
176 #endif
177 #define ABS(x)                    (((x) > 0) ? (x) : (-(x)))
178 
179 #ifdef  MSOS_TYPE_LINUX
180 #include <assert.h>
181 #else
182 #define assert(b)   \
183     do {    \
184         if (!(b)){  \
185             printf("assert at [%s][%d] \n", __FUNCTION__, __LINE__);   \
186             *((int*)0) = 0; \
187         }   \
188     } while(0)
189 #endif
190 
191 #ifdef ANDROID
192 #include <cutils/log.h>
193 #ifndef LOGE
194 #define printf(format, args...)          ALOGE(format, ##args);
195 #else
196 #define printf(format, args...)          LOGE(format, ##args);
197 #endif
198 #endif
199 
200 #define WIDTH_4K2KTIMING     (3840)
201 #define HEIGHT_4K2KTIMING    (2160)
202 #define OFFSET_4K2KTIMING    (10)
203 
204 //hw 2d to 3d macro
205 #define HW_2DTO3D_DEFAULT_CONCAVE                       0x0006
206 #define HW_2DTO3D_DEFAULT_ARTIFICIALGAIN                0x0000
207 #define HW_2DTO3D_DEFAULT_GAIN                          0x001E
208 #if (HW_2DTO3D_VER >= 4)
209 #define HW_2DTO3D_DEFAULT_OFFSET                        0x0080
210 #else
211 #define HW_2DTO3D_DEFAULT_OFFSET                        0x00FE
212 #endif
213 #define HW_2DTO3D_DEFAULT_ELESEL                        0x0002
214 #define HW_2DTO3D_DEFAULT_MODSEL                        0x0003
215 #define HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH                0x0000
216 
217 //detect nine lattice macro
218 #define DETECTNL_PIXEL_STEP                    16
219 #define DETECTNL_COLORTHRESHOLD                63
220 #define DETECTNL_TRY_TIMES                     4
221 #define DETECTNL_NON_VALUE                     255
222 #define DETECTNL_LINEAR_DIFF                   32
223 #define DETECTNL_COMPUTE_TIME                  0
224 #define DETECTNL_LATTICE_NUM                   9
225 
226 //detect 3d format macro
227 #define DETECT3DFORMAT_DEFAULT_HORSEARCHRANGE           60
228 #define DETECT3DFORMAT_DEFAULT_VERSEARCHRANGE           1
229 #define DETECT3DFORMAT_DEFAULT_GYPIXELTHRESHOLD         14
230 #define DETECT3DFORMAT_DEFAULT_RCRPIXELTHRESHOLD        14
231 #define DETECT3DFORMAT_DEFAULT_BCBPIXELTHRESHOLD        14
232 #define DETECT3DFORMAT_DEFAULT_HORSAMPLECOUNT           8
233 #define DETECT3DFORMAT_DEFAULT_VERSAMPLECOUNT           8
234 #define DETECT3DFORMAT_DEFAULT_MAXCHECKINGFRAMECOUNT    1
235 #define DETECT3DFORMAT_DEFAULT_HITPIXELPERCENTAGE       85
236 #define DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE       06
237 #define DETECT3DFORMAT_DEFAULT_HORPUREPIXEL             10
238 #define DETECT3DFORMAT_DEFAULT_VERPUREPIXEL             10
239 #define DETECT3DFORMAT_DEFAULT_PUREPIXELPERCENTAGE      85
240 
241 #ifndef SUPPORT_SC0_SUB_WIN
242 #define SUPPORT_SC0_SUB_WIN        TRUE
243 #endif
244 #ifndef HW_6TAP_MODE_SUPPORT
245 #define HW_6TAP_MODE_SUPPORT        TRUE
246 #endif
247 
248 #define ENABLE_T3D_DEBUG        FALSE //debug 2Dto3D and auto detect 3D format
249 //--------------------------------------------
250 //--------3D struct define-----------------
251 //--------------------------------------------
252 
253 //--------------------------------------------
254 //--------3D static variables-----------------
255 //--------------------------------------------
256 
257 //----------------------------------------
258 //--------3D internal interface-----------
259 //----------------------------------------
MDrv_SC_3D_Variable_Init(void * pInstance)260 void MDrv_SC_3D_Variable_Init(void *pInstance)
261 {
262     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
263     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
264     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
265     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
266     pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW]   = E_XC_3D_INPUT_MODE_NONE;
267     pXCResourcePrivate->stdrvXC_3D._eInput3DMode[SUB_WINDOW]    = E_XC_3D_INPUT_MODE_NONE;
268     pXCResourcePrivate->stdrvXC_3D._eOutput3DMode               = E_XC_3D_OUTPUT_MODE_NONE;
269     pXCResourcePrivate->stdrvXC_3D._e3DPanelType                = E_XC_3D_PANEL_NONE;
270     pXCResourcePrivate->stdrvXC_3D._b3DMainFirst                = TRUE;
271     pXCResourcePrivate->stdrvXC_3D._u163DHShift = 0;
272     pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[MAIN_WINDOW]   = E_XC_3D_INPUT_MODE_NONE;
273     pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[SUB_WINDOW]    = E_XC_3D_INPUT_MODE_NONE;
274     pXCResourcePrivate->stdrvXC_3D._ePreUsedOutput3DMode               = E_XC_3D_OUTPUT_MODE_NONE;
275     pXCResourcePrivate->stdrvXC_3D._bNeedRestore3DFormat               = FALSE;
276 #if HW_2DTO3D_SUPPORT
277     pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf = 0;
278     pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf = 0;
279     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u32Hw2dTo3dPara_Version = HW2DTO3DPARA_VERSION;
280     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = HW_2DTO3D_DEFAULT_CONCAVE;
281     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = HW_2DTO3D_DEFAULT_ARTIFICIALGAIN;
282     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
283     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = HW_2DTO3D_DEFAULT_OFFSET;
284     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = HW_2DTO3D_DEFAULT_ELESEL;
285     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_MODSEL;
286     pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth = HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH;
287     pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled = FALSE;
288 #endif
289 #if (HW_DESIGN_3D_VER < 2)
290     pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt      = FALSE;
291 #endif
292     pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line = FALSE;
293     pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag = FALSE;
294     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u32Detect3DFormatPara_Version = DETECT3DFORMATPARA_VERSION;
295     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange             = DETECT3DFORMAT_DEFAULT_HORSEARCHRANGE;
296     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange             = DETECT3DFORMAT_DEFAULT_VERSEARCHRANGE;
297     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold           = DETECT3DFORMAT_DEFAULT_GYPIXELTHRESHOLD;
298     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold          = DETECT3DFORMAT_DEFAULT_RCRPIXELTHRESHOLD;
299     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold          = DETECT3DFORMAT_DEFAULT_BCBPIXELTHRESHOLD;
300     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount             = DETECT3DFORMAT_DEFAULT_HORSAMPLECOUNT;
301     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount             = DETECT3DFORMAT_DEFAULT_VERSAMPLECOUNT;
302     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount      = DETECT3DFORMAT_DEFAULT_MAXCHECKINGFRAMECOUNT;
303     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage         = DETECT3DFORMAT_DEFAULT_HITPIXELPERCENTAGE;
304     pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan               = TRUE;
305     pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u32FPInfoPara_Version = XC_3D_FPINFOPARA_VERSION;
306     pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting = FALSE;
307     pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank = 0;
308     pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D    =  TRUE;
309     pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod     =  E_XC_3D_AUTODETECT_HW_COMPATIBLE;
310     if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
311     {
312         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D =  pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
313     }
314     else
315     {
316         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D =  FALSE;
317     }
318 
319     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes       =  E_XC_3D_INPUT_MODE_NONE;
320     pXCResourcePrivate->stdrvXC_3D._bResetFrameCount       =  FALSE;
321     pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount   =  0;
322     pXCResourcePrivate->stdrvXC_3D._bDoubleAlign           = FALSE;
323     pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
324     pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA           = FALSE;
325     pXCResourcePrivate->stdrvXC_3D._u16DDHSize = 0; //DD H size
326     pXCResourcePrivate->stdrvXC_3D._u16DDVSize = 0; //DD V size
327     pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;//FRC 3D input format
328     pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;//FRC 3D output format
329     pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
330     pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
331     pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
332 }
333 
334 // call this function to know whether current 3D status is 48hz required.
335 // if it is 48hz output, we need to adjust the logic of framelock judgement.
MDrv_SC_3D_IsOutputVfreq48hz(void * pInstance,SCALER_WIN eWindow,MS_U16 u16InputVFreq)336 MS_BOOL MDrv_SC_3D_IsOutputVfreq48hz(void *pInstance, SCALER_WIN eWindow, MS_U16 u16InputVFreq)
337 {
338     MS_ASSERT(eWindow < MAX_WINDOW);
339 
340     if(eWindow >= MAX_WINDOW)
341     {
342         return FALSE;
343     }
344     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
345     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
346     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
347     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
348 
349     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "@@ gSrcInfo[eWindow].stCapWin.height=%u, Input Vfreq=%u\n",gSrcInfo[eWindow].stCapWin.height, u16InputVFreq)
350     if(IS_OUTPUT_FRAME_ALTERNATIVE()
351        && (u16InputVFreq >= 230)
352        && (u16InputVFreq <= 245)
353       )
354     {
355         return TRUE;
356     }
357     else
358     {
359         return FALSE;
360     }
361 }
362 
MDrv_SC_3D_AdjustPreVerSrcForFramepacking(void * pInstance,SCALER_WIN eWindow)363 MS_BOOL MDrv_SC_3D_AdjustPreVerSrcForFramepacking(void *pInstance, SCALER_WIN eWindow)
364 {
365     MS_ASSERT(eWindow < MAX_WINDOW);
366     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
367     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
368     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
369     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
370     if(eWindow >= MAX_WINDOW)
371     {
372         return FALSE;
373     }
374 
375 #if (HW_DESIGN_3D_VER >= 2)
376     return FALSE;
377 #else
378     if(IS_INPUT_FRAME_PACKING(eWindow)
379            && IS_OUTPUT_LINE_ALTERNATIVE()
380            && pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt)
381     {
382         return TRUE;
383     }
384     else
385     {
386         return FALSE;
387     }
388 #endif
389 }
390 
MDrv_SC_3D_Is2TapModeSupportedFormat(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)391 MS_BOOL MDrv_SC_3D_Is2TapModeSupportedFormat(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
392 {
393     MS_ASSERT(eWindow < MAX_WINDOW);
394     MS_ASSERT(pSrcInfo);
395     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
396     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
397     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
398     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
399     if(eWindow >= MAX_WINDOW)
400     {
401         return FALSE;
402     }
403 
404     if(pSrcInfo == NULL)
405     {
406         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
407         return FALSE;
408     }
409 
410     //LBL to LBL, TB to LBL, FP to LBL can use 2 tap mode to avoid line buffer limitation
411     //SBS to LBL don't need use 2 tap mode, since it's op only fetch 960 pixel
412     //FI to LBL to and sw 2d to 3d have fclk issue, need prescaling down, so not use 2 tap mode
413     //interlace signal can not use 2 tap mode
414     //if capture.width<=lblength, no need to use 2 tap mode
415     //if have custom v prescaling, can not use 2 tap mode
416 #if (HW_DESIGN_3D_VER >= 2)
417     return  ((((pSrcInfo->stCapWin.width > SCALER_LINE_BUFFER_MAX) // 4K2K or 2560x720 SBS-FULL
418               && (IS_INPUT_SIDE_BY_SIDE_FULL(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
419               && (IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_TOP_BOTTOM()))
420             || ((pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)
421               && (!((pSrcInfo->Status2.u16PreVCusScalingSrc > pSrcInfo->Status2.u16PreVCusScalingDst)))
422               && (((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
423                   || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
424                   || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_TOP_BOTTOM())
425                   || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
426                   || (IS_INPUT_CHECK_BOARD(eWindow))
427                   || (IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
428                   || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
429                   || ((IS_INPUT_FRAME_PACKING(eWindow)
430                         || (IS_INPUT_TOP_BOTTOM(eWindow))
431                         || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
432                         || (IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)))
433                       && (IS_OUTPUT_FRAME_PACKING())))))
434     #if (HW_2LINEMODE_DEINTERLACE_SUPPORT == FALSE)
435               && (!pSrcInfo->bInterlace)
436     #endif
437                 );
438 #else
439     return  ((pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)
440               && (!((pSrcInfo->Status2.u16PreVCusScalingSrc > pSrcInfo->Status2.u16PreVCusScalingDst)))
441               && ((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
442                    || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_TOP_BOTTOM()))
443               && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)
444     #if (HW_2LINEMODE_DEINTERLACE_SUPPORT == FALSE)
445               && (!pSrcInfo->bInterlace)
446     #endif
447                );
448 #endif
449 }
450 
MDrv_SC_3D_Set2TapMode(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)451 MS_BOOL MDrv_SC_3D_Set2TapMode(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
452 {
453     MS_ASSERT(eWindow < MAX_WINDOW);
454     MS_ASSERT(pSrcInfo);
455 
456     if(eWindow >= MAX_WINDOW)
457     {
458         return FALSE;
459     }
460 
461     if(pSrcInfo == NULL)
462     {
463         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
464         return FALSE;
465     }
466     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
467     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
468     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
469     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
470     if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
471     {
472         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(5), BIT(5)); //Enable HD side by side line buffer mode
473 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
474         if(pSrcInfo->bInterlace)
475         {
476             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(5), BIT(5)); //Force DI 2-line mode at sc2lb mode
477         }
478 #endif
479 
480         // When main and sub is start from 0, it means the main&sub win don't need Fill the sub windows line buffer in vertical blanking
481         MDrv_XC_FilLineBuffer(pInstance, FALSE, MAIN_WINDOW);
482 
483         //The starting address of f1 stored at line buffer
484         //Main and Sub window will use the (1920+960) in 2Tap st the same time
485 #ifdef UFO_XC_SUPPORT_3D_DS
486         if(MDrv_XC_Is_SupportSWDS(pInstance))
487         {
488             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
489             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_1D_L,(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF) || ((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
490         }
491         else
492 #endif
493         {
494         //The starting address of f1 stored at line buffer
495         //Main and Sub window will use the (1920+960) in 2Tap st the same time
496         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling, 0x1FFF);
497 
498         //LB offset should be even when 2 tap mode
499         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
500         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
501         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
502     }
503     }
504     else
505     {
506         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Disable HD side by side line buffer mode
507 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
508         if(pSrcInfo->bInterlace)
509         {
510             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
511         }
512 #endif
513     }
514     return TRUE;
515 }
516 
MDrv_SC_3D_PostPQSetting(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)517 MS_BOOL MDrv_SC_3D_PostPQSetting(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
518 {
519     MS_ASSERT(eWindow < MAX_WINDOW);
520     MS_ASSERT(pSrcInfo);
521 
522     if(eWindow >= MAX_WINDOW)
523     {
524         return FALSE;
525     }
526 
527     if(pSrcInfo == NULL)
528     {
529         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
530         return FALSE;
531     }
532 
533     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
534     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
535 
536     if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
537     {
538         //Set SRAM to linear mode
539         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x0303);
540         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_2B_L, 0x0303);
541         //disable snr_vertical vertical c low pass and spike NR
542         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK26_50_L, 0x0000, 0x00FF);
543         //disable v cti
544         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK26_31_L, 0x0000, 0xF000);
545         //disable anti pal
546         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_6A_L, 0x0000, BIT(0));
547         //spf bypass
548         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0C_70_L, BIT(0), BIT(0));
549     }
550     return TRUE;
551 }
552 
MDrv_SC_3D_IsIPMFetchNoLimitCase(void * pInstance,SCALER_WIN eWindow)553 MS_BOOL MDrv_SC_3D_IsIPMFetchNoLimitCase(void *pInstance, SCALER_WIN eWindow)
554 {
555     MS_ASSERT(eWindow < MAX_WINDOW);
556 
557     if(eWindow >= MAX_WINDOW)
558     {
559         return FALSE;
560     }
561 
562 #if (HW_DESIGN_3D_VER >= 2)
563     return FALSE;
564 #else
565     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
566     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
567     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
568     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
569 
570     if((IS_INPUT_FRAME_PACKING(eWindow)
571           && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE))
572        ||
573        IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
574        ||
575        MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, &gSrcInfo[eWindow], eWindow)
576        )
577     {
578         //no any limits
579         return TRUE;
580     }
581     else
582     {
583         return FALSE;
584     }
585 #endif
586 }
587 
MDrv_SC_3D_Adjust_FillLBMode(void * pInstance,SCALER_WIN eWindow)588 void MDrv_SC_3D_Adjust_FillLBMode(void *pInstance, SCALER_WIN eWindow)
589 {
590     MS_ASSERT(eWindow < MAX_WINDOW);
591     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
592     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
593     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
594     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
595     _XC_ENTRY(pInstance);
596 
597 #if (HW_DESIGN_3D_VER >= 2)
598     if(IS_OUTPUT_TOP_BOTTOM()
599        || IS_OUTPUT_SIDE_BY_SIDE_HALF()
600        || IS_OUTPUT_LINE_ALTERNATIVE()
601        || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
602        || IS_OUTPUT_TOP_BOTTOM_HW()
603       )
604     {
605         MDrv_XC_FilLineBuffer(pInstance, TRUE, SUB_WINDOW);
606     }
607     else
608     {
609         MDrv_XC_FilLineBuffer(pInstance, FALSE, SUB_WINDOW);
610     }
611 #else
612     MS_BOOL bEnable = FALSE;
613     if ( IS_OUTPUT_MODE_NONE() )
614     {
615         bEnable = TRUE;  // RD suggestion.
616     }
617     else
618     {
619         if ( (IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_TOP_BOTTOM()
620               || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() || IS_OUTPUT_TOP_BOTTOM_HW())
621             && (pXCResourcePrivate->stdrvXC_3D._b3DMainFirst ^ (eWindow == MAIN_WINDOW))) //only trigger the later one
622             bEnable = TRUE;
623         else
624             bEnable = FALSE;
625     }
626     if (eWindow == SUB_WINDOW)
627     {
628         MDrv_XC_FilLineBuffer(pInstance, bEnable, SUB_WINDOW);
629     }
630 #endif
631     // Designer Jeff.Lin: disable fill line buffer of main_window forever.
632     if (eWindow == MAIN_WINDOW)
633     {
634 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
635         /*sc1 fill main line buffer ahead*/
636         if (Hal_SC_3D_IsDualViewMode(pInstance, eWindow) && (psXCInstPri->u32DeviceID == 1))
637         {
638             MDrv_XC_FilLineBuffer(pInstance, ENABLE, MAIN_WINDOW);
639         }
640         else
641 #endif
642 #if (((HW_DESIGN_4K2K_VER == 7) && (MS_3D_LINE_BFF_MAX == 2048))||((HW_DESIGN_4K2K_VER == 7) && (MS_3D_LINE_BFF_MAX == 960)))
643         //By Jeff.Lin: Kano case can enable fill line buffer of main_window
644         //Because of Kano is not share line PIP 3D mode
645         if(IS_OUTPUT_TOP_BOTTOM()
646            || IS_OUTPUT_SIDE_BY_SIDE_HALF()
647            || IS_OUTPUT_LINE_ALTERNATIVE()
648            || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
649            || IS_OUTPUT_TOP_BOTTOM_HW()
650           )
651         {
652             MDrv_XC_FilLineBuffer(pInstance, ENABLE, MAIN_WINDOW);
653         }
654         else
655 #endif
656 
657         {
658             MDrv_XC_FilLineBuffer(pInstance, DISABLE, MAIN_WINDOW);
659         }
660     }
661 
662     _XC_RETURN(pInstance);
663 }
664 
MDrv_SC_3D_Adjust_PreVLength(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)665 void MDrv_SC_3D_Adjust_PreVLength(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
666                                   XC_InternalStatus *pSrcInfo,
667                                   SCALER_WIN eWindow)
668 {
669     MS_ASSERT(eWindow < MAX_WINDOW);
670     MS_ASSERT(pSrcInfo);
671 
672     if(pSrcInfo == NULL)
673     {
674         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
675         return;
676     }
677 
678     if(eWindow >= MAX_WINDOW)
679     {
680         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
681         return;
682     }
683 
684 #if (HW_DESIGN_3D_VER >= 2)
685     return;
686 #else
687     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVLength(%s): from %u\n", eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16V_Length);
688 
689     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
690     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
691     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
692     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
693     if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
694        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
695        || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
696        || IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow)
697        || IS_INPUT_NORMAL_2D(eWindow)) &&
698        IS_OUTPUT_LINE_ALTERNATIVE())
699     {
700         pSrcInfo->u16V_Length *= 2;
701     }
702     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
703                IS_OUTPUT_TOP_BOTTOM())
704                ||
705                (IS_INPUT_NORMAL_2D(eWindow) &&
706                IS_OUTPUT_TOP_BOTTOM())
707                ||
708                (IS_INPUT_NORMAL_2D_HW(eWindow) &&
709                IS_OUTPUT_TOP_BOTTOM_HW())
710                ||
711                (IS_INPUT_TOP_BOTTOM(eWindow) &&
712                IS_OUTPUT_TOP_BOTTOM())
713                ||
714                (IS_INPUT_TOP_BOTTOM(eWindow) &&
715                IS_OUTPUT_SIDE_BY_SIDE_HALF()))
716     {
717         pSrcInfo->u16V_Length /= 2;
718     }
719     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
720             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
721             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
722             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
723             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
724             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
725             )
726     {
727         MS_U16 u16VactVideo = 0;
728         MS_U16 u16VactSpace = 0;
729         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
730         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
731         {
732             u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
733         }
734         pSrcInfo->u16V_Length = u16VactVideo;
735     }
736     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow))
737             && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
738     {
739         pSrcInfo->u16V_Length /= 2;
740     }
741     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
742                IS_OUTPUT_LINE_ALTERNATIVE())
743     {
744         pSrcInfo->u16V_Length = pSrcInfo->stDispWin.height;
745     }
746     else if ((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow)) &&
747         (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
748     {
749         pSrcInfo->u16V_Length /= 2;
750     }
751     else if (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
752     {
753         pSrcInfo->u16V_Length *= 2;
754     }
755     if((SUB_WINDOW == eWindow)
756        && MDrv_SC_3D_IsUseSameBuffer(pInstance)
757        && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
758            || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
759        )
760     {
761         pSrcInfo->u16V_Length = gSrcInfo[MAIN_WINDOW].u16V_Length;
762     }
763 
764     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVLength(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16V_Length);
765 #endif
766 }
767 
MDrv_SC_3D_Adjust_PreHorDstSize(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)768 void MDrv_SC_3D_Adjust_PreHorDstSize(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
769                                      XC_InternalStatus *pSrcInfo,
770                                      SCALER_WIN eWindow)
771 {
772     MS_ASSERT(eWindow < MAX_WINDOW);
773     MS_ASSERT(pSrcInfo);
774 
775     if(pSrcInfo == NULL)
776     {
777         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
778         return;
779     }
780 
781     if(eWindow >= MAX_WINDOW)
782     {
783         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
784         return;
785     }
786     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
787     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
788     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
789     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
790     pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = FALSE;
791 
792 #if HW_2DTO3D_SUPPORT
793 #define HW_2DTO3DBUFFERSIZE  0x200000
794     MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
795     MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
796     MS_BOOL bOnSameMIU = FALSE;
797     if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
798     {
799         u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
800     }
801 
802     if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
803     {
804         u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
805     }
806 
807 
808     if(((pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
809             && (pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
810             && (pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[eWindow] >= HAL_MIU1_BASE))
811         ||((pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf < HAL_MIU1_BASE)
812             && (pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf < HAL_MIU1_BASE)
813             && (pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[eWindow] < HAL_MIU1_BASE)))
814     {
815         bOnSameMIU = TRUE;
816     }
817     else
818     {
819         bOnSameMIU = FALSE;
820     }
821     if(IS_INPUT_NORMAL_2D_HW(eWindow) //hw 2d to 3d
822        || ((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
823             && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D) //hw auto detect 3d
824        || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
825             && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D) //hw auto detect 3d compatible way with sw method
826        )
827     {
828         if(bOnSameMIU
829             && (((u32HW2DTO3D_DD_Buf >= (MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD))
830                     && (u32HW2DTO3D_DD_Buf < ((MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD) + MDrv_XC_GetDNRBufSize(pInstance, eWindow))))
831                 || ((u32HW2DTO3D_DR_Buf >= (MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD))
832                     && (u32HW2DTO3D_DR_Buf < ((MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD) + MDrv_XC_GetDNRBufSize(pInstance, eWindow)))))
833           )
834         {
835             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "scaler dnr buffer is overflow with hw 2d to 3d buffer\n");
836             //E_MMAP_ID_XC_2DTO3D_DD_BUF_LEN+E_MMAP_ID_XC_2DTO3D_DR_BUF_LEN:max:HW_2DTO3DBUFFERSIZE
837             pXCResourcePrivate->stdrvXC_3D.u32OriginalDNRSize = MDrv_XC_GetDNRBufSize(pInstance, eWindow);
838             MDrv_XC_SetDNRBufSize(pInstance, MDrv_XC_GetDNRBufSize(pInstance, eWindow) - HW_2DTO3DBUFFERSIZE, eWindow);
839             pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize = TRUE;
840         }
841         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, eWindow,
842                                                            2,
843                                                            pSrcInfo->u16V_SizeAfterPreScaling);
844 
845         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
846         {
847             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
848         }
849     }
850     else if(pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize
851             && ((MDrv_XC_GetDNRBufSize(pInstance, eWindow) + HW_2DTO3DBUFFERSIZE) <= pXCResourcePrivate->stdrvXC_3D.u32OriginalDNRSize))
852     {
853         MDrv_XC_SetDNRBufSize(pInstance, MDrv_XC_GetDNRBufSize(pInstance, eWindow) + HW_2DTO3DBUFFERSIZE, eWindow);
854         pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize = FALSE;
855     }
856 
857     if(IS_INPUT_NORMAL_2D_HW(eWindow)
858        && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200))
859     {
860         if(pSrcInfo->u16H_SizeAfterPreScaling > 1100)
861         {
862             pSrcInfo->u16H_SizeAfterPreScaling = 1100;
863         }
864         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
865                                                        2,
866                                                        pSrcInfo->u16V_SizeAfterPreScaling);
867         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
868         {
869             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
870         }
871     }
872 #endif
873 
874 #if (HW_DESIGN_3D_VER == 4)
875     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PreHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
876     return;
877 #elif (HW_DESIGN_3D_VER >= 2)
878     if(eWindow == MAIN_WINDOW)
879     {
880         if (pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX)
881             pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX;
882     }
883     else
884     {
885         // sub window
886         if(PIP_SUPPORTED)
887         {
888             if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
889             {
890                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[PRE] SUB LINE BFF LIMIT : HSrc=%u, HDst=%lu\n",pSrcInfo->u16H_SizeAfterPreScaling, SUB_MST_LINE_BFF_MAX);
891                 pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
892             }
893             // Avoid Post HSD in PIP/POP case
894             if(pSrcInfo->u16H_SizeAfterPreScaling >= pSrcInfo->stDispWin.width)
895             {
896                 #if FRC_INSIDE
897                 if( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC) &&
898                     ((pSrcInfo->stCropWin.x != 0) || (pSrcInfo->stCropWin.width != pSrcInfo->stCapWin.width)))
899                 {
900                     // Consider Crop case, the post HSD clk is not enough for FRC enable case
901                     pSrcInfo->u16H_SizeAfterPreScaling  = ((pSrcInfo->stCapWin.width*pSrcInfo->stDispWin.width)+(pSrcInfo->stCropWin.width/2))/pSrcInfo->stCropWin.width;
902                 }
903                 else
904                 #endif
905                 {
906                     pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
907                 }
908                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"To avoid Post HSD, HDst=%u\n",pSrcInfo->u16H_SizeAfterPreScaling);
909             }
910         }
911     }
912     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PreHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
913     return;
914 #else
915 
916     //need do prescaling for 3D case especially when pip use same memory
917     if(!(IS_INPUT_MODE_NONE(eWindow) && IS_OUTPUT_MODE_NONE()))
918     {
919         if(pSrcInfo->u16H_SizeAfterPreScaling > pSrcInfo->stDispWin.width)
920         {
921             pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
922         }
923     }
924 
925     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreHorDstSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
926 
927     if(IS_INPUT_FRAME_PACKING(eWindow) &&
928         IS_OUTPUT_FRAME_ALTERNATIVE())
929     {
930         if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200)
931            && ((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
932                || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
933         {
934             if(pSrcInfo->u16H_SizeAfterPreScaling > 900)
935             {
936                 pSrcInfo->u16H_SizeAfterPreScaling = 900;
937             }
938         }
939 
940         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
941                                                        2,
942                                                        pSrcInfo->u16V_SizeAfterPreScaling);
943         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
944         {
945             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
946         }
947     }
948     else if(((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow)
949             || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_FRAME_PACKING(eWindow)
950             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
951             && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
952             || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
953             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
954             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
955             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
956             )
957     {
958         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
959                                                        4 /* 4 frame mode */,
960                                                        pSrcInfo->u16V_SizeAfterPreScaling);
961 
962         if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
963         {
964             //do more prescaling down for fclk issue
965             MS_U16 u16Temp = 0;
966             if(MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)) //output line by line
967             {
968                 u16Temp = 1300;
969             }
970             else
971             {
972                 u16Temp = 720;
973             }
974             pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > u16Temp ?
975                     (u16Temp & ~(OFFSET_PIXEL_ALIGNMENT -1)) : pSrcInfo->u16H_SizeAfterPreScaling;
976         }
977 
978         // for memory reason, need support 4 frame mode
979         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
980         {
981             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
982         }
983     }
984     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
985     {
986         //for best quality of side by side in, side by side out
987         pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
988     }
989 
990     if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
991        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
992        IS_OUTPUT_LINE_ALTERNATIVE())
993        ||
994        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
995        IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
996        ||
997        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
998        IS_OUTPUT_TOP_BOTTOM())
999        ||
1000 #if (HW_DESIGN_3D_VER < 1)
1001        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1002        IS_OUTPUT_FRAME_ALTERNATIVE())
1003        ||
1004 #endif
1005        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1006        IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1007        ||
1008        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1009        ||
1010        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1011        (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
1012        ||
1013        (IS_INPUT_FRAME_PACKING(eWindow) &&
1014        IS_OUTPUT_FRAME_ALTERNATIVE())
1015        ||
1016        (IS_INPUT_FRAME_PACKING(eWindow) &&
1017        IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1018        ||
1019        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) &&
1020        IS_OUTPUT_LINE_ALTERNATIVE())
1021        )
1022     {
1023         MS_U16 u16AlignedWidth = (pSrcInfo->u16H_SizeAfterPreScaling) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
1024         pSrcInfo->u16H_SizeAfterPreScaling = u16AlignedWidth;
1025         pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = TRUE;
1026     }
1027 
1028     if(MDrv_SC_3D_IsIPMFetchNoLimitCase(pInstance, eWindow))
1029     {
1030     }
1031     else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1032             || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1033     {
1034         // line buffer check
1035         if (pSrcInfo->u16H_SizeAfterPreScaling > MS_3D_LINE_BFF_MAX)
1036         {
1037             pSrcInfo->u16H_SizeAfterPreScaling = MS_3D_LINE_BFF_MAX;
1038         }
1039     }
1040     else
1041     {
1042         // line buffer check
1043         if(eWindow == MAIN_WINDOW)
1044         {
1045             if (pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX)
1046                 pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX;
1047         }
1048         else
1049         {
1050             // sub window
1051             if(PIP_SUPPORTED)
1052             {
1053                 if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
1054                     pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
1055             }
1056             // Avoid Post HSD in PIP/POP case
1057             if(pSrcInfo->u16H_SizeAfterPreScaling >= pSrcInfo->stDispWin.width)
1058             {
1059                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[PRE] To avoid HSD : HSrc=%u, HDst=%u\n",pSrcInfo->u16H_SizeAfterPreScaling, pSrcInfo->stDispWin.width);
1060                 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
1061             }
1062         }
1063     }
1064 
1065     if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1066        || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1067        || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
1068        || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
1069        )
1070     {
1071         if(IS_INPUT_FRAME_PACKING(eWindow)
1072            && IS_OUTPUT_TOP_BOTTOM()
1073            && ((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
1074                || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
1075         {
1076             //do more prescaling down to fclk issue for 1080p fp:the following formula is from experiment
1077             MS_U16 u16TempWidth = 0;
1078             if(MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)) //output line by line
1079             {
1080                 u16TempWidth = 1920 * (MS_U32)pSrcInfo->stDispWin.height * 13 / 10800;
1081             }
1082             else
1083             {
1084                 u16TempWidth = 640;
1085             }
1086             pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > u16TempWidth ?
1087                     u16TempWidth : pSrcInfo->u16H_SizeAfterPreScaling;
1088         }
1089         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1090                                                        2,
1091                                                        pSrcInfo->u16V_SizeAfterPreScaling);
1092         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1093         {
1094             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1095         }
1096     }
1097 #if (HW_DESIGN_3D_VER == 0)
1098     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1099     {
1100         if(pSrcInfo->stCapWin.width > MST_LINE_BFF_MAX / 2)
1101         {
1102             pSrcInfo->u16H_SizeAfterPreScaling = (MST_LINE_BFF_MAX / 2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
1103         }
1104         else
1105         {
1106             pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width & ~(OFFSET_PIXEL_ALIGNMENT - 1);
1107         }
1108     }
1109 #endif
1110     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1111     {
1112         MS_U32 u32TempWidth;
1113         pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
1114         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1115                                                 4,
1116                                                 pSrcInfo->u16V_SizeAfterPreScaling);
1117         // for memory reason, need support 4 frame mode
1118         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1119         {
1120             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth;
1121         }
1122 #if (HW_DESIGN_3D_VER == 0)
1123         if(pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX / 2)
1124         {
1125             pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX / 2;
1126         }
1127 #endif
1128         pSrcInfo->u16H_SizeAfterPreScaling &= ~(OFFSET_PIXEL_ALIGNMENT - 1);
1129     }
1130     else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1131              || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1132     {
1133         MS_U32 u32TempWidth;
1134         pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
1135         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1136                                                 2,
1137                                                 pSrcInfo->u16V_SizeAfterPreScaling);
1138         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1139         {
1140             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth;
1141         }
1142 
1143         if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
1144         {
1145             pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
1146         }
1147 
1148         pSrcInfo->u16H_SizeAfterPreScaling &= ~(OFFSET_PIXEL_ALIGNMENT - 1);
1149     }
1150     else if(IS_INPUT_FRAME_PACKING(eWindow)
1151             && IS_OUTPUT_LINE_ALTERNATIVE())
1152     {
1153         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1154                                                        2,
1155                                                        pSrcInfo->u16V_SizeAfterPreScaling);
1156         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1157         {
1158             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1159         }
1160     }
1161 #if (HW_DESIGN_3D_VER == 1)
1162   else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1163             IS_OUTPUT_FRAME_ALTERNATIVE())
1164     {
1165         MS_U16 u16AlignedWidth = (pSrcInfo->stCapWin.width) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
1166         pSrcInfo->u16H_SizeAfterPreScaling = u16AlignedWidth;
1167         pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = TRUE;
1168     }
1169     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1170     {
1171         if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200)
1172            && (pSrcInfo->u16H_SizeAfterPreScaling > 900))
1173         {
1174             pSrcInfo->u16H_SizeAfterPreScaling = 900;
1175         }
1176         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1177                                                        4 /* 4 frame mode */,
1178                                                        pSrcInfo->u16V_SizeAfterPreScaling);
1179         // for memory reason, need support 4 frame mode
1180         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1181         {
1182             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1183         }
1184     }
1185     else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()
1186             && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200))
1187     {
1188         pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > 1200 ? 1200 : pSrcInfo->u16H_SizeAfterPreScaling;
1189     }
1190 #endif
1191 
1192 #if ENABLE_2_FRAME_SIZE_PROTECTION
1193     //do a rough check after all, for 2 frame case.
1194     //if it's 4 or other frame case, need detail check in the upper code.
1195     {
1196         MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1197                                                        2,
1198                                                        pSrcInfo->u16V_SizeAfterPreScaling);
1199         if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1200         {
1201             pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1202         }
1203     }
1204 #endif
1205 
1206     if((SUB_WINDOW == eWindow)
1207        && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1208            || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1209        )
1210     {
1211         pSrcInfo->u16H_SizeAfterPreScaling = gSrcInfo[MAIN_WINDOW].u16H_SizeAfterPreScaling;
1212     }
1213 
1214     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreHorDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1215 #endif
1216 }
1217 
MDrv_SC_3D_IsDoubleAlign(void * pInstance)1218 MS_BOOL MDrv_SC_3D_IsDoubleAlign(void *pInstance)
1219 {
1220     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1221     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1222     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1223     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1224     return pXCResourcePrivate->stdrvXC_3D._bDoubleAlign;
1225 }
1226 
MDrv_SC_3D_Adjust_SubLineBufferOffset(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)1227 void MDrv_SC_3D_Adjust_SubLineBufferOffset(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
1228                                            XC_InternalStatus *pSrcInfo,
1229                                            SCALER_WIN eWindow)
1230 {
1231     MS_ASSERT(eWindow < MAX_WINDOW);
1232     MS_ASSERT(pSrcInfo);
1233 
1234 #if (HW_DESIGN_3D_VER >= 2)
1235     return;
1236 #else
1237     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1238     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1239     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1240     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1241     //Setting Line Buffer Start offset for Sub Win
1242     if((eWindow == SUB_WINDOW)
1243         && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1244             || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1245        )
1246     {
1247         // we can extend sub window line buffer by setting this register
1248         HAL_SC_SetSubLineBufferOffset(pInstance, MS_3D_LINE_BFF_MAX);
1249     }
1250 #endif
1251 }
1252 
MDrv_SC_3D_Adjust_PreVerDstSize(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleDst,SCALER_WIN eWindow)1253 MS_U16 MDrv_SC_3D_Adjust_PreVerDstSize(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
1254                                        XC_InternalStatus *pSrcInfo,
1255                                        MS_U16 u16ScaleDst,
1256                                        SCALER_WIN eWindow)
1257 {
1258     MS_U16 u16ScaleDstOriginal = u16ScaleDst;
1259     MS_ASSERT(eWindow < MAX_WINDOW);
1260     MS_ASSERT(pSrcInfo);
1261 
1262     if(pSrcInfo == NULL)
1263     {
1264         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1265         return u16ScaleDstOriginal;
1266     }
1267 
1268     if(eWindow >= MAX_WINDOW)
1269     {
1270         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1271         return u16ScaleDstOriginal;
1272     }
1273 #if (HW_DESIGN_3D_VER >= 2)
1274     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"MDrv_SC_3D_Adjust_PreVerDstSize(%s)= %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDstOriginal)
1275     return u16ScaleDstOriginal;
1276 #else
1277     MS_U16 u16ScaleSrc;
1278     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1279     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1280     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1281     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1282     u16ScaleSrc = pSrcInfo->stCapWin.height;
1283     u16ScaleDst = pSrcInfo->stDispWin.height;
1284 
1285     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVerSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1286 
1287     if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1288          || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1289          || IS_INPUT_NORMAL_2D(eWindow)
1290          || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
1291             IS_OUTPUT_LINE_ALTERNATIVE())
1292     {
1293         if(u16ScaleSrc >= u16ScaleDst/2)
1294         {
1295              u16ScaleDst = u16ScaleDst/2;
1296              XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: source V size is bigger than u16ScaleDst/2(%u)\n",u16ScaleDst);
1297         }
1298         else
1299         {
1300             u16ScaleDst = u16ScaleSrc;
1301              XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: source V size is smaller than u16ScaleDst/2(%u)\n",u16ScaleDst);
1302         }
1303     }
1304     else if((IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1305             || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && pSrcInfo->bInterlace)
1306             || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
1307     {
1308         if (u16ScaleSrc > u16ScaleDst)
1309         {
1310             u16ScaleDst = u16ScaleDst;
1311         }
1312         else
1313         {
1314             u16ScaleDst = u16ScaleSrc;
1315         }
1316     }
1317     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1318     {
1319         u16ScaleDst = u16ScaleSrc;
1320     }
1321     else if(IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1322     {
1323         //do noting, just not follow into statement:else
1324     }
1325     else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1326             (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1327             ||
1328             (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1329             )
1330     {
1331         u16ScaleDst = u16ScaleSrc;
1332     }
1333     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1334             (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))//only for T8 new reg method
1335     {
1336         u16ScaleDst = u16ScaleSrc;
1337     }
1338     else if(IS_INPUT_FRAME_PACKING(eWindow) &&
1339             (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1340     {
1341         u16ScaleDst = u16ScaleSrc;
1342     }
1343     else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1344     {
1345         u16ScaleDst = u16ScaleSrc;
1346     }
1347     else if(IS_INPUT_FRAME_PACKING(eWindow)
1348             && IS_OUTPUT_LINE_ALTERNATIVE())
1349     {
1350         if((u16ScaleSrc == DOUBLEHD_720X2P_VSIZE) //720 centering opt
1351            && (pSrcInfo->stDispWin.height == DOUBLEHD_720X2P_FRAME_VSIZE))
1352         {
1353             u16ScaleDst = 735;
1354         }
1355         else
1356         {
1357             // we can merge 1080p and 720p frame packing, since
1358             // 1080(one frame size)/45(garbage band) = 720(one frame size)/30(garbage band)
1359             MS_U16 u16Temp = DOUBLEHD_1080X2P_GARBAGE_VSIZE * u16ScaleDst / 2;
1360             // if can not mod, need take more 1 lines to do opt
1361             if(u16Temp % DOUBLEHD_1080X2P_FRAME_VSIZE)
1362             {
1363                 pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt = TRUE;
1364                 u16Temp = u16Temp / DOUBLEHD_1080X2P_FRAME_VSIZE + 1;
1365             }
1366             else
1367             {
1368                 pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt = FALSE;
1369                 u16Temp = u16Temp / DOUBLEHD_1080X2P_FRAME_VSIZE;
1370             }
1371             u16ScaleDst = u16ScaleDst + u16Temp;
1372         }
1373         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: frame packing, V down to %u\n",u16ScaleDst);
1374     }
1375     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1376        (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE()))
1377        ||
1378        (IS_INPUT_TOP_BOTTOM(eWindow) &&
1379        IS_OUTPUT_TOP_BOTTOM())
1380        ||
1381        (IS_INPUT_TOP_BOTTOM(eWindow) &&
1382        IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1383     {
1384         u16ScaleDst = u16ScaleSrc;
1385     }
1386     else if (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1387             IS_OUTPUT_FRAME_L())
1388     {
1389         u16ScaleDst = u16ScaleSrc;
1390     }
1391     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1392             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1393     {
1394         u16ScaleDst = u16ScaleSrc;
1395     }
1396     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1397          IS_OUTPUT_TOP_BOTTOM())
1398     {
1399         u16ScaleDst = u16ScaleSrc;
1400     }
1401     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
1402             (IS_OUTPUT_TOP_BOTTOM()
1403              || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1404              || IS_OUTPUT_LINE_ALTERNATIVE()))
1405     {
1406         u16ScaleDst = u16ScaleSrc;
1407     }
1408     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() )
1409     {
1410         u16ScaleDst = pSrcInfo->stDispWin.height / 2;
1411     }
1412     else if (IS_INPUT_FRAME_PACKING(eWindow) &&
1413             (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1414     {
1415         u16ScaleDst = u16ScaleSrc;
1416     }
1417     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1418     {
1419         u16ScaleDst = u16ScaleSrc;
1420     }
1421     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1422     {
1423         //output line by line case or small video
1424         if((u16ScaleSrc < pSrcInfo->stDispWin.height) || MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))
1425         {
1426             u16ScaleDst = u16ScaleSrc;
1427         }
1428         else
1429         {
1430             u16ScaleDst = pSrcInfo->stDispWin.height;
1431         }
1432     }
1433     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1434     {
1435         u16ScaleDst = u16ScaleDst / 2;
1436     }
1437     else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1438              || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1439     {
1440         u16ScaleDst = u16ScaleSrc;
1441     }
1442     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1443             IS_OUTPUT_SIDE_BY_SIDE_HALF())
1444     {
1445         u16ScaleDst = u16ScaleSrc;
1446     }
1447     else if((IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1448             || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
1449     {
1450         if(u16ScaleSrc < pSrcInfo->stDispWin.height)
1451         {
1452             u16ScaleDst = u16ScaleSrc;
1453         }
1454         else
1455         {
1456             u16ScaleDst = pSrcInfo->stDispWin.height;
1457         }
1458     }
1459     else
1460     {
1461         u16ScaleDst = u16ScaleDstOriginal;
1462     }
1463 
1464     if((SUB_WINDOW == eWindow)
1465        && MDrv_SC_3D_IsUseSameBuffer(pInstance)
1466        && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1467            || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1468        )
1469     {
1470         pSrcInfo->u16V_SizeAfterPreScaling = gSrcInfo[MAIN_WINDOW].u16V_SizeAfterPreScaling;
1471         u16ScaleDst = gSrcInfo[MAIN_WINDOW].u16V_SizeAfterPreScaling;
1472     }
1473 
1474     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVerDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1475     return u16ScaleDst;
1476 #endif
1477 }
1478 
MDrv_SC_3D_Adjust_PostHorSrcSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleSrc,SCALER_WIN eWindow)1479 MS_U16 MDrv_SC_3D_Adjust_PostHorSrcSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1480                                         MS_U16 u16ScaleSrc,
1481                                         SCALER_WIN eWindow)
1482 {
1483     MS_ASSERT(eWindow < MAX_WINDOW);
1484     MS_ASSERT(pSrcInfo);
1485 
1486     if(pSrcInfo == NULL)
1487     {
1488         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1489         return u16ScaleSrc;
1490     }
1491 
1492     if(eWindow >= MAX_WINDOW)
1493     {
1494         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1495         return u16ScaleSrc;
1496     }
1497     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1498     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1499     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1500     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1501 #if (HW_DESIGN_3D_VER >= 2)
1502 
1503     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PostHorSrcSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1504     return u16ScaleSrc;
1505 #else
1506     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1507     if((((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1508        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
1509        IS_OUTPUT_LINE_ALTERNATIVE())
1510        ||
1511        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1512        IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1513        ||
1514        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1515        IS_OUTPUT_TOP_BOTTOM())
1516        ||
1517        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1518        (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1519        ||
1520        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1521         )
1522     {
1523         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1524     }
1525     else if (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1526         (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1527     {
1528         u16ScaleSrc = u16ScaleSrc/2;
1529     }
1530 #if (HW_DESIGN_3D_VER == 0)
1531     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
1532             && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1533     {
1534         u16ScaleSrc = u16ScaleSrc*2;
1535     }
1536     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1537     {
1538         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width * 2;
1539     }
1540 #endif
1541     else if((IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1542          ||(IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1543          ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1544          ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1545          ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
1546     {
1547         gSrcInfo[eWindow].ScaledCropWin.width -= pXCResourcePrivate->stdrvXC_3D._u163DHShift;
1548         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width;
1549     }
1550     else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1551              || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1552     {
1553         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width * 2;
1554     }
1555     else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1556     {
1557         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1558     }
1559     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && pSrcInfo->bInterlace)
1560     {
1561         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1562     }
1563 
1564     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorSrcSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1565 
1566     return u16ScaleSrc;
1567 #endif
1568 }
1569 
MDrv_SC_3D_Adjust_PostHorDstSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleDst,SCALER_WIN eWindow)1570 MS_U16 MDrv_SC_3D_Adjust_PostHorDstSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1571                                         MS_U16 u16ScaleDst,
1572                                         SCALER_WIN eWindow)
1573 {
1574     MS_ASSERT(eWindow < MAX_WINDOW);
1575     MS_ASSERT(pSrcInfo);
1576 
1577     if(pSrcInfo == NULL)
1578     {
1579         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1580         return u16ScaleDst;
1581     }
1582 
1583     if(eWindow >= MAX_WINDOW)
1584     {
1585         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1586         return u16ScaleDst;
1587     }
1588     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1589     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1590     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1591     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1592 
1593 #if (HW_DESIGN_3D_VER >= 2)
1594     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PostHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1595     return u16ScaleDst;
1596 #else
1597 
1598     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorDstSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1599     if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
1600        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
1601        IS_OUTPUT_LINE_ALTERNATIVE())
1602        ||
1603        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1604        IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1605        ||
1606        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1607        IS_OUTPUT_TOP_BOTTOM())
1608        ||
1609        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1610        (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1611        ||
1612        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1613        ||
1614        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1615         )
1616     {
1617         if (u16ScaleDst > pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width)
1618         {
1619             u16ScaleDst = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
1620         }
1621     }
1622     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1623 
1624     return u16ScaleDst;
1625 #endif
1626 }
1627 
MDrv_SC_3D_Adjust_PostVerSrcSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleSrc,SCALER_WIN eWindow)1628 MS_U16 MDrv_SC_3D_Adjust_PostVerSrcSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1629                                         MS_U16 u16ScaleSrc,
1630                                         SCALER_WIN eWindow)
1631 {
1632     MS_ASSERT(eWindow < MAX_WINDOW);
1633     MS_ASSERT(pSrcInfo);
1634 
1635     if(pSrcInfo == NULL)
1636     {
1637         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1638         return u16ScaleSrc;
1639     }
1640 
1641     if(eWindow >= MAX_WINDOW)
1642     {
1643         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1644         return u16ScaleSrc;
1645     }
1646 
1647     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1648     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1649 
1650     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1651     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1652 #if (HW_DESIGN_3D_VER >= 2)
1653     return u16ScaleSrc;
1654 #else
1655     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostVerSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1656     if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1657        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1658        || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
1659        || IS_INPUT_NORMAL_2D(eWindow)) &&
1660        IS_OUTPUT_LINE_ALTERNATIVE())
1661     {
1662         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height * 2;
1663     }
1664     else if(IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1665     {
1666         u16ScaleSrc = pSrcInfo->stDispWin.height - gSrcInfo[eWindow].ScaledCropWin.y*2;
1667     }
1668     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1669                IS_OUTPUT_TOP_BOTTOM())
1670                ||
1671                (IS_INPUT_TOP_BOTTOM(eWindow) &&
1672                IS_OUTPUT_TOP_BOTTOM())
1673                ||
1674                (IS_INPUT_TOP_BOTTOM(eWindow) &&
1675                IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1676     {
1677         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height/2;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1678     }
1679     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1680                IS_OUTPUT_FRAME_L())
1681     {
1682         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height/2;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1683     }
1684     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1685             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1686             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1687             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1688             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
1689             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
1690            )
1691     {
1692         MS_U16 u16VactVideo = 0;
1693         MS_U16 u16VactSpace = 0;
1694         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
1695         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
1696         {
1697             u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
1698         }
1699         u16ScaleSrc = (gSrcInfo[eWindow].ScaledCropWin.height-u16VactSpace)/2;
1700     }
1701     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1702             || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
1703     {
1704         u16ScaleSrc = u16ScaleSrc/2;
1705     }
1706     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1707                IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1708     {
1709         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1710     }
1711     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1712                IS_OUTPUT_TOP_BOTTOM())
1713     {
1714         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1715     }
1716     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1717                   IS_OUTPUT_TOP_BOTTOM())
1718     {
1719         u16ScaleSrc = pSrcInfo->ScaledCropWin.height;
1720     }
1721     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
1722              (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1723     {
1724         u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height / 2;
1725     }
1726     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1727     {
1728         u16ScaleSrc = pSrcInfo->stDispWin.height - gSrcInfo[eWindow].ScaledCropWin.y*2;
1729     }
1730     else if (IS_INPUT_TOP_BOTTOM(eWindow) &&
1731         (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1732     {
1733         u16ScaleSrc = u16ScaleSrc/2;
1734     }
1735     else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow))
1736             && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1737     {
1738         u16ScaleSrc = u16ScaleSrc/2;
1739     }
1740     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
1741             && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1742     {
1743         u16ScaleSrc = u16ScaleSrc/2;
1744     }
1745     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1746     {
1747         u16ScaleSrc = pSrcInfo->stDispWin.height;
1748     }
1749     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostVerSrcSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1750 
1751     return u16ScaleSrc;
1752 #endif
1753 }
1754 
MDrv_SC_3D_Adjust_PostVLength(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)1755 void MDrv_SC_3D_Adjust_PostVLength(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
1756 {
1757     MS_ASSERT(eWindow < MAX_WINDOW);
1758     MS_ASSERT(pSrcInfo);
1759 
1760     if(pSrcInfo == NULL)
1761     {
1762         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1763         return;
1764     }
1765 
1766     if(eWindow >= MAX_WINDOW)
1767     {
1768         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1769         return;
1770     }
1771     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1772     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1773     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1774     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1775 #if (HW_DESIGN_3D_VER >= 2)
1776     return;
1777 #else
1778     if(IS_INPUT_FRAME_PACKING(eWindow)
1779        && IS_OUTPUT_LINE_ALTERNATIVE()
1780        && pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt)
1781     {
1782         pSrcInfo->u16V_Length -= 2; //to handle odd garbage line scaling
1783     }
1784 #endif
1785 }
1786 
MDrv_SC_3D_Adjust_FrameNum(void * pInstance,XC_FRAME_STORE_NUMBER u8FBNumType,SCALER_WIN eWindow)1787 XC_FRAME_STORE_NUMBER MDrv_SC_3D_Adjust_FrameNum(void *pInstance, XC_FRAME_STORE_NUMBER u8FBNumType,
1788                                        SCALER_WIN eWindow)
1789 {
1790     MS_ASSERT(eWindow < MAX_WINDOW);
1791 
1792     if(eWindow >= MAX_WINDOW)
1793     {
1794         return u8FBNumType;
1795     }
1796     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1797     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1798     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1799     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1800 #if (HW_DESIGN_3D_VER == 2)
1801     if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && (!gSrcInfo[eWindow].bInterlace))||
1802     (IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
1803     {
1804         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1805         {
1806             u8FBNumType = IMAGE_STORE_5_FRAMES;
1807         }
1808         else
1809         {
1810             u8FBNumType = IMAGE_STORE_4_FRAMES;
1811         }
1812     }
1813     return u8FBNumType;
1814 #elif (HW_DESIGN_3D_VER > 2)
1815     if(IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
1816     {
1817         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1818         {
1819             u8FBNumType = IMAGE_STORE_5_FRAMES;
1820         }
1821         else
1822         {
1823             u8FBNumType = IMAGE_STORE_4_FRAMES;
1824         }
1825     }
1826 #ifdef TBP_1920X2160_OUTPUT
1827     else if((!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
1828             &&(gSrcInfo[MAIN_WINDOW].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
1829             &&(MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW) == E_XC_3D_INPUT_FRAME_PACKING)
1830             &&(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM))
1831     {
1832         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1833         {
1834             u8FBNumType = IMAGE_STORE_5_FRAMES;
1835         }
1836         else
1837         {
1838             u8FBNumType = IMAGE_STORE_4_FRAMES;
1839         }
1840     }
1841 #endif
1842     return u8FBNumType;
1843 #else
1844     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_Mdrv_SC_3D_Adjust_FBNum(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u8FBNumType);
1845     if(
1846 #if (HW_DESIGN_3D_VER == 0)
1847         ((IS_INPUT_TOP_BOTTOM(eWindow) ||
1848         (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!gSrcInfo[eWindow].bInterlace)) ||
1849         IS_INPUT_FRAME_PACKING(eWindow) ) &&
1850           IS_OUTPUT_LINE_ALTERNATIVE())
1851         ||
1852        (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1853         (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE()))
1854         ||
1855        (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1856         IS_OUTPUT_FRAME_L())
1857         ||
1858        (IS_INPUT_FRAME_PACKING(eWindow) &&
1859         IS_OUTPUT_TOP_BOTTOM())
1860         ||
1861        (IS_INPUT_FRAME_PACKING(eWindow) &&
1862         IS_OUTPUT_SIDE_BY_SIDE_HALF())
1863         ||
1864        (IS_INPUT_FRAME_PACKING(eWindow) &&
1865         IS_OUTPUT_FRAME_ALTERNATIVE())
1866         ||
1867        (IS_INPUT_FRAME_PACKING(eWindow) &&
1868         IS_OUTPUT_FRAME_L())
1869         ||
1870        (IS_INPUT_FRAME_PACKING(eWindow) &&
1871         IS_OUTPUT_FRAME_R())
1872         ||
1873        (IS_INPUT_TOP_BOTTOM(eWindow) &&
1874         IS_OUTPUT_TOP_BOTTOM())
1875         ||
1876        (IS_INPUT_TOP_BOTTOM(eWindow) &&
1877         IS_OUTPUT_SIDE_BY_SIDE_HALF())
1878         ||
1879        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1880         IS_OUTPUT_FRAME_ALTERNATIVE())
1881         ||
1882        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1883        IS_OUTPUT_SIDE_BY_SIDE_HALF())
1884         ||
1885        (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1886        IS_OUTPUT_TOP_BOTTOM())
1887        ||
1888        (IS_INPUT_FRAME_PACKING_OPT(eWindow) &&
1889        IS_OUTPUT_TOP_BOTTOM())
1890        ||
1891        (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) &&
1892        IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())// 2 frames = 4 fields
1893        ||
1894        (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) &&
1895        IS_OUTPUT_LINE_ALTERNATIVE())// 2 frames = 4 fields
1896        ||
1897        (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) &&
1898        IS_OUTPUT_LINE_ALTERNATIVE())// 2 frames = 4 fields
1899        ||
1900        (IS_INPUT_FRAME_PACKING_OPT(eWindow) &&
1901        IS_OUTPUT_SIDE_BY_SIDE_HALF())
1902        ||
1903        (IS_INPUT_TOP_BOTTOM_OPT(eWindow) &&
1904        IS_OUTPUT_SIDE_BY_SIDE_HALF())
1905        ||
1906        (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1907        ||
1908 #endif
1909        (IS_INPUT_FRAME_PACKING(eWindow)
1910         && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
1911         ||
1912         (IS_OUTPUT_FRAME_ALTERNATIVE() && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
1913        )
1914     {
1915         u8FBNumType = IMAGE_STORE_2_FRAMES;
1916     }
1917     else if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && (IS_OUTPUT_TOP_BOTTOM()|| IS_OUTPUT_LINE_ALTERNATIVE()))
1918             || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1919             || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1920             || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1921             || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1922             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1923             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
1924             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
1925             || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1926             || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1927     {
1928         u8FBNumType = IMAGE_STORE_4_FRAMES;
1929     }
1930 
1931     if((!IS_INPUT_MODE_NONE(eWindow)) && (SUB_WINDOW == eWindow))
1932     {
1933         u8FBNumType = gSrcInfo[MAIN_WINDOW].Status2.eFrameStoreNumber;
1934         gSrcInfo[eWindow].bLinearMode = gSrcInfo[MAIN_WINDOW].bLinearMode;
1935     }
1936 
1937     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_Mdrv_SC_3D_Adjust_FBNum(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u8FBNumType);
1938 
1939     return u8FBNumType;
1940 #endif
1941 }
1942 
MDrv_SC_3D_Adjust_DNRBase(void * pInstance,MS_PHY * pu32DNRBase0,MS_PHY * pu32DNRBase1,SCALER_WIN eWindow)1943 void MDrv_SC_3D_Adjust_DNRBase(void *pInstance, MS_PHY *pu32DNRBase0,
1944                                MS_PHY *pu32DNRBase1,
1945                                SCALER_WIN eWindow)
1946 {
1947     MS_ASSERT(eWindow < MAX_WINDOW);
1948     MS_ASSERT(pu32DNRBase0);
1949     MS_ASSERT(pu32DNRBase1);
1950 
1951     if(eWindow >= MAX_WINDOW)
1952     {
1953         return;
1954     }
1955 
1956     if(pu32DNRBase0 == NULL)
1957     {
1958         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:pu32DNRBase0 is NULL\n");
1959         return;
1960     }
1961 
1962     if(pu32DNRBase1 == NULL)
1963     {
1964         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:pu32DNRBase1 is NULL\n");
1965         return;
1966     }
1967 
1968 #if (HW_DESIGN_3D_VER >= 2)
1969     return;
1970 #else
1971     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1972     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1973     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1974     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1975 
1976     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_DNRBase(%s): from pu32DNRBase0:0x%lx, pu32DNRBase1:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32DNRBase0,*pu32DNRBase1);
1977     MS_U16  u16DNROffset = (gSrcInfo[eWindow].u16IPMFetch + OFFSET_PIXEL_ALIGNMENT - 1)
1978                                                           & ~(OFFSET_PIXEL_ALIGNMENT-1);
1979     MS_U8   u8BytesPer2Pixel = gSrcInfo[eWindow].u8BitPerPixel * 2 / 8;
1980     if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1981     {
1982         *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling)*
1983                         (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
1984     }
1985     else if((IS_INPUT_FRAME_ALTERNATIVE(eWindow)
1986              || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1987              || IS_INPUT_NORMAL_2D_INTERLACE(eWindow))
1988             && IS_OUTPUT_LINE_ALTERNATIVE()
1989                  )
1990     {
1991         if (IsVMirrorMode(eWindow))
1992         {
1993             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
1994                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
1995         }
1996         else
1997         {
1998             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)(u16DNROffset)*
1999                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2000         }
2001     }
2002     else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2003     {
2004         if (IsVMirrorMode(eWindow))
2005         {
2006             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
2007                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2008         }
2009         else
2010         {
2011             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset *
2012                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2013         }
2014     }
2015     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2016     {
2017         if (IsVMirrorMode(eWindow))
2018         {
2019             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
2020                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2021         }
2022         else
2023         {
2024             *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset *
2025                             ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2026         }
2027     }
2028     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (eWindow == SUB_WINDOW))
2029     {
2030         Hal_SC_subwindow_disable(pInstance);
2031         *pu32DNRBase0 = MS_IPM_BASE0(MAIN_WINDOW) + (((gSrcInfo[eWindow].stDispWin.height / 2)
2032                       * (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2033     }
2034     else if(((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2035              || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2036              && (SUB_WINDOW == eWindow))
2037     {
2038         Hal_SC_subwindow_disable(pInstance);
2039         *pu32DNRBase0 = MS_IPM_BASE0(MAIN_WINDOW) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2040     }
2041     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2042     {
2043         *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2044     }
2045 #if (HW_DESIGN_3D_VER == 0)
2046     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2047     {
2048         *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2049     }
2050 #endif
2051     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_DNRBase(%s): to pu32DNRBase0:0x%lx, pu32DNRBase1:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32DNRBase0,*pu32DNRBase1);
2052 #endif
2053 }
2054 
MDrv_SC_3D_Adjust_OPMBase(void * pInstance,MS_PHY * pu32OPMBase0,MS_PHY * pu32OPMBase1,MS_PHY * pu32OPMBase2,MS_PHY u32Offset,SCALER_WIN eWindow)2055 void MDrv_SC_3D_Adjust_OPMBase(void *pInstance, MS_PHY *pu32OPMBase0,
2056                                MS_PHY *pu32OPMBase1,
2057                                MS_PHY *pu32OPMBase2,
2058                                MS_PHY u32Offset,
2059                                SCALER_WIN eWindow)
2060 {
2061     MS_ASSERT(eWindow < MAX_WINDOW);
2062 
2063     if(eWindow == MAX_WINDOW)
2064     {
2065         return;
2066     }
2067 
2068     if(pu32OPMBase0 == NULL)
2069     {
2070         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase0 is NULL\n");
2071         return;
2072     }
2073 
2074     if(pu32OPMBase1 == NULL)
2075     {
2076         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase1 is NULL\n");
2077         return;
2078     }
2079 
2080     if(pu32OPMBase2 == NULL)
2081     {
2082         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase2 is NULL\n");
2083         return;
2084     }
2085 
2086 #if (HW_DESIGN_3D_VER >= 2)
2087     return;
2088 #else
2089     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2090     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2091     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2092     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2093     MS_PHY  u32DNRBase0 = MS_IPM_BASE0(pInstance, eWindow);
2094     MS_PHY  u32DNRBase1 = u32DNRBase0 + ((u32Offset / BYTE_PER_WORD + 0x01) & ~0x01L);
2095     MS_PHY  u32DNRBase0Main = MS_IPM_BASE0(MAIN_WINDOW);
2096     MS_PHY  u32DNRBase1Main = 0;
2097     MS_PHY  u32DNRBase2Main = 0;
2098     MS_U8   u8BytesPer2Pixel = gSrcInfo[eWindow].u8BitPerPixel * 2 / 8;
2099     MS_BOOL bInterlace = gSrcInfo[eWindow].bInterlace;
2100     MS_U16  u16DNROffset = (gSrcInfo[eWindow].u16IPMFetch + OFFSET_PIXEL_ALIGNMENT - 1)
2101                                                           & ~(OFFSET_PIXEL_ALIGNMENT-1);
2102     MS_U32  u32Framesize = (MS_U32)gSrcInfo[eWindow].u16V_SizeAfterPreScaling *
2103                                   (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/2;
2104     MS_U8   u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
2105 
2106     MS_ASSERT(eWindow < MAX_WINDOW);
2107     MS_ASSERT(pu32OPMBase0);
2108     MS_ASSERT(pu32OPMBase1);
2109 
2110     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_OPMBase(%s): from pu32OPMBase0:0x%lx, pu32OPMBase1:0x%lx, pu32OPMBase2:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32OPMBase0,*pu32OPMBase1,*pu32OPMBase2);
2111 
2112     if( gSrcInfo[eWindow].Status2.eFrameStoreNumber == IMAGE_STORE_3_FRAMES )
2113     {
2114         u32DNRBase1Main = u32DNRBase0Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 3 / BYTE_PER_WORD + 0x01) & ~0x01L);
2115         u32DNRBase2Main = u32DNRBase1Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 3 / BYTE_PER_WORD + 0x01) & ~0x01L);
2116     }
2117     else
2118     {
2119         u32DNRBase1Main = u32DNRBase0Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 2 / BYTE_PER_WORD + 0x01) & ~0x01L);
2120         u32DNRBase2Main = u32DNRBase0Main;
2121     }
2122 
2123     MDrv_SC_3D_Adjust_DNRBase(pInstance,
2124                               &u32DNRBase0,
2125                               &u32DNRBase1,
2126                               eWindow);
2127 
2128     //default setting: sub window use mainwindow's scaler buffer
2129     if((!IS_INPUT_MODE_NONE(eWindow)) && (SUB_WINDOW == eWindow))
2130     {
2131         *pu32OPMBase0 = (u32DNRBase0Main + 0x01) & ~0x01L;
2132         *pu32OPMBase1 = (u32DNRBase1Main + 0x01) & ~0x01L;
2133         *pu32OPMBase2 = (u32DNRBase2Main + 0x01) & ~0x01L;
2134     }
2135 
2136     if((IS_INPUT_TOP_BOTTOM(eWindow) ||
2137         (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!gSrcInfo[eWindow].bInterlace)) ||
2138         IS_INPUT_FRAME_ALTERNATIVE(eWindow)||
2139         IS_INPUT_FRAME_PACKING(eWindow)||
2140         IS_INPUT_NORMAL_2D(eWindow)) &&
2141        IS_OUTPUT_LINE_ALTERNATIVE())
2142     {
2143         MS_U32 u32DoubleHDMidBandSize = 0;
2144         if((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE)
2145             || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE))
2146         {
2147             u32DoubleHDMidBandSize = (MS_U32)(gSrcInfo[eWindow].u16V_SizeAfterPreScaling - gSrcInfo[eWindow].stDispWin.height) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel;
2148             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u32DoubleHDMidBandSize=%u\n", gSrcInfo[eWindow].u16V_SizeAfterPreScaling - gSrcInfo[eWindow].stDispWin.height);
2149         }
2150 
2151         if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2152         {
2153             *pu32OPMBase1 = u32DNRBase0;
2154         }
2155         else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2156                 && (!gSrcInfo[eWindow].bInterlace)
2157                 && IS_OUTPUT_LINE_ALTERNATIVE())
2158         {
2159             *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2160         }
2161         else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2162         {
2163             if (IsVMirrorMode(eWindow))
2164             {
2165                 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2166                                     (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2167             }
2168             else
2169             {
2170                 *pu32OPMBase1 = *pu32OPMBase0;
2171                 *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2172                                     (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2173             }
2174         }
2175         else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2176                 IS_OUTPUT_LINE_ALTERNATIVE())
2177         {
2178             *pu32OPMBase1 = *pu32OPMBase0 + (((u32Framesize)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2179         }
2180         else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2181                 IS_OUTPUT_LINE_ALTERNATIVE())
2182         {
2183             MS_U32 u32SecondFrameOffset = 0;
2184             if(gSrcInfo[eWindow].stDispWin.height == DOUBLEHD_720X2P_FRAME_VSIZE) //720p centering opt
2185             {
2186                 u32SecondFrameOffset = (MS_U32)(DOUBLEHD_720X2P_FRAME_VSIZE / 2) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel +
2187                                              (MS_U32)15 * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel;
2188             }
2189             else
2190             {
2191                 u32SecondFrameOffset = (MS_U32)(gSrcInfo[eWindow].stDispWin.height / 2) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel +
2192                                              u32DoubleHDMidBandSize;
2193             }
2194             *pu32OPMBase1 = *pu32OPMBase0 + ((u32SecondFrameOffset/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2195         }
2196     }
2197     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
2198     {
2199         *pu32OPMBase2 = *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase0;
2200     }
2201     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
2202     {
2203         *pu32OPMBase2 = *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase1;
2204     }
2205     else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
2206            && IS_OUTPUT_LINE_ALTERNATIVE())
2207     {
2208         *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 * (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2209     }
2210     else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
2211            && IS_OUTPUT_LINE_ALTERNATIVE())
2212     {
2213         *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 *
2214                             (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2215     }
2216     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2217     {
2218         *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 *
2219                             (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2220     }
2221     else if(IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
2222            && IS_OUTPUT_LINE_ALTERNATIVE())
2223     {
2224         if (IsVMirrorMode(eWindow))
2225         {
2226             *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2227                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2228         }
2229         else
2230         {
2231             *pu32OPMBase1 = *pu32OPMBase0;
2232             *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2233                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2234         }
2235     }
2236     else if((IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow))
2237            && IS_OUTPUT_LINE_ALTERNATIVE())
2238     {
2239         if (IsVMirrorMode(eWindow))
2240         {
2241             *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2242                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2243         }
2244         else
2245         {
2246             *pu32OPMBase1 = *pu32OPMBase0;
2247             *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2248                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2249         }
2250     }
2251     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2252         IS_OUTPUT_TOP_BOTTOM() &&
2253         (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2254     {
2255         *pu32OPMBase0 = u32DNRBase1;
2256         *pu32OPMBase1 = u32DNRBase1;
2257     }
2258     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2259         IS_OUTPUT_TOP_BOTTOM() &&
2260         (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst != FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2261     {
2262         *pu32OPMBase0 = u32DNRBase0;
2263         *pu32OPMBase1 = u32DNRBase0;
2264     }
2265     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
2266             (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()) &&
2267             (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == TRUE)? SUB_WINDOW:MAIN_WINDOW)))
2268     {
2269         *pu32OPMBase0 = ((u32DNRBase0Main + 0x01) & ~0x01L)
2270                         + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/4)*
2271                         (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2272         *pu32OPMBase1 = ((u32DNRBase1Main + 0x01) & ~0x01L)
2273                         + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/4)*(MS_U32)u16DNROffset *
2274                         ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2275     }
2276     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2277     {
2278         *pu32OPMBase1 = u32DNRBase1 + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2)*(MS_U32)u16DNROffset *
2279                           ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2280     }
2281     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2282            (IS_OUTPUT_TOP_BOTTOM()
2283 #if (HW_DESIGN_3D_VER == 1)
2284            || IS_OUTPUT_SIDE_BY_SIDE_HALF()
2285 #endif
2286            ) &&
2287            (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2288     {
2289         *pu32OPMBase0 = u32DNRBase0Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2290         *pu32OPMBase1 = u32DNRBase1Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2291         *pu32OPMBase2 = u32DNRBase2Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2292     }
2293     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2294             && IS_OUTPUT_FRAME_L()
2295             && gSrcInfo[eWindow].bInterlace)
2296     {
2297         *pu32OPMBase1 = (((*pu32OPMBase0 + 1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2298     }
2299     else if(((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
2300            || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2301            && (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2302     {
2303         MS_U16 u16SkipLine_OpmBase0 = 0;
2304         MS_U16 u16SkipLine_OpmBase1 = 0;
2305         MS_U16 u16VactVideo = 0;
2306         MS_U16 u16VactSpace = 0;
2307         MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2308 
2309         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2310         {
2311             u16SkipLine_OpmBase0 = u16VactVideo + DOUBLEHD_1080X2I_VACT_SPACE1;
2312             u16SkipLine_OpmBase1 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2313         }
2314         else
2315         {
2316             u16SkipLine_OpmBase0 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2317         }
2318 
2319         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine_OpmBase0=%u, u16SkipLine_OpmBase1=%u\n", u16SkipLine_OpmBase0, u16SkipLine_OpmBase1);
2320         *pu32OPMBase0 = u32DNRBase0Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2321         *pu32OPMBase1 = u32DNRBase1Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2322         *pu32OPMBase2 = u32DNRBase2Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2323         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2324         {//this format need use madi
2325             *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2326         }
2327     }
2328     else if(((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
2329            || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2330            && (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? SUB_WINDOW:MAIN_WINDOW)))
2331     {
2332         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2333         {
2334             MS_U16 u16SkipLine_OpmBase1 = DOUBLEHD_1080X2I_FIELD_VSIZE*2+DOUBLEHD_1080X2I_VACT_SPACE1+DOUBLEHD_1080X2I_VACT_SPACE2;
2335             *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2336         }
2337     }
2338     else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2339            (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()) &&
2340            (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2341     {
2342         MS_U16 u16SkipLine = gSrcInfo[eWindow].u16V_SizeAfterPreScaling / 2;
2343         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine=%u\n", u16SkipLine);
2344         *pu32OPMBase0 = u32DNRBase0Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2345         *pu32OPMBase1 = u32DNRBase1Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2346         *pu32OPMBase2 = u32DNRBase2Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2347     }
2348     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2349            IS_OUTPUT_SIDE_BY_SIDE_HALF()&&
2350            (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)) && (gSrcInfo[eWindow].stCapWin.width != gSrcInfo[eWindow].stDispWin.width))
2351     {
2352         *pu32OPMBase0 = u32DNRBase0Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2353         *pu32OPMBase1 = u32DNRBase1Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2354         *pu32OPMBase2 = u32DNRBase2Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2355     }
2356     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2357            IS_OUTPUT_TOP_BOTTOM() &&
2358            (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2359     {
2360         *pu32OPMBase0 = (u32DNRBase0Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2361         *pu32OPMBase1 = (u32DNRBase1Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2362         *pu32OPMBase2 = (u32DNRBase2Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2363     }
2364 #if (HW_DESIGN_3D_VER < 1)
2365     else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2366            (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2367            ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())))
2368 
2369     {
2370         *pu32OPMBase0 = u32DNRBase0;
2371         *pu32OPMBase1 = *pu32OPMBase0 + (MS_U32)(u16DNROffset) * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2372     }
2373     else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2374     {
2375         if (IsVMirrorMode(eWindow))
2376         {
2377             *pu32OPMBase1 = *pu32OPMBase1 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2378                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2379         }
2380         else
2381         {
2382             *pu32OPMBase0 = *pu32OPMBase0 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2383                                 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2384         }
2385     }
2386     else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2387            (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2388     {
2389         MS_U16 u16SkipLine = 0;
2390         MS_U16 u16VactVideo = 0;
2391         MS_U16 u16VactSpace = 0;
2392         MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2393         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2394         {
2395             u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
2396         }
2397 
2398         u16SkipLine = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2399         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine=%u\n", u16SkipLine);
2400         *pu32OPMBase0 = u32DNRBase0;
2401         *pu32OPMBase1 = *pu32OPMBase0 + (MS_U32)u16DNROffset *  u16SkipLine * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD);
2402     }
2403 #endif
2404     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2405             IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2406     {
2407         *pu32OPMBase1 = *pu32OPMBase0 + (((MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/BYTE_PER_WORD + 0x01) & ~0x01L);
2408     }
2409     else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2410     {
2411         *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/BYTE_PER_WORD + 0x01) & ~0x01L);
2412     }
2413     else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2414     {
2415         if(gSrcInfo[eWindow].bInterlace)
2416         {
2417             *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/2/BYTE_PER_WORD + 0x01) & ~0x01L);//only handle one field
2418         }
2419         else
2420         {
2421             *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/BYTE_PER_WORD + 0x01) & ~0x01L);
2422         }
2423     }
2424     else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2425     {
2426         *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift)  *
2427                            (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2428     }
2429     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2430                 IS_OUTPUT_LINE_ALTERNATIVE())
2431     {
2432         *pu32OPMBase1 = *pu32OPMBase0 + ((1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2433     }
2434     else if(IS_INPUT_FRAME_PACKING(eWindow) && (IS_OUTPUT_FRAME_L()))
2435     {
2436         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2437         {
2438             MS_U16 u16SkipLine_OpmBase1 = DOUBLEHD_1080X2I_FIELD_VSIZE*2+DOUBLEHD_1080X2I_VACT_SPACE1+DOUBLEHD_1080X2I_VACT_SPACE2;
2439             *pu32OPMBase0 = u32DNRBase0Main;
2440             *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2441         }
2442     }
2443     else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2444                (IS_OUTPUT_FRAME_R()))
2445     {
2446         MS_U16 u16VactVideo = 0;
2447         MS_U16 u16VactSpace = 0;
2448         MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2449         if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2450         {
2451             MS_U16 u16SkipLine_OpmBase0 = u16VactSpace+DOUBLEHD_1080X2I_VACT_SPACE1;
2452             MS_U16 u16SkipLine_OpmBase1 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2453             *pu32OPMBase0 = u32DNRBase0Main + ((u16SkipLine_OpmBase0*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2454             *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2455         }
2456         else
2457         {
2458             MS_U16 u16SkipLine = 0;
2459             u16SkipLine = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2460             *pu32OPMBase0 = u32DNRBase0Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2461             *pu32OPMBase1 = u32DNRBase1Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2462             *pu32OPMBase2 = u32DNRBase2Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2463         }
2464     }
2465     else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2466                (IS_OUTPUT_FRAME_R()))
2467     {
2468         *pu32OPMBase0 = u32DNRBase0Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2469         *pu32OPMBase1 = u32DNRBase1Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2470         *pu32OPMBase2 = u32DNRBase2Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2471     }
2472     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2473                (IS_OUTPUT_FRAME_R()))
2474     {
2475         *pu32OPMBase0 = u32DNRBase0Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2476         *pu32OPMBase1 = u32DNRBase1Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2477         *pu32OPMBase2 = u32DNRBase2Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2478     }
2479     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2480             && IS_OUTPUT_FRAME_R())
2481     {
2482         *pu32OPMBase0 = (((u32DNRBase0Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2483         *pu32OPMBase1 = (((u32DNRBase1Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2484         *pu32OPMBase2 = (((u32DNRBase2Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2485     }
2486 #if (HW_DESIGN_3D_VER == 0)
2487     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2488     {
2489         *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase0;
2490     }
2491 #else
2492     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2493         IS_OUTPUT_SIDE_BY_SIDE_HALF() &&
2494         (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2495     {
2496         *pu32OPMBase0 = u32DNRBase0;
2497         *pu32OPMBase1 = u32DNRBase0;
2498     }
2499     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2500         IS_OUTPUT_SIDE_BY_SIDE_HALF() &&
2501         (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst != FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2502     {
2503         *pu32OPMBase0 = u32DNRBase1;
2504         *pu32OPMBase1 = u32DNRBase1;
2505     }
2506 #endif
2507 
2508     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_OPMBase(%s): to pu32OPMBase0:0x%lx, pu32OPMBase1:0x%lx, pu32OPMBase2:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32OPMBase0,*pu32OPMBase1,*pu32OPMBase2);
2509 #endif
2510 }
2511 
2512 
2513 
MDrv_SC_3D_Adjust_FetchOffset(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)2514 void MDrv_SC_3D_Adjust_FetchOffset(void *pInstance, XC_InternalStatus *pSrcInfo,
2515                                    SCALER_WIN eWindow)
2516 {
2517     MS_ASSERT(eWindow < MAX_WINDOW);
2518     MS_ASSERT(pSrcInfo);
2519 
2520     if(eWindow >= MAX_WINDOW)
2521     {
2522         return;
2523     }
2524 
2525     if(pSrcInfo == NULL)
2526     {
2527         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pSrcInfo is NULL\n");
2528         return;
2529     }
2530     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2531     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2532     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2533     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2534 
2535 #if (HW_DESIGN_3D_VER >= 2)
2536 
2537     if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)
2538        && (!pSrcInfo->bInterlace)
2539        && (IS_OUTPUT_FRAME_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()))
2540     {
2541 
2542         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2543         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch  = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2544         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2;
2545         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch/2;
2546         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: adjust u16OPMOffset(%u) and u16OPMFetch(%u) to half for E_XC_3D_INPUT_SIDE_BY_SIDE\n",
2547                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset,pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch);
2548 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2549         if (IsEnableDualMode(eWindow))
2550         {
2551             // Fixme: need refine dnr offset fetch
2552             //pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2553             //pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch  = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2554             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2;
2555             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch/2;
2556             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: adjust u16DualOPMOffset(%u) and u16DualOPMFetch(%u) to half for E_XC_3D_INPUT_SIDE_BY_SIDE\n",
2557                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset,pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch);
2558         }
2559 #endif
2560 
2561     }
2562     else  if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2563            && (!IS_OUTPUT_MODE_NONE()))
2564     {
2565             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2;
2566 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2567             if (IsEnableDualMode(eWindow))
2568             {
2569                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2;
2570             }
2571 #endif
2572     }
2573     return;
2574 #else
2575     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2576        && (!pSrcInfo->bInterlace)
2577        && IS_OUTPUT_LINE_ALTERNATIVE())
2578     {
2579         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  /= 2;
2580 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2581         if (IsEnableDualMode(eWindow))
2582         {
2583             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  /= 2;
2584         }
2585 #endif
2586     }
2587     else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) &&
2588        IS_OUTPUT_LINE_ALTERNATIVE())
2589     {
2590         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2591         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2592 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2593         if (IsEnableDualMode(eWindow))
2594         {
2595             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2596             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2597         }
2598 #endif
2599 
2600     }
2601     else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) &&
2602        IS_OUTPUT_LINE_ALTERNATIVE())
2603     {
2604         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2605 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2606         if (IsEnableDualMode(eWindow))
2607         {
2608             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2609         }
2610 #endif
2611     }
2612     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2613     {
2614         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2615 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2616         if (IsEnableDualMode(eWindow))
2617         {
2618             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2619         }
2620 #endif
2621     }
2622     else if(IS_INPUT_NORMAL_2D_INTERLACE(eWindow) &&
2623        IS_OUTPUT_LINE_ALTERNATIVE())
2624     {
2625         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2626 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2627         if (IsEnableDualMode(eWindow))
2628         {
2629             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2630         }
2631 #endif
2632     }
2633     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2634        (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L()
2635        || IS_OUTPUT_FRAME_R()))
2636     {
2637         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2638 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2639         if (IsEnableDualMode(eWindow))
2640         {
2641             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *=2;
2642         }
2643 #endif
2644 
2645     }
2646     else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2647             (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2648     {
2649         //change nothing
2650     }
2651     else if(IS_INPUT_TOP_BOTTOM(eWindow)
2652             && IS_OUTPUT_LINE_ALTERNATIVE()
2653             && pSrcInfo->bInterlace)
2654     {
2655         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2656 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2657         if (IsEnableDualMode(eWindow))
2658         {
2659             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2660         }
2661 #endif
2662     }
2663     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2664                IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
2665     {
2666         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2667                                                                             - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2668                                                                           + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2669         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2670 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2671         if (IsEnableDualMode(eWindow))
2672         {
2673             // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2674             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  /= 2;
2675             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2676 
2677         }
2678 #endif
2679 
2680     }
2681     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2682                IS_OUTPUT_TOP_BOTTOM())
2683     {
2684         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2685                                                                             - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2686                                                                           + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2687         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2688 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2689         if (IsEnableDualMode(eWindow))
2690         {
2691             // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2692             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  /= 2;
2693             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2694 
2695         }
2696 #endif
2697     }
2698     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() )
2699     {
2700         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2701 
2702 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2703         if (IsEnableDualMode(eWindow))
2704         {
2705             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2706 
2707         }
2708 #endif
2709     }
2710     else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2711                 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2712            ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2713             )
2714     {
2715         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2716                                                                             - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2717                                                                           + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2718         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2719 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2720         if (IsEnableDualMode(eWindow))
2721         {
2722             // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2723             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  /= 2;
2724             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2725 
2726         }
2727 #endif
2728     }
2729     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2730                (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
2731     {
2732         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2733                                                                             - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2734                                                                           + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2735         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2736 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2737         if (IsEnableDualMode(eWindow))
2738         {
2739             // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2740             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  /= 2;
2741             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2742 
2743         }
2744 #endif
2745     }
2746     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2747             IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2748     {
2749         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2750 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2751         if (IsEnableDualMode(eWindow))
2752         {
2753             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2754 
2755         }
2756 #endif
2757     }
2758     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2759     {
2760         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2761 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2762         if (IsEnableDualMode(eWindow))
2763         {
2764             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOffset *= 2;
2765         }
2766 #endif
2767     }
2768     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2769             && (IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2770     {
2771         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2772 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2773         if (IsEnableDualMode(eWindow))
2774         {
2775             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset  *= 2;
2776         }
2777 #endif
2778 #if (HW_DESIGN_3D_VER == 0)
2779         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  *= 2;
2780 #endif
2781     }
2782     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2783             && IS_OUTPUT_FRAME_L()
2784             && gSrcInfo[eWindow].bInterlace)
2785     {
2786         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2787 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2788         if (IsEnableDualMode(eWindow))
2789         {
2790             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2791         }
2792 #endif
2793     }
2794 #if (HW_DESIGN_3D_VER == 0)
2795     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2796     {
2797         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2798         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2799         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  *= 2;
2800     }
2801 #endif
2802     else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2803              || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2804     {
2805         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2806         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2807         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  *= 2;
2808 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2809         if (IsEnableDualMode(eWindow))
2810         {
2811             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2812             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2813             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch  *= 2;
2814         }
2815 #endif
2816     }
2817 
2818 #if (HW_DESIGN_3D_VER < 1)
2819     //set free_md
2820     Hal_XC_Set_FreeFRCMD(pInstance, (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2821                 IS_OUTPUT_FRAME_ALTERNATIVE()) ||
2822                 (IS_INPUT_FRAME_PACKING(eWindow) &&
2823                 IS_OUTPUT_FRAME_ALTERNATIVE()));
2824 #elif (HW_DESIGN_3D_VER == 1)
2825     //set free_md
2826     Hal_XC_Set_FreeFRCMD(pInstance, (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2827                          || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()));
2828 #endif
2829 
2830 #if (HW_DESIGN_3D_VER == 1)
2831     {
2832         if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2833                    IS_OUTPUT_FRAME_ALTERNATIVE())
2834         {
2835             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch /= 2;
2836             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2837             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2838             Hal_XC_H3D_Enable(TRUE);
2839             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_SIDE_BY_SIDE_FULL);
2840             Hal_XC_H3D_Breakline_Enable(TRUE);
2841             Hal_XC_H3D_HDE((pSrcInfo->u16H_SizeAfterPreScaling+OFFSET_PIXEL_ALIGNMENT-1) & ~(OFFSET_PIXEL_ALIGNMENT-1));
2842             Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2843         }
2844         else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2845                     IS_OUTPUT_FRAME_ALTERNATIVE())
2846         {
2847             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2848             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2849             Hal_XC_H3D_Enable(TRUE);
2850             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_LINE_ALTERNATIVE);
2851             Hal_XC_H3D_Breakline_Enable(FALSE);
2852             Hal_XC_H3D_HDE(0);
2853             HAL_XC_H3D_OPM_SBYS_PIP_Enable(FALSE);
2854             Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2855         }
2856         else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2857                     IS_OUTPUT_FRAME_ALTERNATIVE())
2858         {
2859             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2;
2860             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2;
2861             if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2862             {
2863                 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2864             }
2865             else
2866             {
2867                 Hal_XC_H3D_HBLANK(0x33E);
2868             }
2869             Hal_XC_H3D_HDE(DOUBLEHD_1080X2P_HSIZE);//0x780
2870             Hal_XC_H3D_INIT_VBLANK(0x02);
2871             Hal_XC_H3D_VDE_F0(DOUBLEHD_1080X2P_FRAME_VSIZE);//0x438
2872             Hal_XC_H3D_VBLANK0(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2873             Hal_XC_H3D_VBLANK1(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2874             Hal_XC_H3D_VDE_F2(DOUBLEHD_1080X2P_FRAME_VSIZE);//0x438
2875             Hal_XC_H3D_VBLANK2(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2876             Hal_XC_H3D_VSYNC_WIDTH(0x01);
2877             Hal_XC_H3D_VSYNC_POSITION(0x0400);
2878             Hal_XC_H3D_Enable(TRUE);
2879             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2880             Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2881             Hal_XC_H3D_Breakline_Enable(FALSE);
2882             HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2883             Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2884 
2885             if ((gSrcInfo[eWindow].stCapWin.width == DOUBLEHD_1080X2I_HSIZE) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
2886             {
2887                 if ((pSrcInfo->u16InputVFreq >= 240) && (pSrcInfo->u16InputVFreq <= 260))
2888                 {
2889                     if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2890                     {
2891                         Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2892                     }
2893                     else
2894                     {
2895                         Hal_XC_H3D_HBLANK(0x2D0);//1080i@50Hz
2896                     }
2897                 }
2898                 else if ((pSrcInfo->u16InputVFreq >= 290) && (pSrcInfo->u16InputVFreq <= 310))
2899                 {
2900                     if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2901                     {
2902                         Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2903                     }
2904                     else
2905                     {
2906                         Hal_XC_H3D_HBLANK(0x118);//1080i@60Hz
2907                     }
2908                 }
2909                 Hal_XC_H3D_HDE(DOUBLEHD_1080X2I_HSIZE);//0x780
2910                 Hal_XC_H3D_INIT_VBLANK(0x02);
2911                 Hal_XC_H3D_VDE_F0(DOUBLEHD_1080X2I_FRAME_VSIZE/2);//0x21C
2912                 Hal_XC_H3D_VBLANK0(0x17);//0x17
2913                 Hal_XC_H3D_VBLANK1(0x16);//0x16
2914                 Hal_XC_H3D_VDE_F2(DOUBLEHD_1080X2I_FRAME_VSIZE/2);//0x21C
2915                 Hal_XC_H3D_VBLANK2(0x17);//0x17
2916                 Hal_XC_H3D_VSYNC_WIDTH(0x01);
2917                 Hal_XC_H3D_VSYNC_POSITION(0x0400);
2918                 Hal_XC_H3D_Enable(TRUE);
2919                 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2920                 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2921                 Hal_XC_H3D_Breakline_Enable(FALSE);
2922                 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2923                 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2924             }
2925             else if ((gSrcInfo[eWindow].stCapWin.width == DOUBLEHD_720X2P_HSIZE) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE))
2926             {
2927                 if ((pSrcInfo->u16InputVFreq >= 470) && (pSrcInfo->u16InputVFreq <= 520))
2928                 {
2929                     if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2930                     {
2931                         Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2932                     }
2933                     else
2934                     {
2935                         Hal_XC_H3D_HBLANK(0x2BC);//50Hz=700
2936                     }
2937                 }
2938                 else if ((pSrcInfo->u16InputVFreq >= 570) && (pSrcInfo->u16InputVFreq <= 620))
2939                 {
2940                     if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2941                     {
2942                         Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2943                     }
2944                     else
2945                     {
2946                         Hal_XC_H3D_HBLANK(0x172);//59.94/60Hz=370
2947                     }
2948                 }
2949 
2950                 Hal_XC_H3D_HDE(DOUBLEHD_720X2P_HSIZE);//1280
2951                 Hal_XC_H3D_INIT_VBLANK(0x02);
2952                 Hal_XC_H3D_VDE_F0(DOUBLEHD_720X2P_FRAME_VSIZE);//720
2953                 Hal_XC_H3D_VBLANK0(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2954                 Hal_XC_H3D_VBLANK1(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2955                 Hal_XC_H3D_VDE_F2(DOUBLEHD_720X2P_FRAME_VSIZE);//0x2D0
2956                 Hal_XC_H3D_VBLANK2(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2957                 Hal_XC_H3D_VSYNC_WIDTH(0x01);
2958                 Hal_XC_H3D_VSYNC_POSITION(0x0400);
2959                 Hal_XC_H3D_Enable(TRUE);
2960                 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2961                 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2962                 Hal_XC_H3D_Breakline_Enable(FALSE);
2963                 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2964                 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2965             }
2966         }
2967         else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2968                     IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2969         {
2970             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2;
2971             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2;
2972             if ((pSrcInfo->u16InputVFreq >= 470) && (pSrcInfo->u16InputVFreq <= 520))
2973             {
2974                 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2975                 {
2976                     Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2977                 }
2978                 else
2979                 {
2980                     Hal_XC_H3D_HBLANK(0x2BC);//50Hz=700
2981                 }
2982             }
2983             else if ((pSrcInfo->u16InputVFreq >= 570) && (pSrcInfo->u16InputVFreq <= 620))
2984             {
2985                 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2986                 {
2987                     Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2988                 }
2989                 else
2990                 {
2991                     Hal_XC_H3D_HBLANK(0x172);//59.94/60Hz=370
2992                 }
2993             }
2994             Hal_XC_H3D_HDE(DOUBLEHD_720X2P_HSIZE);//1280
2995             Hal_XC_H3D_INIT_VBLANK(0x02);
2996             Hal_XC_H3D_VDE_F0(DOUBLEHD_720X2P_FRAME_VSIZE);//720
2997             Hal_XC_H3D_VBLANK0(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2998             Hal_XC_H3D_VBLANK1(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2999             Hal_XC_H3D_VDE_F2(DOUBLEHD_720X2P_FRAME_VSIZE);//0x2D0
3000             Hal_XC_H3D_VBLANK2(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E no need in 1280x1470
3001             Hal_XC_H3D_VSYNC_WIDTH(0x01);
3002             Hal_XC_H3D_VSYNC_POSITION(0x0400);
3003             Hal_XC_H3D_Enable(TRUE);
3004             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3005             Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
3006             Hal_XC_H3D_Breakline_Enable(FALSE);
3007             HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
3008             Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3009         }
3010         else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
3011                     IS_OUTPUT_FRAME_ALTERNATIVE())
3012         {
3013             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase1 = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0;
3014             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
3015             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
3016             Hal_XC_H3D_Enable(FALSE);
3017             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3018             Hal_XC_H3D_Breakline_Enable(FALSE);
3019             Hal_XC_H3D_HDE(0);
3020             HAL_XC_H3D_OPM_SBYS_PIP_Enable(FALSE);
3021             Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3022             Hal_XC_H3D_SELECT_REGEN_TIMING(FALSE);
3023         }
3024         else
3025         {
3026             Hal_XC_H3D_Enable(FALSE);
3027             Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3028             Hal_XC_H3D_Breakline_Enable(FALSE);
3029             Hal_XC_H3D_HDE(0);
3030             Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3031             Hal_XC_H3D_SELECT_REGEN_TIMING(FALSE);
3032             Hal_HDMI_Set_YUV422to444_Bypass(TRUE);
3033         }
3034 
3035         // Version = 1. 3D mode enable
3036         if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_70_L, (BIT(15))) )
3037         {
3038             Hal_HDMI_Set_YUV422to444_Bypass(FALSE);
3039         }
3040     }
3041 #endif
3042     //  IPM offset / IPM fetch /OPM offset: All project --> 32pix align-----Fix me: Need consider DNR offset and DNR/OPM base
3043     //  OPM fetch:
3044     //            Janus /T7 --> 32pix align
3045     //            Others ( T8/T9/T12/T13/m10/J2 ) --> 2pix align
3046     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  = ( pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1 ) & ~1;  //  pixels  alignment;
3047 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3048         if (IsEnableDualMode(eWindow))
3049         {
3050             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch *= ( pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1 ) & ~1;
3051         }
3052 #endif
3053 
3054 #endif
3055 }
3056 
MDrv_SC_3D_IsFramePaking(void * pInstance,MS_U16 u16Width,MS_U16 u16Height,MS_BOOL bInterlace)3057 MS_BOOL MDrv_SC_3D_IsFramePaking(void *pInstance, MS_U16 u16Width, MS_U16 u16Height, MS_BOOL bInterlace)
3058 {
3059     MS_BOOL bFramePacking = (((u16Width == DOUBLEHD_720X2P_HSIZE)
3060                                 && (u16Height == DOUBLEHD_720X2P_VSIZE))
3061                               || ((u16Width == DOUBLEHD_576X2P_HSIZE)
3062                                 && (u16Height == DOUBLEHD_576X2P_VSIZE))
3063                               || ((u16Width == DOUBLEHD_480X2P_HSIZE)
3064                                 && (u16Height == DOUBLEHD_480X2P_VSIZE))
3065                               || ((u16Width == DOUBLEHD_640_480X2P_HSIZE)
3066                                 && (u16Height == DOUBLEHD_640_480X2P_VSIZE))
3067                               || ((u16Width == DOUBLEHD_1080X2P_HSIZE)
3068                                 && (u16Height == DOUBLEHD_1080X2P_VSIZE))
3069                               || ((u16Width == DOUBLEHD_1080X2I_HSIZE)
3070                                 && (u16Height == DOUBLEHD_1080X2I_VSIZE))
3071                                 ) && (!bInterlace);
3072     return bFramePacking;
3073 }
3074 
MDrv_SC_3D_FormatValidation(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3075 MS_BOOL MDrv_SC_3D_FormatValidation(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
3076 {
3077     MS_BOOL bRet = TRUE;
3078     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3079     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3080     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3081     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3082 
3083     MS_BOOL bFramePacking = MDrv_SC_3D_IsFramePaking(pInstance, pSrcInfo->stCapWin.width, pSrcInfo->stCapWin.height, pSrcInfo->bInterlace);
3084 
3085     MS_ASSERT(eWindow < MAX_WINDOW);
3086     MS_ASSERT(pSrcInfo);
3087 
3088     if(eWindow >= MAX_WINDOW)
3089     {
3090         return FALSE;
3091     }
3092 
3093     if( IS_INPUT_MODE_NONE(eWindow)^IS_OUTPUT_MODE_NONE() )
3094     {
3095 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3096         if( IS_INPUT_MODE_NONE(eWindow) )
3097         {
3098             bRet = Hal_SC_3D_IsDualViewMode(pInstance, eWindow);
3099         }
3100 #else
3101         bRet = FALSE;
3102 #endif
3103     }
3104     else
3105     {
3106         if( IS_INPUT_MODE_NONE(eWindow))
3107         {
3108             return TRUE;
3109         }
3110     }
3111 
3112 
3113 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3114     if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))  //do not check FP content while in dual view mode
3115 #endif
3116     {
3117         bRet = !(IS_INPUT_FRAME_PACKING(eWindow) ^ bFramePacking);
3118     }
3119 
3120     if(!bRet)
3121     {
3122         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: format is invalid,3D Mode=%u !\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]);
3123     }
3124 
3125 #ifdef UFO_XC_FB_LEVEL
3126     if((pSrcInfo->eFBLevel == E_XC_FB_LEVEL_FBL) || (pSrcInfo->bR_FBL == E_XC_FB_LEVEL_RFBL_DI))
3127 #else
3128     if(pSrcInfo->bFBL || pSrcInfo->bR_FBL)
3129 #endif
3130     {
3131         if(!(MDrv_SC_3D_IsSupportFBL3D()
3132              && ((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
3133                   || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))))
3134         {
3135             bRet = FALSE;
3136             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: not support this 3d format under fbl\n");
3137         }
3138     }
3139     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3140        || IS_INPUT_CHECK_BOARD(eWindow)
3141        || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
3142     {
3143         if(pSrcInfo->bInterlace)
3144         {
3145             bRet = FALSE;
3146             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only progresive timing is supported\n");
3147         }
3148     }
3149 #if (HW_DESIGN_3D_VER < 2)
3150     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow)
3151             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
3152     {
3153         if(!pSrcInfo->bInterlace)
3154         {
3155             bRet = FALSE;
3156             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only interlace timing is supported\n");
3157         }
3158     }
3159     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
3160     {
3161         if(pSrcInfo->bInterlace)
3162         {
3163             bRet = FALSE;
3164             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only progresive timing is supported\n");
3165         }
3166     }
3167 #endif
3168 #if (HW_DESIGN_3D_VER!= 4)
3169     if(IS_OUTPUT_FRAME_ALTERNATIVE())
3170     {
3171         #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 3))//special use only for napoli
3172         if ( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC &&
3173             (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
3174             (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
3175             (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500)) // 4K2K 60 out
3176         {
3177             if (!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ))
3178             {
3179                 bRet = FALSE;
3180 
3181                 printf("3D: need special flag E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ for 3D format E_XC_3D_OUTPUT_FRAME_ALTERNATIVE\n");
3182             }
3183         }
3184         else
3185         #endif
3186         if((pSrcInfo->u16InputVFreq > 350)
3187            &&
3188            ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 500)
3189             || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 600)))
3190         {
3191 
3192             bRet = FALSE;
3193 
3194             printf("3D: need double framerate for 3D formatE_XC_3D_OUTPUT_FRAME_ALTERNATIVE\n");
3195         }
3196     }
3197 #endif
3198 
3199     if (IS_OUTPUT_FRAME_PACKING())
3200     {
3201         //3D FP ouput ,display window always full screen
3202         pSrcInfo->stDispWin.x = 0;
3203         pSrcInfo->stDispWin.width = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
3204         pSrcInfo->stDispWin.y = 0;
3205         pSrcInfo->stDispWin.height = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
3206     }
3207 
3208     if (IS_INPUT_PIXEL_ALTERNATIVE(eWindow) || IS_INPUT_CHECK_BOARD(eWindow))
3209     {
3210         if (IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType))
3211         {
3212             _XC_SEMAPHORE_RETURN(pInstance, E_XC_ID_VAR);
3213             MS_HDMI_COLOR_FORMAT eFormat = MDrv_HDMI_Get_ColorFormat();
3214             _XC_SEMAPHORE_ENTRY(pInstance, E_XC_ID_VAR);
3215             if ((eFormat == MS_HDMI_COLOR_YUV_422) || (eFormat == MS_HDMI_COLOR_YUV_420))
3216             {
3217                bRet = FALSE;
3218                printf("3D: YUV422/YUV420 do not support HDMI PA/CB 3D input.\n");
3219             }
3220         }
3221         else
3222         {
3223             bRet = FALSE;
3224             printf("3D: This source do not support PA/CB 3D input.\n");
3225         }
3226     }
3227 
3228     if(!bRet)
3229     {
3230         printf("MDrv_SC_3D_FormatValidation(): invalid format, set to 3d_none\n");
3231         _XC_ENTRY(pInstance);
3232         MDrv_XC_Set_3D_HShift(pInstance, 0);
3233         Hal_SC_subwindow_disable(pInstance);
3234         _XC_RETURN(pInstance);
3235         pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = E_XC_3D_INPUT_MODE_NONE;
3236 
3237         if ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3238             && !(pXCResourcePrivate->stdrvXC_3D._bFAToTB)
3239             && !(pXCResourcePrivate->stdrvXC_3D._bLAToTB))
3240         {
3241             pSrcInfo->stDispWin.y *= 2;
3242         }
3243         else if ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3244             && !(pXCResourcePrivate->stdrvXC_3D._bFAToTB)
3245             && !(pXCResourcePrivate->stdrvXC_3D._bLAToTB))
3246         {
3247             pSrcInfo->stDispWin.x *= 2;
3248         }
3249 
3250 #if (HW_DESIGN_3D_VER < 2)
3251         if (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3252         {
3253             pSrcInfo->stDispWin.height *= 2;
3254         }
3255 
3256         if (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3257         {
3258             pSrcInfo->stDispWin.width *= 2;
3259         }
3260 #endif
3261         pXCResourcePrivate->stdrvXC_3D._eOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
3262         pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
3263         pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
3264         pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
3265         pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
3266         pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
3267 #if (HW_DESIGN_3D_VER < 2)
3268         MDrv_XC_Enable_3D_LR_Sbs2Line(pInstance, DISABLE);
3269 #endif
3270     }
3271     return bRet;
3272 }
3273 
MDrv_SC_3D_AdjustHShift(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3274 void MDrv_SC_3D_AdjustHShift(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
3275 {
3276     MS_ASSERT(eWindow < MAX_WINDOW);
3277     MS_ASSERT(pSrcInfo);
3278 
3279     if(pSrcInfo == NULL)
3280     {
3281         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3282         return;
3283     }
3284 
3285     if(eWindow >= MAX_WINDOW)
3286     {
3287         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3288         return;
3289     }
3290     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3291     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3292     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3293     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3294 #if (HW_DESIGN_3D_VER < 2)
3295     if((IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
3296        ||  (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
3297     {
3298         pXCResourcePrivate->stdrvXC_3D._u163DHShift = (pXCResourcePrivate->stdrvXC_3D._u163DHShift + 1) & ~1;
3299         pSrcInfo->stCropWin.width -= pXCResourcePrivate->stdrvXC_3D._u163DHShift;
3300         if(MAIN_WINDOW == eWindow)
3301         {
3302             pSrcInfo->stCropWin.x += pXCResourcePrivate->stdrvXC_3D._u163DHShift;
3303         }
3304     }
3305 #if (HW_2DTO3D_SUPPORT == FALSE)
3306     else
3307     {
3308         pXCResourcePrivate->stdrvXC_3D._u163DHShift = (pXCResourcePrivate->stdrvXC_3D._u163DHShift + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3309     }
3310 #endif
3311 #endif
3312 }
3313 
3314 //disable sub window write dnr buffer when no needed
MDrv_SC_3D_SetWriteMemory(void * pInstance,SCALER_WIN eWindow)3315 void MDrv_SC_3D_SetWriteMemory(void *pInstance, SCALER_WIN eWindow)
3316 {
3317     MS_ASSERT(eWindow < MAX_WINDOW);
3318     if(eWindow >= MAX_WINDOW)
3319     {
3320         return;
3321     }
3322     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3323     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3324     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3325     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3326     _XC_ENTRY(pInstance);
3327 
3328 #if (HW_DESIGN_3D_VER >= 2)
3329     if(IS_OUTPUT_TOP_BOTTOM()
3330        || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3331        || IS_OUTPUT_LINE_ALTERNATIVE()
3332        || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3333        || IS_OUTPUT_TOP_BOTTOM_HW()
3334       )
3335     {
3336         Hal_SC_IP_Memory_Write_Request(pInstance, FALSE, SUB_WINDOW);
3337         Hal_SC_IP_Memory_Read_Request(pInstance, FALSE, SUB_WINDOW);
3338     }
3339     else
3340     {
3341         Hal_SC_IP_Memory_Write_Request(pInstance, TRUE, SUB_WINDOW);
3342         Hal_SC_IP_Memory_Read_Request(pInstance, TRUE, SUB_WINDOW);
3343     }
3344 #else
3345     if(SUB_WINDOW == eWindow)
3346     {
3347         if(IS_INPUT_MODE_NONE(eWindow)
3348            || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()
3349                 && (gSrcInfo[eWindow].stCapWin.width == gSrcInfo[eWindow].stDispWin.width))
3350            || IS_INPUT_FRAME_PACKING_OPT(eWindow)
3351            || IS_INPUT_TOP_BOTTOM_OPT(eWindow)
3352            || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3353            || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3354            || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3355            || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3356            || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3357 #if (HW_DESIGN_3D_VER == 1)
3358            || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3359 #endif
3360            )
3361         {// 2D format, sbs in, sbs out centering, framepacking opt,
3362          // or frame alternative in, top bottom out
3363             Hal_SC_IP_Memory_Write_Request(pInstance, TRUE, eWindow);
3364             Hal_SC_IP_Memory_Read_Request(pInstance, TRUE, eWindow);
3365         }
3366         else
3367         {
3368             Hal_SC_IP_Memory_Write_Request(pInstance, FALSE, eWindow);
3369             Hal_SC_IP_Memory_Read_Request(pInstance, FALSE, eWindow);
3370         }
3371     }
3372 #endif
3373 
3374     _XC_RETURN(pInstance);
3375 }
3376 
MDrv_SC_3D_Is2Dto3DCase(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)3377 MS_BOOL MDrv_SC_3D_Is2Dto3DCase(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
3378                                 E_XC_3D_OUTPUT_MODE e3dOutputMode)
3379 {
3380     MS_BOOL bRet = FALSE;
3381 
3382 #if (HW_DESIGN_3D_VER <= 1)
3383     if(((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D) &&
3384         (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3385        ||
3386        ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE) &&
3387         (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3388        ||
3389        ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE_PTP) &&
3390         (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3391        ||
3392        ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D) &&
3393         (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC))
3394       )
3395     {
3396         bRet = TRUE;
3397     }
3398 #endif
3399 
3400     return bRet;
3401 }
3402 
MDrv_SC_3D_CloneMainSettings(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3403 void MDrv_SC_3D_CloneMainSettings(void *pInstance, XC_InternalStatus *pSrcInfo,
3404                                   SCALER_WIN eWindow)
3405 {
3406 
3407     MS_ASSERT(eWindow < MAX_WINDOW);
3408     MS_ASSERT(pSrcInfo);
3409 
3410     if(pSrcInfo == NULL)
3411     {
3412         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3413         return;
3414     }
3415 
3416     if(eWindow == MAX_WINDOW)
3417     {
3418         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3419         return;
3420     }
3421     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3422     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3423     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3424     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3425 #if (HW_DESIGN_3D_VER <= 1)
3426     if(SUB_WINDOW == eWindow)
3427     {
3428         if(IS_OUTPUT_TOP_BOTTOM()
3429            || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3430            || IS_OUTPUT_TOP_BOTTOM_HW()
3431            || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3432            || IS_OUTPUT_FRAME_R())
3433         {
3434             MS_U8 u8Data_Mux = 0;
3435             MS_U8 u8Clk_Mux = 0;
3436             MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3437             Hal_SC_mux_get_mainwin_ip_mux(pInstance, &u8Data_Mux, &u8Clk_Mux);
3438             Hal_SC_set_subwin_ip_mux(pInstance, u8Data_Mux, u8Clk_Mux);
3439             if(MDrv_SC_3D_IsUseSameBuffer(pInstance))
3440             {
3441                 if(pSrcInfo->bInterlace)
3442                 {
3443                     pSrcInfo->eDeInterlaceMode = gSrcInfo[MAIN_WINDOW].eDeInterlaceMode;
3444                 }
3445                 pSrcInfo->u8BitPerPixel = gSrcInfo[MAIN_WINDOW].u8BitPerPixel;
3446             }
3447         }
3448     }
3449 #else
3450     if(IS_OUTPUT_TOP_BOTTOM()
3451        || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3452        || IS_OUTPUT_TOP_BOTTOM_HW()
3453        || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3454        || IS_OUTPUT_LINE_ALTERNATIVE()
3455        || IS_OUTPUT_FRAME_R()
3456       )
3457     {
3458         MS_U8 u8Data_Mux = 0;
3459         MS_U8 u8Clk_Mux = 0;
3460         MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3461         Hal_SC_mux_get_mainwin_ip_mux(pInstance, &u8Data_Mux, &u8Clk_Mux);
3462         Hal_SC_set_subwin_ip_mux(pInstance, u8Data_Mux, u8Clk_Mux);
3463     }
3464     else if(!IS_INPUT_MODE_NONE(MAIN_WINDOW))
3465     {
3466         if (eWindow == MAIN_WINDOW)
3467             MDrv_XC_EnableCLK_for_SUB(pInstance, FALSE);
3468         else
3469             MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3470     }
3471 #endif
3472 }
3473 
MDrv_SC_3D_IsUseSameBuffer(void * pInstance)3474 MS_BOOL MDrv_SC_3D_IsUseSameBuffer(void *pInstance)
3475 {
3476     MS_BOOL bRet = FALSE;
3477 
3478 #if (HW_DESIGN_3D_VER <= 1)
3479     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3480     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3481     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3482     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3483     return (MS_IPM_BASE0(MAIN_WINDOW) == MS_IPM_BASE0(SUB_WINDOW));
3484 #endif
3485 
3486     return bRet;
3487 }
3488 
MDrv_SC_3D_Adjust_MirrorDNROffset(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 * pu16V_SizeAfterPreScaling,MS_U16 * pu16DNROffset,MS_U16 * pu16Ratio,SCALER_WIN eWindow)3489 void MDrv_SC_3D_Adjust_MirrorDNROffset(void *pInstance, XC_InternalStatus *pSrcInfo,
3490                                        MS_U16 *pu16V_SizeAfterPreScaling,
3491                                        MS_U16 *pu16DNROffset,
3492                                        MS_U16 *pu16Ratio,
3493                                        SCALER_WIN eWindow)
3494 {
3495     MS_ASSERT(eWindow < MAX_WINDOW);
3496     MS_ASSERT(pSrcInfo);
3497 
3498     if(pSrcInfo == NULL)
3499     {
3500         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3501         return;
3502     }
3503 
3504     if(eWindow == MAX_WINDOW)
3505     {
3506         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3507         return;
3508     }
3509     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3510     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3511     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3512     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3513 #if (HW_DESIGN_3D_VER >= 2)
3514     if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
3515        || IS_INPUT_TOP_BOTTOM(eWindow))
3516     {
3517         *pu16V_SizeAfterPreScaling /= 2;
3518         *pu16Ratio *= 2;
3519     }
3520     else if(IS_INPUT_FRAME_PACKING(eWindow))
3521     {
3522         MS_U16 u16VactVideo = 0;
3523         MS_U16 u16VactSpace = 0;
3524         MS_U8 u8Ratio = 2;
3525         if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
3526         {
3527             u8Ratio = 4;
3528         }
3529         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
3530     #if (HW_DESIGN_3D_VER == 2)
3531         *pu16V_SizeAfterPreScaling = (*pu16V_SizeAfterPreScaling - u16VactSpace) / u8Ratio;
3532     #else
3533         *pu16V_SizeAfterPreScaling /= u8Ratio;
3534     #endif
3535         *pu16Ratio *= 2;
3536     }
3537     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3538             || IS_INPUT_CHECK_BOARD(eWindow)
3539             || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3540            )
3541     {
3542         *pu16DNROffset = ((*pu16DNROffset / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3543         *pu16Ratio *= 2;
3544     }
3545     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
3546     {
3547         *pu16DNROffset *= 2;
3548         *pu16Ratio *= 1;
3549     }
3550 #else
3551     if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3552          ||(IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3553          ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3554          ||(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
3555          ||(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3556        )
3557     {
3558         *pu16V_SizeAfterPreScaling *= 2;
3559     }
3560 #if (HW_DESIGN_3D_VER == 1)
3561     else if(IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3562     {
3563         MS_U16 u16VactVideo = 0;
3564         MS_U16 u16VactSpace = 0;
3565         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
3566         *pu16V_SizeAfterPreScaling = (*pu16V_SizeAfterPreScaling - u16VactSpace) / 2;
3567         *pu16Ratio *= 2;
3568     }
3569     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3570     {
3571         *pu16DNROffset = ((*pu16DNROffset / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3572         *pu16Ratio *= 2;
3573     }
3574     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3575     {
3576         *pu16V_SizeAfterPreScaling /= 2;
3577         *pu16Ratio *= 2;
3578     }
3579 #endif
3580 #endif
3581 }
3582 
MDrv_SC_3D_AdjustMirrorCrop(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3583 void MDrv_SC_3D_AdjustMirrorCrop(void *pInstance, XC_InternalStatus *pSrcInfo,SCALER_WIN eWindow)
3584 {
3585     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3586     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3587     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3588     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3589 #ifndef DISABLE_3D_FUNCTION
3590     #if (HW_DESIGN_3D_VER >= 1)
3591         if(IS_INPUT_TOP_BOTTOM(eWindow)
3592          || IS_INPUT_FRAME_PACKING(eWindow)
3593          || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3594          || IS_INPUT_LINE_ALTERNATIVE(eWindow))
3595          {
3596              //app set overscan'value that is L crop value,but L and R is two crop'value.
3597               gSrcInfo[eWindow].ScaledCropWin.y = gSrcInfo[eWindow].ScaledCropWin.y * 2;
3598         }
3599          if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3600             || IS_INPUT_CHECK_BOARD(eWindow)
3601             || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3602             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3603             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3604             || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3605          {
3606              gSrcInfo[eWindow].ScaledCropWin.x =gSrcInfo[eWindow].ScaledCropWin.x * 2;
3607         }
3608     #endif
3609  #endif
3610         if( pSrcInfo->u16H_SizeAfterPreScaling > (gSrcInfo[eWindow].ScaledCropWin.x + gSrcInfo[eWindow].ScaledCropWin.width) )
3611         {
3612              gSrcInfo[eWindow].ScaledCropWin.x = pSrcInfo->u16H_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.x + gSrcInfo[eWindow].ScaledCropWin.width);
3613              // select nearest even number
3614         }
3615         else
3616         {
3617              gSrcInfo[eWindow].ScaledCropWin.x = 0;
3618             if(gSrcInfo[eWindow].ScaledCropWin.width > pSrcInfo->u16H_SizeAfterPreScaling)
3619             {
3620                  gSrcInfo[eWindow].ScaledCropWin.width = pSrcInfo->u16H_SizeAfterPreScaling;
3621              }
3622             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Scaled crop[2.a] Force x=%u, width=%u\n",gSrcInfo[eWindow].ScaledCropWin.x, gSrcInfo[eWindow].ScaledCropWin.width);
3623         }
3624 
3625      // for interlace, keep y in multiple of 2
3626      if( pSrcInfo->u16V_SizeAfterPreScaling > (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height) )
3627      {
3628 #if SUPPORT_SEAMLESS_ZAPPING
3629         if( gSrcInfo[eWindow].bInterlace || Hal_SC_IsPX2MemFormat(pInstance, eWindow))
3630 #elif (HW_DESIGN_4K2K_VER == 4)
3631         if(gSrcInfo[eWindow].bInterlace
3632            &&
3633            (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
3634              ||(psXCInstPri->u32DeviceID == 1)))
3635 #else
3636         if(gSrcInfo[eWindow].bInterlace )
3637 #endif
3638          {
3639              gSrcInfo[eWindow].ScaledCropWin.y = (pSrcInfo->u16V_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height) + 1) & ~0x1;
3640          }
3641          else
3642          {
3643              gSrcInfo[eWindow].ScaledCropWin.y = (pSrcInfo->u16V_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height));
3644          }
3645      }
3646      else
3647      {
3648          gSrcInfo[eWindow].ScaledCropWin.y = 0;
3649          if(gSrcInfo[eWindow].ScaledCropWin.height > pSrcInfo->u16V_SizeAfterPreScaling)
3650          {
3651              gSrcInfo[eWindow].ScaledCropWin.height = pSrcInfo->u16V_SizeAfterPreScaling;
3652          }
3653          XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Scaled crop[2.b] Force y=%u, height=%u\n",gSrcInfo[eWindow].ScaledCropWin.y, gSrcInfo[eWindow].ScaledCropWin.height);
3654      }
3655 #ifndef DISABLE_3D_FUNCTION
3656     #if (HW_DESIGN_3D_VER >= 1)
3657          if(IS_INPUT_TOP_BOTTOM(eWindow)
3658             || IS_INPUT_FRAME_PACKING(eWindow)
3659             || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3660             || IS_INPUT_LINE_ALTERNATIVE(eWindow))
3661         {
3662              gSrcInfo[eWindow].ScaledCropWin.y /= 2;
3663         }
3664         if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3665             || IS_INPUT_CHECK_BOARD(eWindow)
3666             || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3667             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3668             || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3669             || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3670         {
3671             gSrcInfo[eWindow].ScaledCropWin.x /= 2;
3672         }
3673     #endif
3674  #endif
3675 }
3676 
3677 // In Side by Side input case,  DNROffset will be divided into half.
MDrv_SC_3D_Adjust_DNROffset(void * pInstance,MS_U16 * pu16DNROffsetTemp,MS_U16 * pu16DNROffset,SCALER_WIN eWindow)3678 void MDrv_SC_3D_Adjust_DNROffset(void *pInstance, MS_U16 *pu16DNROffsetTemp,MS_U16 *pu16DNROffset, SCALER_WIN eWindow)
3679 {
3680     MS_ASSERT(eWindow < MAX_WINDOW);
3681 
3682     if(eWindow == MAX_WINDOW)
3683     {
3684         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3685         return;
3686     }
3687     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3688     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3689     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3690     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3691 #if (HW_DESIGN_3D_VER >= 2)
3692     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3693         || IS_INPUT_CHECK_BOARD(eWindow)
3694         || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3695         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3696         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3697         || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3698     {
3699         *pu16DNROffsetTemp = ((*pu16DNROffsetTemp / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3700         *pu16DNROffset = *pu16DNROffsetTemp*2;
3701         //In Side by Side input case, main and sub set alignment in same way.But in different
3702         //timing, alignment is different.
3703         //If we just care DNROffset's alignment.HW will set main DNROffset/2 and sub DNROffset/2,
3704         //maybe main's DNROffset isn't alignment.
3705         //eg. 800x600 case:
3706         //if we don't do *pu16DNROffset = *pu16DNROffsetTemp*2.DNROffset is 800,
3707         //HW will give main 400 and sub 400.
3708         //But DNROffsetTemp is 416,so it was croped 16*cropwin.y .
3709     }
3710 #endif
3711 }
3712 
3713 // In Side by Side input case, pixelOffset will be divided into half.
MDrv_SC_3D_Adjust_PixelOffset(void * pInstance,XC_InternalStatus * pSrcInfo,MS_PHY * pu32FRCM_RPixelOffset,MS_U16 * pu16FRCM_ROffset,MS_U16 * pu16FRCM_ROffset3D,MS_BOOL bLeftSide,SCALER_WIN eWindow)3714 void MDrv_SC_3D_Adjust_PixelOffset(void *pInstance, XC_InternalStatus *pSrcInfo,MS_PHY *pu32FRCM_RPixelOffset,MS_U16 *pu16FRCM_ROffset,MS_U16 *pu16FRCM_ROffset3D, MS_BOOL bLeftSide, SCALER_WIN eWindow)
3715 {
3716     MS_ASSERT(eWindow < MAX_WINDOW);
3717 
3718     if(eWindow == MAX_WINDOW)
3719     {
3720         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3721         return;
3722     }
3723     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3724     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3725     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3726     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3727 
3728 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3729     MS_U16 u16Offset = pSrcInfo->u16H_SizeAfterPreScaling;
3730     MS_U32 u32LeftFactor = pSrcInfo->Status2.stMiuDualModCfg.u32LeftFactor;
3731     MS_U32 u32RightFactor = pSrcInfo->Status2.stMiuDualModCfg.u32RightFactor;
3732     if (IsEnableDualMode(eWindow))
3733     {
3734         if (IsHMirrorMode(eWindow))
3735         {
3736             u16Offset = u16Offset*u32RightFactor /(u32RightFactor + u32LeftFactor);
3737             u16Offset = (u16Offset + (OFFSET_PIXEL_ALIGNMENT*2 - 1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 - 1);
3738             if (bLeftSide == TRUE)
3739             {
3740                u16Offset = pSrcInfo->u16H_SizeAfterPreScaling - u16Offset;
3741             }
3742         }
3743         else
3744         {
3745             u16Offset = u16Offset*u32LeftFactor /(u32RightFactor + u32LeftFactor);
3746             u16Offset = (u16Offset + (OFFSET_PIXEL_ALIGNMENT*2 - 1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 - 1);
3747             if (bLeftSide == FALSE)
3748             {
3749                u16Offset = pSrcInfo->u16H_SizeAfterPreScaling - u16Offset;
3750             }
3751         }
3752     }
3753 #endif
3754 
3755 #if (HW_DESIGN_3D_VER >= 2)
3756     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3757         || IS_INPUT_CHECK_BOARD(eWindow)
3758         || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3759         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3760         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3761         || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3762     {
3763 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3764         if (IsEnableDualMode(eWindow))
3765         {
3766             *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - u16Offset/2);
3767         }
3768         else
3769 #endif
3770         {
3771             if (Hal_SC_get_pre_align_pixel(pInstance, eWindow)== TRUE)
3772             {
3773 
3774                 *pu32FRCM_RPixelOffset += (gSrcInfo[eWindow].u16IPMFetch - pSrcInfo->u16H_SizeAfterPreScaling)/2;
3775             }
3776             else // disable pre-align
3777             {
3778                 *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - pSrcInfo->u16H_SizeAfterPreScaling/2);
3779             }
3780         }
3781     }
3782     else
3783     {
3784 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3785         if (IsEnableDualMode(eWindow))
3786         {
3787             *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - u16Offset);
3788         }
3789         else
3790 #endif
3791         {
3792             if (Hal_SC_get_pre_align_pixel(pInstance, eWindow)== TRUE)
3793             {
3794                   *pu32FRCM_RPixelOffset += (gSrcInfo[eWindow].u16IPMFetch - pSrcInfo->u16H_SizeAfterPreScaling);
3795             }
3796             else // disable pre-align
3797             {
3798                  *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset - pSrcInfo->u16H_SizeAfterPreScaling);
3799             }
3800         }
3801     }
3802 #endif
3803 }
3804 // In Side by Side input case,main and sub's Cropwinwidth are 1/2;
MDrv_SC_3D_Adjust_CropWinWidth(void * pInstance,MS_U16 * pu16CropWinWidth,SCALER_WIN eWindow)3805 void MDrv_SC_3D_Adjust_CropWinWidth(void *pInstance, MS_U16 *pu16CropWinWidth,SCALER_WIN eWindow)
3806 {
3807     MS_ASSERT(eWindow < MAX_WINDOW);
3808 
3809     if(eWindow == MAX_WINDOW)
3810     {
3811         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3812         return;
3813     }
3814     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3815     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3816     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3817     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3818 #if (HW_DESIGN_3D_VER >= 2)
3819     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3820       || IS_INPUT_CHECK_BOARD(eWindow)
3821       || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3822       || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3823       || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3824       || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3825     {
3826         *pu16CropWinWidth /= 2;
3827         if((*pu16CropWinWidth & 0x1)!= 0)
3828         {
3829             *pu16CropWinWidth = (*pu16CropWinWidth+1)& ~1;
3830         }
3831     }
3832 #endif
3833 }
3834 
3835 // In Side by Side input case,main and sub's Fetch are 1/2;
MDrv_SC_3D_Adjust_DualOPMFetch(void * pInstance,MS_U16 * pu16Fetch,SCALER_WIN eWindow)3836 void MDrv_SC_3D_Adjust_DualOPMFetch(void *pInstance, MS_U16 *pu16Fetch,SCALER_WIN eWindow)
3837 {
3838     MS_ASSERT(eWindow < MAX_WINDOW);
3839 
3840     if(eWindow == MAX_WINDOW)
3841     {
3842         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3843         return;
3844     }
3845     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3846     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3847     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3848     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3849 #if (HW_DESIGN_3D_VER >= 2)
3850     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3851       || IS_INPUT_CHECK_BOARD(eWindow)
3852       || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3853       || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3854       || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3855       || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3856     {
3857         *pu16Fetch /= 2;
3858         if((*pu16Fetch & 0x1)!= 0)
3859         {
3860             *pu16Fetch = (*pu16Fetch+1)& ~1;
3861         }
3862     }
3863 #endif
3864 }
3865 
3866 
3867 // If 3d is enable for (HW_DESIGN_3D_VER >= 2),
3868 // mem unit will split into L and R, so bytesPerPixel should be doubled.
MDrv_SC_3D_Adjust_BytesPer2Pixel(void * pInstance,MS_U8 * u8BytesPer2PixelTemp,SCALER_WIN eWindow)3869 void MDrv_SC_3D_Adjust_BytesPer2Pixel(void *pInstance, MS_U8 *u8BytesPer2PixelTemp,SCALER_WIN eWindow)
3870 {
3871      MS_ASSERT(eWindow < MAX_WINDOW);
3872 
3873     if(eWindow == MAX_WINDOW)
3874     {
3875         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3876         return;
3877     }
3878     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3879     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3880     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3881     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3882  #if (HW_DESIGN_3D_VER >= 2)
3883     //if REG_SC_BK12_30_L bit0 is enabled, we should add into this case.
3884     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3885         || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)
3886         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3887         || IS_INPUT_CHECK_BOARD(eWindow)
3888         || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3889         || IS_INPUT_TOP_BOTTOM(eWindow)
3890         || IS_INPUT_FRAME_PACKING(eWindow)
3891         || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3892         || IS_INPUT_LINE_ALTERNATIVE(eWindow)
3893         || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
3894     {
3895         *u8BytesPer2PixelTemp *= 2;
3896     }
3897 
3898 #endif
3899 
3900 }
3901 
MDrv_SC_3D_Is_LR_Sbs2Line(void * pInstance)3902 MS_BOOL MDrv_SC_3D_Is_LR_Sbs2Line(void *pInstance)
3903 {
3904     MS_BOOL bSbs2Line = FALSE;
3905     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3906     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3907     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3908     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3909     bSbs2Line = Hal_SC_3D_Is_LR_Sbs2Line(pInstance);
3910     if(bSbs2Line != pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line)
3911     {
3912         printf("[%s,%5d] Attention: the variable _bIsLR_Sbs2Line(%u) is different from reg's value(%u)",
3913                __FUNCTION__,__LINE__, pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line, bSbs2Line);
3914     }
3915     return bSbs2Line;
3916 }
3917 
MDrv_SC_3D_IsSupportFBL3D()3918 MS_BOOL MDrv_SC_3D_IsSupportFBL3D()
3919 {
3920     return HW_3D_SUPPORT_FBL;
3921 }
3922 #endif
MApi_SC_3D_Is_Skip_Default_LR_Flag_U2(void * pInstance)3923 MS_BOOL MApi_SC_3D_Is_Skip_Default_LR_Flag_U2(void* pInstance)
3924 {
3925     MS_BOOL bReturn = FALSE;
3926     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3927     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3928     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3929 
3930     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
3931     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3932 #ifndef DISABLE_3D_FUNCTION
3933     bReturn = pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag;
3934 #else
3935     bReturn = FALSE;
3936 #endif
3937     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3938     return bReturn;
3939 }
3940 
MApi_SC_3D_Is_Skip_Default_LR_Flag(void)3941 MS_BOOL MApi_SC_3D_Is_Skip_Default_LR_Flag(void)
3942 {
3943     if (pu32XCInst == NULL)
3944     {
3945         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
3946         return FALSE;
3947     }
3948 
3949     stXC_CHECK_3D_SKIP_DEFAULT_LR_FLAG XCArgs;
3950     XCArgs.bReturnValue = FALSE;
3951 
3952     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_SKIP_DEFAULT_LR_FLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
3953     {
3954         printf("Obtain XC engine fail\n");
3955         return FALSE;
3956     }
3957     else
3958     {
3959         return XCArgs.bReturnValue;
3960     }
3961 }
3962 
3963 
MApi_XC_3D_Enable_Skip_Default_LR_Flag_U2(void * pInstance,MS_BOOL bEnable)3964 MS_BOOL MApi_XC_3D_Enable_Skip_Default_LR_Flag_U2(void* pInstance, MS_BOOL bEnable)
3965 {
3966     MS_BOOL bReturn = FALSE;
3967     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3968     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3969     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3970 
3971     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
3972     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3973 #ifndef DISABLE_3D_FUNCTION
3974     pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag = bEnable;
3975     bReturn = TRUE;
3976 #else
3977     UNUSED(bEnable);
3978     bReturn = FALSE;
3979 #endif
3980     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3981     return bReturn;
3982 }
3983 
MApi_XC_3D_Enable_Skip_Default_LR_Flag(MS_BOOL bEnable)3984 MS_BOOL MApi_XC_3D_Enable_Skip_Default_LR_Flag(MS_BOOL bEnable)
3985 {
3986     if (pu32XCInst == NULL)
3987     {
3988         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
3989         return FALSE;
3990     }
3991 
3992     stXC_SET_3D_SKIP_DEFAULT_LR_FLAG XCArgs;
3993     XCArgs.bEnable = bEnable;
3994     XCArgs.bReturnValue = FALSE;
3995 
3996     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_SKIP_DEFAULT_LR_FLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
3997     {
3998         printf("Obtain XC engine fail\n");
3999         return FALSE;
4000     }
4001     else
4002     {
4003         return XCArgs.bReturnValue;
4004     }
4005 }
4006 
4007 #ifndef DISABLE_3D_FUNCTION
4008 //------------------------------------------------------------------------------
4009 //--------HW 2D to 3D CPU Depth Refine Part Begin-------------------------------
4010 //------------------------------------------------------------------------------
4011 //------------------------------------------------------------------------------
4012 // the following part codes is copied from ursa5
4013 #if HW_2DTO3D_SUPPORT
4014 #define PIXELNUMOFBLOCK 32
4015 #define MAXFRAME_3DDETECT_COMPATIBLE 64
4016 #define MAXFRAME_3DDETECT            80
4017 #define PERCENTAGE_3DDETECT          88
4018 #define DRBYTENUM       64
4019 #define DDBYTENUM       32
4020 #define MAXVALUE        255
4021 
4022 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam);
4023 
4024 #if (HW_2DTO3D_VER < 3) //old 2d to 3d architecture
4025 
4026 #define NBLK_H ((MIN(gSrcInfo[MAIN_WINDOW].stDispWin.width, 1920) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //60 for full hd panel, 43 for sd panel
4027 #define NBLK_V ((MIN(gSrcInfo[MAIN_WINDOW].stDispWin.height, 1080) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //34 for full hd panel, 24 for sd panel
4028 
minmax(MS_U32 u32X,MS_U32 u32Min,MS_U32 u32Max)4029 static MS_U32 minmax(MS_U32 u32X, MS_U32 u32Min, MS_U32 u32Max)
4030 {
4031    return (u32X <= u32Min) ? u32Min :
4032           (u32X >= u32Max) ? u32Max : u32X;
4033 }
4034 
max(MS_U32 u32A,MS_U32 u32B)4035 static MS_U32 max(MS_U32 u32A, MS_U32 u32B)
4036 {
4037    return (u32A <= u32B) ? u32B : u32A;
4038 }
4039 
min(MS_U32 u32A,MS_U32 u32B)4040 static MS_U32 min(MS_U32 u32A, MS_U32 u32B)
4041 {
4042    return (u32A <= u32B) ? u32A : u32B;
4043 }
4044 
absdiff(MS_S32 a,MS_S32 b)4045 static MS_U32 absdiff(MS_S32 a, MS_S32 b)
4046 {
4047     return abs(a - b);
4048 }
4049 
slope_gen(void * pInstance,MS_U8 i,MS_U8 u8Slope,MS_U8 u8Element,MS_U8 u8ModSel,MS_U8 u8Motion)4050 static MS_U32 slope_gen(void *pInstance, MS_U8 i,
4051                         MS_U8 u8Slope,
4052                         MS_U8 u8Element,
4053                         MS_U8 u8ModSel,
4054                         MS_U8 u8Motion)
4055 {
4056     MS_U32 u32Rnd = 1;
4057     MS_U32 u32Tmp = (MS_U32)i * u8Slope;
4058     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4059     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4060     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4061     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4062     if (IsVMirrorMode(MAIN_WINDOW))
4063     {
4064        u32Tmp = (MS_U32)(VBLOCKNUM - 1 - i) * u8Slope;
4065     }
4066 
4067     if(u8Motion != 0)
4068     {
4069         u32Rnd = (u8ModSel == 0) ? u8Element >> 4:
4070                  (u8ModSel == 1) ? u8Element >> 3:
4071                  (u8ModSel == 2) ? u8Element >> 2:
4072                                    u8Element >> 1;
4073         u32Tmp = u32Tmp + u32Rnd;
4074         u32Tmp = (u32Tmp > MAXVALUE) ? MAXVALUE : u32Tmp;
4075     }
4076     return u32Tmp;
4077 }
4078 
remap(void * pInstance,MS_U8 u8Cls,MS_U8 u8BlkHght,MS_U8 u8BlkWdth,MS_U8 i,MS_U8 j,MS_U8 u8NrmlEn)4079 static MS_U8 remap(void *pInstance, MS_U8 u8Cls,
4080                    MS_U8 u8BlkHght,
4081                    MS_U8 u8BlkWdth,
4082                    MS_U8 i,
4083                    MS_U8 j,
4084                    MS_U8 u8NrmlEn)//i: block line number, j: block idx
4085 {
4086     MS_U32 u32Idx = 0;
4087     MS_U8 u8Shift = 0;
4088     MS_U32 u32MapIdx = 0;
4089     MS_U8 u8Result = 0;
4090     MS_U8 u8Bln_u = 0;
4091     MS_U8 u8Bln_d = 0;
4092     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4093     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4094     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4095     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4096     if(pXCResourcePrivate->stdrvXC_3D.s_u8flg == 0)
4097     {
4098         MS_U16 u16TotalBlock = HBLOCKNUM * VBLOCKNUM;
4099         for(u32Idx = 0; u32Idx < MAXINDEX; u32Idx++)
4100         {
4101             pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[u32Idx] = 0;
4102             pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[u32Idx] = 0;
4103         }
4104         for(u32Idx = 0; u32Idx < u16TotalBlock; u32Idx++)
4105         {
4106             pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u32Idx] = 0;
4107         }
4108         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum = 0;
4109         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum = 0;
4110         pXCResourcePrivate->stdrvXC_3D.s_u8flg = 1;
4111     }
4112     pXCResourcePrivate->stdrvXC_3D.s_u8Ptr = pXCResourcePrivate->stdrvXC_3D.s_u8Ptr + 1;
4113     u8Shift = (i == 5) ? u8BlkWdth-1 :
4114             (i == 6) ? u8BlkWdth-2 :
4115             (i == 7) ? u8BlkWdth-3 :
4116             (i >= 8) ? u8BlkWdth-4 : 0;
4117 
4118     u32MapIdx = i * u8BlkWdth + ( (j + u8Shift) % u8BlkWdth );
4119     u8Result = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u8Cls][u32MapIdx];
4120 
4121     // noise reduction start
4122     if(i == 0 && j == 0)
4123     {
4124         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur / ((u8BlkHght - 1) * u8BlkWdth);
4125         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse / u8BlkWdth;
4126         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum
4127                                                            + pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur
4128                                                            - pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr];
4129         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr] = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur;
4130         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum
4131                                                            + pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse
4132                                                            - pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr];
4133         pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr] = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse;
4134         pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias = (MS_U8)( (pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum >> 8)
4135                                                                  - (pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum >> 8));
4136     }
4137 
4138     pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur = (i == 1 && j == 0) ? u8Result :
4139                       (i != 0) ? pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur + (MS_U32)u8Result : pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur;
4140 
4141     pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse = (i == 0 && j == 0) ? u8Result :
4142                       (i == 0) ? pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse + (MS_U32)u8Result : pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse;
4143 
4144     u8Result = ((u8NrmlEn & 0x02) == 2) ? pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias :
4145                 ( (u8NrmlEn & 0x01) == 1 && i != 0) ? u8Result - pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias : u8Result;
4146 
4147     pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[i * u8BlkWdth + j] = u8Result;
4148     u8Bln_u = (i == 0) ? 0 : i - 1;
4149     u8Bln_d = (i == u8BlkHght - 1) ? u8BlkHght - 1 : i + 1;
4150     u8Bln_u = pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u8Bln_u * u8BlkWdth + j];
4151     u8Bln_d = pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u8Bln_d * u8BlkWdth + j];
4152 
4153     u8Result = ( (u8NrmlEn & 0x04) == 4) ? ((u8Bln_u + (u8Result  << 1) + u8Bln_d) >> 2 ) : u8Result;
4154     // noise reduction end
4155 
4156     return u8Result;
4157 }
4158 
lpf3x3(void * pInstance,MS_U32 u32YY,MS_U32 u32XX,MS_U32 u32Index)4159 static MS_U32 lpf3x3(void *pInstance, MS_U32 u32YY, MS_U32 u32XX, MS_U32 u32Index)
4160 {
4161     MS_U32 d_r = 0, d_l = 0, d_c = 0;
4162     MS_U32 u_r = 0, u_l = 0, u_c = 0;
4163     MS_U32 c_r = 0, c_l = 0, c_c = 0;
4164     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4165     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4166     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4167     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4168     c_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX - 1];
4169     c_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX];
4170     c_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX + 1];
4171     u_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX - 1];
4172     u_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX];
4173     u_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX + 1];
4174     d_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX - 1];
4175     d_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX];
4176     d_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX + 1];
4177 
4178     c_l = (u32XX == 0) ? c_c : c_l;
4179     c_r = (u32XX == HBLOCKNUM - 1) ? c_c : c_r;
4180     u_l = ((u32YY == 0) || (u32XX == 0)) ? c_c : u_l;
4181     u_r = ((u32YY == 0) || (u32XX == HBLOCKNUM - 1)) ? c_c : u_r;
4182     u_c = (u32YY == 0) ? c_c : u_c;
4183     d_l = ((u32YY == VBLOCKNUM - 1) || (u32XX == 0)) ? c_c : d_l;
4184     d_r = ((u32YY == VBLOCKNUM - 1) || (u32XX == HBLOCKNUM - 1)) ? c_c : d_r;
4185     d_c = (u32YY == VBLOCKNUM - 1) ? c_c : d_c;
4186     c_c = (u_r + u_c + u_l +
4187            c_r + c_c + c_l +
4188            d_r + d_c + d_l) >> 4;
4189 
4190     return c_c;
4191 }
4192 
4193 #if 0
4194 static MS_U32 yslp_func(MS_U32 u32VDirEn,
4195                         MS_U32 u32VDirPn,
4196                         MS_U32 u32VDirStrd,
4197                         MS_U32 u32BuildFlag,
4198                         MS_U32 u32YAxis,
4199                         MS_U32 u32Result)
4200 {
4201     MS_U32 u32Slope = (u32VDirPn) ? (VBLOCKNUM - u32YAxis) : u32YAxis;
4202     MS_U32 u32YResult = (u32BuildFlag) ? u32Result : (u32Slope * u32VDirStrd + ( u32Result - 128 ) / 4 );
4203     return u32Result = (u32VDirEn) ? u32YResult : u32Result;
4204 }
4205 
4206 static MS_U32 vlpf1x3(MS_U32 u32YY, MS_U32 u32XX, MS_U32 u32Index, MS_U32 u32FltrEn)
4207 {
4208     MS_U32 d_c = 0;
4209     MS_U32 u_c = 0;
4210     MS_U32 c_c = 0;
4211 
4212     c_c = _u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX];
4213     u_c = _u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX];
4214     d_c = _u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX];
4215 
4216     if(u32FltrEn)
4217     {
4218         u_c = (u32YY == 0)?c_c:u_c;
4219         d_c = (u32YY == 33)?c_c:d_c;
4220         c_c = (u_c + (c_c << 1) + d_c) >> 2;
4221     }
4222     return c_c;
4223 }
4224 #endif
4225 
4226 #define NBLK_PITCH 60 //pitch block for 2d to 3d hw engine
4227 #define COEF (100 * (NBLK_H / 2 - 4) * (NBLK_V - 4) / ((HBLOCKNUM / 2 - 4) * (VBLOCKNUM - 4))) //derived from full hd panel
4228 
_MDrv_SC_3D_SourceDetection(void * pInstance)4229 static void _MDrv_SC_3D_SourceDetection(void *pInstance)
4230 {
4231     MS_U16 i = 0, j = 0;
4232     MS_U16 u16C_Index  = 0;
4233     MS_U8 u8Detect_Con = 0;
4234     MS_U8 u8Diff_Th = 8;
4235     MS_U8 u8Reg_A = 0;
4236     MS_U8 u8Reg_B1 = 0, u8Reg_B2 = 0, u8Reg_B3 = 0, u8Reg_B4 = 0, u8Reg_B5 = 0;
4237     MS_U8 u8Reg_C1 = 0;
4238     MS_U8 u8Diff_Frame = 0;
4239     MS_U16 u16Sum_Tb = 0;
4240     MS_U16 u16Sum_Ss = 0;
4241     MS_U16 u16Sum_Ss_Mir = 0;
4242     MS_U16 u16Sum_Tb_1 = 0;
4243     MS_U16 u16Sum_Tb_2 = 0;
4244     MS_U16 u16Sum_Tb_3 = 0;
4245     MS_U16 u16Sum_Tb_4 = 0;
4246     MS_U16 u16Sum_Tb_5 = 0;
4247     MS_U16 u16Sum_Ss_1 = 0;
4248     MS_U16 u16Sum_Ss_2 = 0;
4249     MS_U16 u16Sum_Ss_3 = 0;
4250     MS_U16 u16Sum_Ss_4 = 0;
4251     MS_U16 u16Sum_Ss_5 = 0;
4252     MS_U16 u16Diff_Ss  = 0;
4253     MS_U16 u16HBlockShift = 0;
4254     MS_U16 u16VBlockShift = 0;
4255     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4256     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4257     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4258     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4259     if(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan)
4260     {
4261         if(gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc > 0)
4262         {
4263             u16HBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.x
4264                                  * gSrcInfo[MAIN_WINDOW].u16HCusScalingDst
4265                                  / gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc / PIXELNUMOFBLOCK;
4266         }
4267 
4268         if(gSrcInfo[MAIN_WINDOW].u16VCusScalingSrc > 0)
4269         {
4270             u16VBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.y
4271                                  * gSrcInfo[MAIN_WINDOW].u16VCusScalingDst
4272                                  / gSrcInfo[MAIN_WINDOW].u16VCusScalingSrc / PIXELNUMOFBLOCK;
4273         }
4274     }
4275 
4276     if(u16HBlockShift > 2)
4277     {
4278         u16HBlockShift = 2;
4279     }
4280 
4281     if(u16VBlockShift > 2)
4282     {
4283         u16VBlockShift = 2;
4284     }
4285 
4286     if(pXCResourcePrivate->stdrvXC_3D._bResetFrameCount)
4287     {
4288         pXCResourcePrivate->stdrvXC_3D._u16SBSCount = 0;
4289         pXCResourcePrivate->stdrvXC_3D._u16TBCount = 0;
4290         pXCResourcePrivate->stdrvXC_3D._u162DCount = 0;
4291         pXCResourcePrivate->stdrvXC_3D._u16TotalCount = 0;
4292         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = FALSE;
4293     }
4294 
4295     // Detect side by side pattern ================================================
4296     for (i = 2-u16VBlockShift; i < NBLK_V-2-u16VBlockShift; i++)
4297     {
4298         u16Sum_Ss_1 = 0;
4299         u16Sum_Ss_2 = 0;
4300         u16Sum_Ss_3 = 0;
4301         u16Sum_Ss_4 = 0;
4302         u16Sum_Ss_5 = 0;
4303         for (j = 2-u16HBlockShift; j < NBLK_H/2-2-u16HBlockShift; j++)
4304         {
4305             u16C_Index = i*NBLK_PITCH + j;
4306             u8Reg_A = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index];
4307             u8Reg_B1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 - 2 + u16HBlockShift];
4308             u8Reg_B2 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 - 1 + u16HBlockShift];
4309             u8Reg_B3 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + u16HBlockShift];
4310             u8Reg_B4 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + 1 + u16HBlockShift];
4311             u8Reg_B5 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + 2 + u16HBlockShift];
4312             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B1);
4313 
4314             u16Sum_Ss_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_1 + 1 : u16Sum_Ss_1;
4315             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B2);
4316             u16Sum_Ss_2 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_2 + 1 : u16Sum_Ss_2;
4317             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B3);
4318             u16Sum_Ss_3 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_3 + 1 : u16Sum_Ss_3;
4319             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B4);
4320             u16Sum_Ss_4 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_4 + 1 : u16Sum_Ss_4;
4321             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B5);
4322             u16Sum_Ss_5 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_5 + 1 : u16Sum_Ss_5;
4323 
4324             if(j < NBLK_H / 2)
4325             {
4326                 u16C_Index = i*NBLK_PITCH - j;
4327                 u8Reg_C1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H - 1];
4328                 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_C1);
4329                 u16Sum_Ss_Mir = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_Mir + 1 : u16Sum_Ss_Mir; // for mirror case
4330             }
4331         }
4332         u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_2);
4333         u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_3);
4334         u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_4);
4335         u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_5);
4336         u16Sum_Ss = u16Sum_Ss + u16Sum_Ss_1;
4337     }
4338     // ==========================================================================
4339 
4340     u16Sum_Ss_1 = 0;
4341     // Detect top down pattern ================================================
4342     for (i = 2-u16VBlockShift; i < NBLK_V/2-2-u16VBlockShift; i++)
4343     {
4344         u16Sum_Tb_1 = 0;
4345         u16Sum_Tb_2 = 0;
4346         u16Sum_Tb_3 = 0;
4347         u16Sum_Tb_4 = 0;
4348         u16Sum_Tb_5 = 0;
4349         for (j = 2-u16HBlockShift; j < NBLK_H-2-u16HBlockShift; j++)
4350         {
4351             u16C_Index = i*NBLK_PITCH + j;
4352             u8Reg_A = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index];
4353             u16C_Index = u16C_Index + NBLK_V / 2 * NBLK_PITCH;
4354             u8Reg_B1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index - 2 + u16HBlockShift];
4355             u8Reg_B2 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index - 1 + u16HBlockShift];
4356             u8Reg_B3 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + u16HBlockShift];
4357             u8Reg_B4 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + 1 + u16HBlockShift];
4358             u8Reg_B5 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + 2 + u16HBlockShift];
4359             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B1);
4360             u16Sum_Tb_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_1 + 1 : u16Sum_Tb_1;
4361             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B2);
4362             u16Sum_Tb_2 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_2 + 1 : u16Sum_Tb_2;
4363             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B3);
4364             u16Sum_Tb_3 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_3 + 1 : u16Sum_Tb_3;
4365             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B4);
4366             u16Sum_Tb_4 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_4 + 1 : u16Sum_Tb_4;
4367             u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B5);
4368             u16Sum_Tb_5 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_5 + 1 : u16Sum_Tb_5;
4369 
4370             if(i < NBLK_V / 2)
4371             {
4372                 u8Reg_C1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][(NBLK_V - 1 - i)*NBLK_PITCH + j];
4373                 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_C1);
4374                 u16Sum_Ss_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_1 + 1 : u16Sum_Ss_1; // for mirror case
4375             }
4376         }
4377         u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_2);
4378         u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_3);
4379         u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_4);
4380         u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_5);
4381         u16Sum_Tb= u16Sum_Tb + u16Sum_Tb_1;
4382     }
4383     // ==========================================================================
4384 
4385     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16Sum_Tb=%u, u16Sum_Ss=%u, mirror_ss=%u, mirror_tb=%u\n", u16Sum_Tb, u16Sum_Ss, u16Sum_Ss_Mir, u16Sum_Ss_1);
4386 
4387     // Make decision
4388     if(absdiff(u16Sum_Tb, u16Sum_Ss)>=100*COEF/100)
4389     {
4390         if((u16Sum_Ss < 50*COEF/100) && ((u16Sum_Ss*8) < u16Sum_Tb))
4391         {
4392             u8Detect_Con = 1; // Source : SS
4393         }
4394         else if((u16Sum_Ss < 100*COEF/100) && ((u16Sum_Ss*3) < u16Sum_Tb))
4395         {
4396             u8Detect_Con = 1; // Source : SS
4397         }
4398         else if((u16Sum_Ss < 150*COEF/100) && ((u16Sum_Ss*12/5) < u16Sum_Tb))
4399         {
4400             u8Detect_Con = 1; // Source : SS
4401         }
4402         else if((u16Sum_Ss < 200*COEF/100) && ((u16Sum_Ss*9/4) < u16Sum_Tb))
4403         {
4404             u8Detect_Con = 1; // Source : SS
4405         }
4406         else if((u16Sum_Ss < 250*COEF/100) && ((u16Sum_Ss*2) < u16Sum_Tb))
4407         {
4408             u8Detect_Con = 1; // Source : SS
4409         }
4410         else if(u16Sum_Ss*2 < u16Sum_Tb)
4411         {
4412             u8Detect_Con = 1; // Source : SS
4413         }
4414         else if((u16Sum_Tb < 50*COEF/100) && ((u16Sum_Tb*8) < u16Sum_Ss))
4415         {
4416             u8Detect_Con = 2; // Source : TB
4417         }
4418         else if((u16Sum_Tb < 100*COEF/100) && ((u16Sum_Tb*3) < u16Sum_Ss))
4419         {
4420             u8Detect_Con = 2; // Source : TB
4421         }
4422         else if((u16Sum_Tb < 150*COEF/100) && ((u16Sum_Tb*9/4) < u16Sum_Ss))
4423         {
4424             u8Detect_Con = 2; // Source : TB
4425         }
4426         else if((u16Sum_Tb < 220*COEF/100) && ((u16Sum_Tb*2) < u16Sum_Ss))
4427         {
4428             u8Detect_Con = 2; // Source : TB
4429         }
4430         else if((u16Sum_Tb < 250*COEF/100) && ((u16Sum_Tb*9/5) < u16Sum_Ss))
4431         {
4432             u8Detect_Con = 2; // Source : TB
4433         }
4434         else if(u16Sum_Tb*2 < u16Sum_Ss)
4435         {
4436             u8Detect_Con = 2; // Source : TB
4437         }
4438         else
4439         {
4440             u8Detect_Con = 3; // Source : 2D
4441             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 1\n");
4442         }
4443     }
4444     else
4445     {
4446         if((u16Sum_Ss < 50*COEF/100) && ((u16Sum_Ss*8) < u16Sum_Tb))
4447         {
4448             u8Detect_Con = 1; // Source : SS
4449         }
4450         else if((u16Sum_Tb < 50*COEF/100) && ((u16Sum_Tb*8) < u16Sum_Ss))
4451         {
4452             u8Detect_Con = 2; // Source : TB
4453         }
4454         else
4455         {
4456             u8Detect_Con = 3; // Source : 2D
4457             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 2\n");
4458         }
4459     }
4460 
4461     // Correct some wrong decision
4462     u16Diff_Ss = absdiff(u16Sum_Ss, u16Sum_Ss_Mir);
4463 
4464     if((u8Detect_Con == 2) && (u16Sum_Ss_1 <= u16Sum_Tb*9/5))
4465     {
4466         u8Detect_Con = 3; // Source : 2D
4467         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 3\n");
4468     }
4469     else if((u8Detect_Con == 1) && (u16Diff_Ss < 40*COEF/100) && (u16Sum_Ss_Mir < 250*COEF/100))
4470     {
4471         u8Detect_Con = 3; // Source : 2D
4472         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 4\n");
4473     }
4474     else if((u8Detect_Con==3) && (u16Sum_Ss_Mir > u16Sum_Ss*3/2) && (u16Sum_Ss*3/2 < u16Sum_Tb))
4475     {
4476         u8Detect_Con = 1; // Source : SS
4477     }
4478     else if((u8Detect_Con==3) && (u16Sum_Ss_1 > u16Sum_Tb*3/2) && (u16Sum_Tb*3/2 < u16Sum_Ss))
4479     {
4480         u8Detect_Con = 2; // Source : TB
4481     }
4482 
4483     ///frame statistics
4484     pXCResourcePrivate->stdrvXC_3D._u16TotalCount++;
4485     if(u8Detect_Con == 1)
4486     {
4487         pXCResourcePrivate->stdrvXC_3D._u16SBSCount++;
4488     }
4489     else if(u8Detect_Con == 2)
4490     {
4491         pXCResourcePrivate->stdrvXC_3D._u16TBCount++;
4492     }
4493     else if(u8Detect_Con == 3)
4494     {
4495         pXCResourcePrivate->stdrvXC_3D._u162DCount++;
4496     }
4497 
4498     if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4499     {
4500         if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT)
4501         {
4502             pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
4503             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
4504                                                 , pXCResourcePrivate->stdrvXC_3D._u162DCount
4505                                                 , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
4506                                                 , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
4507             if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
4508                 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4509             {
4510                 if(pXCResourcePrivate->stdrvXC_3D._u16SBSCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
4511                 {
4512                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
4513                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
4514                     MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
4515                 }
4516                 else
4517                 {
4518                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4519                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4520                 }
4521             }
4522             else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
4523                     && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4524             {
4525                 if(pXCResourcePrivate->stdrvXC_3D._u16TBCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
4526                 {
4527                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
4528                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
4529                     MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
4530                 }
4531                 else
4532                 {
4533                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4534                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4535                 }
4536             }
4537             else
4538             {
4539                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4540                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4541             }
4542         }
4543     }
4544     else if(E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4545     {
4546         if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT_COMPATIBLE)
4547         {
4548             pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
4549             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
4550                                               , pXCResourcePrivate->stdrvXC_3D._u162DCount
4551                                               , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
4552                                               , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
4553             if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
4554                 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4555             {
4556                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
4557                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
4558             }
4559             else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
4560                 && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4561             {
4562                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
4563                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
4564             }
4565             else
4566             {
4567                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4568                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4569             }
4570             pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount++;
4571         }
4572     }
4573 }
4574 
_MDrv_SC_3D_2DTo3D_Art_Detect(void * pInstance)4575 static MS_U32 _MDrv_SC_3D_2DTo3D_Art_Detect(void* pInstance)
4576 {
4577     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4578     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4579     MS_U32 i = 0;
4580     MS_U32 u32HisgrmArray[16];
4581     MS_U32 u32XStart =  512;
4582     MS_U32 u32XEnd   =  1408;    //896
4583     MS_U32 u32YStart =  256;     //640
4584     MS_U32 u32YEnd   =  896;
4585     MS_U32 u32PureColorBlkCnt = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3D_L); //16bit 3d => 8bit 7a,7b
4586     MS_U32 u32GradLevelBlkCnt = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3E_L); //16bit 3e => 8bit 7c,7d
4587     MS_U32 u32HighFreqBlkCnt  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3F_L); //16bit 3f => 8bit 7e,7f
4588     MS_U32 u32HisWeightCur = 0;
4589     MS_U32 u32MinRatio = 0;
4590     MS_U32 u32NonSmallHistogramCnt = 0;
4591     MS_U32 u32NonzeroHistogramCnt = 0;
4592     MS_U32 u32BiggestHistogram = 0;
4593     MS_U32 u32BiggestHistogramIdx = 0;
4594     MS_U32 u32SecondHistogram = 0;
4595     MS_U32 u32SecondHistogramIdx = 0;
4596     MS_U32 u32ThirdHistogram = 0;
4597     MS_U32 u32TempRatio1 = 0;
4598     MS_U32 u32TempRatio2 = 0;
4599     MS_U32 u32ArtWeightCurHF = 0;    // HF weight
4600     MS_U32 u32ArtIndex = 0;
4601     MS_U32 u32ArtWeightCurAll = 0;
4602     MS_U32 u32ArtWeightCur = 0;
4603     MS_U32 u32X1        = 0;
4604     MS_U32 u32DBit0     =  0;
4605     MS_U32 u32DBit1     =  0;
4606     MS_U32 u32DBit2     =  0;
4607     MS_U32 u32DBit3     =  0;
4608     MS_U32 u32DitherOut =  0;
4609     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4610     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4611     // read histogram
4612     u32HisgrmArray[0] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_30_L, 0xFF00) >> 8;
4613     u32HisgrmArray[1] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_30_L, 0x00FF);
4614     u32HisgrmArray[2] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_31_L, 0xFF00) >> 8;
4615     u32HisgrmArray[3] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_31_L, 0x00FF);
4616     u32HisgrmArray[4] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_32_L, 0xFF00) >> 8;
4617     u32HisgrmArray[5] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_32_L, 0x00FF);
4618     u32HisgrmArray[6] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_33_L, 0xFF00) >> 8;
4619     u32HisgrmArray[7] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_33_L, 0x00FF);
4620     u32HisgrmArray[8] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_34_L, 0xFF00) >> 8;
4621     u32HisgrmArray[9] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_34_L, 0x00FF);
4622     u32HisgrmArray[10] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_35_L, 0xFF00) >> 8;
4623     u32HisgrmArray[11] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_35_L, 0x00FF);
4624     u32HisgrmArray[12] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_36_L, 0xFF00) >> 8;
4625     u32HisgrmArray[13] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_36_L, 0x00FF);
4626     u32HisgrmArray[14] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_37_L, 0xFF00) >> 8;
4627     u32HisgrmArray[15] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_37_L, 0x00FF);
4628 
4629     //------------- Set Detection Window --------------------------
4630     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_28_L, u32XStart);
4631     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_29_L, u32XEnd);
4632     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_2A_L, u32YStart);
4633     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_2B_L, u32YEnd);
4634 
4635     u32X1 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x01000000) >> 24) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00001000) >> 12);
4636     u32DBit0 =  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000008) >> 3)   ^  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00001000) >> 12);  // bit 3    ^  bit 12
4637     u32DBit1 =  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000040) >> 6)   ^  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00040000) >> 18);  // bit 6    ^  bit 18
4638     u32DBit2 =  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x01000000) >> 24)  ^  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x40000000) >> 30);  // bit 24   ^  bit 30
4639     u32DBit3 =  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000200) >> 9)   ^  ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00100000) >> 20);  // bit  9   ^  bit  20
4640     u32DitherOut =  (u32DBit3 << 3) + (u32DBit2 << 2) + (u32DBit1 << 1) + u32DBit0;
4641 
4642     pXCResourcePrivate->stdrvXC_3D._u32X = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x7fffffff) << 1) + u32X1;
4643 
4644     u32HisWeightCur = 0;
4645     u32SecondHistogram = 0;
4646     u32BiggestHistogram = 0;
4647 
4648     for(i = 0; i < 16; i++)
4649     {
4650         if(u32HisgrmArray[i] >= 0x3)
4651         {
4652             u32NonSmallHistogramCnt++;
4653         }
4654 
4655         if(u32HisgrmArray[i] > 0)
4656         {
4657             u32NonzeroHistogramCnt++;
4658         }
4659 
4660         if(u32HisgrmArray[i] == 0x0)
4661         {
4662             u32HisgrmArray[i] = 0x1;
4663         }
4664 
4665         if(u32HisgrmArray[i] > u32BiggestHistogram)
4666         {
4667             u32BiggestHistogram = u32HisgrmArray[i];
4668             u32BiggestHistogramIdx = i;
4669         }
4670     }
4671 
4672     for(i = 0; i < 16; i++)
4673     {
4674         if(i != u32BiggestHistogramIdx && u32HisgrmArray[i] >= u32SecondHistogram)
4675         {
4676             u32SecondHistogram = u32HisgrmArray[i];
4677             u32SecondHistogramIdx = i;
4678         }
4679     }
4680 
4681     for(i = 0; i < 16; i++)
4682     {
4683         if(i != u32BiggestHistogramIdx && i != u32SecondHistogramIdx && u32HisgrmArray[i] >= u32ThirdHistogram)
4684         {
4685             u32ThirdHistogram = u32HisgrmArray[i];
4686         }
4687     }
4688 
4689     for(i = 0; i < 16; i++)
4690     {
4691         if(i == 0)
4692         {
4693             u32MinRatio = min(u32HisgrmArray[0] / (u32HisgrmArray[1] + u32HisgrmArray[2]), 8);
4694             if(u32HisgrmArray[0] > 2 * u32HisgrmArray[1])
4695             {
4696                 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[0] * u32MinRatio)/64, 8);
4697             }
4698         }
4699         else if (i == 15)
4700         {
4701             u32MinRatio = min(u32HisgrmArray[15] / (u32HisgrmArray[14] + u32HisgrmArray[13]), 8);
4702             if(u32HisgrmArray[15] > 2 * u32HisgrmArray[14])
4703             {
4704                 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[15] * u32MinRatio) / 64, 8);
4705             }
4706         }
4707         else
4708         {
4709             u32MinRatio = min((u32HisgrmArray[i] / ((u32HisgrmArray[i + 1]) + (u32HisgrmArray[i - 1]))), 8);
4710             if((u32HisgrmArray[i] > 2 * u32HisgrmArray[i + 1]) && (u32HisgrmArray[i] > 2 * u32HisgrmArray[i - 1]))
4711             {
4712                 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[i] * u32MinRatio) / 64, 8);
4713             }
4714         }
4715     }
4716 
4717     u32TempRatio1 = (u32BiggestHistogram / (u32SecondHistogram+u32ThirdHistogram + (u32NonzeroHistogramCnt + u32NonSmallHistogramCnt) / 3));
4718     u32TempRatio2 = ((u32BiggestHistogram + u32SecondHistogram)/(u32ThirdHistogram + u32NonzeroHistogramCnt + u32NonSmallHistogramCnt) );
4719 
4720     u32TempRatio1 = min(u32TempRatio1, 12);
4721     u32TempRatio2 = min(u32TempRatio2, 8);
4722 
4723     if(u32TempRatio1 <= 2)
4724     {
4725         u32TempRatio1 = 0;
4726     }
4727     if(u32TempRatio2 <= 3)
4728     {
4729         u32TempRatio2 = 0;
4730     }
4731 
4732     u32HisWeightCur = u32HisWeightCur + u32TempRatio1 + u32TempRatio2;
4733 
4734     if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 4)
4735     {
4736         u32HisWeightCur = u32HisWeightCur / 3;
4737     }
4738     else if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 3)
4739     {
4740        u32HisWeightCur = u32HisWeightCur / 2;
4741     }
4742     else if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 2)
4743     {
4744        u32HisWeightCur = u32HisWeightCur * 2 / 3;
4745     }
4746 
4747     if(u32HisWeightCur <= 5)
4748     {
4749         u32HisWeightCur = 0;
4750     }
4751 
4752     u32HisWeightCur = min(u32HisWeightCur, 15);
4753 
4754     pXCResourcePrivate->stdrvXC_3D._u32HisWeight = (u32HisWeightCur * 1 + pXCResourcePrivate->stdrvXC_3D._u32HisWeight * 15 + u32DitherOut) / 16;
4755 
4756     pXCResourcePrivate->stdrvXC_3D._u32HisWeight     = min(pXCResourcePrivate->stdrvXC_3D._u32HisWeight    , 15);
4757 
4758     if(u32HighFreqBlkCnt >= 450 )
4759     {
4760         u32ArtWeightCurHF = 15;
4761     }
4762     else if(u32HighFreqBlkCnt > 300 )
4763     {
4764         u32ArtWeightCurHF = 8;
4765     }
4766     else
4767     {
4768         u32ArtWeightCurHF = 0;
4769     }
4770 
4771     // All weight
4772     u32ArtIndex = (u32PureColorBlkCnt / 4 * (min(u32HisWeightCur, 8) / 8)) + u32GradLevelBlkCnt;
4773     u32ArtWeightCurAll = 0;
4774     if(u32ArtIndex >= 3500)
4775     {
4776         u32ArtWeightCurAll = 15;
4777     }
4778     else if(u32ArtIndex <= 2600)
4779     {
4780         u32ArtWeightCurAll = 0;
4781     }
4782     else
4783     {
4784         u32ArtWeightCurAll = (u32ArtIndex - 2600) * 15 / 900;
4785     }
4786 
4787     u32ArtWeightCur =max(u32ArtWeightCurHF, u32ArtWeightCurAll);
4788     u32ArtWeightCur = min(u32ArtWeightCur, 15);
4789     pXCResourcePrivate->stdrvXC_3D._u32ArtWeight = (u32ArtWeightCur * 1 + pXCResourcePrivate->stdrvXC_3D._u32ArtWeight * 15 + u32DitherOut) / 16;
4790     pXCResourcePrivate->stdrvXC_3D._u32ArtWeight     = min(pXCResourcePrivate->stdrvXC_3D._u32ArtWeight, 15);
4791     pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur = max(pXCResourcePrivate->stdrvXC_3D._u32HisWeight, pXCResourcePrivate->stdrvXC_3D._u32ArtWeight);
4792     pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur = min(pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur, 15);
4793     pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight     = (pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur + pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight * 7 + (u32DitherOut >> 1)) / 8;
4794 
4795     return pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight;
4796 }
4797 
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)4798 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
4799 {
4800     void *pInstance = pu32XCInst_private;
4801     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4802     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4803     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4804     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4805     MS_U32 i = 0, j = 0;
4806     MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
4807     if(0 == u32DDBase)
4808     {
4809         printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
4810         assert(u32DDBase != 0);
4811     }
4812     MS_VIRT u32DRBase = (MS_U32)MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf);
4813     if(0 == u32DRBase)
4814     {
4815         printf("%s :u32DRBase = 0!,error!!!\n", __FUNCTION__);
4816         assert(u32DRBase != 0);
4817     }
4818     MS_U8  u8DepthMode = 0;
4819     MS_VIRT u32Base =  u32DDBase;
4820     MS_U32 u32ArtWt = 0;
4821     MS_U32 u32NatWt = 0;
4822     MS_U8  u8ArtWt_t = 0;
4823     MS_U8  u8YCtr_Cur = 0;
4824     MS_U8  u8LoopVIndex = VBLOCKNUM;
4825     MS_U8  u8LoopHIndex = HBLOCKNUM;
4826 
4827     eIntNum = eIntNum;
4828     pParam = pParam;
4829 
4830     if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
4831     {
4832         if(pXCResourcePrivate->stdrvXC_3D.bFirstFlag) //initial
4833         {
4834             MS_U16 u16TotalBlock = HBLOCKNUM * VBLOCKNUM;
4835             for(j = 0; j < u16TotalBlock; j++)
4836             {
4837                 pXCResourcePrivate->stdrvXC_3D._32YSumArray[j] = 0;
4838             }
4839 
4840             for(i = 0; i < MAXINDEX; i++)
4841             {
4842                 for(j = 0; j < u16TotalBlock; j++)
4843                 {
4844                     pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[i][j] = 0;
4845                 }
4846             }
4847         }
4848 
4849         for(i = 0; i < VBLOCKNUM; i++)
4850         {
4851             for(j = 0; j < HBLOCKNUM; j++)
4852             {
4853                 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMAX][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YMAXBUFINDEX) + u32Base));//y max
4854                 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMIN][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YMINBUFINDEX) + u32Base));//y min
4855                 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j]  = minmax ((pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMAX][i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMIN][i * HBLOCKNUM + j]), 0, MAXVALUE);
4856 #if 0
4857                 _u8FieldArray[YAVG][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YAVGBUFINDEX) + u32Base));//y avg
4858                 _u8FieldArray[HEDGE][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YHEDGEBUFINDEX) + u32Base));//prog cnt 0
4859                 _u8FieldArray[VEDGE][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YVEDGEBUFINDEX) + u32Base));//prog cnt 1
4860                 _u8FieldArray[BUILDING][i * HBLOCKNUM + j]  = max(_u8FieldArray[HEDGE][i * HBLOCKNUM + j], _u8FieldArray[VEDGE][i * HBLOCKNUM + j]);
4861 #endif
4862                 if(pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled)
4863                 {
4864                     u8YCtr_Cur = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4865                     pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4866                     pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE][i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] >> 8;
4867                     pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4868                 }
4869                 else
4870                 {
4871 #if 1
4872                     u8YCtr_Cur = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4873                     pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4874                     pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] >> 8;
4875                     pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4876 #else
4877                     _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j] = _u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4878 //                    u8YCtr_Cur = _u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4879 //                    _32YSumArray[i * HBLOCKNUM + j] = _32YSumArray[i * HBLOCKNUM + j] - _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4880 //                    _u8FieldArray[YCTRS][i * HBLOCKNUM + j] = _32YSumArray[i * HBLOCKNUM + j] >> 8;
4881 //                    _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4882 #endif
4883                 }
4884             }
4885         }
4886         pXCResourcePrivate->stdrvXC_3D.u8Ptr++;
4887         pXCResourcePrivate->stdrvXC_3D.bFirstFlag = FALSE;
4888 
4889         if (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain != 0)
4890         {
4891             u8ArtWt_t         = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain == MAXARTGAIN) ? MAXARTGAIN + 1 : pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain;
4892             u32ArtWt = _MDrv_SC_3D_2DTo3D_Art_Detect(pInstance);
4893             u32NatWt    = MAXARTGAIN - min((u32ArtWt * u8ArtWt_t) >> 4, MAXARTGAIN);
4894         }
4895         else
4896         {
4897             u32NatWt    = MAXARTGAIN;
4898         }
4899 
4900         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
4901         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
4902 #if (HW_2DTO3D_VER < 2)
4903         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x3F00);//left depth gain:6bits
4904         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x3F00);//right depth gain:6bits
4905 #else
4906         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x7F00);//left depth gain:7bits
4907         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x7F00);//right depth gain:7bits
4908 #endif
4909         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L,BIT(1)))
4910         {
4911             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x7F00, 0x7F00);//left depth offset
4912             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x3F00, 0x7F00);//right depth offset
4913         }
4914         if(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth > 0)
4915         {
4916             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, BIT(7), BIT(7));                               //draw left/right black enable
4917             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth, 0x007F);  //draw left/right black width
4918         }
4919         else
4920         {
4921             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, 0x0000, 0x00FF);  //draw left/right black enable, draw left/right black width
4922         }
4923 
4924         if(IS_OUTPUT_TOP_BOTTOM_HW())
4925         {
4926             u8LoopVIndex = u8LoopVIndex / 2;
4927         }
4928         else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
4929         {
4930             u8LoopHIndex = u8LoopHIndex / 2;
4931         }
4932 
4933         for(i = 0; i < u8LoopVIndex; i++)
4934         {
4935             for(j = 0; j < u8LoopHIndex; j++)
4936             {
4937                 MS_U32 u32Result = 0;
4938                 MS_U8  u8Res = 0;
4939                 if(pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled)
4940                 {
4941                     u8Res = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 0) ? remap(pInstance, YCTRS, VBLOCKNUM, HBLOCKNUM, i, j, 0x05) :
4942                             (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 1) ? remap(pInstance, YAVG,  VBLOCKNUM, HBLOCKNUM, i, j, 0x05) :
4943                             (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 2) ? remap(pInstance, BLUE,  VBLOCKNUM, HBLOCKNUM, i, j, 0x05) : 0;
4944                 }
4945                 else
4946                 {
4947                     pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE][i * HBLOCKNUM + j]    = lpf3x3(pInstance, i,j,YCTRS);
4948                     u8Res = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 0) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i*HBLOCKNUM + j]:
4949                             (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 1) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YAVG ][i*HBLOCKNUM + j]:
4950                             (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 2) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE ][i*HBLOCKNUM + j]: 0;
4951                 }
4952                 switch(u8DepthMode)
4953                 {
4954                     case 0:
4955                         u32Result = slope_gen(pInstance, i, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave, u8Res, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel, 1);// V gradual pattern test
4956                         break;
4957                     case 1:
4958                         u32Result = MAXVALUE - (7 * i);// V gradual pattern test (inverse)
4959                         break;
4960                     case 2:
4961                         u32Result = 4 * j;// H gradual pattern test
4962                         break;
4963                     case 3:
4964                         u32Result = MAXVALUE - (4 * j);// H gradual pattern test (inverse)
4965                         break;
4966                     case 4:
4967                         u32Result = (abs(i - VBLOCKNUM / 2) + abs(j - HBLOCKNUM / 2)) <<3;// center gradual pattern test
4968                         break;
4969                     default:
4970                         u32Result = 7 * i;// V gradual pattern test
4971                         break;
4972                 }
4973 #if 0
4974                 u32Result = minmax(u32Result, 0, MAXVALUE);
4975                 u32Result = (j == 0 || j >= (((gSrcInfo[MAIN_WINDOW].stDispWin.width + PIXELNUMOFBLOCK - 1)/PIXELNUMOFBLOCK)-1)) ? _st3DHw2DTo3DPara.u16Offset : u32Result;//left/rightest side no 2d3d effect
4976                 (*((volatile MS_U8*)((i * DRBYTENUM + j) + u32DRBase))) = u32Result;
4977 #else
4978                 u32Result = minmax(u32Result, 0, MAXVALUE);
4979                 u32Result = ((j == 0) || (j >= (u8LoopHIndex-1))) ? pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset : u32Result;
4980                 (*((volatile MS_U8*)((i * DRBYTENUM + j) + u32DRBase))) = u32Result;
4981                 if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()&&(j == (u8LoopHIndex-1)))   //hardware SBS patch for disorder
4982                 {
4983                     (*((volatile MS_U8*)((i * DRBYTENUM + j+1) + u32DRBase))) = u32Result;
4984                 }
4985 #endif
4986                 if(IS_OUTPUT_TOP_BOTTOM_HW())
4987                 {
4988                     (*((volatile MS_U8*)(((i + u8LoopVIndex) * DRBYTENUM + j) + u32DRBase))) = MAXVALUE - u32Result;
4989                 }
4990                 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
4991                 {
4992                     (*((volatile MS_U8*)((i * DRBYTENUM + j + u8LoopHIndex) + u32DRBase))) = MAXVALUE - u32Result;
4993                 }
4994             }
4995         }
4996         MsOS_FlushMemory();
4997     }
4998     else if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4999                 && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
5000             || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
5001                 && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D))
5002     {
5003         if(!pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank)
5004         {
5005             u32Base += DDBANKOFFSET;
5006         }
5007 
5008         if(pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank)//write bank0 currently, let hw to write bank1 for next frame
5009         {
5010             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0001, 0x000F);   // DD force bank1
5011         }
5012         else
5013         {
5014             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F);   // DD force bank0
5015         }
5016         pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = !pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank;
5017 
5018         for(i = 0; i < VBLOCKNUM; i++)
5019         {
5020             for(j = 0; j < HBLOCKNUM; j++)
5021             {
5022                 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][i * HBLOCKNUM + j]  = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YVEDGEBUFINDEX) + u32Base));//prog cnt 1
5023             }
5024         }
5025         _MDrv_SC_3D_SourceDetection(pInstance);
5026     }
5027 }
5028 
5029 #else //new 2d to 3d architecture
5030 
5031 #define MINMAX(v,a,b)             (((v)<(a))? (a) : ((v)>(b)) ? (b) : (v))
5032 #define MAX3(a,b,c) MAX(a,MAX(b,c))
5033 #define MIN3(a,b,c) MIN(a,MIN(b,c))
5034 #define BLEND128( a, b, r )  ((a*(128-r)+b*r+64)>>7)
5035 #define LBOX_BLKCOLOR 3
5036 #define BLKCOLOR 32
5037 #if (HW_2DTO3D_VER == 4)
5038 #define DISPLAY_DD_H (pXCResourcePrivate->stdrvXC_3D._u16DDHSize)
5039 #define DISPLAY_DD_V (pXCResourcePrivate->stdrvXC_3D._u16DDVSize)
5040 #define NBLK_DD_H ((DISPLAY_DD_H + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd h block
5041 #define NBLK_DD_V ((DISPLAY_DD_V + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd v block
5042 #define NBLK_DD_H_MAX ((1920 + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd max h block
5043 #define NBLK_DD_V_MAX ((1080 + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd max v block
5044 #define NBLK_DR_H (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_H)
5045 #define NBLK_DR_V (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_V)
5046 #define PANEL_WIDTH (pXCResourcePrivate->stdrvXC_3D._u16PanelWidth)
5047 #define PANEL_HEIGHT (pXCResourcePrivate->stdrvXC_3D._u16PanelHeight)
5048 
5049 //#define NBLK_DR_H ((gSrcInfo[MAIN_WINDOW].stDispWin.width + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dr h block
5050 //#define NBLK_DR_V ((gSrcInfo[MAIN_WINDOW].stDispWin.height + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr v block
5051 #else
5052 
_GetCurDispWinWidth(void * pInstance)5053 static MS_U16 _GetCurDispWinWidth(void *pInstance)
5054 {
5055     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5056     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5057     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5058     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5059 
5060     MS_U16 u16MainDispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
5061     MS_WINDOW_TYPE stDispWin;
5062     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5063     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5064     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5065     {
5066         u16MainDispWidth = stDispWin.width;
5067     }
5068     return u16MainDispWidth;
5069 }
_GetCurDispWinHeight(void * pInstance)5070 static MS_U16 _GetCurDispWinHeight(void *pInstance)
5071 {
5072     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5073     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5074     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5075     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5076 
5077     MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
5078     MS_WINDOW_TYPE stDispWin;
5079     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5080     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5081     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5082     {
5083         u16MainDispHeight = stDispWin.height;
5084     }
5085     return u16MainDispHeight;
5086 }
5087 
5088 #define DISPLAY_DD_H MIN(_GetCurDispWinWidth(pInstance), 1920)
5089 #define DISPLAY_DD_V MIN(_GetCurDispWinHeight(pInstance), 1080)
5090 #define NBLK_DD_H ((DISPLAY_DD_H + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd h block
5091 #define NBLK_DD_V ((DISPLAY_DD_V + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dd v block
5092 #define NBLK_DR_H ((_GetCurDispWinWidth(pInstance) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)  //dr h block
5093 #define NBLK_DR_V ((_GetCurDispWinHeight(pInstance) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr v block
5094 #endif
5095 #define NBLK_DD_PITCH  60
5096 #define FHD_W 1920
5097 #define FHD_H 1080
5098 #define DVIEW_WEI 0
5099 #define DVIEW_WEI2 1
5100 #define ENABLE_CrDEPTH 1
5101 #define FRAME_WIDTH_DLC 1920 //need DLC information
5102 #define FRAME_HEIGHT_DLC 1080 //need DLC information
5103 #define HW_2DTO3D_3DDetect_THRESHOLD 20
5104 #define HW_2DTO3D_3DDetect_PERCENTAGE 40
5105 #define PRINTINFO 0
5106 #define BOUNDARY_MODE 1
5107 #define AUTO_ADJUST 0
5108 #define BACKLIGHTIIR 1
5109 #define PATTERN_THRESLD 10
5110 #if (HW_2DTO3D_VER == 4)
5111 //Ursa9 new
5112 #define DUMYGAINCTRL  0//LG use it
5113 
5114 //DepthDectectionBLK
5115 #define MOTIONDETECTION 1
5116 #define OPTIMIZE 1
5117 #endif
5118 typedef enum
5119 {
5120     E_3D_FORMAT_2D,
5121     E_3D_FORMAT_TB,
5122     E_3D_FORMAT_SS,
5123     E_3D_FORMAT_SS_PATTERN,
5124     E_3D_FORMAT_TB_PATTERN,
5125 }EN_3D_FORMAT;
5126 
RGB2YUV(PIXEL stIn)5127 PIXEL RGB2YUV(PIXEL stIn)
5128 {
5129     MS_S32 s32Y = 0, s32U = 0, s32V = 0;
5130     PIXEL stOut;
5131 
5132     stOut.R = 0;
5133     stOut.G = 0;
5134     stOut.B = 0;
5135 
5136     s32Y = ( ( 257*stIn.R + 504*stIn.G +  98*stIn.B +  16000)*4+500 ) / 1000;
5137     s32U = ( (-148*stIn.R - 291*stIn.G + 439*stIn.B + 128000)*4+500 ) / 1000;
5138     s32V = ( ( 439*stIn.R - 368*stIn.G -  71*stIn.B + 128000)*4+500 ) / 1000;
5139 
5140     stOut.R = MINMAX(s32U,0,1023);
5141     stOut.G = MINMAX(s32Y,0,1023);
5142     stOut.B = MINMAX(s32V,0,1023);
5143 
5144     return stOut;
5145 }
5146 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_YUV2RGB(PIXEL pin)5147 PIXEL _MDrv_SC_3D_2DTo3D_YUV2RGB(PIXEL pin)
5148 {
5149 
5150     PIXEL pout;
5151     // YUV888 -> RGB888
5152     MS_S16 r = (1164*(pin.G-16) + 1596*(pin.R-128) + 500 )/1000;
5153     MS_S16 g = (1164*(pin.G-16) -  813*(pin.R-128) - 391*(pin.B-128) + 500 )/1000;
5154     MS_S16 b = (1164*(pin.G-16) + 2018*(pin.B-128) + 500 )/1000;
5155 
5156     pout.R = MINMAX(r,0,1023);
5157     pout.G = MINMAX(g,0,1023);
5158     pout.B = MINMAX(b,0,1023);
5159 
5160     return pout;
5161 }
5162 #endif
5163 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_HWInfo_Read(void * pInstance)5164 void _MDrv_SC_3D_2DTo3D_HWInfo_Read(void *pInstance)
5165 {
5166     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5167     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5168     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5169     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5170     MS_S32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
5171     MS_U8 u8Y_Avg_Edge_H = 0;
5172     MS_U8 u8R_Cr_Avg = 0;
5173     MS_U8 u8G_Y_Avg = 0;
5174     MS_U8 u8B_Cb_Avg = 0;
5175     MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5176     if(0 == u32DDBase)
5177     {
5178         printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
5179         assert(u32DDBase != 0);
5180     }
5181     MS_U16 u16DDBlock_DramSize = DDBYTENUM;
5182     MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
5183     MS_U8 u8Idx = 0;
5184 
5185     for (i = 0; i < NBLK_DD_V; i++)
5186     {
5187         i_dummy = i * u32DDBlockLinePitch;
5188 
5189         for (j = 0; j < NBLK_DD_H; j++)
5190         {
5191             j_dummy = j* u16DDBlock_DramSize;
5192 
5193             u8Y_Avg_Edge_H = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 1) + u32DDBase));
5194 
5195             u8R_Cr_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 17) + u32DDBase));
5196             u8G_Y_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 15) + u32DDBase));
5197             u8B_Cb_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 16) + u32DDBase));
5198 
5199 
5200             u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5201             u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5202             u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5203 
5204             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].R = u8R_Cr_Avg; // avg color value
5205             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].G = u8G_Y_Avg; // avg color value
5206             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].B = u8B_Cb_Avg; // avg color value
5207 
5208             if(u8Y_Avg_Edge_H>0x1A)
5209             {
5210                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = u8Y_Avg_Edge_H-0x1A; // edge info
5211             }
5212             else
5213             {
5214                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = 0;
5215             }
5216 
5217         }
5218     }
5219 
5220     for(u8Idx = 0 ; u8Idx < 32 ; u8Idx++)
5221     {
5222         pXCResourcePrivate->stdrvXC_3D._u32Histogram[u8Idx] = 0;
5223     }
5224 }
5225 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(void * pInstance)5226 void _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(void *pInstance)
5227 {
5228     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5229     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5230     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5231     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5232     MS_U32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
5233     MS_U8 u8Y_Avg_Edge_H = 0;
5234     MS_U8 u8R_Cr_Avg = 0;
5235     MS_U8 u8G_Y_Avg = 0;
5236     MS_U8 u8B_Cb_Avg = 0;
5237     MS_U8 u8_Y_Max = 0;//u9
5238     MS_U8 u8_Y_Min = 0;//u9
5239     MS_U8 u8_Motion = 0;//u9
5240     MS_U32 u32_Mot_Cnt = 0;
5241     MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5242     if(0 == u32DDBase)
5243     {
5244         printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
5245         assert(u32DDBase != 0);
5246     }
5247     //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0010)==0x10)
5248     //printf("[DDBase:%8x, DD_Buf:%x]\r\n",u32DDBase,pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5249     MS_U16 u16DDBlock_DramSize = DDBYTENUM;
5250     MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
5251     MS_U8 u8Idx = 0;
5252 
5253     /*if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==1)
5254     {
5255         printf("[%d %d]\r\n",gSrcInfo[MAIN_WINDOW].stDispWin.width,NBLK_DD_H);
5256     }*/
5257     //H-Upscaling
5258     //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK15_01_L)&0x07ff)==0x3C0)
5259     if(!IsVMirrorMode(MAIN_WINDOW))
5260     {
5261         for (i = 0; i < NBLK_DD_V; i++)
5262         {
5263             i_dummy = i * u32DDBlockLinePitch;
5264 
5265             for (j = 0; j < NBLK_DD_H/2; j++)
5266             {
5267                 j_dummy = j* u16DDBlock_DramSize;
5268 
5269                 u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1UL) + u32DDBase));
5270 #if 0
5271                 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5272                 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5273                 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5274 #else
5275                 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17UL) + u32DDBase));
5276                 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15UL) + u32DDBase));
5277                 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16UL) + u32DDBase));
5278 #endif
5279                 //u9 status
5280                 u8_Y_Max =  *((volatile MS_U8*)(( i_dummy + j_dummy + 9UL) + u32DDBase));
5281                 u8_Y_Min =  *((volatile MS_U8*)(( i_dummy + j_dummy + 12UL) + u32DDBase));
5282                 u8_Motion =  *((volatile MS_U8*)(( i_dummy + j_dummy + 18UL) + u32DDBase));
5283 
5284      pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].R = u8R_Cr_Avg; // avg color value
5285                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].R = u8R_Cr_Avg; // avg color value
5286                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].G = u8G_Y_Avg; // avg color value
5287                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].G = u8G_Y_Avg; // avg color value
5288                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].B = u8B_Cb_Avg; // avg color value
5289                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].B = u8B_Cb_Avg; // avg color value
5290                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j*2] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2]);
5291                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j*2+1] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1]);
5292 
5293                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j*2] = u8Y_Avg_Edge_H;
5294                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j*2+1] = u8Y_Avg_Edge_H;
5295                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j*2] = u8_Motion;
5296                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j*2+1] = u8_Motion;
5297                 u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5298                 //basic depth
5299                 pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j*2] = MAX( u8_Y_Max - u8_Y_Min, 0);
5300                 pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j*2+1] = MAX( u8_Y_Max - u8_Y_Min, 0);
5301             }
5302         }
5303     }
5304     else
5305     {
5306         for (i = 0; i < NBLK_DD_V; i++)
5307         {
5308             i_dummy = i * u32DDBlockLinePitch;
5309 
5310             for (j = 0; j < NBLK_DD_H/2; j++)
5311             {
5312                 j_dummy = j* u16DDBlock_DramSize;
5313 
5314                 u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1UL) + u32DDBase));
5315 
5316                 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17UL) + u32DDBase));
5317                 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15UL) + u32DDBase));
5318                 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16UL) + u32DDBase));
5319 
5320                 //u9 status
5321                 u8_Y_Max =  *((volatile MS_U8*)(( i_dummy + j_dummy + 9UL) + u32DDBase));
5322                 u8_Y_Min =  *((volatile MS_U8*)(( i_dummy + j_dummy + 12UL) + u32DDBase));
5323                 u8_Motion =  *((volatile MS_U8*)(( i_dummy + j_dummy + 18UL) + u32DDBase));
5324 
5325                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].R = u8R_Cr_Avg; // avg color value
5326                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].R = u8R_Cr_Avg; // avg color value
5327                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].G = u8G_Y_Avg; // avg color value
5328                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].G = u8G_Y_Avg; // avg color value
5329                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].B = u8B_Cb_Avg; // avg color value
5330                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].B = u8B_Cb_Avg; // avg color value
5331                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - i - 1][j*2] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i][j*2]);
5332                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - i - 1][j*2+1] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i][j*2+1]);
5333                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[NBLK_DD_V - i - 1][j*2] = u8Y_Avg_Edge_H;
5334                 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[NBLK_DD_V - i - 1][j*2+1] = u8Y_Avg_Edge_H;
5335                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[NBLK_DD_V - i - 1][j*2] = u8_Motion;
5336                 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[NBLK_DD_V - i - 1][j*2+1] = u8_Motion;
5337                 u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5338                 //basic depth
5339                 pXCResourcePrivate->stdrvXC_3D._field[(NBLK_DD_V - i - 1)*NBLK_DD_H + j*2] = MAX( u8_Y_Max - u8_Y_Min, 0);
5340                 pXCResourcePrivate->stdrvXC_3D._field[(NBLK_DD_V - i - 1)*NBLK_DD_H + j*2+1] = MAX( u8_Y_Max - u8_Y_Min, 0);
5341             }
5342         }
5343     }
5344 /*
5345             else
5346             {
5347     for (i = 0; i < NBLK_DD_V; i++)
5348     {
5349         i_dummy = i * u32DDBlockLinePitch;
5350 
5351         for (j = 0; j < NBLK_DD_H; j++)
5352         {
5353             j_dummy = j* u16DDBlock_DramSize;
5354 
5355             u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1) + u32DDBase));
5356 #if 0
5357             u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5358             u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5359             u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5360 #else
5361             u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5362             u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5363             u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5364 #endif
5365             //u9 status
5366             u8_Y_Max =  *((volatile MS_U8*)(( i_dummy + j_dummy + 9) + u32DDBase));
5367             u8_Y_Min =  *((volatile MS_U8*)(( i_dummy + j_dummy + 12) + u32DDBase));
5368             u8_Motion =  *((volatile MS_U8*)(( i_dummy + j_dummy + 18) + u32DDBase));
5369 
5370             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].R = u8R_Cr_Avg; // avg color value
5371             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].G = u8G_Y_Avg; // avg color value
5372             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].B = u8B_Cb_Avg; // avg color value
5373 
5374             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j]);
5375 
5376             pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = u8Y_Avg_Edge_H;
5377             pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j] = u8_Motion;
5378             u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5379             //basic depth
5380             pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j] = MAX( u8_Y_Max - u8_Y_Min, 0);
5381             }
5382         }
5383     }
5384 */
5385     for(u8Idx = 0 ; u8Idx < 32 ; u8Idx++)
5386     {
5387         pXCResourcePrivate->stdrvXC_3D._u32Histogram[u8Idx] = 0;
5388     }
5389 }
5390 #endif
5391 
5392 #if (HW_2DTO3D_VER >= 3)
_MDrv_Is_T3DDE_UseMainDisplayWindow(void * pInstance)5393 static MS_BOOL  _MDrv_Is_T3DDE_UseMainDisplayWindow(void *pInstance)
5394 {
5395     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5396     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5397     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5398     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5399     MS_BOOL  bUseMainDE = FALSE;
5400 
5401     MS_U16 u16MainDispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
5402     MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
5403     MS_WINDOW_TYPE stDispWin;
5404     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5405     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5406 
5407     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5408     {
5409         u16MainDispWidth = stDispWin.width;
5410         u16MainDispHeight = stDispWin.height;
5411     }
5412 
5413     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width == u16MainDispWidth)
5414         && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == u16MainDispHeight))
5415     {
5416         bUseMainDE = FALSE;
5417     }
5418     else if (FALSE == MDrv_XC_Is_SubWindowEanble(pInstance))
5419     {
5420         bUseMainDE = TRUE;
5421     }
5422     else //PIP, not full-frame mode
5423     {
5424         bUseMainDE = FALSE;
5425     }
5426 
5427     return bUseMainDE;
5428 }
5429 #endif
5430 
_MDrv_SC_3D_GetDispWinWidthForT3D(void * pInstance)5431 static MS_U16 _MDrv_SC_3D_GetDispWinWidthForT3D(void *pInstance)
5432 {
5433     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5434     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5435     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5436     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5437 
5438     MS_U16 u16MainDispWidth = 0;
5439     MS_U16 u16MainDispHStart = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L);
5440     MS_U16 u16MainDispHEnd = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L);
5441 
5442     //T3D 2P engine, get two piexl a time,start must be even,end must be odd
5443     u16MainDispHStart = u16MainDispHStart - (u16MainDispHStart & 0x01);
5444     u16MainDispHEnd = u16MainDispHEnd + ((u16MainDispHEnd&0x1)^0x1);
5445     u16MainDispWidth = u16MainDispHEnd - u16MainDispHStart + 1;
5446 
5447     return u16MainDispWidth;
5448 }
5449 
_MDrv_SC_3D_2DTo3D_HW_Info_Write(void * pInstance)5450 static void _MDrv_SC_3D_2DTo3D_HW_Info_Write(void *pInstance)
5451 {
5452     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5453     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5454     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5455     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5456 #if defined (__aarch64__)
5457     MS_U64 x = 0, y = 0;
5458 #else
5459     MS_S16 x = 0, y = 0;
5460 #endif
5461     MS_U8 s16BLKWeight=0,s16BLKDepth=0;//S16->U8
5462     MS_U8 u8DRBLKLinePitch = 0, u8DRPixBLKLinePitch = 0;
5463     MS_U8 u8BLKDepth_NoDC =0;
5464     MS_U8 u8BLKDepth_2D3D = 0;
5465     MS_U8 u8Auto_Adjust_En = 0;
5466     MS_VIRT u32DRBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf);
5467     MS_S32 s32Depth = 0;
5468     MS_U8 u8BLKDepth_Mod = 0;
5469     MS_U8 **u8QueueDataBLKWeight;
5470     MS_U8 **u8QueueDataBLKDepth;
5471     MS_S16 x_0 = 0, x_1 = 0, x_2 = 0, x_3 = 0;
5472 
5473     u8QueueDataBLKWeight = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_DR_V);
5474     u8QueueDataBLKDepth = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_DR_V);
5475     for( y = 0;y < NBLK_DR_V ;y++)
5476     {
5477         u8QueueDataBLKWeight[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_DR_H);
5478         u8QueueDataBLKDepth[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_DR_H);
5479     }
5480 
5481     if(0 == u32DRBase)
5482     {
5483         printf("%s :u32DRBase = 0!,error!!!\n", __FUNCTION__);
5484         assert(u32DRBase != 0);
5485     }
5486 
5487     u8DRBLKLinePitch    =  SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x00ff)     *32;//256 bit alignment = 32 byte
5488     u8DRPixBLKLinePitch = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0xff00)>>8 )*32;//256 bit alignment = 32 byte
5489 
5490 #if AUTO_ADJUST
5491     MS_S32 s32Total = 0;
5492     MS_S32 s32Count = 0;
5493     MS_S32 s32Diff = 0;
5494     MS_S32 s32Depth_Control_Var = 0;
5495     MS_S32 s32Mean_Depth = 0;
5496     u8Auto_Adjust_En = 1;
5497 
5498     for ( y = 5; y < NBLK_DR_V - 5; y ++ )
5499     {
5500         for ( x = 5; x < NBLK_DR_H - 5; x ++ )
5501         {
5502             u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5503             s32Total += u8BLKDepth_Mod;
5504             s32Count++;
5505         }
5506     }
5507     s32Count=MAX(s32Count,1);
5508     s32Mean_Depth=s32Total/s32Count;
5509 
5510     for ( y = 5; y < NBLK_DR_V-5; y ++ )
5511     {
5512         for ( x = 5; x < NBLK_DR_H-5; x ++ )
5513         {
5514             u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5515             s32Diff += abs(u8BLKDepth_Mod-s32Mean_Depth);
5516         }
5517     }
5518     s32Depth_Control_Var=s32Diff/s32Count;
5519     s32Depth_Control_Var=MAX(s32Depth_Control_Var,12);
5520     pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR = (pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR*112+s32Depth_Control_Var*(128-112) + 64 )>>7;
5521     pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR = (pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR*112+s32Mean_Depth*(128-112) + 64 )>>7;
5522 #endif
5523 
5524 
5525     for ( y = 0; y < NBLK_DR_V; y ++ )
5526     for ( x = 0; x < NBLK_DR_H; x ++ )
5527     {
5528         u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5529 #if AUTO_ADJUST
5530         if(pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR == 0)
5531         {
5532             s32Depth = (u8BLKDepth_Mod - pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR)*pXCResourcePrivate->stdrvXC_3D._s8Multi_Gain + 160-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value;
5533         }
5534         else
5535         {
5536             s32Depth = (u8BLKDepth_Mod - pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR)*pXCResourcePrivate->stdrvXC_3D._s8Multi_Gain/pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR + 160-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value;
5537         }
5538         s32Depth = MINMAX(s32Depth,160-pXCResourcePrivate->stdrvXC_3D._s8Clamp_Value-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value,160+pXCResourcePrivate->stdrvXC_3D._s8Clamp_Value-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value);
5539 #endif
5540         s32Depth = MINMAX(s32Depth,0,MAXVALUE);
5541         s16BLKDepth = s32Depth;
5542 
5543 
5544         u8BLKDepth_2D3D = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5545         u8BLKDepth_NoDC = u8BLKDepth_2D3D;
5546         s16BLKDepth = u8Auto_Adjust_En ? s16BLKDepth: u8BLKDepth_NoDC ;
5547         s16BLKWeight = pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x];
5548         u8QueueDataBLKWeight[y][x] = s16BLKWeight;
5549         u8QueueDataBLKDepth[y][x] = s16BLKDepth;
5550     }
5551 
5552     //========Write Queue Data, each round 64bit ==========
5553     if(!IsVMirrorMode(MAIN_WINDOW))
5554     {
5555         for ( y = 0; y < NBLK_DR_V; y++ )
5556         {
5557             for ( x = 0; x < NBLK_DR_H; x += 4 )
5558             {
5559                 x_0 = MIN(x, NBLK_DR_H-1);
5560                 x_1 = MIN(x+1, NBLK_DR_H-1);
5561                 x_2 = MIN(x+2, NBLK_DR_H-1);
5562                 x_3 = MIN(x+3, NBLK_DR_H-1);
5563 
5564                 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase))) = (((MS_U32)u8QueueDataBLKWeight[y][x_3] << 24)
5565                                                                   |((MS_U32)u8QueueDataBLKWeight[y][x_2] << 16)
5566                                                                   |((MS_U32)u8QueueDataBLKWeight[y][x_1] << 8)
5567                                                                   |((MS_U32)u8QueueDataBLKWeight[y][x_0])) ;          //dr pixel base address
5568                 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase + HW_2DTO3D_BLOCK_DR_BUF_SIZE))) =(((MS_U32)u8QueueDataBLKDepth[y][x_3] << 24)
5569                                                                             |((MS_U32)u8QueueDataBLKDepth[y][x_2] << 16)
5570                                                                                 |((MS_U32)u8QueueDataBLKDepth[y][x_1] << 8)
5571                                                                                 |((MS_U32)u8QueueDataBLKDepth[y][x_0])) ; //dr block base address
5572 
5573             }
5574             MsOS_FlushMemory();
5575         }
5576     }
5577     else
5578     {
5579         for ( y = NBLK_DR_V-1; y >= 0; y-- )
5580         {
5581             for ( x = 0; x < NBLK_DR_H; x += 4 )
5582             {
5583                 x_0 = MIN(x, NBLK_DR_H-1);
5584                 x_1 = MIN(x+1, NBLK_DR_H-1);
5585                 x_2 = MIN(x+2, NBLK_DR_H-1);
5586                 x_3 = MIN(x+3, NBLK_DR_H-1);
5587 
5588                 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase))) = (((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_3] << 24)
5589                                                                   |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_2] << 16)
5590                                                                   |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_1] << 8)
5591                                                                   |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_0])) ;          //dr pixel base address
5592                   (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase + HW_2DTO3D_BLOCK_DR_BUF_SIZE))) = (((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_3] << 24)
5593                                                                             |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_2] << 16)
5594                                                                             |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_1] << 8)
5595                                                                             |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_0])) ; //dr block base address
5596 
5597             }
5598             MsOS_FlushMemory();
5599         }
5600     }
5601     for( y = 0;y < NBLK_DR_V ;y++)
5602     {
5603         free(u8QueueDataBLKWeight[y]);
5604         free(u8QueueDataBLKDepth[y]);
5605     }
5606     free(u8QueueDataBLKWeight);
5607     free(u8QueueDataBLKDepth);
5608     u8QueueDataBLKWeight = NULL;
5609     u8QueueDataBLKDepth = NULL;
5610 }
5611 
5612 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_HorizontalDetection(void * pInstance)5613 static MS_U16 _MDrv_SC_3D_2DTo3D_HorizontalDetection(void *pInstance)
5614 {
5615     MS_U16 x = 0, y = 0;
5616     MS_U16 u16Cplx_Sum = 0;
5617     MS_U16 u16Cplx = 0;
5618     MS_U8 u8Cplx_Idx = 0;
5619     MS_U32 u32CplxHist[NBLK_V_MAX];
5620     PIXEL stPP;
5621     MS_U16 u16Y_Sep_Out = 0;
5622     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5623     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5624     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5625     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5626     memset(&stPP, 0, sizeof(PIXEL));
5627 
5628     for( x =0; x< NBLK_DD_V; x++)
5629         u32CplxHist[x] = 0;
5630 
5631     for (  y = 0; y < NBLK_DD_V; y ++ )
5632     {
5633         u16Cplx_Sum = 0;
5634         for ( x = 0; x < NBLK_DD_H; x ++ )
5635         {
5636             //to avoid dark letter box
5637             stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5638             if(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)
5639                 continue;
5640 
5641             u16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5642             u8Cplx_Idx = MINMAX(u16Cplx/4,0,63);//for 32 level histogram
5643             u16Cplx_Sum = u8Cplx_Idx + u16Cplx_Sum ;
5644 
5645         }
5646         u32CplxHist[y] = u16Cplx_Sum;
5647     }
5648 
5649     u16Y_Sep_Out = 0;
5650 
5651     for (  y = 0; y < NBLK_DD_V; y ++)
5652     {
5653         if (u32CplxHist[y]  > 250 && u32CplxHist[(y)+1]  > 250)
5654         {
5655             u16Y_Sep_Out =y;
5656             break;
5657         }
5658     }
5659 
5660     u16Y_Sep_Out = u16Y_Sep_Out*pXCResourcePrivate->stdrvXC_3D._u8Vertical_Step;
5661     if (u16Y_Sep_Out >= DISPLAY_DD_V)
5662         u16Y_Sep_Out =0;
5663 
5664     return u16Y_Sep_Out;
5665 }
5666 #endif
5667 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_BGColorDetection(void * pInstance)5668 static void _MDrv_SC_3D_2DTo3D_BGColorDetection(void *pInstance)
5669 {
5670     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5671     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5672     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5673     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5674     MS_U32 u32CplxHistoTp[64];
5675     MS_U32 u32CplxHistoDn[64];
5676     MS_U32 u32CplxHistoALL1[64];
5677     MS_S16 x = 0, y = 0;
5678     PIXEL stPP;
5679     MS_S16 s16MaxEdgeRGB = 0;
5680     MS_S16 s16Cplx = 0;
5681     MS_S16 s16Cplx_Idx = 0;
5682     MS_S16 s16CpxThrdTp = 0;
5683     MS_S16 s16CpxThrdDn = 0;
5684     MS_S16 blkSum_bgTp = 0, blkSum_bgDn = 0;
5685     MS_S32 s32RSum = 0, s32GSum = 0, s32BSum = 0;
5686     MS_S16 s16TBB_CplxBinThrd = 0, s16FlatAccuTp = 0, s16FlatAccuDn =  0;
5687     MS_BOOL bBGCOLOR_Tp = 0, bBGCOLOR_Dn = 0;
5688     MS_S16 s16Tp14_BGCOLORCnt =  0, s16Dn14_BGCOLORCnt = 0, s16AntiTp14_BGCOLORCnt = 0, s16AntiDn14_BGCOLORCnt = 0;
5689     MS_S16 s16ValidTpCnt = 0, s16ValidDnCnt = 0;
5690     MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
5691 
5692     memset(&stPP, 0, sizeof(PIXEL));
5693 
5694     //--------Cplx histogram initialize start-------------//
5695     for(x =0; x<64; x++)
5696     {
5697         u32CplxHistoTp[x] = 0;
5698         u32CplxHistoDn[x] = 0;
5699         u32CplxHistoALL1[x] = 0;
5700     }
5701     //--------Cplx histogram initialize end-------------//
5702 
5703 
5704     //--------blur background weight estimate start-----//
5705     for ( y = 0; y < NBLK_DD_V; y ++ )
5706     {
5707         for ( x = 0; x < NBLK_DD_H; x++ )
5708         {
5709             //to avoid dark letter box
5710             stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5711             if(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)
5712                 continue;
5713 
5714             s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5715             s16Cplx_Idx = MINMAX(s16Cplx/4,0,63);//for 32 level histogram
5716 
5717             u32CplxHistoALL1[s16Cplx_Idx] = u32CplxHistoALL1[s16Cplx_Idx] +1 ;
5718 
5719             if( (y>= 0) && (y <= NBLK_DD_V/4))
5720                 u32CplxHistoTp[s16Cplx_Idx] = u32CplxHistoTp[s16Cplx_Idx] +1 ;
5721 
5722             if( (y>= NBLK_DD_V*3/4) && (y <= NBLK_DD_V))
5723                 u32CplxHistoDn[s16Cplx_Idx] = u32CplxHistoDn[s16Cplx_Idx] +1 ;
5724         }
5725     }
5726 
5727     if(u32ScalingRatio == 0)
5728     {
5729         u32ScalingRatio = 1;
5730     }
5731 
5732     //--------blur background weight estimate end-----//
5733 
5734     //try to useconstant value
5735     s16CpxThrdTp =3;
5736     s16CpxThrdDn =3;
5737     //--------estimate s16Cplx thrd end-----//
5738 
5739 
5740     //--------estimate Table B background color select weight start-----//
5741     s16TBB_CplxBinThrd = MIN(s16CpxThrdDn, s16CpxThrdTp);
5742     s16FlatAccuTp = 0;
5743     s16FlatAccuDn = 0;
5744     for(x = 0; x<63;x++)
5745     {
5746         s16FlatAccuTp = s16FlatAccuTp +u32CplxHistoTp[x];
5747         s16FlatAccuDn = s16FlatAccuDn +u32CplxHistoDn[x];
5748         if(x>=s16TBB_CplxBinThrd)
5749             break;
5750     }
5751 
5752     //**********************************************************************************************//
5753     pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = MINMAX((s16FlatAccuTp-s16FlatAccuDn)*1000/u32ScalingRatio,-32,32);
5754     pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei+32)/2;// range: 0~32
5755 
5756     pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = MINMAX((s16FlatAccuTp-s16FlatAccuDn)*1000/u32ScalingRatio,-32,32);
5757     pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei+32)/2;// range: 0~32
5758 
5759 #if PRINTINFO
5760     printf("FlatTp=%u, FlatDn=%u\n",s16FlatAccuTp,s16FlatAccuDn);
5761 #endif
5762 
5763     //**********************************************************************************************//
5764     //--------estimate Table B background color select weight end-----//
5765 
5766     //--------estimate Top 1/4 & Bottom 1/4 background color start-----//
5767 
5768     //Top Quarter Avg Color
5769     blkSum_bgTp=0;
5770     //PIXEL _stBgPixelTp;
5771     s32RSum = 0;
5772     s32GSum = 0;
5773     s32BSum = 0;
5774     for ( y = 0; y < NBLK_DD_V/4; y ++ )
5775     {
5776         for ( x = 0; x < NBLK_DD_H; x ++ )
5777         {
5778             stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5779             s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5780             if ( s16Cplx/4 <= s16CpxThrdTp && !(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)) //if ( s16Cplx < 32 )
5781             {
5782                 s32RSum += stPP.R;
5783                 s32GSum += stPP.G;
5784                 s32BSum += stPP.B;
5785                 blkSum_bgTp ++;
5786             }
5787 
5788         }
5789     }
5790     if(blkSum_bgTp==0)
5791     {
5792         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R= 0 ;
5793         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G= 0 ;
5794         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B= 0 ;
5795     }
5796     else
5797     {
5798         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R=s32RSum/blkSum_bgTp;
5799         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G=s32GSum/blkSum_bgTp;
5800         pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B=s32BSum/blkSum_bgTp;
5801     }
5802 
5803     //last Quarter Avg Color
5804     blkSum_bgDn=0;
5805     //PIXEL _stBgPixelDn;
5806     s32RSum = 0;
5807     s32GSum = 0;
5808     s32BSum = 0;
5809     for ( y = NBLK_DD_V*3/4; y < NBLK_DD_V; y ++ )
5810     {
5811         for ( x = 0; x < NBLK_DD_H; x ++ )
5812         {
5813             stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5814             s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5815             if ( s16Cplx/4 <= s16CpxThrdDn && !(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)) //if ( s16Cplx < 32 )
5816             {
5817                 s32RSum += stPP.R;
5818                 s32GSum += stPP.G;
5819                 s32BSum += stPP.B;
5820                 blkSum_bgDn ++;
5821             }
5822         }
5823     }
5824     if(blkSum_bgDn==0)
5825     {
5826         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R= 0;
5827         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G= 0;
5828         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B= 0;
5829     }
5830     else
5831     {
5832         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R= s32RSum/blkSum_bgDn;
5833         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G= s32GSum/blkSum_bgDn;
5834         pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B= s32BSum/blkSum_bgDn;
5835     }
5836 
5837     pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBgPixelTp);
5838     pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBgPixelDn);
5839 
5840     //--------estimate Top 1/4 & Bottom 1/4 background color end-----//
5841 
5842     for ( y = 0; y < NBLK_DD_V ; y ++ )
5843     for ( x = 0; x < NBLK_DD_H; x ++ )
5844     {
5845         stPP = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x]);
5846         s16MaxEdgeRGB   = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5847 
5848         bBGCOLOR_Tp = (s16MaxEdgeRGB < 32) && abs(stPP.B - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4<16 && abs(stPP.G - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)/4<16 && abs(stPP.R - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4<16;
5849         bBGCOLOR_Dn = (s16MaxEdgeRGB < 32) && abs(stPP.B - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.B)/4<16 && abs(stPP.G - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.G)/4<16 && abs(stPP.R - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.R)/4<16;
5850 
5851         if( bBGCOLOR_Tp )
5852             pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = true;
5853         else
5854             pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = false;
5855 
5856         if( bBGCOLOR_Dn )
5857             pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x] = true;
5858         else
5859             pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x] = false;
5860 
5861     }
5862 
5863     s16Tp14_BGCOLORCnt = 0;
5864     s16Dn14_BGCOLORCnt = 0;
5865     s16AntiTp14_BGCOLORCnt = 0;
5866     s16AntiDn14_BGCOLORCnt = 0;
5867 
5868     s16ValidTpCnt = 0;
5869     s16ValidDnCnt = 0;
5870 
5871     for ( y = 0; y < NBLK_DD_V; y ++ )
5872     for ( x = 0; x < NBLK_DD_H; x ++ )
5873     {
5874         s16MaxEdgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5875         stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5876 
5877         bBGCOLOR_Tp = pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
5878         bBGCOLOR_Dn = pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x];
5879 
5880         if(y>=0&&y<=NBLK_DD_V/4&&(s16MaxEdgeRGB/4)<3&&bBGCOLOR_Tp)
5881             s16ValidTpCnt++;
5882         if(y>=NBLK_DD_V*3/4&&y<=NBLK_DD_V&&(s16MaxEdgeRGB/4)<3&&bBGCOLOR_Dn)
5883             s16ValidDnCnt++;
5884 
5885         if(y>=0&&y<=NBLK_DD_V/4)
5886         {
5887             if(bBGCOLOR_Tp)
5888                 s16Tp14_BGCOLORCnt++;
5889             if(bBGCOLOR_Dn)
5890                 s16AntiDn14_BGCOLORCnt++;
5891         }
5892 
5893         if(y>=NBLK_DD_V*3/4&&y<=NBLK_DD_V)
5894         {
5895             if(bBGCOLOR_Dn)
5896                 s16Dn14_BGCOLORCnt++;
5897             if(bBGCOLOR_Tp)
5898                 s16AntiTp14_BGCOLORCnt++;
5899         }
5900     }
5901 
5902 #if PRINTINFO
5903     printf("TpBGC R = %u, G = %d, B = %u\n",pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R,pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G,pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B);
5904     printf("BtBGC R = %u, G = %d, B = %u\n",pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R,pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G,pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B);
5905 #endif
5906 
5907     pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei = MINMAX((s16ValidTpCnt*1000/u32ScalingRatio-32)/2,0,32);
5908     pXCResourcePrivate->stdrvXC_3D._s16DnBGCOLOR_ValidWei = MINMAX((s16ValidDnCnt*1000/u32ScalingRatio-32)/2,0,32);
5909 
5910 #if PRINTINFO
5911     printf("s16Tp14_BGCOLORCnt = %u, s16AntiDn14_BGCOLORCnt = %u\n",s16Tp14_BGCOLORCnt,s16AntiDn14_BGCOLORCnt);
5912     printf("s16Dn14_BGCOLORCnt = %u, s16AntiTp14_BGCOLORCnt = %u\n",s16Dn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt);
5913 #endif
5914 
5915     s16Tp14_BGCOLORCnt     = MINMAX(s16Tp14_BGCOLORCnt/4*1000/u32ScalingRatio-16,0,48);//Tp color on top
5916     s16AntiDn14_BGCOLORCnt = MINMAX((s16AntiDn14_BGCOLORCnt/4*1000/u32ScalingRatio-4),0,48);//Dn color on Top
5917     s16Dn14_BGCOLORCnt     = MINMAX(s16Dn14_BGCOLORCnt/4*1000/u32ScalingRatio-16,0,48);//Dn color at bottom
5918     s16AntiTp14_BGCOLORCnt = MINMAX((s16AntiTp14_BGCOLORCnt/4*1000/u32ScalingRatio-4),0,48);//Tp color at bottom
5919 
5920 #if PRINTINFO
5921     printf("Tp14_BGCOLOR_Wei = %u, AntiDn14_BGCOLOR_Wei = %u\n",s16Tp14_BGCOLORCnt,s16AntiDn14_BGCOLORCnt);
5922     printf("Dn14_BGCOLOR_Wei = %u, AntiTp14_BGCOLOR_Wei = %u\n",s16Dn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt);
5923 #endif
5924 
5925     pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei   = MINMAX(s16Tp14_BGCOLORCnt-MAX(s16AntiDn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt), 0,32);
5926     pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei_Bottom = MINMAX(s16Dn14_BGCOLORCnt-MAX(s16AntiDn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt), 0,32);
5927 
5928     pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei = MINMAX(s16Tp14_BGCOLORCnt,0,32);
5929     pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei = MINMAX(s16Dn14_BGCOLORCnt,0,32);
5930 }
5931 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_BGColorDetection_U9(void * pInstance)5932 static void _MDrv_SC_3D_2DTo3D_BGColorDetection_U9(void* pInstance)
5933 {
5934 
5935     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5936     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5937     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5938     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5939 
5940     MS_U32 CbHistoTp[32];
5941     MS_U32 CrHistoTp[32];
5942     MS_U32 CbHistoBn[32];
5943     MS_U32 CrHistoBn[32];
5944     MS_U32 YHistoTp[32];
5945     MS_U32 YHistoBn[32];
5946 
5947     int x,y;
5948     PIXEL pp, ppYCC;
5949     MS_U32 cplx;
5950     MS_U32 CbTpMaxidx=0,CrTpMaxidx=0,CbBnMaxidx=0,CrBnMaxidx=0,CbMaxidx=0,CrMaxidx=0;
5951     MS_U32 CbTpMaxcnt=0,CrTpMaxcnt=0,CbBnMaxcnt=0,CrBnMaxcnt=0,CbMaxcnt=0,CrMaxcnt=0;
5952     MS_U32 YTpMaxidx=0,YBnMaxidx=0,YTpMaxcnt=0,YBnMaxcnt=0;
5953 
5954     MS_U32 CbTpMaxinBncnt = 0, CrTpMaxinBncnt = 0;
5955     MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
5956     for(x =0; x<32; x++)
5957     {
5958         CbHistoTp[x] = 0;
5959         CrHistoTp[x] = 0;
5960         CbHistoBn[x] = 0;
5961         CrHistoBn[x] = 0;
5962 
5963         YHistoTp[x] = 0;
5964         YHistoBn[x] = 0;
5965     }
5966 
5967     for ( y = 0; y < NBLK_DD_V/4; y ++ )
5968         for ( x = 0; x < NBLK_DD_H; x++ )
5969         {
5970             //to avoid dark letter box
5971             pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5972             ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
5973 
5974             //cplx = field[YCTRS][(y)*NBLK_DD_H+(x)];
5975             cplx = pXCResourcePrivate->stdrvXC_3D._field[(y)*NBLK_DD_H+(x)];
5976             //if ( cplx <= 24 && ppYCC.G>LBOX_BLKCOLOR)
5977             //if ( cplx <= 32 && ppYCC.G>LBOX_BLKCOLOR)
5978             if ( cplx <= 32 && ppYCC.G>BLKCOLOR)
5979             {
5980                 CbHistoTp[ppYCC.B/8]++;
5981                 CrHistoTp[ppYCC.R/8]++;
5982                 YHistoTp[ppYCC.G/8]++;
5983             }
5984         }
5985 
5986     for ( y = NBLK_DD_V*3/4; y < NBLK_DD_V; y ++ )
5987         for ( x = 0; x < NBLK_DD_H; x++ )
5988         {
5989             //to avoid dark letter box
5990             pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5991             ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
5992 
5993             //cplx = field[YCTRS][(y)*NBLK_DD_H+(x)];
5994             cplx = pXCResourcePrivate->stdrvXC_3D._field[(y)*NBLK_DD_H+(x)];
5995             //if ( cplx <= 24 && ppYCC.G>LBOX_BLKCOLOR)
5996             //if ( cplx <= 32 && ppYCC.G>LBOX_BLKCOLOR)
5997             if ( cplx <= 32 && ppYCC.G>32)
5998             {
5999                 CbHistoBn[ppYCC.B/8]++;
6000                 CrHistoBn[ppYCC.R/8]++;
6001                 YHistoBn[ppYCC.G/8]++;
6002             }
6003         }
6004 
6005 
6006     for(x =0; x<32; x++)
6007     {
6008         CbTpMaxidx = (CbHistoTp[x]>CbHistoTp[CbTpMaxidx])?x:CbTpMaxidx;
6009         CrTpMaxidx = (CrHistoTp[x]>CrHistoTp[CrTpMaxidx])?x:CrTpMaxidx;
6010         CbBnMaxidx = (CbHistoBn[x]>CbHistoBn[CbBnMaxidx])?x:CbBnMaxidx;
6011         CrBnMaxidx = (CrHistoBn[x]>CrHistoBn[CrBnMaxidx])?x:CrBnMaxidx;
6012 
6013         CbMaxidx = (CbHistoTp[x]+CbHistoBn[x]>CbHistoTp[CbMaxidx]+CbHistoBn[CbMaxidx])?x:CbMaxidx;
6014         CrMaxidx = (CrHistoTp[x]+CrHistoBn[x]>CrHistoTp[CrMaxidx]+CrHistoBn[CrMaxidx])?x:CrMaxidx;
6015 
6016         YTpMaxidx = (YHistoTp[x]>YHistoTp[YTpMaxidx])?x:YTpMaxidx;
6017         YBnMaxidx = (YHistoBn[x]>YHistoBn[YBnMaxidx])?x:YBnMaxidx;
6018     }
6019 
6020     if(CbTpMaxidx==0)
6021         CbTpMaxcnt=CbHistoTp[0]+CbHistoTp[1];
6022     else if(CbTpMaxidx==31)
6023         CbTpMaxcnt=CbHistoTp[30]+CbHistoTp[31];
6024     else
6025         CbTpMaxcnt=CbHistoTp[CbTpMaxidx-1]+CbHistoTp[CbTpMaxidx]+CbHistoTp[CbTpMaxidx+1];
6026 
6027     if(CrTpMaxidx==0)
6028         CrTpMaxcnt=CrHistoTp[0]+CrHistoTp[1];
6029     else if(CrTpMaxidx==31)
6030         CrTpMaxcnt=CrHistoTp[30]+CrHistoTp[31];
6031     else
6032         CrTpMaxcnt=CrHistoTp[CrTpMaxidx-1]+CrHistoTp[CrTpMaxidx]+CrHistoTp[CrTpMaxidx+1];
6033 
6034     if(CbBnMaxidx==0)
6035         CbBnMaxcnt=CbHistoBn[0]+CbHistoBn[1];
6036     else if(CbBnMaxidx==31)
6037         CbBnMaxcnt=CbHistoBn[30]+CbHistoBn[31];
6038     else
6039         CbBnMaxcnt=CbHistoBn[CbBnMaxidx-1]+CbHistoBn[CbBnMaxidx]+CbHistoBn[CbBnMaxidx+1];
6040 
6041     if(CrBnMaxidx==0)
6042         CrBnMaxcnt=CrHistoBn[0]+CrHistoBn[1];
6043     else if(CrBnMaxidx==31)
6044         CrBnMaxcnt=CrHistoBn[30]+CrHistoBn[31];
6045     else
6046         CrBnMaxcnt=CrHistoBn[CrBnMaxidx-1]+CrHistoBn[CrBnMaxidx]+CrHistoBn[CrBnMaxidx+1];
6047 
6048     if(CbMaxidx==0)
6049         CbMaxcnt=CbHistoTp[0]+CbHistoTp[1]+CbHistoBn[0]+CbHistoBn[1];
6050     else if(CbMaxidx==31)
6051         CbMaxcnt=CbHistoTp[30]+CbHistoTp[31]+CbHistoBn[30]+CbHistoBn[31];
6052     else
6053         CbMaxcnt=CbHistoTp[CbMaxidx-1]+CbHistoTp[CbMaxidx]+CbHistoTp[CbMaxidx+1]+CbHistoBn[CbMaxidx-1]+CbHistoBn[CbMaxidx]+CbHistoBn[CbMaxidx+1];
6054 
6055     if(CrMaxidx==0)
6056         CrMaxcnt=CrHistoTp[0]+CrHistoTp[1]+CrHistoBn[0]+CrHistoBn[1];
6057     else if(CrMaxidx==31)
6058         CrMaxcnt=CrHistoTp[30]+CrHistoTp[31]+CrHistoBn[30]+CrHistoBn[31];
6059     else
6060         CrMaxcnt=CrHistoTp[CrMaxidx-1]+CrHistoTp[CrMaxidx]+CrHistoTp[CrMaxidx+1]+CrHistoBn[CrMaxidx-1]+CrHistoBn[CrMaxidx]+CrHistoBn[CrMaxidx+1];
6061 
6062     if(YTpMaxidx==0)
6063         YTpMaxcnt=YHistoTp[0]+YHistoTp[1];
6064     else if(YTpMaxidx==31)
6065         YTpMaxcnt=YHistoTp[30]+YHistoTp[31];
6066     else
6067         YTpMaxcnt=YHistoTp[YTpMaxidx-1]+YHistoTp[YTpMaxidx]+YHistoTp[YTpMaxidx+1];
6068 
6069     if(YBnMaxidx==0)
6070         YBnMaxcnt=YHistoBn[0]+YHistoBn[1];
6071     else if(YBnMaxidx==31)
6072         YBnMaxcnt=YHistoBn[30]+YHistoBn[31];
6073     else
6074         YBnMaxcnt=YHistoBn[YBnMaxidx-1]+YHistoBn[YBnMaxidx]+YHistoBn[YBnMaxidx+1];
6075 
6076     MS_U32 CntL2,CntL1,CntCur,CntR1,CntR2;
6077 
6078     CntL2 = (CbTpMaxidx<2)?0:CbHistoBn[CbTpMaxidx-2];
6079     CntL1 = (CbTpMaxidx<1)?0:CbHistoBn[CbTpMaxidx-1];
6080     CntCur= CbHistoBn[CbTpMaxidx];
6081     CntR1 = (CbTpMaxidx+1>=32)?0:CbHistoBn[CbTpMaxidx+1];
6082     CntR2 = (CbTpMaxidx+2>=32)?0:CbHistoBn[CbTpMaxidx+2];
6083 
6084     CbTpMaxinBncnt = CntL2+CntL1+CntCur+CntR1+CntR2;
6085 
6086     CntL2 = (CrTpMaxidx<2)?0:CrHistoBn[CrTpMaxidx-2];
6087     CntL1 = (CrTpMaxidx<1)?0:CrHistoBn[CrTpMaxidx-1];
6088     CntCur= CbHistoBn[CbTpMaxidx];
6089     CntR1 = (CrTpMaxidx+1>=32)?0:CrHistoBn[CrTpMaxidx+1];
6090     CntR2 = (CrTpMaxidx+2>=32)?0:CrHistoBn[CrTpMaxidx+2];
6091 
6092     CrTpMaxinBncnt = CntL2+CntL1+CntCur+CntR1+CntR2;
6093 
6094 
6095     pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp = CbTpMaxidx*8;
6096     pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp = CrTpMaxidx*8;
6097     pXCResourcePrivate->stdrvXC_3D.BGColor_CbBn = CbBnMaxidx*8;
6098     pXCResourcePrivate->stdrvXC_3D.BGColor_CrBn = CrBnMaxidx*8;
6099 
6100     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforTp = MIN(CbTpMaxcnt,CrTpMaxcnt)*1000/u32ScalingRatio;
6101     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforBn = MIN(CbBnMaxcnt,CrBnMaxcnt)*1000/u32ScalingRatio;
6102 
6103 
6104     //printf("\nTpCb %d TpCr %d\n",BGColor_CbTp,BGColor_CrTp);
6105     //printf("\nCbrCnt: %d %d / %d %d",CbTpMaxcnt,CrTpMaxcnt,CbTpMaxinBncnt,CrTpMaxinBncnt);
6106     //printf("\nCbrIdx: %d %d",CbTpMaxidx*8,CrTpMaxidx*8);
6107 
6108     //printf("\nCbrCnt: %d %d / %d %d / %d %d\n",CbTpMaxcnt,CrTpMaxcnt,CbBnMaxcnt,CrBnMaxcnt,CbMaxcnt,CrMaxcnt);
6109     //printf("CbrIdx: %d %d / %d %d / %d %d\n\n",CbTpMaxidx*8,CrTpMaxidx*8,CbBnMaxidx*8,CrBnMaxidx*8,CbMaxidx*8,CrMaxidx*8);
6110 
6111 #if 1
6112     //2014.02.06 add by CL, for LG subtitle pattern
6113     MS_BOOL isBGCOLOR_Tp;
6114     //U8 u8tempval1EF8 = MFC_ReadByte(REG_1EF8);
6115 
6116     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp = 0;
6117     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn = 0;
6118     for ( y = 0; y < NBLK_DD_V ; y ++ )
6119         for ( x = 0; x < NBLK_DD_H; x ++ )
6120         {
6121             ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
6122             cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
6123 
6124             //isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>3)-(BGColor_CrTp>>3))<=2 && abs((ppYCC.B>>3)-(BGColor_CbTp>>3))<=2;
6125             //LGE patch
6126             //if((u8tempval1EF8&0x04)==0x04)
6127             isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>3)-(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>>3))<=1 && abs((ppYCC.B>>3)-(pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>>3))<=1&&ppYCC.G>=48;
6128             //else
6129             //isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>2)-(BGColor_CrTp>>2))<=3 && abs((ppYCC.B>>2)-(BGColor_CbTp>>2))<=3&&ppYCC.G>=48;
6130 
6131             if( isBGCOLOR_Tp )
6132                 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = true;
6133             else
6134                 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = false;
6135 
6136             if(y>=0&&y<(NBLK_DD_V>>2)&&isBGCOLOR_Tp)
6137                 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp++;
6138             if(y>=((NBLK_DD_V*3)>>2)&&y<NBLK_DD_V&&isBGCOLOR_Tp)
6139                 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn++;
6140         }
6141 
6142     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp = pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp*1000/u32ScalingRatio;
6143     pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn = pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn*1000/u32ScalingRatio;
6144     //BGColorBlkCntTp = MIN(CbTpMaxcnt,CrTpMaxcnt)/sizeratio;
6145     //BGColorBlkCntBn = MIN(CbTpMaxinBncnt,CrTpMaxinBncnt)/sizeratio;
6146 
6147     //printf("\nTpBGCnt %d nDnBGCnt %d\n",BGColorBlkCntTp,BGColorBlkCntBn);
6148 #endif
6149 }
6150 #endif
6151 #if 0
6152 static MS_U16 _MDrv_SC_3D_2DTo3D_BackLightDetection(void)
6153 {
6154     MS_S32 s32Low_Thrd = 6;
6155     MS_S32 s32Hi_Thrd  = 20;
6156     MS_S32 s32Low_Sum_Thrd  = 200;
6157     MS_S32 s32High_Sum_Thrd = 11;
6158     MS_S32 s32Mean_Thrd = 170;
6159     MS_S32 s32H_Diff_Thrd = 200 ;
6160     MS_S32 s32H_Mean_Thrd = 490 ;
6161     MS_S32 s32Contrast_Thrd = 160; //180
6162     MS_S32 s32Hist_Shift = 32;
6163     MS_S32 s32TotalPix = FRAME_HEIGHT_DLC*FRAME_WIDTH_DLC/s32Hist_Shift;
6164 
6165     MS_S32 s32Hist[32];
6166     MS_S32 s32Contrast = 0;
6167     MS_S32 s32Hist_Sum = 0;
6168     MS_S32 s32Hist_Temp = 0;
6169     MS_S32 s32Hist_Mean = 0;
6170     MS_S32 s32H_Mean = 0, s32H_Diff = 0, s32H_Twice = 0, s32H_Half = 0;
6171     MS_S32 s32Hist_Mean_Twice =0;
6172     MS_S32 s32Hist_Mean_Half =0;
6173     MS_S32 s32Index_BL = 0, s32Index_Y_Low = 0, s32Index_Y_Hi = 0;
6174     MS_S32 s32Index_H_Mean = 0, s32Index_H_Diff= 0, s32Index_Contrast = 0, s32Index_Mean = 0;
6175     MS_S32 s32HisData = 0;
6176     MS_S32 x = 0;
6177     MS_S32 s32Low_Sum = 0, s32Hi_Sum = 0;
6178     MS_S32 s32Hist_Count = 0;
6179 
6180     //Histogram Check
6181     for(x = 0 ; x < 32 ; x++)
6182     {
6183         s32HisData = _u32Histogram[x];
6184         s32Hist_Count = s32Hist_Count + s32HisData;
6185     }
6186 
6187     if(s32Hist_Count!=0)
6188         s32TotalPix = s32Hist_Count;
6189 
6190     for( x = 31; x >= 0; x-- )
6191     {
6192         s32Hist_Sum = x* _u32Histogram[x] + s32Hist_Sum;
6193         s32Hist_Temp = _u32Histogram[x] + s32Hist_Temp;
6194         s32Hist[x] = (s32Hist_Temp*1000/s32TotalPix);  //100
6195     }
6196 
6197     s32Hist_Mean = s32Hist_Sum /s32TotalPix;
6198     s32Hist_Mean_Twice = MIN(31, s32Hist_Mean +4);
6199     s32Hist_Mean_Half = MAX(0, s32Hist_Mean -4 );
6200 
6201     s32H_Mean = s32Hist[s32Hist_Mean];
6202     s32H_Twice =  s32Hist[s32Hist_Mean_Twice];
6203     s32H_Half =  s32Hist[s32Hist_Mean_Half];
6204     s32H_Diff = MIN(s32H_Mean- s32H_Twice, s32H_Half - s32H_Mean);
6205 
6206     s32Low_Sum =0;
6207     s32Hi_Sum =0;
6208 
6209     //X =0;
6210     for( x=2; x< s32Low_Thrd ; x++)
6211         s32Low_Sum = s32Low_Sum + _u32Histogram[x];
6212 
6213     //31
6214     for( x=31; x > s32Hi_Thrd ; x--)
6215         s32Hi_Sum = s32Hi_Sum + _u32Histogram[x];
6216 
6217     s32Contrast = ((s32Low_Sum- s32Hi_Sum)*1000/s32TotalPix);
6218 
6219     if (s32Hi_Sum*1000/s32TotalPix > s32High_Sum_Thrd)
6220         s32Index_Y_Hi =10;
6221     else
6222         s32Index_Y_Hi = (MINMAX(10 - s32High_Sum_Thrd + s32Hi_Sum*1000/s32TotalPix, 0, 10));
6223 
6224     if (s32Low_Sum*1000/s32TotalPix > s32Low_Sum_Thrd)
6225         s32Index_Y_Low =10;
6226     else
6227         s32Index_Y_Low = (MINMAX(10 - s32Low_Sum_Thrd + s32Low_Sum*1000/s32TotalPix, 0, 10));
6228 
6229     if (s32H_Mean > s32H_Mean_Thrd)
6230         s32Index_H_Mean =10;
6231     else
6232         s32Index_H_Mean = MINMAX( 10- s32H_Mean_Thrd + s32H_Mean, 0, 10);
6233 
6234     if (s32H_Diff < s32H_Diff_Thrd)
6235         s32Index_H_Diff =10;
6236     else
6237         s32Index_H_Diff = MINMAX( 10- s32H_Diff + s32H_Diff_Thrd, 0, 10);
6238 
6239     if (s32Contrast > s32Contrast_Thrd)
6240         s32Index_Contrast = 10;
6241     else
6242         s32Index_Contrast = MINMAX( 10 - s32Contrast_Thrd + s32Contrast , 0, 10);
6243 
6244     s32Hist_Mean = s32Hist_Sum*20 /s32TotalPix;
6245     if (s32Hist_Mean > s32Mean_Thrd)
6246         s32Index_Mean = 10;
6247     else
6248         s32Index_Mean = MINMAX( 10 - s32Mean_Thrd + s32Hist_Mean , 0, 10);
6249 
6250     s32Index_BL = MIN(MIN3(s32Index_Y_Low, s32Index_Y_Hi, s32Index_Mean),  MIN3(s32Index_H_Diff, s32Index_H_Mean, s32Index_Contrast));
6251 
6252     return s32Index_BL;
6253 }
6254 #endif
6255 
6256 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(void * pInstance,MS_U16 u16Index_BL)6257 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(void *pInstance, MS_U16 u16Index_BL)
6258 {
6259     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6260     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6261     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6262     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6263     MS_U8 u8RIdx = 0,u8GIdx = 0, u8BIdx = 0;
6264     MS_S16 s16R = 0, s16G = 0, s16B = 0, s16Depth = 0, s16Depth2 = 0;
6265     MS_S16 s16Y = 0, s16Cb = 0, s16Cr = 0;
6266     MS_S16 s16CrDepth = 0, s16CbDepth = 0, s16Sat = 0, s16YDepth = 0, s16CrCbDepth = 0;
6267     MS_S16 s16Sat_Wei = 0;
6268 #if (DVIEW_WEI || DVIEW_WEI2)
6269     MS_S16 s16DViewDepth = 0;
6270 #endif
6271     MS_S16 s16YDark = 0;
6272     PIXEL stRGB, stYCC;
6273     MS_S16 s16BGDiff3 = 0, s16BGdepthWei3 = 0;
6274     //Only in TableB
6275     MS_S16 s16BG_R = 0, s16BG_G = 0, s16BG_B = 0;
6276     PIXEL stRGBBG, stYCCBG;
6277     MS_S16 s16BGColor_ValidWei = 0;
6278 
6279     memset(&stRGB, 0, sizeof(PIXEL));
6280     memset(&stYCC, 0, sizeof(PIXEL));
6281     memset(&stRGBBG, 0, sizeof(PIXEL));
6282     memset(&stYCCBG, 0, sizeof(PIXEL));
6283 
6284     // Table A for Sky ( default : white in back )
6285     {
6286         for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6287         for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6288         for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6289         {
6290             s16R = (u8RIdx<<5)*8/7; // u8RIdx<<5;
6291             s16G = (u8GIdx<<5)*8/7; // u8GIdx<<5;
6292             s16B = (u8BIdx<<5)*8/7; // u8BIdx<<5;
6293             s16Depth = 0;
6294 
6295 #if ENABLE_CrDEPTH
6296             s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)+500 ) / 1000;
6297             s16Cb = ( (-148*s16R - 291*s16G + 439*s16B + 128000)+500 ) / 1000;
6298             s16Cr = ( ( 439*s16R - 368*s16G -  71*s16B + 128000)+500 ) / 1000;
6299 
6300             s16CrDepth = MINMAX((s16Cr-20), 0, MAXVALUE) ;
6301             //int s16YDepth = MAX((s16Y-128), 0);
6302             s16CbDepth = MINMAX((MAXVALUE- s16Cb), 0, MAXVALUE) ;
6303             s16Sat = (abs(s16Cr-128)+ abs(s16CbDepth-128));
6304             s16YDepth = MIN( MAXVALUE-s16Y, s16Y );
6305 
6306             s16Sat_Wei = MINMAX(s16Sat,0,32);
6307             //int s16CrCbDepth = (2*s16Cr + s16CbDepth)/3;
6308             s16CrCbDepth = MINMAX((s16CrDepth + s16CbDepth)/2, 0, MAXVALUE);
6309             s16CrCbDepth= MINMAX(s16CrCbDepth*s16CrCbDepth/MAXVALUE, 0, MAXVALUE);
6310             s16Depth = (s16CrCbDepth*s16Sat_Wei + s16YDepth *(32-s16Sat_Wei)+16)/32;
6311             //s16Depth = MINMAX(((s16Depth-128)*3/2)+128,0,MAXVALUE);
6312 #else
6313             s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)*4+500 ) / 4000;
6314             s16Depth = MAX( s16R,s16G ) - MIN3( s16R, s16G, s16B );
6315             s16Depth = s16Depth - MINMAX( s16B - MAX( s16R, s16G ), 0, MAXVALUE)  + MINMAX(128 - s16B,0,MAXVALUE)/2;
6316             s16Depth = MAX( s16Depth, MIN3( 180, s16R*3 - s16G*3, s16B*6 - s16G*6 ) );
6317 #endif
6318 
6319             //method3
6320             stRGB.R = s16R; stRGB.G = s16G; stRGB.B = s16B;
6321             stYCC = RGB2YUV(stRGB);
6322             s16BGDiff3 = MAX3( abs(stYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)*2/3/4, abs(stYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4, abs(stYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4 );
6323             s16BGdepthWei3 = MINMAX(s16BGDiff3*2/3,0,32);
6324 
6325             s16Depth2 = (s16BGdepthWei3*s16Depth+(32-s16BGdepthWei3)*16+16)>>5;//method3
6326             s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei)*s16Depth+16)>>5;
6327             s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei)*s16Depth+16)>>5;//normal BG color case
6328 
6329             s16Depth = (s16Depth*pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt+s16Depth2*(32-pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt)+16)>>5;//for blue sky color == BG color
6330 
6331 #if DVIEW_WEI
6332             //for DView
6333             s16DViewDepth = MINMAX(s16Depth-64,0,MAXVALUE);
6334             //int s16DViewDepth = MINMAX(s16Depth-100,0,MAXVALUE);
6335             s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6336 #elif DVIEW_WEI2
6337             //int s16DViewDepth = MINMAX(s16Depth-64,0,MAXVALUE);// Ver 1
6338             //int s16DViewDepth = MINMAX(s16Depth-100,0,MAXVALUE);// Ver 2
6339             s16DViewDepth = MINMAX(s16Depth-50,0,MAXVALUE);// Ver 3
6340 
6341             s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6342 #endif
6343 
6344             {
6345                 s16YDark = MIN(150, (80-s16Y)*6 );
6346                 s16Depth = ( MINMAX( MAX( s16YDark, s16Depth), 0, MAXVALUE )*u16Index_BL + s16Depth*(10 - u16Index_BL))/10;
6347             }
6348 
6349             s16Depth = MINMAX( s16Depth, 0, MAXVALUE );
6350             pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = s16Depth;
6351             //_u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = u8GIdx*32;
6352         }
6353     }
6354 
6355     // Table B for Non-Sky
6356     {
6357         for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6358         for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6359         for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6360         {
6361             s16R = (u8RIdx<<5)*8/7; // u8RIdx<<5;
6362             s16G = (u8GIdx<<5)*8/7; // u8GIdx<<5;
6363             s16B = (u8BIdx<<5)*8/7; // u8BIdx<<5;
6364             s16Depth = 0;
6365 
6366 #if ENABLE_CrDEPTH
6367             s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)+500 ) / 1000;
6368             s16Cb = ( (-148*s16R - 291*s16G + 439*s16B + 128000)+500 ) / 1000;
6369             s16Cr = ( ( 439*s16R - 368*s16G -  71*s16B + 128000)+500 ) / 1000;
6370 
6371             s16CrDepth = MINMAX((s16Cr-30), 0, MAXVALUE) ;
6372             s16CbDepth = MINMAX((MAXVALUE- s16Cb), 0, MAXVALUE) ;
6373             //int s16CrCbDepth = MINMAX((2*s16Cr + s16CbDepth)/3, 0, MAXVALUE);
6374             s16CrCbDepth =  MINMAX((s16Cr + s16CbDepth)/2, 0, MAXVALUE);
6375             //int s16Sat = MAX(abs(s16Cr-128), abs(s16CbDepth-128)) + MIN(abs(s16Cr-128), abs(s16CbDepth-128))/2;
6376             s16Sat =(abs(s16Cr-128)+ abs(s16CbDepth-128));
6377             s16YDepth = MIN( 180, s16Y);
6378 
6379             s16Sat_Wei = MINMAX(s16Sat-5,0,32);
6380             s16Depth = (s16CrCbDepth*s16Sat_Wei + s16YDepth *(32-s16Sat_Wei)+16)/32;
6381             //s16Depth = MINMAX(((s16Depth-128)*3/2)+128,0,MAXVALUE);
6382 #else
6383             s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)*4+500 ) / 4000;
6384             s16Depth = MAX( s16R,s16G ) - MIN3( s16R, s16G, s16B );
6385             s16Depth = s16Depth - MINMAX( s16B - MAX( s16R, s16G ), 0, MAXVALUE)  + MINMAX(128 - s16B,0,MAXVALUE)/2;
6386             s16Depth = MAX( s16Depth, MIN3( 180, s16R*3 - s16G*3, s16B*6 - s16G*6 ) );
6387 #endif
6388 
6389 #if ENABLE_CrDEPTH
6390             s16Depth = s16Depth;
6391 #else
6392             s16Sat = (MAX3(s16R,s16G,s16B)==0)?0:((MAX3(s16R,s16G,s16B)-MIN3(s16R,s16G,s16B))*256)/MAX3(s16R,s16G,s16B);
6393             s16YDepth = MIN( 200, s16Y )-( MAX(s16Sat-32,0)*5/4 );
6394             s16Depth = MINMAX( MAX( s16YDepth, s16Depth), 0, MAXVALUE );
6395 #endif
6396 
6397             //Tp/Dn BG color blending
6398             stRGB.R = s16R; stRGB.G = s16G; stRGB.B = s16B;
6399             stYCC = RGB2YUV(stRGB);
6400 
6401             s16BG_R = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R+16)>>5;
6402             s16BG_G = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G+16)>>5;
6403             s16BG_B = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B+16)>>5;
6404 
6405             stRGBBG.R = s16BG_R; stRGBBG.G = s16BG_G; stRGBBG.B = s16BG_B;
6406             stYCCBG = RGB2YUV(stRGBBG);
6407 
6408             s16BGDiff3 = MAX3( abs(stYCC.G-stYCCBG.G)*2/3/4, abs(stYCC.B-stYCCBG.B)/4, abs(stYCC.R-stYCCBG.R)/4 );
6409             s16BGdepthWei3 = MINMAX(s16BGDiff3*2/3,0,32);
6410 
6411             //BG color back off s16Depth
6412             s16Depth2 = (s16BGdepthWei3*s16Depth+(32-s16BGdepthWei3)*32+16)>>5;//method3
6413 
6414             s16BGColor_ValidWei = MAX(pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei,pXCResourcePrivate->stdrvXC_3D._s16DnBGCOLOR_ValidWei);
6415             s16Depth2 = (s16BGColor_ValidWei*s16Depth2+(32-s16BGColor_ValidWei)*s16Depth+16)>>5;
6416             s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei)*s16Depth+16)>>5;//normal BG color case
6417             s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3*s16Depth+(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)*s16Depth2+16)>>5;// if Distant View, not apply BG color to TBB
6418             s16Depth = (s16Depth*pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt+s16Depth2*(32-pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt)+16)>>5;//for blue sky color == BG color
6419 
6420 #if DVIEW_WEI
6421             //for DView
6422             s16DViewDepth = MINMAX((s16Depth*4/5)+160,0,MAXVALUE);
6423             s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6424 #elif DVIEW_WEI2
6425             s16DViewDepth = MINMAX((s16Depth*4/5)+100,0,MAXVALUE); //ver 2
6426             s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6427 #endif
6428             //backlight
6429             s16YDark = (MAXVALUE-s16Y);
6430             s16Depth = (MINMAX( MAX( s16Depth*4/5, s16YDark), 0, MAXVALUE )*u16Index_BL + s16Depth*(10 - u16Index_BL))/10;
6431 
6432             s16Depth = MINMAX( s16Depth, 0, MAXVALUE );
6433             pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = s16Depth;
6434             //_u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = gIdx*32;
6435         }
6436     }
6437 
6438 #if PRINTINFO
6439     printf("======Table A======\n");
6440     printf("_s16TpBGCOLOR_ValidWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei );
6441     printf("_s16TBA_BGColorWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei );
6442     printf("_s16BothTpBGSKY_COLORCnt = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt );
6443     printf("_s16DistantViewRatio3 = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 );
6444     printf("u16Index_BL = 0x%X\n", u16Index_BL  );
6445     printf("=====Table B======\n");
6446     printf("_s16TBB_BGColorSelWei  = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei  );
6447     printf("s16BGColor_ValidWei = 0x%X\n", s16BGColor_ValidWei );
6448     printf("_s16TBB_BGColorWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei );
6449     printf("_s16BothDnBGSKY_COLORCnt = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt );
6450     printf("_s16DistantViewRatio3 = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 );
6451     printf("u16Index_BL = 0x%X\n", u16Index_BL );
6452 #endif
6453 }
6454 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(void * pInstance)6455 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(void *pInstance)
6456 {
6457 
6458     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6459     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6460     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6461     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6462     MS_U8 rIdx,gIdx,bIdx;
6463     MS_S16 r, g, b,depth,depth2;
6464     MS_S16 y,Cb,Cr;
6465     MS_S16 CrDepth,CbDepth,sat,yDepth,CrCbDepth;
6466     MS_S16 sat_wei;
6467     MS_S16 DViewDepth;
6468 //  MS_S16 yDark;
6469 
6470     PIXEL pRGB,pYCC;
6471     MS_S16 BGDiff3,BGdepthWei3;
6472 
6473     //Only in TableB
6474 //  MS_S16 BG_R,BG_G,BG_B;
6475 //  PIXEL pRGBBG,pYCCBG;
6476 //  MS_S16 BGCOLOR_ValidWei;
6477     MS_U8 BGColorTrustWei;
6478     MS_U8 BGDepth;
6479 
6480 //  MS_U8 BGColorTrustWei_forTBABGColor;
6481     MS_U8 BGDepth_forTpBGColor;
6482     MS_S16 BGDiff3_forTpBGColor,BGdepthWei3_forTpBGColor, depth2_forTpBGColor;
6483 
6484     MS_S16 Cbtmp,Crtmp;
6485 
6486 
6487     MS_S16 u8testval1 = 0x20;//MFC_ReadByte(REG_0EB6);//0x20
6488     MS_S16 u8testval2 = 0x40;//MFC_ReadByte(REG_0EB7);//0x40
6489     MS_S16 u8testval3 = 0x20;//MFC_ReadByte(REG_0EB8);//0x20
6490     MS_S16 u8testval4 = 0x20;//MFC_ReadByte(REG_0EB9);//0x20
6491 #if DUMYGAINCTRL
6492     MS_U8 u8tmpval = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L, 0xff));//MFC_ReadByte(REG_1EFA);
6493     MS_U8 u8tmpval2 = 0x00;
6494 
6495     MS_S16 u8testval7 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0xff)); //for edge depth
6496     MS_S16 u8testval8 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0xff00))>>8;//0x07; //for [0]:cbcr enable  [1]:y enable [2]:edge enable
6497     MS_S16 u8testval9 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0xff));//0x10; //for sat_wei
6498     MS_S16 u8testvalA = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0xff00))>>8;//0x10; //for y_depth gain
6499 #else
6500     MS_U8 u8tmpval = 0x00;// = MFC_ReadByte(REG_1EFA);
6501     MS_U8 u8tmpval2 = 0x00;// = MFC_ReadByte(REG_1EFB);
6502 
6503     MS_S16 u8testval7 = 0x30; //for edge depth
6504     MS_S16 u8testval8 = 0x07; //for [0]:cbcr enable  [1]:y enable [2]:edge enable
6505     MS_S16 u8testval9 = 0x10; //for sat_wei
6506     MS_S16 u8testvalA = 0x10; //for y_depth gain
6507 #endif
6508 
6509 
6510 
6511     //U8 u8tmpval1EF8 = MFC_ReadByte(REG_1EF8);
6512     MS_S16 u8tmpval1EF9 = 0x50;//MFC_ReadByte(REG_1EF9);
6513 
6514     // Table A for Sky ( default : white in back )
6515     {
6516         for ( rIdx = 0; rIdx < 8; rIdx++ )
6517             for ( gIdx = 0; gIdx < 8; gIdx++ )
6518                 for ( bIdx = 0; bIdx < 8; bIdx++ )
6519                 {
6520                     r = (rIdx<<5)*8/7; // rIdx<<5;
6521                     g = (gIdx<<5)*8/7; // gIdx<<5;
6522                     b = (bIdx<<5)*8/7; // bIdx<<5;
6523                     depth = 0;
6524 
6525                     y = ( ( 257*r + 504*g + 98*b + 16000)+500 ) / 1000;
6526                     Cb = ( (-148*r - 291*g + 439*b + 128000)+500 ) / 1000;
6527                     Cr = ( ( 439*r - 368*g -  71*b + 128000)+500 ) / 1000;
6528 
6529                     CrDepth = MINMAX((Cr)*16/15, 0, 255) ;
6530                     CbDepth = MINMAX((256- Cb)*16/15, 0, 255) ;
6531 
6532                     //enhance red/yellow color depth to green color
6533                     CrDepth = MAX(CrDepth-u8tmpval1EF9,0);
6534                     CrDepth = MIN((CrDepth*u8testval4)>>4,255);
6535 
6536                     sat = (abs(Cr-128)+ abs(Cb-128));
6537 
6538 
6539                     yDepth = MIN( 255-y, y );
6540 
6541 
6542                     MS_U32 black_base_depth;
6543                     black_base_depth = 0x60;//MFC_ReadByte(REG_1EFE);
6544 
6545                     //2013.06.27 make white color depth could be lower than black color in TBA, and black color depth limited to 0x60, for Sky pattern
6546                     //if(1)
6547                     {
6548                         MS_U32 ydepth_base;
6549                         ydepth_base = 255;
6550 
6551                         yDepth = MAX(MIN( ydepth_base-y, y ),0);
6552 
6553                         if((u8tmpval&0x20)==0x00)
6554                         {
6555                             if(y>(ydepth_base-y))
6556                                 yDepth = yDepth;//make white go more back, not be limited
6557                             else
6558                                 yDepth = MAX(yDepth,black_base_depth);
6559                         }
6560                         else
6561                             yDepth = yDepth;
6562                     }
6563 
6564                     sat_wei = MINMAX(sat-16,0,32);
6565 
6566                     //make blue color go back more
6567                     {
6568                         MS_U8 blueback_item;
6569                         //blueback_item = MAX(b-MAX(r,g)+MIN(r,g),0);
6570                         if(0)
6571                         {
6572                             Cbtmp = MAX(Cb-128,0);
6573                             Crtmp = Cr-128;
6574                             if(Crtmp>=0)
6575                                 blueback_item = MAX(Cbtmp-2*Crtmp,0);
6576                             else
6577                                 blueback_item = MAX(Cbtmp+Crtmp/2,0);
6578                         }
6579                         else
6580                             blueback_item = MAX(b-MIN(r,g*3/2),0);
6581 #if 0
6582                         if((u8tmpval&0x10)==0x00)
6583                             CrCbDepth = MINMAX((CrDepth + CbDepth)/2 - blueback_item, 0, 255);
6584                         else
6585                             CrCbDepth = (CrDepth + CbDepth)/2;
6586 #else
6587                         CrCbDepth = MINMAX((CrDepth + CbDepth)/2- blueback_item, 0, 255);
6588 #endif
6589                     }
6590 #if 0
6591                     if((u8tmpval&0x03)==0x03)
6592                         depth = 0;
6593                     else if((u8tmpval&0x03)==0x01)
6594                         depth = CrCbDepth;
6595                     else if((u8tmpval&0x03)==0x02)
6596                         depth = yDepth;
6597                     else if((u8tmpval&0x03)==0x00)
6598                         depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6599                     else
6600                         depth = 0;
6601 #else
6602                     sat_wei = MIN((sat_wei*u8testval9)>>4,32);//0~32
6603                     yDepth = (yDepth*u8testvalA)>>4;//0~32
6604                     if((u8testval8&0x03)==0x01)
6605                         depth = CrCbDepth;
6606                     else if((u8testval8&0x03)==0x02)
6607                         depth = yDepth;
6608                     else if((u8testval8&0x03)==0x03)
6609                         depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6610 #endif
6611                     //method3
6612                     pRGB.R = r;
6613                     pRGB.G = g;
6614                     pRGB.B = b;
6615                     pYCC = RGB2YUV(pRGB);
6616                     if((u8tmpval&0x40)==0x00)
6617                     {
6618                         BGColorTrustWei = MINMAX(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforTp/4,0,32);
6619                         BGDepth = ( MIN(16,depth)*BGColorTrustWei+depth*(32-BGColorTrustWei))>>5;
6620 
6621                         //BGDiff3 = MAX( abs(pYCC.B/4-BGColor_CbTp), abs(pYCC.R/4-BGColor_CrTp) );
6622                         BGDiff3 = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp) );
6623                         BGdepthWei3 = MINMAX(BGDiff3,0,32);
6624 
6625                         depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*BGDepth+16)>>5;//method3
6626                     }
6627                     else
6628                     {
6629                         BGDiff3 = MAX3( abs(pYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)*2/3/4, abs(pYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4, abs(pYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4 );
6630                         BGdepthWei3 = MINMAX(BGDiff3*2/3,0,32);
6631                         depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*16+16)>>5;//method3
6632                     }
6633 
6634 
6635                     if((u8tmpval&0x04)==0x00)
6636                         depth = MIN(depth,depth2);
6637 
6638 
6639 
6640                     DViewDepth = MINMAX(depth,0,255);
6641 
6642                     depth = (DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6643 
6644 
6645                     //LOCALDEPTH_ENHANCE
6646                     MS_U32 skyRatio1, skyRatio2;
6647                     MS_U32 skyRatioDiff_wei;
6648 
6649                     MS_U32 gainU=0, gainD=0;
6650                     MS_U32 offset;
6651 
6652                     skyRatio1 = (MS_U32)pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1;
6653                     skyRatio2 = (MS_U32)MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
6654 
6655                     skyRatioDiff_wei = skyRatio1 - skyRatio2;//0~32
6656                     {
6657                         gainU = 4;
6658                         gainD = 3;
6659                     }
6660 
6661                     offset = MAX(128*gainU/gainD - 128,0);
6662                     if((u8tmpval&0x08)==0x00)
6663                         depth = depth + ( depth* (gainU-gainD)/gainD * skyRatioDiff_wei/32 - offset * skyRatioDiff_wei/32);
6664 
6665 
6666                     //for edge enhance in TBA
6667                     MS_U32 egde_depth;
6668                     if((u8testval8&0x04)==0x04)
6669                         egde_depth = ((u8testval3)*(u8testval7))>>4;// 8.0*2.4
6670                     else
6671                         egde_depth = 0;
6672 
6673                     depth = depth - egde_depth;
6674 
6675 
6676                     depth = MINMAX( depth, 0, 255 );
6677                     /*if((SC_R2BYTE(REG_SC_BK23_59_L)&0x00f0)==0x00)
6678                     {
6679                     pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[rIdx][gIdx][bIdx] = depth;
6680                     }
6681                     else*/
6682                     {
6683                         pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[rIdx][gIdx][bIdx] = depth;
6684                         //pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[rIdx][gIdx][bIdx] = depth;
6685 
6686                     }
6687                 }
6688     }
6689 
6690 
6691     // Table B for Non-Sky
6692     {
6693         for ( rIdx = 0; rIdx < 8; rIdx++ )
6694             for ( gIdx = 0; gIdx < 8; gIdx++ )
6695                 for ( bIdx = 0; bIdx < 8; bIdx++ )
6696                 {
6697                     r = (rIdx<<5)*8/7; // rIdx<<5;
6698                     g = (gIdx<<5)*8/7; // gIdx<<5;
6699                     b = (bIdx<<5)*8/7; // bIdx<<5;
6700                     depth = 0;
6701 
6702                     y = ( ( 257*r + 504*g + 98*b + 16000)+500 ) / 1000;
6703                     Cb = ( (-148*r - 291*g + 439*b + 128000)+500 ) / 1000;
6704                     Cr = ( ( 439*r - 368*g -  71*b + 128000)+500 ) / 1000;
6705 
6706                     CrDepth = MINMAX((Cr)*16/15, 0, 255) ;
6707                     CbDepth = MINMAX((256- Cb)*16/15, 0, 255) ;
6708 
6709                     //enhance red/yellow color depth to green color
6710                     CrDepth = MAX(CrDepth-u8tmpval1EF9,0);
6711                     CrDepth = MIN((CrDepth*u8testval4)>>4,255);
6712 
6713 
6714                     //make blue color go back more
6715                     {
6716                         MS_U8 blueback_item;
6717                         //blueback_item = MAX(b-MAX(r,g)+MIN(r,g),0);
6718                         if(0)
6719                         {
6720                             Cbtmp = MAX(Cb-128,0);
6721                             Crtmp = Cr-128;
6722                             if(Crtmp>=0)
6723                                 blueback_item = MAX(Cbtmp-2*Crtmp,0);
6724                             else
6725                                 blueback_item = MAX(Cbtmp+Crtmp/2,0);
6726                         }
6727                         else
6728                             blueback_item = MAX(b-MIN(r,g*3/2),0);
6729 #if 0
6730                         if((u8tmpval&0x10)==0x00)
6731                             CrCbDepth = MINMAX((CrDepth + CbDepth)/2 - blueback_item, 0, 255);
6732                         else
6733                             CrCbDepth = (CrDepth + CbDepth)/2;
6734 #else
6735                         CrCbDepth = MINMAX(CrDepth, 0, 255);
6736 #endif
6737                     }
6738 
6739                     sat =(abs(Cr-128)+ abs(Cb-128));
6740 
6741                     yDepth = MIN( 180, y);
6742 
6743                     {
6744                         MS_U32 black_base_depth;
6745                         black_base_depth = (MS_U32)u8testval2;//48//u8tmpval2;//
6746 
6747                         if((u8tmpval&0x20)==0x00)
6748                             yDepth = MAX(yDepth,black_base_depth);
6749                         else
6750                             yDepth = yDepth;
6751 
6752                         yDepth = yDepth + u8testval1;
6753                     }
6754 
6755 
6756 
6757 
6758                     sat_wei = MINMAX(sat-16,0,32);
6759 #if 0
6760                     if((u8tmpval&0x03)==0x03)
6761                         depth = 0;
6762                     else if((u8tmpval&0x03)==0x01)
6763                         depth = CrCbDepth;
6764                     else if((u8tmpval&0x03)==0x02)
6765                         depth = yDepth;
6766                     else if((u8tmpval&0x03)==0x00)
6767                         depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6768                     else
6769                         depth = 0;
6770 #else
6771                     sat_wei = MIN((sat_wei*u8testval9)>>4,32);//0~32
6772                     yDepth = (yDepth*u8testvalA)>>4;//0~32
6773                     if((u8testval8&0x03)==0x01)
6774                         depth = CrCbDepth;
6775                     else if((u8testval8&0x03)==0x02)
6776                         depth = yDepth;
6777                     else if((u8testval8&0x03)==0x03)
6778                         depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6779 #endif
6780                     //method3
6781                     pRGB.R = r;
6782                     pRGB.G = g;
6783                     pRGB.B = b;
6784                     pYCC = RGB2YUV(pRGB);
6785                     if((u8tmpval&0x40)==0x00)
6786                     {
6787                         BGColorTrustWei = MINMAX(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforBn/4,0,32);
6788                         BGDepth = ( MIN(32,depth)*BGColorTrustWei+depth*(32-BGColorTrustWei))>>5;
6789 
6790                         //BGDiff3 = MAX( abs(pYCC.B/4-BGColor_CbBn), abs(pYCC.R/4-BGColor_CrBn) );
6791                         BGDiff3 = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbBn), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrBn) );
6792                         BGdepthWei3 = MINMAX(BGDiff3,0,32);
6793 
6794                         //BG color back off depth
6795                         depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*BGDepth+16)>>5;//method3
6796 
6797                         //for the strength of TpBGcolor in TBB
6798                         BGDepth_forTpBGColor = ( MIN(16,depth)*pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei+depth*(32-pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei))>>5;
6799                         BGDiff3_forTpBGColor = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp) );
6800                         BGdepthWei3_forTpBGColor = MINMAX(BGDiff3_forTpBGColor,0,32);
6801                         //TpBG color back off depth
6802                         depth2_forTpBGColor = (BGdepthWei3_forTpBGColor*depth+(32-BGdepthWei3_forTpBGColor)*BGDepth_forTpBGColor+16)>>5;//method3
6803 
6804                         //if use TpBGColor
6805                         if((u8tmpval2&0x01)==0x00)
6806                             depth2 = MIN(depth2,depth2_forTpBGColor);
6807 
6808                     }
6809                     else
6810                     {
6811                         BGDiff3 = MAX3( abs(pYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.G)*2/3/4, abs(pYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.B)/4, abs(pYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.R)/4 );
6812                         BGdepthWei3 = MINMAX(BGDiff3*2/3,0,32);
6813                         //BG color back off depth
6814                         depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*32+16)>>5;//method3
6815                     }
6816 
6817 
6818                     if((u8tmpval&0x04)==0x00)
6819                         depth = MIN(depth,depth2);
6820 
6821 
6822                     DViewDepth = MINMAX(depth,0,255); //ver 2
6823                     depth = (DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6824 
6825 
6826                     //LOCALDEPTH_ENHANCE
6827                     MS_U32 skyRatio1, skyRatio2;
6828                     MS_U32 skyRatioDiff_wei;
6829 
6830                     MS_U32 gainU=0, gainD=0;
6831                     MS_U32 offset;
6832 
6833                     skyRatio1 = (MS_U32)pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1;
6834                     skyRatio2 = (MS_U32)MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
6835 
6836                     skyRatioDiff_wei = skyRatio1 - skyRatio2;//0~32
6837                     {
6838                         gainU = 4;
6839                         gainD = 3;
6840                     }
6841 
6842                     offset = MAX(128*gainU/gainD - 128,0);
6843                     if((u8tmpval&0x08)==0x00)
6844                         depth = depth + ( depth* (gainU-gainD)/gainD * skyRatioDiff_wei/32 - offset * skyRatioDiff_wei/32);
6845 
6846 
6847                     //for edge enhance in TBB
6848                     MS_U32 egde_depth;
6849                     if((u8testval8&0x04)==0x04)
6850                         egde_depth = ((u8testval3)*(u8testval7))>>4;// 8.0*2.4
6851                     else
6852                         egde_depth = 0;
6853 
6854                     depth = depth + egde_depth;
6855 
6856                     depth = MINMAX( depth, 0, 255 );
6857 
6858                     pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[rIdx][gIdx][bIdx] = depth;
6859 
6860 
6861                 }
6862     }
6863 
6864 
6865 }
6866 
6867 #endif
_MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(void * pInstance,MS_U16 u16X,MS_U16 u16Y,MS_U16 u16R,MS_U16 u16G,MS_U16 u16B)6868 static MS_S32 _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(void *pInstance, MS_U16 u16X, MS_U16 u16Y, MS_U16 u16R, MS_U16 u16G, MS_U16 u16B)
6869 {
6870     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6871     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6872     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6873     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6874     MS_S32 s32DepthA = 0;
6875     MS_S32 s32DepthB = 0;
6876     MS_S32 s32BlendWeight = 0;
6877     MS_S32 s32Depth = 0;
6878     MS_S32 s32R00 = 0, s32R01 = 0, s32R10 = 0, s32R11 = 0, s32G0 = 0, s32G1 = 0;
6879 
6880     MS_S32 s32R = 0, s32G = 0, s32B = 0;
6881     MS_S32 s32RIdx = 0, s32GIdx = 0, s32BIdx = 0;
6882     MS_S32 s32RIdxN = 0, s32GIdxN = 0, s32BIdxN = 0;
6883     MS_S32 s32RRatio = 0, s32GRatio = 0, s32BRatio = 0;
6884 
6885     // Check RGB 3D LUT
6886     s32R = MINMAX( u16R * 7 / 8, 0, 224*4 );
6887     s32G = MINMAX( u16G * 7 / 8, 0, 224*4 );
6888     s32B = MINMAX( u16B * 7 / 8, 0, 224*4 );
6889     s32RIdx = s32R>>7; // u16R>>5;
6890     s32GIdx = s32G>>7; // u16G>>5;
6891     s32BIdx = s32B>>7; // u16B>>5;
6892     s32RIdxN = MIN( s32RIdx+1, 7 ); //MIN( s32RIdx+1, 8 );
6893     s32GIdxN = MIN( s32GIdx+1, 7 ); //MIN( s32GIdx+1, 8 );
6894     s32BIdxN = MIN( s32BIdx+1, 7 ); //MIN( s32BIdx+1, 8 );
6895     s32RRatio = s32R & 0x7f;
6896     s32GRatio = s32G & 0x7f;
6897     s32BRatio = s32B & 0x7f;
6898 
6899     //RGB3DLUT_A
6900     {
6901         // Interpolate in R domain
6902         s32R00 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdx ][s32BIdx],  pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdx ][s32BIdx], s32RRatio );
6903         s32R01 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdxN][s32BIdx],  pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdxN][s32BIdx], s32RRatio );
6904         s32R10 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdx ][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdx ][s32BIdxN], s32RRatio );
6905         s32R11 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdxN][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdxN][s32BIdxN], s32RRatio );
6906         // Interpolate in G domain
6907         s32G0 = BLEND128( s32R00, s32R01, s32GRatio );
6908         s32G1 = BLEND128( s32R10, s32R11, s32GRatio );
6909         // Interpolate in B domain
6910         s32DepthA = BLEND128( s32G0, s32G1, s32BRatio );
6911     }
6912 
6913     //RGB3DLUT_B
6914     {
6915         // Interpolate in R domain
6916         s32R00 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdx ][s32BIdx],  pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdx ][s32BIdx], s32RRatio );
6917         s32R01 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdxN][s32BIdx],  pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdxN][s32BIdx], s32RRatio );
6918         s32R10 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdx ][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdx ][s32BIdxN], s32RRatio );
6919         s32R11 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdxN][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdxN][s32BIdxN], s32RRatio );
6920         // Interpolate in G domain
6921         s32G0 = BLEND128( s32R00, s32R01, s32GRatio );
6922         s32G1 = BLEND128( s32R10, s32R11, s32GRatio );
6923         // Interpolate in B domain
6924         s32DepthB = BLEND128( s32G0, s32G1, s32BRatio );
6925     }
6926 
6927 #if 0
6928     // blend s32DepthA & s32DepthB
6929     {
6930         // bilinear interpolation regionWeight
6931         wUL = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT,0,NBLK_H_OUT-1)];
6932         wUR = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT+1,0,NBLK_H_OUT-1)];
6933         wDL = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT+1,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT,0,NBLK_H_OUT-1)];
6934         wDR = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT+1,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT+1,0,NBLK_H_OUT-1)];
6935         xRatio = u16X%HORIZONTAL_STEP_OUT;
6936         wU = ( (HORIZONTAL_STEP_OUT-xRatio)*wUL + xRatio*wUR ) / HORIZONTAL_STEP_OUT;
6937         wD = ( (HORIZONTAL_STEP_OUT-xRatio)*wDL + xRatio*wDR ) / HORIZONTAL_STEP_OUT;
6938         yRatio = u16Y%VERTICAL_STEP_OUT;
6939         s32BlendWeight = ( (VERTICAL_STEP_OUT-yRatio)*wU + yRatio*wD ) / VERTICAL_STEP_OUT;
6940     }
6941     s32Depth = ( s32DepthA * ( 256 - s32BlendWeight ) + s32DepthB * s32BlendWeight ) >> 8;
6942 #else
6943     s32BlendWeight = pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[u16Y][u16X];
6944     s32Depth = ( s32DepthA * ( 256 - s32BlendWeight ) + s32DepthB * s32BlendWeight ) >> 8;
6945 #endif
6946     if(pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 1)
6947         s32Depth = s32DepthA;
6948     else if (pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 2)
6949         s32Depth = s32DepthB;
6950     else if (pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 3)
6951         s32Depth = s32BlendWeight;
6952 
6953     return s32Depth;
6954 }
6955 
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(void * pInstance)6956 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(void *pInstance)
6957 {
6958     MS_S16 s16CurDepthA = 0, s16CurDepthB = 0;
6959     MS_S16 s16PreDepthA = 0, s16PreDepthB = 0;
6960     MS_U8 u8RIdx = 0, u8GIdx = 0, u8BIdx = 0;
6961     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6962     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6963     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6964     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6965     for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6966     for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6967     for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6968     {
6969         s16CurDepthA = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx];
6970         s16CurDepthB = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx];
6971         s16PreDepthA = pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx];
6972         s16PreDepthB = pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx];
6973 
6974         s16CurDepthA = s16CurDepthA<<4;
6975         s16CurDepthB = s16CurDepthB<<4;
6976 
6977         s16CurDepthA = (s16PreDepthA*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16CurDepthA*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
6978         s16CurDepthB = (s16PreDepthB*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16CurDepthB*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
6979 
6980         pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = s16CurDepthA;
6981         pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = s16CurDepthB;
6982 
6983         pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = (s16CurDepthA+8)>>4;
6984         pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = (s16CurDepthB+8)>>4;
6985     }
6986 }
6987 
_MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(void * pInstance)6988 static void _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(void *pInstance)
6989 {
6990     MS_S16 s16X = 0, s16Y = 0;
6991     MS_U16 u16CurDepth = 0, u16PreDepth = 0;
6992     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6993     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6994     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6995     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6996     for ( s16Y = 0; s16Y < NBLK_DR_V; s16Y ++ )
6997     for ( s16X = 0; s16X < NBLK_DR_H; s16X ++ )
6998     {
6999         u16CurDepth = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[s16Y][s16X];
7000         u16PreDepth = pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[s16Y][s16X];
7001         u16CurDepth = u16CurDepth<<4;
7002         u16CurDepth = (u16PreDepth*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+u16CurDepth*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7003         pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[s16Y][s16X] = u16CurDepth;
7004         pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[s16Y][s16X] = (u16CurDepth+8)>>4;
7005     }
7006 }
7007 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(void * pInstance)7008 static void _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(void *pInstance)
7009 {
7010     MS_U8 u8AddrIdx = 0;
7011     MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7012     MS_U8 u8Idx = 0;
7013     MS_U8 u8SRAMDataA[8][64];
7014     MS_U8 u8SRAMDataB[8][64];
7015     MS_U8 u8SRAMDataIn0 = 0;
7016     MS_U8 u8SRAMDataIn1 = 0;
7017     MS_U8 u8SRAMDataIn2 = 0;
7018     MS_U8 u8SRAMDataIn3 = 0;
7019     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7020     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7021     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7022     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7023     for(u8AddrIdx =0; u8AddrIdx<64; u8AddrIdx++)
7024     {
7025         u8IdxR = u8AddrIdx&0x03;
7026         u8IdxG = (u8AddrIdx>>2)&0x03;
7027         u8IdxB = (u8AddrIdx>>4)&0x03;
7028         u8SRAMDataA[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7029         u8SRAMDataA[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7030         u8SRAMDataA[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7031         u8SRAMDataA[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7032         u8SRAMDataA[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7033         u8SRAMDataA[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7034         u8SRAMDataA[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7035         u8SRAMDataA[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7036 
7037         u8SRAMDataB[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7038         u8SRAMDataB[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7039         u8SRAMDataB[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7040         u8SRAMDataB[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7041         u8SRAMDataB[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7042         u8SRAMDataB[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7043         u8SRAMDataB[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7044         u8SRAMDataB[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7045     }
7046 
7047     //select no SRAM & Enable SRAM write
7048     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//Choose in TBA,Choose in TBB
7049     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7050 
7051     for(u8Idx =0; u8Idx<8; u8Idx++)
7052     for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7053     {
7054         u8SRAMDataIn0 = u8SRAMDataA[u8Idx][u8AddrIdx*4+0];
7055         u8SRAMDataIn1 = u8SRAMDataA[u8Idx][u8AddrIdx*4+1];
7056         u8SRAMDataIn2 = u8SRAMDataA[u8Idx][u8AddrIdx*4+2];
7057         u8SRAMDataIn3 = u8SRAMDataA[u8Idx][u8AddrIdx*4+3];
7058 
7059         //Write SRAM A
7060         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, (0x1<<u8Idx)&0xFF, 0xff);//Choose SRAM
7062         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7063         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7064         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7065         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x00, 0xff);//Choose no SRAM
7067     }
7068 
7069     for(u8Idx =0; u8Idx<8; u8Idx++)
7070     for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7071     {
7072         u8SRAMDataIn0 = u8SRAMDataB[u8Idx][u8AddrIdx*4+0];
7073         u8SRAMDataIn1 = u8SRAMDataB[u8Idx][u8AddrIdx*4+1];
7074         u8SRAMDataIn2 = u8SRAMDataB[u8Idx][u8AddrIdx*4+2];
7075         u8SRAMDataIn3 = u8SRAMDataB[u8Idx][u8AddrIdx*4+3];
7076 
7077         //Write SRAM B
7078         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7079         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, ((0x1<<u8Idx)&0xFF)<<8, 0xff00);//Choose SRAM
7080         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7081         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7082         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7083         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7084         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000, 0xff00);//Choose no SRAM
7085     }
7086 }
7087 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_PreSetting(void * pInstance)7088 static void _MDrv_SC_3D_2DTo3D_PreSetting(void *pInstance)
7089 {
7090     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7091     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7092     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7093     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7094 
7095 //#define NBLK_DR_H (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_H);
7096 //#define NBLK_DR_V (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_V);
7097 //#define PANEL_WIDTH (pXCResourcePrivate->stdrvXC_3D._u16PanelWidth)
7098 //#define PANEL_HEIGHT (pXCResourcePrivate->stdrvXC_3D._u16PanelHeight)
7099 
7100     //Get panel size output width
7101     MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
7102     if(bT3DDE_Use_MainDisplayWindow)
7103     {
7104         PANEL_WIDTH = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L) + 1;
7105         PANEL_HEIGHT= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L) + 1;
7106     }
7107     else
7108     {
7109         PANEL_WIDTH = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
7110         PANEL_HEIGHT= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
7111     }
7112     if(PANEL_WIDTH==0)
7113         PANEL_WIDTH = 0xf00;
7114     if(PANEL_HEIGHT==0)
7115         PANEL_HEIGHT = 0x870;
7116 
7117     NBLK_DR_H = ((PANEL_WIDTH + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK);  //dr h block
7118     NBLK_DR_V = ((PANEL_HEIGHT + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK); //dr v block
7119 
7120 }
7121 
_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(void * pInstance)7122 static void _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(void *pInstance)
7123 {
7124     MS_U8 u8AddrIdx = 0;
7125     MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7126     MS_U8 u8Idx = 0;
7127     MS_U8 u8SRAMDataA[8][64];
7128     MS_U8 u8SRAMDataB[8][64];
7129     MS_U8 u8SRAMDataIn0 = 0;
7130     MS_U8 u8SRAMDataIn1 = 0;
7131     MS_U8 u8SRAMDataIn2 = 0;
7132     MS_U8 u8SRAMDataIn3 = 0;
7133     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7134     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7135     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7136     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7137     for(u8AddrIdx =0; u8AddrIdx<64; u8AddrIdx++)
7138     {
7139         u8IdxR = u8AddrIdx&0x03;
7140         u8IdxG = (u8AddrIdx>>2)&0x03;
7141         u8IdxB = (u8AddrIdx>>4)&0x03;
7142         u8SRAMDataA[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7143         u8SRAMDataA[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7144         u8SRAMDataA[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7145         u8SRAMDataA[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7146         u8SRAMDataA[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7147         u8SRAMDataA[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7148         u8SRAMDataA[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7149         u8SRAMDataA[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7150 
7151         u8SRAMDataB[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7152         u8SRAMDataB[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7153         u8SRAMDataB[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7154         u8SRAMDataB[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7155         u8SRAMDataB[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7156         u8SRAMDataB[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7157         u8SRAMDataB[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7158         u8SRAMDataB[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7159     }
7160 
7161     //select no SRAM & Enable SRAM write
7162     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//Choose in TBA,Choose in TBB
7163     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7164 
7165     for(u8Idx =0; u8Idx<8; u8Idx++)
7166     for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7167     {
7168         u8SRAMDataIn0 = u8SRAMDataA[u8Idx][u8AddrIdx*4+0];
7169         u8SRAMDataIn1 = u8SRAMDataA[u8Idx][u8AddrIdx*4+1];
7170         u8SRAMDataIn2 = u8SRAMDataA[u8Idx][u8AddrIdx*4+2];
7171         u8SRAMDataIn3 = u8SRAMDataA[u8Idx][u8AddrIdx*4+3];
7172 
7173         //Write SRAM A
7174         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7175         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, (0x1<<u8Idx)&0xFF, 0xff);//Choose SRAM
7176         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7177         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7178         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7179         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7180         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x00, 0xff);//Choose no SRAM
7181     }
7182 
7183     for(u8Idx =0; u8Idx<8; u8Idx++)
7184     for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7185     {
7186         u8SRAMDataIn0 = u8SRAMDataB[u8Idx][u8AddrIdx*4+0];
7187         u8SRAMDataIn1 = u8SRAMDataB[u8Idx][u8AddrIdx*4+1];
7188         u8SRAMDataIn2 = u8SRAMDataB[u8Idx][u8AddrIdx*4+2];
7189         u8SRAMDataIn3 = u8SRAMDataB[u8Idx][u8AddrIdx*4+3];
7190 
7191         //Write SRAM B
7192         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7193         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, ((0x1<<u8Idx)&0xFF)<<8, 0xff00);//Choose SRAM
7194         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7195         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7196         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7197         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7198         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000, 0xff00);//Choose no SRAM
7199     }
7200 }
7201 #endif
7202 #if (HW_2DTO3D_VER == 4)
MainObjectDetection_U9(void)7203 static void MainObjectDetection_U9(void)//only for bule sky pattern (Golf pattern)
7204 {
7205     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7206     UtopiaResourceGetPrivate(g_pXCResource[E_XC_POOL_ID_INTERNAL_VARIABLE],(void**)(&pXCResourcePrivate));
7207 
7208     int x,y;
7209     MS_U8 MaxPosDiff_SkyColor=0;
7210     MS_U8 MaxNegDiff_SkyColor=0;
7211     MS_U32 AvgDiff_SkyColor=0;
7212     MS_U32 Avg_NonSkyColorIdx=0;
7213 
7214     MS_U8 MaxPosDiff_TpBGColor=0;
7215     MS_U8 MaxNegDiff_TpBGColor=0;
7216     MS_U32 AvgDiff_TpBGColor=0;
7217     MS_U32 Avg_NonTpBGColorIdx=0;
7218 
7219     int Diff;
7220 
7221     MS_U8 MainObjWei_SkyColor;
7222     MS_U8 MainObjWei_TpBGColor;
7223 
7224     MS_U8 BLK_cnt=0;
7225 
7226     MS_U8 tmpColorIdx[NBLK_H_MAX];
7227 
7228 
7229 
7230     BLK_cnt = 0;
7231     //mark the idx of the start of non-sky BLK
7232     for ( x = 0; x < NBLK_DD_H; x ++ )
7233     {
7234         pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x]=0;
7235         pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x]=0;
7236 
7237         BLK_cnt = 0;
7238         //for ( y = 0; y < NBLK_DD_V ; y ++ )
7239         for ( y = 1; y < NBLK_DD_V ; y ++ )
7240         {
7241             if(pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x])
7242                 BLK_cnt++;
7243         }
7244         pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] = BLK_cnt;
7245 
7246         BLK_cnt = 0;
7247         //for ( y = 0; y < NBLK_DD_V ; y ++ )
7248         for ( y = 1; y < NBLK_DD_V ; y ++ )
7249         {
7250             if(pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x])
7251                 BLK_cnt++;
7252         }
7253         pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] = BLK_cnt;
7254     }
7255 
7256     //2014.02.10 for high building pattern, median filter for stable statistic data
7257     for ( x = 0; x < NBLK_DD_H; x ++ )
7258         tmpColorIdx[x]=pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x];
7259     for ( x = 1; x < NBLK_DD_H-1; x ++ )
7260         pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] = MED(pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x-1],pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x],pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x+1]);
7261 
7262     for ( x = 0; x < NBLK_DD_H; x ++ )
7263         tmpColorIdx[x]=pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x];
7264     for ( x = 1; x < NBLK_DD_H-1; x ++ )
7265         pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] = MED(pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x-1],pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x],pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x+1]);
7266 
7267 
7268     BLK_cnt=0;
7269     //for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7270     for ( x = NBLK_DD_H/3; x < NBLK_DD_H*2/3; x ++ )
7271     {
7272         BLK_cnt++;
7273 
7274         Diff = pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] -pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x+3];
7275         AvgDiff_SkyColor = AvgDiff_SkyColor + abs(Diff);
7276 
7277         if( Diff>=0 && abs(Diff)>MaxPosDiff_SkyColor )
7278             MaxPosDiff_SkyColor = abs(Diff);
7279         if( Diff<=0 && abs(Diff)>MaxNegDiff_SkyColor )
7280             MaxNegDiff_SkyColor = abs(Diff);
7281     }
7282     AvgDiff_SkyColor = AvgDiff_SkyColor;///BLK_cnt;
7283 
7284 
7285     BLK_cnt=0;
7286     //for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7287     for ( x = NBLK_DD_H/3; x < NBLK_DD_H*2/3; x ++ )
7288     {
7289         BLK_cnt++;
7290 
7291         Diff = pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] -pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x+3];
7292         AvgDiff_TpBGColor = AvgDiff_TpBGColor + abs(Diff);
7293         if( Diff>=0 && abs(Diff)>MaxPosDiff_TpBGColor )
7294             MaxPosDiff_TpBGColor = abs(Diff);
7295         if( Diff<=0 && abs(Diff)>MaxNegDiff_TpBGColor )
7296             MaxNegDiff_TpBGColor = abs(Diff);
7297     }
7298     AvgDiff_TpBGColor = AvgDiff_TpBGColor;///BLK_cnt;
7299 
7300     BLK_cnt=0;
7301     for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7302         BLK_cnt++;
7303     for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7304         Avg_NonSkyColorIdx=Avg_NonSkyColorIdx+pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x];
7305     for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7306         Avg_NonTpBGColorIdx=Avg_NonTpBGColorIdx+pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x];
7307 
7308     Avg_NonSkyColorIdx = Avg_NonSkyColorIdx/BLK_cnt;
7309     Avg_NonTpBGColorIdx=Avg_NonTpBGColorIdx/BLK_cnt;
7310 
7311 #if 0
7312     MainObjWei_SkyColor = MaxPosDiff_SkyColor + MaxNegDiff_SkyColor;
7313     MainObjWei_TpBGColor= MaxPosDiff_TpBGColor+ MaxNegDiff_TpBGColor;
7314 #else
7315     MainObjWei_SkyColor = MAX(MaxPosDiff_SkyColor, MaxNegDiff_SkyColor)*2;
7316     MainObjWei_TpBGColor= MAX(MaxPosDiff_TpBGColor, MaxNegDiff_TpBGColor)*2;
7317 #endif
7318     //printf("\nSk %d %d %d",MaxPosDiff_SkyColor,MaxNegDiff_SkyColor,Avg_NonSkyColorIdx);
7319     //printf("\nBG %d %d %d",MaxPosDiff_TpBGColor,MaxNegDiff_TpBGColor,Avg_NonTpBGColorIdx);
7320 
7321     //MainObjWei = MIN( MAX(MainObjWei_SkyColor-MAX(4,Avg_NonSkyColorIdx/4),0), 32);
7322     //2014.02.06 add by CL, for LG subtitle pattern
7323     //MainObjWei = MIN( max3(MainObjWei_SkyColor-MAX(4,Avg_NonSkyColorIdx/4),MainObjWei_TpBGColor-MAX(4,Avg_NonTpBGColorIdx/4),0), 32);
7324 
7325     MS_U8 MainObjWeiSky = MIN( MAX(MainObjWei_SkyColor*2-MAX(8,Avg_NonSkyColorIdx),0), 32);
7326     MS_U8 MainObjWeiBGC = MIN( MAX(MainObjWei_TpBGColor*2-MAX(8,Avg_NonTpBGColorIdx),0), 32);
7327 
7328     MS_BOOL isBlue = (pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>=132&&pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp<=192)&&(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>=56&&pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp<=124);
7329     MS_BOOL isWCloud =    (pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>=124&&pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp<=152)&&(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>=104&&pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp<=132);
7330 
7331     //MainObjWei = MIN( max3(MainObjWei_SkyColor*2-MAX(8,Avg_NonSkyColorIdx),MainObjWei_TpBGColor*2-MAX(8,Avg_NonTpBGColorIdx),0), 32);
7332     if(isBlue||isWCloud)
7333         pXCResourcePrivate->stdrvXC_3D._u8MainObjWei = MainObjWeiSky;
7334     else
7335         pXCResourcePrivate->stdrvXC_3D._u8MainObjWei = MAX(MainObjWeiSky,MainObjWeiBGC);
7336 
7337 
7338 }
7339 #endif
7340 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_TrendDetection(void * pInstance)7341 static void _MDrv_SC_3D_2DTo3D_TrendDetection(void *pInstance)
7342 {
7343     //for Global Variable
7344 
7345     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7346     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7347     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7348     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7349 
7350     MS_S16 x,y;
7351     //int OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
7352     MS_S32 HorCplxSum,VerCplxSum;
7353     MS_S16 CplxTimes;
7354 
7355     CplxTimes = 2;
7356 
7357     MS_U8 VerTrend_1D[NBLK_V_MAX]={0};
7358     MS_U8 HorTrend_1D[NBLK_H_MAX]={0};
7359 
7360     MS_S32 VerTrendDiff_Max=0;
7361     MS_S32 VerTrendDiff=0;
7362     MS_S32 VerTrendDiff_Sum1=0;
7363     MS_S32 VerTrendDiff_Sum2=0;
7364     MS_S32 VerTrendDiff_Sum =0;
7365 
7366     MS_S32 VerTrendCplx_min=255;
7367     MS_S32 VerTrendCplx_Max=0;
7368 
7369     MS_S32 HorTrendCplx_min=255;
7370     MS_S32 HorTrendCplx_Max=0;
7371     memset(HorTrend_1D,0,(sizeof(MS_U8)*NBLK_H_MAX));
7372 
7373     for ( y = 0; y < NBLK_DD_V ; y ++ )
7374     {
7375         HorCplxSum = 0;
7376         for ( x = 0; x < NBLK_DD_H; x ++ )
7377         {
7378             HorCplxSum = HorCplxSum + pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7379         }
7380         HorCplxSum = HorCplxSum/NBLK_DD_H;
7381         HorCplxSum = MINMAX(HorCplxSum*CplxTimes,0,255);
7382 
7383         VerTrend_1D[y]=HorCplxSum;
7384     }
7385 
7386     for ( x = 0; x < NBLK_DD_H ; x ++ )
7387     {
7388         VerCplxSum = 0;
7389         for ( y = 0; y < NBLK_DD_V; y ++ )
7390         {
7391             VerCplxSum = VerCplxSum + pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7392         }
7393         VerCplxSum = VerCplxSum/NBLK_DD_V;
7394         VerCplxSum = MINMAX(VerCplxSum*CplxTimes,0,255);
7395 
7396         HorTrend_1D[x] = VerCplxSum;
7397     }
7398 
7399 
7400     for( y = NBLK_DD_V/8; y < NBLK_DD_V*7/8 ; y ++ )
7401     {
7402         VerTrendDiff = VerTrend_1D[y]-VerTrend_1D[y+1];
7403 
7404         VerTrendDiff_Sum1 = VerTrendDiff_Sum1 + VerTrendDiff;
7405         VerTrendDiff_Max = MAX(VerTrendDiff_Max,abs(VerTrendDiff));
7406 
7407         if(y >= NBLK_DD_V/2)
7408             VerTrendDiff_Sum2 = VerTrendDiff_Sum2 + VerTrendDiff;
7409     }
7410 
7411     //VerTrendDiff_Sum = MAX(VerTrendDiff_Sum1,VerTrendDiff_Sum2);
7412     VerTrendDiff_Sum = MAX(VerTrendDiff_Sum1,0)+MAX(VerTrendDiff_Sum2,0);
7413 
7414     for( y = NBLK_DD_V/8; y < NBLK_DD_V*7/8 ; y ++ )
7415     {
7416         VerTrendCplx_min = MIN(VerTrendCplx_min,VerTrend_1D[y]);
7417         VerTrendCplx_Max = MAX(VerTrendCplx_Max,VerTrend_1D[y]);
7418     }
7419 
7420     for( x = NBLK_DD_H/8; x < NBLK_DD_H*7/8 ; x ++ )
7421     {
7422         HorTrendCplx_min = MIN(HorTrendCplx_min,HorTrend_1D[x]);
7423         HorTrendCplx_Max = MAX(HorTrendCplx_Max,HorTrend_1D[x]);
7424     }
7425 
7426     /*
7427     if((SC_R2BYTE(REG_SC_BK23_20_L)&0x0008)==8)
7428     {
7429         printf("[%d %d !%d @%d]\r\n",HorTrendCplx_min,HorTrendCplx_Max,MINMAX((2*HorTrendCplx_min-HorTrendCplx_Max-12),0,32),MINMAX(((HorTrendCplx_min-HorTrendCplx_Max)+50)*MINMAX(HorTrendCplx_min,0,40)/40,0,32));
7430     }
7431     */
7432 
7433     MS_S32 VerTrendDiff_Sum_Wei;
7434     MS_S32 VerTrendDiff_Max_Wei;
7435 
7436     MS_S32 VerTrendCplx_Max_Wei;
7437     MS_S32 VerTrendCplx_min_Wei;
7438 
7439     MS_S32 HorTrendCplx_Max_Wei;
7440     MS_S32 HorTrendCplx_min_Wei;
7441 
7442     MS_S32 VerTrendCplx_Range_Wei;
7443 
7444     MS_S32 times,timesH,timesV;
7445     //times = 0x56;//MFC_ReadByte(REG_1EFB);
7446     times = 0x52;
7447     timesH = times&0x0F;
7448     timesV = (times&0xF0)>>4;
7449 
7450     VerTrendDiff_Sum_Wei = MINMAX(VerTrendDiff_Sum-4,0,16);//>>4
7451     VerTrendDiff_Max_Wei = MINMAX(32-VerTrendDiff_Max, 0, 16);//8~16 >>4
7452 
7453     //VerTrendCplx_Max_Wei = MINMAX((VerTrendCplx_min*4+32) - VerTrendCplx_Max, 0, 32);// >>5
7454     //VerTrendCplx_min_Wei = MINMAX(VerTrendCplx_min,0,16);//>>4
7455     VerTrendCplx_Max_Wei = MINMAX((VerTrendCplx_min*timesV+32) - VerTrendCplx_Max, 0, 32);// >>5//timesV=5
7456     VerTrendCplx_min_Wei = MINMAX(VerTrendCplx_min+4,0,16);//>>4
7457 
7458     //HorTrendCplx_Max_Wei = MINMAX((HorTrendCplx_min*timesH/2+32) - HorTrendCplx_Max, 0, 32);//>>5//timesH=5
7459     //2014.02.05 for seafood outdoor false detection
7460     //HorTrendCplx_Max_Wei = MINMAX((HorTrendCplx_min*timesH-12) - HorTrendCplx_Max, 0, 32);//>>5//timesH=5
7461     //2014.05.30 for lm14 pic mode
7462     HorTrendCplx_Max_Wei = MINMAX(((HorTrendCplx_min-HorTrendCplx_Max)+50)*MINMAX(HorTrendCplx_min,0,40)/40,0,32);
7463     HorTrendCplx_min_Wei = MINMAX(HorTrendCplx_min,0,16);//>>4
7464 
7465     VerTrendCplx_Range_Wei = MINMAX((VerTrendCplx_min_Wei+VerTrendDiff_Sum+32)-VerTrendCplx_Max,0,32);
7466 
7467     //VerGLB_Wei = (VerTrendDiff2_Max_Wei*HorTrendCplx_min_Wei*VerTrendDiff_Sum_Wei*VerTrendDiff_Max_Wei*VerTrendCplx_min_Wei)>>14;//8,16,16,16,16
7468     pXCResourcePrivate->stdrvXC_3D.u8VerGLB_Wei = (VerTrendDiff_Sum_Wei*VerTrendCplx_Max_Wei*VerTrendCplx_min_Wei*HorTrendCplx_Max_Wei*HorTrendCplx_min_Wei)>>17;//16,32,16,32,16
7469     /*if((SC_R2BYTE(REG_SC_BK23_20_L)&0x0001)==1)
7470         printf("[%d %d %d %d %d]\r\n",VerTrendDiff_Sum_Wei,VerTrendCplx_Max_Wei,VerTrendCplx_min_Wei,HorTrendCplx_Max_Wei,HorTrendCplx_min_Wei);
7471     */
7472     //VerGLB_Wei = (VerTrendCplx_Range_Wei*VerTrendDiff_Sum_Wei*VerTrendCplx_Max_Wei*VerTrendCplx_min_Wei*HorTrendCplx_Max_Wei*HorTrendCplx_min_Wei)>>22;//32,16,32,16,32,16
7473 #if 0
7474     {
7475         printf("\nVS %d, VM %d, Vm %d, HM %d, Hm %d",VerTrendDiff_Sum_Wei,VerTrendCplx_Max_Wei,VerTrendCplx_min_Wei,HorTrendCplx_Max_Wei,HorTrendCplx_min_Wei);
7476         printf("\nGLB=%d",VerGLB_Wei);
7477     }
7478 #endif
7479 
7480 
7481 }
7482 #endif
7483 
7484 
7485 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionTmp(void * pInstance)7486 static void _MDrv_SC_3D_2DTo3D_DepthDetectionTmp(void *pInstance)
7487 {
7488     //for Global Variable
7489 
7490     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7491     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7492     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7493     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7494 
7495 #if 1
7496     MS_U16 x,y,idx_x,idx_y;
7497     MS_U8 BLKWeight,BLKDepth;
7498     MS_U16 RVal,GVal,BVal,YVal;
7499     MS_U16 OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
7500     MS_U16 EDGEVal,YMinMaxDiff;
7501 
7502 
7503     MS_U8 u8testval_1EFE = 128;//MFC_ReadByte(REG_1EFE);
7504 
7505 
7506     if(NBLK_DR_V>NBLK_DD_V)
7507     {
7508         OUTIN_Ratio_Ver = NBLK_DR_V/NBLK_DD_V;
7509     }
7510     else
7511     {
7512         OUTIN_Ratio_Ver = NBLK_DD_V/NBLK_DR_V;
7513     }
7514 
7515     if(NBLK_DR_H>NBLK_DD_H)
7516     {
7517         OUTIN_Ratio_Hor = NBLK_DR_H/NBLK_DD_H;
7518     }
7519     else
7520     {
7521         OUTIN_Ratio_Hor = NBLK_DD_H/NBLK_DR_H;
7522     }
7523     for ( y = 0; y < NBLK_DR_V ; y ++ )
7524         for ( x = 0; x < NBLK_DR_H; x ++ )
7525         {
7526             if(NBLK_DR_H>NBLK_DD_H)
7527             {
7528                 idx_x = x/OUTIN_Ratio_Hor;
7529             }
7530             else
7531             {
7532                 idx_x = x*OUTIN_Ratio_Hor;
7533             }
7534 
7535             if(NBLK_DR_V>NBLK_DD_V)
7536             {
7537                 idx_y = y/OUTIN_Ratio_Ver;
7538             }
7539             else
7540             {
7541                 idx_y = y*OUTIN_Ratio_Ver;
7542             }
7543 
7544             RVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].R;
7545             GVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].G;
7546             BVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].B;
7547             EDGEVal = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[idx_y][idx_x];
7548             YVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[idx_y][idx_x].G;
7549             YMinMaxDiff = pXCResourcePrivate->stdrvXC_3D._field[(idx_y)*NBLK_DD_H+(idx_x)];
7550 
7551             if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x01)
7552             {
7553                 BLKWeight = MINMAX((RVal+GVal+BVal)/3,0,255);
7554                 BLKDepth = MINMAX((RVal+GVal+BVal)/3,0,255);
7555             }
7556             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x02)
7557             {
7558                 BLKWeight = MINMAX(RVal,0,255);
7559                 BLKDepth = MINMAX(RVal,0,255);
7560             }
7561             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x03)
7562             {
7563                 BLKWeight = MINMAX(GVal,0,255);
7564                 BLKDepth = MINMAX(GVal,0,255);
7565             }
7566             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x04)
7567             {
7568                 BLKWeight = MINMAX(BVal,0,255);
7569                 BLKDepth = MINMAX(BVal,0,255);
7570             }
7571             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x05)
7572             {
7573                 BLKWeight = MINMAX(EDGEVal,0,255);
7574                 BLKDepth = MINMAX(EDGEVal,0,255);
7575             }
7576             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x06)
7577             {
7578                 BLKWeight = ((x+y)*5);
7579                 BLKDepth = ((x+y)*5);
7580             }
7581             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x07)
7582             {
7583                 BLKWeight = ((x+y)<<2);
7584                 BLKDepth = ((x+y)<<2);
7585             }
7586             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x08)
7587             {
7588                 BLKWeight = (pXCResourcePrivate->stdrvXC_3D._bSkyMarker[idx_y][idx_x])?200:0;
7589                 BLKDepth  = (pXCResourcePrivate->stdrvXC_3D._bSkyMarker[idx_y][idx_x])?200:0;
7590             }
7591             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x09)
7592             {
7593                 BLKWeight = (pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[idx_y][idx_x])?200:0;
7594                 BLKDepth  = (pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[idx_y][idx_x])?200:0;
7595             }
7596             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0A)
7597             {
7598                 BLKWeight =(EDGEVal>=u8testval_1EFE)?200:0;
7599                 BLKDepth = (EDGEVal>=u8testval_1EFE)?200:0;
7600             }
7601             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0B)
7602             {
7603                 BLKWeight =(YVal>=u8testval_1EFE)?200:0;
7604                 BLKDepth = (YVal>=u8testval_1EFE)?200:0;
7605             }
7606             else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0C)
7607             {
7608                 BLKWeight =(YMinMaxDiff>=u8testval_1EFE)?200:0;
7609                 BLKDepth = (YMinMaxDiff>=u8testval_1EFE)?200:0;
7610             }
7611             else// if(DBG_En==0x05)
7612             {
7613                 BLKWeight = 0;
7614                 BLKDepth = 0;
7615             }
7616             //BLKWeight = MINMAX(RVal,0,255);//MINMAX(x+y,0,255);
7617             //BLKDepth = MINMAX(GVal,0,255);//MINMAX(x+y,0,255);
7618 
7619             pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = BLKWeight;
7620             pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = BLKDepth;
7621         }
7622 #if ENABLE_T3D_DEBUG
7623     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0F)
7624     {
7625         MS_U32 dummy_x = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L)&0x00FF);
7626         MS_U32 dummy_y = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L)&0xFF00)>>8;
7627         RVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].R;
7628         GVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].G;
7629         BVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].B;
7630         EDGEVal = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor];
7631         YVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].G;
7632         MS_U16 CbVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].B;
7633         MS_U16 CrVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].R;
7634         printf("\n");
7635         printf("DDH:%d, DDV:%d\n",NBLK_DD_H,NBLK_DD_V);
7636         printf("DRH:%d, DRV:%d\n",NBLK_DR_H,NBLK_DR_V);
7637         printf("BSR1=%d, BSR2=%d\n",pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
7638         printf("BGCb:%d, BGCr:%d\n",pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp,pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp);
7639         printf("[RGB]=[%d,%d,%d]\n",RVal,GVal,BVal);
7640         printf("[edge]=[%d]\n",EDGEVal);
7641         printf("[YCbCr]=[%d,%d,%d]\n",YVal,CbVal,CrVal);
7642 
7643         printf("\n");
7644     }
7645 #endif
7646 #endif
7647 
7648 
7649 #if 0
7650     //S16 CurDepthA,CurDepthB;
7651     U8 rIdx,gIdx,bIdx;
7652 
7653     for ( rIdx = 0; rIdx < 8; rIdx++ )
7654         for ( gIdx = 0; gIdx < 8; gIdx++ )
7655             for ( bIdx = 0; bIdx < 8; bIdx++ )
7656             {
7657                 _RGB3DLUT_A[rIdx][gIdx][bIdx] = rIdx*32;
7658                 _RGB3DLUT_B[rIdx][gIdx][bIdx] = rIdx*32;
7659             }
7660 #endif
7661 
7662 }
7663 #endif
7664 
7665 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthDetectionPIX(void * pInstance)7666 static void _MDrv_SC_3D_2DTo3D_DepthDetectionPIX(void *pInstance)
7667 {
7668     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7669     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7670     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7671     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7672     MS_S16 s16BlueAndFlatBlkCnt = 0;
7673     MS_S16 s16BlueAndFlatBlkCnt_Dn = 0;
7674     MS_S16 x = 0, y = 0;
7675     PIXEL stPP;
7676     MS_S16 s16MaxEdgeRGB = 0, s16BlkSat = 0;
7677     MS_BOOL bBlue =  FALSE, bWCloud = FALSE;
7678     MS_BOOL bBGCOLOR_Tp = FALSE, bBGCOLOR_Dn = FALSE;
7679     MS_S16 s16BlueSkyRatio1 = 0, s16BlueSkyRatio2 = 0;
7680     MS_S16 s16NonSkyRate = 0;
7681     MS_S8 i = 0, j = 0;
7682     MS_U32 u32SumEdge = 0;
7683     //IIR related
7684     MS_S16 s16DistantViewRatio1 = 0, s16DistantViewRatio2 = 0;
7685     MS_S16 s16Index_BL = 0;
7686     MS_U8 u8RegionBlkWeightFrame_Tmp[NBLK_V_MAX][NBLK_H_MAX];
7687     MS_S16 s16OutIn_Ratio_Ver = 0, s16OutIn_Ratio_Hor = 0;
7688     MS_S16 s16Cur_YSep = 0;
7689     MS_U32 u32RegionBlkWei = 0;
7690     MS_U32 u32PreRegionBlkWei = 0;
7691     MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
7692     MS_U32 u32VRatio = gSrcInfo[MAIN_WINDOW].stDispWin.height*10/DISPLAY_DD_V;
7693     MS_U32 u32HRatio = gSrcInfo[MAIN_WINDOW].stDispWin.width*10/DISPLAY_DD_H;
7694 
7695     MS_WINDOW_TYPE stDispWin;
7696     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
7697     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
7698     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
7699     {
7700         u32VRatio = stDispWin.height*10/DISPLAY_DD_V;
7701         u32HRatio = stDispWin.width*10/DISPLAY_DD_H;
7702     }
7703 
7704     memset(&stPP, 0, sizeof(PIXEL));
7705     if(u32ScalingRatio == 0)
7706     {
7707         u32ScalingRatio = 1;
7708     }
7709 
7710     _MDrv_SC_3D_2DTo3D_BGColorDetection(pInstance);
7711 
7712     s16BlueAndFlatBlkCnt = 0;
7713     s16BlueAndFlatBlkCnt_Dn = 0;
7714 
7715     pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt = 0;
7716     pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt = 0;
7717 
7718 #if BACKLIGHTIIR
7719     //inital IIR buffer
7720     if(pXCResourcePrivate->stdrvXC_3D.s_bFirst)
7721     {
7722         MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7723         MS_U8 x = 0, y = 0;
7724         for(u8IdxR=0;u8IdxR<8;u8IdxR++)
7725         for(u8IdxG=0;u8IdxG<8;u8IdxG++)
7726         for(u8IdxB=0;u8IdxB<8;u8IdxB++)
7727         {
7728             pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8IdxR][u8IdxG][u8IdxB] = 128<<4;//.4
7729             pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8IdxR][u8IdxG][u8IdxB] = 128<<4;//.4
7730         }
7731 
7732         for(y=0;y<NBLK_DR_V;y++)
7733         for(x=0;x<NBLK_DR_H;x++)
7734         {
7735             pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[y][x] = 128<<4;//.4
7736             pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = 128<<4;//.4
7737         }
7738         pXCResourcePrivate->stdrvXC_3D.s_bFirst = FALSE;
7739     }
7740 
7741     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7742     {
7743         s16Cur_YSep = (_MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance))<<4;
7744         pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = ( pXCResourcePrivate->stdrvXC_3D.u16Pre_YSep * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + s16Cur_YSep * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // do IIR
7745         pXCResourcePrivate->stdrvXC_3D.u16Pre_YSep = pXCResourcePrivate->stdrvXC_3D._u16Y_Sep;
7746         pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = (pXCResourcePrivate->stdrvXC_3D._u16Y_Sep+8)>>4;
7747     }
7748     else
7749     {
7750         pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = _MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance);
7751     }
7752 #else
7753     pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = _MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance);
7754 #endif
7755 
7756     pXCResourcePrivate->stdrvXC_3D._u16Y_Sep_OUT = pXCResourcePrivate->stdrvXC_3D._u16Y_Sep*u32VRatio/10;
7757 
7758 #if PRINTINFO
7759     printf("=====_u16Y_Sep=====\n");
7760     printf("_u16Y_Sep_OUT = %u\n", pXCResourcePrivate->stdrvXC_3D._u16Y_Sep_OUT);
7761 #endif
7762     for ( y = 0; y < NBLK_DD_V ; y ++ )
7763     {
7764         for ( x = 0; x < NBLK_DD_H; x ++ )
7765         {
7766             s16MaxEdgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7767 
7768             stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
7769             //bBlue = s16MaxEdgeRGB < 10 && stPP.B > 100 && stPP.B > stPP.R*1.25 && stPP.B > stPP.G && stPP.G > stPP.R;  //latest by CL
7770             // bBlue = s16MaxEdgeRGB < 16 && stPP.B > 100 && stPP.B > stPP.R*1.25 && stPP.B > stPP.G && stPP.G > stPP.R;
7771             //bBlue = s16MaxEdgeRGB < 10 && stPP.B > 100  && stPP.B > stPP.G && stPP.G > stPP.R;  //by tomato
7772             bBlue = (s16MaxEdgeRGB < 10) && (stPP.B > 100) && (stPP.B > (stPP.R*5/4)) && (stPP.B > stPP.G) && (stPP.G > stPP.R);  //latest by CL
7773 
7774             s16BlkSat = (MAX3(stPP.R,stPP.G,stPP.B)==0)?0:((MAX3(stPP.R,stPP.G,stPP.B)-MIN3(stPP.R,stPP.G,stPP.B))*256)/MAX3(stPP.R,stPP.G,stPP.B);
7775             //bWCloud =  (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>210 && s16BlkSat<24 && (y <= NBLK_V/4);
7776             //bWCloud =  (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>200 && s16BlkSat<24 && (y <= NBLK_V/4);
7777             //bWCloud =  (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>190 && s16BlkSat<52 && (y <= NBLK_V/4);
7778             bWCloud =  (s16MaxEdgeRGB < 10) && MIN(stPP.R,stPP.G)>170&& stPP.B>190 && s16BlkSat<52 && (y <= NBLK_DD_V/4);
7779 
7780             bBlue = (bBlue||bWCloud);
7781 
7782             if ( bBlue ) // upper & white
7783             {
7784                 //if(y<=NBLK_V/4)// 2012.11.30 modify by CL
7785                     if(y<=NBLK_DD_V/4&& x>=NBLK_DD_H/4 && x<=NBLK_DD_H*3/4 )// 2012.11.30 modify by CL
7786                         s16BlueAndFlatBlkCnt=s16BlueAndFlatBlkCnt+2;
7787                     else
7788                         s16BlueAndFlatBlkCnt ++;
7789             }
7790 
7791             if(bBlue&&y>=NBLK_DD_V*3/4)
7792                 s16BlueAndFlatBlkCnt_Dn++;
7793             //for both BlueSky & BG color
7794             bBGCOLOR_Tp = pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
7795             bBGCOLOR_Dn = pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x];
7796 
7797             if(bBGCOLOR_Tp && bBlue)
7798                 pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt++;
7799 
7800             if(bBGCOLOR_Dn && bBlue)
7801                 pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt++;
7802         }
7803     }
7804 
7805     pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueAndFlatBlkCnt = s16BlueAndFlatBlkCnt;
7806     pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueAndFlatBlkCnt_Dn = s16BlueAndFlatBlkCnt_Dn;
7807 
7808     //_s16BothTpBGSKY_COLORCnt = MINMAX(_s16BothTpBGSKY_COLORCnt/(FRAME_WIDTH*FRAME_HEIGHT/FHD_W/FHD_H),0,32);
7809     //_s16BothDnBGSKY_COLORCnt = MINMAX(_s16BothDnBGSKY_COLORCnt/(FRAME_WIDTH*FRAME_HEIGHT/FHD_W/FHD_H),0,32);
7810     pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt*1000/u32ScalingRatio/2,0,32);
7811     pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt*1000/u32ScalingRatio/2,0,32);
7812 
7813     s16BlueSkyRatio1 = MINMAX( s16BlueAndFlatBlkCnt*1000/u32ScalingRatio/2, 0, 32 );
7814     s16BlueSkyRatio2 = MINMAX( s16BlueAndFlatBlkCnt_Dn*1000/u32ScalingRatio/2, 0, 32 );
7815 
7816 #if PRINTINFO
7817     printf("Cnt =%u, Rat1=%u, PR1=%u\n", s16BlueAndFlatBlkCnt,s16BlueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1);
7818     printf("CntD=%u, Rat2=%u, PR2=%u\n", s16BlueAndFlatBlkCnt_Dn,s16BlueSkyRatio2,pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2);
7819 #endif
7820 
7821     s16BlueSkyRatio1 = MAX(MAX(s16BlueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei),0);
7822     s16BlueSkyRatio2 = MAX(s16BlueSkyRatio2,0);
7823 
7824     s16BlueSkyRatio1 = MINMAX(s16BlueSkyRatio1,0,32);
7825     s16BlueSkyRatio2 = MINMAX(s16BlueSkyRatio2,0,32);
7826 
7827     // keeps sky ratio stable
7828     {
7829         if(abs(s16BlueSkyRatio1-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1)<=3 &&abs(s16BlueSkyRatio2-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2)<=3)
7830         {
7831             s16BlueSkyRatio1 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1;
7832             s16BlueSkyRatio2 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2;
7833         }
7834 
7835         if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7836         {
7837             s16BlueSkyRatio1 = (pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16BlueSkyRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7838             s16BlueSkyRatio2 = (pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16BlueSkyRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7839         }
7840 
7841         pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1 = s16BlueSkyRatio1;
7842         pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2 = s16BlueSkyRatio2;
7843     }
7844 
7845     pXCResourcePrivate->stdrvXC_3D._s16BlueSkyRatio = s16BlueSkyRatio1;
7846 
7847 #if PRINTINFO
7848     printf("BSCnt =%u\n", pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt);
7849     printf("BSCntD=%u\n", pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt);
7850     printf("DistantViewRatio1_Cur = %u, DistantViewRatio2_Cur = %u\n",s16BlueSkyRatio1,s16BlueSkyRatio2);
7851 #endif
7852 
7853 #if BACKLIGHTIIR
7854     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7855     {
7856 #if PRINTINFO
7857         printf("In IIR Processing\n");
7858         printf("DistantViewRatio1_Cur = %u, DistantViewRatio2_Cur = %u\n",s16BlueSkyRatio1,s16BlueSkyRatio2);
7859         printf("DistantViewRatio1_Pre = %u, DistantViewRatio2_Pre = %u\n",pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1>>4,pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2>>4);
7860 #endif
7861         s16DistantViewRatio1 = s16BlueSkyRatio1<<4;
7862         s16DistantViewRatio2 = s16BlueSkyRatio2<<4;
7863 
7864         s16DistantViewRatio1 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16DistantViewRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7865         s16DistantViewRatio2 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16DistantViewRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7866 
7867         pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1 = s16DistantViewRatio1;
7868         pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2 = s16DistantViewRatio2;
7869 
7870         s16DistantViewRatio1 = (s16DistantViewRatio1+8)>>4;
7871         s16DistantViewRatio2 = (s16DistantViewRatio2+8)>>4;
7872 #if PRINTINFO
7873         printf("DistantViewRatio1_new = %u, DistantViewRatio2_new = %u\n",s16DistantViewRatio1,s16DistantViewRatio2);
7874 #endif
7875 
7876     }
7877     else
7878     {
7879         s16DistantViewRatio1 = s16BlueSkyRatio1;
7880         s16DistantViewRatio2 = s16BlueSkyRatio2;
7881     }
7882 #else
7883     s16DistantViewRatio1 = s16BlueSkyRatio1;
7884     s16DistantViewRatio2 = s16BlueSkyRatio2;
7885 #endif
7886 
7887     pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 = MINMAX(s16DistantViewRatio1-s16DistantViewRatio2,0,32);//DView weight
7888     s16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
7889     s16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
7890 
7891     for ( y = 0; y < NBLK_DD_V; y ++ )
7892     {
7893         for ( x = 0; x < NBLK_DD_H; x ++ )
7894         {
7895             // ---------default method ----------------//
7896             //int s16NonSkyRate = _u16BlockStatus_Edge[y/_u8Vertical_Step][x/_u8Horizontal_Step]; // edge
7897             //s16NonSkyRate = MAX( s16NonSkyRate, 256 - s16BlueSkyRatio1*8 );
7898             //s16NonSkyRate = MAX( s16NonSkyRate, y*256/FRAME_HEIGHT ); // vertical position
7899             //s16NonSkyRate = MINMAX(s16NonSkyRate- s16BlueSkyRatio2*4,0,MAXVALUE);// for full blue sky background
7900             //--------------end of default method ----------------//
7901 
7902             s16NonSkyRate = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]; // edge
7903             s16NonSkyRate = MAX( s16NonSkyRate, 256 - s16BlueSkyRatio1*8 );
7904 
7905             if(NBLK_DD_V == 0)
7906             {
7907                 s16NonSkyRate = MAX( s16NonSkyRate, y*256); // vertical position
7908             }
7909             else
7910             {
7911                 s16NonSkyRate = MAX( s16NonSkyRate, (y*256)/NBLK_DD_V ); // vertical position
7912             }
7913 
7914             //s16NonSkyRate = MAX( s16NonSkyRate, new_y*256/(FRAME_HEIGHT-_u16Y_Sep)); // vertical position
7915             s16NonSkyRate = MINMAX(s16NonSkyRate- s16BlueSkyRatio2*8,0,MAXVALUE);// for full blue sky background
7916             s16NonSkyRate = MINMAX( s16NonSkyRate, 0, MAXVALUE );
7917 
7918             u8RegionBlkWeightFrame_Tmp[y][x] = s16NonSkyRate;
7919         }
7920     }
7921 
7922 #if PRINTINFO
7923     printf("_s16DistantViewWei = %u, _s16DistantViewWei_Bottom = %u\n",pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei,pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei_Bottom);
7924 #endif
7925 
7926     // LPF of _u8RegionBlkWeightFrame
7927     for ( y = 0; y < NBLK_DR_V; y ++ )
7928     {
7929         for ( x = 0; x < NBLK_DR_H; x ++ )
7930         {
7931             // 5x5 LPF
7932             u32SumEdge = MAXVALUE;
7933 
7934             if(x>=1&&x<NBLK_DR_H-1&&y>=1&&y<NBLK_DR_V-1)//boundary case
7935             {
7936                 for ( i = -1; i <= 1; i ++ )
7937                 for ( j = -1; j <= 1; j ++ )
7938                 {
7939                     u32SumEdge = MIN( u32SumEdge, u8RegionBlkWeightFrame_Tmp[(y+j)*10/s16OutIn_Ratio_Ver][(x+i)*10/s16OutIn_Ratio_Hor]);
7940                     //u32SumEdge += u8RegionBlkWeightFrame_Tmp[y+j][x+i];
7941                 }
7942             }
7943             else//boundary case
7944             {
7945                 for ( i = -1; i <= 1; i ++ )
7946                 for ( j = -1; j <= 1; j ++ )
7947                 {
7948                     u32SumEdge = MIN( u32SumEdge, u8RegionBlkWeightFrame_Tmp[MINMAX(y+j,0,NBLK_DR_V-1)*10/s16OutIn_Ratio_Ver][MINMAX(x+i,0,NBLK_DR_H-1)*10/s16OutIn_Ratio_Hor]);
7949                     //u32SumEdge += u8RegionBlkWeightFrame_Tmp[y+j][x+i];
7950                 }
7951             }
7952             u32SumEdge = MINMAX( u32SumEdge, 0, MAXVALUE );
7953             //u32SumEdge = MINMAX( u32SumEdge/9, 0, MAXVALUE );
7954 
7955             pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = u32SumEdge;
7956 
7957 
7958         }
7959     }
7960 
7961 #if BACKLIGHTIIR
7962     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7963     {
7964         for ( y = 0; y < NBLK_DR_V; y ++ )
7965         for ( x = 0; x < NBLK_DR_H; x ++ )
7966         {
7967             u32RegionBlkWei = (pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x])<<4;
7968             u32PreRegionBlkWei = pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x];
7969             u32RegionBlkWei = ( u32PreRegionBlkWei * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + u32RegionBlkWei * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // doBL_IIR
7970             pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = u32RegionBlkWei;
7971             pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = (u32RegionBlkWei+8) >>4;
7972         }
7973     }
7974 #endif
7975 
7976     // Prepare RGB 3D LUT 8x8x8, SW based!!!
7977     _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(pInstance, s16Index_BL );
7978 #if BACKLIGHTIIR
7979     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7980     {
7981         _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(pInstance);
7982     }
7983 #endif
7984 }
7985 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(void * pInstance)7986 static void _MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(void *pInstance)
7987 {
7988 
7989     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7990     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7991     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7992     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7993 
7994     MS_S16 x,y;
7995     MS_S16 blueSkyRatio1, blueSkyRatio2;
7996     MS_S16 nonSkyRate;
7997 
7998     MS_S8 i,j;
7999     MS_U32 sumEdge;
8000     MS_S8 mapping_yidx;
8001     MS_S8 mapping_xidx;
8002 
8003     //IIR related
8004     MS_S16 DistantViewRatio1, DistantViewRatio2;
8005 
8006     MS_U8 **_RegionBlkWeightFrame_tmp;
8007     MS_S16 OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
8008     MS_U32 RegionBlkWei = 0;
8009     MS_U32 PreRegionBlkWei = 0;
8010 
8011     MS_S16 BGColorBlkCnt =0;
8012     MS_S16 BGColorBlkCnt_Dn =0;
8013 
8014     MS_U8 BGColorRatio1,BGColorRatio2;
8015 
8016     //Blue SKy Detection
8017     PIXEL pp,ppYCC;
8018     MS_U8 maxedgeRGB;
8019     MS_U8 BlkSat, notSkyFlat;
8020     MS_S16 blueAndFlatBlkCnt = 0;
8021     MS_S16 blueAndFlatBlkCnt_Dn = 0;
8022 
8023     MS_BOOL isBlue,isWCloud,isSky,isSky_ful;
8024     MS_U8 id_v=0,id_h=0;
8025     MS_U8 u8tmpval = 0x18;//16;//
8026 
8027     MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
8028     if(u32ScalingRatio == 0)
8029     {
8030         u32ScalingRatio = 1;
8031     }
8032 
8033 #if DUMYGAINCTRL
8034     MS_U8 u8tempval1EFC = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_59_L)&0x00F0)>>4;
8035 #else
8036     MS_U8 u8tempval1EFC = 0;//
8037 #endif
8038     _RegionBlkWeightFrame_tmp = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8039     for( y = 0;y < NBLK_V_MAX ;y++)
8040         _RegionBlkWeightFrame_tmp[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8041     for ( y = 0; y < NBLK_DD_V ; y ++ )
8042         for ( x = 0; x < NBLK_DD_H; x ++ )
8043             //for ( x = NBLK_DD_H>>3; x < (NBLK_DD_H*7)>>3; x ++ )//2014.02.11 for LG seafood dish
8044         {
8045             maxedgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
8046             pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8047             ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
8048 
8049             //isBlue = (maxedgeRGB < u8tmpval) && (pp.B > 100) && (pp.B > (pp.R*9/8)) && (pp.B > pp.G) && (pp.G > pp.R);  //latest by CL
8050             isBlue = (maxedgeRGB < u8tmpval)&&(ppYCC.B>=132&&ppYCC.B<=192)&&(ppYCC.R>=56&&ppYCC.R<=124)&& (ppYCC.G>=56) && pp.B>=0;//ppYCC.B>=140;//ppYCC.G>=52;//&& ppYCC.G>=96
8051 
8052             BlkSat = (MAX3(pp.R,pp.G,pp.B)<=32)?0:((MAX3(pp.R,pp.G,pp.B)-MIN3(pp.R,pp.G,pp.B))*256)/MAX3(pp.R,pp.G,pp.B);
8053 
8054             //isWCloud =  (maxedgeRGB < u8tmpval) && MIN(pp.R,pp.G)>170&& pp.B>190 && BlkSat<52 && (y <= NBLK_DD_V/4 && x>=NBLK_DD_H/4 && x<=NBLK_DD_H*3/4);
8055             //isWCloud =  (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=140)&&(ppYCC.R>=116&&ppYCC.R<=132)&& ppYCC.G>=160;
8056             isWCloud =  (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=152)&&(ppYCC.R>=104&&ppYCC.R<=132)&& (ppYCC.G>=160);
8057             //isWCloud = false;
8058 
8059             isSky = (isBlue||isWCloud);
8060             notSkyFlat = (maxedgeRGB < u8tmpval)&&(!isSky)&&(BlkSat>200);
8061 
8062             if(x >= (NBLK_DD_H>>3) && x <= ((NBLK_DD_H*7)>>3))
8063             {
8064                 if ( isSky ) // upper & white
8065                 {
8066                     if(y<=NBLK_DD_V>>2&& x>=NBLK_DD_H>>2 && x<=(NBLK_DD_H*3)>>2 )// 2012.11.30 modify by CL
8067                         blueAndFlatBlkCnt=blueAndFlatBlkCnt+2;
8068                     else if(y<=NBLK_DD_V>>2 && ( x<NBLK_DD_H>>2 || x>(NBLK_DD_H*3)>>2))
8069                         blueAndFlatBlkCnt ++;
8070                 }
8071                 else if(notSkyFlat)
8072                     blueAndFlatBlkCnt--;
8073 
8074                 if(isSky&&y>=(NBLK_DD_V*3)>>2)
8075                     blueAndFlatBlkCnt_Dn++;
8076                 else if(notSkyFlat && y>=(NBLK_DD_V*3)>>2)
8077                     blueAndFlatBlkCnt_Dn--;
8078             }
8079 
8080             //isWCloud is the same formula with upper one, but no spatial limit
8081             //isWCloud  = (maxedgeRGB < u8tmpval) && MIN(pp.R,pp.G)>170&& pp.B>190 && BlkSat<52;
8082             //isWCloud =  (maxedgeRGB < u8tmpval) && (ppYCC.B>=116&&ppYCC.B<=140)&&(ppYCC.R>=116&&ppYCC.R<=140)&& ppYCC.G>=160;
8083             isWCloud =  (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=152)&&(ppYCC.R>=104&&ppYCC.R<=132)&& ppYCC.G>=160;
8084             isSky_ful = (isBlue||isWCloud);//detect Sky without spatial limit
8085 
8086             if(isSky_ful)
8087                 pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x] = true;
8088             else
8089                 pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x] = false;
8090 
8091         }
8092     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8093     {
8094         printf("\nskycnt1:%d, Dn:%d, scalingR:%td",blueAndFlatBlkCnt,blueAndFlatBlkCnt_Dn,(ptrdiff_t)u32ScalingRatio);
8095         printf("\nDisDD_H:%d, DisDD_V:%d",DISPLAY_DD_H,DISPLAY_DD_V);
8096     }
8097 
8098     //printf("\nBFC:%d, BFCDn:%d",blueAndFlatBlkCnt,blueAndFlatBlkCnt_Dn);
8099 
8100     //blueSkyRatio1 = MINMAX( blueAndFlatBlkCnt/sizeratio/2, 0, 32 );
8101     //blueSkyRatio2 = MINMAX( blueAndFlatBlkCnt_Dn/sizeratio/2, 0, 32 );
8102     blueSkyRatio1 = MINMAX( (MS_S16)((blueAndFlatBlkCnt-32)*1000/u32ScalingRatio)/2, 0, 32 );
8103     blueSkyRatio2 = MINMAX( (MS_S16)((blueAndFlatBlkCnt_Dn-32)*1000/u32ScalingRatio)/2, 0, 32 );
8104 
8105     BGColorBlkCnt = MIN(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp,128);
8106     BGColorBlkCnt_Dn = MIN( MIN(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp,pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn), 128);
8107 
8108     BGColorRatio1 = MINMAX( (BGColorBlkCnt-16)/4, 0, 32 );
8109     BGColorRatio2 = MINMAX( (BGColorBlkCnt_Dn-16)/4, 0, 32 );
8110 
8111     //printf("\nBG1:%d, BG2:%d",BGColorRatio1,BGColorRatio2);
8112     //printf("\nsky1:%d, sky2:%d",blueSkyRatio1,blueSkyRatio2);
8113     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8114     {
8115         printf("\nBG1:%d, BG2:%d",BGColorRatio1,BGColorRatio2);
8116         printf("\nsky1:%d, sky2_d:%d",blueSkyRatio1,blueSkyRatio2);
8117     }
8118 
8119     MS_S16 s16Skyratiodiff = blueSkyRatio1 - blueSkyRatio2;
8120     MS_S16 s16BGCratiodiff = BGColorRatio1 - BGColorRatio2;
8121 
8122 
8123     blueSkyRatio1 = MIN( blueSkyRatio2+MAX(s16Skyratiodiff,s16BGCratiodiff), 32 );
8124     blueSkyRatio2 = blueSkyRatio2;
8125 
8126     pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei = MINMAX(BGColorRatio2-blueSkyRatio2,0,32);//When TBB is affect by BGColor more than Sky color, use TBA BG color in TBB;
8127 
8128 
8129     //printf("\nfnsky1:%d, fnsky2:%d",blueSkyRatio1,blueSkyRatio2);
8130     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8131     {
8132         printf("\nfnsky1:%d, fnsky2:%d",blueSkyRatio1,blueSkyRatio2);
8133     }
8134 //----- TRENDDETECTON -----
8135     blueSkyRatio1 = MAX(blueSkyRatio1,pXCResourcePrivate->stdrvXC_3D.u8VerGLB_Wei);
8136     //printf("\nftsky1:%d, ftsky2:%d",blueSkyRatio1,blueSkyRatio2);
8137     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8138     {
8139         printf("\nftsky1:%d, ftsky2:%d",blueSkyRatio1,blueSkyRatio2);
8140     }
8141 
8142 
8143 
8144 //----- MAINOBJDETECTON ----
8145     MainObjectDetection_U9();
8146     blueSkyRatio1 = MAX(blueSkyRatio1- pXCResourcePrivate->stdrvXC_3D._u8MainObjWei,0);
8147     blueSkyRatio2 = MAX(blueSkyRatio2- pXCResourcePrivate->stdrvXC_3D._u8MainObjWei,0);
8148     //printf("\nfmsky1:%d, fmsky2:%d\n",blueSkyRatio1,blueSkyRatio2);
8149     if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8150     {
8151         printf("\nfmsky1:%d, fmsky2:%d\n",blueSkyRatio1,blueSkyRatio2);
8152     }
8153 
8154 
8155     //DBG
8156     MS_U8 force_TBAB = 0;
8157 
8158     if(force_TBAB==0x1)//all TBA
8159     {
8160         blueSkyRatio1 = 32;
8161         blueSkyRatio2 = 32;
8162     }
8163     else if(force_TBAB==0x2)//all TBB
8164     {
8165         blueSkyRatio1 = 0;
8166         blueSkyRatio2 = 0;
8167     }
8168     else if(force_TBAB==0x3)//all TBA->TBB
8169     {
8170         blueSkyRatio1 = 32;
8171         blueSkyRatio2 = 0;
8172     }
8173 
8174     // keeps sky ratio stable
8175     {
8176         if(abs(blueSkyRatio1-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1)<=3 &&abs(blueSkyRatio2-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2)<=3)
8177         {
8178             blueSkyRatio1 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1;
8179             blueSkyRatio2 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2;
8180         }
8181         pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1 = blueSkyRatio1;
8182         pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2 = blueSkyRatio2;
8183     }
8184 
8185 
8186 
8187 
8188     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8189     {
8190         DistantViewRatio1 = blueSkyRatio1<<4;
8191         DistantViewRatio2 = blueSkyRatio2<<4;
8192 
8193         DistantViewRatio1 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+DistantViewRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
8194         DistantViewRatio2 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+DistantViewRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
8195 
8196         pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1 = DistantViewRatio1;
8197         pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2 = DistantViewRatio2;
8198 
8199         DistantViewRatio1 = (DistantViewRatio1+8)>>4;
8200         DistantViewRatio2 = (DistantViewRatio2+8)>>4;
8201 #if PRINTINFO
8202         printf(" \r\nDistantViewRatio1_new = %d, DistantViewRatio2_new = %d \r\n",DistantViewRatio1,DistantViewRatio2);
8203 #endif
8204 
8205     }
8206     else
8207     {
8208         DistantViewRatio1 = blueSkyRatio1;
8209         DistantViewRatio2 = blueSkyRatio2;
8210     }
8211 
8212 
8213     pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 = MINMAX(DistantViewRatio1-DistantViewRatio2,0,32);//DView weight
8214 
8215     if(NBLK_DR_V>NBLK_DD_V)
8216     {
8217         OUTIN_Ratio_Ver = NBLK_DR_V/NBLK_DD_V;
8218     }
8219     else
8220     {
8221         OUTIN_Ratio_Ver = NBLK_DD_V/NBLK_DR_V;
8222     }
8223     if(NBLK_DR_H>NBLK_DD_H)
8224     {
8225         OUTIN_Ratio_Hor = NBLK_DR_H/NBLK_DD_H;
8226     }
8227     else
8228     {
8229         OUTIN_Ratio_Hor = NBLK_DD_H/NBLK_DR_H;
8230     }
8231 
8232     for(id_v=0; OUTIN_Ratio_Ver>1; id_v++)
8233     {
8234         OUTIN_Ratio_Ver=OUTIN_Ratio_Ver>>1;
8235     }
8236     for(id_h=0; OUTIN_Ratio_Hor>1; id_h++)
8237     {
8238         OUTIN_Ratio_Hor=OUTIN_Ratio_Hor>>1;
8239     }
8240 
8241     pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1 = blueSkyRatio1;
8242     pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2 = blueSkyRatio2;
8243     MS_U8 BLK_Y;
8244     MS_BOOL BGSkyCheck;
8245 
8246     for ( y = 0; y < NBLK_DD_V; y ++ )
8247     {
8248         for ( x = 0; x < NBLK_DD_H; x ++ )
8249         {
8250             // ---------default method ----------------//
8251             //int nonSkyRate = _blockStatus2[y/VERTICAL_STEP][x/HORIZONTAL_STEP]; // edge
8252             //nonSkyRate = MAX( nonSkyRate, 256 - blueSkyRatio1*8 );
8253             //nonSkyRate = MAX( nonSkyRate, y*256/FRAME_HEIGHT ); // vertical position
8254             //nonSkyRate = MINMAX(nonSkyRate- blueSkyRatio2*4,0,255);// for full blue sky background
8255             //--------------end of default method ----------------//
8256             BGSkyCheck = pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x]||pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
8257             BLK_Y = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x].G;
8258             maxedgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]; // edge
8259             nonSkyRate = maxedgeRGB;
8260             nonSkyRate = MAX( nonSkyRate, 256 - blueSkyRatio1*8 );
8261 
8262             nonSkyRate = MAX( nonSkyRate, (y*256)/NBLK_DD_V ); // vertical position
8263 
8264             //    nonSkyRate = MAX( nonSkyRate, new_y*256/(FRAME_HEIGHT-y_sep)); // vertical position
8265             nonSkyRate = MINMAX(nonSkyRate- blueSkyRatio2*8,0,255);// for full blue sky background
8266 
8267             nonSkyRate = MAX(nonSkyRate,pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]);
8268 
8269             nonSkyRate = MINMAX( nonSkyRate, 0, 255 );
8270 
8271             //nonSkyRate = MIN(nonSkyRate,(maxedgeRGB<<4));
8272             if((BGSkyCheck)&&maxedgeRGB<=16&&(u8tempval1EFC)==0x08)
8273             {
8274                 if(maxedgeRGB>8)
8275                     nonSkyRate = (MIN(nonSkyRate,maxedgeRGB)+nonSkyRate)>>1;
8276                 else
8277                     nonSkyRate = MIN(nonSkyRate,maxedgeRGB);
8278             }
8279 
8280             _RegionBlkWeightFrame_tmp[y][x] = nonSkyRate;
8281 
8282         }
8283     }
8284 
8285 
8286     // LPF of _RegionBlkWeightFrame
8287     for ( y = 0; y < NBLK_DR_V; y ++ )
8288     {
8289         for ( x = 0; x < NBLK_DR_H; x ++ )
8290         {
8291 
8292             if(NBLK_DR_V>NBLK_DD_V)
8293             {
8294                 mapping_yidx = y>>id_v;
8295             }
8296             else
8297             {
8298                 mapping_yidx = y<<id_v;
8299             }
8300 
8301             if(NBLK_DR_H>NBLK_DD_H)
8302             {
8303                 mapping_xidx = x>>id_h;
8304             }
8305             else
8306             {
8307                 mapping_xidx = x<<id_h;
8308             }
8309             sumEdge = _RegionBlkWeightFrame_tmp[mapping_yidx][mapping_xidx];
8310             for ( i = -2; i <= 2; i ++ )
8311                 for ( j = -2; j <= 2; j ++ )
8312                 {
8313                     sumEdge = sumEdge+  _RegionBlkWeightFrame_tmp[MINMAX(mapping_yidx+j,0,NBLK_DR_V-1)][MINMAX(mapping_xidx+i,0,NBLK_DR_H-1)];
8314                 }
8315             //sumEdge = MINMAX( sumEdge, 0, 255 );
8316             sumEdge = MINMAX( sumEdge/25, 0, 255 );
8317 
8318             pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = sumEdge;
8319         }
8320     }
8321 
8322     // add new backlight detection
8323 
8324 
8325     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8326     {
8327         for ( y = 0; y < NBLK_DR_V; y ++ )
8328             for ( x = 0; x < NBLK_DR_H; x ++ )
8329             {
8330 
8331                 RegionBlkWei = (pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x])<<4;
8332                 PreRegionBlkWei = pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x];
8333                 RegionBlkWei = ( PreRegionBlkWei * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + RegionBlkWei * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // doBL_IIR
8334                 pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = RegionBlkWei;
8335                 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = (RegionBlkWei+8) >>4;
8336             }
8337     }
8338 
8339         for( y = 0;y < NBLK_V_MAX ;y++)
8340             free(_RegionBlkWeightFrame_tmp[y]);
8341         free(_RegionBlkWeightFrame_tmp);
8342 
8343     }
8344 #endif
8345 
8346 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthDetectionBLK(void * pInstance)8347 static void _MDrv_SC_3D_2DTo3D_DepthDetectionBLK(void *pInstance)
8348 {
8349     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8350     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8351     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8352     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8353     MS_S16 x = 0, y = 0, xx = 0, yy = 0, xj = 0, yj = 0;
8354     MS_S16 s16XRange = 0;
8355     MS_S16 s16Yrange = 0;
8356     MS_S16 s16Num = 1;
8357     PIXEL stAvgPixel, stCurPixel, stJPixel;
8358     MS_S16 s16Depth = 0;
8359     MS_U16 u16OutIn_Ratio_Ver = 0,u16OutIn_Ratio_Hor = 0;
8360     MS_U8 u8DepthBlkBased_Tmp[NBLK_V_MAX][NBLK_H_MAX];
8361     MS_U8 u8DepthBlkBased_Tmp2[NBLK_V_MAX][NBLK_H_MAX];
8362     MS_S32 s32YDiff = 0;
8363     MS_S32 s32WRatio = 0;
8364     MS_U16 u16Weight = 0;
8365     MS_U8  u8YVar = 24;
8366     MS_S32 s32WSum = 0, s32DSum = 0;
8367     MS_U16 u16Diff_Table[32] ={1000, 368, 135, 50, 18, 7, 2, 1,
8368                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8369                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
8370     MS_U32 u32VRatio = gSrcInfo[MAIN_WINDOW].stDispWin.height*10/DISPLAY_DD_V;
8371     MS_U32 u32HRatio = gSrcInfo[MAIN_WINDOW].stDispWin.width*10/DISPLAY_DD_H;
8372 
8373     MS_WINDOW_TYPE stDispWin;
8374     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
8375     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
8376 
8377     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
8378     {
8379         u32VRatio = stDispWin.height*10/DISPLAY_DD_V;
8380         u32HRatio = stDispWin.width*10/DISPLAY_DD_H;
8381     }
8382 
8383     memset(&stAvgPixel, 0, sizeof(PIXEL));
8384     memset(&stCurPixel, 0, sizeof(PIXEL));
8385     memset(&stJPixel, 0, sizeof(PIXEL));
8386 
8387 #if BOUNDARY_MODE
8388     MS_U8 u8BlkOffset = 0;
8389 #endif
8390 
8391     // Use Pixel based RGB3D LUT
8392     u16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
8393     u16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
8394 
8395     for ( y = 0; y < NBLK_DD_V; y ++ )
8396     for ( x = 0; x < NBLK_DD_H; x ++ )
8397     {
8398         stAvgPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8399 
8400         s16Depth = _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(pInstance, x, y, stAvgPixel.R*4, stAvgPixel.G*4, stAvgPixel.B*4 );
8401 
8402         u8DepthBlkBased_Tmp[y][x] = s16Depth;
8403 
8404     }
8405 
8406     //lowpass setting
8407     if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 1)
8408     {
8409         s16XRange =1;
8410         s16Yrange =1;
8411         s16Num = 9;
8412     }
8413     else if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 2)
8414     {
8415         s16XRange =2;
8416         s16Yrange =2;
8417         s16Num =25;
8418     }
8419     else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 3)
8420     {
8421         s16XRange =3;
8422         s16Yrange =3;
8423         s16Num = 49;
8424     }
8425     else
8426     {
8427         s16XRange =0;
8428         s16Yrange =0;
8429         s16Num = 1;
8430     }
8431 
8432     //lowpass or bilateral filter
8433     for(y = 0; y < NBLK_DD_V; y ++)
8434     for(x = 0; x < NBLK_DD_H; x ++)
8435     {
8436         if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0 && pXCResourcePrivate->stdrvXC_3D._u8Bilateral_En ==0)// lowpass
8437         {
8438             s16Depth = 0;
8439             if(x>=s16XRange && x<NBLK_DD_H-s16XRange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange)//normal case
8440             {
8441                 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8442                 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8443                 {
8444                     yj = y+yy;
8445                     xj = x+xx;
8446                     s16Depth += u8DepthBlkBased_Tmp[yj][xj];
8447                 }
8448             }
8449             else //  boundary case
8450             {
8451                 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8452                 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8453                 {
8454                     yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8455                     xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8456                     s16Depth += u8DepthBlkBased_Tmp[yj][xj];
8457                 }
8458             }
8459             u8DepthBlkBased_Tmp2[y][x]= s16Depth/s16Num;
8460         }
8461         else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0 && pXCResourcePrivate->stdrvXC_3D._u8Bilateral_En ==1)  //bilateral
8462         {
8463             s32WSum = 0;
8464             s32DSum = 0;
8465             s32YDiff = 0;
8466             s32WRatio = 0;
8467             u16Weight = 0;
8468             stCurPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8469 
8470             if(x>=s16XRange && x<NBLK_DD_H-s16XRange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange) // normal case
8471             {
8472                 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8473                 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8474                 {
8475                     xj = x+xx;
8476                     yj = y+yy;
8477                     stJPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[yj][xj];
8478                     s32YDiff = (abs( stCurPixel.R - stJPixel.R) + abs( stCurPixel.G - stJPixel.G) + abs( stCurPixel.B - stJPixel.B));
8479                     s32WRatio = s32YDiff/u8YVar;
8480 
8481                     u16Weight = u16Diff_Table[s32WRatio];
8482                     s32WSum = u16Weight + s32WSum;
8483                     s32DSum = u16Weight* u8DepthBlkBased_Tmp[yj][xj] + s32DSum ;
8484                 }
8485             }
8486             else // boundary case
8487             {
8488                 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8489                 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8490                 {
8491                     xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8492                     yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8493                     stJPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[yj][xj];
8494                     s32YDiff = (abs( stCurPixel.R - stJPixel.R) + abs( stCurPixel.G - stJPixel.G) + abs( stCurPixel.B - stJPixel.B));
8495                     s32WRatio = s32YDiff/u8YVar;
8496 
8497                     u16Weight = u16Diff_Table[s32WRatio];
8498                     s32WSum = u16Weight + s32WSum;
8499                     s32DSum = u16Weight* u8DepthBlkBased_Tmp[yj][xj] + s32DSum ;
8500                 }
8501             }
8502 
8503             if(s32WSum >0)
8504                 u8DepthBlkBased_Tmp2[y][x] = s32DSum/s32WSum;
8505             else
8506                 u8DepthBlkBased_Tmp2[y][x] = u8DepthBlkBased_Tmp[y][x];
8507 
8508         }
8509         else
8510         {
8511             u8DepthBlkBased_Tmp2[y][x]= u8DepthBlkBased_Tmp[y][x];
8512         }
8513     }
8514 
8515     // bilinear interpolation to scale up
8516     for ( y = 0; y < NBLK_DR_V; y ++ )
8517     for ( x = 0; x < NBLK_DR_H; x ++ )
8518     {
8519         MS_U8 idx_x,idx_y;
8520         idx_x =x*10/u16OutIn_Ratio_Hor;
8521         idx_y =y*10/u16OutIn_Ratio_Ver;
8522         s16Depth = 0;
8523         if(idx_x>=1 && idx_x<(NBLK_DD_H-1) && idx_y>=1 && idx_y< (NBLK_DD_V-1)) //normal case
8524         {
8525             if (x%2 == 0 && y%2 == 0)
8526                 s16Depth=u8DepthBlkBased_Tmp2[idx_y][idx_x];
8527             else if (x%2 == 1 && y%2 == 0)
8528                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][idx_x+1])/2;
8529             else if (x%2 == 0 && y%2 == 1)
8530                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x])/2;
8531             else
8532                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][idx_x+1]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x+1])/4;
8533         }
8534         else //boundary case
8535         {
8536             if (x%2 == 0 && y%2 == 0)
8537                 s16Depth=u8DepthBlkBased_Tmp2[idx_y][idx_x];
8538             else if (x%2 == 1 && y%2 == 0)
8539                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)])/2;
8540             else if (x%2 == 0 && y%2 == 1)
8541                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[MINMAX(idx_y,0,NBLK_DD_V-1)][idx_x])/2;
8542             else
8543                 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)]+u8DepthBlkBased_Tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][idx_x]+u8DepthBlkBased_Tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][MINMAX(idx_x+1,0,NBLK_DD_H-1)])/4;
8544         }
8545 
8546         if( pXCResourcePrivate->stdrvXC_3D._u8Bilinear_En == 0)
8547             pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8DepthBlkBased_Tmp2[y*10/u16OutIn_Ratio_Ver][x*10/u16OutIn_Ratio_Hor];
8548         else
8549             pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = s16Depth;
8550     }
8551 
8552 #if BOUNDARY_MODE
8553     u8BlkOffset = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset;
8554     for ( y = 0; y < NBLK_DR_V; y ++ )
8555     {
8556         for ( x = 0; x < NBLK_DR_H; x ++ )
8557         {
8558            if(x==0||x==NBLK_DR_H-1)
8559                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8560             else if(x==1)
8561                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8562             else if(x==NBLK_DR_H-2)
8563                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset              + 2)>>2;
8564         }
8565     }
8566 #endif
8567 
8568 #if BACKLIGHTIIR
8569     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8570     {
8571         _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(pInstance);
8572     }
8573 #endif
8574 }
8575 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(void * pInstance)8576 static void _MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(void *pInstance)
8577 {
8578     //for Global Variable
8579 
8580     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8581     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8582     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8583     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8584     MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
8585     PIXEL avgPixel;
8586     MS_S16 x,y,xx,yy, xj, yj;
8587     MS_S16 s16Xrange =0;
8588     MS_S16 s16Yrange =0;
8589     MS_S16 s16Num = 1;
8590     //PIXEL curPixel, jPixel;
8591     MS_S16 depth=0;
8592 
8593     MS_U16 u16OutIn_Ratio_Ver,u16OutIn_Ratio_Hor;
8594 
8595     MS_U8 **_depthBlkBased_tmp;
8596     MS_U8 **_depthBlkBased_tmp2;
8597 
8598     MS_U8 id_v=0,id_h=0;
8599 
8600     MS_U32 u32VRatio = PANEL_HEIGHT*10/DISPLAY_DD_V;
8601     MS_U32 u32HRatio = PANEL_WIDTH*10/DISPLAY_DD_H;
8602 
8603 
8604 #if MOTIONDETECTION
8605     MS_S16 blk_mot;
8606     MS_S16 mot_depth;
8607 
8608     //MS_S16 GMvSXsize,GMvSYsize,GMvsize;
8609     MS_U8 GMvWei;
8610 
8611     //GMvSXsize = abs(MFC_ReadByte(REG_29CC)-0x80);
8612     //GMvSYsize = abs((MFC_ReadByte(REG_29CD)&0x7F)-0x40);
8613     //GMvsize = (GMvSXsize+GMvSYsize);
8614 
8615     GMvWei = 0x10;//MINMAX(24 - GMvsize,0,16);
8616 
8617 #endif
8618 
8619     _depthBlkBased_tmp = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8620     for( y = 0;y < NBLK_V_MAX ;y++)
8621         _depthBlkBased_tmp[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8622     _depthBlkBased_tmp2 = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8623     for( y = 0;y < NBLK_V_MAX ;y++)
8624         _depthBlkBased_tmp2[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8625 
8626     // Use Pixel based RGB3D LUT
8627     u16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
8628     u16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
8629 
8630 #if DUMYGAINCTRL
8631     MS_U8 u8testval_1EFC = 0x00;//MFC_ReadByte(REG_1EFC);
8632 
8633     MS_U8 u8testval_0EBA = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0xff);//MFC_ReadByte(REG_0EBA);//default:0x00 for LGE 0x18
8634     MS_U8 u8testval_0EBB = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5F_L, 0xff00)>>8;//MFC_ReadByte(REG_0EBB);//default:0x20 for LGE 0x20
8635 #else
8636     MS_U8 u8testval_1EFC = 0x00;//MFC_ReadByte(REG_1EFC);
8637 
8638     MS_U8 u8testval_0EBA = 0x00;//default:0x00 for LGE 0x18
8639     MS_U8 u8testval_0EBB = 0x20;//default:0x20 for LGE 0x20
8640 #endif
8641 
8642     //S16 BLKnonSkyRate;
8643     MS_S16 BLKblueSkyRatioDiff;
8644     MS_S16 DepthSlope;
8645 
8646 #if BOUNDARY_MODE
8647     MS_U8 u8BlkOffset = 0;
8648 #endif
8649 
8650     MS_U16 u16DispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
8651     MS_WINDOW_TYPE stDispWin;
8652     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
8653     MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
8654     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
8655     {
8656         u16DispWidth = stDispWin.width;
8657     }
8658 
8659     pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2 = MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
8660     //BLKblueSkyRatioDiff = MAX(BLKblueSkyRatio1 - BLKblueSkyRatio2, GLB_Depth_Min);
8661     BLKblueSkyRatioDiff = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1 - pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2, u8testval_0EBA,u8testval_0EBB);
8662 
8663     DepthSlope = BLKblueSkyRatioDiff*256/32;
8664     MS_S16 BLKnum_V = NBLK_DD_V;
8665 
8666     if((u8testval_1EFC&0x20)==0x20)
8667     {
8668         for ( y = 0; y < NBLK_DD_V; y ++ )
8669             for ( x = 0; x < NBLK_DD_H; x ++ )
8670             {
8671                 avgPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8672                 depth = _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(pInstance, x, y, avgPixel.R*4, avgPixel.G*4, avgPixel.B*4 );
8673 
8674                 if( (u8testval_1EFC&0x10)==0x10)
8675                 {
8676                     //int blk_mot;
8677                     //int mot_depth;
8678                     blk_mot = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[y][x];
8679                     //mot_depth = 0x80;//MFC_ReadByte(REG_1EFE);//max additional mot depth
8680                     mot_depth = blk_mot>>1;//MIN( (mot_depth*blk_mot)>>8, 255);
8681                     mot_depth = (mot_depth*GMvWei)>>4;
8682 
8683                     depth = depth + mot_depth;
8684                 }
8685 
8686 
8687                 _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8688 
8689             }
8690     }
8691     else
8692     {
8693         for ( y = 0; y < NBLK_DD_V; y ++ )
8694         {
8695             for ( x = 0; x < NBLK_DD_H; x ++ )
8696             {
8697                 if(((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK62_69_L)&0x80)==0x00))
8698                 {
8699                     depth = (DepthSlope*(y-(BLKnum_V>>1))/(BLKnum_V) )+128;
8700 #if MOTIONDETECTION
8701                     //add motion cue
8702                     if( (u8testval_1EFC&0x10)==0x10)
8703                     {
8704 
8705                         blk_mot = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[y][x];
8706                         //mot_depth = 0x80;//MFC_ReadByte(REG_1EFE);//max additional mot depth
8707                         mot_depth = blk_mot>>1;//min( (mot_depth*blk_mot)>>8, 255);
8708                         mot_depth = (mot_depth*GMvWei)>>4;
8709 
8710                         depth = depth + mot_depth;
8711                     }
8712 #endif
8713                  _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8714                 }
8715                 else
8716                 {
8717                     DepthSlope = MAX(DepthSlope, 200);
8718                     //Depth Slope 0~255
8719                     if(y < NBLK_DD_V/4)
8720                         depth = (DepthSlope*(y)/(BLKnum_V) )+128;
8721                     else if(y < NBLK_DD_V*3/4)
8722                         depth = (DepthSlope*((BLKnum_V>>1)-y)/(BLKnum_V) )+128;
8723                     else
8724                         depth = (DepthSlope*(y-BLKnum_V)/(BLKnum_V) )+128;
8725                     _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8726                 }
8727             }
8728         }
8729     }
8730 
8731     //lowpass setting
8732     if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 1)
8733     {
8734         s16Xrange =1;
8735         s16Yrange =1;
8736         s16Num = 9;
8737     }
8738     else if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 2)
8739     {
8740         s16Xrange =2;
8741         s16Yrange =2;
8742         s16Num =25;
8743     }
8744     else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 3)
8745     {
8746         s16Xrange =3;
8747         s16Yrange =3;
8748         s16Num = 49;
8749     }
8750     else
8751     {
8752         s16Xrange =0;
8753         s16Yrange =0;
8754         s16Num = 1;
8755     }
8756 
8757     //lowpass or bilateral filter
8758     for(y = 0; y < NBLK_DD_V; y ++)
8759         for(x = 0; x < NBLK_DD_H; x ++)
8760         {
8761 
8762             if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0  )         // lowpass
8763             {
8764                 depth = 0;
8765                 if(x>=s16Xrange && x<NBLK_DD_H-s16Xrange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange) //normal case
8766                 {
8767                     for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8768                         for ( xx = -s16Xrange; xx <= s16Xrange; xx ++ )
8769                         {
8770                             yj = y+yy;
8771                             xj = x+xx;
8772                             depth += _depthBlkBased_tmp[yj][xj];
8773                         }
8774                 }
8775                 else //  boundary case
8776                 {
8777                     for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8778                         for ( xx = -s16Xrange; xx <= s16Xrange; xx ++ )
8779                         {
8780                             yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8781                             xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8782                             depth += _depthBlkBased_tmp[yj][xj];
8783                         }
8784                 }
8785                 _depthBlkBased_tmp2[y][x]= depth/s16Num;
8786             }
8787             else
8788             {
8789                 _depthBlkBased_tmp2[y][x]= _depthBlkBased_tmp[y][x];
8790             }
8791 
8792         }
8793 
8794     u16OutIn_Ratio_Ver = u16OutIn_Ratio_Ver/10;
8795     u16OutIn_Ratio_Hor = u16OutIn_Ratio_Hor/10;
8796 #if OPTIMIZE
8797     for(id_v=0; u16OutIn_Ratio_Ver>1; id_v++)
8798     {
8799         u16OutIn_Ratio_Ver=u16OutIn_Ratio_Ver>>1;
8800     }
8801     for(id_h=0; u16OutIn_Ratio_Hor>1; id_h++)
8802     {
8803         u16OutIn_Ratio_Hor=u16OutIn_Ratio_Hor>>1;
8804     }
8805 #endif
8806     // bilinear interpolation to scale up
8807     for ( y = 0; y < NBLK_DR_V; y ++ )
8808         for ( x = 0; x < NBLK_DR_H; x ++ )
8809         {
8810             MS_U8 idx_x,idx_y;
8811 #if OPTIMIZE
8812             idx_x =x>>id_h;//OUTIN_Ratio_Hor;
8813             idx_y =y>>id_v;//OUTIN_Ratio_Ver;
8814 #else
8815             idx_x =x/u16OutIn_Ratio_Hor;
8816             idx_y =y/u16OutIn_Ratio_Ver;
8817 #endif
8818             depth = 0;
8819             if(idx_x>=1 && idx_x<(NBLK_DD_H-1) && idx_y>=1 && idx_y< (NBLK_DD_V-1)) //normal case
8820             {
8821                 if (x%2 == 0 && y%2 == 0)
8822                     depth=_depthBlkBased_tmp2[idx_y][idx_x];
8823                 else if (x%2 == 1 && y%2 == 0)
8824                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][idx_x+1])>>1;
8825                 else if (x%2 == 0 && y%2 == 1)
8826                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y+1][idx_x])>>1;
8827                 else
8828                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][idx_x+1]+_depthBlkBased_tmp2[idx_y+1][idx_x]+_depthBlkBased_tmp2[idx_y+1][idx_x+1])>>2;
8829             }
8830             else //boundary case
8831             {
8832 
8833                 if (x%2 == 0 && y%2 == 0)
8834                     depth=_depthBlkBased_tmp2[idx_y][idx_x];
8835                 else if (x%2 == 1 && y%2 == 0)
8836                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)])>>1;
8837                 else if (x%2 == 0 && y%2 == 1)
8838                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[MINMAX(idx_y,0,NBLK_DD_V-1)][idx_x])>>1;
8839                 else
8840                     depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)]+_depthBlkBased_tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][idx_x]+_depthBlkBased_tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][MINMAX(idx_x+1,0,NBLK_DD_H-1)])>>2;
8841             }
8842 
8843 
8844 
8845 
8846             if( pXCResourcePrivate->stdrvXC_3D._u8Bilinear_En == 0)
8847                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = _depthBlkBased_tmp2[idx_y][idx_x];
8848             else
8849                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = depth;
8850 
8851         }
8852 
8853 #if BOUNDARY_MODE
8854         if(E_XC_3D_OUTPUT_TOP_BOTTOM_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
8855         {
8856             u8BlkOffset = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset;
8857         }
8858         else
8859         {
8860             u8BlkOffset = 0x80;
8861         }
8862     for ( y = 0; y < NBLK_DR_V; y ++ )
8863     {
8864         for ( x = 0; x < NBLK_DR_H; x ++ )
8865         {
8866             if(bT3DDE_Use_MainDisplayWindow)//((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x2) == 0x2) //flag for MainDEonly mode
8867             {
8868                 if(x==0||(x>=((u16DispWidth + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)-1))
8869                     pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8870                 else if(x==1)
8871                     pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8872                 else if(x==((u16DispWidth + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)-2)
8873                     pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset              + 2)>>2;
8874             }
8875             else
8876             {
8877             if(x==0||x==NBLK_DR_H-1)
8878                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8879             else if(x==1)
8880                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8881             else if(x==NBLK_DR_H-2)
8882                 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset              + 2)>>2;
8883         }
8884     }
8885     }
8886 #endif
8887 
8888 #if BACKLIGHTIIR
8889     if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8890     {
8891         _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(pInstance);
8892     }
8893 
8894 #endif
8895 
8896     for( y = 0;y < NBLK_V_MAX ;y++)
8897         free(_depthBlkBased_tmp[y]);
8898     free(_depthBlkBased_tmp);
8899     for( y = 0;y < NBLK_V_MAX ;y++)
8900         free(_depthBlkBased_tmp2[y]);
8901     free(_depthBlkBased_tmp2);
8902 
8903 }
8904 #endif
8905 
_MDrv_SC_3D_IsPattern(void * pInstance,MS_U16 x,MS_U16 y,MS_BOOL bHonrizantol)8906 static MS_BOOL _MDrv_SC_3D_IsPattern(void *pInstance, MS_U16 x, MS_U16 y, MS_BOOL bHonrizantol)
8907 {
8908     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8909     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8910     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8911     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8912     MS_BOOL bRet = FALSE;
8913     PIXEL Pixel1Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H - 1 - x];
8914     PIXEL Pixel2Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8915     PIXEL Pixel3Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - 1 - y][x];
8916     PIXEL Pixel4Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - 1 - y][NBLK_DD_H - 1 - x];
8917     if (bHonrizantol)
8918     {
8919         MS_U16 u16Diff1_2 = ((abs( Pixel1Quadrant.R - Pixel2Quadrant.R) + abs( Pixel1Quadrant.G - Pixel2Quadrant.G) + abs( Pixel1Quadrant.B - Pixel2Quadrant.B)));
8920         MS_U16 u16Diff3_4 = ((abs( Pixel3Quadrant.R - Pixel4Quadrant.R) + abs( Pixel3Quadrant.G - Pixel4Quadrant.G) + abs( Pixel3Quadrant.B - Pixel4Quadrant.B)));
8921         if (MAX(u16Diff1_2, u16Diff3_4) < PATTERN_THRESLD)
8922         {
8923             bRet = TRUE;
8924         }
8925         else
8926         {
8927             bRet = FALSE;
8928         }
8929     }
8930     else
8931     {
8932         MS_U16 u16Diff2_3 = ((abs( Pixel3Quadrant.R - Pixel2Quadrant.R) + abs( Pixel3Quadrant.G - Pixel2Quadrant.G) + abs( Pixel3Quadrant.B - Pixel2Quadrant.B)));
8933         MS_U16 u16Diff4_1 = ((abs( Pixel1Quadrant.R - Pixel4Quadrant.R) + abs( Pixel1Quadrant.G - Pixel4Quadrant.G) + abs( Pixel1Quadrant.B - Pixel4Quadrant.B)));
8934         if (MAX(u16Diff2_3, u16Diff4_1) < PATTERN_THRESLD)
8935         {
8936             bRet = TRUE;
8937         }
8938         else
8939         {
8940             bRet = FALSE;
8941         }
8942     }
8943     return bRet;
8944 }
8945 
8946 PIXEL stblockStatusEven[NBLK_DD_V_MAX][NBLK_DD_H_MAX]; // avg color value for even lines
8947 PIXEL stblockStatusOdd[NBLK_DD_V_MAX][NBLK_DD_H_MAX];  // avg color value for odd lines
_MDrv_SC_3D_SourceDetection(void * pInstance)8948 static void _MDrv_SC_3D_SourceDetection(void *pInstance)
8949 {
8950     MS_U16 x = 0, y = 0;
8951     PIXEL Pixel1;
8952     PIXEL Pixel10, Pixel11, Pixel12, Pixel13, Pixel14, Pixel15, Pixel16;
8953     MS_U16 u16YDiff0 = 0, u16YDiff1 = 0, u16YDiff2 = 0, u16YDiff3 = 0;
8954     MS_U16 u16YDiff4 = 0, u16YDiff5 = 0, u16YDiff6 = 0;
8955     EN_3D_FORMAT enFormat = E_3D_FORMAT_2D;
8956     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8957     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8958     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8959     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8960     if(pXCResourcePrivate->stdrvXC_3D._bResetFrameCount)
8961     {
8962         pXCResourcePrivate->stdrvXC_3D._u16SBSCount = 0;
8963         pXCResourcePrivate->stdrvXC_3D._u16TBCount = 0;
8964         pXCResourcePrivate->stdrvXC_3D._u162DCount = 0;
8965         pXCResourcePrivate->stdrvXC_3D._u16TotalCount = 0;
8966         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = FALSE;
8967     }
8968 
8969     if((IS_INPUT_FRAME_PACKING(MAIN_WINDOW)
8970           || IS_INPUT_TOP_BOTTOM(MAIN_WINDOW)
8971           || IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
8972        && IS_OUTPUT_LINE_ALTERNATIVE())
8973     {
8974 #if defined (__aarch64__)
8975         MS_U64 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
8976 #else
8977         MS_S32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
8978 #endif
8979         MS_U8 u8R_Cr_Avg = 0;
8980         MS_U8 u8G_Y_Avg = 0;
8981         MS_U8 u8B_Cb_Avg = 0;
8982         MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
8983         if(0 == u32DDBase)
8984         {
8985             printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
8986             assert(u32DDBase != 0);
8987         }
8988         MS_U16 u16DDBlock_DramSize = DDBYTENUM;
8989         MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
8990         MS_U16 u16MinDiff = 0;
8991         MS_U16 u16MaxDiff = 0;
8992         MS_U32 u32MatchCount = 0;
8993 
8994         for (i = 0; i < NBLK_DD_V; i++)
8995         {
8996             i_dummy = i * u32DDBlockLinePitch;
8997             for (j = 0; j < NBLK_DD_H; j++)
8998             {
8999                 j_dummy = j* u16DDBlock_DramSize;
9000 
9001                 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 6) + u32DDBase));
9002                 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 7) + u32DDBase));
9003                 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 8) + u32DDBase));
9004 
9005                 u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9006                 u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9007                 u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9008 
9009                 stblockStatusEven[i][j].R = u8R_Cr_Avg; // avg color value
9010                 stblockStatusEven[i][j].G = u8G_Y_Avg; // avg color value
9011                 stblockStatusEven[i][j].B = u8B_Cb_Avg; // avg color value
9012 
9013                 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 22) + u32DDBase));
9014                 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 23) + u32DDBase));
9015                 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 24) + u32DDBase));
9016 
9017                 u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9018                 u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9019                 u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9020 
9021                 stblockStatusOdd[i][j].R = u8R_Cr_Avg; // avg color value
9022                 stblockStatusOdd[i][j].G = u8G_Y_Avg; // avg color value
9023                 stblockStatusOdd[i][j].B = u8B_Cb_Avg; // avg color value
9024             }
9025         }
9026 
9027         for(y = 0; y < NBLK_DD_V; y ++)
9028         {
9029             for(x = 3; x < NBLK_DD_H - 3; x ++)
9030             {
9031                 //even target pixel
9032                 Pixel1 = stblockStatusEven[y][x];
9033                 //odd pixels
9034                 Pixel10 = stblockStatusOdd[y][x];
9035                 Pixel11 = stblockStatusOdd[y][x+1];
9036                 Pixel12 = stblockStatusOdd[y][x+2];
9037                 Pixel13 = stblockStatusOdd[y][x+3];
9038                 Pixel14 = stblockStatusOdd[y][x-1];
9039                 Pixel15 = stblockStatusOdd[y][x-2];
9040                 Pixel16 = stblockStatusOdd[y][x-3];
9041 
9042                 //check s32Diff
9043                 u16YDiff0 = ((abs( Pixel1.R - Pixel10.R) + abs( Pixel1.G - Pixel10.G) + abs( Pixel1.B - Pixel10.B)));
9044                 u16YDiff1 = ((abs( Pixel1.R - Pixel11.R) + abs( Pixel1.G - Pixel11.G) + abs( Pixel1.B - Pixel11.B)));
9045                 u16YDiff2 = ((abs( Pixel1.R - Pixel12.R) + abs( Pixel1.G - Pixel12.G) + abs( Pixel1.B - Pixel12.B)));
9046                 u16YDiff3 = ((abs( Pixel1.R - Pixel13.R) + abs( Pixel1.G - Pixel13.G) + abs( Pixel1.B - Pixel13.B)));
9047                 u16YDiff4 = ((abs( Pixel1.R - Pixel14.R) + abs( Pixel1.G - Pixel14.G) + abs( Pixel1.B - Pixel14.B)));
9048                 u16YDiff5 = ((abs( Pixel1.R - Pixel15.R) + abs( Pixel1.G - Pixel15.G) + abs( Pixel1.B - Pixel15.B)));
9049                 u16YDiff6 = ((abs( Pixel1.R - Pixel16.R) + abs( Pixel1.G - Pixel16.G) + abs( Pixel1.B - Pixel16.B)));
9050 
9051                 u16MinDiff = MIN(MIN3(u16YDiff0, u16YDiff1, u16YDiff2), MIN(u16YDiff4, u16YDiff5));
9052                 u16MaxDiff = MAX(MAX3(u16YDiff0, u16YDiff1, u16YDiff2), MAX(u16YDiff4, u16YDiff5));
9053 
9054 #if 0
9055                 if(x == 20)
9056                 {
9057                     printf("u16MinDiff=%u, u16MaxDiff=%u\n", u16MinDiff, u16MaxDiff);
9058                 }
9059 #endif
9060 
9061                 if (u16MinDiff <= HW_2DTO3D_3DDetect_THRESHOLD)
9062                 {
9063                     u32MatchCount++;
9064                 }
9065             }
9066 
9067             if(u32MatchCount < (NBLK_DD_V * (NBLK_DD_H - 6) * HW_2DTO3D_3DDetect_PERCENTAGE / 100))
9068             {
9069                 enFormat = E_3D_FORMAT_2D;
9070             }
9071             else
9072             {
9073                 //keep pre detect 3d result
9074                 if(IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
9075                 {
9076                     enFormat = E_3D_FORMAT_SS;
9077                 }
9078                 else if(IS_INPUT_TOP_BOTTOM(MAIN_WINDOW))
9079                 {
9080                     enFormat = E_3D_FORMAT_TB;
9081                 }
9082                 else
9083                 {
9084                     enFormat = E_3D_FORMAT_2D;
9085                 }
9086             }
9087         }
9088 #if PRINTINFO
9089         printf("u32MatchCount=%lu, treshold s32Count=%u, enFormat=%u\n", u32MatchCount, (NBLK_DD_V * (NBLK_DD_H - 6) * HW_2DTO3D_3DDetect_PERCENTAGE / 100), enFormat);
9090 #endif
9091     }
9092     else
9093     {
9094         PIXEL Pixel3;
9095         PIXEL Pixel30, Pixel31, Pixel32, Pixel33, Pixel34, Pixel35, Pixel36;
9096         PIXEL Pixel2_0, Pixel2_1, Pixel2_2, Pixel2_3, Pixel2_4, Pixel2_5, Pixel2_6;
9097         PIXEL Pixel3_0, Pixel3_1, Pixel3_2, Pixel3_3, Pixel3_4, Pixel3_5, Pixel3_6;
9098         MS_U16 u16YDiff7 = 0, u16YDiff8 = 0, u16YDiff9 = 0, u16YDiff10 = 0, u16YDiff11 = 0;
9099         MS_U16 u16YDiff12 = 0, u16YDiff13 = 0;
9100         MS_U16 u16YDiff30 = 0, u16YDiff31 = 0, u16YDiff32 = 0, u16YDiff33 = 0;
9101         MS_U16 u16YDiff34 = 0, u16YDiff35 = 0, u16YDiff36 = 0, u16YDiff37 = 0;
9102         MS_U16 u16YDiff38 = 0, u16YDiff39 = 0, u16YDiff310 = 0, u16YDiff311 = 0;
9103         MS_U16 u16YDiff312 = 0, u16YDiff313 = 0;
9104         MS_U16 u16YDiff2_0 = 0, u16YDiff2_1 = 0, u16YDiff2_2 = 0, u16YDiff2_3 = 0;
9105         MS_U16 u16YDiff2_4 = 0, u16YDiff2_5 = 0, u16YDiff2_6 = 0, u16YDiff2_7 = 0;
9106         MS_U16 u16YDiff2_8 = 0, u16YDiff2_9 = 0, u16YDiff2_10 = 0, u16YDiff2_11 = 0;
9107         MS_U16 u16YDiff2_12 = 0, u16YDiff2_13 = 0;
9108         MS_U16 u16MinTB = 0, u16MinSS = 0, u16MinTB2 = 0, u16MinSS2 = 0;
9109         MS_U16 u16MaxTB_1 = 0, u16MaxSS_1 = 0, u16MaxTB = 0, u16MaxSS = 0, u16MaxTB2 = 0, u16MaxSS2 = 0;
9110         MS_U16 u16SSCount = 0, u16TBCount = 0, u162DCount = 0, u16HLinesymmetryCount = 0, u16VLinesymmetryCount = 0;
9111         MS_U16 u16HBlockShift = 0;
9112         PIXEL Pixel4;
9113         MS_U16 u16YDiff4_0 = 0, u16YDiff4_1 = 0, u16YDiff4_2 = 0, u16YDiff4_3 = 0;
9114         MS_U16 u16YDiff4_4 = 0, u16YDiff4_5 = 0, u16YDiff4_6 = 0, u16YDiff4_7 = 0;
9115         MS_U16 u16YDiff4_8 = 0, u16YDiff4_9 = 0, u16YDiff4_10 = 0, u16YDiff4_11 = 0;
9116         MS_U16 u16YDiff4_12 = 0, u16YDiff4_13 = 0;
9117         MS_U16 u16MaxTB_2 = 0, u16MaxSS_2 = 0;
9118         MS_U16 u16MinTB_1 = 0;
9119         MS_U16 u16MinTB_2 = 0;
9120         MS_U16 u16MinSS_1 = 0;
9121         MS_U16 u16MinSS_2 = 0;
9122 
9123         if(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan)
9124         {
9125             if(gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc > 0)
9126             {
9127                 u16HBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.x
9128                                      * gSrcInfo[MAIN_WINDOW].u16HCusScalingDst
9129                                      / gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc / PIXELNUMOFBLOCK;
9130             }
9131         }
9132 
9133         if(u16HBlockShift > 3)
9134         {
9135             u16HBlockShift = 3;
9136         }
9137     #if (HW_2DTO3D_VER == 3)
9138         _MDrv_SC_3D_2DTo3D_HWInfo_Read(pInstance);
9139     #elif (HW_2DTO3D_VER == 4)
9140         _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(pInstance);
9141     #endif
9142         for(y = 0; y < NBLK_DD_V/2; y ++)
9143         {
9144             for(x = 3-u16HBlockShift; x < NBLK_DD_H/2-3-u16HBlockShift; x ++)
9145             {
9146                 MS_BOOL bIsPattern = FALSE;
9147                 Pixel1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
9148                 Pixel3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+(NBLK_DD_H/2)+u16HBlockShift];
9149                 Pixel4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][NBLK_DD_H-x];
9150 
9151                 //horizontal postion pixels
9152                 Pixel10 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+u16HBlockShift];
9153                 Pixel11 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+1+u16HBlockShift];
9154                 Pixel12 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+2+u16HBlockShift];
9155                 Pixel13 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+3+u16HBlockShift];
9156                 Pixel14 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-1+u16HBlockShift];
9157                 Pixel15 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-2+u16HBlockShift];
9158                 Pixel16 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-3+u16HBlockShift];
9159 
9160                 //horizontal opposite position pixels
9161                 Pixel2_0 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x];
9162                 Pixel2_1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+1];
9163                 Pixel2_2 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+2];
9164                 Pixel2_3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+3];
9165                 Pixel2_4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-1];
9166                 Pixel2_5 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-2];
9167                 Pixel2_6 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-3];
9168 
9169                 //vertical postion pixels
9170                 Pixel30 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+u16HBlockShift];
9171                 Pixel31 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+1+u16HBlockShift];
9172                 Pixel32 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+2+u16HBlockShift];
9173                 Pixel33 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+3+u16HBlockShift];
9174                 Pixel34 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-1+u16HBlockShift];
9175                 Pixel35 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-2+u16HBlockShift];
9176                 Pixel36 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-3+u16HBlockShift];
9177 
9178                 // vertical opposite position pixels
9179                 Pixel3_0 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x];
9180                 Pixel3_1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+1];
9181                 Pixel3_2 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+2];
9182                 Pixel3_3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+3];
9183                 Pixel3_4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-1];
9184                 Pixel3_5 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-2];
9185                 Pixel3_6 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-3];
9186 
9187                 //SS
9188                 u16YDiff0 = ((abs( Pixel1.R - Pixel10.R) + abs( Pixel1.G - Pixel10.G) + abs( Pixel1.B - Pixel10.B)));
9189                 u16YDiff1 = ((abs( Pixel1.R - Pixel11.R) + abs( Pixel1.G - Pixel11.G) + abs( Pixel1.B - Pixel11.B)));
9190                 u16YDiff2 = ((abs( Pixel1.R - Pixel12.R) + abs( Pixel1.G - Pixel12.G) + abs( Pixel1.B - Pixel12.B)));
9191                 u16YDiff3 = ((abs( Pixel1.R - Pixel13.R) + abs( Pixel1.G - Pixel13.G) + abs( Pixel1.B - Pixel13.B)));
9192                 u16YDiff4 = ((abs( Pixel1.R - Pixel14.R) + abs( Pixel1.G - Pixel14.G) + abs( Pixel1.B - Pixel14.B)));
9193                 u16YDiff5 = ((abs( Pixel1.R - Pixel15.R) + abs( Pixel1.G - Pixel15.G) + abs( Pixel1.B - Pixel15.B)));
9194                 u16YDiff6 = ((abs( Pixel1.R - Pixel16.R) + abs( Pixel1.G - Pixel16.G) + abs( Pixel1.B - Pixel16.B)));
9195 
9196                 //TB
9197                 u16YDiff7 = ((abs( Pixel1.R - Pixel30.R) + abs( Pixel1.G - Pixel30.G) + abs( Pixel1.B - Pixel30.B)));
9198                 u16YDiff8 = ((abs( Pixel1.R - Pixel31.R) + abs( Pixel1.G - Pixel31.G) + abs( Pixel1.B - Pixel31.B)));
9199                 u16YDiff9 = ((abs( Pixel1.R - Pixel32.R) + abs( Pixel1.G - Pixel32.G) + abs( Pixel1.B - Pixel32.B)));
9200                 u16YDiff10 = ((abs( Pixel1.R - Pixel33.R) + abs( Pixel1.G - Pixel33.G) + abs( Pixel1.B - Pixel33.B)));
9201                 u16YDiff11 = ((abs( Pixel1.R - Pixel34.R) + abs( Pixel1.G - Pixel34.G) + abs( Pixel1.B - Pixel34.B)));
9202                 u16YDiff12 = ((abs( Pixel1.R - Pixel35.R) + abs( Pixel1.G - Pixel35.G) + abs( Pixel1.B - Pixel35.B)));
9203                 u16YDiff13 = ((abs( Pixel1.R - Pixel36.R) + abs( Pixel1.G - Pixel36.G) + abs( Pixel1.B - Pixel36.B)));
9204 
9205 
9206                 //TB
9207                 u16YDiff30 = ((abs( Pixel3.R - Pixel10.R) + abs( Pixel3.G - Pixel10.G) + abs( Pixel3.B - Pixel10.B)));
9208                 u16YDiff31 = ((abs( Pixel3.R - Pixel11.R) + abs( Pixel3.G - Pixel11.G) + abs( Pixel3.B - Pixel11.B)));
9209                 u16YDiff32 = ((abs( Pixel3.R - Pixel12.R) + abs( Pixel3.G - Pixel12.G) + abs( Pixel3.B - Pixel12.B)));
9210                 u16YDiff33 = ((abs( Pixel3.R - Pixel13.R) + abs( Pixel3.G - Pixel13.G) + abs( Pixel3.B - Pixel13.B)));
9211                 u16YDiff34 = ((abs( Pixel3.R - Pixel14.R) + abs( Pixel3.G - Pixel14.G) + abs( Pixel3.B - Pixel14.B)));
9212                 u16YDiff35 = ((abs( Pixel3.R - Pixel15.R) + abs( Pixel3.G - Pixel15.G) + abs( Pixel3.B - Pixel15.B)));
9213                 u16YDiff36 = ((abs( Pixel3.R - Pixel16.R) + abs( Pixel3.G - Pixel16.G) + abs( Pixel3.B - Pixel16.B)));
9214 
9215                 //SS
9216                 u16YDiff37 = ((abs( Pixel3.R - Pixel30.R) + abs( Pixel3.G - Pixel30.G) + abs( Pixel3.B - Pixel30.B)));
9217                 u16YDiff38 = ((abs( Pixel3.R - Pixel31.R) + abs( Pixel3.G - Pixel31.G) + abs( Pixel3.B - Pixel31.B)));
9218                 u16YDiff39 = ((abs( Pixel3.R - Pixel32.R) + abs( Pixel3.G - Pixel32.G) + abs( Pixel3.B - Pixel32.B)));
9219                 u16YDiff310 = ((abs( Pixel3.R - Pixel33.R) + abs( Pixel3.G - Pixel33.G) + abs( Pixel3.B - Pixel33.B)));
9220                 u16YDiff311 = ((abs( Pixel3.R - Pixel34.R) + abs( Pixel3.G - Pixel34.G) + abs( Pixel3.B - Pixel34.B)));
9221                 u16YDiff312 = ((abs( Pixel3.R - Pixel35.R) + abs( Pixel3.G - Pixel35.G) + abs( Pixel3.B - Pixel35.B)));
9222                 u16YDiff313 = ((abs( Pixel3.R - Pixel36.R) + abs( Pixel3.G - Pixel36.G) + abs( Pixel3.B - Pixel36.B)));
9223 
9224                 // opposite position difference
9225                 //SS
9226                 u16YDiff2_0 = ((abs( Pixel1.R - Pixel2_0.R) + abs( Pixel1.G - Pixel2_0.G) + abs( Pixel1.B - Pixel2_0.B)));
9227                 u16YDiff2_1 = ((abs( Pixel1.R - Pixel2_1.R) + abs( Pixel1.G - Pixel2_1.G) + abs( Pixel1.B - Pixel2_1.B)));
9228                 u16YDiff2_2 = ((abs( Pixel1.R - Pixel2_2.R) + abs( Pixel1.G - Pixel2_2.G) + abs( Pixel1.B - Pixel2_2.B)));
9229                 u16YDiff2_3 = ((abs( Pixel1.R - Pixel2_3.R) + abs( Pixel1.G - Pixel2_3.G) + abs( Pixel1.B - Pixel2_3.B)));
9230                 u16YDiff2_4 = ((abs( Pixel1.R - Pixel2_4.R) + abs( Pixel1.G - Pixel2_4.G) + abs( Pixel1.B - Pixel2_4.B)));
9231                 u16YDiff2_5 = ((abs( Pixel1.R - Pixel2_5.R) + abs( Pixel1.G - Pixel2_5.G) + abs( Pixel1.B - Pixel2_5.B)));
9232                 u16YDiff2_6 = ((abs( Pixel1.R - Pixel2_6.R) + abs( Pixel1.G - Pixel2_6.G) + abs( Pixel1.B - Pixel2_6.B)));
9233 
9234                 //TB
9235                 u16YDiff2_7 = ((abs( Pixel1.R - Pixel3_0.R) + abs( Pixel1.G - Pixel3_0.G) + abs( Pixel1.B - Pixel3_0.B)));
9236                 u16YDiff2_8 = ((abs( Pixel1.R - Pixel3_1.R) + abs( Pixel1.G - Pixel3_1.G) + abs( Pixel1.B - Pixel3_1.B)));
9237                 u16YDiff2_9 = ((abs( Pixel1.R - Pixel3_2.R) + abs( Pixel1.G - Pixel3_2.G) + abs( Pixel1.B - Pixel3_2.B)));
9238                 u16YDiff2_10 = ((abs( Pixel1.R - Pixel3_3.R) + abs( Pixel1.G - Pixel3_3.G) + abs( Pixel1.B - Pixel3_3.B)));
9239                 u16YDiff2_11 = ((abs( Pixel1.R - Pixel3_4.R) + abs( Pixel1.G - Pixel3_4.G) + abs( Pixel1.B - Pixel3_4.B)));
9240                 u16YDiff2_12 = ((abs( Pixel1.R - Pixel3_5.R) + abs( Pixel1.G - Pixel3_5.G) + abs( Pixel1.B - Pixel3_5.B)));
9241                 u16YDiff2_13 = ((abs( Pixel1.R - Pixel3_6.R) + abs( Pixel1.G - Pixel3_6.G) + abs( Pixel1.B - Pixel3_6.B)));
9242 
9243                 //SS
9244                 u16YDiff4_0 = ((abs( Pixel4.R - Pixel3_0.R) + abs( Pixel4.G - Pixel3_0.G) + abs( Pixel4.B - Pixel3_0.B)));
9245                 u16YDiff4_1 = ((abs( Pixel4.R - Pixel3_1.R) + abs( Pixel4.G - Pixel3_1.G) + abs( Pixel4.B - Pixel3_1.B)));
9246                 u16YDiff4_2 = ((abs( Pixel4.R - Pixel3_2.R) + abs( Pixel4.G - Pixel3_2.G) + abs( Pixel4.B - Pixel3_2.B)));
9247                 u16YDiff4_3 = ((abs( Pixel4.R - Pixel3_3.R) + abs( Pixel4.G - Pixel3_3.G) + abs( Pixel4.B - Pixel3_3.B)));
9248                 u16YDiff4_4 = ((abs( Pixel4.R - Pixel3_4.R) + abs( Pixel4.G - Pixel3_4.G) + abs( Pixel4.B - Pixel3_4.B)));
9249                 u16YDiff4_5 = ((abs( Pixel4.R - Pixel3_5.R) + abs( Pixel4.G - Pixel3_5.G) + abs( Pixel4.B - Pixel3_5.B)));
9250                 u16YDiff4_6 = ((abs( Pixel4.R - Pixel3_6.R) + abs( Pixel4.G - Pixel3_6.G) + abs( Pixel4.B - Pixel3_6.B)));
9251 
9252                 //TB
9253                 u16YDiff4_7 = ((abs( Pixel4.R - Pixel2_0.R) + abs( Pixel4.G - Pixel2_0.G) + abs( Pixel4.B - Pixel2_0.B)));
9254                 u16YDiff4_8 = ((abs( Pixel4.R - Pixel2_1.R) + abs( Pixel4.G - Pixel2_1.G) + abs( Pixel4.B - Pixel2_1.B)));
9255                 u16YDiff4_9 = ((abs( Pixel4.R - Pixel2_2.R) + abs( Pixel4.G - Pixel2_2.G) + abs( Pixel4.B - Pixel2_2.B)));
9256                 u16YDiff4_10 = ((abs( Pixel4.R - Pixel2_3.R) + abs( Pixel4.G - Pixel2_3.G) + abs( Pixel4.B - Pixel2_3.B)));
9257                 u16YDiff4_11 = ((abs( Pixel4.R - Pixel2_4.R) + abs( Pixel4.G - Pixel2_4.G) + abs( Pixel4.B - Pixel2_4.B)));
9258                 u16YDiff4_12 = ((abs( Pixel4.R - Pixel2_5.R) + abs( Pixel4.G - Pixel2_5.G) + abs( Pixel4.B - Pixel2_5.B)));
9259                 u16YDiff4_13 = ((abs( Pixel4.R - Pixel2_6.R) + abs( Pixel4.G - Pixel2_6.G) + abs( Pixel4.B - Pixel2_6.B)));
9260 
9261                 u16MaxTB = MAX3(MAX3(u16YDiff7, u16YDiff8, u16YDiff9), MAX3(u16YDiff10, u16YDiff11, u16YDiff12), u16YDiff13);
9262                 u16MaxSS = MAX(MAX3(u16YDiff0, u16YDiff1, u16YDiff2), MAX(u16YDiff4, u16YDiff5));
9263                 u16MaxTB2 = MAX3(MAX3( u16YDiff30, u16YDiff31, u16YDiff32), MAX3(u16YDiff33, u16YDiff34, u16YDiff35), u16YDiff36);
9264                 u16MaxSS2 = MAX(MAX3(u16YDiff37, u16YDiff38, u16YDiff39), MAX(u16YDiff311, u16YDiff312));
9265 
9266                 u16MaxTB = (u16MaxTB + u16MaxTB2)/2;
9267                 u16MaxSS = (u16MaxSS + u16MaxSS2)/2;
9268 
9269                 u16MinTB = MIN3(MIN3(u16YDiff7, u16YDiff8, u16YDiff9), MIN3(u16YDiff10, u16YDiff11, u16YDiff12), u16YDiff13);
9270                 u16MinSS = MIN(MIN3(u16YDiff0, u16YDiff1, u16YDiff2), MIN(u16YDiff4, u16YDiff5));
9271                 u16MinTB2 = MIN3(MIN3( u16YDiff30, u16YDiff31, u16YDiff32), MIN3(u16YDiff33, u16YDiff34, u16YDiff35), u16YDiff36);
9272                 u16MinSS2 = MIN(MIN3(u16YDiff37, u16YDiff38, u16YDiff39), MIN(u16YDiff311, u16YDiff312));
9273 
9274                 u16MinTB = u16MinTB + u16MinTB2;
9275                 u16MinSS = u16MinSS + u16MinSS2;
9276 
9277                 u16MaxTB_1 = MAX3(MAX3(u16YDiff2_7, u16YDiff2_8, u16YDiff2_9), MAX3(u16YDiff2_10, u16YDiff2_11, u16YDiff2_12), u16YDiff2_13);
9278                 u16MaxSS_1 = MAX3(MAX3(u16YDiff2_0, u16YDiff2_1, u16YDiff2_2), MAX3(u16YDiff2_3,  u16YDiff2_4,  u16YDiff2_5),  u16YDiff2_6);
9279                 u16MaxTB_2 = MAX3(MAX3(u16YDiff4_7, u16YDiff4_8, u16YDiff4_9), MAX3(u16YDiff4_10, u16YDiff4_11, u16YDiff4_12), u16YDiff4_13);
9280                 u16MaxSS_2 = MAX3(MAX3(u16YDiff4_0, u16YDiff4_1, u16YDiff4_2), MAX3(u16YDiff4_3,  u16YDiff4_4,  u16YDiff4_5),  u16YDiff4_6);
9281 
9282 
9283                 u16MaxTB_1 = (u16MaxTB_1 + u16MaxTB_2)/2;
9284                 u16MaxSS_1 = (u16MaxSS_1 + u16MaxSS_2)/2;
9285 
9286 
9287                 u16MinTB_1 = MIN3(MIN3(u16YDiff2_7, u16YDiff2_8, u16YDiff2_9), MIN3(u16YDiff2_10, u16YDiff2_11, u16YDiff2_12), u16YDiff2_13);
9288                 u16MinSS_1 = MIN3(MIN3(u16YDiff2_0, u16YDiff2_1, u16YDiff2_2), MIN3(u16YDiff2_3,  u16YDiff2_4,  u16YDiff2_5),  u16YDiff2_6);
9289                 u16MinTB_2 = MIN3(MIN3(u16YDiff4_7, u16YDiff4_8, u16YDiff4_9), MIN3(u16YDiff4_10, u16YDiff4_11, u16YDiff4_12), u16YDiff4_13);
9290                 u16MinSS_2 = MIN3(MIN3(u16YDiff4_0, u16YDiff4_1, u16YDiff4_2), MIN3(u16YDiff4_3,  u16YDiff4_4,  u16YDiff4_5),  u16YDiff4_6);
9291 
9292                 u16MinTB_1 = u16MinTB_1 + u16MinTB_2;
9293                 u16MinSS_1 = u16MinSS_1 + u16MinSS_2;
9294 
9295 
9296                 if (_MDrv_SC_3D_IsPattern(pInstance, x, y, TRUE))
9297                 {
9298                     u16HLinesymmetryCount++;
9299                     bIsPattern = TRUE;
9300                 }
9301 
9302 
9303                 if (_MDrv_SC_3D_IsPattern(pInstance, x, y, FALSE))
9304                 {
9305                     u16VLinesymmetryCount++;
9306                     bIsPattern = TRUE;
9307                 }
9308 
9309                 if (!bIsPattern)
9310                 {
9311                     if ( MAX(u16MinSS, u16MinTB) <= 20 )
9312                     {
9313                         //may consider special pattern in future
9314 #if 0
9315                         if( u16MaxTB < MIN3((4*u16MaxSS/5), u16MaxTB_1, 140) && (u16MinTB!= u16MinSS) && (u16MaxTB!= u16MaxSS))
9316                         {
9317 #if 1
9318                             if(x == 10)
9319                             {
9320                                 printf("tb\n");
9321                             }
9322 #endif
9323                             u16TBCount = u16TBCount+1;
9324                         }
9325                         else if( u16MaxSS < MIN3((3*u16MaxTB/4), u16MaxSS_1, 60) && (u16MinTB!= u16MinSS) && (u16MaxTB!= u16MaxSS))
9326                         {
9327 #if 1
9328                             if(x == 10)
9329                             {
9330                                 printf("ss\n");
9331                             }
9332 #endif
9333                             u16SSCount = u16SSCount+1;
9334                         }
9335 
9336                         if(x == 10)
9337                         {
9338                             printf("eeemaxTB %u, u16MaxSS %u, u16MinTB %u, u16MinSS %u, max1TB %u, max1SS %u\n", u16MaxTB, u16MaxSS, u16MinTB, u16MinSS, u16MaxTB_1, u16MaxSS_1);
9339                         }
9340 #endif
9341                     }
9342                     else if (( MIN(u16MaxTB_1, u16MaxSS_1) > 25 ) && (u16MinTB!= u16MinSS))
9343                     {
9344                         if( u16MinTB < MIN3((4*u16MinSS/5), u16MaxTB_1, 140) && (u16MinTB < u16MaxTB))
9345                         {
9346 #if 0
9347                             if(x == 10)
9348                             {
9349                                 printf("tb\n");
9350                             }
9351 #endif
9352                             u16TBCount = u16TBCount+1;
9353                         }
9354                         else if( u16MinSS < MIN3((3*u16MinTB/4), u16MaxSS_1, 80) && (u16MinSS < u16MaxSS))
9355                         {
9356 #if 0
9357                             if(x == 10)
9358                             {
9359                                 printf("ss\n");
9360                             }
9361 #endif
9362                             u16SSCount = u16SSCount+1;
9363                         }
9364                         else if( MIN(u16MinTB, u16MinSS)!=0 )
9365                         {
9366 #if 0
9367                             if(x == 10)
9368                             {
9369                                 printf("2d\n");
9370                             }
9371 #endif
9372                             u162DCount = u162DCount+1;
9373                         }
9374 #if 0
9375                         if(x == 10)
9376                         {
9377                             printf("fffmaxTB %u, u16MaxSS %u, u16MinTB %u, u16MinSS %u, max1TB %u, max1SS %u, u16MinTB_1 %u, u16MinSS_1 %u\n", u16MaxTB, u16MaxSS, u16MinTB, u16MinSS, u16MaxTB_1, u16MaxSS_1, u16MinTB_1, u16MinSS_1);
9378                         }
9379 #endif
9380                     }
9381                 }
9382             }
9383         }
9384         if (u16HLinesymmetryCount < NBLK_DD_V*(NBLK_DD_H/4-4))
9385         {
9386             if (u16VLinesymmetryCount <= (NBLK_DD_H - 12)*(NBLK_DD_V-4)/4)
9387             {
9388                 if(u16HBlockShift > 0)//overscan case
9389                 {
9390                     if ( MAX3(u16TBCount, u16SSCount, u162DCount)<= 15)//pure image handle
9391                     {
9392                         enFormat = E_3D_FORMAT_2D;
9393                     }
9394                     else if((u16SSCount > u16TBCount) && (u16SSCount > u162DCount))//ss predict
9395                     {
9396                         if(u16SSCount < 50)//small image case
9397                         {
9398                             if(u16SSCount>6*u162DCount)
9399                             {
9400                                 enFormat = E_3D_FORMAT_SS;
9401                             }
9402                             if((u16SSCount>3*u162DCount) && (u16SSCount>6*u16TBCount))
9403                             {
9404                                 enFormat = E_3D_FORMAT_SS;
9405                             }
9406                             else
9407                             {
9408                                 enFormat = E_3D_FORMAT_2D;
9409                             }
9410                         }
9411 #if (HW_2DTO3D_VER == 4)
9412                         else if(2*u16SSCount>5*u162DCount)//general case
9413 #else
9414                         else if(u16SSCount>4*u162DCount)//general case
9415 #endif
9416                         {
9417                             enFormat = E_3D_FORMAT_SS;
9418                         }
9419                         //else if((u16SSCount>2*u162DCount) && (u16SSCount>4*u16TBCount))
9420                         else if((u16SSCount>5*u162DCount/2) && (u16SSCount>4*u16TBCount))
9421                         {
9422                             enFormat = E_3D_FORMAT_SS;
9423                         }
9424                         else
9425                         {
9426                             enFormat = E_3D_FORMAT_2D;
9427                         }
9428                     }
9429                     else if((u16TBCount > u16SSCount) && (u16TBCount > u162DCount))//tb predict
9430                     {
9431                         if(u16TBCount < 50)//small image case
9432                         {
9433                             if(u16TBCount > 6*u162DCount)
9434                             {
9435                                 enFormat = E_3D_FORMAT_TB;
9436                             }
9437                             else if((u16TBCount > 3*u162DCount) && (u16TBCount > 6*u16SSCount))
9438                             {
9439                                 enFormat = E_3D_FORMAT_TB;
9440                             }
9441                             else
9442                             {
9443                                 enFormat = E_3D_FORMAT_2D;
9444                             }
9445                         }
9446                         else if(u16TBCount > 3*u162DCount)//general case
9447                         {
9448                             enFormat = E_3D_FORMAT_TB;
9449                         }
9450                         //else if((u16TBCount>2*u162DCount) && (u16TBCount>4*u16SSCount))
9451                         //else if((u16TBCount > 100) && (u16TBCount>9*u162DCount/5) && (u16TBCount>13*u16SSCount/2))
9452                         else if((u16TBCount>5*u162DCount/2) && (u16TBCount>4*u16SSCount))
9453                         {
9454                             enFormat = E_3D_FORMAT_TB;
9455                         }
9456                         else
9457                         {
9458                             enFormat = E_3D_FORMAT_2D;
9459                         }
9460                     }
9461                     else//2d predict
9462                     {
9463                         enFormat = E_3D_FORMAT_2D;
9464                     }
9465                 }
9466                 else
9467                 {
9468                     if ( MAX3(u16TBCount, u16SSCount, u162DCount)< 6)//pure image handle
9469                     {
9470                         enFormat = E_3D_FORMAT_2D;
9471                     }
9472                     else if((u16SSCount > u16TBCount) && (u16SSCount > u162DCount))//ss predict
9473                     {
9474                         if(u16SSCount < 50)//small image case
9475                         {
9476                             if(u16SSCount>7*u162DCount)
9477                             {
9478                                 enFormat = E_3D_FORMAT_SS;
9479                             }
9480                             else
9481                             {
9482                                 enFormat = E_3D_FORMAT_2D;
9483                             }
9484                         }
9485 #if (HW_2DTO3D_VER == 4)
9486                         else if(2*u16SSCount>5*u162DCount)//general case
9487 #else
9488                         else if(u16SSCount>4*u162DCount)//general case
9489 #endif
9490                         {
9491                             enFormat = E_3D_FORMAT_SS;
9492                         }
9493                         else
9494                         {
9495                             enFormat = E_3D_FORMAT_2D;
9496                         }
9497                     }
9498                     else if((u16TBCount > u16SSCount) && (u16TBCount > u162DCount))//tb predict
9499                     {
9500                         if(u16TBCount < 50)//small image case
9501                         {
9502                             if(u16TBCount > 7*u162DCount)
9503                             {
9504                                 enFormat = E_3D_FORMAT_TB;
9505                             }
9506                             else
9507                             {
9508                                 enFormat = E_3D_FORMAT_2D;
9509                             }
9510                         }
9511                         else if(u16TBCount > 4*u162DCount)//general case
9512                         {
9513                             enFormat = E_3D_FORMAT_TB;
9514                         }
9515                         else
9516                         {
9517                             enFormat = E_3D_FORMAT_2D;
9518                         }
9519                     }
9520                     else//2d predict
9521                     {
9522                         enFormat = E_3D_FORMAT_2D;
9523                     }
9524                 }
9525             }
9526             else
9527             {
9528                 enFormat = E_3D_FORMAT_TB_PATTERN;
9529             }
9530         }
9531         else
9532         {
9533             enFormat = E_3D_FORMAT_SS_PATTERN;
9534         }
9535 #if PRINTINFO
9536     printf("u16TBCount=%u, u16SSCount=%u, u162DCount=%u, u16HLinesymmetryCount=%u, u16VLinesymmetryCount=%u, u8Format=%u\n", u16TBCount, u16SSCount, u162DCount, u16HLinesymmetryCount, u16VLinesymmetryCount, enFormat);
9537 #endif
9538     }
9539 
9540 
9541     ///frame statistics
9542     pXCResourcePrivate->stdrvXC_3D._u16TotalCount++;
9543     if(enFormat == E_3D_FORMAT_SS)
9544     {
9545         pXCResourcePrivate->stdrvXC_3D._u16SBSCount++;
9546     }
9547     else if(enFormat == E_3D_FORMAT_TB)
9548     {
9549         pXCResourcePrivate->stdrvXC_3D._u16TBCount++;
9550     }
9551     else if(enFormat == E_3D_FORMAT_2D || enFormat == E_3D_FORMAT_SS_PATTERN || enFormat == E_3D_FORMAT_TB_PATTERN)
9552     {
9553         pXCResourcePrivate->stdrvXC_3D._u162DCount++;
9554     }
9555 
9556     if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
9557     {
9558         if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT)
9559         {
9560             pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
9561             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
9562                                               , pXCResourcePrivate->stdrvXC_3D._u162DCount
9563                                               , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
9564                                               , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
9565             if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
9566                 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9567             {
9568                 if(pXCResourcePrivate->stdrvXC_3D._u16SBSCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
9569                 {
9570                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
9571                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
9572                     MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
9573                 }
9574                 else
9575                 {
9576                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9577                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9578                 }
9579             }
9580             else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
9581                     && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9582             {
9583                 if(pXCResourcePrivate->stdrvXC_3D._u16TBCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
9584                 {
9585                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
9586                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
9587                     MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
9588                 }
9589                 else
9590                 {
9591                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9592                     pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9593                 }
9594             }
9595             else
9596             {
9597                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9598                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9599             }
9600         }
9601     }
9602     else if(E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
9603     {
9604         if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT_COMPATIBLE)
9605         {
9606             pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
9607             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
9608                                               , pXCResourcePrivate->stdrvXC_3D._u162DCount
9609                                               , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
9610                                               , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
9611             if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
9612                 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9613             {
9614                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
9615                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
9616             }
9617             else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
9618                     && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9619             {
9620                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
9621                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
9622             }
9623             else
9624             {
9625                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9626                 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9627             }
9628             pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount++;
9629         }
9630     }
9631 }
9632 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)9633 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
9634 {
9635     void *pInstance = pu32XCInst_private;
9636     eIntNum = eIntNum;
9637     pParam = pParam;
9638     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9639     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9640     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9641     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9642 
9643     if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
9644     {
9645         _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(pInstance);
9646         _MDrv_SC_3D_2DTo3D_HWInfo_Read(pInstance);
9647         _MDrv_SC_3D_2DTo3D_DepthDetectionPIX(pInstance);
9648         _MDrv_SC_3D_2DTo3D_DepthDetectionBLK(pInstance);
9649         _MDrv_SC_3D_2DTo3D_HW_Info_Write(pInstance);
9650         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9651         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9652         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
9653         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
9654     }
9655 
9656     if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
9657         || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))
9658     {
9659         _MDrv_SC_3D_SourceDetection(pInstance);
9660     }
9661 }
9662 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)9663 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
9664 {
9665     void *pInstance = pu32XCInst_private;
9666     eIntNum = eIntNum;
9667     pParam = pParam;
9668     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9669     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9670     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9671     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9672 
9673 
9674 
9675     if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
9676     {
9677 #if ENABLE_T3D_DEBUG
9678         pXCResourcePrivate->stdrvXC_3D.u8DBG_En = (SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0F00)>>8;
9679 #else
9680         pXCResourcePrivate->stdrvXC_3D.u8DBG_En = 0;
9681 #endif
9682 
9683         _MDrv_SC_3D_2DTo3D_PreSetting(pInstance);
9684         //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==0)
9685         {
9686             //startTime = MsOS_GetSystemTime();
9687             //if(period_too_short == 0)
9688                 _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(pInstance);
9689                 //_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(); //INTERRUPT
9690         }
9691 #if ENABLE_T3D_DEBUG
9692         if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==0)
9693 #endif
9694         {
9695         _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(pInstance);
9696         }
9697             _MDrv_SC_3D_2DTo3D_TrendDetection(pInstance);
9698             _MDrv_SC_3D_2DTo3D_BGColorDetection_U9(pInstance); //New, move out
9699             _MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(pInstance); //New
9700 
9701 
9702         //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0010)==0)
9703         {
9704             _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(pInstance);
9705             _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(pInstance);
9706         }
9707 
9708             _MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(pInstance);
9709 
9710         if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En!=0x00)
9711         {
9712             _MDrv_SC_3D_2DTo3D_DepthDetectionTmp(pInstance);
9713         }
9714 #if ENABLE_T3D_DEBUG
9715         if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x1000)==0)
9716 #endif
9717         {
9718         _MDrv_SC_3D_2DTo3D_HW_Info_Write(pInstance);
9719         }
9720 
9721 
9722 
9723         //Global and Local depth gain tuning
9724 #if 0//DUMYGAINCTRL
9725         MS_U8 u8tmpval_FE = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5B_L,0xff));//0EB8
9726         MS_U8 u8tmpval_FF = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L,0xff00))>>8;//0EB9
9727         MS_BOOL LR_SWAP = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L,0x8000))>>15;
9728         MS_U16 Ggain, Pgain, Genable, Penable;
9729         Ggain = u8tmpval_FE&0x7F;
9730         Genable = (u8tmpval_FE&0x80)>>7;
9731         Pgain = u8tmpval_FF&0x7F;
9732         Penable = (u8tmpval_FF&0x80)>>7;
9733 
9734         if(Genable==1)
9735         {
9736             Ggain = MINMAX(Ggain,0,0x7F);
9737             if(LR_SWAP)
9738             {
9739                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, Ggain<<8 ,0xff00);
9740                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, (Ggain+0x80)<<8,0xff00);
9741 
9742             }
9743             else
9744             {
9745                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, Ggain<<8 ,0xff00);
9746                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, (Ggain+0x80)<<8,0xff00);
9747                 //MFC_WriteByte(REG_13B1D,Ggain);
9748            //MFC_WriteByte(REG_13B0D,Ggain+0x80);
9749             }
9750         }
9751         else
9752         {
9753             if(E_XC_3D_OUTPUT_TOP_BOTTOM_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
9754             {
9755                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9756                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9757                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
9758                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
9759             }
9760         }
9761 
9762         if(Penable==1)
9763         {
9764             if(E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
9765             {
9766                 Pgain = MINMAX(Pgain*8,0,0xFF);
9767 
9768                     if (LR_SWAP)
9769                     {
9770                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~Pgain)+1 ,0x01ff);
9771                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, Pgain, 0x01ff);
9772                     }
9773                     else
9774                     {
9775                        SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, (~Pgain)+1 ,0x01ff);
9776                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, Pgain, 0x01ff);
9777                         //MFC_Write2BytesMask(REG_13BCC,(~Pgain)+1,0x01FF);
9778                        //MFC_Write2BytesMask(REG_13BCA,Pgain,0x01FF);
9779                     }
9780                 }
9781             }
9782 #else
9783 
9784         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9785         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9786         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<9, 0x7F00);//left depth gain:7bits
9787         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<9, 0x7F00);//right depth gain:7bits
9788 
9789         MS_U16 Pgain_L =  pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain <<2;
9790         if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK62_06_L)&0x8000) == 0)
9791         {
9792             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~Pgain_L) + 1, 0x01FF);
9793             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, Pgain_L, 0x01FF);
9794         }
9795         else
9796         {
9797             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, Pgain_L, 0x01FF);
9798             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, (~Pgain_L) + 1, 0x01FF);
9799         }
9800         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x80, 0x00FF);//left depth gain:7bits
9801         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8000, 0xFF00);//right depth gain:7bits
9802 
9803 #if ENABLE_T3D_DEBUG
9804         //enable black edge
9805         Hal_SC_3D_enable_black_edge(pInstance, TRUE);
9806 #endif
9807 
9808 #endif
9809     }
9810 
9811     if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
9812         || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))
9813     {
9814         _MDrv_SC_3D_SourceDetection(pInstance);
9815     }
9816 }
9817 #endif //(HW_2DTO3D_VER == 3)
9818 #endif //(HW_2DTO3D_VER < 3)
9819 #endif //HW_2DTO3D_SUPPORT
9820 #endif //DISABLE_3D_FUNCTION
9821 //------------------------------------------------------------------------------
9822 //--------HW 2D to 3D CPU Depth Refine Part End---------------------------------
9823 //------------------------------------------------------------------------------
9824 //------------------------------------------------------------------------------
9825 
9826 
9827 
9828 //----------------------------------------
9829 //--------3D external interface-----------
9830 //----------------------------------------
9831 //-------------------------------------------------------------------------------------------------
9832 /// get 3D hw version
9833 /// @return MS_U16                      \b OUT: 3d hw version
9834 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_HW_Version(void)9835 MS_U16 MDrv_XC_Get_3D_HW_Version(void)
9836 {
9837 // Note: HW_DESIGN_3D_VER
9838 // 0: T3, Janus. non 3d chip, use opm, madi etc to make 3d
9839 // 1: T12, T13, A1: it has some 3d type specific registers. It can send out LR flag by hw
9840 //        Yet A1 has hw 2d-->3d, but we use HW_2DTO3D_SUPPORT to indicate it.
9841 // 2: M10, J2: based on version 1, it has all the 3d type registers. input and output 3d registers are independent.
9842 // 3: A6: based on version 2, it removes black space before reading into memory.
9843 // 4: A3, A5, A5P: based on version3, main sub window can both use 1920+960 line buffer, so no H prescaling is needed.
9844 //        It has FRC-inside feature also, but we use FRC_INSIDE to indicate this feature.
9845     return HW_DESIGN_3D_VER;
9846 }
9847 
MApi_XC_Get_3D_HW_Version_U2(void * pInstance)9848 MS_U16 MApi_XC_Get_3D_HW_Version_U2(void* pInstance)
9849 {
9850     MS_U16 u16Return = 0;
9851     u16Return = MDrv_XC_Get_3D_HW_Version();
9852     return u16Return;
9853 }
9854 
MApi_XC_Get_3D_HW_Version(void)9855 MS_U16 MApi_XC_Get_3D_HW_Version(void)
9856 {
9857     if (pu32XCInst == NULL)
9858     {
9859         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9860         return 0;
9861     }
9862 
9863     stXC_GET_3D_HWVERSION XCArgs;
9864     XCArgs.u16ReturnValue = 0;
9865 
9866     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HWVERSION, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9867     {
9868         printf("Obtain XC engine fail\n");
9869         return 0;
9870     }
9871     else
9872     {
9873         return XCArgs.u16ReturnValue;
9874     }
9875 }
9876 
9877 //-------------------------------------------------------------------------------------------------
9878 /// Is Supported HW 2D To 3D
9879 /// @return MS_BOOL                      \b OUT: TRUE: HW 2D to 3D FALSE: SW 2D to 3D
9880 //-------------------------------------------------------------------------------------------------
9881 
MDrv_XC_Get_3D_IsSupportedHW2DTo3D(void)9882 MS_BOOL MDrv_XC_Get_3D_IsSupportedHW2DTo3D(void)
9883 {
9884     return HW_2DTO3D_SUPPORT;
9885 }
9886 
MApi_XC_Get_3D_IsSupportedHW2DTo3D_U2(void * pInstance)9887 MS_BOOL MApi_XC_Get_3D_IsSupportedHW2DTo3D_U2(void* pInstance)
9888 {
9889     return MDrv_XC_Get_3D_IsSupportedHW2DTo3D();
9890 }
9891 
MApi_XC_Get_3D_IsSupportedHW2DTo3D(void)9892 MS_BOOL MApi_XC_Get_3D_IsSupportedHW2DTo3D(void)
9893 {
9894     if (pu32XCInst == NULL)
9895     {
9896         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9897         return FALSE;
9898     }
9899 
9900     stXC_CHECK_3D_SUPPORT_HW2DTO3D XCArgs;
9901     XCArgs.bReturnValue = FALSE;
9902 
9903     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_SUPPORT_HW2DTO3D, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9904     {
9905         printf("Obtain XC engine fail\n");
9906         return FALSE;
9907     }
9908     else
9909     {
9910         return XCArgs.bReturnValue;
9911     }
9912 }
9913 
9914 //-------------------------------------------------------------------------------------------------
9915 /// set 3D convert format type
9916 /// @param  e3dInputMode                \b IN: the input format
9917 /// @param  e3dOutputMode               \b IN: the format we want to convert to
9918 /// @param  e3dPanelType                \b IN: the panel type.
9919 /// @param  eWindow                     \b IN: which window we are going to set
9920 /// @return MS_BOOL                     \b OUT: TRUE:Success FALSE:Fail
9921 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_Mode_U2(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType,SCALER_WIN eWindow)9922 MS_BOOL MApi_XC_Set_3D_Mode_U2(void* pInstance,
9923                             E_XC_3D_INPUT_MODE e3dInputMode,
9924                             E_XC_3D_OUTPUT_MODE e3dOutputMode,
9925                             E_XC_3D_PANEL_TYPE e3dPanelType,
9926                             SCALER_WIN eWindow)
9927 {
9928 #ifndef DISABLE_3D_FUNCTION
9929     MS_ASSERT(eWindow < MAX_WINDOW);
9930     MS_BOOL bRet = TRUE;
9931     E_XC_3D_INPUT_MODE eMain_3dInputMode = E_XC_3D_INPUT_MODE_NONE;
9932     E_XC_3D_OUTPUT_MODE eMain_3dOutputMode = E_XC_3D_OUTPUT_MODE_NONE;
9933 
9934     if(eWindow >= MAX_WINDOW)
9935     {
9936         return FALSE;
9937     }
9938     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9939     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9940     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9941     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9942     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9943     Hal_SC_3D_InvertMemsyncInterlaceMode(pInstance);
9944 
9945 #if((HW_DESIGN_3D_VER >= 5) || (HW_DESIGN_3D_VER == 3)) //manhattan and muji mode
9946     if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR == e3dOutputMode)
9947     {
9948         pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = TRUE;
9949         e3dOutputMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
9950     }
9951     else if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW == e3dOutputMode)
9952     {
9953         pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = TRUE;
9954         e3dOutputMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW;
9955     }
9956     else
9957     {
9958         pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = FALSE;
9959     }
9960 #endif
9961 
9962     #if FRC_INSIDE
9963     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC &&
9964         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
9965         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
9966         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500) &&  // 4K2K panel
9967         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K1K_120HZ) &&
9968         (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == e3dOutputMode))
9969     {
9970         // For FRC inside chip, ex.Einstein/Napoli
9971         // 4K1K FA output case, FRC only can handle TB in to FA out
9972         // so SC need to convert 3D output as TB mode
9973         e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
9974     }
9975 
9976 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6)) //maserati 3D use FRC
9977      if (MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW)
9978 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
9979          ||((e3dInputMode == E_XC_3D_INPUT_MODE_NONE)  // add dual view type
9980          &&((e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9981          ||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)))
9982 #endif
9983         )
9984     {
9985         switch(e3dOutputMode)
9986         {
9987             case E_XC_3D_OUTPUT_FRAME_L:
9988             case E_XC_3D_OUTPUT_FRAME_R:
9989                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
9990                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
9991                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
9992                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
9993                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
9994                 break;
9995             case E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF:
9996             case E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW:
9997                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
9998                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
9999                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10000                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10001                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10002                 break;
10003             case E_XC_3D_OUTPUT_TOP_BOTTOM:
10004             case E_XC_3D_OUTPUT_TOP_BOTTOM_HW:
10005                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10006                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10007                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10008                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10009                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10010                 break;
10011             case E_XC_3D_OUTPUT_LINE_ALTERNATIVE:
10012                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10013                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = TRUE;
10014                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10015                 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
10016                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10017                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_LINE_ALTERNATIVE;
10018                 break;
10019             case E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW:
10020                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10021                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = TRUE;
10022                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10023                 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM_HW;
10024                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10025                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_LINE_ALTERNATIVE;
10026                 break;
10027             case E_XC_3D_OUTPUT_FRAME_ALTERNATIVE:
10028                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = TRUE;
10029                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10030                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10031                 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
10032                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10033                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
10034                 break;
10035             case E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW:
10036                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = TRUE;
10037                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10038                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10039                 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM_HW;
10040                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10041                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
10042                 break;
10043             default:
10044                 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10045                 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10046                 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10047                 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10048                 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10049                 break;
10050         }
10051         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "e3dOutputMode = %d, FRC Input 3D Type = %d, FRC output 3D Type = %d\n", e3dOutputMode,\
10052             pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode, pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode);
10053     }
10054     else
10055     {
10056         pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10057         pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10058         pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10059         pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10060         pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10061     }
10062 #endif
10063     #endif
10064 
10065 #if (!(HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3)))
10066     if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
10067     {
10068         if((e3dInputMode != E_XC_3D_INPUT_MODE_NONE) && (e3dOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
10069         {
10070             pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
10071         }
10072         else
10073         {
10074             pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
10075         }
10076     }
10077 #endif
10078 
10079     pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[eWindow]   = E_XC_3D_INPUT_MODE_NONE;
10080     pXCResourcePrivate->stdrvXC_3D._ePreUsedOutput3DMode           = E_XC_3D_OUTPUT_MODE_NONE;
10081     pXCResourcePrivate->stdrvXC_3D._bNeedRestore3DFormat = FALSE;
10082 
10083     if(eWindow == MAIN_WINDOW)
10084     {
10085         bRet = MDrv_XC_Is3DFormatSupported(pInstance, e3dInputMode, e3dOutputMode);
10086     }
10087     else
10088     {
10089         /// When 3D output is FI, the VOP window don't need to enable Sub
10090         if(e3dOutputMode != E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
10091         {
10092             eMain_3dInputMode = MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW);
10093             eMain_3dOutputMode = MDrv_XC_Get_3D_Output_Mode(pInstance);
10094             if((eMain_3dInputMode != e3dInputMode)||(eMain_3dOutputMode != e3dOutputMode))
10095             {
10096                 printf("Please check the 3D combination of sub's\n");
10097                 bRet = FALSE;
10098             }
10099         }
10100     }
10101 
10102     if(bRet == TRUE)
10103     {
10104         pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = e3dInputMode;
10105         pXCResourcePrivate->stdrvXC_3D._eOutput3DMode         = e3dOutputMode;
10106         pXCResourcePrivate->stdrvXC_3D._e3DPanelType          = e3dPanelType;
10107         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "e3dInputMode=%u, e3dOutputMode=%u\n", e3dInputMode, e3dOutputMode);
10108     }
10109     else //if not supported, display as 2D
10110     {
10111         printf("MApi_XC_Set_3D_Mode(): invalid format, set to 3d_none\n");
10112         _XC_ENTRY(pInstance);
10113         Hal_SC_subwindow_disable(pInstance);
10114         _XC_RETURN(pInstance);
10115         pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = E_XC_3D_INPUT_MODE_NONE;
10116         gSrcInfo[eWindow].stDispWin.x = 0;
10117         gSrcInfo[eWindow].stDispWin.y = 0;
10118         gSrcInfo[eWindow].stDispWin.width = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
10119         gSrcInfo[eWindow].stDispWin.height = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
10120     }
10121 
10122 #if (HW_DESIGN_3D_VER == 4)
10123     if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
10124     {
10125         if(e3dPanelType == E_XC_3D_PANEL_PELLICLE)
10126         {
10127             if((e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
10128             ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD))
10129             {
10130 #ifdef FA_1920X540_OUTPUT
10131                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10132 #else
10133                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_960x1080;
10134 #endif
10135             }
10136             else if((e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
10137             ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
10138             ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE))
10139             {
10140                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10141             }
10142             else
10143             {
10144                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x1080;
10145             }
10146         }
10147         else if(e3dPanelType == E_XC_3D_PANEL_SHUTTER)
10148         {
10149             if((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING))
10150             {
10151                 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
10152                 {
10153                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
10154                     {
10155                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10156                     }
10157                     else
10158                     {
10159                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x1080;
10160                     }
10161                 }
10162                 else if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE)
10163                 {
10164                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
10165                     {
10166                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10167                     }
10168                     else
10169                     {
10170                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1280x720;
10171                     }
10172                 }
10173             }
10174         }
10175     }
10176     else
10177         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_MODE_NONE;
10178 
10179     if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC && (IS_INPUT_NORMAL_2D_HW(eWindow)))
10180     {
10181         // Enable CLK_ICLK_FRC
10182         W2BYTEMSK(L_CLKGEN1(0x35), 0x0004, 0x0004); // clk_idclk_frc
10183         W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10184         W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10185     }
10186     else
10187     {
10188         // Enable CLK_ICLK_FRC
10189         W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0004); // clk_fdclk_frc
10190         W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10191         W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10192     }
10193 
10194     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u83D_FI_out=%x\n",pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out);
10195 #endif
10196     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10197 #else
10198     MS_BOOL bRet = FALSE;
10199     UNUSED(e3dInputMode);
10200     UNUSED(e3dOutputMode);
10201     UNUSED(e3dPanelType);
10202     UNUSED(eWindow);
10203 
10204     printf("Not support!!");
10205 #endif
10206     return bRet;
10207 }
10208 
MApi_XC_Set_3D_Mode(E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType,SCALER_WIN eWindow)10209 MS_BOOL MApi_XC_Set_3D_Mode(E_XC_3D_INPUT_MODE e3dInputMode,
10210                             E_XC_3D_OUTPUT_MODE e3dOutputMode,
10211                             E_XC_3D_PANEL_TYPE e3dPanelType,
10212                             SCALER_WIN eWindow)
10213 {
10214     if (pu32XCInst == NULL)
10215     {
10216         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10217         return FALSE;
10218     }
10219 
10220     stXC_SET_3D_MODE XCArgs;
10221     XCArgs.e3dInputMode = e3dInputMode;
10222     XCArgs.e3dOutputMode = e3dOutputMode;
10223     XCArgs.e3dPanelType = e3dPanelType;
10224     XCArgs.eWindow = eWindow;
10225     XCArgs.bReturnValue = FALSE;
10226 
10227     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10228     {
10229         printf("Obtain XC engine fail\n");
10230         return FALSE;
10231     }
10232     else
10233     {
10234         return XCArgs.bReturnValue;
10235     }
10236 }
10237 
10238 //-------------------------------------------------------------------------------------------------
10239 /// This API return 3D input format
10240 /// @param  eWindow                \b IN: which window we are going to set
10241 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Input_Mode(void * pInstance,SCALER_WIN eWindow)10242 E_XC_3D_INPUT_MODE MDrv_XC_Get_3D_Input_Mode(void *pInstance, SCALER_WIN eWindow)
10243 {
10244 #ifndef DISABLE_3D_FUNCTION
10245     MS_ASSERT(eWindow < MAX_WINDOW);
10246     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10247     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10248     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10249     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10250     if(eWindow >= MAX_WINDOW)
10251     {
10252         return E_XC_3D_INPUT_MODE_NONE;
10253     }
10254     return pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow];
10255 #else
10256     UNUSED(eWindow);
10257     return E_XC_3D_INPUT_MODE_NONE;
10258 #endif
10259 }
10260 
MApi_XC_Get_3D_Input_Mode_U2(void * pInstance,SCALER_WIN eWindow)10261 E_XC_3D_INPUT_MODE MApi_XC_Get_3D_Input_Mode_U2(void* pInstance, SCALER_WIN eWindow)
10262 {
10263    E_XC_3D_INPUT_MODE  eInputMode = E_XC_3D_INPUT_MODE_NONE;
10264     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10265     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10266    _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10267    eInputMode = MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow);
10268    _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10269    return eInputMode;
10270 }
10271 
MApi_XC_Get_3D_Input_Mode(SCALER_WIN eWindow)10272 E_XC_3D_INPUT_MODE MApi_XC_Get_3D_Input_Mode(SCALER_WIN eWindow)
10273 {
10274     if (pu32XCInst == NULL)
10275     {
10276         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10277         {
10278             printf("UtopiaOpen XC failed\n");
10279             return E_XC_3D_INPUT_MODE_NONE;
10280         }
10281     }
10282 
10283     stXC_GET_3D_INPUT_MODE XCArgs;
10284     XCArgs.eWindow = eWindow;
10285     XCArgs.eReturnValue = E_XC_3D_INPUT_MODE_NONE;
10286 
10287     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_INPUT_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10288     {
10289         printf("Obtain XC engine fail\n");
10290         return E_XC_3D_INPUT_MODE_NONE;
10291     }
10292     else
10293     {
10294         return XCArgs.eReturnValue;
10295     }
10296 }
10297 
10298 //-------------------------------------------------------------------------------------------------
10299 /// This API return 3D output format
10300 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Output_Mode(void * pInstance)10301 E_XC_3D_OUTPUT_MODE MDrv_XC_Get_3D_Output_Mode(void *pInstance)
10302 {
10303 #ifndef DISABLE_3D_FUNCTION
10304     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10305     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10306     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10307     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10308     return pXCResourcePrivate->stdrvXC_3D._eOutput3DMode;
10309 #else
10310     return E_XC_3D_OUTPUT_MODE_NONE;
10311 #endif
10312 }
10313 
MApi_XC_Get_3D_Output_Mode_U2(void * pInstance)10314 E_XC_3D_OUTPUT_MODE MApi_XC_Get_3D_Output_Mode_U2(void* pInstance)
10315 {
10316     E_XC_3D_OUTPUT_MODE eOutputMode = E_XC_3D_OUTPUT_MODE_NONE;
10317     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10318     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10319     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10320     eOutputMode = MDrv_XC_Get_3D_Output_Mode(pInstance);
10321     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10322     return eOutputMode;
10323 }
10324 
MApi_XC_Get_3D_Output_Mode(void)10325 E_XC_3D_OUTPUT_MODE MApi_XC_Get_3D_Output_Mode(void)
10326 {
10327     if (pu32XCInst == NULL)
10328     {
10329         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10330         return E_XC_3D_OUTPUT_MODE_NONE;
10331     }
10332 
10333     stXC_GET_3D_OUTPUT_MODE XCArgs;
10334     XCArgs.eReturnValue = E_XC_3D_OUTPUT_MODE_NONE;
10335 
10336     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_OUTPUT_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10337     {
10338         printf("Obtain XC engine fail\n");
10339         return E_XC_3D_OUTPUT_MODE_NONE;
10340     }
10341     else
10342     {
10343         return XCArgs.eReturnValue;
10344     }
10345 }
10346 
10347 #ifdef UFO_XC_GET_3D_FORMAT
MDrv_XC_Get3DFormat(void * pInstance,E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10348 MS_BOOL MDrv_XC_Get3DFormat(void* pInstance, E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10349 {
10350     MS_BOOL bRet = FALSE;
10351 #ifndef DISABLE_3D_FUNCTION
10352     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10353     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10354     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10355     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10356 
10357     if((NULL == para) || (NULL == p3DFormat))
10358     {
10359         printf(" \n Attention %s : %d, ERROR : (NULL == para) || (NULL == p3DFormat). \n ",__FUNCTION__,__LINE__);
10360         return FALSE;
10361     }
10362 
10363     E_XC_3D_OSD_BLENDING_POINT eOSDBlendingPoint = E_XC_3D_OSD_BLENDING_NUM;
10364     if(E_XC_3D_ATTRIBUTE_OSD == e3DAttrType)
10365     {
10366         eOSDBlendingPoint = *((E_XC_3D_OSD_BLENDING_POINT*)(para));
10367         if(E_XC_3D_OSD_BLENDING_SC_IP == eOSDBlendingPoint)
10368         {
10369             *((E_XC_3D_INPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW];
10370             bRet = TRUE;
10371         }
10372         else if(E_XC_3D_OSD_BLENDING_SC_OP == eOSDBlendingPoint)
10373         {
10374             if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA && !pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled)
10375             {
10376                 if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == pXCResourcePrivate->stdrvXC_3D._eOutput3DMode)
10377                 {
10378                     *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW;
10379                 }
10380                 else
10381                 {
10382                     *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR;
10383                 }
10384             }
10385             else
10386             {
10387                 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eOutput3DMode;
10388             }
10389             bRet = TRUE;
10390         }
10391         else if(E_XC_3D_OSD_BLENDING_FRC_IP == eOSDBlendingPoint)
10392         {
10393             *((E_XC_3D_INPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode;
10394             bRet = TRUE;
10395         }
10396         else if(E_XC_3D_OSD_BLENDING_FRC_OP == eOSDBlendingPoint)
10397         {
10398             if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA  && pXCResourcePrivate->stdrvXC_3D._bFAToTB)
10399             {
10400                 if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == pXCResourcePrivate->stdrvXC_3D._eOutput3DMode)
10401                 {
10402                     *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW;
10403                 }
10404                 else
10405                 {
10406                     *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR;
10407                 }
10408             }
10409             else
10410             {
10411                 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode;
10412             }
10413             bRet = TRUE;
10414         }
10415         else
10416         {
10417             *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_MODE_NONE;
10418             bRet = FALSE;
10419         }
10420     }
10421 #endif
10422     return bRet;
10423 }
10424 
MApi_XC_Get3DFormat_U2(void * pInstance,E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10425 MS_BOOL MApi_XC_Get3DFormat_U2(void* pInstance, E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10426 {
10427     MS_BOOL bRet = FALSE;
10428     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10429     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10430     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10431     bRet = MDrv_XC_Get3DFormat(pInstance, e3DAttrType, para, p3DFormat);
10432     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10433     return bRet;
10434 }
10435 
MApi_XC_Get3DFormat(E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10436 MS_BOOL MApi_XC_Get3DFormat(E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10437 {
10438     if (pu32XCInst == NULL)
10439     {
10440         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10441         return FALSE;
10442     }
10443 
10444     stXC_GET3DFORMAT XCArgs;
10445     XCArgs.e3DAttrType = e3DAttrType;
10446     XCArgs.para = para;
10447     XCArgs.p3DFormat = p3DFormat;
10448     XCArgs.bReturnValue = FALSE;
10449 
10450     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET3DFORMAT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10451     {
10452         printf("\n %s : %d, Obtain XC engine fail \n ",__FUNCTION__,__LINE__);
10453         return E_XC_3D_OUTPUT_MODE_NONE;
10454     }
10455     else
10456     {
10457         return XCArgs.bReturnValue;
10458     }
10459 
10460 }
10461 #endif
10462 //-------------------------------------------------------------------------------------------------
10463 /// This API return 3D panel type
10464 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Panel_Type(void * pInstance)10465 E_XC_3D_PANEL_TYPE MDrv_XC_Get_3D_Panel_Type(void *pInstance)
10466 {
10467     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10468     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10469     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10470     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10471     return pXCResourcePrivate->stdrvXC_3D._e3DPanelType;
10472 }
10473 
MApi_XC_Get_3D_Panel_Type_U2(void * pInstance)10474 E_XC_3D_PANEL_TYPE MApi_XC_Get_3D_Panel_Type_U2(void* pInstance)
10475 {
10476 #ifndef DISABLE_3D_FUNCTION
10477     E_XC_3D_PANEL_TYPE eType = E_XC_3D_PANEL_NONE;
10478     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10479     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10480     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10481     eType = MDrv_XC_Get_3D_Panel_Type(pInstance);
10482     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10483     return eType;
10484 #else
10485     return E_XC_3D_PANEL_NONE;
10486 #endif
10487 }
10488 
MApi_XC_Get_3D_Panel_Type(void)10489 E_XC_3D_PANEL_TYPE MApi_XC_Get_3D_Panel_Type(void)
10490 {
10491     if (pu32XCInst == NULL)
10492     {
10493         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10494         return E_XC_3D_PANEL_MAX;
10495     }
10496 
10497     stXC_GET_3D_PANELTYPE XCArgs;
10498     XCArgs.eReturnValue = E_XC_3D_PANEL_MAX;
10499 
10500     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_PANELTYPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10501     {
10502         printf("Obtain XC engine fail\n");
10503         return E_XC_3D_PANEL_MAX;
10504     }
10505     else
10506     {
10507         return XCArgs.eReturnValue;
10508     }
10509 }
10510 
10511 //-------------------------------------------------------------------------------------------------
10512 /// do Ip Sync to make main and sub window same relation to OP, thus framelock could be applied to
10513 /// both main and sub window
10514 /// @return MS_BOOL                \b OUT: TRUE:Success FALSE:Fail
10515 //-------------------------------------------------------------------------------------------------
MApi_XC_3DMainSub_IPSync_U2(void * pInstance)10516 MS_BOOL MApi_XC_3DMainSub_IPSync_U2(void* pInstance)
10517 {
10518 #ifndef DISABLE_3D_FUNCTION
10519     _XC_ENTRY(pInstance);
10520     HAL_SC_ip_3DMainSub_IPSync(pInstance);
10521     _XC_RETURN(pInstance);
10522     return TRUE;
10523 #else
10524     return FALSE;
10525 #endif
10526 }
10527 
MApi_XC_3DMainSub_IPSync(void)10528 MS_BOOL MApi_XC_3DMainSub_IPSync(void)
10529 {
10530     if (pu32XCInst == NULL)
10531     {
10532         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10533         return FALSE;
10534     }
10535 
10536     stXC_CHECK_3D_MAINSUB_IPSYNC XCArgs;
10537     XCArgs.bReturnValue = FALSE;
10538 
10539     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_MAINSUB_IPSYNC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10540     {
10541         printf("Obtain XC engine fail\n");
10542         return FALSE;
10543     }
10544     else
10545     {
10546         return XCArgs.bReturnValue;
10547     }
10548 }
10549 
10550 //-------------------------------------------------------------------------------------------------
10551 /// When we do output: line_alter, we can decide the odd line coming from which part of the input
10552 /// (left or right, up or down, first frame or second frame, etc)
10553 /// @param  bMainFirst                \b IN: True: Main first; False: Sub first
10554 /// @return MS_BOOL                   \b OUT: TRUE:Success FALSE:Fail
10555 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_MainWin_FirstMode_U2(void * pInstance,MS_BOOL bMainFirst)10556 MS_BOOL MApi_XC_Set_3D_MainWin_FirstMode_U2(void* pInstance, MS_BOOL bMainFirst)
10557 {
10558 #ifndef DISABLE_3D_FUNCTION
10559     //True: Main first; False: Sub first
10560     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10561     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10562     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10563 
10564     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10565     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10566     pXCResourcePrivate->stdrvXC_3D._b3DMainFirst = bMainFirst;
10567     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10568     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main-sub win sequence! (%u)\n", bMainFirst);
10569     return TRUE;
10570 #else
10571     UNUSED(bMainFirst);
10572     return FALSE;
10573 #endif
10574 }
10575 
MApi_XC_Set_3D_MainWin_FirstMode(MS_BOOL bMainFirst)10576 MS_BOOL MApi_XC_Set_3D_MainWin_FirstMode(MS_BOOL bMainFirst)
10577 {
10578     if (pu32XCInst == NULL)
10579     {
10580         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10581         return FALSE;
10582     }
10583 
10584     stXC_SET_3D_MAINWIN_FIRST XCArgs;
10585     XCArgs.bMainFirst = bMainFirst;
10586     XCArgs.bReturnValue = FALSE;
10587 
10588     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_MAINWIN_FIRST, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10589     {
10590         printf("Obtain XC engine fail\n");
10591         return FALSE;
10592     }
10593     else
10594     {
10595         return XCArgs.bReturnValue;
10596     }
10597 }
10598 //-------------------------------------------------------------------------------------------------
10599 /// the API return the relation that odd line is coming from which part of the input content.
10600 /// @param  bMainFirst                \b IN: True: Main first; False: Sub first
10601 /// @return MS_BOOL                   \b OUT: TRUE:Success FALSE:Fail
10602 //-------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_MainWin_First_U2(void * pInstance)10603 MS_BOOL MApi_XC_Get_3D_MainWin_First_U2(void* pInstance)
10604 {
10605 #ifndef DISABLE_3D_FUNCTION
10606     MS_BOOL bReturn = FALSE;
10607     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10608     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10609     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10610 
10611     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10612     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10613     bReturn = pXCResourcePrivate->stdrvXC_3D._b3DMainFirst;
10614     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10615     return bReturn;
10616 #else
10617     return FALSE;
10618 #endif
10619 }
10620 
MApi_XC_Get_3D_MainWin_First(void)10621 MS_BOOL MApi_XC_Get_3D_MainWin_First(void)
10622 {
10623     if (pu32XCInst == NULL)
10624     {
10625         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10626         return FALSE;
10627     }
10628 
10629     stXC_GET_3D_MAINWIN_FIRST XCArgs;
10630     XCArgs.bReturnValue = FALSE;
10631 
10632     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_MAINWIN_FIRST, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10633     {
10634         printf("Obtain XC engine fail\n");
10635         return FALSE;
10636     }
10637     else
10638     {
10639         return XCArgs.bReturnValue;
10640     }
10641 }
10642 
10643 //-------------------------------------------------------------------------------------------------
10644 /// Some mm file maybe have unofficial format,
10645 /// eg.
10646 /// --------------------------
10647 /// |     black_L            |
10648 /// --------------------------
10649 /// |                        |
10650 /// |          L             |
10651 /// |                        |
10652 /// --------------------------
10653 /// |                        |
10654 /// |          R             |
10655 /// |                        |
10656 /// --------------------------
10657 /// |      black+R           |
10658 /// --------------------------
10659 /// this format cannot direct convert to 3D output. Because black_L will cover with R
10660 /// so we define the black area height, then handle it in 3D process.
10661 /// But the height must be told by AP layer
10662 /// @param  bMainFirst                \b IN: True: Main first; False: Sub first
10663 /// @return MS_BOOL                   \b OUT: TRUE:Success FALSE:Fail
10664 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_VerVideoOffset_U2(void * pInstance,MS_U16 u163DVerVideoOffset)10665 MS_BOOL MApi_XC_Set_3D_VerVideoOffset_U2(void* pInstance, MS_U16 u163DVerVideoOffset)
10666 {
10667     printf("MApi_XC_Set_3D_VerVideoOffset:this function is obsolete\n");
10668     return TRUE;
10669 }
10670 
MApi_XC_Set_3D_VerVideoOffset(MS_U16 u163DVerVideoOffset)10671 MS_BOOL MApi_XC_Set_3D_VerVideoOffset(MS_U16 u163DVerVideoOffset)
10672 {
10673     if (pu32XCInst == NULL)
10674     {
10675         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10676         return FALSE;
10677     }
10678 
10679     stXC_SET_3D_VERTICALVIDEO_OFFSET XCArgs;
10680     XCArgs.u163DVerVideoOffset = u163DVerVideoOffset;
10681     XCArgs.bReturnValue = FALSE;
10682 
10683     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_VERTICALVIDEO_OFFSET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10684     {
10685         printf("Obtain XC engine fail\n");
10686         return FALSE;
10687     }
10688     else
10689     {
10690         return XCArgs.bReturnValue;
10691     }
10692 }
10693 
10694 //-------------------------------------------------------------------------------------------------
10695 /// This API return Top Bottom's black area height
10696 //-------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_VerVideoOffset_U2(void * pInstance)10697 MS_U16 MApi_XC_Get_3D_VerVideoOffset_U2(void* pInstance)
10698 {
10699     printf("MApi_XC_Get_3D_VerVideoOffset:this function is obsolete\n");
10700     return 0;
10701 }
10702 
MApi_XC_Get_3D_VerVideoOffset(void)10703 MS_U16 MApi_XC_Get_3D_VerVideoOffset(void)
10704 {
10705     if (pu32XCInst == NULL)
10706     {
10707         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10708         return FALSE;
10709     }
10710 
10711     stXC_GET_3D_VERTICALVIDEO_OFFSET XCArgs;
10712     XCArgs.u16ReturnValue = FALSE;
10713 
10714     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_VERTICALVIDEO_OFFSET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10715     {
10716         printf("Obtain XC engine fail\n");
10717         return FALSE;
10718     }
10719     else
10720     {
10721         return XCArgs.u16ReturnValue;
10722     }
10723 }
10724 
10725 #ifndef DISABLE_3D_FUNCTION
10726 
MDrv_XC_Set_3D_LR_Frame_Exchg_burst(void * pInstance,SCALER_WIN eWindow)10727 MS_BOOL MDrv_XC_Set_3D_LR_Frame_Exchg_burst(void *pInstance, SCALER_WIN eWindow)
10728 {
10729     MS_BOOL bRet = FALSE;
10730     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10731     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10732     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10733     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10734     MS_ASSERT(eWindow < MAX_WINDOW);
10735 
10736     if(eWindow >= MAX_WINDOW)
10737     {
10738         return FALSE;
10739     }
10740 
10741 #if (HW_DESIGN_3D_VER < 2)
10742 
10743     if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10744 #if (HW_DESIGN_3D_VER == 0)
10745         || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
10746 #endif
10747         )
10748     {
10749         MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10750         //exchange the ipm base0 and ipm base1
10751 
10752         _MLOAD_ENTRY(pInstance);
10753         u32Temp1 = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW);
10754         u32Temp2 = Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW);
10755         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_08_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10756         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_09_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10757         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0A_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10758         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0B_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10759         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10760         _MLOAD_RETURN(pInstance);
10761         bRet = TRUE;
10762         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange dnr base\n");
10763     }
10764     else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
10765                   || IS_INPUT_LINE_ALTERNATIVE(eWindow))
10766                && IS_OUTPUT_LINE_ALTERNATIVE())
10767              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10768              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10769              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10770              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
10771              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
10772              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10773              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10774              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10775              || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10776              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10777              || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10778              || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10779              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10780              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10781             )
10782     {
10783         MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10784         //exchange the dnr base0 of main & sub
10785 
10786         _MLOAD_ENTRY(pInstance);
10787         u32Temp1 = Hal_SC_Get_OPMBase0(MAIN_WINDOW);
10788         u32Temp2 = Hal_SC_Get_OPMBase1(MAIN_WINDOW);
10789         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_10_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10790         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_11_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10791         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_12_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10792         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_13_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10793         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10794         _MLOAD_RETURN(pInstance);
10795         bRet = TRUE;
10796         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange opm base\n");
10797     }
10798     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10799              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10800              || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10801              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
10802     {
10803         MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
10804         u16Temp = u16Temp^BIT(15);
10805 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
10806 
10807 #else
10808         MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
10809 #endif
10810         bRet = TRUE;
10811         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange 3d ver1's L/R flag\n");
10812     }
10813     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
10814     {
10815         MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10816         //exchange the dnr base0 of main & sub
10817 
10818         _MLOAD_ENTRY(pInstance);
10819         u32Temp1 = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW);
10820         u32Temp2 = Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW);
10821         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_08_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10822         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_09_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10823         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_48_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10824         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_49_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10825         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10826         _MLOAD_RETURN(pInstance);
10827         bRet = TRUE;
10828         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub dnr base0\n");
10829     }
10830     else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
10831             || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
10832     {
10833         MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10834         MS_U16 u16Temp = 0;
10835         //exchange the opm base0/base1 of main & sub
10836 
10837         _MLOAD_ENTRY(pInstance);
10838         u32Temp1 = Hal_SC_Get_OPMBase0(MAIN_WINDOW);
10839         u32Temp2 = Hal_SC_Get_OPMBase0(SUB_WINDOW);
10840         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_10_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10841         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_11_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10842         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_50_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10843         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_51_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10844 
10845         u32Temp1 = Hal_SC_Get_OPMBase1(MAIN_WINDOW);
10846         u32Temp2 = Hal_SC_Get_OPMBase1(SUB_WINDOW);
10847         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_12_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10848         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_13_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10849         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_52_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10850         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_53_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10851 
10852         u32Temp1 = Hal_SC_Get_OPMBase2(MAIN_WINDOW);
10853         u32Temp2 = Hal_SC_Get_OPMBase2(SUB_WINDOW);
10854         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_14_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10855         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_15_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10856         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_54_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10857         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_55_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10858 
10859         u16Temp = Hal_SC_get_opm_fetch(MAIN_WINDOW);
10860         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_17_L, Hal_SC_get_opm_fetch(SUB_WINDOW), 0x1FFF);
10861         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_57_L, u16Temp, 0x1FFF);
10862 
10863         u16Temp = (Hal_SC_Get_LBOffset(MAIN_WINDOW)<<8)|(Hal_SC_Get_LBOffset(SUB_WINDOW));
10864         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1D_L, u16Temp , 0xFFFF);
10865 
10866         if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
10867         {
10868             MS_U16 u16MainRWBank, u16SubRWBank;
10869             u16MainRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L);
10870             u16SubRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L);
10871 
10872             u16MainRWBank = u16MainRWBank^BIT(14);
10873             u16SubRWBank = u16SubRWBank^BIT(14);
10874             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_07_L, u16MainRWBank, BIT(14));
10875             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_47_L, u16SubRWBank, BIT(14));
10876         }
10877 
10878         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10879         _MLOAD_RETURN(pInstance);
10880         bRet = TRUE;
10881     }
10882 #elif (HW_DESIGN_3D_VER >= 2)
10883     if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
10884         IS_OUTPUT_LINE_ALTERNATIVE())
10885     {
10886         if(pXCResourcePrivate->stdrvXC_3D._u163DHShift & 0xFF)
10887         {
10888             pXCResourcePrivate->stdrvXC_3D._u163DHShift <<= 8; //Switch shift to sub window
10889         }
10890         else
10891         {
10892             pXCResourcePrivate->stdrvXC_3D._u163DHShift >>= 8; //Switch shift to Main window
10893         }
10894         _MLOAD_ENTRY(pInstance);
10895         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift, 0xFFFF);//Main/sub display window offset in right direction
10896         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10897         _MLOAD_RETURN(pInstance);
10898         bRet = TRUE;
10899     }
10900     else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
10901             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
10902             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
10903 #if(HW_DESIGN_3D_VER >= 4)
10904             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
10905             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
10906             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING))
10907 #endif
10908             )
10909     {
10910 #if(HW_DESIGN_3D_VER >= 5)
10911         MS_U16 u16FRCM_W,u16FRCM_R;
10912         u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
10913         u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
10914         if(u16FRCM_R & BIT(7))
10915         {
10916             //Recommend to use OP L/R switch as designer's advice
10917             u16FRCM_R = u16FRCM_R^BIT(8);
10918             _MLOAD_ENTRY(pInstance);
10919             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_33_L, u16FRCM_R, BIT(8));//F2 OPM 3D LR invert
10920             MDrv_XC_MLoad_Fire(pInstance, TRUE);
10921             _MLOAD_RETURN(pInstance);
10922             bRet = TRUE;
10923         }
10924         else if(u16FRCM_W & BIT(0))
10925         {
10926             u16FRCM_W = u16FRCM_W^BIT(4);
10927             _MLOAD_ENTRY(pInstance);
10928             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_30_L, u16FRCM_R, BIT(4));//F2 IPM 3D LR invert
10929             MDrv_XC_MLoad_Fire(pInstance, TRUE);
10930             _MLOAD_RETURN(pInstance);
10931             bRet = TRUE;
10932         }
10933         else
10934         {
10935             printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow], pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
10936         }
10937 #else
10938         MS_U16 u16IPM, u16OPM;
10939         u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
10940         u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
10941         if(u16OPM & BIT(7))
10942         {
10943             //Recommend to use OP L/R switch as designer's advice
10944             u16OPM = u16OPM^BIT(8);
10945             _MLOAD_ENTRY(pInstance);
10946 
10947             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_33_L, u16OPM, BIT(8));//F2 OPM 3D LR invert
10948 
10949             MDrv_XC_MLoad_Fire(pInstance, TRUE);
10950             _MLOAD_RETURN(pInstance);
10951             bRet = TRUE;
10952         }
10953         else if(u16IPM & BIT(0))
10954         {
10955             u16IPM = u16IPM^BIT(4);
10956             _MLOAD_ENTRY(pInstance);
10957             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_30_L, u16IPM, BIT(4));//F2 IPM 3D LR invert
10958             MDrv_XC_MLoad_Fire(pInstance, TRUE);
10959             _MLOAD_RETURN(pInstance);
10960             bRet = TRUE;
10961         }
10962         else
10963         {
10964             printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow], pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
10965         }
10966 #endif
10967     }
10968 #endif
10969 
10970 #if HW_2DTO3D_SUPPORT
10971     if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
10972 #if (HW_2DTO3D_VER >= 4)
10973        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
10974        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
10975        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
10976        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
10977 #endif
10978        )
10979     {
10980 #if (HW_2DTO3D_VER >= 3)
10981         MS_U16 u16LeftGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L);
10982         MS_U16 u16RightGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L);
10983         u16LeftGain = u16LeftGain^BIT(15);
10984         u16RightGain = u16RightGain^BIT(15);
10985         _MLOAD_ENTRY(pInstance);
10986         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_06_L, u16LeftGain, BIT(15));
10987         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_0E_L, u16RightGain, BIT(15));
10988         MDrv_XC_MLoad_Fire(pInstance, TRUE);
10989         _MLOAD_RETURN(pInstance);
10990         bRet = TRUE;
10991 #else
10992         MS_U16 u16OutputFormat = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007);
10993         if(0x0001 == u16OutputFormat)
10994         {
10995             _MLOAD_ENTRY(pInstance);
10996             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK15_67_L, 0x0004, 0x0007);
10997             MDrv_XC_MLoad_Fire(pInstance, TRUE);
10998             _MLOAD_RETURN(pInstance);
10999             bRet = TRUE;
11000         }
11001         else if(0x0004 == u16OutputFormat)
11002         {
11003             _MLOAD_ENTRY(pInstance);
11004             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK15_67_L, 0x0001, 0x0007);
11005             MDrv_XC_MLoad_Fire(pInstance, TRUE);
11006             _MLOAD_RETURN(pInstance);
11007             bRet = TRUE;
11008         }
11009         else
11010         {
11011             printf("----------------3D L/R switch: UnSupported hw 2d to 3d output format\n");
11012         }
11013 #endif
11014     }
11015     else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11016     {
11017     #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11018 
11019     #else
11020         MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11021         u16Temp = u16Temp^BIT(15);
11022         MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11023     #endif
11024         bRet = TRUE;
11025     }
11026 #endif
11027     return bRet;
11028 }
11029 
MDrv_XC_Set_3D_LR_Frame_Exchg(void * pInstance,SCALER_WIN eWindow)11030 MS_BOOL MDrv_XC_Set_3D_LR_Frame_Exchg(void *pInstance, SCALER_WIN eWindow)
11031 {
11032     MS_BOOL bRet = FALSE;
11033     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11034     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11035     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11036     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11037     MS_ASSERT(eWindow < MAX_WINDOW);
11038 
11039     if(eWindow >= MAX_WINDOW)
11040     {
11041         return FALSE;
11042     }
11043 
11044 #if (HW_DESIGN_3D_VER < 2)
11045 
11046     if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11047 #if (HW_DESIGN_3D_VER == 0)
11048         || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
11049 #endif
11050         )
11051     {
11052         MS_PHY u32Temp = 0;
11053         //exchange the ipm base0 and ipm base1
11054         u32Temp = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11055         Hal_SC_set_DNRBase0(pInstance, Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11056         Hal_SC_set_DNRBase1(pInstance, u32Temp, MAIN_WINDOW);
11057         bRet = TRUE;
11058         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange dnr base\n");
11059     }
11060     else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
11061                   || IS_INPUT_LINE_ALTERNATIVE(eWindow))
11062                && IS_OUTPUT_LINE_ALTERNATIVE())
11063              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11064              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11065              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11066              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
11067              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
11068              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11069              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11070              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11071              || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11072              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11073              || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11074              || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11075              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11076              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11077             )
11078     {
11079         MS_PHY u32Temp = 0;
11080         u32Temp = Hal_SC_Get_OPMBase0(MAIN_WINDOW) * BYTE_PER_WORD;
11081         Hal_SC_set_OPMBase0(pInstance, Hal_SC_Get_OPMBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11082         Hal_SC_set_OPMBase1(pInstance, u32Temp, MAIN_WINDOW);
11083         bRet = TRUE;
11084         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange opm base\n");
11085     }
11086     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11087              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11088              || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11089              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
11090     {
11091     #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11092 
11093     #else
11094         MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11095         u16Temp = u16Temp^BIT(15);
11096         MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11097     #endif
11098         bRet = TRUE;
11099         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange 3d ver1's L/R flag\n");
11100     }
11101     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
11102     {
11103         MS_U32 u32Temp = 0;
11104         //exchange the dnr base0 of main & sub
11105         u32Temp = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11106         Hal_SC_set_DNRBase0(pInstance, Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11107         Hal_SC_set_DNRBase0(pInstance, u32Temp, SUB_WINDOW);
11108         bRet = TRUE;
11109         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub dnr base0\n");
11110 
11111     }
11112     else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
11113             || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11114     {
11115         MS_PHY u32Temp = 0;
11116         //exchange the opm base0/base1 of main & sub
11117         u32Temp = Hal_SC_Get_OPMBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11118         Hal_SC_set_OPMBase0(pInstance, Hal_SC_Get_OPMBase0(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11119         Hal_SC_set_OPMBase0(pInstance, u32Temp, SUB_WINDOW);
11120 
11121         u32Temp = Hal_SC_Get_OPMBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11122         Hal_SC_set_OPMBase1(pInstance, Hal_SC_Get_OPMBase1(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11123         Hal_SC_set_OPMBase1(pInstance, u32Temp, SUB_WINDOW);
11124 
11125         u32Temp = Hal_SC_Get_OPMBase2(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11126         Hal_SC_set_OPMBase2(pInstance, Hal_SC_Get_OPMBase2(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11127         Hal_SC_set_OPMBase2(pInstance, u32Temp, SUB_WINDOW);
11128 
11129         u32Temp = Hal_SC_get_opm_fetch(pInstance, MAIN_WINDOW);
11130         Hal_SC_set_opm_fetch(pInstance, MAIN_WINDOW, Hal_SC_get_opm_fetch(pInstance, SUB_WINDOW));
11131         Hal_SC_set_opm_fetch(pInstance, SUB_WINDOW, u32Temp);
11132 
11133         u32Temp = Hal_SC_Get_LBOffset(pInstance, MAIN_WINDOW);
11134         Hal_SC_Set_LBOffset(pInstance, Hal_SC_Get_LBOffset(pInstance, SUB_WINDOW), MAIN_WINDOW);
11135         Hal_SC_Set_LBOffset(pInstance, u32Temp, SUB_WINDOW);
11136 
11137         if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
11138         {
11139             MS_U16 u16MainRWBank, u16SubRWBank;
11140             u16MainRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L);
11141             u16SubRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L);
11142 
11143             u16MainRWBank = u16MainRWBank^BIT(14);
11144             u16SubRWBank = u16SubRWBank^BIT(14);
11145             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, u16MainRWBank, BIT(14));
11146             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, u16SubRWBank, BIT(14));
11147         }
11148 
11149         bRet = TRUE;
11150         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub opm base\n");
11151     }
11152 #elif (HW_DESIGN_3D_VER >= 2)
11153     if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
11154         (!IS_OUTPUT_FRAME_ALTERNATIVE()))
11155     {
11156         if(pXCResourcePrivate->stdrvXC_3D._u163DHShift & 0xFF)
11157         {
11158             pXCResourcePrivate->stdrvXC_3D._u163DHShift <<= 8; //Switch shift to sub window
11159         }
11160         else
11161         {
11162             pXCResourcePrivate->stdrvXC_3D._u163DHShift >>= 8; //Switch shift to Main window
11163         }
11164         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift);//Main/sub display window offset in right direction
11165         bRet = TRUE;
11166     }
11167     else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
11168             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
11169             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
11170 #if(HW_DESIGN_3D_VER >= 4)
11171             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
11172             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
11173             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING()))
11174 #endif
11175             )
11176     {
11177 #if(HW_DESIGN_3D_VER >= 5)
11178         MS_U16 u16FRCM_W,u16FRCM_R;
11179         u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
11180         u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
11181         if(u16FRCM_R & BIT(7))
11182         {
11183             //Recommend to use OP L/R switch as designer's advice
11184             u16FRCM_R = u16FRCM_R^BIT(8);
11185             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, u16FRCM_R, BIT(8));//F2 OPM 3D LR invert
11186             bRet = TRUE;
11187         }
11188         else if(u16FRCM_W & BIT(0))
11189         {
11190             u16FRCM_W = u16FRCM_W^BIT(4);
11191             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, u16FRCM_R, BIT(4));//F2 IPM 3D LR invert
11192             bRet = TRUE;
11193         }
11194         else
11195         {
11196             printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n"
11197                    , pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]
11198                    , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
11199         }
11200 #else
11201         MS_U16 u16IPM, u16OPM;
11202         u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
11203         u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
11204         if(u16OPM & BIT(7))
11205         {
11206             //Recommend to use OP L/R switch as designer's advice
11207             u16OPM = u16OPM^BIT(8);
11208             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, u16OPM, BIT(8));//F2 OPM 3D LR invert
11209             bRet = TRUE;
11210         }
11211         else if(u16IPM & BIT(0))
11212         {
11213             u16IPM = u16IPM^BIT(4);
11214             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, u16IPM, BIT(4));//F2 IPM 3D LR invert
11215             bRet = TRUE;
11216         }
11217         else
11218         {
11219             printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n"
11220                    , pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]
11221                    , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
11222         }
11223 #endif
11224     }
11225 #endif
11226 
11227 #if HW_2DTO3D_SUPPORT
11228     if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
11229 #if (HW_2DTO3D_VER >= 4)
11230        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11231        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
11232        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11233        ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
11234 #endif
11235         )
11236     {
11237 #if (HW_2DTO3D_VER >= 3)
11238         MS_U16 u16LeftGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L);
11239         MS_U16 u16RightGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L);
11240         u16LeftGain = u16LeftGain^BIT(15);
11241         u16RightGain = u16RightGain^BIT(15);
11242         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, u16LeftGain, BIT(15));
11243         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, u16RightGain, BIT(15));
11244         bRet = TRUE;
11245 #else
11246         MS_U16 u16OutputFormat = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007);
11247         if(0x0001 == u16OutputFormat)
11248         {
11249             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0004, 0x0007);
11250             bRet = TRUE;
11251         }
11252         else if(0x0004 == u16OutputFormat)
11253         {
11254             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);
11255             bRet = TRUE;
11256         }
11257         else
11258         {
11259             printf("----------------3D L/R switch: UnSupported hw 2d to 3d output format\n");
11260         }
11261 #endif
11262     }
11263     else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11264     {
11265     #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11266 
11267     #else
11268         MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11269         u16Temp = u16Temp^BIT(15);
11270         MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11271     #endif
11272         bRet = TRUE;
11273     }
11274 #endif
11275 
11276     return bRet;
11277 }
11278 
MDrv_XC_3D_Is_LR_Frame_Exchged(void * pInstance,SCALER_WIN eWindow)11279 MS_BOOL MDrv_XC_3D_Is_LR_Frame_Exchged(void *pInstance, SCALER_WIN eWindow)
11280 {
11281     MS_BOOL bRet = FALSE;
11282 
11283     MS_ASSERT(eWindow < MAX_WINDOW);
11284     if(eWindow >= MAX_WINDOW)
11285     {
11286         return FALSE;
11287     }
11288     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11289     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11290     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11291     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11292 #if (HW_DESIGN_3D_VER < 2)
11293     if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11294 #if (HW_DESIGN_3D_VER == 0)
11295         || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
11296 #endif
11297         )
11298     {
11299         bRet = (Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) > Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW));
11300         bRet ^= IsVMirrorMode(eWindow);
11301     }
11302     else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
11303                   || IS_INPUT_LINE_ALTERNATIVE(eWindow))
11304                && IS_OUTPUT_LINE_ALTERNATIVE())
11305              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11306              || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11307              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11308              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
11309              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
11310              || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11311              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11312              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11313              || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11314              || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11315              || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11316              || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11317              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11318              || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11319             )
11320     {
11321         bRet = (Hal_SC_Get_OPMBase0(MAIN_WINDOW) > Hal_SC_Get_OPMBase1(MAIN_WINDOW));
11322         bRet ^= IsVMirrorMode(eWindow);
11323     }
11324     else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11325              || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11326              || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11327              || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
11328     {
11329 #if ENABLE_REGISTER_SPREAD
11330         bRet = (PWM_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11331 #else
11332         bRet = (MOD_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11333 #endif
11334         bRet ^= IsVMirrorMode(eWindow);
11335     }
11336     else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
11337     {
11338         bRet = (Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) > Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW));
11339         bRet ^= IsVMirrorMode(eWindow);
11340     }
11341     else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
11342             || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11343     {
11344         bRet = (Hal_SC_Get_OPMBase0(MAIN_WINDOW) > Hal_SC_Get_OPMBase0(SUB_WINDOW));
11345         bRet ^= IsVMirrorMode(eWindow);
11346     }
11347 #elif (HW_DESIGN_3D_VER >= 2)
11348     if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
11349         (!IS_OUTPUT_FRAME_ALTERNATIVE()))
11350     {
11351         bRet = ((SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, 0xFF00) >> 8) > 0);
11352     }
11353     else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
11354             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
11355             && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
11356             )
11357     {
11358 #if(HW_DESIGN_3D_VER >= 5)
11359         MS_U16 u16FRCM_W,u16FRCM_R;
11360         u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
11361         u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
11362         if(u16FRCM_R & BIT(7))
11363         {
11364             bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, BIT(8)) == BIT(8));
11365         }
11366         else if(u16FRCM_W & BIT(0))
11367         {
11368             bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, BIT(4)) == BIT(4));
11369         }
11370 #else
11371         MS_U16 u16IPM, u16OPM;
11372         u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
11373         u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
11374         if(u16OPM & BIT(7))
11375         {
11376             bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8)) == BIT(8));
11377         }
11378         else if(u16IPM & BIT(0))
11379         {
11380             bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(4)) == BIT(4));
11381         }
11382 #endif
11383         // if mvop mirror, main/sub window will get switched frame, so need do LR exchange
11384         // 1 field alternative and frame alternative input don't need do this, since main/sub
11385         //   window still get the original frame;
11386         // 2 side by side/top bottom outpu also don't need do this, because main/sub window
11387         //   will assign the specified display window
11388         if(IS_OUTPUT_LINE_ALTERNATIVE()
11389            && (!IS_INPUT_FIELD_ALTERNATIVE(eWindow))
11390            && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
11391         {
11392             bRet ^= (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)));
11393         }
11394     }
11395 #endif
11396 
11397 #if HW_2DTO3D_SUPPORT
11398     if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
11399 #if(HW_2DTO3D_VER >= 4)
11400      || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
11401 #endif
11402         )
11403     {
11404 #if (HW_2DTO3D_VER >= 3)
11405         bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15)) == BIT(15));
11406         bRet ^= (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))));
11407 #else
11408         bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007) == 0x0001);
11409         bRet ^= (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))));
11410 #endif
11411     }
11412     else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11413     {
11414 #if ENABLE_REGISTER_SPREAD
11415         bRet = (PWM_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11416 #else
11417         bRet = (MOD_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11418 #endif
11419     }
11420 #endif
11421 
11422     return bRet;
11423 }
11424 
11425 //-------------------------------------------------------------------------------------------------
11426 /// Is Support HW Depth Adjustment For Real 3d Or Not
11427 /// @param  e3dInputMode                 \b IN: input  3d format
11428 /// @param  e3dOutputMode                \b IN: output 3d format
11429 /// @param  eWindow                      \b IN: which window
11430 /// @return MS_BOOL                      \b OUT: TRUE: support FALSE: not support
11431 //-------------------------------------------------------------------------------------------------
MDrv_XC_3D_IsHWDepthAdjSupported(void * pInstance,E_XC_3D_INPUT_MODE en3dInputMode,E_XC_3D_OUTPUT_MODE en3dOutputMode,SCALER_WIN enWindow)11432 MS_BOOL MDrv_XC_3D_IsHWDepthAdjSupported(void *pInstance, E_XC_3D_INPUT_MODE en3dInputMode,
11433                                          E_XC_3D_OUTPUT_MODE en3dOutputMode,
11434                                          SCALER_WIN enWindow)
11435 {
11436     MS_ASSERT(enWindow < MAX_WINDOW);
11437 
11438     if(enWindow >= MAX_WINDOW)
11439     {
11440         return FALSE;
11441     }
11442 
11443 #if 0 //may support when top bottom/side by side output later
11444     return (MDrv_XC_Get_3D_IsSupportedHW2DTo3D()
11445             && (E_XC_3D_INPUT_MODE_NONE != en3dInputMode)
11446             && (E_XC_3D_INPUT_NORMAL_2D != en3dInputMode)
11447             && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == en3dOutputMode)
11448                 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == en3dOutputMode)
11449                 || (E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode)
11450                 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == en3dOutputMode)));
11451 #else
11452     return (MDrv_XC_Get_3D_IsSupportedHW2DTo3D()
11453             && (E_XC_3D_INPUT_MODE_NONE != en3dInputMode)
11454             && (E_XC_3D_INPUT_NORMAL_2D != en3dInputMode)
11455             && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == en3dOutputMode)
11456 #if(HW_2DTO3D_VER >= 4)
11457                 || (E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode)
11458                 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == en3dOutputMode)
11459                 || (E_XC_3D_OUTPUT_FRAME_PACKING== en3dOutputMode)
11460 #endif
11461                 || ((E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode) && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))//3d ver1 line alternative output
11462                 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == en3dOutputMode)));
11463 #endif
11464 }
11465 
11466 #if HW_2DTO3D_SUPPORT
11467 #if (HW_2DTO3D_VER >= 4)
_MDrv_SC_3D_HWDepthAdj_TBOut(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)11468 static void _MDrv_SC_3D_HWDepthAdj_TBOut(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
11469 {
11470 
11471     MS_ASSERT(eWindow < MAX_WINDOW);
11472     MS_ASSERT(pSrcInfo);
11473     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11474     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11475     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11476     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11477 
11478     if(pSrcInfo == NULL)
11479     {
11480         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
11481         return;
11482     }
11483 
11484     if(eWindow >= MAX_WINDOW)
11485     {
11486         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
11487         return;
11488     }
11489 
11490     //Load T3d setting (same as 2d3d, in regardless of DD, and RGBLUT SRAM)
11491     //Get panel size output width
11492     MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
11493     MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
11494     if(u32OutputWidth==0)
11495     {
11496         u32OutputWidth = 0xf00;
11497     }
11498     if(PanelHeight==0)
11499     {
11500         PanelHeight = 0x870;
11501     }
11502 
11503     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, BIT(10),  BIT(10)); //disable YUV to RGB
11504     MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
11505 
11506     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
11507     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, BIT(8), BIT(8));//eco en
11508     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, BIT(1), BIT(1));//dr miu eco en
11509     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_42_L, BIT(7), BIT(7));//reg_clrmiurdy_n
11510     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_48_L, BIT(2), BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6));//reg_blk_dpthptr_en,reg_blk_dpthptr_sel
11511 
11512     if(u32OutputWidth==0xf00)
11513     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x0808); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11514     else
11515     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x0404); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11516 
11517     //fill sram
11518     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0xFFFF);//reg_fill_in
11519     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, BIT(7), BIT(7));//reg_fill_w
11520 
11521     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0000, 0x0F00);//reg_fill_add 0
11522     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11523 
11524     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0100, 0x0F00);//reg_fill_add 1
11525     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11526 
11527     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0200, 0x0F00);//reg_fill_add 2
11528     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11529 
11530     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0300, 0x0F00);//reg_fill_add 3
11531     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11532 
11533     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0400, 0x0F00);//reg_fill_add 4
11534     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11535 
11536     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0500, 0x0F00);//reg_fill_add 5
11537     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11538 
11539     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0600, 0x0F00);//reg_fill_add 6
11540     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11541 
11542     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0700, 0x0F00);//reg_fill_add 7
11543     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11544 
11545     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0800, 0x0F00);//reg_fill_add 8
11546     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11547 
11548     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0900, 0x0F00);//reg_fill_add 9
11549     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11550 
11551     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0A00, 0x0F00);//reg_fill_add 10
11552     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11553 
11554     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0B00, 0x0F00);//reg_fill_add 11
11555     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11556 
11557     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0C00, 0x0F00);//reg_fill_add 12
11558     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11559 
11560     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0D00, 0x0F00);//reg_fill_add 13
11561     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11562 
11563     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0E00, 0x0F00);//reg_fill_add 14
11564     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11565 
11566     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0F00, 0x0F00);//reg_fill_add 15
11567     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11568 
11569     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//reg_fill_in
11570     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x00, BIT(7));//reg_fill_w
11571 
11572     //dr pixel
11573     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_60_L, 0x07, 0x3FFF);//reg_pipe_guard_cycle_pb
11574     if((pSrcInfo->stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
11575        && (pSrcInfo->stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
11576     {
11577         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
11578     }
11579     if((pSrcInfo->stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
11580         && (pSrcInfo->stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
11581     {
11582         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
11583     }
11584     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, BIT(0)|BIT(2), BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
11585     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, BIT(5), BIT(5));//rgb_to_y
11586     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8080);//reg_pixelsub_l,reg_pixelsub_r
11587     if(u32OutputWidth==0xf00)
11588     {
11589         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11590     }
11591 
11592     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(7), BIT(7));//TB mode
11593 }
11594 
_MDrv_SC_3D_DD_setting(void * pInstance,SCALER_WIN eWindow)11595 static void _MDrv_SC_3D_DD_setting(void *pInstance, SCALER_WIN eWindow)
11596 {
11597     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11598     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11599     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11600     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11601 
11602     MS_U16 u16DDHSize = 0; //DD H size
11603     MS_U16 u16DDVSize = 0; //DD V size
11604     MS_U16 u16PanelWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
11605     MS_U16 u16PanelHeight = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
11606     MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11607     //T3D 2P engine, get two piexl a time,start must be even,end must be odd
11608     MS_U16 u16MainDispWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11609     MS_U16 u16MainDispHeight = gSrcInfo[eWindow].stDispWin.height;
11610     MS_WINDOW_TYPE stDispWin;
11611     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11612     MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11613     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_MODE_NONE)
11614     {
11615         u16MainDispHeight = stDispWin.height;
11616     }
11617 
11618     if(bT3DDE_Use_MainDisplayWindow)
11619     {
11620         u16DDHSize = MIN(u16MainDispWidth>>1, 1920);
11621         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, u16DDHSize, 0x07FF);//src width
11622         if(u16MainDispHeight >= 1080)
11623         {
11624             u16DDVSize =  MIN(u16MainDispHeight>>1, 1080);
11625             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11626             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11627         }
11628         else
11629         {
11630             u16DDVSize = MIN(u16MainDispHeight, 1080);
11631             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0, BIT(4));//DD v-sacling dn mode
11632             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11633         }
11634     }
11635     else
11636     {
11637         u16DDHSize = MIN(u16PanelWidth>>1, 1920);
11638         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, u16DDHSize, 0x07FF);//src width
11639         if(u16PanelHeight >= HEIGHT_4K2KTIMING)
11640         {
11641             u16DDVSize = u16PanelHeight>>1;
11642             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11643             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11644         }
11645         else
11646         {
11647             u16DDVSize = MIN(u16PanelHeight, 1080);
11648             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0, BIT(4));//DD v-sacling dn mode
11649             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11650         }
11651     }
11652 
11653     //save DD size
11654     pXCResourcePrivate->stdrvXC_3D._u16DDHSize = u16DDHSize;
11655     pXCResourcePrivate->stdrvXC_3D._u16DDVSize = u16DDVSize;
11656 }
11657 #endif
11658 
_MDrv_SC_3D_DR_setting(void * pInstance,SCALER_WIN eWindow)11659 static void _MDrv_SC_3D_DR_setting(void *pInstance, SCALER_WIN eWindow)
11660 {
11661     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11662     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11663     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11664     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11665 
11666     //T3D 2P engine, get two piexl a time,start must be even,end must be odd
11667     MS_U16 u16MainDispWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11668     MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
11669     MS_U16 u16PanelWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
11670     MS_U16 u16PanelHeight = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
11671     MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11672     MS_WINDOW_TYPE stDispWin;
11673     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11674     MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11675     if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_MODE_NONE)
11676     {
11677         u16MainDispHeight = stDispWin.height;
11678     }
11679 
11680     if(bT3DDE_Use_MainDisplayWindow)
11681     {
11682         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_58_L, BIT(0), BIT(0));//Use MainDE
11683         if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11684         {
11685             //DR V size needs be 4-align.
11686             u16MainDispHeight = (u16MainDispHeight + 1) & ~0x01;
11687 
11688             //dr bilinear size
11689             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16MainDispWidth / 2, 0x1FFF);//reg_ln_width
11690             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11691             //dr pixel size
11692             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16MainDispWidth / 2, 0x3FFF);//reg_ln_width
11693             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11694             //dr block size
11695             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16MainDispWidth / 2, 0x1FFF);//pixel width
11696             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11697         }
11698         else
11699         {
11700             //DR V size needs be 4-align.
11701             u16MainDispHeight = (u16MainDispHeight + 3) & ~0x03;
11702 
11703             //dr bilinear size
11704             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16MainDispWidth, 0x1FFF);//reg_ln_width
11705             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11706             //dr pixel size
11707             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16MainDispWidth, 0x3FFF);//reg_ln_width
11708             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11709             //dr block size
11710             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16MainDispWidth, 0x1FFF);//pixel width
11711             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11712         }
11713     }
11714     else
11715     {
11716         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_58_L, 0x0, BIT(0));//Full-frame use Full-dispDE
11717         if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11718         {
11719             //DR V size needs be 4-align.
11720             u16PanelHeight = (u16PanelHeight + 1) & ~0x01;
11721 
11722             //dr bilinear size
11723             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16PanelWidth / 2, 0x1FFF);//reg_ln_width
11724             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11725             //dr pixel size
11726             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16PanelWidth / 2, 0x3FFF);//reg_ln_width
11727             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11728             //dr block size
11729             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16PanelWidth / 2, 0x1FFF);//pixel width
11730             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11731         }
11732         else
11733         {
11734             //DR V size needs be 4-align.
11735             u16PanelHeight = (u16PanelHeight + 3) & ~0x03;
11736 
11737             //dr bilinear size
11738             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16PanelWidth, 0x1FFF);//reg_ln_width
11739             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16PanelHeight, 0x1FFF);//reg_col_height
11740             //dr pixel size
11741             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16PanelWidth, 0x3FFF);//reg_ln_width
11742             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16PanelHeight, 0x1FFF);//reg_col_height
11743             //dr block size
11744             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16PanelWidth, 0x1FFF);//pixel width
11745             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16PanelHeight, 0x1FFF);//reg_col_height
11746         }
11747     }
11748 }
11749 
11750 #if (HW_2DTO3D_VER >= 3)
_MDrv_SC_3D_Load2DTo3DReg(void * pInstance,MS_BOOL bEnable,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)11751 static void _MDrv_SC_3D_Load2DTo3DReg(void *pInstance, MS_BOOL bEnable, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
11752 {
11753 
11754     MS_ASSERT(eWindow < MAX_WINDOW);
11755     MS_ASSERT(pSrcInfo);
11756     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11757     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11758     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11759     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11760     MS_U16 u16DRWidth = 0;
11761     MS_U16 u16DRBlockNumber = 0;
11762     MS_U16 u16DRRequestNumber = 0;
11763     MS_U8 u8T3DMIUSel = 0;
11764     MS_WINDOW_TYPE stDispWin;
11765     memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11766     MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11767 
11768     if(pSrcInfo == NULL)
11769     {
11770         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
11771         return;
11772     }
11773 
11774     if(eWindow >= MAX_WINDOW)
11775     {
11776         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
11777         return;
11778     }
11779 
11780     if(bEnable)
11781     {
11782         MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
11783         MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
11784 
11785 #ifdef HAL_MIU2_BASE
11786       if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU2_BASE)
11787         {
11788             u32HW2DTO3D_DD_Buf -= HAL_MIU2_BASE;
11789             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x2000, 0x3000);//DD and DR both use miu2
11790             u8T3DMIUSel = 2;
11791         }
11792         else
11793 #endif
11794         if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
11795         {
11796             u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
11797             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x1000, 0x3000);//DD and DR both use miu1
11798             u8T3DMIUSel = 1;
11799         }
11800         else
11801         {
11802             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0000, 0x3000);//DD and DR both use miu0
11803             u8T3DMIUSel = 0;
11804         }
11805         Hal_SC_Set_T3D_MiuSelectExternal(pInstance, u8T3DMIUSel);
11806 #ifdef HAL_MIU2_BASE
11807         if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU2_BASE)
11808         {
11809             u32HW2DTO3D_DR_Buf -= HAL_MIU2_BASE;
11810         }
11811         else
11812 #endif
11813         if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
11814         {
11815             u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
11816         }
11817 
11818         //=======================================================//
11819         //=====2015.04.24 patch for 2d3d under not full-screen by Ace.Chang //
11820         //==  Issue: Left-side has data from right-side (repeated data)   ==//
11821         //==  Solution:T3d DE use MainDE instead of Frame-DE              ==//
11822         //==  Note: DD & DR input size use corresponding ratio instead    ==//
11823         //=======================================================//
11824         MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11825 
11826         //Get panel size output width
11827         MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
11828         MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
11829         if(u32OutputWidth==0)
11830            u32OutputWidth = 0xf00;
11831         if(PanelHeight==0)
11832             PanelHeight = 0x870;
11833         //clk
11834         MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
11835         //dd
11836         //y/cb/cr mim/max initialize
11837         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_09_L, 0x3f00);
11838         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0A_L, 0x5f00);
11839         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0B_L, 0x7f00);
11840         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0C_L, 0x9f00);
11841         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0D_L, 0xbf00);
11842         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0E_L, 0x5a1e);
11843         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0F_L, 0xff00);
11844         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_11_L, 0x3f00);
11845         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_12_L, 0x5f00);
11846         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_13_L, 0x7f00);
11847         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_14_L, 0x9f00);
11848         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_15_L, 0xbf00);
11849         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_16_L, 0x2800);
11850         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_17_L, 0xc0a0);
11851         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_19_L, 0x3f00);
11852         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1A_L, 0x5f00);
11853         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1B_L, 0x7f00);
11854         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1C_L, 0x9f00);
11855         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1D_L, 0xbf00);
11856         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1E_L, 0xfa78);
11857         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1F_L, 0x6040);
11858         //coef
11859         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_20_L, 0x4d34);
11860         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
11861         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_22_L, 0x5133);
11862         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_23_L, 0x171f);
11863         //mode select
11864         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x00fc, 0x00FF);
11865         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x9f00, 0xDF00);
11866         //filter program
11867         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_25_L, 0x8888);
11868         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_26_L, 0x10ff);
11869         //color quality initialize
11870         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_38_L, 0xffa4);
11871         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_39_L, 0x0210);
11872         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3A_L, 0x1210);
11873         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3B_L, 0x1002);
11874         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3C_L, 0x0108);
11875         #if (HW_2DTO3D_VER == 3)
11876         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, MIN(u32OutputWidth, 1920), 0x07FF);//src width
11877         if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] != E_XC_3D_INPUT_MODE_NONE)
11878         {
11879         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, MIN(pSrcInfo->stDispWin.height, 1080), 0x0FFF);//src height
11880         }
11881         else
11882         {
11883             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, MIN(stDispWin.height, 1080), 0x0FFF);//src height
11884         }
11885         #elif (HW_2DTO3D_VER == 4)
11886         _MDrv_SC_3D_DD_setting(pInstance, eWindow);
11887         #endif
11888         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x7000, 0xF000);//dd shift enable ext
11889 #if(HW_2DTO3D_BYTE_PER_WORD == 16)
11890         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
11891 #else
11892         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x3c3c/*0x7878*/, 0x7F7F);//dram request number
11893 #endif
11894         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 11bit
11895         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
11896         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_44_L, (u32HW2DTO3D_DR_Buf + HW_2DTO3D_BLOCK_DR_BUF_SIZE)/HW_2DTO3D_BYTE_PER_WORD);//dr buffer:block base address
11897         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_46_L, u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD);//dr buffer:pixel base address
11898         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, BIT(10),  BIT(10)); //disable YUV to RGB
11899         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6)|BIT(4),  BIT(6)|BIT(4)); // DD force bank enable,high priorty threshold
11900         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F);     // DD force bank0
11901         //after DD address setted,should wait 2 vsync for pix counter finished
11902         MDrv_XC_wait_output_vsync(pInstance, 2, 100, eWindow);
11903         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
11904 
11905         //DR setting
11906         _MDrv_SC_3D_DR_setting(pInstance, eWindow);
11907         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
11908         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, BIT(8), BIT(8));//eco en
11909         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, BIT(1), BIT(1));//dr miu eco en
11910         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_42_L, BIT(7), BIT(7));//reg_clrmiurdy_n
11911         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_48_L, BIT(2), BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6));//reg_blk_dpthptr_en,reg_blk_dpthptr_sel
11912         //SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x3C3C); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11913         //u16DRRequestNumber = _MDrv_SC_3D_2DTo3D_DRRequestNumber(pInstance);
11914         if(bT3DDE_Use_MainDisplayWindow)
11915         {
11916             u16DRWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11917         }
11918         else
11919         {
11920             u16DRWidth = u32OutputWidth;
11921         }
11922         u16DRBlockNumber = (u16DRWidth + 31)/32;
11923         u16DRRequestNumber = (u16DRBlockNumber + HW_2DTO3D_BYTE_PER_WORD - 1) / HW_2DTO3D_BYTE_PER_WORD;
11924         if(u16DRRequestNumber<4)
11925         {
11926             u16DRRequestNumber = 4; //always set req >=4, has problem when 1/2/3, HW limitation. Ace note
11927         }
11928         u16DRRequestNumber |= (u16DRRequestNumber<<8);
11929         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, u16DRRequestNumber,0xFFFF); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11930         //fill sram
11931         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0xFFFF);//reg_fill_in
11932         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, BIT(7), BIT(7));//reg_fill_w
11933 
11934         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0000, 0x0F00);//reg_fill_add 0
11935         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x5BFE5BFE);//reg_fill_sram_1,reg_fill_sram_2
11936 
11937         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0100, 0x0F00);//reg_fill_add 1
11938         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA884A884);//reg_fill_sram_1,reg_fill_sram_2
11939 
11940         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0200, 0x0F00);//reg_fill_add 2
11941         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x38543854);//reg_fill_sram_1,reg_fill_sram_2
11942 
11943         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0300, 0x0F00);//reg_fill_add 3
11944         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA487A487);//reg_fill_sram_1,reg_fill_sram_2
11945 
11946         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0400, 0x0F00);//reg_fill_add 4
11947         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x32123212);//reg_fill_sram_1,reg_fill_sram_2
11948 
11949         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0500, 0x0F00);//reg_fill_add 5
11950         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x57265726);//reg_fill_sram_1,reg_fill_sram_2
11951 
11952         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0600, 0x0F00);//reg_fill_add 6
11953         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA823A823);//reg_fill_sram_1,reg_fill_sram_2
11954 
11955         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0700, 0x0F00);//reg_fill_add 7
11956         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA878A878);//reg_fill_sram_1,reg_fill_sram_2
11957 
11958         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0800, 0x0F00);//reg_fill_add 8
11959         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA826A826);//reg_fill_sram_1,reg_fill_sram_2
11960 
11961         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0900, 0x0F00);//reg_fill_add 9
11962         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x12841284);//reg_fill_sram_1,reg_fill_sram_2
11963 
11964         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0A00, 0x0F00);//reg_fill_add 10
11965         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x48484848);//reg_fill_sram_1,reg_fill_sram_2
11966 
11967         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0B00, 0x0F00);//reg_fill_add 11
11968         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x79237923);//reg_fill_sram_1,reg_fill_sram_2
11969 
11970         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0C00, 0x0F00);//reg_fill_add 12
11971         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x8A428A42);//reg_fill_sram_1,reg_fill_sram_2
11972 
11973         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0D00, 0x0F00);//reg_fill_add 13
11974         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x38423842);//reg_fill_sram_1,reg_fill_sram_2
11975 
11976         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0E00, 0x0F00);//reg_fill_add 14
11977         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xFF22FF22);//reg_fill_sram_1,reg_fill_sram_2
11978 
11979         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0F00, 0x0F00);//reg_fill_add 15
11980         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xAA88AA88);//reg_fill_sram_1,reg_fill_sram_2
11981 
11982         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//reg_fill_in
11983         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x00, BIT(7));//reg_fill_w
11984 
11985         //dr pixel
11986         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_60_L, 0x07, 0x3FFF);//reg_pipe_guard_cycle_pb
11987         if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] != E_XC_3D_INPUT_MODE_NONE)
11988         {
11989         if((pSrcInfo->stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
11990            && (pSrcInfo->stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
11991         {
11992             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
11993         }
11994         if((pSrcInfo->stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
11995             && (pSrcInfo->stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
11996         {
11997             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
11998         }
11999         }
12000         else
12001         {
12002             if((stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
12003                && (stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
12004             {
12005                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
12006             }
12007             if((stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
12008                 && (stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
12009             {
12010                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
12011             }
12012         }
12013 #if (HW_2DTO3D_VER >= 4)
12014         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x00, BIT(0)|BIT(1));//reg_srclb_en,reg_depthlb_en
12015 #else
12016         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, BIT(0)|BIT(1), BIT(0)|BIT(1));//reg_srclb_en,reg_depthlb_en
12017 #endif
12018         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, BIT(0)|BIT(2), BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
12019         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, BIT(5), BIT(5));//rgb_to_y
12020         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8080);//reg_pixelsub_l,reg_pixelsub_r
12021         #if (HW_2DTO3D_VER == 4)
12022         //Tuning initial value
12023 #if ENABLE_T3D_DEBUG
12024         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5B_L, 0x0010, 0x00ff);
12025         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0x8630, 0xffff);
12026         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0x0710, 0xffff);
12027         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0x1000, 0xffff);
12028         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5F_L, 0x2000, 0xff00);
12029         #endif
12030         #endif
12031         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, BIT(3), BIT(3));
12032         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_62_L, (u32HW2DTO3D_DD_Buf + HW_2DTO3D_DD_BUF_SIZE) * 4 / HW_2DTO3D_BYTE_PER_WORD, 0xFFFF);
12033         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_63_L, ((u32HW2DTO3D_DD_Buf + HW_2DTO3D_DD_BUF_SIZE) * 4 /HW_2DTO3D_BYTE_PER_WORD) >> 16, 0x0FFF);
12034     }
12035     else
12036     {
12037 #if (HW_2DTO3D_VER == 4)
12038         //=======================================================//
12039         //=====2017.01.17 patch for 3d under not full-screen by Ace.Chang //
12040         //==  Issue: Left-side has datadistortion                                     ==//
12041         //==  Solution:T3d DE use MainDE instead of Frame-DE              ==//
12042         //==  Note: DD & DR input size use corresponding ratio instead    ==//
12043         //=======================================================//
12044         _MDrv_SC_3D_DR_setting(pInstance, eWindow);
12045         _MDrv_SC_3D_DD_setting(pInstance, eWindow);
12046 #endif
12047         MS_U32 u32OutputWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
12048 
12049         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
12050         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
12051         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x0FFF);//src height
12052         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u32OutputWidth, 0x1FFF);//pixel width
12053         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12054         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, 0x1FFF);//reg_ln_width
12055         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12056         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, 0x0000, 0x00FF);//horizontal number of 32x32 block
12057         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, 0x0000, BIT(8));//eco en
12058         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, 0x0000, BIT(1));//dr miu eco en
12059         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, 0x0000, BIT(10));//enable YUV to RGB
12060         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x8080); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
12061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, 0x3FFF);//reg_ln_width
12062         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12063         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, 0x0000, BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
12064         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x0000);//reg_pixelsub_l,reg_pixelsub_r
12065         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, 0x0000, BIT(0)|BIT(4)|BIT(5));//dd h/v 2:1 scaling down
12066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x0000, BIT(0));// disable T3D SRAM
12067 #if (HW_2DTO3D_VER >= 4)
12068         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(7));
12069         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x0000, BIT(1));// disable T3D SRAM
12070         //muji, monaco
12071         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_30_L, 0x00, BIT(14));
12072 #endif
12073         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, 0, BIT(3));
12074     }
12075 }
12076 #endif
12077 #endif
12078 
12079 #endif
12080 //-------------------------------------------------------------------------------------------------
12081 /// When we do PIP 3D output, maybe users want to adjust the main and wub window for 3D effect.
12082 /// We call this api to exchange once, and call it again to return to original status.
12083 /// @param  eWindow                \b IN: which window we are going to set
12084 /// @return MS_BOOL                \b OUT: TRUE:Success FALSE:Fail
12085 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_LR_Frame_Exchg_U2(void * pInstance,SCALER_WIN eWindow)12086 MS_BOOL MApi_XC_Set_3D_LR_Frame_Exchg_U2(void* pInstance, SCALER_WIN eWindow)
12087 {
12088     MS_BOOL bRet = FALSE;
12089 #ifndef DISABLE_3D_FUNCTION
12090     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12091     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12092     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12093     _XC_ENTRY(pInstance);
12094     if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
12095     {
12096         bRet = MDrv_XC_Set_3D_LR_Frame_Exchg_burst(pInstance, eWindow);
12097     }
12098     else
12099     {
12100         MDrv_XC_wait_output_vsync(pInstance, 2, 100, eWindow);
12101         bRet = MDrv_XC_Set_3D_LR_Frame_Exchg(pInstance, eWindow);
12102     }
12103     _XC_RETURN(pInstance);
12104     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12105 #else
12106     UNUSED(eWindow);
12107 #endif
12108     return bRet;
12109 }
12110 
MApi_XC_Set_3D_LR_Frame_Exchg(SCALER_WIN eWindow)12111 MS_BOOL MApi_XC_Set_3D_LR_Frame_Exchg(SCALER_WIN eWindow)
12112 {
12113     if (pu32XCInst == NULL)
12114     {
12115         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12116         return FALSE;
12117     }
12118 
12119     stXC_SET_3D_LR_EXCHANGE XCArgs;
12120     XCArgs.eWindow = eWindow;
12121     XCArgs.bReturnValue = FALSE;
12122 
12123     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_LR_EXCHANGE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12124     {
12125         printf("Obtain XC engine fail\n");
12126         return FALSE;
12127     }
12128     else
12129     {
12130         return XCArgs.bReturnValue;
12131     }
12132 }
12133 
12134 //-------------------------------------------------------------------------------------------------
12135 /// Is L/R flag Exchanged or not
12136 /// @param  eWindow                \b IN: which window we are going to set
12137 /// @return MS_BOOL                \b OUT: TRUE:L/R exchanged FALSE:L/R not exchanged
12138 //-------------------------------------------------------------------------------------------------
MApi_XC_3D_Is_LR_Frame_Exchged_U2(void * pInstance,SCALER_WIN eWindow)12139 MS_BOOL MApi_XC_3D_Is_LR_Frame_Exchged_U2(void* pInstance, SCALER_WIN eWindow)
12140 {
12141     MS_BOOL bRet = FALSE;
12142 #ifndef DISABLE_3D_FUNCTION
12143     _XC_ENTRY(pInstance);
12144     bRet = MDrv_XC_3D_Is_LR_Frame_Exchged(pInstance, eWindow);
12145     _XC_RETURN(pInstance);
12146 #else
12147     UNUSED(eWindow);
12148 #endif
12149     return bRet;
12150 }
12151 
MApi_XC_3D_Is_LR_Frame_Exchged(SCALER_WIN eWindow)12152 MS_BOOL MApi_XC_3D_Is_LR_Frame_Exchged(SCALER_WIN eWindow)
12153 {
12154     if (pu32XCInst == NULL)
12155     {
12156         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12157         return FALSE;
12158     }
12159 
12160     stXC_CHECK_3D_LR_EXCHANGED XCArgs;
12161     XCArgs.eWindow = eWindow;
12162     XCArgs.bReturnValue = FALSE;
12163 
12164     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_LR_EXCHANGED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12165     {
12166         printf("Obtain XC engine fail\n");
12167         return FALSE;
12168     }
12169     else
12170     {
12171         return XCArgs.bReturnValue;
12172     }
12173 }
12174 
MDrv_XC_Set_3D_HShift(void * pInstance,MS_U16 u16HShift)12175 MS_BOOL MDrv_XC_Set_3D_HShift(void* pInstance, MS_U16 u16HShift)
12176 {
12177     MS_BOOL bRet = FALSE;
12178 #ifndef DISABLE_3D_FUNCTION
12179     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12180     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12181     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12182 
12183     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12184     if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW]
12185                                         , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode, MAIN_WINDOW))
12186     {
12187         bRet = TRUE;
12188         pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift&0xff;
12189 
12190 #if (HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3))
12191         MS_U16 u16ABSLevel = ((u16HShift > 0x80)?(u16HShift - 0x80):(0x80 - u16HShift));
12192         {
12193             if((u16HShift == 0x80) || (u16HShift == 0x00))
12194             {
12195                 //original 3d depth
12196                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2  // 2nd offset L
12197                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2  // 2nd offset R
12198             }
12199             else if(u16HShift > 0x80)
12200             {
12201                 // |L-->      <--R|
12202                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (0xFF - (u16ABSLevel-1))<<8); //2  // 2nd offset L
12203                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (u16ABSLevel)<<8); //2  // 2nd offset R
12204             }
12205             else
12206             {
12207                 // |L<--      -->R|
12208                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (u16ABSLevel)<<8); //2  // 2nd offset L
12209                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (0xFF - (u16ABSLevel-1))<<8); //2  // 2nd offset R
12210             }
12211         }
12212 #if ENABLE_T3D_DEBUG
12213         //enable black edge
12214         Hal_SC_3D_enable_black_edge(pInstance, FALSE);
12215 #endif
12216 #else
12217         if((u16HShift == 0x80) || (u16HShift == 0x00))
12218         {
12219             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); //2  // 2nd offset enable
12220         }
12221         else if(u16HShift > 0x80)
12222         {
12223             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2  // 2nd offset enable
12224             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, 0x0000); //2  // 2nd offset L
12225             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, (u16HShift-0x80)<<8); //2  // 2nd offset R
12226         }
12227         else
12228         {
12229             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2  // 2nd offset enable
12230             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, (0x80-u16HShift)<<8); //2  // 2nd offset L
12231             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, 0x0000); //2  // 2nd offset R
12232         }
12233 #endif
12234     }
12235     else if(MApi_XC_Get_3D_HW_Version() < 2)
12236     {
12237         if(u16HShift & 0x01)
12238         {
12239             pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift + 1;
12240             printf("horizontal shift pixel should be even: adjust to %u\n", pXCResourcePrivate->stdrvXC_3D._u163DHShift);
12241         }
12242         else
12243         {
12244             bRet = TRUE;
12245             pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift;
12246         }
12247     }
12248     else
12249     {
12250         bRet = TRUE;
12251         //if 2P mode is enabled, the shift must be even.
12252 #if (XC_SUPPORT_2P_MODE == TRUE)
12253         pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift*2 & 0xFF; //Offset is 8 bit
12254 #else
12255         pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift & 0xFF; //Offset is 8 bit
12256 #endif
12257     }
12258 #else
12259     UNUSED(u16HShift);
12260 #endif
12261     return bRet;
12262 }
12263 
12264 //------------------------------------------------------------------------------------------------------
12265 /// Set 3D horizontal shift pixel
12266 /// @param  u16HShift                \b IN: input  horizontal shift pixel
12267 /// @return MS_BOOL                  \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
12268 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HShift_U2(void * pInstance,MS_U16 u16HShift)12269 MS_BOOL MApi_XC_Set_3D_HShift_U2(void* pInstance, MS_U16 u16HShift)
12270 {
12271     MS_BOOL bRet = FALSE;
12272     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12273      _XC_ENTRY(pInstance);
12274 
12275     bRet = MDrv_XC_Set_3D_HShift(pInstance, u16HShift);
12276 
12277     _XC_RETURN(pInstance);
12278     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12279     return bRet;
12280 }
12281 
MApi_XC_Set_3D_HShift(MS_U16 u16HShift)12282 MS_BOOL MApi_XC_Set_3D_HShift(MS_U16 u16HShift)
12283 {
12284     if (pu32XCInst == NULL)
12285     {
12286         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12287         return FALSE;
12288     }
12289 
12290     stXC_SET_3D_HORIZONTAL_SHIFT XCArgs;
12291     XCArgs.u16HShift = u16HShift;
12292     XCArgs.bReturnValue = FALSE;
12293 
12294     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HORIZONTAL_SHIFT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12295     {
12296         printf("Obtain XC engine fail\n");
12297         return FALSE;
12298     }
12299     else
12300     {
12301         return XCArgs.bReturnValue;
12302     }
12303 }
12304 
12305 //------------------------------------------------------------------------------------------------------
12306 /// Set 3D reg_3dlr_side2line_en, for line_alternative full screen output
12307 /// @param  u16HShift                \b IN: input  horizontal shift pixel
12308 /// @return MS_BOOL                  \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
12309 //------------------------------------------------------------------------------------------------------
MDrv_XC_Enable_3D_LR_Sbs2Line(void * pInstance,MS_BOOL bEnable)12310 MS_BOOL MDrv_XC_Enable_3D_LR_Sbs2Line(void *pInstance, MS_BOOL bEnable)
12311 {
12312     MS_BOOL bRet = FALSE;
12313 #ifndef DISABLE_3D_FUNCTION
12314 #if (HW_DESIGN_3D_VER >= 1)
12315     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12316     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12317     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12318 
12319     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12320     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12321     _XC_ENTRY(pInstance);
12322     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, (bEnable << 15), 0x8000);//dnr offset
12323     pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line = bEnable;
12324     bRet = TRUE;
12325     _XC_RETURN(pInstance);
12326     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12327 #endif
12328 #else
12329     UNUSED(bEnable);
12330 #endif
12331     return bRet;
12332 }
12333 
MApi_XC_Enable_3D_LR_Sbs2Line_U2(void * pInstance,MS_BOOL bEnable)12334 MS_BOOL MApi_XC_Enable_3D_LR_Sbs2Line_U2(void* pInstance, MS_BOOL bEnable)
12335 {
12336     MS_BOOL bReturn = FALSE;
12337 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
12338     if(!Hal_SC_3D_IsDualViewMode(pInstance,MAIN_WINDOW))
12339  #endif
12340     {
12341         bReturn = MDrv_XC_Enable_3D_LR_Sbs2Line(pInstance, bEnable);
12342     }
12343     return bReturn;
12344 }
12345 
MApi_XC_Enable_3D_LR_Sbs2Line(MS_BOOL bEnable)12346 MS_BOOL MApi_XC_Enable_3D_LR_Sbs2Line(MS_BOOL bEnable)
12347 {
12348     if (pu32XCInst == NULL)
12349     {
12350         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12351         return FALSE;
12352     }
12353 
12354     stXC_SET_3D_LR_SBS2LINE XCArgs;
12355     XCArgs.bEnable = bEnable;
12356     XCArgs.bReturnValue = FALSE;
12357 
12358     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_LR_SBS2LINE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12359     {
12360         printf("Obtain XC engine fail\n");
12361         return FALSE;
12362     }
12363     else
12364     {
12365         return XCArgs.bReturnValue;
12366     }
12367 }
12368 
12369 //------------------------------------------------------------------------------------------------------
12370 /// Is 3D reg_3dlr_side2line_en enabled or not
12371 /// @return MS_BOOL                  \b OUT: TRUE: enabled FALSE: is not enabled
12372 //------------------------------------------------------------------------------------------------------
MApi_XC_3D_Is_LR_Sbs2Line_U2(void * pInstance)12373 MS_BOOL MApi_XC_3D_Is_LR_Sbs2Line_U2(void* pInstance)
12374 {
12375     MS_BOOL bRet = FALSE;
12376 #ifndef DISABLE_3D_FUNCTION
12377     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12378     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12379     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12380     _XC_ENTRY(pInstance);
12381     bRet = MDrv_SC_3D_Is_LR_Sbs2Line(pInstance);
12382     _XC_RETURN(pInstance);
12383     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12384 #endif
12385     return bRet;
12386 }
12387 
MApi_XC_3D_Is_LR_Sbs2Line(void)12388 MS_BOOL MApi_XC_3D_Is_LR_Sbs2Line(void)
12389 {
12390     if (pu32XCInst == NULL)
12391     {
12392         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12393         return FALSE;
12394     }
12395 
12396     stXC_CHECK_3D_LR_SBS2LINE XCArgs;
12397     XCArgs.bReturnValue = FALSE;
12398 
12399     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_LR_SBS2LINE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12400     {
12401         printf("Obtain XC engine fail\n");
12402         return FALSE;
12403     }
12404     else
12405     {
12406         return XCArgs.bReturnValue;
12407     }
12408 }
12409 //-------------------------------------------------------------------------------------------------
12410 /// Get 3D horizontal shift pixel
12411 /// @param  void
12412 /// @return MS_U16                            \b OUT: need horizontal shift pixel value
12413 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_HShift(void * pInstance)12414 MS_U16 MDrv_XC_Get_3D_HShift(void *pInstance)
12415 {
12416 #ifndef DISABLE_3D_FUNCTION
12417     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12418     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12419     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12420     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12421 
12422     return pXCResourcePrivate->stdrvXC_3D._u163DHShift;
12423 #else
12424     return 0;
12425 #endif
12426 }
12427 
MApi_XC_Get_3D_HShift_U2(void * pInstance)12428 MS_U16 MApi_XC_Get_3D_HShift_U2(void* pInstance)
12429 {
12430     MS_U16 u16Return = 0;
12431     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12432     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12433     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12434     u16Return = MDrv_XC_Get_3D_HShift(pInstance);
12435     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12436     return u16Return;
12437 }
12438 
MApi_XC_Get_3D_HShift(void)12439 MS_U16 MApi_XC_Get_3D_HShift(void)
12440 {
12441     if (pu32XCInst == NULL)
12442     {
12443         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12444         return 0;
12445     }
12446 
12447     stXC_GET_3D_HORIZONTAL_SHIFT XCArgs;
12448     XCArgs.u16ReturnValue = 0;
12449 
12450     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HORIZONTAL_SHIFT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12451     {
12452         printf("Obtain XC engine fail\n");
12453         return 0;
12454     }
12455     else
12456     {
12457         return XCArgs.u16ReturnValue;
12458     }
12459 }
12460 
12461 //------------------------------------------------------------------------------------------------------
12462 /// Set HW 2D to 3D para
12463 /// @param  st3DHw2DTo3DPara          \b IN: parameters
12464 /// @return MS_BOOL                   \b OUT: TRUE: set is ok FALSE: set value is wrong
12465 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HW2DTo3D_Parameters_U2(void * pInstance,MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)12466 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Parameters_U2(void* pInstance, MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)
12467 {
12468 #ifndef DISABLE_3D_FUNCTION
12469     MS_BOOL bRet = TRUE;
12470 #if HW_2DTO3D_SUPPORT
12471     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12472     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12473     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12474 
12475     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12476     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12477     if(st3DHw2DTo3DPara.u16Concave > 15)
12478     {
12479         printf("u16Concave only have 4 bits\n");
12480         bRet = FALSE;
12481         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = HW_2DTO3D_DEFAULT_CONCAVE;
12482     }
12483     else
12484     {
12485         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = st3DHw2DTo3DPara.u16Concave;
12486     }
12487 
12488     if(st3DHw2DTo3DPara.u16ArtificialGain > 15)
12489     {
12490         printf("u16ArtificialGain only have 4 bits\n");
12491         bRet = FALSE;
12492         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = HW_2DTO3D_DEFAULT_ARTIFICIALGAIN;
12493     }
12494     else
12495     {
12496         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = st3DHw2DTo3DPara.u16ArtificialGain;
12497     }
12498 #if (HW_2DTO3D_VER < 2)
12499     if(st3DHw2DTo3DPara.u16Gain > 63)
12500     {
12501         printf("u16Gain only have 6 bits\n");
12502         bRet = FALSE;
12503         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
12504     }
12505 #else
12506     if(st3DHw2DTo3DPara.u16Gain > 127)
12507     {
12508         printf("u16Gain only have 7 bits\n");
12509         bRet = FALSE;
12510         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
12511     }
12512 #endif
12513     else
12514     {
12515         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = st3DHw2DTo3DPara.u16Gain;
12516     }
12517 
12518     if(st3DHw2DTo3DPara.u16Offset > 255)
12519     {
12520         printf("u16Offset only have 8 bits\n");
12521         bRet = FALSE;
12522         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = HW_2DTO3D_DEFAULT_OFFSET;
12523     }
12524     else
12525     {
12526         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = st3DHw2DTo3DPara.u16Offset;
12527     }
12528 
12529     if(st3DHw2DTo3DPara.u16EleSel > 3)
12530     {
12531         printf("u16Offset only have 2 bits\n");
12532         bRet = FALSE;
12533         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = HW_2DTO3D_DEFAULT_ELESEL;
12534     }
12535     else
12536     {
12537         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = st3DHw2DTo3DPara.u16EleSel;
12538     }
12539 
12540     if(st3DHw2DTo3DPara.u16ModSel > 3)
12541     {
12542         printf("u16Offset only have 2 bits\n");
12543         bRet = FALSE;
12544         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_MODSEL;
12545     }
12546     else
12547     {
12548         pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = st3DHw2DTo3DPara.u16ModSel;
12549     }
12550 
12551     if(st3DHw2DTo3DPara.u32Hw2dTo3dPara_Version < 2)
12552     {
12553         st3DHw2DTo3DPara.u16EdgeBlackWidth = 0;
12554     }
12555     else
12556     {
12557         if(st3DHw2DTo3DPara.u16EdgeBlackWidth > 127)
12558         {
12559             printf("u16EdgeBlackWidth only have 7 bits\n");
12560             bRet = FALSE;
12561             pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH;
12562         }
12563         else
12564         {
12565             pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth = st3DHw2DTo3DPara.u16EdgeBlackWidth;
12566         }
12567     }
12568     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12569 #else
12570     printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12571     bRet = FALSE;
12572 #endif
12573     return bRet;
12574 #else
12575     MS_BOOL bRet = FALSE;
12576     UNUSED(st3DHw2DTo3DPara);
12577     printf("Not support!!");
12578     return bRet;
12579 #endif
12580 }
12581 
MApi_XC_Set_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)12582 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)
12583 {
12584     if (pu32XCInst == NULL)
12585     {
12586         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12587         return FALSE;
12588     }
12589 
12590     stXC_SET_3D_HW2DTO3D_PARAMETERS XCArgs;
12591     XCArgs.st3DHw2DTo3DPara = st3DHw2DTo3DPara;
12592     XCArgs.bReturnValue = FALSE;
12593 
12594     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HW2DTO3D_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12595     {
12596         printf("Obtain XC engine fail\n");
12597         return FALSE;
12598     }
12599     else
12600     {
12601         return XCArgs.bReturnValue;
12602     }
12603 }
12604 
12605 //------------------------------------------------------------------------------------------------------
12606 /// Get HW 2D to 3D para
12607 /// @param  pst3DHw2DTo3DPara          \b IN: pointer to parameters
12608 /// @return MS_BOOL                    \b OUT: TRUE: set is ok FALSE: set value is wrong
12609 //------------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_HW2DTo3D_Parameters_U2(void * pInstance,MS_XC_3D_HW2DTO3D_PARA * pst3DHw2DTo3DPara)12610 MS_BOOL MApi_XC_Get_3D_HW2DTo3D_Parameters_U2(void* pInstance, MS_XC_3D_HW2DTO3D_PARA *pst3DHw2DTo3DPara)
12611 {
12612 #ifndef DISABLE_3D_FUNCTION
12613     MS_BOOL bRet = TRUE;
12614 
12615     MS_ASSERT(pst3DHw2DTo3DPara);
12616     if(pst3DHw2DTo3DPara == NULL)
12617     {
12618         printf("3D: pst3DHw2DTo3DPara is null pointer!\n");
12619         return FALSE;
12620     }
12621 
12622 #if HW_2DTO3D_SUPPORT
12623     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12624     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12625     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12626 
12627     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12628     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12629     MS_U16 u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA);
12630     //new AP + old lib, only the length corresponding to old lib has meaning.
12631     if(pst3DHw2DTo3DPara->u32Hw2dTo3dPara_Version > HW2DTO3DPARA_VERSION)
12632     {
12633         //We cosider compatible operation from version1 , so reject the info init when version invalid
12634 #if defined (__aarch64__)
12635         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: this old version XC lib has only length:%lu !!\n",
12636                      sizeof(MS_XC_3D_HW2DTO3D_PARA))
12637 #else
12638         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: this old version XC lib has only length:%u !!\n",
12639                      sizeof(MS_XC_3D_HW2DTO3D_PARA))
12640 #endif
12641         //we still copy the min size of both structure, but AP should take care of it.
12642         u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA);
12643     }
12644 
12645     //old AP + new lib, driver shouldn't access to the space which doesn't exist in old structure
12646     if(pst3DHw2DTo3DPara->u32Hw2dTo3dPara_Version == 1)
12647     {
12648         //We cosider compatible operation form version1 , so reject the info init when version invalid
12649         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: new version XC lib shouldn't access to the space which doesn't exist in old structure!!\n")
12650         u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA) - sizeof(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth);
12651     }
12652 
12653     memcpy(pst3DHw2DTo3DPara, &(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara), u16CopiedLength);
12654     bRet = TRUE;
12655     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12656 #else
12657     printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12658     memset(pst3DHw2DTo3DPara, 0, sizeof(MS_XC_3D_HW2DTO3D_PARA));
12659     bRet = FALSE;
12660 #endif
12661     return bRet;
12662 #else
12663     MS_BOOL bRet = FALSE;
12664     UNUSED(pst3DHw2DTo3DPara);
12665     return bRet;
12666 #endif
12667 }
12668 
MApi_XC_Get_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA * pst3DHw2DTo3DPara)12669 MS_BOOL MApi_XC_Get_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA *pst3DHw2DTo3DPara)
12670 {
12671     if (pu32XCInst == NULL)
12672     {
12673         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12674         return FALSE;
12675     }
12676 
12677     stXC_GET_3D_HW2DTO3D_PARAMETERS XCArgs;
12678     XCArgs.pst3DHw2DTo3DPara = pst3DHw2DTo3DPara;
12679     XCArgs.bReturnValue = FALSE;
12680 
12681     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HW2DTO3D_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12682     {
12683         printf("Obtain XC engine fail\n");
12684         return FALSE;
12685     }
12686     else
12687     {
12688         return XCArgs.bReturnValue;
12689     }
12690 }
12691 
12692 //------------------------------------------------------------------------------------------------------
12693 /// Set HW 2D to 3D dd buffer&dr buffer
12694 /// @param  MS_PHYADDR                \b IN: dd buffer address
12695 /// @param  MS_PHYADDR                \b IN: dr buffer address
12696 /// @return MS_BOOL                   \b OUT: TRUE: set is ok FALSE: set value is wrong
12697 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HW2DTo3D_Buffer_U2(void * pInstance,MS_PHY u32HW2DTO3D_DD_Buf,MS_PHY u32HW2DTO3D_DR_Buf)12698 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Buffer_U2(void* pInstance, MS_PHY u32HW2DTO3D_DD_Buf, MS_PHY u32HW2DTO3D_DR_Buf)
12699 {
12700 #ifndef DISABLE_3D_FUNCTION
12701 #if HW_2DTO3D_SUPPORT
12702     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12703     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12704     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12705 
12706     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12707     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12708     pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf = u32HW2DTO3D_DD_Buf;
12709     pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf = u32HW2DTO3D_DR_Buf;
12710 
12711     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12712     return TRUE;
12713 #else
12714     printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12715     return FALSE;
12716 #endif
12717 #else
12718     UNUSED(u32HW2DTO3D_DD_Buf);
12719     UNUSED(u32HW2DTO3D_DR_Buf);
12720     return FALSE;
12721 #endif
12722 }
12723 
MApi_XC_Set_3D_HW2DTo3D_Buffer(MS_PHY u32HW2DTO3D_DD_Buf,MS_PHY u32HW2DTO3D_DR_Buf)12724 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Buffer(MS_PHY u32HW2DTO3D_DD_Buf, MS_PHY u32HW2DTO3D_DR_Buf)
12725 {
12726     if (pu32XCInst == NULL)
12727     {
12728         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12729         return FALSE;
12730     }
12731 
12732     stXC_SET_3D_HW2DTO3D_BUFFER XCArgs;
12733     XCArgs.u32HW2DTO3D_DD_Buf = u32HW2DTO3D_DD_Buf;
12734     XCArgs.u32HW2DTO3D_DR_Buf = u32HW2DTO3D_DR_Buf;
12735     XCArgs.bReturnValue = FALSE;
12736 
12737     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HW2DTO3D_BUFFER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12738     {
12739         printf("Obtain XC engine fail\n");
12740         return FALSE;
12741     }
12742     else
12743     {
12744         return XCArgs.bReturnValue;
12745     }
12746 }
12747 
12748 //------------------------------------------------------------------------------------------------------
12749 /// Set Color Registers after PQ
12750 /// @param  eWindow                   \b IN: which window to do post pq setting
12751 /// @return MS_BOOL                   \b OUT: TRUE: set is ok FALSE: set value is wrong
12752 //------------------------------------------------------------------------------------------------------
MApi_XC_3D_PostPQSetting_U2(void * pInstance,SCALER_WIN eWindow)12753 MS_BOOL MApi_XC_3D_PostPQSetting_U2(void* pInstance, SCALER_WIN eWindow)
12754 {
12755     MS_BOOL bRet = FALSE;
12756 #ifndef DISABLE_3D_FUNCTION
12757     MS_ASSERT(eWindow < MAX_WINDOW);
12758     if(eWindow >= MAX_WINDOW)
12759     {
12760         return FALSE;
12761     }
12762     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12763     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12764     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12765     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12766     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12767     _XC_ENTRY(pInstance);
12768     bRet = MDrv_SC_3D_PostPQSetting(pInstance, &gSrcInfo[eWindow], eWindow);
12769     _XC_RETURN(pInstance);
12770     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12771 #else
12772     UNUSED(eWindow);
12773 #endif
12774 
12775     return bRet;
12776 }
12777 
MApi_XC_3D_PostPQSetting(SCALER_WIN eWindow)12778 MS_BOOL MApi_XC_3D_PostPQSetting(SCALER_WIN eWindow)
12779 {
12780     if (pu32XCInst == NULL)
12781     {
12782         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12783         return FALSE;
12784     }
12785 
12786     stXC_SET_3D_POST_PQSETTING XCArgs;
12787     XCArgs.eWindow = eWindow;
12788     XCArgs.bReturnValue = FALSE;
12789 
12790     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_POST_PQSETTING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12791     {
12792         printf("Obtain XC engine fail\n");
12793         return FALSE;
12794     }
12795     else
12796     {
12797         return XCArgs.bReturnValue;
12798     }
12799 }
12800 
12801 //------------------------------------------------------------------------------------------------------
12802 /// Set Detect 3D Format Para
12803 /// @param  pstDetect3DFormatPara       \b IN: pointer to parameters
12804 /// @return MS_BOOL                     \b OUT: TRUE: set is ok FALSE: set value is wrong
12805 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_Detect3DFormat_Parameters_U2(void * pInstance,MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12806 MS_BOOL MApi_XC_Set_3D_Detect3DFormat_Parameters_U2(void* pInstance, MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12807 {
12808 #ifndef DISABLE_3D_FUNCTION
12809 
12810     MS_ASSERT(pstDetect3DFormatPara);
12811     if(pstDetect3DFormatPara == NULL)
12812     {
12813         printf("3D: pstDetect3DFormatPara is null pointer!\n");
12814         return FALSE;
12815     }
12816     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12817     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12818     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12819 
12820     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12821     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12822     memcpy(&(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara), pstDetect3DFormatPara, sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12823     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12824     return TRUE;
12825 #else
12826     UNUSED(pstDetect3DFormatPara);
12827     return FALSE;
12828 #endif
12829 }
12830 
MApi_XC_Set_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12831 MS_BOOL MApi_XC_Set_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12832 {
12833     if (pu32XCInst == NULL)
12834     {
12835         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12836         return FALSE;
12837     }
12838 
12839     stXC_SET_3D_DETECT_3DFORMAT_PARAMETERS XCArgs;
12840     XCArgs.pstDetect3DFormatPara = pstDetect3DFormatPara;
12841     XCArgs.bReturnValue = FALSE;
12842 
12843     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_DETECT_3DFORMAT_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12844     {
12845         printf("Obtain XC engine fail\n");
12846         return FALSE;
12847     }
12848     else
12849     {
12850         return XCArgs.bReturnValue;
12851     }
12852 }
12853 
12854 //------------------------------------------------------------------------------------------------------
12855 /// Get Detect 3D Format Para
12856 /// @param  pstDetect3DFormatPara       \b IN: pointer to parameters
12857 /// @return MS_BOOL                     \b OUT: TRUE: set is ok FALSE: set value is wrong
12858 //------------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_Detect3DFormat_Parameters_U2(void * pInstance,MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12859 MS_BOOL MApi_XC_Get_3D_Detect3DFormat_Parameters_U2(void* pInstance, MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12860 {
12861 #ifndef DISABLE_3D_FUNCTION
12862     MS_ASSERT(pstDetect3DFormatPara);
12863     if(pstDetect3DFormatPara == NULL)
12864     {
12865         printf("3D: pstDetect3DFormatPara is null pointer!\n");
12866         return FALSE;
12867     }
12868     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12869     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12870     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12871 
12872     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12873     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12874     memcpy(pstDetect3DFormatPara, &(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara), sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12875     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12876     return TRUE;
12877 #else
12878     UNUSED(pstDetect3DFormatPara);
12879     return FALSE;
12880 #endif
12881 }
12882 
MApi_XC_Get_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12883 MS_BOOL MApi_XC_Get_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12884 {
12885     if (pu32XCInst == NULL)
12886     {
12887         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12888         return FALSE;
12889     }
12890     static MS_XC_3D_DETECT3DFORMAT_PARA tmp_para;
12891     memcpy(&tmp_para,pstDetect3DFormatPara,sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12892     stXC_GET_3D_DETECT_3DFORMAT_PARAMETERS XCArgs;
12893     XCArgs.pstDetect3DFormatPara = &tmp_para;
12894     XCArgs.bReturnValue = FALSE;
12895 
12896     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_DETECT_3DFORMAT_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12897     {
12898         printf("Obtain XC engine fail\n");
12899         return FALSE;
12900     }
12901     else
12902     {
12903         memcpy(pstDetect3DFormatPara,&tmp_para,sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12904         return XCArgs.bReturnValue;
12905     }
12906 }
12907 
MApi_XC_EnableAutoDetect3D_U2(void * pInstance,MS_BOOL bEnable,E_XC_3D_AUTODETECT_METHOD enDetectMethod)12908 MS_BOOL MApi_XC_EnableAutoDetect3D_U2(void* pInstance, MS_BOOL bEnable, E_XC_3D_AUTODETECT_METHOD enDetectMethod)
12909 {
12910 #ifndef DISABLE_3D_FUNCTION
12911     MS_BOOL bRet = TRUE;
12912 
12913     MS_ASSERT(enDetectMethod < E_XC_3D_AUTODETECT_MAX);
12914     if(enDetectMethod >= E_XC_3D_AUTODETECT_MAX)
12915     {
12916         return FALSE;
12917     }
12918     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12919     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12920     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12921 
12922     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12923     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12924     pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod     = enDetectMethod;
12925     pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D    = bEnable;
12926     if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
12927     {
12928         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
12929     }
12930     else
12931     {
12932         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
12933     }
12934 
12935 #if (HW_2DTO3D_SUPPORT == FALSE)
12936     if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
12937        || (E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod))
12938     {
12939         printf("Attention, not support hw auto detect 3d, change to sw method!\n");
12940         pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod = E_XC_3D_AUTODETECT_SW;
12941         bRet = FALSE;
12942     }
12943 #endif
12944 
12945 #if HW_2DTO3D_SUPPORT
12946     if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
12947         && (!pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))//if disable hw auto detect 3d
12948     {
12949         _XC_ENTRY(pInstance);
12950         //detach vsync interrupt
12951         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
12952         {
12953             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
12954         }
12955         _XC_RETURN(pInstance);
12956     }
12957 #endif
12958     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12959 #else
12960     MS_BOOL bRet = FALSE;
12961     UNUSED(bEnable);
12962     UNUSED(enDetectMethod);
12963 #endif
12964     return bRet;
12965 }
12966 
MApi_XC_EnableAutoDetect3D(MS_BOOL bEnable,E_XC_3D_AUTODETECT_METHOD enDetectMethod)12967 MS_BOOL MApi_XC_EnableAutoDetect3D(MS_BOOL bEnable, E_XC_3D_AUTODETECT_METHOD enDetectMethod)
12968 {
12969     if (pu32XCInst == NULL)
12970     {
12971         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12972         return FALSE;
12973     }
12974 
12975     stXC_SET_3D_AUTODETECT XCArgs;
12976     XCArgs.bEnable = bEnable;
12977     XCArgs.enDetectMethod = enDetectMethod;
12978     XCArgs.bReturnValue = FALSE;
12979 
12980     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_AUTODETECT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12981     {
12982         printf("Obtain XC engine fail\n");
12983         return FALSE;
12984     }
12985     else
12986     {
12987         return XCArgs.bReturnValue;
12988     }
12989 }
12990 
MApi_XC_GetAutoDetect3DFlag_U2(void * pInstance,E_XC_3D_AUTODETECT_METHOD * penDetectMethod,MS_BOOL * pbEnable)12991 MS_BOOL MApi_XC_GetAutoDetect3DFlag_U2(void* pInstance, E_XC_3D_AUTODETECT_METHOD *penDetectMethod, MS_BOOL *pbEnable)
12992 {
12993 #ifndef DISABLE_3D_FUNCTION
12994     if((penDetectMethod == NULL) || (pbEnable == NULL))
12995     {
12996         printf("3D: penDetectMethod or pbEnable is null pointer!\n");
12997         return FALSE;
12998     }
12999     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13000     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13001     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13002 
13003     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13004     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13005     *penDetectMethod = pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod;
13006     if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
13007     {
13008         *pbEnable = pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D;
13009     }
13010     else
13011     {
13012         *pbEnable = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
13013     }
13014     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13015     return TRUE;
13016 #else
13017     UNUSED(penDetectMethod);
13018     UNUSED(pbEnable);
13019     return FALSE;
13020 #endif
13021 }
13022 
MApi_XC_GetAutoDetect3DFlag(E_XC_3D_AUTODETECT_METHOD * penDetectMethod,MS_BOOL * pbEnable)13023 MS_BOOL MApi_XC_GetAutoDetect3DFlag(E_XC_3D_AUTODETECT_METHOD *penDetectMethod, MS_BOOL *pbEnable)
13024 {
13025     if (pu32XCInst == NULL)
13026     {
13027         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13028         return FALSE;
13029     }
13030 
13031     stXC_GET_3D_AUTODETECT_3DFLAG XCArgs;
13032     XCArgs.penDetectMethod = penDetectMethod;
13033     XCArgs.pbEnable = pbEnable;
13034     XCArgs.bReturnValue = FALSE;
13035 
13036     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_AUTODETECT_3DFLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13037     {
13038         printf("Obtain XC engine fail\n");
13039         return FALSE;
13040     }
13041     else
13042     {
13043         return XCArgs.bReturnValue;
13044     }
13045 }
13046 
13047 //------------------------------------------------------------------------------------------------------
13048 /// Detect Nine Lattice By Content
13049 /// @param  eWindow                   \b IN: which window view we are going to detect
13050 /// @param  pstDetectNLatticePara     \b IN: parameters for detecting
13051 /// @return MS_BOOL                   \b OUT: true->detect nine lattice succeed; false->detect fail
13052 //------------------------------------------------------------------------------------------------------
MApi_XC_DetectNL_U2(void * pInstance,SCALER_WIN eWindow,ST_DETECTNL_PARA * pstDetectNLatticePara)13053 MS_BOOL MApi_XC_DetectNL_U2(void* pInstance, SCALER_WIN eWindow, ST_DETECTNL_PARA* pstDetectNLatticePara)
13054 {
13055 #ifndef DISABLE_3D_FUNCTION
13056     MS_U16 u16LatticeIdx = 0;
13057     MS_U16 u16H_PixelIdx = 0;
13058     MS_U16 u16V_PixelIdx = 0;
13059     MS_U16 i = 0;
13060     MS_WINDOW_TYPE stSrcRect = {0,0,0,0};
13061     MS_PIXEL_24BIT* pstSource = NULL;
13062     MS_PIXEL_24BIT* pstCurrentPoint = NULL;
13063     MS_U8* pu8Buf = NULL;
13064     MS_U8  u8FieldNum = 0;
13065     MS_U8* pu8BufReg = NULL;
13066     MS_BOOL bRet = TRUE;
13067     MS_U16 u16HCenterIdx[DETECTNL_LATTICE_NUM] = {0,0,0,0,0,0,0,0,0};
13068     MS_U16 u16VCenterIdx[DETECTNL_LATTICE_NUM] = {0,0,0,0,0,0,0,0,0};
13069     MS_U8  u8TryTimes = 0;
13070     MS_U16 u16PixelStep = DETECTNL_PIXEL_STEP;
13071     MS_U8  u8ColorThreshold = DETECTNL_COLORTHRESHOLD;
13072     MS_U8  u8MaxTryTimes = DETECTNL_TRY_TIMES;
13073 #if 0 // no need
13074     MS_U16 u16LinearDiff = DETECTNL_LINEAR_DIFF;
13075 #endif
13076 #if DETECTNL_COMPUTE_TIME
13077     MS_U32 u32StartTime=0;
13078     u32StartTime = MsOS_GetSystemTime();
13079 #endif
13080     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13081     if (NULL != pstDetectNLatticePara)
13082     {
13083         u16PixelStep = pstDetectNLatticePara->u16PixelStep;
13084         u8ColorThreshold = pstDetectNLatticePara->u8ColorThreshold;
13085         u8MaxTryTimes = pstDetectNLatticePara->u8TryTimes;
13086 #if 0 // no need
13087         u16LinearDiff = pstDetectNLatticePara->u16LinearDiff;
13088 #endif
13089     }
13090     if (0 == u8MaxTryTimes || eWindow >= MAX_WINDOW)
13091     {
13092         return FALSE;
13093     }
13094     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13095     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13096     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13097     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13098     stSrcRect.width = gSrcInfo[eWindow].u16H_SizeAfterPreScaling/3;
13099     stSrcRect.height = gSrcInfo[eWindow].u16V_SizeAfterPreScaling/3;
13100     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13101     pstSource = (MS_PIXEL_24BIT*)malloc(stSrcRect.width * stSrcRect.height * sizeof(MS_PIXEL_24BIT));
13102     if (pstSource == NULL)
13103     {
13104         return FALSE;
13105     }
13106 
13107     pu8BufReg = (MS_U8*)malloc(stSrcRect.width/u16PixelStep * (stSrcRect.height/u16PixelStep) * sizeof(MS_U8));
13108     if (pu8BufReg == NULL)
13109     {
13110         free(pstSource);
13111         pstSource = NULL;
13112         return FALSE;
13113     }
13114 
13115     for (u16LatticeIdx = 0; u16LatticeIdx < DETECTNL_LATTICE_NUM; u16LatticeIdx++)  //check 9 lattices
13116     {
13117         MS_U16 u16LatticeLeft = 0; //record the lattice rect
13118         MS_U16 u16LatticeRight = 0;
13119         MS_U16 u16LatticeTop = 0;
13120         MS_U16 u16LatticeBottom = 0;
13121         MS_BOOL bForceHCheck = FALSE;
13122 
13123         bRet = TRUE;
13124 
13125         //locate the lattice
13126         stSrcRect.x = (u16LatticeIdx%3) * stSrcRect.width;
13127         stSrcRect.y = (u16LatticeIdx/3) * stSrcRect.height;
13128 
13129         //get the lattice rect
13130         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13131         MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)pstSource, eWindow);
13132         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13133         //For edge effect, we have to multi-times, every time has a shift.
13134         for (u8TryTimes = 0; u8TryTimes < u8MaxTryTimes; u8TryTimes++)
13135         {
13136             bRet = TRUE;
13137             pu8Buf = pu8BufReg;
13138             *pu8Buf = 0;
13139             u8FieldNum = 0;
13140             //V direction scan
13141             for (u16V_PixelIdx = (u16PixelStep/u8MaxTryTimes) * u8TryTimes; u16V_PixelIdx < stSrcRect.height - u16PixelStep; u16V_PixelIdx += u16PixelStep)
13142             {
13143                 //H direction scan
13144                 for (u16H_PixelIdx = (u16PixelStep/u8MaxTryTimes) * u8TryTimes; u16H_PixelIdx < stSrcRect.width - u16PixelStep; u16H_PixelIdx += u16PixelStep)
13145                 {
13146                     //locate source point
13147                     pstCurrentPoint = pstSource + u16V_PixelIdx * stSrcRect.width + u16H_PixelIdx;
13148                     //locate tag of source point
13149                     pu8Buf = pu8BufReg + (u16V_PixelIdx/u16PixelStep)* (stSrcRect.width/u16PixelStep) + u16H_PixelIdx/u16PixelStep;
13150                     //check whether current point is similar to the point in last line in same column
13151                     if (u16V_PixelIdx != ((u16PixelStep/u8MaxTryTimes) * u8TryTimes)) //not first line
13152                     {
13153                         MS_PIXEL_24BIT* pstLastLinePoint = NULL;
13154                         //Y comparing with last line
13155                         pstLastLinePoint = pstCurrentPoint - stSrcRect.width*u16PixelStep;
13156                         if (abs(pstLastLinePoint->G_Y - pstCurrentPoint->G_Y) < u8ColorThreshold)
13157                         {
13158                             *pu8Buf = *(pu8Buf - stSrcRect.width/u16PixelStep);
13159                             if (1 == *pu8Buf)
13160                             {
13161                                 if (u16H_PixelIdx == u16LatticeLeft)
13162                                 {
13163                                     u16LatticeBottom = u16V_PixelIdx;
13164                                     continue;
13165                                 }
13166                                 else
13167                                 {
13168                                     bForceHCheck = TRUE;
13169                                 }
13170                             }
13171                             else
13172                             {
13173                                 continue;
13174                             }
13175                         }
13176                         else
13177                         {
13178                             *pu8Buf = DETECTNL_NON_VALUE;
13179                         }
13180                     }
13181                     //check whether current point is simaler to the point in last column with same line
13182                     if (u16H_PixelIdx != ((u16PixelStep/u8MaxTryTimes) * u8TryTimes))
13183                     {
13184                         MS_PIXEL_24BIT* pstLastColumnPoint = NULL;
13185                         //Y comparing with last column
13186                         pstLastColumnPoint = pstCurrentPoint - u16PixelStep;
13187                         if (abs(pstLastColumnPoint->G_Y - pstCurrentPoint->G_Y) < u8ColorThreshold)
13188                         {
13189                             *pu8Buf = *(pu8Buf - 1);
13190                             if (1 == *pu8Buf)
13191                             {
13192                                 if (u16V_PixelIdx == u16LatticeTop)
13193                                 {
13194                                     u16LatticeRight = u16H_PixelIdx;
13195                                     continue;
13196                                 }
13197                                 else
13198                                 {
13199                                     if ((FALSE == bForceHCheck)
13200                                         && (u16V_PixelIdx != u16LatticeTop - u16PixelStep)  //ignore some points near top/right edge
13201                                         && (u16V_PixelIdx != u16LatticeTop + u16PixelStep)
13202                                         && (u16V_PixelIdx != u16LatticeTop + u16PixelStep)
13203                                         && (u16H_PixelIdx != u16LatticeRight - u16PixelStep)
13204                                         && (u16H_PixelIdx != u16LatticeRight + u16PixelStep))
13205                                     {
13206                                         bRet = FALSE;
13207                                         break;
13208                                     }
13209                                 }
13210                             }
13211                             if (TRUE == bForceHCheck)
13212                             {
13213                                 bForceHCheck = FALSE;
13214                                 if ((1 != *pu8Buf)
13215                                     && (u16H_PixelIdx != u16LatticeLeft)  //ignore some points near left edge
13216                                     && (u16H_PixelIdx != u16LatticeLeft - u16PixelStep)
13217                                     && (u16H_PixelIdx != u16LatticeLeft + u16PixelStep)
13218                                     && (u16V_PixelIdx != u16LatticeBottom)
13219                                     && (u16V_PixelIdx != u16LatticeBottom - u16PixelStep)
13220                                     && (u16V_PixelIdx != u16LatticeBottom + u16PixelStep)
13221                                     && (u16H_PixelIdx != u16LatticeRight)
13222                                     && (u16H_PixelIdx != u16LatticeRight + u16PixelStep)
13223                                     && (u16H_PixelIdx != u16LatticeRight - u16PixelStep))
13224                                 {
13225                                     bRet = FALSE;
13226                                     break;
13227                                 }
13228                             }
13229                             continue;
13230                         }
13231                         else
13232                         {
13233                             *pu8Buf = DETECTNL_NON_VALUE;
13234                         }
13235                         bForceHCheck = FALSE;
13236                     }
13237                     if (DETECTNL_NON_VALUE == *pu8Buf)
13238                     {
13239                         if ((1 == u8FieldNum)
13240                             && ((u16H_PixelIdx == u16LatticeLeft - u16PixelStep)  //ignore some points near left/right/bottom edge
13241                             || (u16H_PixelIdx == u16LatticeRight - u16PixelStep)
13242                             || (u16H_PixelIdx == u16LatticeRight + u16PixelStep)
13243                             || (u16V_PixelIdx == u16LatticeBottom - u16PixelStep)
13244                             || (u16V_PixelIdx == u16LatticeBottom + u16PixelStep)))
13245                         {
13246                             *pu8Buf = 1;
13247                         }
13248                         else
13249                         {
13250                             u8FieldNum++;
13251                             *pu8Buf = u8FieldNum;
13252                             if (1 == *pu8Buf) // catch first "1" field position
13253                             {
13254                                 u16LatticeLeft = u16H_PixelIdx;
13255                                 u16LatticeRight = u16H_PixelIdx;
13256                                 u16LatticeTop = u16V_PixelIdx;
13257                                 u16LatticeBottom = u16V_PixelIdx;
13258                             }
13259 
13260                             if (u8FieldNum > 1)
13261                             {
13262                                 break;
13263                             }
13264                         }
13265                     }
13266                 }
13267                 if (u8FieldNum > 1) // 3 fields
13268                 {
13269                     break;
13270                 }
13271             }
13272 
13273             if (u8FieldNum != 1) // 0 and 1 fields
13274             {
13275                 bRet = FALSE;
13276             }
13277             if (TRUE == bRet)
13278             {
13279                 u16HCenterIdx[u16LatticeIdx] = (u16LatticeLeft + u16LatticeRight) / 2;
13280                 u16VCenterIdx[u16LatticeIdx] = (u16LatticeTop + u16LatticeBottom) / 2;
13281                 break;
13282             }
13283         }
13284         if (FALSE == bRet)
13285         {
13286             break;
13287         }
13288     }
13289     if (TRUE == bRet) //check linear
13290     {
13291         for (i = 0; i < DETECTNL_LATTICE_NUM/3; i++)
13292         {
13293             if ((abs(u16VCenterIdx[i*3]-u16VCenterIdx[i*3+1]) > u8MaxTryTimes + u16PixelStep/2)
13294                 || (abs(u16VCenterIdx[i*3+1]-u16VCenterIdx[i*3+2]) > 32+u16PixelStep/2))
13295             {
13296                 bRet = FALSE;
13297                 break;
13298             }
13299             if ((abs(u16HCenterIdx[i]-u16HCenterIdx[i+3]) > u8MaxTryTimes + u16PixelStep/2)
13300                 || (abs(u16HCenterIdx[i+3]-u16HCenterIdx[i+6]) > 32+u16PixelStep/2))
13301             {
13302                 bRet = FALSE;
13303                 break;
13304             }
13305         }
13306     }
13307     free(pu8BufReg);
13308     free(pstSource);
13309     pstSource = NULL;
13310     pu8BufReg = NULL;
13311 #if DETECTNL_COMPUTE_TIME
13312     printf("*time*%ld\n",MsOS_GetSystemTime()-u32StartTime);
13313 #endif
13314     return bRet;
13315 #else
13316     MS_BOOL bRet = FALSE;
13317     UNUSED(pstDetectNLatticePara);
13318     UNUSED(eWindow);
13319     printf("Not support!!");
13320     return bRet;
13321 #endif
13322 
13323 }
13324 
MApi_XC_DetectNL(SCALER_WIN eWindow,ST_DETECTNL_PARA * pstDetectNLatticePara)13325 MS_BOOL MApi_XC_DetectNL(SCALER_WIN eWindow, ST_DETECTNL_PARA* pstDetectNLatticePara)
13326 {
13327     if (pu32XCInst == NULL)
13328     {
13329         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13330         return FALSE;
13331     }
13332 
13333     stXC_SET_NINELATTICE XCArgs;
13334     XCArgs.eWindow = eWindow;
13335     XCArgs.pstDetectNLatticePara = pstDetectNLatticePara;
13336     XCArgs.bReturnValue = FALSE;
13337 
13338     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_NINELATTICE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13339     {
13340         printf("Obtain XC engine fail\n");
13341         return FALSE;
13342     }
13343     else
13344     {
13345         return XCArgs.bReturnValue;
13346     }
13347 }
13348 
13349 //------------------------------------------------------------------------------------------------------
13350 /// Detect 3D Format By Content
13351 /// @param  eWindow                   \b IN: which window view we are going to detect
13352 /// @return E_XC_3D_INPUT_MODE        \b OUT: detected 3d format
13353 //------------------------------------------------------------------------------------------------------
MApi_XC_Detect3DFormatByContent_U2(void * pInstance,SCALER_WIN eWindow)13354 E_XC_3D_INPUT_MODE MApi_XC_Detect3DFormatByContent_U2(void* pInstance, SCALER_WIN eWindow)
13355 {
13356     E_XC_3D_INPUT_MODE e3DInput = E_XC_3D_INPUT_MODE_NONE;
13357     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13358     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13359 #ifndef DISABLE_3D_FUNCTION
13360     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13361     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13362     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13363 
13364     if(MDrv_XC_IsInputSourceDisabled(pInstance, eWindow))
13365     {
13366         printf("Attention! Should enable input source when do auto detect 3d\n");
13367         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13368         return E_XC_3D_INPUT_MODE_NONE;
13369     }
13370 
13371 #if (HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3))
13372     if((IS_INPUT_FRAME_PACKING(MAIN_WINDOW)
13373           || IS_INPUT_TOP_BOTTOM(MAIN_WINDOW)
13374           || IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
13375         && IS_OUTPUT_LINE_ALTERNATIVE())
13376     {
13377         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, BIT(13), BIT(13));//reg_det3d_la_en
13378     }
13379     else
13380     {
13381         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x00, BIT(13));//reg_det3d_la_en
13382     }
13383 #else
13384     if((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) != E_XC_3D_INPUT_MODE_NONE)
13385        || (MDrv_XC_Get_3D_Output_Mode(pInstance) != E_XC_3D_OUTPUT_MODE_NONE))
13386     {
13387         printf("Attention! Should disable 3d when do auto detect 3d\n");
13388         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13389         return E_XC_3D_INPUT_MODE_NONE;
13390     }
13391 #endif
13392 
13393     if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13394     {
13395 #if (HW_2DTO3D_SUPPORT == FALSE)
13396         printf("Attention! hw auto detect mode is not supported by this chip!\n");
13397 #endif
13398         e3DInput = pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes;
13399     }
13400     else if((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13401     {
13402 #if HW_2DTO3D_SUPPORT
13403         MS_U32 u32Time = 0;
13404         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = TRUE;
13405 
13406         _XC_ENTRY(pInstance);
13407 
13408 #if (HW_2DTO3D_VER < 3)
13409 
13410         MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &gSrcInfo[eWindow].stDispWin);
13411         MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
13412         MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
13413 
13414         if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
13415         {
13416             u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
13417         }
13418 
13419         if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
13420         {
13421             u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
13422         }
13423 
13424         //clk
13425         MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
13426         //dd
13427         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, gSrcInfo[eWindow].stDispWin.width, 0x07FF);//src width
13428         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, gSrcInfo[eWindow].stDispWin.height, 0x07FF);//src height
13429         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
13430         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
13431         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
13432         MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
13433 #if (HW_2DTO3D_VER < 2)
13434         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
13435 #else
13436         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
13437 #endif
13438 #if (HW_2DTO3D_VER > 0)
13439         MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
13440 #endif
13441         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
13442         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0430);
13443         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6),  BIT(6));   // DD force bank enable
13444         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F);     // DD force bank0
13445         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0, BIT(12));        //disable dynamic gating
13446 #else
13447         _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, &gSrcInfo[eWindow], eWindow);
13448 #endif
13449 
13450         pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
13451         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
13452         pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
13453         pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
13454         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
13455         {
13456             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
13457         }
13458         _XC_RETURN(pInstance);
13459 
13460 
13461         u32Time = MsOS_GetSystemTime();
13462         while((E_XC_3D_INPUT_MODE_NONE == pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes)
13463               && (pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount)
13464               && ((MsOS_GetSystemTime() - u32Time) < 4000))
13465         {
13466             // because other thread wiill update _enCurDetectedRes, _u16CheckedFrameCount, u16MaxCheckingFrameCount
13467             // so we need to unlock first so that other thread(a.k.a ISR) can retrieve semaphore and update variables
13468             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13469             MsOS_DelayTask(100);
13470             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13471         }
13472 
13473         _XC_ENTRY(pInstance);
13474         //detach vsync interrupt
13475         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
13476         {
13477             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
13478         }
13479 
13480 #if (HW_2DTO3D_VER < 3)
13481         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
13482         //dd
13483         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
13484         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x07FF);//src height
13485         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
13486         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x0000);
13487         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0000);
13488         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, BIT(12), BIT(12)); //enable dynamic gating
13489 #else
13490         _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, &gSrcInfo[eWindow], eWindow);
13491 #endif
13492         _XC_RETURN(pInstance);
13493         pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
13494 #else
13495         printf("Attention! hw auto detect compatible mode is not supported by this chip!\n");
13496 #endif
13497         e3DInput = pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes;
13498     }
13499     else if((E_XC_3D_AUTODETECT_SW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13500     {
13501         e3DInput = E_XC_3D_INPUT_MODE_NONE;
13502         printf("\n Attention! SW auto detect mode is not supported. return value 3D_INPUT_MODE_NONE !\n");
13503 #if 0
13504         MS_PIXEL_24BIT stSource = {0,0,0};
13505         MS_U16 u16SBSMatchedPixelCount = 0;
13506         MS_U16 u16TBMatchedPixelCount = 0;
13507         MS_PIXEL_24BIT stDest[pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange];
13508         MS_WINDOW_TYPE stSrcRect;
13509         MS_WINDOW_TYPE stDestRect;
13510         MS_U16 i = 0;
13511         MS_U16 j = 0;
13512         MS_U16 k = 0;
13513         MS_U16 m = 0;
13514         MS_U16 u16Temp = 0;
13515         MS_U16 u16SBSMatchedFrameCount = 0;
13516         MS_U16 u16TBMatchedFrameCount = 0;
13517         MS_BOOL bExit = FALSE;
13518         MS_U16 u16FrameCount = 0;
13519         MS_U16 u16Array[3][32];
13520         MS_U16 u16MaxSimCount[3];
13521         MS_U16 u16PurePixel = 0;
13522         MS_U16 u16PureFrameCount = 0;
13523 
13524         MS_ASSERT(eWindow < MAX_WINDOW);
13525 
13526         if(eWindow >= MAX_WINDOW)
13527         {
13528             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13529             return E_XC_3D_INPUT_MODE_NONE;
13530         }
13531 
13532         if(gSrcInfo[eWindow].bFBL
13533            || gSrcInfo[eWindow].bR_FBL
13534            || (gSrcInfo[eWindow].u16H_SizeAfterPreScaling == 0)
13535            || (gSrcInfo[eWindow].u16V_SizeAfterPreScaling == 0)
13536            )
13537         {
13538             printf("Attention: invalid case of MApi_XC_Detect3DFormatByContent!\n");
13539             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13540             return E_XC_3D_INPUT_MODE_NONE;
13541         }
13542 
13543         memset(&stDest, 0 , sizeof(stDest));
13544 
13545         _XC_ENTRY(pInstance);
13546 
13547         do
13548         {
13549             u16SBSMatchedPixelCount = 0;
13550             u16TBMatchedPixelCount = 0;
13551             MDrv_XC_wait_input_vsync(pInstance, 1, 100, eWindow);
13552             Hal_SC_set_freezeimg(pInstance, ENABLE, eWindow);
13553 
13554             ///skip pure frame
13555             u16PurePixel = 0;
13556             memset(u16Array, 0, sizeof(u16Array));
13557             memset(u16MaxSimCount, 0, sizeof(u16MaxSimCount));
13558             for(j = 0; j < DETECT3DFORMAT_DEFAULT_VERPUREPIXEL; j++)
13559             {
13560                 for(i = 0; i < DETECT3DFORMAT_DEFAULT_HORPUREPIXEL; i++)
13561                 {
13562                     stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/(DETECT3DFORMAT_DEFAULT_HORPUREPIXEL+1);
13563                     stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/(DETECT3DFORMAT_DEFAULT_VERPUREPIXEL+1);
13564                     stSrcRect.width = 1;
13565                     stSrcRect.height = 1;
13566 
13567                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================pure frame check Attention! i=%u, j=%u=======================================================\n", i, j);
13568                     MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13569                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13570                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13571 
13572                     u16Array[0][stSource.G_Y / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold]++;
13573                     u16Array[1][stSource.B_Cb / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold]++;
13574                     u16Array[2][stSource.R_Cr / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold]++;
13575                 }
13576             }
13577 
13578             u16MaxSimCount[0] = u16Array[0][0] + u16Array[0][1];
13579             u16MaxSimCount[1] = u16Array[1][0] + u16Array[1][1];
13580             u16MaxSimCount[2] = u16Array[2][0] + u16Array[2][1];
13581             for(j = 0; j < 3; j++)
13582             {
13583                 for(i = 1; i < 31; i++)
13584                 {
13585                     MS_U16 u16Temp = u16Array[j][i] + u16Array[j][i + 1];
13586                     if(u16Temp > u16MaxSimCount[j])
13587                     {
13588                         u16MaxSimCount[j] = u16Temp;
13589                     }
13590                 }
13591             }
13592 
13593             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16MaxSimCount[0]=%u, u16MaxSimCount[1]=%u, u16MaxSimCount[2]=%u\n", u16MaxSimCount[0], u16MaxSimCount[1], u16MaxSimCount[2]);
13594 
13595             u16PurePixel = MIN(MIN(u16MaxSimCount[0], u16MaxSimCount[1]), u16MaxSimCount[2]);
13596 
13597             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16PurePixel=%u\n", u16PurePixel);
13598 
13599             if(u16PurePixel >= (DETECT3DFORMAT_DEFAULT_HORPUREPIXEL*DETECT3DFORMAT_DEFAULT_VERPUREPIXEL*DETECT3DFORMAT_DEFAULT_PUREPIXELPERCENTAGE/100))
13600             {
13601                 u16PureFrameCount++;
13602                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pure frame detected!\n");
13603                 Hal_SC_set_freezeimg(pInstance, DISABLE, eWindow);
13604                 continue;
13605             }
13606 
13607             ///sbs check
13608             for(j = 0; j < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount; j++)
13609             {
13610                 for(i = 0; i < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount; i++)
13611                 {
13612                     stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/2/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount+1);
13613                     stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount+1);
13614                     stSrcRect.width = 1;
13615                     stSrcRect.height = 1;
13616 
13617                     stDestRect.x = stSrcRect.x + gSrcInfo[eWindow].u16H_SizeAfterPreScaling/2 - pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange/2;
13618                     stDestRect.y = stSrcRect.y;
13619                     stDestRect.width = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13620                     stDestRect.height = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange;
13621 
13622                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================SBS Attention! i=%u, j=%u=======================================================\n", i, j);
13623                     MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13624                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13625                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13626                     MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stDestRect, (MS_U8 *)stDest, eWindow);
13627                     bExit = FALSE;
13628                     for(m = 0; (!bExit) && (m < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange); m++)
13629                     {
13630                         for(k = 0; k < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange; k++)
13631                         {
13632                             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stDestRect.x+k, stDestRect.y);
13633                             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stDest[i].G_Y, stDest[i].B_Cb, stDest[i].R_Cr);
13634                             u16Temp = k + m * pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13635                             if((abs((MS_S16)stDest[u16Temp].G_Y-stSource.G_Y) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold)    //find the matched pixel
13636                                && (abs((MS_S16)stDest[u16Temp].B_Cb-stSource.B_Cb) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold)
13637                                && (abs((MS_S16)stDest[u16Temp].R_Cr-stSource.R_Cr) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold)
13638                                )
13639                             {
13640                                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "SBS hit: i=%u, j=%u\n", i, j);
13641                                 u16SBSMatchedPixelCount++;
13642                                 bExit = TRUE;
13643                                 break;
13644                             }
13645                         }
13646                     }
13647                 }
13648             }
13649 
13650             ///tb check
13651             for(j = 0; j < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount; j++)
13652             {
13653                 for(i = 0; i < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount; i++)
13654                 {
13655                     stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount+1);
13656                     stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/2/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount+1);
13657                     stSrcRect.width = 1;
13658                     stSrcRect.height = 1;
13659 
13660                     stDestRect.x = stSrcRect.x - pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange/2;
13661                     stDestRect.y = stSrcRect.y + gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2;
13662                     stDestRect.width = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13663                     stDestRect.height = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange;
13664 
13665                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================TB Attention! i=%u, j=%u=======================================================\n", i, j);
13666                     MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13667                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13668                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13669                     MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stDestRect, (MS_U8 *)stDest, eWindow);
13670                     bExit = FALSE;
13671                     for(m = 0; (!bExit) && (m < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange); m++)
13672                     {
13673                         for(k = 0; k < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange; k++)
13674                         {
13675                             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stDestRect.x+k, stDestRect.y);
13676                             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stDest[i].G_Y, stDest[i].B_Cb, stDest[i].R_Cr);
13677                             u16Temp = k + m * pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13678                             if((abs((MS_S16)stDest[u16Temp].G_Y-stSource.G_Y) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold)    //find the matched pixel
13679                                && (abs((MS_S16)stDest[u16Temp].B_Cb-stSource.B_Cb) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold)
13680                                && (abs((MS_S16)stDest[u16Temp].R_Cr-stSource.R_Cr) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold)
13681                                )
13682                             {
13683                                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "TB hit: i=%u, j=%u\n", i, j);
13684                                 u16TBMatchedPixelCount++;
13685                                 bExit = TRUE;
13686                                 break;
13687                             }
13688                         }
13689                     }
13690                 }
13691             }
13692 
13693             Hal_SC_set_freezeimg(pInstance, DISABLE, eWindow);
13694 
13695             if(u16SBSMatchedPixelCount >=
13696                 (pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage/100))
13697             {
13698                 u16SBSMatchedFrameCount++;
13699             }
13700 
13701             if(u16TBMatchedPixelCount >=
13702                 (pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage/100))
13703             {
13704                 u16TBMatchedFrameCount++;
13705             }
13706 
13707             u16FrameCount++;
13708 
13709             MsOS_DelayTask(100);
13710 
13711             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16SBSMatchedPixelCount=%u, u16TBMatchedPixelCount=%u\n", u16SBSMatchedPixelCount, u16TBMatchedPixelCount);
13712         }while((u16FrameCount < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount) && (u16PureFrameCount < 256));
13713 
13714         _XC_RETURN(pInstance);
13715 
13716         if((u16SBSMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13717            && (u16TBMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13718            )
13719         {
13720             e3DInput = E_XC_3D_INPUT_MODE_NONE;
13721         }
13722         else if(u16SBSMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13723         {
13724             e3DInput = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
13725         }
13726         else if(u16TBMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13727         {
13728             e3DInput = E_XC_3D_INPUT_TOP_BOTTOM;
13729         }
13730         else
13731         {
13732             e3DInput = E_XC_3D_INPUT_MODE_NONE;
13733         }
13734 #endif
13735     }
13736     else
13737     {
13738         printf("Attention, not enable auto detect 3d!\n");
13739     }
13740     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13741 #else
13742     UNUSED(eWindow);
13743 #endif
13744     return e3DInput;
13745 }
13746 
MApi_XC_Detect3DFormatByContent(SCALER_WIN eWindow)13747 E_XC_3D_INPUT_MODE MApi_XC_Detect3DFormatByContent(SCALER_WIN eWindow)
13748 {
13749     if (pu32XCInst == NULL)
13750     {
13751         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13752         return FALSE;
13753     }
13754 
13755     stXC_GET_3D_FORMAT_DETECTED_BY_CONTENT XCArgs;
13756     XCArgs.eWindow = eWindow;
13757     XCArgs.eReturnValue = FALSE;
13758 
13759     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_FORMAT_DETECTED_BY_CONTENT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13760     {
13761         printf("Obtain XC engine fail\n");
13762         return FALSE;
13763     }
13764     else
13765     {
13766         return XCArgs.eReturnValue;
13767     }
13768 }
13769 
13770 //------------------------------------------------------------------------------------------------------
13771 /// Set 3D Frame Packing Info
13772 /// @param  pstFPInfoPara             \b IN: pointer to struct MS_XC_3D_FPINFO_PARA
13773 /// @return MS_BOOL                   \b OUT: TRUE: set is ok FALSE: set value is wrong
13774 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_FPInfo_U2(void * pInstance,MS_XC_3D_FPINFO_PARA * pstFPInfoPara)13775 MS_BOOL MApi_XC_Set_3D_FPInfo_U2(void* pInstance, MS_XC_3D_FPINFO_PARA *pstFPInfoPara)
13776 {
13777 #ifndef DISABLE_3D_FUNCTION
13778 
13779     MS_ASSERT(pstFPInfoPara);
13780     if(pstFPInfoPara == NULL)
13781     {
13782         printf("3D: pstFPInfoPara is null pointer!\n");
13783         return FALSE;
13784     }
13785     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13786     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13787     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13788 
13789     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13790     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13791     memcpy(&(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara), pstFPInfoPara, sizeof(MS_XC_3D_FPINFO_PARA));
13792     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13793     return TRUE;
13794 #else
13795     UNUSED(pstFPInfoPara);
13796     return FALSE;
13797 #endif
13798 }
13799 
MApi_XC_Set_3D_FPInfo(MS_XC_3D_FPINFO_PARA * pstFPInfoPara)13800 MS_BOOL MApi_XC_Set_3D_FPInfo(MS_XC_3D_FPINFO_PARA *pstFPInfoPara)
13801 {
13802     if (pu32XCInst == NULL)
13803     {
13804         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13805         return FALSE;
13806     }
13807 
13808     stXC_SET_3D_FRAMEPACKING_INFO XCArgs;
13809     XCArgs.pstFPInfoPara = pstFPInfoPara;
13810     XCArgs.bReturnValue = FALSE;
13811 
13812     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_FRAMEPACKING_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13813     {
13814         printf("Obtain XC engine fail\n");
13815         return FALSE;
13816     }
13817     else
13818     {
13819         return XCArgs.bReturnValue;
13820     }
13821 }
13822 
13823 //------------------------------------------------------------------------------------------------------
13824 /// Enable Sub Window Clock
13825 /// @return MS_BOOL                   \b OUT: TRUE: set is ok FALSE: set is wrong
13826 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_SubWinClk_U2(void * pInstance)13827 MS_BOOL MApi_XC_Set_3D_SubWinClk_U2(void* pInstance)
13828 {
13829 #ifndef DISABLE_3D_FUNCTION
13830     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13831     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13832     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13833 
13834     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13835     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13836     MDrv_SC_3D_CloneMainSettings(pInstance, &gSrcInfo[SUB_WINDOW], SUB_WINDOW);
13837     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13838     return TRUE;
13839 #else
13840     return FALSE;
13841 #endif
13842 }
13843 
MApi_XC_Set_3D_SubWinClk(void)13844 MS_BOOL MApi_XC_Set_3D_SubWinClk(void)
13845 {
13846     if (pu32XCInst == NULL)
13847     {
13848         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13849         return FALSE;
13850     }
13851 
13852     stXC_SET_3D_SUBWINCLOCK XCArgs;
13853     XCArgs.bReturnValue = FALSE;
13854 
13855     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_SUBWINCLOCK, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13856     {
13857         printf("Obtain XC engine fail\n");
13858         return FALSE;
13859     }
13860     else
13861     {
13862         return XCArgs.bReturnValue;
13863     }
13864 }
13865 
13866 //-------------------------------------------------------------------------------------------------
13867 /// Query the input 3D format is supported or not
13868 /// @param  E_XC_3D_INPUT_MODE                \b IN: input  3d format
13869 /// @param  E_XC_3D_INPUT_MODE                \b IN: output 3d format
13870 /// @return MS_BOOL                           \b OUT: TRUE:Supported FALSE:NotSupported
13871 //-------------------------------------------------------------------------------------------------
MDrv_XC_Is3DFormatSupported(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)13872 MS_BOOL MDrv_XC_Is3DFormatSupported(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
13873                                E_XC_3D_OUTPUT_MODE e3dOutputMode)
13874 {
13875     MS_BOOL bRet = FALSE;
13876 #ifndef DISABLE_3D_FUNCTION
13877 
13878     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "==============================================================\n");
13879     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:this 3D format is e3dInputMode:0x%x;e3dOutputMode:%x\n",
13880                      e3dInputMode, e3dOutputMode);
13881     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "==============================================================\n");
13882 
13883 //-------------------------------------------------------------------------------------------------
13884 /// special case
13885 //-------------------------------------------------------------------------------------------------
13886     if(((e3dInputMode == E_XC_3D_INPUT_MODE_NONE) &&
13887         (e3dOutputMode == E_XC_3D_OUTPUT_MODE_NONE))
13888         ||
13889 //-------------------------------------------------------------------------------------------------
13890 ///obsolete case
13891 //-------------------------------------------------------------------------------------------------
13892         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13893         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13894         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13895         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13896         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE)
13897         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D))
13898         &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC))
13899         ||
13900         (((e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT)
13901         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE)
13902         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE)
13903         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE_PTP))
13904         &&(e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
13905         ||
13906         ((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING_OPT) &&
13907          (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
13908         ||
13909         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING_OPT)
13910         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM_OPT))
13911         &&(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
13912         ||
13913 //-------------------------------------------------------------------------------------------------
13914 ///frame alternative output case
13915 //-------------------------------------------------------------------------------------------------
13916         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13917         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13918         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13919         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13920         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13921 #if (HW_DESIGN_3D_VER == 4)
13922         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
13923 #endif
13924 #if (HW_DESIGN_3D_VER >= 2)
13925         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13926         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13927         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13928 #endif
13929         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D))
13930         &&((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
13931              ||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR)))
13932 #if HW_2DTO3D_SUPPORT
13933 #if ((HW_2DTO3D_VER  != 3))
13934         ||
13935         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13936          (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW))
13937         ||
13938         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13939          (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW))
13940 #endif
13941 #endif
13942         ||
13943 //-------------------------------------------------------------------------------------------------
13944 ///line alternative output case
13945 //-------------------------------------------------------------------------------------------------
13946         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13947         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13948         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13949         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13950         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13951         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
13952 #if (HW_DESIGN_3D_VER >= 2)
13953         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13954         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13955         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13956 #endif
13957         )
13958         &&(e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
13959 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
13960         ||
13961         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13962          (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW))
13963 #endif
13964         ||
13965 //-------------------------------------------------------------------------------------------------
13966 /// top bottom output case
13967 //-------------------------------------------------------------------------------------------------
13968         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13969         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13970         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13971         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13972         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13973         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
13974 #if (HW_DESIGN_3D_VER >= 2)
13975         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13976         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13977         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13978 #endif
13979 #if (HW_DESIGN_3D_VER == 4)
13980         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
13981 #endif
13982         )
13983         &&(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
13984 #if HW_2DTO3D_SUPPORT
13985 #if (HW_2DTO3D_VER >= 4)
13986         ||
13987         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13988          (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW))
13989 #endif
13990 #endif
13991         ||
13992 //-------------------------------------------------------------------------------------------------
13993 /// side by side output case
13994 //-------------------------------------------------------------------------------------------------
13995         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13996         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13997         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13998         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13999         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14000         ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
14001 #if (HW_DESIGN_3D_VER >= 2)
14002         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14003         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14004         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14005 #endif
14006         )
14007         &&(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14008 #if HW_2DTO3D_SUPPORT
14009 #if (HW_2DTO3D_VER >= 4)
14010         ||
14011         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14012          (e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW))
14013 #endif
14014 #endif
14015         ||
14016 //-------------------------------------------------------------------------------------------------
14017 /// LL RR TT BB output case
14018 //-------------------------------------------------------------------------------------------------
14019         (((e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14020         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14021         )
14022         &&((e3dOutputMode == E_XC_3D_OUTPUT_TOP_TOP)
14023         ||(e3dOutputMode == E_XC_3D_OUTPUT_BOTTOM_BOTTOM)
14024         ||(e3dOutputMode == E_XC_3D_OUTPUT_LEFT_LEFT)
14025         ||(e3dOutputMode == E_XC_3D_OUTPUT_RIGHT_RIGHT)))
14026         ||
14027 //-------------------------------------------------------------------------------------------------
14028 /// framepacking output case
14029 //-------------------------------------------------------------------------------------------------
14030         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14031          ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
14032          ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14033          ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14034          ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14035  #if ( HW_SUPPORT_3D_CB_AND_PA  == TRUE)
14036          ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14037          ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14038 #endif
14039          ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14040          ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW)
14041          ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
14042          )
14043         &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_PACKING))
14044 #if HW_2DTO3D_SUPPORT
14045 #if (HW_2DTO3D_VER >= 4)
14046         ||
14047         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14048          (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_PACKING))
14049 #endif
14050 #endif
14051         ||
14052 //-------------------------------------------------------------------------------------------------
14053 /// 3d to 2d Lonly output case
14054 //-------------------------------------------------------------------------------------------------
14055         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14056         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14057         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14058         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14059         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14060 #if (HW_DESIGN_3D_VER >= 2)
14061         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14062         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14063         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14064 #endif
14065         )
14066         &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L))
14067 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14068         ||
14069         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14070          (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L_HW))
14071 #endif
14072         ||
14073 //-------------------------------------------------------------------------------------------------
14074 /// 3d to 2d Ronly output case
14075 //-------------------------------------------------------------------------------------------------
14076         (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14077         ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14078         ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14079         ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14080         ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14081 #if (HW_DESIGN_3D_VER >= 2)
14082         ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14083         ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14084         ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14085 #endif
14086         )
14087         &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
14088 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14089         ||
14090         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14091          (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R_HW))
14092 #endif
14093 //-------------------------------------------------------------------------------------------------
14094 /// pixel alternative output case
14095 //-------------------------------------------------------------------------------------------------
14096 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14097         ||
14098         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14099          (e3dOutputMode == E_XC_3D_OUTPUT_PIXEL_ALTERNATIVE_HW))
14100 #endif
14101 //-------------------------------------------------------------------------------------------------
14102 /// check board alternative output case
14103 //-------------------------------------------------------------------------------------------------
14104 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14105         ||
14106         ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14107          (e3dOutputMode == E_XC_3D_OUTPUT_CHECKBOARD_HW))
14108 #endif
14109 //-------------------------------------------------------------------------------------------------
14110 /// 3d dual view
14111 //-------------------------------------------------------------------------------------------------
14112 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14113         ||
14114         ((e3dInputMode == E_XC_3D_INPUT_MODE_NONE) &&
14115          ((e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
14116          || (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
14117          || (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)))
14118 #endif
14119     )
14120     {
14121         bRet = TRUE;
14122     }
14123     else
14124     {
14125         bRet = FALSE;
14126     }
14127 #else
14128     UNUSED(e3dInputMode);
14129     UNUSED(e3dOutputMode);
14130 #endif
14131     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "is3dformatsupported = %d ,e3dInputMode:%u;e3dOutputMode:%u\n",
14132                          bRet,e3dInputMode, e3dOutputMode);
14133     return bRet;
14134 }
14135 
MApi_XC_Is3DFormatSupported_U2(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)14136 MS_BOOL MApi_XC_Is3DFormatSupported_U2(void* pInstance,
14137                                       E_XC_3D_INPUT_MODE e3dInputMode,
14138                                       E_XC_3D_OUTPUT_MODE e3dOutputMode)
14139 {
14140     MS_BOOL bReturn = FALSE;
14141     bReturn = MDrv_XC_Is3DFormatSupported(pInstance, e3dInputMode, e3dOutputMode);
14142 
14143     return bReturn;
14144 }
14145 
MApi_XC_Is3DFormatSupported(E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)14146 MS_BOOL MApi_XC_Is3DFormatSupported(E_XC_3D_INPUT_MODE e3dInputMode,
14147                                     E_XC_3D_OUTPUT_MODE e3dOutputMode)
14148 {
14149     if (pu32XCInst == NULL)
14150     {
14151         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14152         return FALSE;
14153     }
14154 
14155     stXC_CHECK_3D_FORMAT_SUPPORTED XCArgs;
14156     XCArgs.e3dInputMode = e3dInputMode;
14157     XCArgs.e3dOutputMode = e3dOutputMode;
14158     XCArgs.bReturnValue = FALSE;
14159 
14160     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_FORMAT_SUPPORTED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14161     {
14162         printf("Obtain XC engine fail\n");
14163         return FALSE;
14164     }
14165     else
14166     {
14167         return XCArgs.bReturnValue;
14168     }
14169 }
14170 
14171 #ifndef DISABLE_3D_FUNCTION
MDrv_SC_3D_GetFP_Info(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 * pu16VactVideo,MS_U16 * pu16VactSpace,MS_BOOL bPreVscalingEna)14172 void MDrv_SC_3D_GetFP_Info(void *pInstance, XC_InternalStatus *pSrcInfo, MS_U16 *pu16VactVideo, MS_U16 *pu16VactSpace, MS_BOOL bPreVscalingEna)
14173 {
14174     if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
14175     {
14176         *pu16VactVideo = DOUBLEHD_1080X2P_FRAME_VSIZE;
14177         *pu16VactSpace = DOUBLEHD_1080X2P_GARBAGE_VSIZE;
14178     }
14179     else if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)
14180     {
14181         *pu16VactVideo = DOUBLEHD_720X2P_FRAME_VSIZE;
14182         *pu16VactSpace = DOUBLEHD_720X2P_GARBAGE_VSIZE;
14183     }
14184     else if(pSrcInfo->stCapWin.height == DOUBLEHD_576X2P_VSIZE)
14185     {
14186         *pu16VactVideo = DOUBLEHD_576X2P_FRAME_VSIZE;
14187         *pu16VactSpace = DOUBLEHD_576X2P_GARBAGE_VSIZE;
14188     }
14189     else if((pSrcInfo->stCapWin.height == DOUBLEHD_480X2P_VSIZE) && (pSrcInfo->stCapWin.width == DOUBLEHD_480X2P_HSIZE))
14190     {
14191         *pu16VactVideo = DOUBLEHD_480X2P_FRAME_VSIZE;
14192         *pu16VactSpace = DOUBLEHD_480X2P_GARBAGE_VSIZE;
14193     }
14194     else if((pSrcInfo->stCapWin.height == DOUBLEHD_640_480X2P_VSIZE) && (pSrcInfo->stCapWin.width== DOUBLEHD_640_480X2P_HSIZE))
14195     {
14196         *pu16VactVideo = DOUBLEHD_640_480X2P_FRAME_VSIZE;
14197         *pu16VactSpace = DOUBLEHD_640_480X2P_GARBAGE_VSIZE;
14198     }
14199     else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14200     {
14201         *pu16VactVideo = DOUBLEHD_1080X2I_FIELD_VSIZE;
14202         *pu16VactSpace = (DOUBLEHD_1080X2I_VACT_SPACE1*2+DOUBLEHD_1080X2I_VACT_SPACE2);
14203     }
14204     else if(pSrcInfo->stCapWin.height == FIELD_INTERLEAVE_1080X2I_VISZE)
14205     {
14206         *pu16VactVideo = FIELD_INTERLEAVE_1080X2I_FIELD_VISZE;
14207         *pu16VactSpace = FIELD_INTERLEAVE_1080X2I_VACT_SPACE;
14208     }
14209     else
14210     {
14211         printf("MDrv_SC_3D_GetFP_Info: it's not regular framepacking!\n");
14212         *pu16VactVideo = 0;
14213         *pu16VactSpace = 0;
14214     }
14215 //Because the u16VactSpace is took off first at BK2 <New design!!>
14216 #if ((HW_DESIGN_3D_VER < 3) || (HW_DESIGN_3D_VER == 4))
14217     if(bPreVscalingEna)
14218     {
14219         MS_U8 u8Ratio;
14220         if(pSrcInfo->stCapWin.height > pSrcInfo->u16V_SizeAfterPreScaling)//Avoid divide overflow
14221         {
14222             u8Ratio = pSrcInfo->stCapWin.height/pSrcInfo->u16V_SizeAfterPreScaling;
14223             *pu16VactVideo /= u8Ratio;
14224             *pu16VactSpace /= u8Ratio;
14225         }
14226     }
14227 #endif
14228     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "FP_Info: bPreVEna=%u, VactVideo=%u, VactSpace=%u, Vsrc=%u, Vdst=%u\n",
14229                  bPreVscalingEna, *pu16VactVideo, *pu16VactSpace, pSrcInfo->stCapWin.height, pSrcInfo->u16V_SizeAfterPreScaling);
14230 }
14231 
14232 #if (HW_DESIGN_3D_VER >= 2)
14233 // This function is used to calculate exact pre V scaling dst, to let u16VactSpace can be totally divided
MDrv_SC_3D_Adjust_FP_PreVerDstSize(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,MS_U16 * pu16ScaleDst,SCALER_WIN eWindow)14234 void MDrv_SC_3D_Adjust_FP_PreVerDstSize(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
14235                                     E_XC_3D_OUTPUT_MODE eOutputMode,
14236                                     XC_InternalStatus *pSrcInfo,
14237                                     MS_U16 *pu16ScaleDst,
14238                                     SCALER_WIN eWindow)
14239 {
14240     #define MAX_ACCEPTABLE_VRATIO 5 //Notes: 10 means scaling down to 1/5 of Vsrc
14241     MS_U16 u16VactVideo, u16VactSpace;
14242     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14243     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14244     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14245     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14246     MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14247 //A5: the u16VactSpace is took off first at BK2 <New design!!>
14248 #if (HW_DESIGN_3D_VER > 3)
14249 
14250     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14251        (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14252     {
14253         if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
14254             ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14255             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
14256         else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14257         {
14258             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14259             {
14260                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
14261             }
14262             else
14263             {
14264                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1280x720;
14265             }
14266         }
14267     }
14268 
14269     if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14270     {
14271         if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14272         {
14273             *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14274         }
14275         else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14276         {
14277             *pu16ScaleDst = pSrcInfo->stDispWin.height;
14278         }
14279         else if(IS_OUTPUT_FRAME_ALTERNATIVE())
14280         {
14281             if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE))
14282             {
14283 
14284                 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
14285                     ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14286                 //FPI input, no prescaling down
14287                     *pu16ScaleDst = pSrcInfo->stDispWin.height/2;  // target for output 1920x540
14288                 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14289                 {
14290                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14291                     {
14292                         *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14293                     }
14294                     else
14295                     {
14296                         *pu16ScaleDst = pSrcInfo->stDispWin.height;
14297                     }
14298                 }
14299             }
14300             else if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE))
14301             {
14302                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14303                     *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14304                 else
14305                     *pu16ScaleDst = pSrcInfo->stDispWin.height;
14306             }
14307             else
14308             {
14309                 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14310             }
14311         }
14312         else
14313         {
14314             //Default disable prescaling
14315             *pu16ScaleDst = pSrcInfo->stCapWin.height-u16VactSpace;
14316         }
14317         *pu16ScaleDst = *pu16ScaleDst & (~0x01);
14318     }
14319     else
14320     {
14321         *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst & (~0x01);
14322     }
14323     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Adjust_FP_PreVerDstSize:bPreVCusScaling=%s, dst=%u, eOutputMode=%u\n",
14324                  (pSrcInfo->Status2.bPreVCusScaling?"Yes":"No"),*pu16ScaleDst, eOutputMode);
14325 #elif (HW_DESIGN_3D_VER < 3)
14326     MS_U8 i = 0;
14327 
14328     if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14329     {
14330         //FPI input, no prescaling down
14331         *pu16ScaleDst = pSrcInfo->stCapWin.height;
14332         return;
14333     }
14334     else if(pSrcInfo->Status2.bPreVCusScaling == TRUE)
14335     {
14336         //check if can use AP assigned pre V Customer scaling
14337         if((pSrcInfo->Status2.u16PreVCusScalingSrc % pSrcInfo->Status2.u16PreVCusScalingDst) == 0)
14338         {
14339             i = pSrcInfo->Status2.u16PreVCusScalingSrc/pSrcInfo->Status2.u16PreVCusScalingDst;
14340             if((u16VactSpace%i) == 0)
14341             {
14342                 //Vact space can be divided with no remainder, so this customer pre V scaling is ok.
14343                 return;
14344             }
14345         }
14346     }
14347 
14348     for(i=1; i<=MAX_ACCEPTABLE_VRATIO; i++)
14349     {
14350         if((u16VactSpace%i) != 0)
14351         {
14352             // The u16VactSpace must be divisible by the prescaling ratio
14353             continue;
14354         }
14355         if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14356         {
14357             if((pSrcInfo->stCapWin.height-u16VactSpace)/i <= pSrcInfo->stDispWin.height)
14358             {
14359                 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14360                  break;
14361             }
14362             else
14363             {
14364                 continue;
14365             }
14366         }
14367         else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14368         {
14369             if((pSrcInfo->stCapWin.height-u16VactSpace)/2/i <= pSrcInfo->stDispWin.height)
14370             {
14371                 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14372                 break;
14373             }
14374             else
14375             {
14376                 continue;
14377             }
14378         }
14379         else if(IS_OUTPUT_FRAME_ALTERNATIVE())
14380         {
14381             if((pSrcInfo->stCapWin.height-u16VactSpace)/2/i <= pSrcInfo->stDispWin.height)
14382             {
14383                 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14384                 break;
14385             }
14386             else
14387             {
14388                 continue;
14389             }
14390         }
14391         else
14392         {
14393             //Default disable prescaling
14394             *pu16ScaleDst = pSrcInfo->stCapWin.height;
14395             break;
14396         }
14397     }
14398     if(i > MAX_ACCEPTABLE_VRATIO)
14399     {
14400         *pu16ScaleDst = pSrcInfo->stCapWin.height; //Disable prescaling
14401     }
14402     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Adjust_FP_PreVerDstSize:i=%u, dst=%u, eOutputMode=%u\n",
14403                  i, *pu16ScaleDst, eOutputMode);
14404 #else
14405     if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14406     {
14407         if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14408         {
14409             *pu16ScaleDst = pSrcInfo->stDispWin.height;
14410         }
14411         else if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || (IS_OUTPUT_FRAME_ALTERNATIVE()))
14412         {
14413             *pu16ScaleDst = pSrcInfo->stDispWin.height<<1;
14414         }
14415         else
14416         {
14417             //Default disable prescaling
14418             *pu16ScaleDst = pSrcInfo->stCapWin.height-u16VactSpace;
14419         }
14420         *pu16ScaleDst = *pu16ScaleDst & (~0x01);
14421     }
14422     else
14423     {
14424         if(pSrcInfo->Status2.u16PreVCusScalingDst & BIT(0))
14425         {
14426             *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst & (~0x01);
14427         }
14428         else
14429         {
14430             *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst;
14431         }
14432     }
14433 #endif
14434 }
14435 
MDrv_SC_3D_Adjust_PreScaling(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)14436 void MDrv_SC_3D_Adjust_PreScaling(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
14437                                     E_XC_3D_OUTPUT_MODE eOutputMode,
14438                                     XC_InternalStatus *pSrcInfo,
14439                                     SCALER_WIN eWindow)
14440 {
14441     MS_BOOL b3DPreVScaling=FALSE, b3DPreHScaling=FALSE;
14442     MS_U32 u32H_PreScalingRatio, u32V_PreScalingRatio, u32TempWidth;
14443     MS_BOOL bForcePreVScalingDown = FALSE;
14444     MS_BOOL bForcePreHScalingDown = FALSE;
14445     MS_U8 u8FrameNum = 0;
14446     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14447     MS_U16 u16PreHCusScalingDstAlign = 0;
14448     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14449     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14450     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14451 #if (HW_DESIGN_3D_VER != 4)
14452     if(IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14453     {
14454         //for best quality, don't do prescaling when not necessary
14455         if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14456         {
14457             b3DPreVScaling=TRUE;
14458             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14459             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14460         }
14461 
14462         if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14463         {
14464             b3DPreHScaling=TRUE;
14465             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14466             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14467         }
14468     }
14469 #endif
14470 
14471     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) ||  IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
14472     {
14473         if(IS_OUTPUT_TOP_BOTTOM())
14474         {
14475             if(pSrcInfo->bInterlace)
14476             {
14477                 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14478                 {
14479                     b3DPreVScaling=TRUE;
14480                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14481                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14482                 }
14483             }
14484             else
14485             {
14486                 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14487                 {
14488                     b3DPreVScaling=TRUE;
14489                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14490 #if(HW_DESIGN_3D_VER == 5) //monaco mode
14491                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14492 #else
14493                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14494 #endif
14495                 }
14496             }
14497         }
14498 #ifdef FA_1920X540_OUTPUT
14499         else if(IS_OUTPUT_FRAME_ALTERNATIVE()&&(!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC))
14500         {
14501             b3DPreHScaling=TRUE;
14502             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14503             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14504 
14505             b3DPreVScaling=TRUE;
14506             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14507             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height/2;
14508         }
14509 #endif
14510         else if(IS_OUTPUT_FRAME_PACKING())
14511         {
14512             b3DPreHScaling = TRUE;
14513             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14514             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14515 
14516             b3DPreVScaling=TRUE;
14517             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14518             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14519         }
14520     }
14521     else if(IS_OUTPUT_SIDE_BY_SIDE_HALF()
14522             && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
14523     {
14524         b3DPreHScaling=TRUE;
14525         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14526         pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14527 
14528         b3DPreVScaling=TRUE;
14529         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14530         pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14531     }
14532     else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
14533     {
14534         b3DPreHScaling=TRUE;
14535         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width/2;
14536         pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14537 
14538         b3DPreVScaling=TRUE;
14539         pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14540     }
14541     else if(IS_INPUT_FRAME_PACKING(eWindow))
14542     {
14543         MS_U16 u16VactVideo, u16VactSpace, u16ScaleDst = 0xFFFF;
14544         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14545         MDrv_SC_3D_Adjust_FP_PreVerDstSize(pInstance, eInputMode, eOutputMode, pSrcInfo, &u16ScaleDst, eWindow);//calculate exact pre V scaling dst, to let u16VactSpace can be totally divided
14546 
14547         if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14548         {
14549             if(IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->Status2.u16PreHCusScalingDst > pSrcInfo->stDispWin.width/2))
14550             {
14551                 b3DPreHScaling=TRUE;
14552                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14553                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14554             }
14555         }
14556 
14557         if(u16ScaleDst != 0xFFFF)
14558         {
14559 #if (HW_DESIGN_3D_VER == 4)
14560             if(1)//((g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)||(g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14561             {
14562                 if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14563                   (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14564                 {
14565                     b3DPreVScaling=TRUE;
14566                     pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14567                     pSrcInfo->Status2.u16PreVCusScalingDst = u16ScaleDst;
14568                 }
14569                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14570                          (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14571                 {
14572                     b3DPreVScaling=TRUE;
14573                     pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14574                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14575                 }
14576                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14577                          (eOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14578                 {
14579                    b3DPreVScaling=TRUE;
14580                    pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14581                    pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14582                 }
14583   #ifdef TBP_1920X2160_OUTPUT
14584                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14585                          (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14586                 {
14587                     b3DPreVScaling=TRUE;
14588                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14589                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height - u16VactSpace;
14590                 }
14591                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14592                          (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14593                 {
14594                     b3DPreVScaling=TRUE;
14595                     pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14596                     pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14597                 }
14598                 else
14599                 {
14600                     b3DPreVScaling=TRUE;
14601                     //pSrcInfo->Status2.u16PreVCusScalingSrc = u16ScaleDst;
14602                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14603                 }
14604   #else
14605                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14606                       ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14607                 {
14608                   b3DPreVScaling=TRUE;
14609                   pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14610                   pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14611                 }
14612                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14613                       ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14614                 {
14615                   b3DPreVScaling=TRUE;
14616                   pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14617                   pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14618                 }
14619                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14620                       ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14621                 {
14622                   b3DPreVScaling=TRUE;
14623                   pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14624                   pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14625                 }
14626                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14627                         (eOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14628                 {
14629                     b3DPreVScaling = TRUE;
14630                     pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14631                     pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14632                 }
14633                 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14634                        (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14635                 {
14636                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14637                     {
14638                         b3DPreVScaling=TRUE;
14639                         pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo;//pSrcInfo->stCapWin.height - u16VactSpace;
14640                         pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo/2;
14641                     }
14642                     else
14643                     {
14644                         b3DPreVScaling=TRUE;
14645                         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14646                         pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14647                     }
14648                 }
14649                 else
14650                 {
14651                     b3DPreVScaling=TRUE;
14652                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14653                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14654                 }
14655   #endif
14656             }
14657             else
14658             {
14659                 if(eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
14660                 {
14661                     if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)
14662                     {
14663                         b3DPreVScaling=TRUE;
14664                         pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo;
14665                         pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14666                     }
14667                     else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
14668                     {
14669                         b3DPreVScaling=TRUE;
14670                         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14671                         pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14672                         printf("SG FPP-FA 2205\n");
14673                     }
14674                 }
14675             }
14676 #elif (HW_DESIGN_3D_VER > 2)
14677             b3DPreVScaling = TRUE;
14678 
14679             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14680             //don't do v prescaling
14681             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14682             if(IS_INPUT_FRAME_PACKING(eWindow))
14683             {
14684                 if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14685                     && (eOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
14686                 {
14687 
14688                     b3DPreHScaling=TRUE;
14689                     pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14690                     pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14691 
14692                     b3DPreVScaling = TRUE;
14693                     pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14694                     pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14695                 }
14696             }
14697 #else
14698              b3DPreVScaling=TRUE;
14699 
14700              pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14701              //don't do v prescaling
14702              pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14703 #endif
14704          }
14705     }
14706     else if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
14707     {
14708         if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14709         {
14710             if((IS_OUTPUT_SIDE_BY_SIDE_HALF())
14711                 ||(IS_INPUT_LINE_ALTERNATIVE(eWindow)
14712                        && ((pSrcInfo->stCapWin.height >= 1440)
14713                               ||((pSrcInfo->stCapWin.width >= 3840) && (pSrcInfo->stCapWin.height >= 1080)))))
14714             {
14715                 b3DPreHScaling=TRUE;
14716                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14717 #if(HW_DESIGN_3D_VER == 5) //monaco mode
14718                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14719 #else
14720                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14721 #endif
14722             }
14723             else if (IS_OUTPUT_FRAME_PACKING())
14724             {
14725                 b3DPreHScaling = TRUE;
14726                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14727                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14728             }
14729         }
14730         // for better quality src don't use pr scaling down, but post scaling
14731         if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
14732         {
14733             b3DPreVScaling=TRUE;
14734             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14735         }
14736         else if(IS_INPUT_TOP_BOTTOM(eWindow)
14737                 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
14738         {
14739             b3DPreHScaling=TRUE;
14740             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14741             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14742 
14743             b3DPreVScaling = TRUE;
14744             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14745             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14746         }
14747     }
14748     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
14749     {
14750         if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14751         {
14752             if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14753             {
14754                 b3DPreHScaling=TRUE;
14755                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14756                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14757             }
14758             else if(IS_OUTPUT_TOP_BOTTOM())
14759             {
14760                 b3DPreVScaling=TRUE;
14761                 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14762                 if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14763                 {
14764                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14765                 }
14766                 else
14767                 {
14768                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14769                 }
14770             }
14771             else if(IS_OUTPUT_LINE_ALTERNATIVE())
14772             {
14773                 if(pSrcInfo->stCapWin.height > pSrcInfo->stDispWin.height)
14774                 {
14775                     b3DPreVScaling=TRUE;
14776                     pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14777                     pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14778                 }
14779             }
14780         }
14781     }
14782     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
14783     {
14784         MS_U16 u16VactVideo, u16VactSpace;
14785         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14786 #if (HW_DESIGN_3D_VER >= 4)
14787         if(IS_OUTPUT_FRAME_ALTERNATIVE())
14788         {
14789             b3DPreVScaling=TRUE;
14790             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14791             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14792         }
14793         else if(IS_OUTPUT_TOP_BOTTOM())
14794         {
14795             b3DPreVScaling=TRUE;
14796             pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14797             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14798         }
14799 #elif (HW_DESIGN_3D_VER >= 3)
14800         b3DPreHScaling=TRUE;
14801         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14802         pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14803 
14804         b3DPreVScaling=TRUE;
14805         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14806         pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14807 #elif (HW_DESIGN_3D_VER >= 2)
14808         b3DPreHScaling=TRUE;
14809         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14810         pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14811 
14812         b3DPreVScaling=TRUE;
14813         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14814         pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14815 #endif
14816     }
14817     else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
14818     {
14819         if(IS_OUTPUT_TOP_BOTTOM())
14820         {
14821             b3DPreHScaling=TRUE;
14822             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14823             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14824 
14825             b3DPreVScaling=TRUE;
14826             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14827             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14828         }
14829         else if(IS_OUTPUT_LINE_ALTERNATIVE())
14830         {
14831             b3DPreHScaling=TRUE;
14832             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14833             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14834 
14835             b3DPreVScaling=TRUE;
14836             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14837             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14838         }
14839         else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14840         {
14841             b3DPreHScaling=TRUE;
14842             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14843             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14844 
14845             b3DPreVScaling=TRUE;
14846             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14847             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14848         }
14849     }
14850     else if(IS_INPUT_NORMAL_2D(eWindow))
14851     {
14852         b3DPreHScaling=TRUE;
14853         b3DPreVScaling=TRUE;
14854         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14855         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14856 
14857         if (IS_OUTPUT_SIDE_BY_SIDE_HALF())
14858         {
14859             if (pSrcInfo->stCapWin.width <= pSrcInfo->stDispWin.width/2)
14860             {
14861                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14862             }
14863             else
14864             {
14865                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14866             }
14867         }
14868         else
14869         {
14870             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14871             if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14872             {
14873                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14874             }
14875             else
14876             {
14877                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14878             }
14879         }
14880     }
14881     else if(IS_INPUT_NORMAL_2D_HW(eWindow))
14882     {
14883         b3DPreHScaling = TRUE;
14884         b3DPreVScaling = TRUE;
14885         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14886         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14887 
14888         if (IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
14889         {
14890             if (pSrcInfo->stCapWin.width <= pSrcInfo->stDispWin.width/2)
14891             {
14892                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14893             }
14894             else
14895             {
14896                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14897             }
14898         }
14899         else
14900         {
14901             pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14902             if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14903             {
14904                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14905             }
14906             else
14907             {
14908                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14909             }
14910         }
14911     }
14912 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14913     else if(IS_INPUT_MODE_NONE(eWindow))
14914     {
14915         if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
14916         {
14917             b3DPreHScaling=TRUE;
14918             b3DPreVScaling=TRUE;
14919             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14920             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14921             if(pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)//line buffer limit for main and sub use same sc0 line buffer under dual view
14922             {
14923                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[Dual View] Do PreHCusScaling for UHD input\n");
14924                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width/2; //1920;
14925             }
14926             else
14927             {
14928                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14929             }
14930             if(pSrcInfo->stCapWin.height > XC_FHD_HIGH_MAX)//dual view main and sub height should equal 1k into frc
14931             {
14932                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[Dual View] Do PreVCusScaling for UHD input\n");
14933                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height/2; //1080;
14934             }
14935             else
14936             {
14937                 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14938             }
14939         }
14940     }
14941 #endif
14942 
14943     if(MDrv_SC_GetPQHSDFlag(pInstance) == TRUE)
14944     {
14945         b3DPreHScaling = FALSE;
14946         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14947         pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->u16H_SizeAfterPreScaling;
14948     }
14949 
14950     //For double HD topbottom, like 1920x2160, 1280x1440
14951     if((IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()) && (pSrcInfo->stCapWin.height >= 1440))
14952     {
14953         b3DPreVScaling = FALSE;
14954         pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14955         pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->u16V_SizeAfterPreScaling;
14956     }
14957 
14958     //handle 3d with small display window,just roughly check
14959     Hal_XC_IsForcePrescaling_3D(pInstance, pSrcInfo, &bForcePreVScalingDown, &bForcePreHScalingDown, eWindow);
14960 
14961     //special case:1080i/1080p frame packing have fclk issue
14962     Hal_SC_3D_Adjust_PreHVscaling_SaveBW(pInstance, pSrcInfo, &b3DPreHScaling,&b3DPreVScaling,bForcePreHScalingDown,bForcePreVScalingDown,eWindow);
14963 
14964     u16PreHCusScalingDstAlign = (pSrcInfo->Status2.u16PreHCusScalingDst + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
14965 
14966     //(1)protect HCusscaling size according to the line buffer
14967     if(!(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
14968        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
14969        || IS_INPUT_NORMAL_2D_HW(eWindow)
14970        || IS_INPUT_CHECK_BOARD(eWindow)
14971        || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
14972        || IS_OUTPUT_FRAME_ALTERNATIVE()
14973 #if (HW_DESIGN_3D_VER >= 4)
14974        || IS_OUTPUT_TOP_BOTTOM()
14975 #endif
14976        || MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow)
14977        )
14978        ||(IS_INPUT_FRAME_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())
14979        ||(IS_INPUT_NORMAL_2D_HW(eWindow)&&IS_OUTPUT_TOP_BOTTOM_HW())
14980        ||(IS_INPUT_NORMAL_2D_HW(eWindow)&&IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
14981        )
14982     {
14983         //These foramts will use subwindow, need check if the linebuff is enough
14984         //MS_3D_LINE_BFF_MAX is DI line buffer max
14985         if(u16PreHCusScalingDstAlign > MS_3D_LINE_BFF_MAX)
14986         {
14987             b3DPreHScaling=TRUE;
14988             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14989             pSrcInfo->Status2.u16PreHCusScalingDst = MS_3D_LINE_BFF_MAX;
14990             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "For output line buffer limit => H :PreHScaling=%s, src=%u, dst=%u\n",
14991                          (b3DPreHScaling?"Yes":"No"), pSrcInfo->Status2.u16PreHCusScalingSrc, pSrcInfo->Status2.u16PreHCusScalingDst);
14992 
14993         }
14994     }
14995 
14996     //(2)Below will check: if FB is enough or not
14997     if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
14998        (!pSrcInfo->bInterlace))
14999     {
15000 #if (HW_DESIGN_3D_VER == 5)//monaco/muji mode
15001         u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFRCMFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
15002         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15003                                                 u8FrameNum,
15004                                                 pSrcInfo->Status2.u16PreVCusScalingDst);
15005         // for input fi, memory store double piece data
15006         if((u16PreHCusScalingDstAlign*2 > u32TempWidth)&&(u32TempWidth!=0))
15007         {
15008             b3DPreHScaling=TRUE;
15009             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15010             pSrcInfo->Status2.u16PreHCusScalingDst = (u32TempWidth/2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15011         }
15012 #elif (HW_DESIGN_3D_VER > 2)
15013         u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
15014         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15015                                                 u8FrameNum,
15016                                                 pSrcInfo->Status2.u16PreVCusScalingDst);
15017         // for input fi, memory store double piece data
15018         if((u16PreHCusScalingDstAlign*2 > u32TempWidth)&&(u32TempWidth!=0))
15019         {
15020             b3DPreHScaling=TRUE;
15021             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15022             pSrcInfo->Status2.u16PreHCusScalingDst = (u32TempWidth/2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15023         }
15024 #else
15025         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15026                                                    4 /* 4 frame mode */,
15027                                                    pSrcInfo->Status2.u16PreVCusScalingDst);
15028         // for memory reason, need support 4 frame mode
15029         if((u16PreHCusScalingDstAlign > u32TempWidth)&&(u32TempWidth!=0))
15030         {
15031             b3DPreHScaling=TRUE;
15032             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15033             pSrcInfo->Status2.u16PreHCusScalingDst = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15034         }
15035 #endif
15036     }
15037     else
15038     {
15039         MS_U8 u8FrameNum = 0;
15040         if(IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
15041         {
15042             u8FrameNum = 4;//need 4 frame,pls check MDrv_SC_3D_Adjust_FrameNum
15043         }
15044 #ifdef TBP_1920X2160_OUTPUT
15045 #if (HW_DESIGN_3D_VER > 2)
15046     else if((!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
15047             && (gSrcInfo[MAIN_WINDOW].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
15048             && (MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW) == E_XC_3D_INPUT_FRAME_PACKING)
15049             && (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM))
15050         {
15051             u8FrameNum = 4;//need 4 frame,pls check MDrv_SC_3D_Adjust_FrameNum
15052         }
15053 #endif
15054 #endif
15055         else
15056         {
15057             u8FrameNum = 2;
15058             if(IS_INPUT_NORMAL_2D(eWindow))
15059             {
15060                 u8FrameNum = 3;
15061             }
15062         }
15063 
15064         u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15065                                                 u8FrameNum,
15066                                                 pSrcInfo->Status2.u16PreVCusScalingDst);
15067         if((u16PreHCusScalingDstAlign > u32TempWidth)&&(u32TempWidth!=0))
15068         {
15069             b3DPreHScaling=TRUE;
15070             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15071             pSrcInfo->Status2.u16PreHCusScalingDst = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
15072         }
15073     }
15074 
15075     //(3)alignment check
15076     if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
15077        || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
15078        || IS_INPUT_CHECK_BOARD(eWindow)
15079        || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
15080        )
15081     {
15082        //For SBS input, should make sure the Hsize/2 is even to avoid the color mismatch issue in 422 mode
15083         if(pSrcInfo->Status2.u16PreHCusScalingDst & (BIT(1)))
15084         {
15085             b3DPreVScaling=TRUE;
15086             pSrcInfo->Status2.u16PreHCusScalingDst = (pSrcInfo->Status2.u16PreHCusScalingDst>>2)<<2;
15087         }
15088     }
15089 
15090     if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
15091     {
15092         //For TPB/LAP input, should make sure the Vsize is even
15093         if(pSrcInfo->Status2.u16PreVCusScalingDst & BIT(0))
15094         {
15095             b3DPreVScaling=TRUE;
15096             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingDst & ~0x01;
15097         }
15098     }
15099 
15100     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreScaling for H :PreHScaling=%s, src=%u, dst=%u\n",
15101                  (b3DPreHScaling?"Yes":"No"), pSrcInfo->Status2.u16PreHCusScalingSrc, pSrcInfo->Status2.u16PreHCusScalingDst);
15102 
15103     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreScaling for V :PreVScaling=%s, src=%u, dst=%u\n",
15104                  (b3DPreVScaling?"Yes":"No"), pSrcInfo->Status2.u16PreVCusScalingSrc, pSrcInfo->Status2.u16PreVCusScalingDst);
15105 
15106     if(b3DPreVScaling || b3DPreHScaling)
15107     {
15108         if(b3DPreHScaling && MDrv_SC_GetPQHSDFlag(pInstance))
15109         {
15110             MDrv_SC_SetPQHSDFlag(pInstance, FALSE);//Scaling is changed, ignore PQ setting
15111         }
15112         pSrcInfo->Status2.bPreHCusScaling = TRUE;//If enable, then need Enable customer scaling both
15113         pSrcInfo->Status2.bPreVCusScaling = TRUE;
15114 
15115         // this _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15116         // and _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15117         // are unavoidable case under current scaler architecture
15118         // please be awared and do not remove these two unless
15119         // refactor the archiecture
15120         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15121         MDrv_SC_set_prescaling_ratio(pInstance, pSrcInfo->enInputSourceType, pSrcInfo, eWindow);
15122         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15123         _XC_ENTRY(pInstance);
15124         if(!pSrcInfo->bPreV_ScalingDown)
15125         {
15126             Hal_SC_set_ficlk(pInstance, FALSE, eWindow );
15127         }
15128         u32H_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L) & 0x40000000;
15129         u32H_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PreScalingRatio & ~0x40000000);
15130         u32V_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L) & 0x40000000;
15131         u32V_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & ~0x40000000);
15132         if ( pSrcInfo->bPreV_ScalingDown )
15133         {
15134             Hal_SC_set_ficlk(pInstance, TRUE, eWindow );
15135         }
15136 
15137         if (eWindow == MAIN_WINDOW)
15138         {
15139             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L, u32H_PreScalingRatio);   // H pre-scaling
15140             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L, u32V_PreScalingRatio);   // V pre-scaling
15141         }
15142         else // SUB_WINDOW
15143         {
15144             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_04_L, u32H_PreScalingRatio);   // H pre-scaling
15145             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_08_L, u32V_PreScalingRatio);   // V pre-scaling
15146         }
15147         _XC_RETURN(pInstance);
15148     }
15149 }
15150 
MDrv_SC_3D_Adjust_PstScaling(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15151 void MDrv_SC_3D_Adjust_PstScaling(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
15152                                     E_XC_3D_OUTPUT_MODE eOutputMode,
15153                                     XC_InternalStatus *pSrcInfo,
15154                                     SCALER_WIN eWindow)
15155 {
15156     MS_U16 u16VactVideo=0, u16VactSpace=0;
15157     MS_BOOL b3DPstVScaling=FALSE, b3DPstHScaling=FALSE;
15158     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15159     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15160     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15161     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15162 
15163     if(IS_INPUT_FRAME_PACKING(eWindow))
15164     {
15165         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
15166     }
15167 
15168     if(IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_TOP_BOTTOM() ||
15169        IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
15170     {
15171         if(IS_INPUT_FRAME_PACKING(eWindow))
15172         {
15173             b3DPstVScaling=TRUE;
15174             b3DPstHScaling=TRUE;
15175 
15176             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15177             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15178 
15179 #if (HW_DESIGN_3D_VER >= 3)
15180   #ifdef TBP_1920X2160_OUTPUT
15181             if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
15182             {
15183                 pSrcInfo->u16VCusScalingSrc = u16VactVideo;//pSrcInfo->ScaledCropWin.height;
15184                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15185             }
15186             else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
15187                     (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15188             {
15189                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;;
15190                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15191             }
15192   #else
15193             if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
15194                (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15195             {
15196                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15197                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15198             }
15199             else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
15200                (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15201             {
15202             #if (HW_DESIGN_3D_VER == 4)
15203                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height);
15204             #else
15205                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15206             #endif
15207                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15208             }
15209             else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
15210                (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15211             {
15212                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15213                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15214             }
15215             else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE &&
15216                    (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15217             {
15218                  pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15219                  pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15220             }
15221             else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE &&
15222                    (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15223             {
15224 #if 0
15225                 pSrcInfo->u16VCusScalingSrc = u16VactVideo*2;
15226                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15227 #else
15228                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/4;
15229                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/4;
15230 #endif
15231             }
15232             else if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE &&
15233                   (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15234             {
15235                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15236                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15237             }
15238             else
15239             {
15240                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15241                 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15242             }
15243   #endif
15244 #else
15245             pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/2;
15246             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15247 #endif
15248             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "##u16V_SizeAfterPreScaling_%d, u16VCusScalingSrc=%d\n", pSrcInfo->u16V_SizeAfterPreScaling, pSrcInfo->u16VCusScalingSrc);
15249         }
15250         else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
15251         {
15252             b3DPstHScaling=TRUE;
15253             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15254             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15255 
15256             b3DPstVScaling=TRUE;
15257             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15258             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15259         }
15260         else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15261         {
15262 
15263             b3DPstHScaling=TRUE;
15264             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15265             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15266 
15267             b3DPstVScaling=TRUE;
15268             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15269             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15270         }
15271         else if(IS_INPUT_TOP_BOTTOM(eWindow))
15272         {
15273             b3DPstVScaling=TRUE;
15274             b3DPstHScaling=TRUE;
15275             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15276             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15277             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15278             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15279         }
15280         else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
15281         {
15282             b3DPstVScaling=TRUE;
15283             b3DPstHScaling=TRUE;
15284             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15285             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15286 
15287             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15288             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15289         }
15290         else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
15291         {
15292             b3DPstVScaling=TRUE;
15293             b3DPstHScaling=TRUE;
15294             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15295             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15296 
15297             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15298             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15299         }
15300         else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15301         {
15302             b3DPstVScaling=TRUE;
15303             b3DPstHScaling=TRUE;
15304             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15305             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15306 
15307             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15308             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15309         }
15310         else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15311         {
15312             b3DPstHScaling=TRUE;
15313             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15314             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15315 
15316             b3DPstVScaling=TRUE;
15317             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15318             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15319         }
15320         else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15321         {
15322             b3DPstHScaling=TRUE;
15323             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15324             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15325 
15326             b3DPstVScaling=TRUE;
15327             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15328             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15329         }
15330         else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15331         {
15332             b3DPstHScaling=TRUE;
15333             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15334             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15335 
15336             b3DPstVScaling=TRUE;
15337             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15338             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15339         }
15340 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
15341         else if(Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
15342         {
15343             b3DPstHScaling=TRUE;
15344             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15345             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15346 
15347             b3DPstVScaling=TRUE;
15348             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15349             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15350         }
15351 #endif
15352         if(IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
15353         {
15354             b3DPstVScaling=TRUE;
15355             b3DPstHScaling=TRUE;
15356             pSrcInfo->u16VCusScalingDst <<= 1; //For 3D->2D L/R frame output, set to scaling up twice
15357         }
15358     }
15359     else if(IS_OUTPUT_TOP_BOTTOM_HW())
15360     {
15361         if(IS_INPUT_NORMAL_2D_HW(eWindow))
15362         {
15363             b3DPstVScaling=TRUE;
15364             b3DPstHScaling=TRUE;
15365             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15366             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15367 
15368             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15369             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15370         }
15371     }
15372     else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
15373     {
15374         if(IS_INPUT_NORMAL_2D_HW(eWindow))
15375         {
15376             b3DPstVScaling=TRUE;
15377             b3DPstHScaling=TRUE;
15378             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15379             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15380 
15381             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15382             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15383         }
15384     }
15385     else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
15386     {
15387         if(IS_INPUT_FRAME_PACKING(eWindow))
15388         {
15389             b3DPstVScaling=TRUE;
15390             b3DPstHScaling=TRUE;
15391 
15392             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15393             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15394             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15395             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15396         }
15397         else if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
15398         {
15399             b3DPstVScaling=TRUE;
15400             b3DPstHScaling=TRUE;
15401             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15402             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15403 
15404             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15405             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15406         }
15407         else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15408         {
15409             b3DPstHScaling=TRUE;
15410             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15411             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15412 
15413             b3DPstVScaling=TRUE;
15414             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15415             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15416         }
15417         else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15418         {
15419             b3DPstVScaling=TRUE;
15420             b3DPstHScaling=TRUE;
15421             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15422             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15423             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15424             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15425         }
15426         else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15427         {
15428 
15429             b3DPstHScaling=TRUE;
15430             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15431             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15432 
15433             b3DPstVScaling=TRUE;
15434 #if (HW_DESIGN_3D_VER >= 3)
15435             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15436 #else
15437             MS_U16 u16VactVideo, u16VactSpace;
15438             MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
15439             pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/4;
15440 #endif
15441             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15442         }
15443         else if(IS_INPUT_NORMAL_2D(eWindow))
15444         {
15445             b3DPstVScaling=TRUE;
15446             b3DPstHScaling=TRUE;
15447             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15448             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2 + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15449 
15450             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15451             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15452         }
15453         else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
15454                 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
15455         {
15456             b3DPstVScaling=TRUE;
15457             b3DPstHScaling=TRUE;
15458             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15459             pSrcInfo->u16HCusScalingDst = pSrcInfo->ScaledCropWin.width;
15460 
15461             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15462             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15463         }
15464 
15465     }
15466     else if(IS_OUTPUT_FRAME_ALTERNATIVE())
15467     {
15468         if(IS_INPUT_FRAME_PACKING(eWindow))
15469         {
15470 #if (HW_DESIGN_3D_VER >= 3)
15471             if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
15472                         (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
15473             {
15474                 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
15475                     ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
15476                 {
15477                     if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
15478                     {
15479                         b3DPstHScaling=TRUE;
15480                         pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15481                         pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15482 
15483                         b3DPstVScaling=TRUE;
15484                         pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15485                         pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15486                     }
15487                     else
15488                     {
15489                         b3DPstHScaling=TRUE;
15490                         pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15491                         pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15492 
15493                         b3DPstVScaling=TRUE;
15494                         pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height / 2;
15495                         pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15496                     }
15497                 }
15498                 else
15499                 {
15500                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15501                     {
15502                         b3DPstHScaling=TRUE;
15503                         pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15504                         pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15505 
15506                         b3DPstVScaling=TRUE;
15507                         pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15508                         pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15509                     }
15510                     else
15511                     {
15512                         b3DPstHScaling=TRUE;
15513                         pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15514                         pSrcInfo->u16HCusScalingDst = pSrcInfo->ScaledCropWin.width;
15515 
15516                         b3DPstVScaling=TRUE;
15517                         pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15518                         pSrcInfo->u16VCusScalingDst = pSrcInfo->ScaledCropWin.height;
15519                     }
15520                 }
15521             }
15522             else
15523 #endif
15524             {
15525                 b3DPstVScaling=TRUE;
15526                 b3DPstHScaling=TRUE;
15527                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15528                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15529 
15530 #if (HW_DESIGN_3D_VER >= 3)
15531                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15532                 {
15533                     pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15534                 }
15535                 else
15536                 {
15537                     pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15538                 }
15539 #else
15540 
15541                 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/2;
15542 #endif
15543                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15544                 {
15545                     pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15546                 }
15547                 else
15548                 {
15549                     pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15550                 }
15551             }
15552         }
15553         else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
15554 #if ((HW_DESIGN_3D_VER <= 3) ||(HW_DESIGN_3D_VER == 5))
15555                 || IS_INPUT_TOP_BOTTOM(eWindow)
15556 #endif
15557                 )
15558         {
15559             b3DPstVScaling=TRUE;
15560             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15561             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15562         }
15563         else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15564         {
15565             b3DPstHScaling=TRUE;
15566             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15567             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15568 
15569             b3DPstVScaling=TRUE;
15570             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15571             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15572         }
15573         else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15574         {
15575 #if (HW_DESIGN_3D_VER >= 4)
15576             b3DPstHScaling=TRUE;
15577             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15578             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15579 
15580             b3DPstVScaling=TRUE;
15581             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15582             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15583 #else
15584             b3DPstHScaling=TRUE;
15585             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15586             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15587 
15588             b3DPstVScaling=TRUE;
15589 #if (HW_DESIGN_3D_VER >= 3)
15590             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15591 #else
15592             MS_U16 u16VactVideo, u16VactSpace;
15593             MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
15594             pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/4;
15595 #endif
15596             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15597 #endif
15598         }
15599         else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15600         {
15601             b3DPstHScaling=TRUE;
15602             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15603             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15604 
15605             b3DPstVScaling=TRUE;
15606             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15607             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15608         }
15609         else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15610         {
15611             b3DPstHScaling=TRUE;
15612             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15613             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15614 
15615             b3DPstVScaling=TRUE;
15616             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15617             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15618         }
15619 #ifdef FA_1920X540_OUTPUT  // for 1920x540x120Hz output
15620         else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)&&(!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC))
15621         {
15622             b3DPstHScaling=TRUE;
15623             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15624             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15625 
15626             b3DPstVScaling=TRUE;
15627             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15628             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15629         }
15630 #else
15631         else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15632         {
15633             b3DPstHScaling=TRUE;
15634             pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15635             pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15636 
15637             b3DPstVScaling=TRUE;
15638             pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15639             pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15640         }
15641 #endif
15642 
15643     }
15644     else if(IS_OUTPUT_FRAME_PACKING())
15645     {
15646         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == DOUBLEHD_1080X2P_VSIZE)
15647         {
15648             if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15649             {
15650                 b3DPstHScaling=TRUE;
15651                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15652                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15653 
15654                 b3DPstVScaling=TRUE;
15655                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15656                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15657             }
15658             else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15659             {
15660                 b3DPstHScaling=TRUE;
15661                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15662                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15663 
15664                 b3DPstVScaling=TRUE;
15665                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15666                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15667             }
15668             else if(IS_INPUT_TOP_BOTTOM(eWindow))
15669             {
15670                 b3DPstHScaling=TRUE;
15671                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15672                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15673 
15674                 b3DPstVScaling=TRUE;
15675                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15676                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15677             }
15678             else if(IS_INPUT_FRAME_PACKING(eWindow))
15679             {
15680                 b3DPstHScaling=TRUE;
15681                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15682                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15683 
15684                 b3DPstVScaling=TRUE;
15685                 pSrcInfo->u16VCusScalingSrc = u16VactVideo;
15686                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15687             }
15688             else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15689             {
15690                 b3DPstHScaling=TRUE;
15691                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15692                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15693 
15694                 b3DPstVScaling=TRUE;
15695                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15696                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15697             }
15698             else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15699             {
15700                 b3DPstHScaling=TRUE;
15701                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15702                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15703 
15704                 b3DPstVScaling=TRUE;
15705                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15706                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15707             }
15708             else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15709             {
15710                 b3DPstHScaling=TRUE;
15711                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15712                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15713 
15714                 b3DPstVScaling=TRUE;
15715                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15716                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15717             }
15718             else if(IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_HW(eWindow))
15719             {
15720                 b3DPstHScaling=TRUE;
15721                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15722                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15723 
15724                 b3DPstVScaling=TRUE;
15725                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15726                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15727             }
15728         }
15729         else if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == DOUBLEHD_720X2P_VSIZE)
15730         {
15731             if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15732             {
15733                 b3DPstHScaling=TRUE;
15734                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15735                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15736 
15737                 b3DPstVScaling=TRUE;
15738                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15739                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15740             }
15741             else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15742             {
15743                 b3DPstHScaling=TRUE;
15744                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15745                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15746 
15747                 b3DPstVScaling=TRUE;
15748                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15749                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15750             }
15751             else if(IS_INPUT_TOP_BOTTOM(eWindow))
15752             {
15753                 b3DPstHScaling=TRUE;
15754                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15755                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15756 
15757                 b3DPstVScaling=TRUE;
15758                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15759                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15760             }
15761             else if(IS_INPUT_FRAME_PACKING(eWindow))
15762             {
15763                 b3DPstHScaling=TRUE;
15764                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15765                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15766 
15767                 b3DPstVScaling=TRUE;
15768                 pSrcInfo->u16VCusScalingSrc = u16VactVideo;
15769                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15770             }
15771             else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15772             {
15773                 b3DPstHScaling=TRUE;
15774                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15775                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15776 
15777                 b3DPstVScaling=TRUE;
15778                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15779                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15780             }
15781             else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15782             {
15783                 b3DPstHScaling=TRUE;
15784                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15785                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15786 
15787                 b3DPstVScaling=TRUE;
15788                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15789                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15790             }
15791             else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15792             {
15793                 b3DPstHScaling=TRUE;
15794                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15795                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15796 
15797                 b3DPstVScaling=TRUE;
15798                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15799                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_VSIZE;
15800             }
15801             else if(IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_HW(eWindow))
15802             {
15803                 b3DPstHScaling=TRUE;
15804                 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15805                 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15806 
15807                 b3DPstVScaling=TRUE;
15808                 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15809                 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_VSIZE;
15810             }
15811         }
15812 
15813     }
15814 
15815     if((!MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow))
15816        && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == eOutputMode)
15817            || (E_XC_3D_OUTPUT_TOP_BOTTOM == eOutputMode)
15818            || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == eOutputMode)
15819            || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)))
15820     {
15821         pSrcInfo->u16HCusScalingDst += (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15822     }
15823 
15824     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16HCusScalingSrc=%d, u16HCusScalingDst=%d\n", pSrcInfo->u16HCusScalingSrc, pSrcInfo->u16HCusScalingDst)
15825     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16VCusScalingSrc=%d, u16VCusScalingDst=%d\n", pSrcInfo->u16VCusScalingSrc, pSrcInfo->u16VCusScalingDst)
15826 
15827     if(b3DPstVScaling || b3DPstHScaling)
15828     {
15829         pSrcInfo->bVCusScaling = TRUE;
15830         pSrcInfo->bHCusScaling = TRUE;
15831 
15832         // this _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15833         // and _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15834         // are unavoidable case under current scaler architecture
15835         // please be awared and do not remove these two unless
15836         // refactor the archiecture
15837         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15838         MDrv_SC_set_postscaling_ratio(pInstance, pSrcInfo, eWindow);
15839         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15840 
15841         //HVSP
15842         if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
15843         {
15844             _MLOAD_ENTRY(pInstance);
15845             if (eWindow == MAIN_WINDOW)
15846             {
15847                 //H post-scaling
15848                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_07_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>00), 0xFFFF);
15849                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>16), 0xFFFF);
15850                 //V post-scaling
15851                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>00), 0xFFFF);
15852                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>16), 0xFFFF);
15853             }
15854             else // SUB_WINDOW
15855             {
15856                 //H post-scaling
15857                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_27_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>00), 0xFFFF);
15858                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>16), 0xFFFF);
15859                 //V post-scaling
15860                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>00), 0xFFFF);
15861                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_2A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>16), 0xFFFF);
15862             }
15863             MDrv_XC_MLoad_Fire(pInstance, TRUE);
15864             _MLOAD_RETURN(pInstance);
15865         }
15866         else
15867         {
15868             _XC_ENTRY(pInstance);
15869             if (eWindow == MAIN_WINDOW)
15870             {
15871                 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio);   // H pre-scaling
15872                 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio);   // V pre-scaling
15873             }
15874             else // SUB_WINDOW
15875             {
15876                 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_27_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio);   // H pre-scaling
15877                 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_29_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio);   // V pre-scaling
15878             }
15879             _XC_RETURN(pInstance);
15880         }
15881     }
15882     }
15883 
15884 //------------------------------------------------------------------------------------------------------
15885 /// config sub win for 3d
15886 /// @param  bEn                \b IN: input  enable sub window or disable
15887 /// @return MS_BOOL                  \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
15888 //------------------------------------------------------------------------------------------------------
MDrv_XC_3D_CfgSubWin(void * pInstance,MS_BOOL bEn)15889 MS_BOOL MDrv_XC_3D_CfgSubWin(void *pInstance, MS_BOOL bEn)
15890 {
15891     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15892     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15893     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15894     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15895     if(ENABLE == bEn)
15896     {
15897         MS_U32 u32tmp;
15898         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0002, 0x0002);//Enable sub window shown on the screen
15899         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0002, 0x0002);//Force F1 use F2's register setting
15900         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, 0x0000, 0x0080);//source sync enable
15901 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15902         if(IsEnableDualMode(MAIN_WINDOW))
15903         {
15904             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L, BIT(2), BIT(2));
15905         }
15906 #endif
15907         //MDrv_ACE_3DClonePQMap(FALSE, FALSE);
15908         MS_U32 u32H_PreScalingRatio, u32V_PreScalingRatio;
15909         u32H_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L) & 0x40000000;
15910         u32H_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PreScalingRatio & ~0x40000000);
15911         u32V_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L) & 0x40000000;
15912         u32V_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & ~0x40000000);
15913         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_04_L, u32H_PreScalingRatio);   // H pre-scaling
15914         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_08_L, u32V_PreScalingRatio);   // V pre-scaling
15915         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_27_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio);  // H post-scaling
15916         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_29_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio);  // V post-scaling
15917 
15918         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L));
15919         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_59_L, (MS_U16)u32tmp);//frame number and opm/ipm seperate.
15920 
15921         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L));
15922         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_41_L, (MS_U16)u32tmp);//madi format
15923 
15924         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L));
15925         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_42_L, (MS_U16)u32tmp);
15926 
15927         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_03_L));
15928         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_43_L, (MS_U16)u32tmp, 0xCFFF);//don't copy h and v mirror
15929 
15930         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_04_L));
15931         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_44_L, (MS_U16)u32tmp, 0xBFFF);
15932 
15933         u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L));
15934         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_45_L, (MS_U16)u32tmp, 0xFDEF);
15935     }
15936     else
15937     {
15938         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0000, 0x0002);//Enable sub window shown on the screen
15939         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
15940         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, 0x0080, 0x0080);//source sync disable
15941         //MDrv_ACE_3DClonePQMap(FALSE, FALSE);
15942 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15943         if(IsEnableDualMode(MAIN_WINDOW))
15944         {
15945             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L, 0, BIT(2));
15946         }
15947 #endif
15948     }
15949 
15950     return TRUE;
15951 }
15952 #endif
15953 
MDrv_SC_3D_Disable_Crop(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15954 void MDrv_SC_3D_Disable_Crop(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
15955 {
15956 #if(HW_DESIGN_3D_VER < 1)
15957     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15958     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15959     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15960     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15961     //only 2d to 3d can do overscan for all chips
15962     if((!IS_INPUT_MODE_NONE(eWindow)) && (!IS_OUTPUT_MODE_NONE())
15963        && (!IS_INPUT_NORMAL_2D(eWindow)) && (!IS_INPUT_NORMAL_2D_HW(eWindow))
15964        && (!IS_INPUT_NORMAL_2D_INTERLACE(eWindow))
15965        && (!IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow)))
15966     {
15967         pSrcInfo->ScaledCropWin.x     = 0;
15968         pSrcInfo->ScaledCropWin.y     = 0;
15969         pSrcInfo->ScaledCropWin.width = pSrcInfo->u16H_SizeAfterPreScaling;
15970         pSrcInfo->ScaledCropWin.height= pSrcInfo->u16V_SizeAfterPreScaling;
15971     }
15972 #endif
15973 }
15974 
_XC_Set_3D_MiuDualModeFetchOffset(XC_RESOURCE_PRIVATE * pXCResourcePrivate,MS_U32 u32DeviceID,SCALER_WIN eWindow)15975 static void _XC_Set_3D_MiuDualModeFetchOffset(XC_RESOURCE_PRIVATE* pXCResourcePrivate, MS_U32 u32DeviceID, SCALER_WIN eWindow)
15976 {
15977 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15978     if (IsEnableDualMode(eWindow))
15979     {
15980         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
15981         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
15982         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset), 0x1FFF);  //F2_1 OPM offset
15983         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch), 0x0FFF);  //F2_1 OPM fetch number
15984         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset), 0x1FFF);  //F2_1 OPM offset
15985         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch), 0x0FFF);  //F2_1 OPM fetch number
15986         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
15987         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
15988         SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
15989     }
15990 #endif
15991 
15992 }
15993 
MDrv_XC_3D_LoadReg(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15994 MS_BOOL MDrv_XC_3D_LoadReg(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
15995                            E_XC_3D_OUTPUT_MODE eOutputMode,
15996                            XC_InternalStatus *pSrcInfo,
15997                            SCALER_WIN eWindow)
15998 {
15999     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
16000     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
16001     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
16002     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
16003 
16004 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16005     // SC1 no 3D
16006     if (psXCInstPri->u32DeviceID == 1)
16007     {
16008 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16009         if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode cannot skip
16010 #endif
16011         {
16012             return TRUE;
16013         }
16014     }
16015 #endif
16016     //Get panel size output width
16017     MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
16018     MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
16019     if(u32OutputWidth==0)
16020         u32OutputWidth = 0xf00;
16021     if(PanelHeight==0)
16022         PanelHeight = 0x870;
16023 
16024 #if ((HW_DESIGN_3D_VER == 1))
16025     _XC_ENTRY(pInstance);
16026     MDrv_SC_3D_Set2TapMode(pInstance, pSrcInfo, eWindow);
16027     _XC_RETURN(pInstance);
16028 #elif (HW_DESIGN_3D_VER >= 2)
16029     MS_BOOL b3Dstate =
16030 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16031                        Hal_SC_3D_IsDualViewMode(pInstance,eWindow)  ||
16032 #endif
16033                        ((!IS_INPUT_MODE_NONE(eWindow))
16034                        && (!IS_OUTPUT_MODE_NONE())
16035                        && ((!IS_INPUT_NORMAL_2D_HW(eWindow)) || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() ||IS_OUTPUT_FRAME_PACKING()));
16036 
16037     _XC_ENTRY(pInstance);
16038 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16039     static MS_BOOL _bCopyMainOPBase = FALSE;
16040     static MS_U32 _u32SubBaseAddr1 = 0x00000000;
16041     static MS_U32 _u32SubBaseAddr2 = 0x00000000;
16042 #endif
16043 
16044 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16045     MS_BOOL bChangeDisplaySize = FALSE;
16046     MS_U16 u16VMainDisStart = 0;
16047     MS_U16 u16VMainDisEnd = 0;
16048     MS_U16 u16VSubDisStart = 0;
16049     MS_U16 u16VSubDisEnd = 0;
16050     MS_U16 u16VDispwinOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
16051 #endif
16052 
16053     //First init all control register to HW init value
16054     if((pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
16055        && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode) || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
16056     {
16057 #if (HW_DESIGN_3D_VER == 5)
16058         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0404, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0x0404 in monaco 2D mode
16059         //Hal_SC_set_fmclk(psXCInstPri, DISABLE);
16060         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0x0000, 0x0001);// 3d enable
16061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0x0000, 0x0082);//HDMI 3D field select toggle enable, OP 3D mode enable
16062         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, 0x0000, BIT(7));
16063         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0, BIT(4));//F2 IPM 3D LR invert
16064         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0, BIT(11)|BIT(8)|BIT(1)|BIT(0));//[11]opm3d: OPM SBS using PIP
16065 
16066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_19_L, 0x0000, 0x8800);//clear opm/ipm frame number separate control
16067         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0x0, BIT(8));//Enable free run 3D LR flag
16068         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_06_L, 0x0000, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16069 
16070         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0000, 0x0003);//Enable free run 3D LR flag
16071         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_22_L, 0x0, BIT(4));//reg_ext_lr_en
16072 
16073         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0801, 0x0013);
16074         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
16075         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0000, 0x8000);//reg_sw_tg_en
16076         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK57_1C_L, 0x00); //Offset main/sub display window in right direction
16077         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0, BIT(5)); //Enable HD side by side line buffer mode
16078         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_18_L, 0x0, BIT(9));//fbl 3d enable
16079         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, 0x0000, BIT(5));   //pixel base active 3d
16080         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, 0x0000, BIT(14)); //block base active 3d
16081 
16082         if(_bCopyMainOPBase)
16083         {
16084             _bCopyMainOPBase = FALSE;
16085             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, _u32SubBaseAddr1);
16086             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L, _u32SubBaseAddr2);
16087         }
16088 #endif
16089         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0000, 0x0002);//Enable sub window shown on the screen
16090         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
16091         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0000, 0x0001);// 3d enable
16092         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0000, 0x0082);//HDMI 3D field select toggle enable, OP 3D mode enable
16093         Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//HDMI 3D field select toggle disable
16094         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, 0x0000, 0x8000);// 3D LR side-by-side to line-to-line enable
16095         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0000, 0x0130);//external lr signal enable and swap
16096 #if SUPPORT_SEAMLESS_ZAPPING
16097         if(Hal_SC_GetSeamlessZappingStatus(pInstance, eWindow))
16098         {
16099             if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, BIT(0)|BIT(1)) == (BIT(0)|BIT(1)))
16100             {
16101                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0000, 0xFFFC);//hw 3d TYPE, L/R split etc.
16102             }
16103         }
16104         else
16105 #endif
16106         {
16107             //SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0000);//hw 3d TYPE, L/R split etc.
16108             Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_OFF);
16109             Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16110             Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16111         }
16112         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0000);//FPP, FPI, FIdA related control
16113         Hal_SC_3D_SetActiveVideoHeight(pInstance, 0x0000);
16114         Hal_SC_3D_SetActiveBlankSize0(pInstance, 0x0000);
16115         Hal_SC_3D_SetActiveBlankSize1(pInstance, 0x0000);
16116 
16117         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x00, BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
16118         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x00, 0x010F); //resample, [8]enable
16119 
16120         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0, BIT(4));//F2 IPM 3D LR invert
16121         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(11)|BIT(8)|BIT(1)|BIT(0));//[11]opm3d: OPM SBS using PIP
16122                                                                 //[8] F2 OPM 3D LR invert
16123                                                                 //[1] bsel_r_toggle_en
16124         #if 1                                                        //[0] bsel_r_inv
16125         ///for 3D film issue
16126         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x0000);
16127         #endif
16128         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0200, 0x0300);//reg_bk_field_sel_f2
16129 
16130 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
16131         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,0x00, BIT(2));//reg_force_fe2_en
16132 #endif
16133 
16134 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16135         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_05_L, 0x0200, BIT(9));//Enable OPM F1 register
16136 #endif
16137         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, 0x0000, 0x8800);//clear opm/ipm frame number separate control
16138         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, 0x00); //Offset main/sub display window in right direction
16139         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Enable HD side by side line buffer mode
16140 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
16141         if(pSrcInfo->bInterlace)
16142         {
16143             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
16144         }
16145 #endif
16146         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0000, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16147         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_FCLK, ENABLE, MAIN_WINDOW);//normal 2D and 3D format except checkboard should enable fclock
16148         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(9));//fbl 3d enable
16149         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_34_L, 0x0, BIT(15));//fbl 3d eco
16150         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0, BIT(8));//Enable free run 3D LR flag
16151         Hal_SC_3D_enable_FALLRR_out(pInstance, FALSE);//disable FA LLRR out for 4k0.5k@240
16152 #if(HW_2DTO3D_VER== 4) //monet
16153         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(14)|BIT(13)|BIT(7));//TB out 3D depth enable
16154         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(3));//SBS out 3D depth enable
16155 #endif
16156 #if(SUPPORT_SC0_SUB_WIN == FALSE)
16157         //monet top/bot 3d mode using the same buffer
16158         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_23_L, 0, BIT(11));
16159         //monet has no pip
16160         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11), BIT(11));
16161 #endif
16162 
16163 #if ENABLE_T3D_DEBUG
16164         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_65_L, 0x0000, 0x8000);//disable  principal black-bar
16165         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4D_L, 0x0000, 0x8000);//disable  left black-bar
16166         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4B_L, 0x0000, 0x0002);//disable Right black-bar
16167 #endif
16168 
16169 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16170         // restore sub
16171         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_12_L, 0x1FFF, 0x1FFF);
16172         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_13_L, 0x1FFF, 0x1FFF);
16173 
16174         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_10_L, 0x3FFF, 0x3FFF);
16175         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_11_L, 0x3FFF, 0x3FFF);
16176 #endif
16177 
16178 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16179         Hal_SC_3D_Set_DualView(pInstance,FALSE);
16180 #endif
16181 
16182     }
16183     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Windows[%u] eInputMode=%u, eOutputMode=%u, b3Dstate=%u\n", eWindow, eInputMode, eOutputMode, b3Dstate);
16184 
16185 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16186     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
16187     {
16188         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
16189         {
16190             // force 4k2k to FSC case, need to make post-scaling to displayV*2 first
16191             gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y*2;
16192             gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height*2;
16193             bChangeDisplaySize = TRUE;
16194 
16195             // for custom scaling case
16196             if(gSrcInfo[eWindow].bVCusScaling)
16197             {
16198                 gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst*2;
16199             }
16200             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u  W: %4u  y: %4u  H: %4u ,u16VCusScalingDst : %u\n",
16201                                    gSrcInfo[eWindow].stDispWin.x,
16202                                    gSrcInfo[eWindow].stDispWin.width,
16203                                    gSrcInfo[eWindow].stDispWin.y,
16204                                    gSrcInfo[eWindow].stDispWin.height,
16205                                    gSrcInfo[eWindow].u16VCusScalingDst);
16206         }
16207     }
16208 #endif
16209 
16210     if(IS_INPUT_MODE_NONE(eWindow)
16211        || IS_OUTPUT_MODE_NONE()
16212        || (IS_INPUT_NORMAL_2D_HW(eWindow) && (!IS_OUTPUT_TOP_BOTTOM_HW()) && (!IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
16213        )
16214     {
16215         //Close 3d if previous 3d state is enabled
16216         if(   (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
16217            && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
16218            && ((pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_NORMAL_2D_HW)
16219               || (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
16220               || (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)))
16221         {
16222             MDrv_XC_EnableCLK_for_SUB(pInstance, FALSE); //Disable 3D, so disable sub window clk here
16223             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
16224             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
16225             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
16226             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
16227 
16228 
16229             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_MODE_NONE)
16230             {
16231                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
16232                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
16233                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
16234                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
16235             }
16236 
16237             // in 3d-->pip case, becuase sub window has hw limit, we cannot disable sub input source, there is some sw patch here.
16238             // make sub window back to init status. copy actions from MApi_XC_Init();
16239             MDrv_XC_init_fbn_win(pInstance, SUB_WINDOW);
16240             MDrv_XC_FilLineBuffer(pInstance, ENABLE, SUB_WINDOW);
16241 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16242             Hal_SC_3D_Set_DualView(pInstance,FALSE);
16243 #endif
16244         }
16245     }
16246     else
16247     {
16248 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16249         if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
16250 #endif
16251         {
16252             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, BIT(9));//Enable OPM F1 register
16253         }
16254 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16255         if(_bCopyMainOPBase == FALSE)
16256         {
16257             _bCopyMainOPBase = TRUE;
16258             _u32SubBaseAddr1 = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L);
16259             _u32SubBaseAddr2 = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L);
16260 
16261             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L,SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_10_L));
16262             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L,SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_12_L));
16263         }
16264         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_05_L, 0x0000, BIT(9));//Enable OPM F1 register
16265 #endif
16266     }
16267     _XC_RETURN(pInstance);
16268 
16269     if(b3Dstate)
16270     {
16271         //input part
16272 
16273         //because prescaling and postscaling function will use pq functions
16274         //and pq will use mutex protect, so we should release mutex for these two cases.
16275         MDrv_SC_3D_Adjust_PreScaling(pInstance, eInputMode, eOutputMode, pSrcInfo, eWindow);
16276         MDrv_SC_set_crop_window(pInstance, pSrcInfo, eWindow);
16277         //monaco/muji 3D mode need control sub for some output format, or else the edge of object in the image may shake
16278 #if (HW_DESIGN_4K2K_VER == 4)
16279         Hal_SC_set_opm_lcnt_inv(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.bOpmLcntInv_En, eWindow);
16280         if(IS_OUTPUT_LINE_ALTERNATIVE()
16281             || IS_OUTPUT_TOP_BOTTOM_HW()|| IS_OUTPUT_TOP_BOTTOM()
16282             || IS_OUTPUT_SIDE_BY_SIDE_HALF()|| IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
16283             || IS_OUTPUT_FRAME_PACKING())
16284         {
16285             Hal_SC_set_opm_lcnt_inv(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.bOpmLcntInv_En, SUB_WINDOW);
16286         }
16287 #endif
16288         MDrv_SC_3D_Adjust_PstScaling(pInstance, eInputMode, eOutputMode, pSrcInfo, eWindow);
16289     }
16290 
16291     _XC_ENTRY(pInstance);
16292 
16293     if(!IS_INPUT_MODE_NONE(eWindow)
16294        || !IS_OUTPUT_MODE_NONE())
16295     {
16296 #if(HW_6TAP_MODE_SUPPORT == FALSE)
16297         // sram bypass for maserati in 3D mode. PQ is 6 tap mode. Line buffer is not enough because 12 line mode is disabled in 3D mode.
16298         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
16299 #endif
16300     }
16301 
16302     //patch of muji U01 HW bug, disable compress mode when input is interlace and 3D output is not none
16303 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16304     if (MDrv_ReadByte(REG_CHIP_REVISION) < 1)//muji U02 fix
16305     {
16306         if((E_XC_3D_OUTPUT_MODE_NONE != MDrv_XC_Get_3D_Output_Mode(pInstance))
16307             && (TRUE == pSrcInfo->bInterlace))
16308         {
16309             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x03, 0x03);
16310             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_01_L, 0x03, 0x03);
16311         }
16312     }
16313     else
16314     {
16315         //ECO bit
16316         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(2), BIT(2));
16317     }
16318 
16319     //patch for muji U01, other output mode don't need enable black bar when setting depth
16320     if (MDrv_ReadByte(REG_CHIP_REVISION) < 1)
16321     {
16322         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_65_L, 0x0000, 0x8000);//principal black-bar enable
16323         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4D_L, 0x0000, 0x8000);//Left black-bar enable
16324         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4B_L, 0x0000, 0x0002);//Right black-bar enable
16325     }
16326 #endif
16327 
16328     //// The BWS mode need to enabled both Main and Sub
16329     if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
16330     {
16331         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_30_L, BIT(14), BIT(14));
16332 
16333         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, BIT(0)))
16334         {
16335             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, BIT(1), BIT(1));
16336         }
16337         else
16338         {
16339             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x00, BIT(1));
16340         }
16341     }
16342     else
16343     {
16344         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_30_L, 0x00, BIT(14));
16345     }
16346 
16347     if(b3Dstate)
16348     {
16349         if(pSrcInfo->bHCusScaling || pSrcInfo->bVCusScaling || pSrcInfo->Status2.bPreVCusScaling || pSrcInfo->Status2.bPreHCusScaling)
16350         {
16351         #if(HW_DESIGN_3D_VER == 5) //monaco mode
16352             MDrv_SC_set_frcm_fetch_number_limit(pInstance, pSrcInfo, eWindow);
16353         #else
16354             MDrv_SC_set_fetch_number_limit(pInstance, pSrcInfo, eWindow);
16355         #endif
16356         }
16357 
16358         if (eWindow == MAIN_WINDOW)
16359         {
16360             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DNRBase0);//DNR OPM base set the same
16361             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
16362 #ifdef UFO_XC_SUPPORT_DUAL_MIU
16363             if (IsEnableDualMode(eWindow))
16364             {
16365                 Hal_SC_set_Dual_DNRBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualDNRBase0*BYTE_PER_WORD),  eWindow); //F2_1 IPM base addr
16366                 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), eWindow);  //F2_1 OPM base addr
16367             }
16368 #endif
16369 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16370             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_WBase0);//DNR OPM base set the same
16371             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_10_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//frcm_rbase0 for main
16372             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//frcm_rbase0 for sub
16373 #endif
16374             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_12_L, 0x0000, 0x1FFF);//The starting address of f2 stored at line buffer
16375         }
16376 #if (HW_DESIGN_3D_VER == 4)
16377         if((IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16378             (IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_FRAME_L())||
16379             (IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_FRAME_R())||
16380             (IS_INPUT_LINE_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16381             (IS_INPUT_FIELD_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16382             (IS_INPUT_FRAME_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16383             (IS_INPUT_TOP_BOTTOM(eWindow)&&IS_OUTPUT_TOP_BOTTOM()&&(pSrcInfo->u16H_SizeAfterPreScaling > MS_3D_LINE_BFF_MAX))
16384            )
16385         {
16386             //The starting address of f1 stored at line buffer
16387             //in A5, Main and Sub window will use the (1920+960) in 2Tap st the same time
16388             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, 0x00, 0x1FFF);
16389             // When main and sub is start from 0, it means the sub win don't need Fill the sub windows line buffer in vertical blanking
16390             // in case the bandwidth of sub window is not enough. we will let sub window to work on v blanking area.
16391             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(10)); //[10]reg_vblank_main
16392 
16393             if (IsVMirrorMode(eWindow))
16394             {
16395                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11), BIT(11)); //[11]reg_vblank_sub
16396             }
16397             else //non mirror
16398             {
16399                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0 , BIT(11)); //[11]reg_vblank_sub
16400             }
16401         }
16402         else
16403 #endif
16404         if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
16405         {
16406             MDrv_SC_3D_Set2TapMode(pInstance, pSrcInfo, eWindow);
16407         }
16408         else
16409         {
16410             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Disable HD side by side line buffer mode
16411 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
16412             if(pSrcInfo->bInterlace)
16413             {
16414                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
16415             }
16416 #endif
16417             HAL_SC_SetSubLineBufferOffset(pInstance, MS_3D_LINE_BFF_MAX);
16418         }
16419     }
16420 
16421     if((!MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow))
16422        && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == eOutputMode)
16423            || (E_XC_3D_OUTPUT_TOP_BOTTOM == eOutputMode)
16424            || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == eOutputMode)
16425            || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)
16426            || (E_XC_3D_OUTPUT_FRAME_PACKING== eOutputMode)))
16427     {
16428         #if(HW_DESIGN_3D_VER == 5) //monaco mode
16429         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift & ~0x01);//Main/sub display window offset in right direction
16430         #else
16431         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift);//Main/sub display window offset in right direction
16432         #endif
16433     }
16434 
16435     //normal 2d or hw 2d to 3d top bottom output or hw 2d to 3d side by side output
16436     if(IS_INPUT_NORMAL_2D(eWindow)
16437 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16438        || Hal_SC_3D_IsDualViewMode(pInstance,eWindow)
16439 #endif
16440        || (IS_INPUT_NORMAL_2D_HW(eWindow) && (IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() || IS_OUTPUT_FRAME_PACKING())))
16441     {
16442         if(IS_INPUT_NORMAL_2D(eWindow))
16443         {
16444             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is 2D\n");
16445 #if(HW_DESIGN_3D_VER >= 3) //mooney/monet mode
16446             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16447 #endif
16448         }
16449 
16450         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16451         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16452         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16453         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16454         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16455         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16456 #ifdef UFO_XC_SUPPORT_3D_DS
16457         if(MDrv_XC_Is_SupportSWDS(pInstance))
16458         {
16459             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16460         }
16461 #endif
16462 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16463         if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
16464 #endif
16465         {
16466             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0800, 0x0800);//opm3d: OPM SBS using PIP
16467         }
16468         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16469 /////------------------
16470 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16471         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16472         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16473         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16474         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16475         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16476         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16477         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0x0800, 0x0800);//opm3d: OPM SBS using PIP
16478 #endif
16479     }
16480     else if(IS_INPUT_FRAME_PACKING(eWindow))
16481     {
16482         MS_U16 u16VactVideo, u16VactSpace;
16483 #if (HW_DESIGN_3D_VER >= 3) // for A5
16484         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
16485 #else
16486         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16487 #endif
16488         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16489         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16490         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16491         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16492         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16493         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16494 #ifdef UFO_XC_SUPPORT_3D_DS
16495         if(MDrv_XC_Is_SupportSWDS(pInstance))
16496         {
16497             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16498         }
16499 #endif
16500         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16501 
16502 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16503         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16504         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16505         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16506         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16507         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16508         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16509 
16510         if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16511         {
16512             //interlace framepacking
16513 
16514             //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//reg_lr_chg_mode[1:0],reg_ini_lr[4],reg_split_half[8]
16515             Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16516             Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16517             Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16518 
16519             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16520             Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16521             Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16522             Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16523             Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16524             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16525             Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16526             Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo*2 - 1));
16527             Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo*2);
16528             Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(4*u16VactVideo - 1));
16529 
16530                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo*2, 0x0FFF);//active_hight  after VSD
16531                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo*2, 0x0FFF);//active_hight  after VSD
16532             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16533             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16534             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16535             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16536             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0003);//reg_lr_chg_mode
16537             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0000, 0x0010);//reg_lr_chg_mode
16538 
16539             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en,[11]:reg_vblank_sub
16540 
16541             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16542             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16543             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16544             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16545             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16546             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16547             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16548 
16549             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16550             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16551             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16552             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16553         }
16554         else
16555         {
16556             //progressive framepacking
16557 
16558             //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//hw 3d TYPE, L/R split
16559             Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16560             Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16561             Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16562 
16563             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x011, 0x0037);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16564             Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16565             Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16566             Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16567             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16568             Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16569             Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo - 1));
16570             Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo);
16571             Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(2*u16VactVideo - 1));
16572 
16573                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo, 0x0FFF);//active_hight  after VSD
16574                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo, 0x0FFF);//active_hight  after VSD
16575             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16576             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16577 
16578             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0013);//[2:0]reg_lr_chg_mode,[4]:reg_ini_lr
16579 
16580             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16581 
16582             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16583             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16584             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16585             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16586             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16587             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16588             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16589 
16590             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16591             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16592             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16593             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16594         }
16595 #elif (HW_DESIGN_3D_VER >= 3)
16596             if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16597             {
16598                 //interlace framepacking
16599 
16600                 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16601                 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16602                 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16603                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16604                 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16605                 Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16606                 Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16607                 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16608                 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16609 
16610                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16611                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16612                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16613                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16614 #if(HW_DESIGN_3D_VER == 3) //monet mode
16615                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16616 #endif
16617             }
16618             else
16619             {
16620                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FPP\n");
16621                 //progressive framepacking
16622 
16623                 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16624                 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16625                 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16626 
16627                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16628                 #if (HW_DESIGN_3D_VER < 4)
16629                 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16630                 #endif
16631                 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16632                 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16633                 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16634 
16635                 #if (HW_DESIGN_3D_VER >= 4)
16636                     Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16637                 #endif
16638                     Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16639 
16640                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16641                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16642                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0900, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16643 #if(HW_DESIGN_3D_VER == 3) //monet mode
16644                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16645 #endif
16646             }
16647 #else
16648             if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16649             {
16650                 //interlace framepacking
16651 
16652                 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16653                 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16654                 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16655 
16656                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16657                 Hal_SC_3D_SetActiveVideoHeight(pInstance,DOUBLEHD_1080X2I_FIELD_VSIZE);
16658                 Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16659                 Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16660 
16661                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16662                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16663                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16664                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16665             }
16666             else
16667             {
16668                 //progressive framepacking
16669 
16670                 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16671                 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16672                 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16673 
16674                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16675                 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16676                 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16677 
16678                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16679                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16680                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0900, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16681             }
16682 #endif
16683     }
16684     else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
16685     {
16686         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FA\n");
16687         MS_U16 u16VactVideo, u16VactSpace;
16688 
16689         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
16690 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16691         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16692         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16693         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16694         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16695         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16696         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16697 #ifdef UFO_XC_SUPPORT_3D_DS
16698         if(MDrv_XC_Is_SupportSWDS(pInstance))
16699         {
16700             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16701         }
16702 #endif
16703         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16704         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16705         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16706 
16707         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16708         Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16709         Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16710         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16711         Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16712         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16713         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo - 1));
16714         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo);
16715         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(2*u16VactVideo - 1));
16716 
16717                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo, 0x0FFF);//active_hight  after VSD
16718                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo, 0x0FFF);//active_hight  after VSD
16719 
16720         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, 0x0100);//reg_local_field
16721         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16722         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16723 
16724         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0003);//reg_lr_chg_mode
16725         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16726         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16727         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16728         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16729         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16730         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16731         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16732         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16733 
16734         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16735         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16736         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16737         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16738 #else
16739         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16740         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16741         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16742 
16743         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16744         Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16745         Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16746         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16747 
16748         #if (HW_DESIGN_3D_VER >= 3)
16749             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16750         #endif
16751 
16752         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16753         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16754         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16755         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16756         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16757         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16758 #ifdef UFO_XC_SUPPORT_3D_DS
16759         if(MDrv_XC_Is_SupportSWDS(pInstance))
16760         {
16761             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16762         }
16763 #endif
16764         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16765         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16766         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16767         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16768 #if(HW_DESIGN_3D_VER == 3) //monet mode
16769         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16770 #endif
16771 #endif
16772     }
16773     else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
16774     {
16775         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FA\n");
16776 
16777         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16778         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16779         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16780         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16781         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16782         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16783 #ifdef UFO_XC_SUPPORT_3D_DS
16784         if(MDrv_XC_Is_SupportSWDS(pInstance))
16785         {
16786             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16787         }
16788 #endif
16789         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16790 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16791         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0030, 0x0030);// input Vsync exist between L and R frame
16792 
16793         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0013);// hw 3d TYPE, L/R split=0
16794         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16795         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16796         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16797 
16798         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pSrcInfo->u16V_SizeAfterPreScaling, 0x0FFF);//active_hight  after VSD
16799         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, pSrcInfo->u16V_SizeAfterPreScaling, 0x0FFF);//active_hight  after VSD
16800 
16801         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16802         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16803         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, BIT(7), BIT(7));
16804 
16805         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_22_L, BIT(4), BIT(4));//reg_ext_lr_en
16806         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0001, 0x0013);//reg_lr_chg_mode
16807 
16808         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0001, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16809         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0000, 0x1000);//reg_sw_tg_en
16810 
16811         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16812 
16813         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16814         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16815         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16816         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16817         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16818         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16819         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16820         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16821 #elif (HW_DESIGN_3D_VER >= 3)
16822         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));// 3d enable
16823         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));
16824         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0030, 0x0030);// input Vsync exist between L and R frame
16825 
16826         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0103);// hw 3d TYPE, L/R split=0
16827         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16828         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16829         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16830 #if(HW_DESIGN_3D_VER == 3) //monet mode
16831         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16832 #endif
16833 #else
16834         if(pSrcInfo->bInterlace == TRUE)
16835         {
16836             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16837             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0083, 0x0080);//[8] F2 OPM 3D LR invert
16838             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0010, 0x0010);// input Vsync exist between L and R frame
16839 
16840             //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0103);// hw 3d TYPE, L/R split=0
16841             Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16842             Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16843         }
16844         else
16845         {
16846             //for progressive frame alternative case, we should disable ip 3d, enable op 3d
16847             //to let main,sub engine read opm frame data alternatively
16848             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0083, 0x0080);//[8] F2 OPM 3D LR invert
16849             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, 0x8804);//input 4 frame, output 2 frame with 3d
16850         }
16851 #endif
16852     }
16853     else if(IS_INPUT_TOP_BOTTOM(eWindow))
16854     {
16855         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is TBP\n");
16856 
16857 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16858         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16859         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16860         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16861         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16862         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16863         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16864         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16865         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16866         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16867         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16868         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16869         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16870 #ifdef UFO_XC_SUPPORT_3D_DS
16871         if(MDrv_XC_Is_SupportSWDS(pInstance))
16872         {
16873             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16874             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK32_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16875         }
16876 #endif
16877         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//hw 3d TYPE, L/R split
16878         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16879         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16880         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16881         Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height);
16882         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16883 
16884         if(pSrcInfo->bInterlace == FALSE)
16885         {
16886             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16887         }
16888         else
16889         {
16890             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/4);
16891         }
16892         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16893         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
16894         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/2);
16895         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
16896 
16897         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pSrcInfo->u16V_SizeAfterPreScaling/2, 0x0FFF);//active_hight  after VSD
16898         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, pSrcInfo->u16V_SizeAfterPreScaling/2, 0x0FFF);//active_hight  after VSD
16899 
16900         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16901         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16902 
16903         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0013);//reg_lr_chg_mode
16904 
16905         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//reg_hst_f2, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16906         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8010, 0xBFFF);//reg_hst_f2
16907         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16908         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16909         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16910         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16911         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16912 
16913         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16914         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16915         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16916         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16917 
16918 #elif (HW_DESIGN_3D_VER >= 3)
16919 
16920         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16921         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16922         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16923         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16924         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16925         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16926         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16927         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16928 #ifdef UFO_XC_SUPPORT_3D_DS
16929         if(MDrv_XC_Is_SupportSWDS(pInstance))
16930         {
16931             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16932         }
16933 #endif
16934         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16935         Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height);
16936         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16937 
16938         if(pSrcInfo->bInterlace == FALSE)
16939         {
16940             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16941         }
16942         else
16943         {
16944             Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/4);
16945         }
16946 
16947         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16948         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16949 
16950         if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(5)) == BIT(5))
16951         {
16952             // If use 2Tap mode, need to disable PQ scaling filter
16953             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
16954         }
16955 #if(HW_DESIGN_3D_VER == 3) //monet mode
16956         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16957 #endif
16958 #else
16959         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16960         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16961         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16962         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16963         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16964         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16965         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16966 #ifdef UFO_XC_SUPPORT_3D_DS
16967         if(MDrv_XC_Is_SupportSWDS(pInstance))
16968         {
16969             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
16970         }
16971 #endif
16972         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16973         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16974 
16975         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16976         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16977         if(pSrcInfo->bInterlace == FALSE)
16978         {
16979             Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/2);
16980         }
16981         else
16982         {
16983             Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/4);
16984         }
16985 
16986 
16987 #endif
16988     }
16989     else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
16990     {
16991         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is LA\n");
16992         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16993         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16994         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16995         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16996         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16997         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16998 #ifdef UFO_XC_SUPPORT_3D_DS
16999         if(MDrv_XC_Is_SupportSWDS(pInstance))
17000         {
17001             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17002         }
17003 #endif
17004         _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
17005 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17006 
17007         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0003, 0x0113);//hw 3d TYPE, L/R idx
17008         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17009         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17010         Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
17011         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
17012         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17013         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
17014         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17015         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
17016 
17017         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17018         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling/2), 0x0FFF);//active_hight  after VSD
17019         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling/2), 0x0FFF);//active_hight  after VSD
17020         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17021         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17022         {
17023             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17024         }
17025         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
17026         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17027         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17028         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17029         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17030         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17031         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17032         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17033         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17034         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17035         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17036 
17037         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_op1_frcm_cnnet_spthalf_f2
17038         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17039 
17040         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17041         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17042         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17043         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17044         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17045         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17046         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17047         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
17048         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17049         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
17050 
17051 #else
17052         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
17053         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17054 
17055         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0003, 0x0013);//hw 3d TYPE, L/R idx
17056         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17057         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17058         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
17059 #if (HW_DESIGN_3D_VER >= 3)
17060         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17061             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17062 #if(HW_DESIGN_3D_VER == 3) //monet mode
17063         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17064 #endif
17065 #endif
17066 #endif
17067     }
17068     else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
17069     {
17070         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is SBSH\n");
17071 
17072         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17073         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17074         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2 + 1) & ~0x1;
17075         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//OPM offset
17076         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//F1 OPM OFFSET
17077 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17078         if(IsEnableDualMode(eWindow))
17079         {
17080 #ifdef UFO_XC_SUPPORT_3D_DS
17081             if(MDrv_XC_Is_SupportSWDS(pInstance))
17082             {
17083                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17084                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM fetch number
17085                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17086                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17087             }
17088             else
17089 #endif
17090             {
17091             SC_W2BYTEMSK(0, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
17092             SC_W2BYTEMSK(0, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
17093             SC_W2BYTEMSK(0, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17094             SC_W2BYTEMSK(0, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17095         }
17096         }
17097 #endif
17098 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17099         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17100         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//OPM FETCH
17101         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17102         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17103         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17104         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17105         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1, 0x1FFF);//OPM offset
17106         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17107         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1, 0x1FFF);//F1 OPM OFFSET
17108         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//OPM FETCH
17109         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17110 #ifdef UFO_XC_SUPPORT_3D_DS
17111         if(MDrv_XC_Is_SupportSWDS(pInstance))
17112         {
17113             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17114             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK32_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17115         }
17116 #endif
17117         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17118         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17119         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17120         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17121         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17122         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17123         {
17124             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17125             Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17126         }
17127         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17128         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17129         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17130         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17131 
17132         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17133         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17134 
17135         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17136         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17137         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17138         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17139         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17140         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17141         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17142         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17143         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17144         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17145         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17146         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_op1_frcm_cnnet_spthalf_f2
17147         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17148         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17149         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17150         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17151 #else
17152 
17153 #ifdef UFO_XC_FB_LEVEL
17154         if((pSrcInfo->eFBLevel == E_XC_FB_LEVEL_FBL) || (pSrcInfo->bR_FBL == E_XC_FB_LEVEL_RFBL_DI))
17155 #else
17156         if(pSrcInfo->bFBL || pSrcInfo->bR_FBL)
17157 #endif
17158         {
17159             if(MDrv_SC_3D_IsSupportFBL3D())
17160             {
17161                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = pSrcInfo->u16H_SizeAfterPreScaling / 2;
17162 
17163                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);//OPM FETCH
17164                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);//F1 OPM FETCH
17165 #ifdef UFO_XC_SUPPORT_3D_DS
17166         if(MDrv_XC_Is_SupportSWDS(pInstance))
17167         {
17168             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(REG_SC_BK12_57_L, pSrcInfo->u16H_SizeAfterPreScaling / 2), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17169         }
17170 #endif
17171 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17172                 if(IsEnableDualMode(eWindow))
17173                 {
17174 #ifdef UFO_XC_SUPPORT_3D_DS
17175                     if(MDrv_XC_Is_SupportSWDS(pInstance))
17176                     {
17177                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17178                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17179                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 IPM total fetch
17180                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17181                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 Dual sub OPM total fetch
17182 
17183                     }
17184                     else
17185 #endif
17186                     {
17187                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17188                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17189                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
17190                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, 0x1FFF);  //F2 OPM total fetch
17191                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, 0x1FFF);  //F2 Dual sub OPM total fetch
17192                 }
17193                 }
17194 #endif
17195 #ifdef UFO_XC_SUPPORT_3D_DS
17196                 if(MDrv_XC_Is_SupportSWDS(pInstance))
17197                 {
17198                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17199                 }
17200                 else
17201 #endif
17202                 {
17203                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);
17204                 }
17205                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(9), BIT(9));//fbl 3d enable
17206                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_34_L, BIT(15), BIT(15));//fbl 3d eco
17207             }
17208             else
17209             {
17210                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: not support 3d under FBL!\n");
17211             }
17212         }
17213         else
17214         {
17215             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1;
17216 
17217             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//OPM FETCH
17218             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17219 #ifdef UFO_XC_SUPPORT_3D_DS
17220         if(MDrv_XC_Is_SupportSWDS(pInstance))
17221         {
17222             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17223         }
17224 #endif
17225 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17226             if(IsEnableDualMode(eWindow))
17227             {
17228                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17229                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17230                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
17231                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);  //F2 OPM total fetch
17232                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);  //F2 Dual sub OPM total fetch
17233             }
17234 #endif
17235 
17236             //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17237             Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17238             Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17239             Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17240             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17241             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17242             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17243             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17244             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17245             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17246 #if (HW_DESIGN_3D_VER >= 3)
17247         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17248             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17249 #endif
17250         }
17251 #if(HW_DESIGN_3D_VER == 3) //monet mode
17252         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17253 #endif
17254 #endif
17255     }
17256     else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
17257     {
17258         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is SBSF\n");
17259 
17260         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17261         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17262         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + 1) & ~0x1, 0x1FFF);//OPM offset
17263         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//OPM FETCH
17264         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + 1) & ~0x1, 0x1FFF);//F1 OPM OFFSET
17265         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17266 #ifdef UFO_XC_SUPPORT_3D_DS
17267         if(MDrv_XC_Is_SupportSWDS(pInstance))
17268         {
17269             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17270         }
17271 #endif
17272 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17273         if(IsEnableDualMode(eWindow))
17274         {
17275 #ifdef UFO_XC_SUPPORT_3D_DS
17276             if(MDrv_XC_Is_SupportSWDS(pInstance))
17277             {
17278                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17279                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM fetch number
17280                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17281                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17282                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17283                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17284                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 IPM total fetch
17285                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17286                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17287 
17288             }
17289             else
17290 #endif
17291             {
17292             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
17293             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
17294             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17295             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17296             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17297             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17298             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
17299             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17300             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17301         }
17302         }
17303 #endif
17304 
17305         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17306         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17307         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17308         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17309         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17310         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17311         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17312         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17313         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17314         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17315         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17316 #if (HW_DESIGN_3D_VER >= 3)
17317 
17318         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17319             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17320 #endif
17321     }
17322     else if(IS_INPUT_CHECK_BOARD(eWindow))
17323     {
17324         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is CKB\n");
17325 
17326         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset/2 + 1) & ~0x1;
17327         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch  + 1) & ~0x1;
17328 
17329         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17330         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17331         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
17332         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
17333         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
17334         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
17335 #ifdef UFO_XC_SUPPORT_3D_DS
17336         if(MDrv_XC_Is_SupportSWDS(pInstance))
17337         {
17338             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17339         }
17340 #endif
17341 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17342         if(IsEnableDualMode(eWindow))
17343         {
17344 #ifdef UFO_XC_SUPPORT_3D_DS
17345             if(MDrv_XC_Is_SupportSWDS(pInstance))
17346             {
17347                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17348                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM fetch number
17349                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17350                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17351                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17352                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17353                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 IPM total fetch
17354                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17355                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17356 
17357             }
17358             else
17359 #endif
17360             {
17361             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
17362             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
17363             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17364             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17365             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17366             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17367             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
17368             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17369             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17370         }
17371         }
17372 #endif
17373 
17374 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17375         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17376         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17377         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17378         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17379         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17380         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17381         {
17382             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17383             Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17384         }
17385         Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17386         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17387         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17388         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17389         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17390 
17391         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17392         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17393 
17394         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x0005, 0x0005); //[0]pix_sep_en,[2]LR_Alt_line
17395         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0109, 0x010F); //resample line phase, [8]enable
17396         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000, 0xFFFF); //resample phase0 coef0/1
17397         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000, 0xFFFF); //resample phase1 coef0/1
17398 
17399         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17400         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17401         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17402         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17403         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17404         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17405         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1;
17406         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17407         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17408         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17409         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//OPM FETCH
17410         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17411 
17412         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17413 
17414         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17415         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17416         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17417         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17418         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17419         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17420         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17421         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17422         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_force_fe2_en
17423         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17424         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17425         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17426         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17427         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17428         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17429 
17430 #else
17431 
17432 #if (HW_DESIGN_3D_VER >= 3)
17433         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17434         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17435             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17436 #if(HW_DESIGN_3D_VER == 3) //monet mode
17437         //chcckboard use DI linebuffer, need disable fclock
17438         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);
17439         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17440 #endif
17441 #endif
17442         Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17443         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17444         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17445 
17446         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, BIT(0)|BIT(2), BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
17447 
17448 
17449         // TODO: Need to check how to setup resample
17450         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000); //resample phase0 coef0/1
17451         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000); //resample phase1 coef0/1
17452         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0109, 0x010F); //resample line phase, [8]enable
17453 
17454         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17455         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17456         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);//chcckboard use DI linebuffer, need disable fclock
17457         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17458         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17459         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17460         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17461 
17462 #endif
17463     }
17464     else if(IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
17465     {
17466         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is pixel alternative\n");
17467 
17468         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17469         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17470         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset/2 + 1) & ~0x1;
17471         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
17472         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17473         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
17474         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17475 #ifdef UFO_XC_SUPPORT_3D_DS
17476         if(MDrv_XC_Is_SupportSWDS(pInstance))
17477         {
17478             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17479         }
17480 #endif
17481 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17482         if(IsEnableDualMode(eWindow))
17483         {
17484 #ifdef UFO_XC_SUPPORT_3D_DS
17485             if(MDrv_XC_Is_SupportSWDS(pInstance))
17486             {
17487                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM offset
17488                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 IPM fetch number
17489                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17490                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17491                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM offset
17492                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2_1 OPM fetch number
17493                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 IPM total fetch
17494                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17495                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT);  //F2 OPM total fetch
17496 
17497             }
17498             else
17499 #endif
17500             {
17501             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
17502             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
17503             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17504             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17505             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF);  //F2_1 OPM offset
17506             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF);  //F2_1 OPM fetch number
17507             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
17508             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17509             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF);  //F2 OPM total fetch
17510         }
17511         }
17512 #endif
17513 
17514 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17515         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17516         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17517         Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17518         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17519         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17520         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17521         {
17522             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17523             Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17524         }
17525 
17526         Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17527         Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17528         Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17529         Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17530         Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17531 
17532         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17533         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight  after VSD
17534 
17535         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x0001, 0x0005); //[0]pix_sep_en,[2]LR_Alt_line
17536 
17537         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0105, 0x010F); //resample line phase, [8]enable
17538         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000, 0xFFFF); //resample phase0 coef0/1
17539         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000, 0xFFFF); //resample phase1 coef0/1
17540 
17541         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17542         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17543         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17544         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17545         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17546         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17547         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1;
17548         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17549         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17550         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17551         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17552         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17553 
17554         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17555 
17556         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17557         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17558 
17559         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17560         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17561         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17562         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17563         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17564         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17565         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_force_fe2_en
17566         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17567         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17568         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17569         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17570         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17571 
17572 #else
17573         Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17574         Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17575 #if (HW_DESIGN_3D_VER >= 3)
17576         if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17577             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17578 #if(HW_DESIGN_3D_VER == 3) //monet mode
17579         //chcckboard use DI linebuffer, need disable fclock
17580         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);
17581         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17582 #endif
17583 #endif
17584 
17585         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17586         Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17587         Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17588 
17589         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, BIT(0), BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
17590 
17591 
17592         // TODO: Need to check how to setup resample
17593         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000); //resample phase0 coef0/1
17594         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000); //resample phase1 coef0/1
17595         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0105, 0x010F); //resample line phase, [8]enable
17596 
17597         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17598         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17599 
17600         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);//chcckboard use DI linebuffer, need disable fclock;
17601 
17602         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17603         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17604         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17605         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17606 
17607 #endif
17608     }
17609 
17610     //below is output part
17611     if(IS_OUTPUT_FRAME_ALTERNATIVE())
17612     {
17613         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA\n");
17614         {
17615 #if (HW_DESIGN_3D_VER == 4)
17616             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
17617             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
17618 
17619             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_960x1080)
17620             {
17621                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
17622                                                +(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd-pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart)/2, VOP_DISPLAY_HEND_MASK);   // Display H end
17623                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17624                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 - 1), VOP_DE_HEND_MASK);
17625                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17626             }
17627             else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1920x540)
17628             {
17629                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17630                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd-pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart)/2, VOP_DISPLAY_VEND_MASK);
17631                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17632                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 - 1), VOP_DE_VEND_MASK);
17633             }
17634             else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1280x720)
17635             {
17636                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DISPLAY_HEND_MASK);
17637                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DISPLAY_VEND_MASK);
17638                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17639                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17640             }
17641             else
17642             {
17643                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17644                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17645                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17646                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17647             }
17648 #else
17649             //if output is FP, do not need sub window
17650             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
17651             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
17652             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
17653             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17654 #endif
17655             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(8), BIT(8));//Enable free run 3D LR flag
17656         }
17657         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## stDBreg.u16VLen =%x\n", pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
17658 #if (HW_DESIGN_3D_VER == 4)
17659         if(IS_INPUT_TOP_BOTTOM(eWindow))
17660         {
17661             pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen/2;
17662             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
17663         }
17664         else
17665 #endif
17666         {
17667             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
17668         }
17669         Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//HDMI 3D field select toggle enable
17670         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
17671         // TODO: need to double check
17672         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, FALSE, BIT(0)); // False: L flag is first, True: R flag is first
17673         //Set SRAM to linear mode
17674         if (IsVMirrorMode(eWindow))
17675         {
17676            SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
17677         }
17678 
17679         if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA)//output FA_LLRR for 4k0.5k@240Hz
17680         {
17681             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA LLRR  \n");
17682             Hal_SC_3D_enable_FALLRR_out(pInstance, TRUE);
17683 #if (HW_DESIGN_3D_VER == 3) && (HW_DESIGN_4K2K_VER != 7) //manhattan mode
17684         // 4k2k needs more time to train data so we need to delay the display time
17685         pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = VALUE_AUTO_TUNE_AREA_TRIG_4K540P;
17686         pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = VALUE_DISP_AREA_TRIG_4K540P;
17687         pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
17688         pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
17689 #endif
17690         }
17691 
17692 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17693         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
17694         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(6), BIT(6));//[6]:reg_opm_ext_lr_sel
17695         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
17696 #endif
17697 #if(HW_2DTO3D_VER == 4)
17698         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5));   //pixel base active 3d
17699         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
17700 #endif
17701 
17702 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17703         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
17704 #endif
17705 
17706 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
17707     if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
17708     {
17709         Hal_SC_3D_Set_DualView(pInstance,TRUE);
17710     }
17711 #endif
17712     }
17713     else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_TOP_BOTTOM_HW())
17714     {
17715         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is TBP\n");
17716         MS_U16 u16VactVideo, u16VactSpace;
17717         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
17718 
17719 #ifdef UFO_XC_SUPPORT_3D_DS
17720         if(MDrv_XC_Is_SupportSWDS(pInstance))
17721         {
17722             if (IsVMirrorMode(eWindow))
17723             {
17724 #ifdef TBP_1920X2160_OUTPUT
17725                 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17726                 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17727                 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17728                 {
17729                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17730                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
17731                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17732                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17733                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17734                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17735                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17736                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17737 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17738                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17739                     {
17740                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17741                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, SUB_WINDOW);
17742                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17743                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, MAIN_WINDOW);
17744                     }
17745 #endif
17746                 }
17747                 else
17748 #endif
17749                 {
17750                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17751                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
17752 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17753                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17754                     {
17755                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17756                         {
17757                             u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
17758                             u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2-1;
17759                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, u16VSubDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17760                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, u16VSubDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17761                         }
17762                         else
17763                         {
17764                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17765                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17766                         }
17767                     }
17768                     else
17769 #endif
17770                     {
17771                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17772                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17773                     }
17774 
17775                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17776                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17777                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
17778                                                                                      + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
17779 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17780                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17781                     {
17782                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17783                         {
17784                             u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2 \
17785                                                       + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
17786                             u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2 -1;
17787                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17788                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17789                         }
17790                         else if(IS_OUTPUT_4K2K_60HZ_PANEL())
17791                         {
17792                             if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
17793                             {
17794                                 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
17795                                 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
17796                                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17797                                 if (u16VMainDisStart == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
17798                                 {
17799                                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
17800                                 }
17801                                 else
17802                                 {
17803                                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17804                                 }
17805                             }
17806                         }
17807                         else
17808                         {
17809                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17810                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17811                         }
17812                     }
17813                     else
17814 #endif
17815                     {
17816                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17817                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17818                     }
17819 
17820 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17821                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17822                     {
17823                         if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17824                         {
17825                             if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17826                             {
17827                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17828                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VSubDisStart, u16VSubDisEnd, SUB_WINDOW);
17829                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17830                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VMainDisStart, u16VMainDisEnd, MAIN_WINDOW);
17831                             }
17832                             else
17833                             {
17834                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17835                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd + pSrcInfo->stDispWin.height/2-1, SUB_WINDOW);
17836                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17837                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
17838                             }
17839                         }
17840                         else
17841                         {
17842                             MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17843                             MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd + pSrcInfo->stDispWin.height/2-1, SUB_WINDOW);
17844                             MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17845                             MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
17846                         }
17847                     }
17848 #endif
17849                 }
17850 
17851             }
17852             else
17853             {
17854 #ifdef TBP_1920X2160_OUTPUT
17855                 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17856                 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17857                 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17858                 {
17859                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17860                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17861                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17862                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17863                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17864                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
17865                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17866                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17867 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17868                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17869                     {
17870                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17871                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, SUB_WINDOW);
17872                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17873                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, MAIN_WINDOW);
17874                     }
17875 #endif
17876                 }
17877                 else
17878 #endif
17879                 {
17880                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17881                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17882                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
17883                                                                                      + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
17884 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17885                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17886                     {
17887                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17888                         {
17889                             u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2 \
17890                                                       + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height -1;
17891                             u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2 -1;
17892                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, u16VSubDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17893                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, u16VSubDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17894                         }
17895                         else
17896                         {
17897                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17898                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17899                         }
17900                     }
17901                     else
17902 #endif
17903                     {
17904                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17905                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17906                     }
17907 
17908                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17909                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
17910 
17911 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17912                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17913                     {
17914                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17915                         {
17916                             u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
17917                             u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2-1;
17918                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17919                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17920                         }
17921                         else if(IS_OUTPUT_4K2K_60HZ_PANEL())
17922                         {
17923                             if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
17924                             {
17925                                 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
17926                                 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
17927                                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17928                                 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
17929                                 {
17930                                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
17931                                 }
17932                                 else
17933                                 {
17934                                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17935                                 }
17936                             }
17937                         }
17938                         else
17939                         {
17940                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17941                             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17942                         }
17943                     }
17944                     else
17945 #endif
17946                     {
17947                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17948                         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17949                     }
17950 
17951 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17952                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17953                     {
17954                         if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17955                         {
17956                             if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17957                             {
17958                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17959                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VSubDisStart, u16VSubDisEnd, SUB_WINDOW);
17960                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17961                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VMainDisStart, u16VMainDisEnd, MAIN_WINDOW);
17962                             }
17963                             else
17964                             {
17965                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17966                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
17967                                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17968                                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, MAIN_WINDOW);
17969                             }
17970                         }
17971                         else
17972                         {
17973                             MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17974                             MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
17975                             MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17976                             MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, MAIN_WINDOW);
17977                         }
17978                     }
17979 #endif
17980                 }
17981             }
17982         }
17983         else
17984 #endif
17985         {
17986             if (IsVMirrorMode(eWindow))
17987             {
17988 #ifdef TBP_1920X2160_OUTPUT
17989                 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17990                 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17991                 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17992                 {
17993                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
17994                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);   // Display H end
17995                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
17996                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, 0x1FFF);
17997                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
17998                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17999                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, VOP_DISPLAY_VSTART_MASK);
18000                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, VOP_DISPLAY_VEND_MASK);
18001                 }
18002                 else
18003 #endif
18004                 {
18005 
18006                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18007                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);   // Display H end
18008 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18009                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18010                     {
18011                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18012                         {
18013                             u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
18014                             u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2-1;
18015                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, u16VSubDisStart, VOP_DISPLAY_VSTART_MASK);//Sub window display window
18016                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, u16VSubDisEnd, VOP_DISPLAY_VEND_MASK);
18017                         }
18018                         else
18019                         {
18020                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18021                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, 0x1FFF);
18022                         }
18023                     }
18024                     else
18025 #endif
18026                     {
18027                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18028                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, 0x1FFF);
18029                     }
18030 
18031                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18032                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18033                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
18034                                                                                      + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
18035 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18036                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18037                     {
18038                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18039                         {
18040                             u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2 \
18041                                                       + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
18042                             u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2 -1;
18043                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, 0x1FFF);
18044                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, 0x1FFF);
18045                         }
18046                         else if(IS_OUTPUT_4K2K_60HZ_PANEL())
18047                         {
18048                             if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
18049                             {
18050                                 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
18051                                 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
18052                                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VEND_MASK);
18053                                 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18054                                 {
18055                                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18056                                 }
18057                                 else
18058                                 {
18059                                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18060                                 }
18061                             }
18062                         }
18063                         else
18064                         {
18065                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, VOP_DISPLAY_VSTART_MASK);
18066                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18067                         }
18068                     }
18069                     else
18070 #endif
18071                     {
18072                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, VOP_DISPLAY_VSTART_MASK);
18073                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18074                     }
18075                 }
18076 
18077             }
18078             else
18079             {
18080 #ifdef TBP_1920X2160_OUTPUT
18081                 if((IS_INPUT_FRAME_PACKING(eWindow))&&
18082                 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
18083                 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
18084                 {
18085                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18086                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18087                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, 0x1FFF);
18088                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, 0x1FFF);
18089                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18090                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18091                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18092                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, VOP_DISPLAY_VEND_MASK);
18093                 }
18094                 else
18095 #endif
18096                 {
18097                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18098                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18099                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
18100                                                                                      + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) -1;
18101 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18102                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18103                     {
18104                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18105                         {
18106                             u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2 \
18107                                                       + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
18108                             u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2 -1;
18109                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, u16VSubDisStart, 0x1FFF);
18110                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, u16VSubDisEnd, 0x1FFF);
18111                         }
18112                         else
18113                         {
18114                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, 0x1FFF);
18115                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18116                         }
18117                     }
18118                     else
18119 #endif
18120                     {
18121                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, 0x1FFF);
18122                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18123                     }
18124 
18125                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18126                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18127 
18128                     if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_TOP)
18129                     {
18130                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18131                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18132                     }
18133                     else if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_BOTTOM_BOTTOM)
18134                     {
18135                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18136                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8), BIT(8));
18137                     }
18138                     else
18139                     {
18140                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(10));
18141                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18142                     }
18143 
18144 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18145                     if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18146                     {
18147                         if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18148                         {
18149                             u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
18150                             u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2-1;
18151                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18152                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18153                         }
18154                         else if(IS_OUTPUT_4K2K_60HZ_PANEL())
18155                         {
18156                             if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
18157                             {
18158                                 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart +  u16VDispwinOffset*2;
18159                                 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
18160                                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VEND_MASK);
18161                                 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18162                                 {
18163                                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18164                                 }
18165                                 else
18166                                 {
18167                                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18168                                 }
18169                             }
18170                         }
18171                         else
18172                         {
18173                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18174                             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, VOP_DISPLAY_VEND_MASK);
18175                         }
18176                     }
18177                     else
18178 #endif
18179                     {
18180                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18181                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, VOP_DISPLAY_VEND_MASK);
18182                     }
18183                 }
18184             }
18185         }
18186 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18187         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18188         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);
18189         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18190         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18191         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18192         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18193         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18194         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18195         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18196 #else
18197 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18198         if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
18199 #endif
18200         {
18201             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18202         }
18203         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18204 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18205         if(IsEnableDualMode(eWindow))
18206         {
18207             Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18208         }
18209 #endif
18210         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
18211         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18212 #if(HW_DESIGN_3D_VER == 3) //monet mode
18213         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18214 #endif
18215 #endif
18216 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18217         if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18218         {
18219             if(psXCInstPri->u32DeviceID == 0)
18220             {
18221                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18222             }
18223             else
18224             {
18225                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18226             }
18227         }
18228         else
18229 #endif
18230         {
18231             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18232             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18233         }
18234         //Set SRAM to linear mode
18235         if (IsVMirrorMode(eWindow))
18236         {
18237            SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18238         }
18239 
18240 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18241        if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18242 #endif
18243         {
18244             MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18245         }
18246 #if(SUPPORT_SC0_SUB_WIN == FALSE)
18247         MS_U16 u16SubLinebufferStart = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, 0x1FFF);//The starting address of F1 stored at line buffer
18248         MS_U16 u16MainLinebufferStart = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_12_L, 0x1FFF);//The starting address of F2 stored at line buffer
18249         if(!MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow) && (u16SubLinebufferStart == u16MainLinebufferStart))
18250         {
18251             //monet top/bot 3d mode using the same buffer
18252             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_23_L, BIT(11), BIT(11));
18253         }
18254 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18255         if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18256 #endif
18257         {
18258             //monet has no pip
18259             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0, BIT(11));
18260         }
18261 #endif
18262 
18263 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18264         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18265         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18266 
18267         if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18268         {
18269             if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18270             {
18271 #if(HW_2DTO3D_VER == 4)
18272                 //masearti manhattan mode FRC output FA
18273                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5));   //pixel base active 3d
18274                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
18275 #endif
18276                 if(bChangeDisplaySize)//restore dispwin
18277                 {
18278                     // force 4k2k to FSC case, but bk10 display window need to be original size 4k1k
18279                     gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y/2;
18280                     gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height/2;
18281                     bChangeDisplaySize = FALSE;
18282 
18283                     // for custom scaling case
18284                     if(gSrcInfo[eWindow].bVCusScaling)
18285                     {
18286                         gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst/2;
18287                     }
18288                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"change DispWin x: %4u  W: %4u  y: %4u  H: %4u ,u16VCusScalingDst : %u\n",
18289                                                gSrcInfo[eWindow].stDispWin.x,
18290                                                gSrcInfo[eWindow].stDispWin.width,
18291                                                gSrcInfo[eWindow].stDispWin.y,
18292                                                gSrcInfo[eWindow].stDispWin.height,
18293                                                gSrcInfo[eWindow].u16VCusScalingDst);
18294                 }
18295             }
18296         }
18297 #endif
18298 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18299         if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
18300         {
18301             Hal_SC_3D_Set_DualView(pInstance,TRUE);
18302         }
18303 #endif
18304     }
18305     else if(IS_OUTPUT_LINE_ALTERNATIVE())
18306     {
18307         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is LA\n");
18308 #ifdef UFO_XC_SUPPORT_3D_DS
18309         if(MDrv_XC_Is_SupportSWDS(pInstance))
18310         {
18311             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18312             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18313             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18314             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18315 
18316             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18317             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
18318             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18319             if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18320             {
18321                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
18322             }
18323             else
18324             {
18325                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18326             }
18327 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18328             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18329             {
18330                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18331                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18332                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18333                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18334                 {
18335                     MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, MAIN_WINDOW);
18336                 }
18337                 else
18338                 {
18339                     MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18340                 }
18341             }
18342 #endif
18343         }
18344         else
18345 #endif
18346         {
18347         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18348         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18349         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18350         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18351 
18352         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18353         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18354         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18355         if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18356         {
18357             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18358         }
18359         else
18360         {
18361             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18362         }
18363 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18364 #ifdef UFO_XC_SUPPORT_3D_DS
18365             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18366             {
18367                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18368                 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18369                 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18370 
18371                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18372                 {
18373                     MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, MAIN_WINDOW);
18374                 }
18375                 else
18376                 {
18377                     MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18378                 }
18379             }
18380 #endif
18381 #endif
18382         }
18383 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18384         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18385         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18386         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18387 #endif
18388 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
18389         // 4k2k needs more time to train data so we need to delay the display time
18390         // this is special in line alternative out
18391         if (   (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800)
18392             && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100))
18393         {
18394 #if (SUPPORT_3D_DS == 0)
18395             if ( MDrv_XC_GetDynamicScalingStatus(pInstance) == FALSE)
18396 #endif
18397             {
18398                 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = 0x14;
18399                 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = 0x18;
18400                 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
18401                 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
18402             }
18403         }
18404 #endif
18405 #if(HW_DESIGN_3D_VER == 3) //monet mode
18406         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18407 #endif
18408         #if 0
18409         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18410         #else
18411         ///for 3D film issue
18412         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x00, BIT(11)); //h3d_opm, sub win follow main's read bank
18413 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18414         if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
18415 #endif
18416         {
18417             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x8000);
18418         }
18419         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(11)); // Sub ahead need to disable when memory allocate is SBS
18420         #endif
18421         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);//F1 OPM BASE0 sub
18422 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18423         if(IsEnableDualMode(eWindow))
18424         {
18425             Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18426         }
18427 #endif
18428 
18429             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18430             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18431 
18432         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, 0x8000, 0x8000);// 3D LR side-by-side to line-to-line enable
18433 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18434         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18435 #endif
18436 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18437         if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18438         {
18439             //Main and Sub should load different LB offset at dual view mode
18440             if(psXCInstPri->u32DeviceID == 0)
18441             {
18442                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18443             }
18444             else
18445             {
18446                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18447             }
18448         }
18449         else
18450 #endif
18451         {
18452             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18453             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18454         }
18455 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18456         if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18457 #endif
18458         {
18459             MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18460         }
18461         //if mvop mirror, main/sub window will get switched frame, so need do LR exchange
18462         //field alternative and frame alternative input don't need do this, since main/sub
18463         //window still get the original frame
18464         if((!IS_INPUT_FIELD_ALTERNATIVE(eWindow))
18465            && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
18466         {
18467             if(MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
18468             {
18469                 if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
18470                 {
18471                     MDrv_XC_Set_3D_LR_Frame_Exchg_burst(pInstance, eWindow);
18472                 }
18473                 else
18474                 {
18475                     MDrv_XC_Set_3D_LR_Frame_Exchg(pInstance, eWindow);
18476                 }
18477             }
18478         }
18479 
18480 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18481         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18482         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18483 #endif
18484 
18485 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18486         if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
18487         {
18488             Hal_SC_3D_Set_DualView(pInstance,TRUE);
18489         }
18490 #endif
18491     }
18492     else if(IS_OUTPUT_FRAME_L())
18493     {
18494         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is L\n");
18495         MS_U16 u16VactVideo, u16VactSpace;
18496         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
18497 
18498         MDrv_XC_3D_CfgSubWin(pInstance, DISABLE);
18499         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18500         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18501         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18502         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18503         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height- 1, VOP_DE_VEND_MASK);
18504 
18505         if(IS_INPUT_FRAME_PACKING(eWindow)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
18506         {
18507             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen*2, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18508         }
18509         else
18510         {
18511             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18512         }
18513         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18514 
18515 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18516         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18517 #endif
18518     }
18519     else if(IS_OUTPUT_FRAME_R())
18520     {
18521         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is R\n");
18522         MS_U16 u16VactVideo, u16VactSpace;
18523         MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
18524 
18525 #ifdef UFO_XC_SUPPORT_3D_DS
18526         if(MDrv_XC_Is_SupportSWDS(pInstance))
18527         {
18528             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18529             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18530             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18531             Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18532         }
18533         else
18534 #endif
18535         {
18536         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18537         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18538         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18539         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18540         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height- 1, VOP_DE_VEND_MASK);
18541         }
18542 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18543         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18544         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//F1 FRCM_R BASE0
18545 #else
18546         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18547         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);//F1 OPM BASE0
18548 #endif
18549 
18550 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18551         if(IsEnableDualMode(eWindow))
18552         {
18553             Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18554         }
18555 #endif
18556 
18557         if(IS_INPUT_FRAME_PACKING(eWindow)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
18558         {
18559             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen*2, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18560             if (IsVMirrorMode(eWindow))
18561             {
18562                SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x00, 0x30); //Patch
18563             }
18564         }
18565         else
18566         {
18567             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18568         }
18569         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18570         MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18571 
18572 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18573         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18574 #endif
18575     }
18576     else if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
18577     {
18578         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is SBSH\n");
18579 #ifdef UFO_XC_SUPPORT_3D_DS
18580         if(MDrv_XC_Is_SupportSWDS(pInstance))
18581         {
18582             if (IsVMirrorMode(eWindow))
18583             {
18584                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18585                 {
18586                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18587                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18588                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//sub window display window
18589                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18590                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18591                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18592                                                                                      + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18593                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18594                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18595                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18596 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18597                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18598                     {
18599                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, SUB_WINDOW);
18600                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, SUB_WINDOW);
18601                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18602                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, MAIN_WINDOW);
18603                     }
18604 #endif
18605                 }
18606                 else
18607                 {
18608                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18609                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18610                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//sub window display window
18611                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18612                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18613                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18614                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18615                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18616 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18617                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18618                     {
18619                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, SUB_WINDOW);
18620                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18621                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18622                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18623                     }
18624 #endif
18625                 }
18626             }
18627             else
18628             {
18629                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18630                 {
18631                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18632                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18633                                                                                     + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18634                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18635                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18636                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18637                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18638                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18639                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18640                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18641 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18642                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18643                     {
18644                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18645                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, SUB_WINDOW);
18646                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, MAIN_WINDOW);
18647                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, MAIN_WINDOW);
18648                     }
18649 #endif
18650                 }
18651                 else
18652                 {
18653                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18654                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18655                                                                                     + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18656                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18657                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18658                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18659                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18660                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18661                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18662                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18663 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18664                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18665                     {
18666                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18667                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18668                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, MAIN_WINDOW);
18669                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18670                     }
18671 #endif
18672                 }
18673             }
18674 
18675         }
18676         else
18677 #endif
18678         {
18679         if (IsVMirrorMode(eWindow))
18680         {
18681             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18682             {
18683                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);
18684                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, 0x3FFF);
18685                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//sub window display window
18686                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, 0x1FFF);
18687                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, VOP_DISPLAY_HSTART_MASK);
18688                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18689                                                                                  + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18690                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18691                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
18692                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, VOP_DISPLAY_VEND_MASK);
18693                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2)-1, VOP_DE_VEND_MASK);
18694             }
18695             else
18696             {
18697                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);
18698                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, 0x3FFF);
18699                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//sub window display window
18700                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18701                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, VOP_DISPLAY_HSTART_MASK);
18702                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18703                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
18704                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18705             }
18706         }
18707         else
18708         {
18709             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18710             {
18711                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, 0x3FFF);
18712                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18713                                                                                 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18714                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18715                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18716                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, 0x1FFF);
18717                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);
18718                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, VOP_DISPLAY_HEND_MASK);
18719                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18720                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, VOP_DISPLAY_VEND_MASK);
18721                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2)-1, VOP_DE_VEND_MASK);
18722             }
18723             else
18724             {
18725                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, 0x3FFF);
18726                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18727                                                                                 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18728                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18729                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18730                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18731                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);
18732                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, VOP_DISPLAY_HEND_MASK);
18733                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18734                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18735             }
18736         }
18737         }
18738 
18739 #if 0
18740         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18741 #else
18742         ///for 3D film issue
18743         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x00, BIT(11)); //h3d_opm, sub win follow main's read bank
18744         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x8000);
18745         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(11)); // Sub ahead need to disable when memory allocate is SBS
18746 #endif
18747 
18748         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18749 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18750         if(IsEnableDualMode(eWindow))
18751         {
18752             Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*(BYTE_PER_WORD), SUB_WINDOW);
18753         }
18754 #endif
18755 
18756 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18757         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18758         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18759         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18760         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18761         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18762         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18763         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18764 #else
18765         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18766         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18767 #if(HW_DESIGN_3D_VER == 3) //monet mode
18768         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18769 #endif
18770 #endif
18771 
18772         if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_LEFT_LEFT)
18773         {
18774             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18775             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18776         }
18777         else if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_RIGHT_RIGHT)
18778         {
18779             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18780             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8), BIT(8));
18781         }
18782         else
18783         {
18784             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(10));
18785             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18786         }
18787 
18788 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
18789         // 4k2k needs more time to train data so we need to delay the display time
18790         // this is special in line alternative out
18791         if (   (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800)
18792             && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100))
18793         {
18794 #if (SUPPORT_3D_DS == 0)
18795             if ( MDrv_XC_GetDynamicScalingStatus(pInstance) == FALSE)
18796 #endif
18797             {
18798                 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = 0x14;
18799                 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = 0x18;
18800                 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
18801                 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
18802             }
18803         }
18804 #endif
18805         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18806         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18807         //Set SRAM to linear mode
18808         if (IsVMirrorMode(eWindow))
18809         {
18810            SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18811         }
18812 
18813         MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18814 
18815 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18816         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18817         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18818 #endif
18819     }
18820     else if (IS_OUTPUT_FRAME_PACKING())
18821     {
18822         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FPP\n");
18823 #ifdef UFO_XC_SUPPORT_3D_DS
18824         if(MDrv_XC_Is_SupportSWDS(pInstance))
18825         {
18826             if (IsVMirrorMode(eWindow))
18827             {
18828                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18829                 {
18830                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18831                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
18832                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18833                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18834                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18835                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18836                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18837                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18838                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18839 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18840                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18841                     {
18842                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18843                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, SUB_WINDOW);
18844                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18845                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18846                     }
18847 #endif
18848                 }
18849                 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18850                 {
18851                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18852                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
18853                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18854                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18855                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18856                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18857                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18858                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18859                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18860 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18861                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18862                     {
18863                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18864                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, SUB_WINDOW);
18865                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18866                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18867                     }
18868 #endif
18869                 }
18870 
18871             }
18872             else
18873             {
18874                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18875                 {
18876                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18877                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18878                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18879                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18880                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18881                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18882                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
18883                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18884                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18885 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18886                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18887                     {
18888                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18889                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18890                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18891                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, MAIN_WINDOW);
18892                     }
18893 #endif
18894                 }
18895                 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18896                 {
18897                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18898                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18899                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18900                     pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18901                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18902                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18903                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);   // Display H end
18904                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18905                     Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18906 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18907                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18908                     {
18909                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18910                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18911                         MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18912                         MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, MAIN_WINDOW);
18913                     }
18914 #endif
18915                 }
18916             }
18917         }
18918         else
18919 #endif
18920         {
18921         if (IsVMirrorMode(eWindow))
18922         {
18923             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18924             {
18925                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18926                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);   // Display H end
18927                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18928                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, 0x1FFF);
18929                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18930                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18931                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, VOP_DISPLAY_VSTART_MASK);
18932                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18933                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18934             }
18935             else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18936             {
18937                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18938                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);   // Display H end
18939                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18940                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, 0x1FFF);
18941                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18942                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18943                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, VOP_DISPLAY_VSTART_MASK);
18944                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18945                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18946             }
18947 
18948         }
18949         else
18950         {
18951             if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18952             {
18953                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18954                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18955                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, 0x1FFF);
18956                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18957                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18958                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18959                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18960                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18961                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, VOP_DISPLAY_VEND_MASK);
18962             }
18963             else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18964             {
18965                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18966                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18967                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, 0x1FFF);
18968                 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18969                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18970                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18971                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
18972                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18973                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, VOP_DISPLAY_VEND_MASK);
18974             }
18975 
18976         }
18977         }
18978 #if (HW_DESIGN_3D_VER == 5)
18979         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18980 #endif
18981         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18982         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18983 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18984         if(IsEnableDualMode(eWindow))
18985         {
18986             Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18987         }
18988 #endif
18989 
18990         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
18991         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18992 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18993         pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18994 #endif
18995         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18996         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18997         //Set SRAM to linear mode
18998         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18999         MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
19000 
19001 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19002         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19003         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
19004 #endif
19005     }
19006 
19007     _XC_RETURN(pInstance);
19008 #endif
19009 
19010     if(((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type >= E_XC_PNL_LPLL_VBY1_10BIT_4LANE)
19011         &&((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type <= E_XC_PNL_LPLL_VBY1_8BIT_8LANE))
19012     {
19013     #ifdef SUPPORT_MOD_ADBANK_SEPARATE
19014 
19015     #else
19016         if((E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)
19017             ||(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC == eOutputMode)
19018             ||(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == eOutputMode))
19019 
19020         {
19021             MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(15), BIT(15));
19022         }
19023         else
19024         {
19025             MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, 0, BIT(15));
19026         }
19027     #endif
19028     }
19029 
19030 #if HW_2DTO3D_SUPPORT
19031     MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
19032     MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
19033 
19034     if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
19035     {
19036         u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
19037     }
19038 
19039     if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
19040     {
19041         u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
19042     }
19043 #if (HW_2DTO3D_VER < 3) //old 2d to 3d architecture
19044     _XC_ENTRY(pInstance);
19045     //First init all control register to HW init value
19046     if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
19047     {
19048         //clk
19049         MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
19050         //dd
19051         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width, 0x07FF);//src width
19052         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, pSrcInfo->stDispWin.height, 0x07FF);//src height
19053         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19054         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
19055         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
19056         MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
19057 #if (HW_2DTO3D_VER < 2)
19058         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19059 #else
19060         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19061 #endif
19062 #if (HW_2DTO3D_VER > 0)
19063         MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
19064 #endif
19065         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
19066         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0430);
19067         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6),  BIT(6));   // DD force bank enable
19068         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F);     // DD force bank0
19069         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0, BIT(12));        //disable dynamic gating
19070         pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
19071         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19072         pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
19073         pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19074         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19075         {
19076             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19077         }
19078     }
19079     else
19080     {
19081         //detach vsync interrupt
19082         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19083         {
19084             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19085         }
19086         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
19087         //dd
19088         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
19089         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x07FF);//src height
19090         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19091         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x0000);
19092         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0000);
19093         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, BIT(12), BIT(12)); //enable dynamic gating
19094         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19095         pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount;
19096         pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19097     }
19098 
19099     if(   (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19100        && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
19101        && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode) || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
19102     {
19103         //dr
19104         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0000, 0x0001);//Enable Depth Render
19105         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, 0x0000, 0x1FFF);//pixel width
19106         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, 0x0000, 0x07FF);//MV width
19107         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0000, 0x00FF);//horizontal number of 32x32 block
19108         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, 0x0000, 0x007F);//vertical number of 32x32 block
19109         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0F00, 0xFF00);//TOTAL FRAME
19110         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x00FF);//left depth offset
19111         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x00FF);//right depth offset
19112 #if (HW_2DTO3D_VER < 2)
19113         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x3F00);//left depth gain:6bits
19114         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x3F00);//right depth gain:6bits
19115 #else
19116         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x7F00);//left depth gain:7bits
19117         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x7F00);//right depth gain:7bits
19118 #endif
19119 #if (HW_2DTO3D_VER == 0)
19120         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x8000, 0xBF3F);//dp info software reset, last number,request number
19121 #else
19122         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0000);          //last number,request number
19123         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_71_L, BIT(11), BIT(11)); //dp info software reset
19124 #endif
19125         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0xC007);//Active mode, Passive mode Select,1:Line alternative
19126         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, 0x0000, 0x00FF);  //draw left/right black enable, draw left/right black width
19127         if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19128         {
19129             Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19130         }
19131     }
19132 
19133     if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19134     {
19135         //Close 3D, just need restore Mainwindow here
19136         if(   (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19137            && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
19138         {
19139             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
19140             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
19141             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
19142             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
19143         }
19144         _XC_RETURN(pInstance);
19145         pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19146         pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19147         return TRUE;
19148     }
19149 
19150     //input
19151     if(IS_INPUT_NORMAL_2D_HW(eWindow))
19152     {
19153         //clk
19154         MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
19155         //dd
19156         if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19157         {
19158             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width/2, 0x07FF);//src width
19159         }
19160         else
19161         {
19162             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width, 0x07FF);//src width
19163         }
19164 
19165         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, pSrcInfo->stDispWin.height, 0x07FF);//src height
19166         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19167         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
19168         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
19169         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_74_L, u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD);//dr buffer low 2 bytes
19170         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_75_L, (u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dr buffer high 9bit
19171         MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
19172 #if (HW_2DTO3D_VER < 2)
19173         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19174 #else
19175         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19176 #endif
19177         //dr
19178         if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19179         {
19180             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width/2, 0x1FFF);//pixel width
19181             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, ((pSrcInfo->stDispWin.width+3)/4)/2, 0x07FF);//MV width
19182         }
19183         else
19184         {
19185             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width, 0x1FFF);//pixel width
19186             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (pSrcInfo->stDispWin.width+3)/4, 0x07FF);//MV width
19187         }
19188         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (pSrcInfo->stDispWin.width+31)/32, 0x00FF);//horizontal number of 32x32 block
19189         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (pSrcInfo->stDispWin.height+31)/32, 0x007F);//vertical number of 32x32 block
19190         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0F00, 0xFF00);//TOTAL FRAME
19191         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
19192         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
19193 #if (HW_2DTO3D_VER < 2)
19194         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x3F00);//left depth gain:6bits
19195         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x3F00);//right depth gain:6bits
19196         if(IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19197         {
19198             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, BIT(14));//sign bit:bit14
19199         }
19200         else
19201         {
19202             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, BIT(14), BIT(14));//sign bit:bit14
19203         }
19204 #else
19205         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
19206         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
19207         if(IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19208         {
19209             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, BIT(15));//sign bit:bit15
19210         }
19211         else
19212         {
19213             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, BIT(15), BIT(15));//sign bit:bit15
19214         }
19215 #endif
19216 
19217         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); // 2nd offset enable
19218 #if (HW_2DTO3D_VER == 0)
19219         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0404, 0xBF3F);//dp info software reset, last number,request number
19220 #else
19221         MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
19222         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_71_L, 0x0, BIT(11));           //dp info software reset
19223         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0404);                    //last number,request number
19224 #endif
19225         if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19226         {
19227             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0821, 0x0821);//Enable Depth Render
19228         }
19229         else
19230         {
19231             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0001, 0x0001);//Enable Depth Render
19232         }
19233         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(12),  BIT(12)); // DR force bank enable
19234         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6),  BIT(6));   // DD force bank enable
19235         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F);     // DD force bank0
19236         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0x0F00);     // DR force bank0
19237 #if HW_2DTO3D_PATCH
19238         pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled = Hal_SC_IsHW2Dto3DPatch_Enable();
19239 #endif
19240         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19241         {
19242             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19243         }
19244     }
19245     else if((!IS_INPUT_MODE_NONE(eWindow))
19246             && (!IS_OUTPUT_MODE_NONE())
19247             && (!IS_OUTPUT_FRAME_L())
19248             && (!IS_OUTPUT_FRAME_R())
19249             && (!IS_INPUT_NORMAL_2D(eWindow))) //real 3d adjust depth using hw 2d to 3d function
19250     {
19251 #if (HW_DESIGN_3D_VER >= 2)
19252             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width, 0x1FFF);//pixel width
19253             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (pSrcInfo->stDispWin.width+3)/4, 0x07FF);//MV width
19254             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (pSrcInfo->stDispWin.width+31)/32, 0x00FF);//horizontal number of 32x32 block
19255             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (pSrcInfo->stDispWin.height+31)/32, 0x007F);//vertical number of 32x32 block
19256 #else
19257             //for 3d ver<2,vop2 display window or height may not same as main or sub window's display size
19258             MS_U16 u16Width = pSrcInfo->stDispWin.width;
19259             MS_U16 u16Height = pSrcInfo->stDispWin.height;
19260             if(IS_OUTPUT_SIDE_BY_SIDE_HALF()
19261                || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19262             {
19263                 u16Width = u16Width * 2;
19264             }
19265             else if(IS_OUTPUT_LINE_ALTERNATIVE()
19266                     || IS_OUTPUT_LINE_ALTERNATIVE_HW()
19267                     || IS_OUTPUT_TOP_BOTTOM()
19268                     || IS_OUTPUT_TOP_BOTTOM_HW())
19269             {
19270                 u16Height = u16Height * 2;
19271             }
19272             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, u16Width, 0x1FFF);//pixel width
19273             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (u16Width+3)/4, 0x07FF);//MV width
19274             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (u16Width+31)/32, 0x00FF);//horizontal number of 32x32 block
19275             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (u16Height+31)/32, 0x007F);//vertical number of 32x32 block
19276 #endif
19277         if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow)) //real 3d adjust depth using hw 2d to 3d function
19278         {
19279             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0001, 0x0001);//Enable Depth Render
19280             if((pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x80) || (pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x00))
19281             {
19282                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); //2  // 2nd offset enable
19283             }
19284             else if(pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)
19285             {
19286                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2  // 2nd offset enable
19287                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, 0x0000); //2  // 2nd offset L
19288                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, (pXCResourcePrivate->stdrvXC_3D._u163DHShift-0x80)<<8); //2  // 2nd offset R
19289             }
19290             else
19291             {
19292                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2  // 2nd offset enable
19293                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, (0x80-pXCResourcePrivate->stdrvXC_3D._u163DHShift)<<8); //2  // 2nd offset L
19294                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, 0x0000); //2  // 2nd offset R
19295             }
19296         }
19297     }
19298 
19299     //output
19300     if(IS_OUTPUT_CHECKBOARD_HW())
19301     {
19302         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19303         {
19304             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0x0007);//Passive mode Select,0:Check Board, R first
19305         }
19306         else
19307         {
19308             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0003, 0x0007);//Passive mode Select,3:Check Board, L first
19309         }
19310     }
19311     else if(IS_OUTPUT_LINE_ALTERNATIVE_HW())
19312     {
19313         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19314         {
19315             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);//Passive mode Select,1:Line Alternative, R first
19316         }
19317         else
19318         {
19319             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0004, 0x0007);//Passive mode Select,4:Line Alternative, L first
19320         }
19321     }
19322     else if(IS_OUTPUT_FRAME_ALTERNATIVE_HW())
19323     {
19324         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(14), BIT(14));//active mode
19325         Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19326     }
19327     else if(IS_OUTPUT_PIXEL_ALTERNATIVE_HW())
19328     {
19329         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19330         {
19331             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0002, 0x0007);//Passive mode Select,2:Pixel Alternative, R first
19332         }
19333         else
19334         {
19335             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0005, 0x0007);//Passive mode Select,5:Pixel Alternative, L first
19336         }
19337     }
19338     else if(IS_OUTPUT_FRAME_L_HW())
19339     {
19340         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0006, 0x0007);//Passive mode Select,6:L Only
19341     }
19342     else if(IS_OUTPUT_FRAME_R_HW())
19343     {
19344         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007, 0x0007);//Passive mode Select,7:R Only
19345     }
19346     else if(IS_OUTPUT_FRAME_ALTERNATIVE()) //real 3d adjust depth using hw 2d to 3d function:frame alternative output
19347     {
19348         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(14), BIT(14)); //enable op2t3d_lr
19349     }
19350     else if(IS_OUTPUT_LINE_ALTERNATIVE() || (IS_OUTPUT_TOP_BOTTOM() && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))) //real 3d adjust depth using hw 2d to 3d function:line alternative output
19351     {
19352         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);//Passive mode Select,1:Line Alternative
19353     }
19354 
19355     _XC_RETURN(pInstance);
19356 
19357 #else //new 2d to 3d architecture
19358     _XC_ENTRY(pInstance);
19359     //First init all control register to HW init value
19360     if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
19361         && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
19362     {
19363         _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, pSrcInfo, eWindow);
19364         pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
19365         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19366         pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
19367         pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19368         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19369         {
19370             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19371         }
19372     }
19373     else
19374     {
19375         //detach vsync interrupt
19376         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19377         {
19378             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19379         }
19380         _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, pSrcInfo, eWindow);
19381         pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19382         pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount;
19383         pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19384     }
19385 
19386     if(   (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19387        && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
19388        && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode)
19389             || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
19390     {
19391         _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, pSrcInfo, eWindow);
19392 
19393         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000);//left gain/offset
19394         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000);//right gain/offset
19395         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2  // 2nd offset L
19396         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2  // 2nd offset R
19397         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, 0x0000 ,0x01ff);
19398         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, 0x0000, 0x01ff);
19399 
19400         if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19401         {
19402             Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19403         }
19404     }
19405 
19406     if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19407     {
19408         //Close 3D, just need restore Mainwindow here
19409         if(   (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19410            && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
19411         {
19412             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
19413             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);   // Display H end
19414             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
19415             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
19416         }
19417         _XC_RETURN(pInstance);
19418         pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19419         pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19420         return TRUE;
19421     }
19422 
19423     //input
19424     if(IS_INPUT_NORMAL_2D_HW(eWindow))
19425     {
19426         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is 2D_HW\n");
19427         _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, pSrcInfo, eWindow);
19428         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
19429         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
19430         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
19431         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
19432 
19433 #if(HW_DESIGN_3D_VER == 5)
19434         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCMVLen, 0x0FFF);//Set the maximum request lines for second channel
19435         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
19436 #endif
19437 #if(HW_DESIGN_3D_VER == 3) //monet mode
19438         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
19439 #endif
19440         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19441         {
19442             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19443         }
19444     }
19445     else if((!IS_INPUT_MODE_NONE(eWindow))
19446             && (!IS_OUTPUT_MODE_NONE())
19447             && (!IS_OUTPUT_FRAME_L())
19448             && (!IS_OUTPUT_FRAME_R())
19449             && (!IS_INPUT_NORMAL_2D(eWindow))) //real 3d adjust depth using hw 2d to 3d function
19450     {
19451         if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow)) //real 3d adjust depth using hw 2d to 3d function
19452         {
19453             MS_U16 u16ABSLevel = ((pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)?(pXCResourcePrivate->stdrvXC_3D._u163DHShift - 0x80):(0x80 - pXCResourcePrivate->stdrvXC_3D._u163DHShift));
19454             //DR setting
19455             _MDrv_SC_3D_DR_setting(pInstance, eWindow);
19456 
19457 #if (HW_2DTO3D_VER >= 4)
19458             if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_FRAME_PACKING())
19459             {
19460 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19461                 if(!((MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
19462                     && !IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type)
19463                     &&  (pXCResourcePrivate->stdrvXC_3D._bLAToTB || pXCResourcePrivate->stdrvXC_3D._bFAToTB)))// non-maserati manhattan mode FRC 3D
19464 #endif
19465                 {
19466                     _MDrv_SC_3D_HWDepthAdj_TBOut(pInstance, pSrcInfo, eWindow); //T3d settings & sram depth force to 0x80
19467                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(14)|BIT(13)|BIT(7), BIT(14)|BIT(13)|BIT(7));//TB out 3D depth enable
19468                 }
19469             }
19470 #endif
19471 
19472             if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
19473             {
19474                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(3), BIT(3));//SBS out 3D depth enable
19475             }
19476             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
19477 
19478             if((pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x80) || (pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x00))
19479             {
19480                 //original 3d depth
19481                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2  // 2nd offset L
19482                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2  // 2nd offset R
19483             }
19484             else if(pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)
19485             {
19486                 // |L-->      <--R|
19487                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (0xFF - (u16ABSLevel-1))<<8); //2  // 2nd offset L
19488                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (u16ABSLevel)<<8); //2  // 2nd offset R
19489             }
19490             else
19491             {
19492                 // |L<--      -->R|
19493                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (u16ABSLevel)<<8); //2  // 2nd offset L
19494                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (0xFF - (u16ABSLevel-1))<<8); //2  // 2nd offset R
19495             }
19496 
19497 #if ENABLE_T3D_DEBUG
19498             //enable black edge
19499             Hal_SC_3D_enable_black_edge(pInstance, FALSE);
19500 #endif
19501         }
19502     }
19503 
19504     //output
19505     if(IS_OUTPUT_LINE_ALTERNATIVE_HW())
19506     {
19507         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is LA_HW\n");
19508         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19509         {
19510             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19511             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15));   //sign bit:bit15
19512 
19513         }
19514         else
19515         {
19516             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15));  //sign bit:bit15
19517             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19518         }
19519 #if (HW_2DTO3D_VER >= 4)
19520         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*4) + 1), 0x01FF);//left depth gain:7bits
19521         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*4, 0x01FF);//right depth gain:7bits
19522 #endif
19523 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19524         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19525 #endif
19526     }
19527     else if(IS_OUTPUT_FRAME_ALTERNATIVE_HW())
19528     {
19529         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA_HW\n");
19530         if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA) //output FA_LLRR_HW for 4k0.5k@240Hz
19531         {
19532             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA_LLRR_HW \n");
19533             Hal_SC_3D_enable_FALLRR_out(pInstance, TRUE);
19534 #if (HW_DESIGN_3D_VER == 3) && (HW_DESIGN_4K2K_VER != 7)//manhattan mode
19535         // 4k2k needs more time to train data so we need to delay the display time
19536         pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = VALUE_AUTO_TUNE_AREA_TRIG_4K540P;
19537         pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = VALUE_DISP_AREA_TRIG_4K540P;
19538         pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
19539         pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
19540 #endif
19541         }
19542 
19543         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19544         {
19545             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19546             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15));   //sign bit:bit15
19547 
19548         }
19549         else
19550         {
19551             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15));  //sign bit:bit15
19552             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19553         }
19554         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5));   //pixel base active 3d
19555         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
19556         Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19557 
19558 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19559         Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19560 #endif
19561     }
19562 #if (HW_2DTO3D_VER >= 4)
19563     else if(IS_OUTPUT_TOP_BOTTOM_HW()
19564         || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING()))
19565     {
19566         if(IS_OUTPUT_TOP_BOTTOM_HW())
19567         {
19568             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is TB_HW\n");
19569         }
19570         else
19571         {
19572             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FPP_HW\n");
19573         }
19574         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19575         {
19576             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19577             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15));   //sign bit:bit15
19578 
19579         }
19580         else
19581         {
19582             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15));  //sign bit:bit15
19583             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19584         }
19585 #if (HW_DESIGN_3D_VER == 3)
19586 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19587          if(!((MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
19588             && !IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type)
19589             && (pXCResourcePrivate->stdrvXC_3D._bLAToTB || pXCResourcePrivate->stdrvXC_3D._bFAToTB)))// non-maserati manhattan mode FRC 3D
19590 #endif
19591         {
19592             //tb out mode for monet.this must be setted for monaco eco,fix me
19593             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(14)|BIT(13)|BIT(7), BIT(14)|BIT(13)|BIT(7));
19594         }
19595 #else
19596         //turn off for TB PQ
19597         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(7), BIT(7));
19598 #endif
19599 #if ENABLE_T3D_DEBUG
19600         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0x0000, 0x8000);
19601 #endif
19602         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0080, 0x00FF);
19603         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0080, 0x00FF);
19604         //muji, monaco
19605         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_30_L, BIT(14), BIT(14));
19606 
19607         //HW 2Dto3D FP out
19608         if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
19609         {
19610             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_56_L, BIT(7), BIT(7)); //TB out Vsync reset enabel
19611             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_56_L, 0x40, 0x7F);  //FP out need more delay,default value is 0x20
19612         }
19613     }
19614     else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19615     {
19616         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is SBS_HW\n");
19617         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(3), BIT(3));//SS out depth enable bit
19618         if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19619         {
19620             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19621             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15));   //sign bit:bit15
19622 
19623         }
19624         else
19625         {
19626             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15));  //sign bit:bit15
19627             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19628         }
19629     }
19630 #endif
19631 
19632     _XC_RETURN(pInstance);
19633 
19634 #endif //(HW_2DTO3D_VER < 3)
19635 #endif //HW_2DTO3D_SUPPORT
19636 
19637     _XC_ENTRY(pInstance);
19638     //below is moved from hal sw db
19639     if(Hal_SC_is_extra_req_en(pInstance, NULL, NULL, NULL, NULL))
19640     {
19641         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(15), BIT(15));
19642     }
19643     else
19644     {
19645          SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, 0, BIT(15));
19646     }
19647     _XC_RETURN(pInstance);
19648 
19649     pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19650     pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19651 
19652     return TRUE;
19653 }
19654 #endif
19655 
MDrv_XC_EnableT3D(void * pInstance,MS_BOOL bEnable)19656 MS_BOOL MDrv_XC_EnableT3D(void *pInstance, MS_BOOL bEnable)
19657 {
19658     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
19659     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
19660 #ifdef ENABLE_GOP_T3DPATCH
19661     if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
19662     {
19663         _MLOAD_ENTRY(pInstance);
19664         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK63_61_L, bEnable, BIT(0));
19665         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_08_L, bEnable<<4, BIT(4));
19666         Hal_SC_set_T3D_setting(pInstance, bEnable);
19667         MDrv_XC_MLoad_Fire(pInstance, TRUE);
19668         _MLOAD_RETURN(pInstance);
19669     }
19670     else
19671     {
19672         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_61_L, bEnable, BIT(0));
19673         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, bEnable<<4, BIT(4));
19674         Hal_SC_set_T3D_setting(pInstance, bEnable);
19675     }
19676 #endif
19677     return TRUE;
19678 }
19679 
19680