xref: /utopia/UTPA2-700.0.x/modules/dms/drv/dms_dipgop/drvDMS.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2007 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // (¡§MStar Confidential Information¡¨) by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvDMS.c
98*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
99*53ee8cc1Swenshuai.xi /// @brief  DMS Driver Interface
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #define  MDRV_DMS_C
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi //  Include Files
106*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
107*53ee8cc1Swenshuai.xi // Common Definition
108*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
109*53ee8cc1Swenshuai.xi #include <linux/string.h>
110*53ee8cc1Swenshuai.xi #else
111*53ee8cc1Swenshuai.xi #include <stdlib.h>
112*53ee8cc1Swenshuai.xi #include <string.h>
113*53ee8cc1Swenshuai.xi #include <unistd.h>
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #include "MsCommon.h"
117*53ee8cc1Swenshuai.xi #include "MsVersion.h"
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi #include "drvDMS.h"
120*53ee8cc1Swenshuai.xi #include "halDMS.h"
121*53ee8cc1Swenshuai.xi #include "UFO.h"
122*53ee8cc1Swenshuai.xi #include "halCHIP.h"
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi // utopia DRV
125*53ee8cc1Swenshuai.xi #include "drvMVOP.h"
126*53ee8cc1Swenshuai.xi #include "drvSYS.h"
127*53ee8cc1Swenshuai.xi #include "apiXC.h"
128*53ee8cc1Swenshuai.xi #include "apiPNL.h"
129*53ee8cc1Swenshuai.xi #include "apiXC_DWIN.h"
130*53ee8cc1Swenshuai.xi #include "apiVDEC_EX.h"
131*53ee8cc1Swenshuai.xi #include "apiGOP.h"
132*53ee8cc1Swenshuai.xi #include "apiGFX.h"
133*53ee8cc1Swenshuai.xi #include "utopia.h"
134*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
135*53ee8cc1Swenshuai.xi #include "apiDMS_private.h"
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi void* g_pDMSRes = NULL;
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi #ifndef ANDROID
140*53ee8cc1Swenshuai.xi #define DMS_PRINTF printf
141*53ee8cc1Swenshuai.xi #else
142*53ee8cc1Swenshuai.xi #include <sys/mman.h>
143*53ee8cc1Swenshuai.xi #include <cutils/ashmem.h>
144*53ee8cc1Swenshuai.xi #include <cutils/log.h>
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi #define DMS_PRINTF ALOGD
147*53ee8cc1Swenshuai.xi #endif
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #if(DMS_DONT_USE_CMA == 1)
150*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
151*53ee8cc1Swenshuai.xi #include "drvCMAPool_v2.h"
152*53ee8cc1Swenshuai.xi #else
153*53ee8cc1Swenshuai.xi #include "drvCMAPool.h"
154*53ee8cc1Swenshuai.xi #endif
155*53ee8cc1Swenshuai.xi #include "msos/linux/mdrv_cma_pool_st.h"
156*53ee8cc1Swenshuai.xi #endif
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi // FIXME: it needs MVOP to add it to header file.
159*53ee8cc1Swenshuai.xi MS_BOOL __attribute__((weak))   MDrv_MVOP_EnableInterrupt(MS_U8 eIntType);
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
162*53ee8cc1Swenshuai.xi //  Driver Compiler Options
163*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
164*53ee8cc1Swenshuai.xi // DIP MultiView
165*53ee8cc1Swenshuai.xi #define DMS_DIP_NUM             1
166*53ee8cc1Swenshuai.xi #define DMS_FHD_Hszie           1920
167*53ee8cc1Swenshuai.xi #define DMS_FHD_Vszie           1080
168*53ee8cc1Swenshuai.xi #define DMS_Frame_Buffer_Width           3840
169*53ee8cc1Swenshuai.xi #define DMS_Frame_Buffer_Height           2160
170*53ee8cc1Swenshuai.xi #define DMS_Support_Max_Resolution_Hsize           3840
171*53ee8cc1Swenshuai.xi #define DMS_Support_Max_Resolution_Vsize           2160
172*53ee8cc1Swenshuai.xi #define GOP_NUM 2
173*53ee8cc1Swenshuai.xi 
174*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
175*53ee8cc1Swenshuai.xi // Macros
176*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
177*53ee8cc1Swenshuai.xi #define DMS_DIP_TIMESLICE  6  //(ms)
178*53ee8cc1Swenshuai.xi #define DMS_DIP_Alignment(value, align)  ((value)/(align) * (align))
179*53ee8cc1Swenshuai.xi #define DMS_DIPR_Alignment(value, align)  ((value + (align-1))/(align) * (align))
180*53ee8cc1Swenshuai.xi #define DMS_DIP_TIMEOUT 500 //(ms)
181*53ee8cc1Swenshuai.xi #define DMS_DIP_BUFFER_COUNT  1
182*53ee8cc1Swenshuai.xi #define DMS_DIP_MULTIVIEW_TRANSPARENT_COLOR     (0x00000000)
183*53ee8cc1Swenshuai.xi #define MVOP_WINDOW 0
184*53ee8cc1Swenshuai.xi #define DMS_INVALID_FRAME_ID 0xFF
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi //Define for Develop
187*53ee8cc1Swenshuai.xi #define DMS_MVOP_FLOW 1
188*53ee8cc1Swenshuai.xi #define DBG_FPS 0
189*53ee8cc1Swenshuai.xi #define NEW_FLIP 1
190*53ee8cc1Swenshuai.xi #define DBG_DMS_LOG 0
191*53ee8cc1Swenshuai.xi #define DEV_PAUSE 1
192*53ee8cc1Swenshuai.xi #define DEV_IMODE_PAUSE 1
193*53ee8cc1Swenshuai.xi #define DEV_DI 1
194*53ee8cc1Swenshuai.xi #define DEV_DI_TIMER 0
195*53ee8cc1Swenshuai.xi #define DEV_DI_EVENT 0
196*53ee8cc1Swenshuai.xi #define DEV_MVOP_FORCE_IRQ 0
197*53ee8cc1Swenshuai.xi #define DEV_CAPMODE 1
198*53ee8cc1Swenshuai.xi #define DEV_NEW_NEXT 1
199*53ee8cc1Swenshuai.xi #define TEMP_LOG 0
200*53ee8cc1Swenshuai.xi #define TEMP_MAIN_CAPTURE 1
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi static MS_S32 XC_Vsync_Event_id = -1;
204*53ee8cc1Swenshuai.xi static MS_S32  s32DMSTaskID = -1;
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi #ifndef DMS_DIP_Support_3DDI
207*53ee8cc1Swenshuai.xi #define DMS_DIP_Support_3DDI 0
208*53ee8cc1Swenshuai.xi #endif
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi #ifndef DMS_DIP_NWindow_Support_2P5DDI
211*53ee8cc1Swenshuai.xi #define DMS_DIP_NWindow_Support_2P5DDI 0
212*53ee8cc1Swenshuai.xi #endif
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
215*53ee8cc1Swenshuai.xi static MS_S32 CaptureMode_Event_id = -1;
216*53ee8cc1Swenshuai.xi static MS_S32 s32DIPTaskID_CaptureMode = -1;
217*53ee8cc1Swenshuai.xi #endif
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi #ifndef DMS_DIP_Support_IMI
220*53ee8cc1Swenshuai.xi #define DMS_DIP_Support_IMI 0
221*53ee8cc1Swenshuai.xi #endif
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_IMI
224*53ee8cc1Swenshuai.xi static MS_S32 StartFRC_Event_id = -1;
225*53ee8cc1Swenshuai.xi #endif
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi #ifndef DMS_DIPWindow_NORMAL
228*53ee8cc1Swenshuai.xi #define DMS_DIPWindow_NORMAL 0
229*53ee8cc1Swenshuai.xi #endif
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi #ifndef DMS_DIPWindow_DI
232*53ee8cc1Swenshuai.xi #define DMS_DIPWindow_DI 0
233*53ee8cc1Swenshuai.xi #endif
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi #ifndef DMS_DIPWindow_CAPTURE
236*53ee8cc1Swenshuai.xi #define DMS_DIPWindow_CAPTURE 0
237*53ee8cc1Swenshuai.xi #endif
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi #ifndef DMS_MFDEC_CAPTURE
240*53ee8cc1Swenshuai.xi #define DMS_MFDEC_CAPTURE 0
241*53ee8cc1Swenshuai.xi #endif
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi #ifndef DMS_MFDEC_NORMAL
244*53ee8cc1Swenshuai.xi #define DMS_MFDEC_NORMAL 0
245*53ee8cc1Swenshuai.xi #endif
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
248*53ee8cc1Swenshuai.xi static MS_S32  s32MVOP_Event_id = -1;
249*53ee8cc1Swenshuai.xi static MS_S32  s32MVOPTaskID = -1;
250*53ee8cc1Swenshuai.xi static MS_S32  s32DisableBob_Event_id = -1;
251*53ee8cc1Swenshuai.xi static MS_S32  s32DisableBobTaskID = -1;
252*53ee8cc1Swenshuai.xi #endif
253*53ee8cc1Swenshuai.xi 
254*53ee8cc1Swenshuai.xi #define TRACE_LOG 0
255*53ee8cc1Swenshuai.xi #if TRACE_LOG
256*53ee8cc1Swenshuai.xi #define print_trace(_fmt, _args...) DMS_PRINTF(_fmt, ##_args)
257*53ee8cc1Swenshuai.xi #else
258*53ee8cc1Swenshuai.xi #define print_trace(_fmt, _args...)
259*53ee8cc1Swenshuai.xi #endif
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
262*53ee8cc1Swenshuai.xi //  Global Variables
263*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
266*53ee8cc1Swenshuai.xi //  Local Variables
267*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
268*53ee8cc1Swenshuai.xi #define USE_2ND_BUFFER 0x1
269*53ee8cc1Swenshuai.xi #define USE_XC_SCALING_DOWN 0x2
270*53ee8cc1Swenshuai.xi #define USE_XC_FBL 0x4
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi #define DMS_XC_RESET_WINDOW_SIZE        0x1
273*53ee8cc1Swenshuai.xi #define DMS_XC_BLACK_SCREEN_BY_WINUSED  0x2
274*53ee8cc1Swenshuai.xi #define DMS_XC_FREEZE                   0x4
275*53ee8cc1Swenshuai.xi #define DMS_XC_FREEZE_SETTING           0x8
276*53ee8cc1Swenshuai.xi #define DMS_XC_FIRST_TIME_SETWINDOW     0x10    //For do utopia setwin and DS wrtie scenario
277*53ee8cc1Swenshuai.xi #define DMS_XC_NO_FRAME                 0x100
278*53ee8cc1Swenshuai.xi #define DMS_XC_SEQ_CHANGE_PI            0x200
279*53ee8cc1Swenshuai.xi #define DMS_XC_SEQ_CHANGE_SIZE          0x400
280*53ee8cc1Swenshuai.xi #define DMS_XC_UPDATE_FROM_VDEC         0X1000
281*53ee8cc1Swenshuai.xi #define DMS_XC_FIRST_FRAME_FROM_VDEC    0X2000
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi #if DBG_FPS
284*53ee8cc1Swenshuai.xi static MS_S32  s32DMSFPSTaskID = -1;
285*53ee8cc1Swenshuai.xi #define PRI_PERIOD 5000
286*53ee8cc1Swenshuai.xi static MS_BOOL bFPS_Start[2] = {FALSE};
287*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Push_Counter[2] = {0};
288*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Pull_Counter[2] = {0};
289*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Pull_NotReady_Counter[2] = {0};
290*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Switch_Counter[2] = {0};
291*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Show_Counter[2] = {0};
292*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Add_Counter[2] = {0};
293*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Release_Counter[2] = {0};
294*53ee8cc1Swenshuai.xi static MS_U32 u32FPS_Di_Counter[2] = {0};
295*53ee8cc1Swenshuai.xi #endif
296*53ee8cc1Swenshuai.xi MS_U16 gDMS_externDebugFlag = 0;
297*53ee8cc1Swenshuai.xi MS_U16 gDMSMVOPForceLookVDEC = 0;
298*53ee8cc1Swenshuai.xi #define sync_print(fmt, args...) do { if(0) DMS_PRINTF(fmt, ##args);  } while (0)
299*53ee8cc1Swenshuai.xi MS_U16 gDMSDebug = 0;
300*53ee8cc1Swenshuai.xi void* pTaskInstance = NULL;
301*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
302*53ee8cc1Swenshuai.xi #if DEV_IMODE_PAUSE
303*53ee8cc1Swenshuai.xi static MS_S32 s32DIPDiRePushTimerId = -1;
304*53ee8cc1Swenshuai.xi #endif
305*53ee8cc1Swenshuai.xi #endif
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi //Marco to simplize resource usage
308*53ee8cc1Swenshuai.xi #define DMS_GET_RES_PRI DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;\
309*53ee8cc1Swenshuai.xi                         UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri))
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi #define RES_DMS pDMSResPri->stDrvDMS
312*53ee8cc1Swenshuai.xi #define RES_DMSDI pDMSResPri->stDrvDMSDi
313*53ee8cc1Swenshuai.xi #define RES_DMSCAPTURE pDMSResPri->stDrvDMSCapMode
314*53ee8cc1Swenshuai.xi 
315*53ee8cc1Swenshuai.xi #define DBG_DISABLE_SEMAPHORE 0
316*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GetNextInfo(MS_U16 u16WindowID, MS_BOOL bResetCaptureID);
317*53ee8cc1Swenshuai.xi 
MDrv_DMS_Get_Semaphore(void * pInstance,EN_DMS_POOL_TYPE ePoolType)318*53ee8cc1Swenshuai.xi MS_U32 MDrv_DMS_Get_Semaphore(void* pInstance, EN_DMS_POOL_TYPE ePoolType)
319*53ee8cc1Swenshuai.xi {
320*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
321*53ee8cc1Swenshuai.xi     static MS_BOOL bGetRes = FALSE;
322*53ee8cc1Swenshuai.xi     if(bGetRes)
323*53ee8cc1Swenshuai.xi     {
324*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_SUCCESS;
325*53ee8cc1Swenshuai.xi     }
326*53ee8cc1Swenshuai.xi #endif
327*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
328*53ee8cc1Swenshuai.xi     //DMS_PRINTF("get SHM!!\n");
329*53ee8cc1Swenshuai.xi     if (pInstance == NULL)
330*53ee8cc1Swenshuai.xi     {
331*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d]No instance existed, please get an instance by calling MApi_DMS_Init() first\n",__FUNCTION__,__LINE__);
332*53ee8cc1Swenshuai.xi         return u32Return;
333*53ee8cc1Swenshuai.xi     }
334*53ee8cc1Swenshuai.xi 
335*53ee8cc1Swenshuai.xi     void* pModule = NULL;
336*53ee8cc1Swenshuai.xi     UtopiaInstanceGetModule(pInstance, &pModule);
337*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModule, E_DMS_POOL_ID_INTERNAL_VARIABLE, &g_pDMSRes) != UTOPIA_STATUS_SUCCESS)
338*53ee8cc1Swenshuai.xi     {
339*53ee8cc1Swenshuai.xi         DMS_PRINTF("UtopiaResourceObtain fail\n");
340*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_ERR_RESOURCE;
341*53ee8cc1Swenshuai.xi     }
342*53ee8cc1Swenshuai.xi 
343*53ee8cc1Swenshuai.xi     u32Return = UTOPIA_STATUS_SUCCESS;
344*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
345*53ee8cc1Swenshuai.xi     printf("\033[1;31m Disable semaphore get!!!!!!!!!!!!!!!!\033[0m\n");
346*53ee8cc1Swenshuai.xi     bGetRes = TRUE;
347*53ee8cc1Swenshuai.xi #endif
348*53ee8cc1Swenshuai.xi     return u32Return;
349*53ee8cc1Swenshuai.xi }
350*53ee8cc1Swenshuai.xi 
MDrv_DMS_Release_Semaphore(void * pInstance,EN_DMS_POOL_TYPE ePoolType)351*53ee8cc1Swenshuai.xi MS_U32 MDrv_DMS_Release_Semaphore(void* pInstance, EN_DMS_POOL_TYPE ePoolType)
352*53ee8cc1Swenshuai.xi {
353*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
354*53ee8cc1Swenshuai.xi     return UTOPIA_STATUS_SUCCESS;
355*53ee8cc1Swenshuai.xi #endif
356*53ee8cc1Swenshuai.xi     //DMS_PRINTF("release SHM!!\n");
357*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
358*53ee8cc1Swenshuai.xi     u32Return = UtopiaResourceRelease(g_pDMSRes);
359*53ee8cc1Swenshuai.xi     return u32Return;
360*53ee8cc1Swenshuai.xi }
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
363*53ee8cc1Swenshuai.xi //  Local Defines
364*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_DMS_Add_XC_Status(MS_U32 u32Window,MS_U32 u32Status)365*53ee8cc1Swenshuai.xi static void _DMS_Add_XC_Status(MS_U32 u32Window, MS_U32 u32Status)
366*53ee8cc1Swenshuai.xi {
367*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
368*53ee8cc1Swenshuai.xi     RES_DMS.gu8DMS_SetXC_Status[u32Window] |= (u32Status);
369*53ee8cc1Swenshuai.xi }
370*53ee8cc1Swenshuai.xi 
_DMS_Remove_XC_Status(MS_U32 u32Window,MS_U32 u32Status)371*53ee8cc1Swenshuai.xi static void _DMS_Remove_XC_Status(MS_U32 u32Window, MS_U32 u32Status)
372*53ee8cc1Swenshuai.xi {
373*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
374*53ee8cc1Swenshuai.xi     RES_DMS.gu8DMS_SetXC_Status[u32Window] &= ~(u32Status);
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi 
_DMS_Query_XC_Status(MS_U32 u32Window,MS_U32 u32Status)377*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Query_XC_Status(MS_U32 u32Window, MS_U32 u32Status)
378*53ee8cc1Swenshuai.xi {
379*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
380*53ee8cc1Swenshuai.xi     return (RES_DMS.gu8DMS_SetXC_Status[u32Window] & (u32Status))? TRUE : FALSE;
381*53ee8cc1Swenshuai.xi }
382*53ee8cc1Swenshuai.xi 
_DMS_Is_MVOPFlow(MS_U32 u32Window)383*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_MVOPFlow(MS_U32 u32Window)
384*53ee8cc1Swenshuai.xi {
385*53ee8cc1Swenshuai.xi     return ((DMS_MVOP_FLOW) && (u32Window == MVOP_WINDOW));
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi 
_DMS_Is_SourceInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType)388*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_SourceInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType)
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi     if((eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME) || (eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD))
391*53ee8cc1Swenshuai.xi     {
392*53ee8cc1Swenshuai.xi         return TRUE;
393*53ee8cc1Swenshuai.xi     }
394*53ee8cc1Swenshuai.xi     else
395*53ee8cc1Swenshuai.xi     {
396*53ee8cc1Swenshuai.xi         return FALSE;
397*53ee8cc1Swenshuai.xi     }
398*53ee8cc1Swenshuai.xi }
399*53ee8cc1Swenshuai.xi 
_DMS_Is_SourceFieldBaseInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType)400*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_SourceFieldBaseInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType)
401*53ee8cc1Swenshuai.xi {
402*53ee8cc1Swenshuai.xi     if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
403*53ee8cc1Swenshuai.xi     {
404*53ee8cc1Swenshuai.xi         return TRUE;
405*53ee8cc1Swenshuai.xi     }
406*53ee8cc1Swenshuai.xi     else
407*53ee8cc1Swenshuai.xi     {
408*53ee8cc1Swenshuai.xi         return FALSE;
409*53ee8cc1Swenshuai.xi     }
410*53ee8cc1Swenshuai.xi }
411*53ee8cc1Swenshuai.xi 
_DMS_Is_SourceFrameBaseInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType,E_DMS_VIDEO_FIELD_TYPE eFieldType)412*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_SourceFrameBaseInterlace(E_DMS_VIDEO_SCAN_TYPE eScanType, E_DMS_VIDEO_FIELD_TYPE eFieldType)
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi     if((eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME) && (eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTH))
415*53ee8cc1Swenshuai.xi     {
416*53ee8cc1Swenshuai.xi         return TRUE;
417*53ee8cc1Swenshuai.xi     }
418*53ee8cc1Swenshuai.xi     else
419*53ee8cc1Swenshuai.xi     {
420*53ee8cc1Swenshuai.xi         return FALSE;
421*53ee8cc1Swenshuai.xi     }
422*53ee8cc1Swenshuai.xi }
423*53ee8cc1Swenshuai.xi 
_DMS_Is_CaptureMode_OutputTile(EN_DMS_DIP_TILE_BLOCK eTileBlock)424*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_CaptureMode_OutputTile(EN_DMS_DIP_TILE_BLOCK eTileBlock)
425*53ee8cc1Swenshuai.xi {
426*53ee8cc1Swenshuai.xi     if(eTileBlock != DMS_DIP_TILE_BLOCK_W_16_32)
427*53ee8cc1Swenshuai.xi     {
428*53ee8cc1Swenshuai.xi         return TRUE;
429*53ee8cc1Swenshuai.xi     }
430*53ee8cc1Swenshuai.xi     else
431*53ee8cc1Swenshuai.xi     {
432*53ee8cc1Swenshuai.xi         return FALSE;
433*53ee8cc1Swenshuai.xi     }
434*53ee8cc1Swenshuai.xi }
435*53ee8cc1Swenshuai.xi 
_DMS_Is_ScalingConditionUse2ndBuffer(MS_U32 u32ScalingCondition)436*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_ScalingConditionUse2ndBuffer(MS_U32 u32ScalingCondition)
437*53ee8cc1Swenshuai.xi {
438*53ee8cc1Swenshuai.xi     if(u32ScalingCondition & USE_2ND_BUFFER)
439*53ee8cc1Swenshuai.xi     {
440*53ee8cc1Swenshuai.xi         return TRUE;
441*53ee8cc1Swenshuai.xi     }
442*53ee8cc1Swenshuai.xi     else
443*53ee8cc1Swenshuai.xi     {
444*53ee8cc1Swenshuai.xi         return FALSE;
445*53ee8cc1Swenshuai.xi     }
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi 
_DMS_Is_ScalingConditionUseFBL(MS_U32 u32ScalingCondition)448*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_ScalingConditionUseFBL(MS_U32 u32ScalingCondition)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi     if(u32ScalingCondition & USE_XC_FBL)
451*53ee8cc1Swenshuai.xi     {
452*53ee8cc1Swenshuai.xi         return TRUE;
453*53ee8cc1Swenshuai.xi     }
454*53ee8cc1Swenshuai.xi     else
455*53ee8cc1Swenshuai.xi     {
456*53ee8cc1Swenshuai.xi         return FALSE;
457*53ee8cc1Swenshuai.xi     }
458*53ee8cc1Swenshuai.xi }
459*53ee8cc1Swenshuai.xi 
_DMS_DIP_GetFrameBaseInterlaceFieldType(DMS_VDECFRAME_INFO * pVDECFrameInfo)460*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_GetFrameBaseInterlaceFieldType(DMS_VDECFRAME_INFO *pVDECFrameInfo)
461*53ee8cc1Swenshuai.xi {
462*53ee8cc1Swenshuai.xi     if(pVDECFrameInfo->bIs2ndField == FALSE)
463*53ee8cc1Swenshuai.xi     {
464*53ee8cc1Swenshuai.xi         if(pVDECFrameInfo->eFieldOrderType == E_DMS_VIDEO_FIELD_ORDER_TYPE_TOP)
465*53ee8cc1Swenshuai.xi         {
466*53ee8cc1Swenshuai.xi             pVDECFrameInfo->eFieldType = E_DMS_VIDEO_FIELD_TYPE_TOP;
467*53ee8cc1Swenshuai.xi         }
468*53ee8cc1Swenshuai.xi         else
469*53ee8cc1Swenshuai.xi         {
470*53ee8cc1Swenshuai.xi             pVDECFrameInfo->eFieldType = E_DMS_VIDEO_FIELD_TYPE_BOTTOM;
471*53ee8cc1Swenshuai.xi         }
472*53ee8cc1Swenshuai.xi     }
473*53ee8cc1Swenshuai.xi     else
474*53ee8cc1Swenshuai.xi     {
475*53ee8cc1Swenshuai.xi         if(pVDECFrameInfo->eFieldOrderType == E_DMS_VIDEO_FIELD_ORDER_TYPE_TOP)
476*53ee8cc1Swenshuai.xi         {
477*53ee8cc1Swenshuai.xi             pVDECFrameInfo->eFieldType = E_DMS_VIDEO_FIELD_TYPE_BOTTOM;
478*53ee8cc1Swenshuai.xi         }
479*53ee8cc1Swenshuai.xi         else
480*53ee8cc1Swenshuai.xi         {
481*53ee8cc1Swenshuai.xi             pVDECFrameInfo->eFieldType = E_DMS_VIDEO_FIELD_TYPE_TOP;
482*53ee8cc1Swenshuai.xi         }
483*53ee8cc1Swenshuai.xi     }
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi     return TRUE;
486*53ee8cc1Swenshuai.xi }
487*53ee8cc1Swenshuai.xi 
_DMS_Is_UVSwap(EN_DMS_CAPTURE_COLORFORMAT eColorFormat)488*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_UVSwap(EN_DMS_CAPTURE_COLORFORMAT eColorFormat)
489*53ee8cc1Swenshuai.xi {
490*53ee8cc1Swenshuai.xi     if((eColorFormat == E_DMS_CAPTURE_COLOR_FORMAT_YVYU) || (eColorFormat == E_DMS_CAPTURE_COLOR_FORMAT_VYUY))
491*53ee8cc1Swenshuai.xi     {
492*53ee8cc1Swenshuai.xi         return TRUE;
493*53ee8cc1Swenshuai.xi     }
494*53ee8cc1Swenshuai.xi     else
495*53ee8cc1Swenshuai.xi     {
496*53ee8cc1Swenshuai.xi         return FALSE;
497*53ee8cc1Swenshuai.xi     }
498*53ee8cc1Swenshuai.xi }
499*53ee8cc1Swenshuai.xi 
_DMS_Is_YCSwap(EN_DMS_CAPTURE_COLORFORMAT eColorFormat)500*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_YCSwap(EN_DMS_CAPTURE_COLORFORMAT eColorFormat)
501*53ee8cc1Swenshuai.xi {
502*53ee8cc1Swenshuai.xi     if((eColorFormat == E_DMS_CAPTURE_COLOR_FORMAT_UYVY) || (eColorFormat == E_DMS_CAPTURE_COLOR_FORMAT_VYUY))
503*53ee8cc1Swenshuai.xi     {
504*53ee8cc1Swenshuai.xi         return TRUE;
505*53ee8cc1Swenshuai.xi     }
506*53ee8cc1Swenshuai.xi     else
507*53ee8cc1Swenshuai.xi     {
508*53ee8cc1Swenshuai.xi         return FALSE;
509*53ee8cc1Swenshuai.xi     }
510*53ee8cc1Swenshuai.xi }
511*53ee8cc1Swenshuai.xi 
512*53ee8cc1Swenshuai.xi #define DMS_FHD_MAX_H_SIZE 1920
513*53ee8cc1Swenshuai.xi #define DMS_FHD_MAX_V_SIZE 1088
_DMS_WindowSizeOverFHD(MS_U32 u32Width,MS_U32 u32Height)514*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_WindowSizeOverFHD(MS_U32 u32Width, MS_U32 u32Height)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi     if((u32Width > DMS_FHD_MAX_H_SIZE) && (u32Height > DMS_FHD_MAX_V_SIZE))
517*53ee8cc1Swenshuai.xi     {
518*53ee8cc1Swenshuai.xi         return TRUE;
519*53ee8cc1Swenshuai.xi     }
520*53ee8cc1Swenshuai.xi     else
521*53ee8cc1Swenshuai.xi     {
522*53ee8cc1Swenshuai.xi         return FALSE;
523*53ee8cc1Swenshuai.xi     }
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
_DMS_DIP_GetDIPDiDataFMT(MS_U32 u32Window,E_DMS_VIDEO_SCAN_TYPE eScanType,E_DMS_VIDEO_FIELD_TYPE eFieldType)526*53ee8cc1Swenshuai.xi static EN_DIP_DI_FIELD _DMS_DIP_GetDIPDiDataFMT(MS_U32 u32Window, E_DMS_VIDEO_SCAN_TYPE eScanType, E_DMS_VIDEO_FIELD_TYPE eFieldType)
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi     EN_DIP_DI_FIELD eDIField = E_DIP_3DDI_TOP_BOTH_FIELD_STAGGER;
529*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_3DDI
530*53ee8cc1Swenshuai.xi     if(u32Window == MVOP_WINDOW)
531*53ee8cc1Swenshuai.xi     {
532*53ee8cc1Swenshuai.xi         if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME)
533*53ee8cc1Swenshuai.xi         {
534*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
535*53ee8cc1Swenshuai.xi             {
536*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_3DDI_TOP_BOTH_FIELD_STAGGER;
537*53ee8cc1Swenshuai.xi             }
538*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
539*53ee8cc1Swenshuai.xi             {
540*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_3DDI_BOTTOM_BOTH_FIELD_STAGGER;
541*53ee8cc1Swenshuai.xi             }
542*53ee8cc1Swenshuai.xi         }
543*53ee8cc1Swenshuai.xi         else if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
544*53ee8cc1Swenshuai.xi         {
545*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
546*53ee8cc1Swenshuai.xi             {
547*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_3DDI_TOP_SINGLE_FIELD;
548*53ee8cc1Swenshuai.xi             }
549*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
550*53ee8cc1Swenshuai.xi             {
551*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_3DDI_BOTTOM_SINGLE_FIELD;
552*53ee8cc1Swenshuai.xi             }
553*53ee8cc1Swenshuai.xi         }
554*53ee8cc1Swenshuai.xi         return eDIField;
555*53ee8cc1Swenshuai.xi     }
556*53ee8cc1Swenshuai.xi #else
557*53ee8cc1Swenshuai.xi     if(u32Window == MVOP_WINDOW)
558*53ee8cc1Swenshuai.xi     {
559*53ee8cc1Swenshuai.xi         if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME)
560*53ee8cc1Swenshuai.xi         {
561*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
562*53ee8cc1Swenshuai.xi             {
563*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_TOP_BOTH_FIELD_STAGGER;
564*53ee8cc1Swenshuai.xi             }
565*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
566*53ee8cc1Swenshuai.xi             {
567*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_BOTTOM_BOTH_FIELD_STAGGER;
568*53ee8cc1Swenshuai.xi             }
569*53ee8cc1Swenshuai.xi         }
570*53ee8cc1Swenshuai.xi         else if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
571*53ee8cc1Swenshuai.xi         {
572*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
573*53ee8cc1Swenshuai.xi             {
574*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_TOP_BOTH_FIELD_SEPARATE;
575*53ee8cc1Swenshuai.xi             }
576*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
577*53ee8cc1Swenshuai.xi             {
578*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_BOTTOM_BOTH_FIELD_SEPARATE;
579*53ee8cc1Swenshuai.xi             }
580*53ee8cc1Swenshuai.xi         }
581*53ee8cc1Swenshuai.xi         return eDIField;
582*53ee8cc1Swenshuai.xi     }
583*53ee8cc1Swenshuai.xi #endif
584*53ee8cc1Swenshuai.xi #if DMS_DIP_NWindow_Support_2P5DDI
585*53ee8cc1Swenshuai.xi     else
586*53ee8cc1Swenshuai.xi     {
587*53ee8cc1Swenshuai.xi         if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME)
588*53ee8cc1Swenshuai.xi         {
589*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
590*53ee8cc1Swenshuai.xi             {
591*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_TOP_BOTH_FIELD_STAGGER;
592*53ee8cc1Swenshuai.xi             }
593*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
594*53ee8cc1Swenshuai.xi             {
595*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_BOTTOM_BOTH_FIELD_STAGGER;
596*53ee8cc1Swenshuai.xi             }
597*53ee8cc1Swenshuai.xi         }
598*53ee8cc1Swenshuai.xi         else if(eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
599*53ee8cc1Swenshuai.xi         {
600*53ee8cc1Swenshuai.xi             if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_TOP)
601*53ee8cc1Swenshuai.xi             {
602*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_TOP_BOTH_FIELD_SEPARATE;
603*53ee8cc1Swenshuai.xi             }
604*53ee8cc1Swenshuai.xi             else if(eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTTOM)
605*53ee8cc1Swenshuai.xi             {
606*53ee8cc1Swenshuai.xi                 eDIField = E_DIP_MED_DI_BOTTOM_BOTH_FIELD_SEPARATE;
607*53ee8cc1Swenshuai.xi             }
608*53ee8cc1Swenshuai.xi         }
609*53ee8cc1Swenshuai.xi         return eDIField;
610*53ee8cc1Swenshuai.xi     }
611*53ee8cc1Swenshuai.xi #endif
612*53ee8cc1Swenshuai.xi     printf("\033[31m [%s][%d] CHECK CODE FLOW, SHOULD NOT REACH HERE !!\033[0m\n",__FUNCTION__,__LINE__);
613*53ee8cc1Swenshuai.xi     return eDIField;
614*53ee8cc1Swenshuai.xi }
615*53ee8cc1Swenshuai.xi 
_DMS_DIP_GetDIPRDataFMT(DMS_VDECFRAME_INFO * pVDECFrameInfo)616*53ee8cc1Swenshuai.xi static EN_XC_DIP_DATA_FMT _DMS_DIP_GetDIPRDataFMT(DMS_VDECFRAME_INFO *pVDECFrameInfo)
617*53ee8cc1Swenshuai.xi {
618*53ee8cc1Swenshuai.xi     EN_XC_DIP_DATA_FMT eFmt = E_DMS_VIDEO_CODEC_UNKNOWN;
619*53ee8cc1Swenshuai.xi 
620*53ee8cc1Swenshuai.xi     switch (pVDECFrameInfo->eCODEC)
621*53ee8cc1Swenshuai.xi     {
622*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_CODEC_HEVC:
623*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_H265;
624*53ee8cc1Swenshuai.xi             break;
625*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_CODEC_H264:
626*53ee8cc1Swenshuai.xi         default :
627*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420;
628*53ee8cc1Swenshuai.xi             break;
629*53ee8cc1Swenshuai.xi     }
630*53ee8cc1Swenshuai.xi     return eFmt;
631*53ee8cc1Swenshuai.xi }
632*53ee8cc1Swenshuai.xi 
_DMS_DIP_CalcPitch(EN_XC_DIP_DATA_FMT eFmt,MS_U16 u16Width)633*53ee8cc1Swenshuai.xi static MS_U16 _DMS_DIP_CalcPitch(EN_XC_DIP_DATA_FMT eFmt, MS_U16 u16Width)
634*53ee8cc1Swenshuai.xi {
635*53ee8cc1Swenshuai.xi     MS_U16 u16Pitch = 0;
636*53ee8cc1Swenshuai.xi     switch (eFmt)
637*53ee8cc1Swenshuai.xi     {
638*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV420:
639*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV420_H265:
640*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV420_MED_DI_FIELDTYPE_TOP:
641*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV420_MED_DI_FIELDTYPE_BOTTOM:
642*53ee8cc1Swenshuai.xi             u16Pitch = u16Width * 3 / 2; //*1.5
643*53ee8cc1Swenshuai.xi             break;
644*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_RGB565:
645*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV422:
646*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV422_MED_DI_FIELDTYPE_TOP:
647*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV422_MED_DI_FIELDTYPE_BOTTOM:
648*53ee8cc1Swenshuai.xi             u16Pitch = u16Width << 1;
649*53ee8cc1Swenshuai.xi             break;
650*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_ARGB8888:
651*53ee8cc1Swenshuai.xi             u16Pitch = u16Width << 2;
652*53ee8cc1Swenshuai.xi             break;
653*53ee8cc1Swenshuai.xi         default :
654*53ee8cc1Swenshuai.xi             u16Pitch = 0;
655*53ee8cc1Swenshuai.xi             break;
656*53ee8cc1Swenshuai.xi     }
657*53ee8cc1Swenshuai.xi     return u16Pitch;
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi 
_DMS_DIP_MFDECTileTypeMapping(E_DMS_VIDEO_TILE_MODE eTileMode)660*53ee8cc1Swenshuai.xi static EN_MFDEC_TILE_MODE _DMS_DIP_MFDECTileTypeMapping(E_DMS_VIDEO_TILE_MODE eTileMode)
661*53ee8cc1Swenshuai.xi {
662*53ee8cc1Swenshuai.xi     EN_MFDEC_TILE_MODE eTile;
663*53ee8cc1Swenshuai.xi     switch (eTileMode)
664*53ee8cc1Swenshuai.xi     {
665*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_16x32:
666*53ee8cc1Swenshuai.xi             eTile = E_DIP_MFEDC_TILE_16_32;
667*53ee8cc1Swenshuai.xi             break;
668*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x16:
669*53ee8cc1Swenshuai.xi             eTile = E_DIP_MFEDC_TILE_32_16;
670*53ee8cc1Swenshuai.xi             break;
671*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x32:
672*53ee8cc1Swenshuai.xi             eTile = E_DIP_MFEDC_TILE_32_32;
673*53ee8cc1Swenshuai.xi             break;
674*53ee8cc1Swenshuai.xi         default :
675*53ee8cc1Swenshuai.xi             eTile = E_DIP_MFEDC_TILE_16_32;
676*53ee8cc1Swenshuai.xi             break;
677*53ee8cc1Swenshuai.xi     }
678*53ee8cc1Swenshuai.xi     return eTile;
679*53ee8cc1Swenshuai.xi }
680*53ee8cc1Swenshuai.xi 
_DMS_DIP_TileTypeMapping(E_DMS_VIDEO_TILE_MODE eTileMode)681*53ee8cc1Swenshuai.xi static EN_XC_DIP_TILE_BLOCK _DMS_DIP_TileTypeMapping(E_DMS_VIDEO_TILE_MODE eTileMode)
682*53ee8cc1Swenshuai.xi {
683*53ee8cc1Swenshuai.xi     EN_XC_DIP_TILE_BLOCK eTile;
684*53ee8cc1Swenshuai.xi     switch (eTileMode)
685*53ee8cc1Swenshuai.xi     {
686*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_16x32:
687*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_16_32;
688*53ee8cc1Swenshuai.xi             break;
689*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x16:
690*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_32_16;
691*53ee8cc1Swenshuai.xi             break;
692*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x32:
693*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_32_32;
694*53ee8cc1Swenshuai.xi             break;
695*53ee8cc1Swenshuai.xi         default :
696*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_16_32;
697*53ee8cc1Swenshuai.xi             break;
698*53ee8cc1Swenshuai.xi     }
699*53ee8cc1Swenshuai.xi 
700*53ee8cc1Swenshuai.xi     return eTile;
701*53ee8cc1Swenshuai.xi }
702*53ee8cc1Swenshuai.xi 
_DMS_DIP_Capture_TileMapping(EN_DMS_DIP_TILE_BLOCK eTileMode)703*53ee8cc1Swenshuai.xi static EN_XC_DIP_TILE_BLOCK _DMS_DIP_Capture_TileMapping(EN_DMS_DIP_TILE_BLOCK eTileMode)
704*53ee8cc1Swenshuai.xi {
705*53ee8cc1Swenshuai.xi     EN_XC_DIP_TILE_BLOCK eTile;
706*53ee8cc1Swenshuai.xi     switch (eTileMode)
707*53ee8cc1Swenshuai.xi     {
708*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_R_NONE:
709*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_NONE;
710*53ee8cc1Swenshuai.xi             break;
711*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_W_NONE:
712*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_W_NONE;
713*53ee8cc1Swenshuai.xi             break;
714*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_R_16_32:
715*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_16_32;
716*53ee8cc1Swenshuai.xi             break;
717*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_W_16_32:
718*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_W_16_32;
719*53ee8cc1Swenshuai.xi             break;
720*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_R_32_16:
721*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_32_16;
722*53ee8cc1Swenshuai.xi             break;
723*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_W_32_16:
724*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_W_32_16;
725*53ee8cc1Swenshuai.xi             break;
726*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_R_32_32:
727*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_32_32;
728*53ee8cc1Swenshuai.xi             break;
729*53ee8cc1Swenshuai.xi         case DMS_DIP_TILE_BLOCK_W_32_32:
730*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_W_32_32;
731*53ee8cc1Swenshuai.xi             break;
732*53ee8cc1Swenshuai.xi         default :
733*53ee8cc1Swenshuai.xi             eTile = DIP_TILE_BLOCK_R_16_32;
734*53ee8cc1Swenshuai.xi             break;
735*53ee8cc1Swenshuai.xi     }
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi     return eTile;
738*53ee8cc1Swenshuai.xi }
739*53ee8cc1Swenshuai.xi 
_DMS_DIP_Capture_ColorFmtMapping(EN_DMS_DIP_FMT eColorFmt)740*53ee8cc1Swenshuai.xi static EN_XC_DIP_DATA_FMT _DMS_DIP_Capture_ColorFmtMapping(EN_DMS_DIP_FMT eColorFmt)
741*53ee8cc1Swenshuai.xi {
742*53ee8cc1Swenshuai.xi     EN_XC_DIP_DATA_FMT eFmt;
743*53ee8cc1Swenshuai.xi     switch (eColorFmt)
744*53ee8cc1Swenshuai.xi     {
745*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV422:
746*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV422;
747*53ee8cc1Swenshuai.xi             break;
748*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_RGB565:
749*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_RGB565;
750*53ee8cc1Swenshuai.xi             break;
751*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_ARGB8888:
752*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_ARGB8888;
753*53ee8cc1Swenshuai.xi             break;
754*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420:
755*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420;
756*53ee8cc1Swenshuai.xi             break;
757*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YC422:
758*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YC422;
759*53ee8cc1Swenshuai.xi             break;
760*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_H265:
761*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_H265;
762*53ee8cc1Swenshuai.xi             break;
763*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_H265_10BITS:
764*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_H265_10BITS;
765*53ee8cc1Swenshuai.xi             break;
766*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_PLANER:
767*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_PLANER;
768*53ee8cc1Swenshuai.xi             break;
769*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_SEMI_PLANER:
770*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_SEMI_PLANER;
771*53ee8cc1Swenshuai.xi             break;
772*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV422_MED_DI_FIELDTYPE_TOP:
773*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV422_MED_DI_FIELDTYPE_TOP;
774*53ee8cc1Swenshuai.xi             break;
775*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV422_MED_DI_FIELDTYPE_BOTTOM:
776*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV422_MED_DI_FIELDTYPE_BOTTOM;
777*53ee8cc1Swenshuai.xi             break;
778*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_MED_DI_FIELDTYPE_TOP:
779*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_MED_DI_FIELDTYPE_TOP;
780*53ee8cc1Swenshuai.xi             break;
781*53ee8cc1Swenshuai.xi         case E_DMS_DIP_FMT_YUV420_MED_DI_FIELDTYPE_BOTTOM:
782*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_YUV420_MED_DI_FIELDTYPE_BOTTOM;
783*53ee8cc1Swenshuai.xi             break;
784*53ee8cc1Swenshuai.xi         default :
785*53ee8cc1Swenshuai.xi             eFmt = DIP_DATA_FMT_MAX;
786*53ee8cc1Swenshuai.xi             break;
787*53ee8cc1Swenshuai.xi     }
788*53ee8cc1Swenshuai.xi 
789*53ee8cc1Swenshuai.xi     return eFmt;
790*53ee8cc1Swenshuai.xi }
791*53ee8cc1Swenshuai.xi 
_DMS_XC_SetCusScaling(XC_SETWIN_INFO * pXCSetWinInfo,MS_BOOL bPostScaling,MS_U16 u16Hsrc,MS_U16 u16Hdest,MS_U16 u16Vsrc,MS_U16 u16Vdest)792*53ee8cc1Swenshuai.xi static void _DMS_XC_SetCusScaling(XC_SETWIN_INFO* pXCSetWinInfo, MS_BOOL bPostScaling,MS_U16 u16Hsrc, MS_U16 u16Hdest, MS_U16 u16Vsrc, MS_U16 u16Vdest)
793*53ee8cc1Swenshuai.xi {
794*53ee8cc1Swenshuai.xi     if(pXCSetWinInfo != NULL)
795*53ee8cc1Swenshuai.xi     {
796*53ee8cc1Swenshuai.xi         if(bPostScaling)
797*53ee8cc1Swenshuai.xi         {
798*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16HCusScalingSrc = u16Hsrc;
799*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16HCusScalingDst = u16Hdest;
800*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16VCusScalingSrc = u16Vsrc;
801*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16VCusScalingDst = u16Vdest;
802*53ee8cc1Swenshuai.xi         }
803*53ee8cc1Swenshuai.xi         else
804*53ee8cc1Swenshuai.xi         {
805*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16PreHCusScalingSrc = u16Hsrc;
806*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16PreHCusScalingDst = u16Hdest;
807*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16PreVCusScalingSrc = u16Vsrc;
808*53ee8cc1Swenshuai.xi             pXCSetWinInfo->u16PreVCusScalingDst = u16Vdest;
809*53ee8cc1Swenshuai.xi         }
810*53ee8cc1Swenshuai.xi     }
811*53ee8cc1Swenshuai.xi }
812*53ee8cc1Swenshuai.xi 
_DMS_XC_WindowAlignto2(ST_DMS_WINDOW * pstDMSWindow)813*53ee8cc1Swenshuai.xi static void _DMS_XC_WindowAlignto2(ST_DMS_WINDOW *pstDMSWindow)
814*53ee8cc1Swenshuai.xi {
815*53ee8cc1Swenshuai.xi     pstDMSWindow->u32x += (pstDMSWindow->u32x % 2);
816*53ee8cc1Swenshuai.xi     pstDMSWindow->u32y += (pstDMSWindow->u32y % 2);
817*53ee8cc1Swenshuai.xi     pstDMSWindow->u32width += (pstDMSWindow->u32width % 2);
818*53ee8cc1Swenshuai.xi     pstDMSWindow->u32height += (pstDMSWindow->u32height % 2);
819*53ee8cc1Swenshuai.xi }
820*53ee8cc1Swenshuai.xi 
_DMS_XC_DMSWintoXCWin(MS_WINDOW_TYPE * pstXCWindow,ST_DMS_WINDOW * pstDMSWindow)821*53ee8cc1Swenshuai.xi static void _DMS_XC_DMSWintoXCWin(MS_WINDOW_TYPE *pstXCWindow, ST_DMS_WINDOW *pstDMSWindow)
822*53ee8cc1Swenshuai.xi {
823*53ee8cc1Swenshuai.xi     pstXCWindow->x = (pstDMSWindow->u32x);
824*53ee8cc1Swenshuai.xi     pstXCWindow->y = (pstDMSWindow->u32y);
825*53ee8cc1Swenshuai.xi     pstXCWindow->width = (pstDMSWindow->u32width);
826*53ee8cc1Swenshuai.xi     pstXCWindow->height = (pstDMSWindow->u32height);
827*53ee8cc1Swenshuai.xi }
828*53ee8cc1Swenshuai.xi 
_GetPreviousBufferID(MS_U16 u16CurID)829*53ee8cc1Swenshuai.xi static MS_U16 _GetPreviousBufferID(MS_U16 u16CurID)
830*53ee8cc1Swenshuai.xi {
831*53ee8cc1Swenshuai.xi     if (u16CurID == 0)
832*53ee8cc1Swenshuai.xi     {
833*53ee8cc1Swenshuai.xi         return (DMS_DIP_QUEUEDEPTH - 1);
834*53ee8cc1Swenshuai.xi     }
835*53ee8cc1Swenshuai.xi     else
836*53ee8cc1Swenshuai.xi     {
837*53ee8cc1Swenshuai.xi         return (u16CurID - 1);
838*53ee8cc1Swenshuai.xi     }
839*53ee8cc1Swenshuai.xi }
840*53ee8cc1Swenshuai.xi 
_GetNextBufferID(MS_U16 u16CurID)841*53ee8cc1Swenshuai.xi static MS_U16 _GetNextBufferID(MS_U16 u16CurID)
842*53ee8cc1Swenshuai.xi {
843*53ee8cc1Swenshuai.xi     return ((u16CurID + 1) % DMS_DIP_QUEUEDEPTH);
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi 
_IsFrameRefCountZero(MS_U32 u32Window,MS_U16 u16BufID)846*53ee8cc1Swenshuai.xi static MS_BOOL _IsFrameRefCountZero(MS_U32 u32Window, MS_U16 u16BufID)
847*53ee8cc1Swenshuai.xi {
848*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
849*53ee8cc1Swenshuai.xi     if((RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID] == 0)
850*53ee8cc1Swenshuai.xi         && (RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID] == 0))
851*53ee8cc1Swenshuai.xi     {
852*53ee8cc1Swenshuai.xi         return TRUE;
853*53ee8cc1Swenshuai.xi     }
854*53ee8cc1Swenshuai.xi     else
855*53ee8cc1Swenshuai.xi     {
856*53ee8cc1Swenshuai.xi         return FALSE;
857*53ee8cc1Swenshuai.xi     }
858*53ee8cc1Swenshuai.xi }
859*53ee8cc1Swenshuai.xi 
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi 
_DMS_GetDMSScanType(MS_U8 u8ScanType)862*53ee8cc1Swenshuai.xi E_DMS_VIDEO_SCAN_TYPE _DMS_GetDMSScanType(MS_U8 u8ScanType)
863*53ee8cc1Swenshuai.xi {
864*53ee8cc1Swenshuai.xi     // ProgressiveFrame = 0,   /** Picture is a progressive frame */
865*53ee8cc1Swenshuai.xi     // InterlacedFrame  = 2,    /** Picture is an interlaced frame */
866*53ee8cc1Swenshuai.xi     // InterlacedField  = 3,      /** Picture is two interlaced fields */
867*53ee8cc1Swenshuai.xi     // InterlacedFrame  = 1,      MVD bring 1 to push interlace frame
868*53ee8cc1Swenshuai.xi     E_DMS_VIDEO_SCAN_TYPE eScanType = E_DMS_VIDEO_SCAN_TYPE_MAX;
869*53ee8cc1Swenshuai.xi     switch (u8ScanType)
870*53ee8cc1Swenshuai.xi     {
871*53ee8cc1Swenshuai.xi         case 0:
872*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_PROGRESSIVE;
873*53ee8cc1Swenshuai.xi             break;
874*53ee8cc1Swenshuai.xi         case 1:
875*53ee8cc1Swenshuai.xi         case 2:
876*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME;
877*53ee8cc1Swenshuai.xi             break;
878*53ee8cc1Swenshuai.xi         case 3:
879*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD;
880*53ee8cc1Swenshuai.xi             break;
881*53ee8cc1Swenshuai.xi         default:
882*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_MAX;
883*53ee8cc1Swenshuai.xi             break;
884*53ee8cc1Swenshuai.xi     }
885*53ee8cc1Swenshuai.xi     return eScanType;
886*53ee8cc1Swenshuai.xi }
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi #if DEV_DI
889*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_Fire(E_DMS_DIP_ACTION eAction);
890*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_WaitWriteDone(E_DMS_DIP_ACTION eAction);
891*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPRWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID);
892*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPWWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID);
893*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID);
894*53ee8cc1Swenshuai.xi static void _DMS_StoreVDECInfo2DIPQueue(void* pInstance, DMS_VDECFRAME_INFO *VDECDispFrame);
895*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
896*53ee8cc1Swenshuai.xi static void _DMS_DIP_SyncStoredSetting(void);
897*53ee8cc1Swenshuai.xi #endif
898*53ee8cc1Swenshuai.xi static MS_S32 XC_Di_Push_Event_id = -1;
899*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
900*53ee8cc1Swenshuai.xi static MS_S32  s32DIPTaskID_Interlace = -1;
901*53ee8cc1Swenshuai.xi #endif
902*53ee8cc1Swenshuai.xi #define di_sync_print(fmt, args...) do { if(0) DMS_PRINTF(fmt, ##args);  } while (0)
903*53ee8cc1Swenshuai.xi MS_PHY tempAddr = 0x0;
904*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DIBufferRingToNext(void)905*53ee8cc1Swenshuai.xi static void _DIBufferRingToNext(void)
906*53ee8cc1Swenshuai.xi {
907*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
908*53ee8cc1Swenshuai.xi     RES_DMSDI.u8DIRingBufferID++;
909*53ee8cc1Swenshuai.xi     if(RES_DMSDI.u8DIRingBufferID == DMS_DI_RING_BUFFER)
910*53ee8cc1Swenshuai.xi     {
911*53ee8cc1Swenshuai.xi         RES_DMSDI.u8DIRingBufferID = 0;
912*53ee8cc1Swenshuai.xi     }
913*53ee8cc1Swenshuai.xi }
914*53ee8cc1Swenshuai.xi #endif
_GetDIRingBufferAddr(MS_U32 u32Window,MS_U8 u8RingBufID)915*53ee8cc1Swenshuai.xi static MS_PHY _GetDIRingBufferAddr(MS_U32 u32Window, MS_U8 u8RingBufID)
916*53ee8cc1Swenshuai.xi {
917*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
918*53ee8cc1Swenshuai.xi     if(u8RingBufID >= DMS_DI_RING_BUFFER)
919*53ee8cc1Swenshuai.xi     {
920*53ee8cc1Swenshuai.xi         DMS_PRINTF("_GetDIRingBufferAddr error, %d\n",u8RingBufID);
921*53ee8cc1Swenshuai.xi     }
922*53ee8cc1Swenshuai.xi     return RES_DMS._stXC_DIPWinInfo[u32Window].phyDIPRingBufMemAddr[u8RingBufID];
923*53ee8cc1Swenshuai.xi }
924*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_VDEC_Frame_AddRef_Interlace(MS_U32 u32Window,MS_U16 u16BufID)925*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_AddRef_Interlace(MS_U32 u32Window, MS_U16 u16BufID)
926*53ee8cc1Swenshuai.xi {
927*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
928*53ee8cc1Swenshuai.xi #if NEW_FLIP
929*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[AddRef] bid[0x%x], ct[0x%x]\n",u16BufID,RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID]);
930*53ee8cc1Swenshuai.xi     VDEC_StreamId VdecStreamId;
931*53ee8cc1Swenshuai.xi     VDEC_EX_DispFrame VdecDispFrm;
932*53ee8cc1Swenshuai.xi     VdecStreamId.u32Version = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamVersion;
933*53ee8cc1Swenshuai.xi     VdecStreamId.u32Id = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamID;
934*53ee8cc1Swenshuai.xi     VdecDispFrm.u32Idx = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex;
935*53ee8cc1Swenshuai.xi     VdecDispFrm.u32PriData = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32PriData;
936*53ee8cc1Swenshuai.xi     VDEC_EX_Result eResult;
937*53ee8cc1Swenshuai.xi     eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
938*53ee8cc1Swenshuai.xi     if (eResult != E_VDEC_EX_OK)
939*53ee8cc1Swenshuai.xi     {
940*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] %d %d, %d %d\n",__FUNCTION__,VdecStreamId.u32Version,VdecStreamId.u32Id,
941*53ee8cc1Swenshuai.xi             VdecDispFrm.u32Idx,VdecDispFrm.u32PriData);
942*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %d, BufID %d, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,u32Window,u16BufID,eResult);
943*53ee8cc1Swenshuai.xi         return FALSE;
944*53ee8cc1Swenshuai.xi     }
945*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].eScanType))
946*53ee8cc1Swenshuai.xi     {
947*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamVersion;
948*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamID;
949*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex_2nd;
950*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32PriData_2nd;
951*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
952*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
953*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
954*53ee8cc1Swenshuai.xi         {
955*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %d %d, %d %d\n",__FUNCTION__,VdecStreamId.u32Version,VdecStreamId.u32Id,
956*53ee8cc1Swenshuai.xi                 VdecDispFrm.u32Idx,VdecDispFrm.u32PriData);
957*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %d, BufID %d, 2nd Field, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,u32Window,u16BufID,eResult);
958*53ee8cc1Swenshuai.xi             return FALSE;
959*53ee8cc1Swenshuai.xi         }
960*53ee8cc1Swenshuai.xi     }
961*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[AddRef] Frame[0x%x], PriData[0x%x]\n",RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex,RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32PriData);
962*53ee8cc1Swenshuai.xi     RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID]++;
963*53ee8cc1Swenshuai.xi 
964*53ee8cc1Swenshuai.xi #if DBG_FPS
965*53ee8cc1Swenshuai.xi     u32FPS_Add_Counter[u32Window]++;
966*53ee8cc1Swenshuai.xi #endif
967*53ee8cc1Swenshuai.xi #endif
968*53ee8cc1Swenshuai.xi     return TRUE;
969*53ee8cc1Swenshuai.xi }
970*53ee8cc1Swenshuai.xi #endif
_DMS_VDEC_Frame_Release_Interlace(MS_U32 u32Window,MS_U16 u16BufID)971*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_Release_Interlace(MS_U32 u32Window, MS_U16 u16BufID)
972*53ee8cc1Swenshuai.xi {
973*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
974*53ee8cc1Swenshuai.xi #if NEW_FLIP
975*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[Releas] bid[0x%x], ct[0x%x]\n",u16BufID,RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID]);
976*53ee8cc1Swenshuai.xi 
977*53ee8cc1Swenshuai.xi     if(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex == DMS_INVALID_FRAME_ID)
978*53ee8cc1Swenshuai.xi     {
979*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
980*53ee8cc1Swenshuai.xi         return TRUE;
981*53ee8cc1Swenshuai.xi     }
982*53ee8cc1Swenshuai.xi     if(RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID] == 0)
983*53ee8cc1Swenshuai.xi     {
984*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer (release a ref 0 frame)\n",__FUNCTION__,u32Window,u16BufID);
985*53ee8cc1Swenshuai.xi         return TRUE;
986*53ee8cc1Swenshuai.xi     }
987*53ee8cc1Swenshuai.xi     RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID]--;
988*53ee8cc1Swenshuai.xi     if(RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID] == 0)
989*53ee8cc1Swenshuai.xi     {
990*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
991*53ee8cc1Swenshuai.xi         VDEC_EX_DispFrame VdecDispFrm;
992*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamVersion;
993*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamID;
994*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex;
995*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32PriData;
996*53ee8cc1Swenshuai.xi 
997*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
998*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
999*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
1000*53ee8cc1Swenshuai.xi         {
1001*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1002*53ee8cc1Swenshuai.xi                 (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1003*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %d, BufID %td, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1004*53ee8cc1Swenshuai.xi             return FALSE;
1005*53ee8cc1Swenshuai.xi         }
1006*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFieldBaseInterlace(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].eScanType))
1007*53ee8cc1Swenshuai.xi         {
1008*53ee8cc1Swenshuai.xi             VdecStreamId.u32Version = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamVersion;
1009*53ee8cc1Swenshuai.xi             VdecStreamId.u32Id = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32VDECStreamID;
1010*53ee8cc1Swenshuai.xi             VdecDispFrm.u32Idx = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex_2nd;
1011*53ee8cc1Swenshuai.xi             VdecDispFrm.u32PriData = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32PriData_2nd;
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi             VDEC_EX_Result eResult;
1014*53ee8cc1Swenshuai.xi             eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
1015*53ee8cc1Swenshuai.xi             if (eResult != E_VDEC_EX_OK)
1016*53ee8cc1Swenshuai.xi             {
1017*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1018*53ee8cc1Swenshuai.xi                     (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1019*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] window %td, BufID %d, 2nd Field, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1020*53ee8cc1Swenshuai.xi                 return FALSE;
1021*53ee8cc1Swenshuai.xi             }
1022*53ee8cc1Swenshuai.xi         }
1023*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[Releas] Frame[0x%x], PriData[0x%x]\n",_stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex,_stXC_DIPDIInfo[u32Window][u16BufID].u32PriData);
1024*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufID].u32FrameIndex = DMS_INVALID_FRAME_ID;
1025*53ee8cc1Swenshuai.xi     }
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi #if DBG_FPS
1028*53ee8cc1Swenshuai.xi     u32FPS_Release_Counter[u32Window]++;
1029*53ee8cc1Swenshuai.xi #endif
1030*53ee8cc1Swenshuai.xi #endif
1031*53ee8cc1Swenshuai.xi     return TRUE;
1032*53ee8cc1Swenshuai.xi }
1033*53ee8cc1Swenshuai.xi 
_DMS_Clear_VDEC_Frame_Ref_Interlace(MS_U32 u32Window,MS_U16 u16BufID)1034*53ee8cc1Swenshuai.xi static void _DMS_Clear_VDEC_Frame_Ref_Interlace(MS_U32 u32Window, MS_U16 u16BufID)
1035*53ee8cc1Swenshuai.xi {
1036*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1037*53ee8cc1Swenshuai.xi     MS_U8 u8RefCounter = 0;
1038*53ee8cc1Swenshuai.xi     for(u8RefCounter = 0; u8RefCounter < RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16BufID]; u8RefCounter++)
1039*53ee8cc1Swenshuai.xi     {
1040*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %td release frame for WP %d ct %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,(u8RefCounter+1));
1041*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_Release_Interlace(u32Window,u16BufID);
1042*53ee8cc1Swenshuai.xi     }
1043*53ee8cc1Swenshuai.xi }
1044*53ee8cc1Swenshuai.xi 
_MDrv_DMS_DI_Init(void)1045*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMS_DI_Init(void)
1046*53ee8cc1Swenshuai.xi {
1047*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1048*53ee8cc1Swenshuai.xi     MS_U32 u32DIPDISize = (4/2) * DMS_FHD_Hszie * DMS_FHD_Vszie * 4;
1049*53ee8cc1Swenshuai.xi     ST_XC_DIPR_PROPERTY_EX DIPRWinPropertytoShow_EX;
1050*53ee8cc1Swenshuai.xi     ST_DIP_DI_SETTING DIP3DDISetting;
1051*53ee8cc1Swenshuai.xi     memset(&DIPRWinPropertytoShow_EX,0,sizeof(ST_XC_DIPR_PROPERTY_EX));
1052*53ee8cc1Swenshuai.xi     memset(&DIP3DDISetting,0,sizeof(ST_DIP_DI_SETTING));
1053*53ee8cc1Swenshuai.xi     ST_DIP_DI_NWAY_BUF_INFO stDINwayBuf[32];
1054*53ee8cc1Swenshuai.xi 
1055*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width = 1920;
1056*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = 1080;
1057*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch = 1920;
1058*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = _GetDIRingBufferAddr(MVOP_WINDOW, RES_DMSDI.u8DIRingBufferID);
1059*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr + u32DIPDISize;
1060*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt = DIP_DATA_FMT_YUV420;
1061*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bMFDec_Enable = FALSE;
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi     DIP3DDISetting.bEnableDI = TRUE;
1064*53ee8cc1Swenshuai.xi     DIP3DDISetting.bInitDI = TRUE;
1065*53ee8cc1Swenshuai.xi     DIP3DDISetting.stInitInfo.phyDIInitAddr = RES_DMSDI.u32DIPDIAddress_pa;
1066*53ee8cc1Swenshuai.xi     DIP3DDISetting.stInitInfo.u32DIInitSize = 0x23456;
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi     DIP3DDISetting.u8NwayIndex = 0;
1069*53ee8cc1Swenshuai.xi     DIP3DDISetting.enDI_Field = E_DIP_3DDI_TOP_BOTH_FIELD_STAGGER;
1070*53ee8cc1Swenshuai.xi     DIP3DDISetting.bEnaNwayInfoRefresh = TRUE;
1071*53ee8cc1Swenshuai.xi     DIP3DDISetting.u8NwayBufCnt = 1;
1072*53ee8cc1Swenshuai.xi     DIP3DDISetting.bEnableBob = TRUE;
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi     stDINwayBuf[0].phyDI_BufAddr = RES_DMSDI.u32DIPDIAddress_pa;
1075*53ee8cc1Swenshuai.xi     stDINwayBuf[0].u32DI_BufSize = u32DIPDISize;
1076*53ee8cc1Swenshuai.xi     stDINwayBuf[0].u8DIBufCnt = 4;
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi     DIP3DDISetting.stDINwayBufInfo = (void*)stDINwayBuf;
1079*53ee8cc1Swenshuai.xi 
1080*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
1081*53ee8cc1Swenshuai.xi     DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
1082*53ee8cc1Swenshuai.xi 
1083*53ee8cc1Swenshuai.xi     //weak symbol test
1084*53ee8cc1Swenshuai.xi     if(MApi_XC_DIP_SetDIPRProperty_EX)
1085*53ee8cc1Swenshuai.xi     {
1086*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetDIPRProperty_EX(&DIPRWinPropertytoShow_EX, DIP_WINDOW);
1087*53ee8cc1Swenshuai.xi     }
1088*53ee8cc1Swenshuai.xi     else
1089*53ee8cc1Swenshuai.xi     {
1090*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetDIPRProperty(&DIPRWinPropertytoShow_EX.stDIPRProperty, DIP_WINDOW);
1091*53ee8cc1Swenshuai.xi     }
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIStartAddr = RES_DMSDI.u32DIPDIAddress_pa;
1094*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIEndAddr= RES_DMSDI.u32DIPDIAddress_pa + u32DIPDISize;
1095*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DISize = u32DIPDISize;
1096*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u8DIBufCnt = 4; // 4 DI temp buffer
1097*53ee8cc1Swenshuai.xi 
1098*53ee8cc1Swenshuai.xi     return TRUE;
1099*53ee8cc1Swenshuai.xi }
1100*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_GetNextWritePointerInterlace(MS_U32 u32Window)1101*53ee8cc1Swenshuai.xi static MS_U16 _GetNextWritePointerInterlace(MS_U32 u32Window)
1102*53ee8cc1Swenshuai.xi {
1103*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1104*53ee8cc1Swenshuai.xi     return _GetNextBufferID(RES_DMSDI._stXC_DIPWriteReadPointerInterlace[u32Window].u16WritePointer);
1105*53ee8cc1Swenshuai.xi }
1106*53ee8cc1Swenshuai.xi 
1107*53ee8cc1Swenshuai.xi #if DEV_IMODE_PAUSE
_DIPDi_RePush_Handler(MS_U32 stTimer,MS_U32 u32TimerID)1108*53ee8cc1Swenshuai.xi static void _DIPDi_RePush_Handler(MS_U32 stTimer, MS_U32 u32TimerID)
1109*53ee8cc1Swenshuai.xi {
1110*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
1111*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1112*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1113*53ee8cc1Swenshuai.xi     if(RES_DMSDI._bSetwinToDiTask_DoubleBuffer)
1114*53ee8cc1Swenshuai.xi     {
1115*53ee8cc1Swenshuai.xi #if DEV_DI_EVENT
1116*53ee8cc1Swenshuai.xi         MsOS_SetEvent(XC_Di_Push_Event_id, 0x01);
1117*53ee8cc1Swenshuai.xi #else
1118*53ee8cc1Swenshuai.xi         RES_DMSDI.bFlipToDiTask = TRUE;
1119*53ee8cc1Swenshuai.xi #endif
1120*53ee8cc1Swenshuai.xi         printf("[%s] trigger Flip PushedInterlace!\n",__FUNCTION__);
1121*53ee8cc1Swenshuai.xi     }
1122*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1123*53ee8cc1Swenshuai.xi }
1124*53ee8cc1Swenshuai.xi #endif
1125*53ee8cc1Swenshuai.xi #endif
1126*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_Task_CapturePushedInterlaceFrame(void)1127*53ee8cc1Swenshuai.xi static MS_BOOL _Task_CapturePushedInterlaceFrame(void)
1128*53ee8cc1Swenshuai.xi {
1129*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
1130*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
1131*53ee8cc1Swenshuai.xi #if DEV_DI_EVENT
1132*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0);
1133*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
1134*53ee8cc1Swenshuai.xi #endif
1135*53ee8cc1Swenshuai.xi     MS_U8  i = 0;
1136*53ee8cc1Swenshuai.xi     MS_U8  u8FrameIdx = 0;
1137*53ee8cc1Swenshuai.xi     MS_U8  u8FrameNum = 0;
1138*53ee8cc1Swenshuai.xi     MS_U8  u8FieldNum = 0;
1139*53ee8cc1Swenshuai.xi #if DEV_IMODE_PAUSE
1140*53ee8cc1Swenshuai.xi     MS_BOOL  s32DIPDiRePushTimerFlag = FALSE;
1141*53ee8cc1Swenshuai.xi #endif
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     // coverity[no_escape]
1144*53ee8cc1Swenshuai.xi     while(1)
1145*53ee8cc1Swenshuai.xi     {
1146*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1147*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
1148*53ee8cc1Swenshuai.xi 
1149*53ee8cc1Swenshuai.xi         MS_U16 u16CheckDiBufferID = RES_DMSDI._u8DMS_DiSetEventBufferID;
1150*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1151*53ee8cc1Swenshuai.xi #if DEV_IMODE_PAUSE
1152*53ee8cc1Swenshuai.xi         if(u16CheckDiBufferID == DMS_Invalid_ReadPointer_ID)
1153*53ee8cc1Swenshuai.xi         {
1154*53ee8cc1Swenshuai.xi             if (s32DIPDiRePushTimerId >= 0)
1155*53ee8cc1Swenshuai.xi             {
1156*53ee8cc1Swenshuai.xi                 MsOS_DeleteTimer(s32DIPDiRePushTimerId);
1157*53ee8cc1Swenshuai.xi                 s32DIPDiRePushTimerId = -1;
1158*53ee8cc1Swenshuai.xi             }
1159*53ee8cc1Swenshuai.xi             continue;
1160*53ee8cc1Swenshuai.xi         }
1161*53ee8cc1Swenshuai.xi         else
1162*53ee8cc1Swenshuai.xi         {
1163*53ee8cc1Swenshuai.xi             MS_U32 u32InputFrameRate = 100;//1000000/(_stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32FrameRate*2);
1164*53ee8cc1Swenshuai.xi             if (s32DIPDiRePushTimerId < 0)
1165*53ee8cc1Swenshuai.xi             {
1166*53ee8cc1Swenshuai.xi                 //printf("[%s][%d] Create timer with period 100ms !!\n", __FUNCTION__, __LINE__,u32InputFrameRate,_stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32FrameRate);
1167*53ee8cc1Swenshuai.xi                 s32DIPDiRePushTimerId = MsOS_CreateTimer(_DIPDi_RePush_Handler,
1168*53ee8cc1Swenshuai.xi                                                     u32InputFrameRate,
1169*53ee8cc1Swenshuai.xi                                                     u32InputFrameRate,
1170*53ee8cc1Swenshuai.xi                                                     TRUE,
1171*53ee8cc1Swenshuai.xi                                                      "DIPDiRePushTimer");
1172*53ee8cc1Swenshuai.xi                 s32DIPDiRePushTimerFlag = TRUE;
1173*53ee8cc1Swenshuai.xi             }
1174*53ee8cc1Swenshuai.xi             else if(s32DIPDiRePushTimerFlag == FALSE)
1175*53ee8cc1Swenshuai.xi             {
1176*53ee8cc1Swenshuai.xi                 s32DIPDiRePushTimerFlag = TRUE;
1177*53ee8cc1Swenshuai.xi                 MsOS_StartTimer(s32DIPDiRePushTimerId);
1178*53ee8cc1Swenshuai.xi             }
1179*53ee8cc1Swenshuai.xi         }
1180*53ee8cc1Swenshuai.xi #endif
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi #if DEV_DI_EVENT
1183*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(XC_Di_Push_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
1184*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1185*53ee8cc1Swenshuai.xi #else
1186*53ee8cc1Swenshuai.xi         MsOS_DelayTask(5);
1187*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1188*53ee8cc1Swenshuai.xi         if(RES_DMSDI.bFlipToDiTask)
1189*53ee8cc1Swenshuai.xi         {
1190*53ee8cc1Swenshuai.xi             RES_DMSDI.bFlipToDiTask = FALSE;
1191*53ee8cc1Swenshuai.xi         }
1192*53ee8cc1Swenshuai.xi         else
1193*53ee8cc1Swenshuai.xi         {
1194*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1195*53ee8cc1Swenshuai.xi             continue;
1196*53ee8cc1Swenshuai.xi         }
1197*53ee8cc1Swenshuai.xi #endif
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi #if DEV_IMODE_PAUSE
1200*53ee8cc1Swenshuai.xi         if (s32DIPDiRePushTimerFlag == TRUE)
1201*53ee8cc1Swenshuai.xi         {
1202*53ee8cc1Swenshuai.xi             MsOS_StopTimer(s32DIPDiRePushTimerId);
1203*53ee8cc1Swenshuai.xi             s32DIPDiRePushTimerFlag = FALSE;
1204*53ee8cc1Swenshuai.xi         }
1205*53ee8cc1Swenshuai.xi #endif
1206*53ee8cc1Swenshuai.xi         MS_U16 u16NextReadPointer = RES_DMSDI._u8DMS_DiSetEventBufferID;
1207*53ee8cc1Swenshuai.xi         if(u16NextReadPointer == DMS_Invalid_ReadPointer_ID)
1208*53ee8cc1Swenshuai.xi         {
1209*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1210*53ee8cc1Swenshuai.xi             continue;
1211*53ee8cc1Swenshuai.xi         }
1212*53ee8cc1Swenshuai.xi 
1213*53ee8cc1Swenshuai.xi         for(u8WindowID=0; u8WindowID < 1; u8WindowID++)
1214*53ee8cc1Swenshuai.xi         {
1215*53ee8cc1Swenshuai.xi             //Get Next frame info
1216*53ee8cc1Swenshuai.xi             u8FrameNum = (RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)? 2 : 1;
1217*53ee8cc1Swenshuai.xi             for(u8FrameIdx=0; u8FrameIdx<u8FrameNum; u8FrameIdx++)
1218*53ee8cc1Swenshuai.xi             {
1219*53ee8cc1Swenshuai.xi                 u8FieldNum = (RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTH)? 2 : 1;
1220*53ee8cc1Swenshuai.xi                 _DMS_DIP_SyncStoredSetting();
1221*53ee8cc1Swenshuai.xi                 for(i = 0 ; i < u8FieldNum; i ++)
1222*53ee8cc1Swenshuai.xi                 {
1223*53ee8cc1Swenshuai.xi                     MS_BOOL bSetwinToDiTask = RES_DMSDI._bSetwinToDiTask_DoubleBuffer;
1224*53ee8cc1Swenshuai.xi                     RES_DMSDI.u8DIPReadytoCaptureIDInterlace[u8WindowID] = u16NextReadPointer;
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi                     if(gDMSDebug == 1)
1227*53ee8cc1Swenshuai.xi                         gDMSDebug = 2;
1228*53ee8cc1Swenshuai.xi                     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi                     while(MApi_XC_DIP_GetResource(DIP_WINDOW) == E_APIXC_RET_FAIL)
1231*53ee8cc1Swenshuai.xi                     {
1232*53ee8cc1Swenshuai.xi                         MsOS_DelayTask(1);
1233*53ee8cc1Swenshuai.xi                     }
1234*53ee8cc1Swenshuai.xi 
1235*53ee8cc1Swenshuai.xi                     //Disable BK1336 reg3[8]
1236*53ee8cc1Swenshuai.xi                     MApi_XC_W2BYTEMSK(REG_SC_BK36_03_L,0x0000,0x0100);
1237*53ee8cc1Swenshuai.xi                     if(_DMS_Is_MVOPFlow(u8WindowID) == FALSE)
1238*53ee8cc1Swenshuai.xi                     {
1239*53ee8cc1Swenshuai.xi                         MApi_XC_DIP_SwapUV(TRUE ,DIP_WINDOW);
1240*53ee8cc1Swenshuai.xi                     }
1241*53ee8cc1Swenshuai.xi                     else
1242*53ee8cc1Swenshuai.xi                     {
1243*53ee8cc1Swenshuai.xi                         MApi_XC_DIP_SwapUV(FALSE ,DIP_WINDOW);
1244*53ee8cc1Swenshuai.xi                     }
1245*53ee8cc1Swenshuai.xi                     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1246*53ee8cc1Swenshuai.xi 
1247*53ee8cc1Swenshuai.xi                     _DIBufferRingToNext();
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_SetOutputDataFmt(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt, DIP_WINDOW);
1250*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_EnableR2Y(FALSE,DIP_WINDOW);
1251*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_EnableY2R(FALSE,DIP_WINDOW);
1252*53ee8cc1Swenshuai.xi                     // set DIP read/write window
1253*53ee8cc1Swenshuai.xi                     _DMS_SetDIPWindow(E_DMS_DIP_DI, u8WindowID, u16NextReadPointer);
1254*53ee8cc1Swenshuai.xi                     //di_sync_print("\033[1;35mDi+F %d: 0x%x, 0x%llx , MainQ %d \033[0m\n",MsOS_GetSystemTime(), RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32PriData,_GetDIRingBufferAddr(u8WindowID,RES_DMSDI.u8DIRingBufferID),RES_DMS._stXC_DIPWriteReadPointer[u8WindowID].u16WritePointer);
1255*53ee8cc1Swenshuai.xi                     if(_GetDIRingBufferAddr(u8WindowID,RES_DMSDI.u8DIRingBufferID) == tempAddr)
1256*53ee8cc1Swenshuai.xi                     {
1257*53ee8cc1Swenshuai.xi                         DMS_PRINTF("\033[1;31mDI hit showing buffer!! Addr 0x%llx, MainQ %d\033[0m\n",tempAddr,RES_DMS._stXC_DIPWriteReadPointer[u8WindowID].u16WritePointer);
1258*53ee8cc1Swenshuai.xi                     }
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi                     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1261*53ee8cc1Swenshuai.xi                     //printf("\033[1;31m[%d] Write Ring Buffer %d, DIP start \033[0m\n",MsOS_GetSystemTime(),RES_DMSDI.u8DIRingBufferID);
1262*53ee8cc1Swenshuai.xi                     // enable DIP
1263*53ee8cc1Swenshuai.xi                     //MApi_XC_W2BYTEMSK(0x3460,0x0000,0x0001);
1264*53ee8cc1Swenshuai.xi                     //MApi_XC_W2BYTEMSK(0x34D8,0x0000,0x0600);
1265*53ee8cc1Swenshuai.xi                     _DMS_DIP_Fire(E_DMS_DIP_DI);
1266*53ee8cc1Swenshuai.xi 
1267*53ee8cc1Swenshuai.xi                     // Wait DIP write done
1268*53ee8cc1Swenshuai.xi                     _DMS_DIP_WaitWriteDone(E_DMS_DIP_DI);
1269*53ee8cc1Swenshuai.xi                     //printf("\033[1;31m[%d] Write Ring Buffer %d, DIP end \033[0m\n",MsOS_GetSystemTime(),RES_DMSDI.u8DIRingBufferID);
1270*53ee8cc1Swenshuai.xi                     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].bValid = FALSE;
1273*53ee8cc1Swenshuai.xi                     if(gDMSDebug == 2)
1274*53ee8cc1Swenshuai.xi                     {
1275*53ee8cc1Swenshuai.xi                         DMS_PRINTF("\033[1;31m[%d] interlace Capture ID %d, Ring buffer ID %d\033[0m\n",MsOS_GetSystemTime(),RES_DMSDI.u8DIPReadytoCaptureIDInterlace[u8WindowID],RES_DMSDI.u8DIRingBufferID);
1276*53ee8cc1Swenshuai.xi                         gDMSDebug++;
1277*53ee8cc1Swenshuai.xi                     }
1278*53ee8cc1Swenshuai.xi 
1279*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_Ena(FALSE,DIP_WINDOW);
1280*53ee8cc1Swenshuai.xi 
1281*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_ReleaseResource(DIP_WINDOW);
1282*53ee8cc1Swenshuai.xi 
1283*53ee8cc1Swenshuai.xi                     if(RES_DMSDI._u8DMS_DiReleaseVDECFrameBufferID != DMS_Invalid_ReadPointer_ID &&
1284*53ee8cc1Swenshuai.xi                         RES_DMSDI._u8DMS_DiReleaseVDECFrameBufferID != u16NextReadPointer)
1285*53ee8cc1Swenshuai.xi                     {
1286*53ee8cc1Swenshuai.xi                         _DMS_VDEC_Frame_Release_Interlace(u8WindowID,RES_DMSDI._u8DMS_DiReleaseVDECFrameBufferID);
1287*53ee8cc1Swenshuai.xi                     }
1288*53ee8cc1Swenshuai.xi                     RES_DMSDI._u8DMS_DiReleaseVDECFrameBufferID = u16NextReadPointer;
1289*53ee8cc1Swenshuai.xi 
1290*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].bIsAfterDiTask = TRUE;
1291*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u8DiOutputRingBufferID = RES_DMSDI.u8DIRingBufferID;
1292*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].eFmt = E_DMS_VIDEO_DATA_FMT_YUV422;
1293*53ee8cc1Swenshuai.xi                     MS_U32 tempFrameIndex = RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32FrameIndex;
1294*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32FrameIndex = DMS_INVALID_FRAME_ID;
1295*53ee8cc1Swenshuai.xi 
1296*53ee8cc1Swenshuai.xi                     _DMS_StoreVDECInfo2DIPQueue(pInstance, &RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer]);
1297*53ee8cc1Swenshuai.xi                     RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32FrameIndex = tempFrameIndex;
1298*53ee8cc1Swenshuai.xi                     di_sync_print("\033[1;35mDi W %d: 0x%x, 0x%llx , MainQ %d write done\033[0m\n",MsOS_GetSystemTime(),RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].u32PriData,_GetDIRingBufferAddr(u8WindowID,RES_DMSDI.u8DIRingBufferID),RES_DMS._stXC_DIPWriteReadPointer[u8WindowID].u16WritePointer);
1299*53ee8cc1Swenshuai.xi                     if(i == 0 && bSetwinToDiTask)
1300*53ee8cc1Swenshuai.xi                     {
1301*53ee8cc1Swenshuai.xi                         _DMS_Add_XC_Status(u8WindowID, DMS_XC_RESET_WINDOW_SIZE);
1302*53ee8cc1Swenshuai.xi                         RES_DMSDI._bSetwinToDiTask_DoubleBuffer = FALSE;
1303*53ee8cc1Swenshuai.xi                     }
1304*53ee8cc1Swenshuai.xi 
1305*53ee8cc1Swenshuai.xi #if DBG_FPS
1306*53ee8cc1Swenshuai.xi                     u32FPS_Di_Counter[u8WindowID]++;
1307*53ee8cc1Swenshuai.xi #endif
1308*53ee8cc1Swenshuai.xi                     if((RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTH) &&
1309*53ee8cc1Swenshuai.xi                         (RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].bIs2ndField == FALSE))
1310*53ee8cc1Swenshuai.xi                     {
1311*53ee8cc1Swenshuai.xi                         MS_U16 u16NextID = _GetNextBufferID(u16NextReadPointer);
1312*53ee8cc1Swenshuai.xi                         if(RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextID].bValid == TRUE)
1313*53ee8cc1Swenshuai.xi                         {
1314*53ee8cc1Swenshuai.xi                             u16NextReadPointer = u16NextID;
1315*53ee8cc1Swenshuai.xi                         }
1316*53ee8cc1Swenshuai.xi                         else
1317*53ee8cc1Swenshuai.xi                         {
1318*53ee8cc1Swenshuai.xi                             DMS_PRINTF("!!!!![%s][%d] Error!! can not get 2nd field when VIDEO_FIELD_TYPE_BOTH\n",__FUNCTION__,__LINE__);
1319*53ee8cc1Swenshuai.xi                         }
1320*53ee8cc1Swenshuai.xi                     }
1321*53ee8cc1Swenshuai.xi                 }
1322*53ee8cc1Swenshuai.xi                 if((RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD) &&
1323*53ee8cc1Swenshuai.xi                     (RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextReadPointer].bIs2ndField == FALSE))
1324*53ee8cc1Swenshuai.xi                 {
1325*53ee8cc1Swenshuai.xi                     MS_U16 u16NextID = _GetNextBufferID(u16NextReadPointer);
1326*53ee8cc1Swenshuai.xi                     if(RES_DMSDI._stXC_DIPDIInfo[u8WindowID][u16NextID].bValid == TRUE)
1327*53ee8cc1Swenshuai.xi                     {
1328*53ee8cc1Swenshuai.xi                         u16NextReadPointer = u16NextID;
1329*53ee8cc1Swenshuai.xi                     }
1330*53ee8cc1Swenshuai.xi                     else
1331*53ee8cc1Swenshuai.xi                     {
1332*53ee8cc1Swenshuai.xi                         DMS_PRINTF("!!!!![%s][%d] Error!! can not get 2nd field when E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD\n",__FUNCTION__,__LINE__);
1333*53ee8cc1Swenshuai.xi                     }
1334*53ee8cc1Swenshuai.xi                 }
1335*53ee8cc1Swenshuai.xi             }
1336*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1337*53ee8cc1Swenshuai.xi         }
1338*53ee8cc1Swenshuai.xi     }
1339*53ee8cc1Swenshuai.xi     return TRUE;
1340*53ee8cc1Swenshuai.xi }
1341*53ee8cc1Swenshuai.xi #endif
1342*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_StoreVDECInfo2DIPInterlaceQueue(DMS_VDECFRAME_INFO * VDECDispFrame)1343*53ee8cc1Swenshuai.xi static void _DMS_StoreVDECInfo2DIPInterlaceQueue(DMS_VDECFRAME_INFO *VDECDispFrame)
1344*53ee8cc1Swenshuai.xi {
1345*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1346*53ee8cc1Swenshuai.xi     MS_U16 u16NextWritePointer = 0;
1347*53ee8cc1Swenshuai.xi     MS_U32 u32Window = VDECDispFrame->u32Window;
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi     //Jump to Next Write Pointer
1350*53ee8cc1Swenshuai.xi     u16NextWritePointer = _GetNextWritePointerInterlace(u32Window);
1351*53ee8cc1Swenshuai.xi     //DMS_PRINTF("=====PUSH Frame=%d====",u16NextWritePointer);
1352*53ee8cc1Swenshuai.xi #if NEW_FLIP
1353*53ee8cc1Swenshuai.xi     if(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bValid == TRUE)
1354*53ee8cc1Swenshuai.xi     {
1355*53ee8cc1Swenshuai.xi         //VDEC push too fast
1356*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] release frame for WP %d ring back\n",__FUNCTION__,u16NextWritePointer);
1357*53ee8cc1Swenshuai.xi         _DMS_Clear_VDEC_Frame_Ref_Interlace(u32Window,u16NextWritePointer);
1358*53ee8cc1Swenshuai.xi     }
1359*53ee8cc1Swenshuai.xi     if(RES_DMSDI._stXC_LocalFrameRefCountInterlace[u32Window][u16NextWritePointer] > 0)
1360*53ee8cc1Swenshuai.xi     {
1361*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] LocalFrameRefCount check ring back\n",__FUNCTION__);
1362*53ee8cc1Swenshuai.xi         _DMS_Clear_VDEC_Frame_Ref_Interlace(u32Window,u16NextWritePointer);
1363*53ee8cc1Swenshuai.xi     }
1364*53ee8cc1Swenshuai.xi #endif
1365*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[%s] push to Buffer %d\n",__FUNCTION__,u16NextWritePointer);
1366*53ee8cc1Swenshuai.xi 
1367*53ee8cc1Swenshuai.xi     if((VDECDispFrame->eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
1368*53ee8cc1Swenshuai.xi         && (VDECDispFrame->bIs2ndField == TRUE))
1369*53ee8cc1Swenshuai.xi     {
1370*53ee8cc1Swenshuai.xi         // New Flip
1371*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32FrameIndex = VDECDispFrame->u32FrameIndex_2nd;
1372*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32VDECStreamID = VDECDispFrame->u32VDECStreamID;
1373*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32VDECStreamVersion = VDECDispFrame->u32VDECStreamVersion;
1374*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32PriData = VDECDispFrame->u32PriData_2nd;
1375*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_AddRef_Interlace(u32Window,u16NextWritePointer);
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bValid = TRUE;
1378*53ee8cc1Swenshuai.xi 
1379*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcWidth = VDECDispFrame->u16SrcWidth - VDECDispFrame->u16CropLeft - VDECDispFrame->u16CropRight;
1380*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcHeight = VDECDispFrame->u16SrcHeight - VDECDispFrame->u16CropTop - VDECDispFrame->u16CropBottom;
1381*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcPitch = VDECDispFrame->u16SrcPitch;
1382*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr = VDECDispFrame->u32SrcLumaAddrI;
1383*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr = VDECDispFrame->u32SrcChromaAddrI;
1384*53ee8cc1Swenshuai.xi 
1385*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32FrameRate = VDECDispFrame->u32FrameRate;
1386*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFmt = VDECDispFrame->eFmt;
1387*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32Window = VDECDispFrame->u32Window;
1388*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eCODEC = VDECDispFrame->eCODEC;
1389*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eScanType = VDECDispFrame->eScanType;
1390*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFieldOrderType = VDECDispFrame->eFieldOrderType;
1391*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFieldType = VDECDispFrame->eFieldType_2nd;
1392*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eTileMode = VDECDispFrame->eTileMode;
1393*53ee8cc1Swenshuai.xi         // 10 bits
1394*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].b10bitData = VDECDispFrame->b10bitData;
1395*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16Src10bitPitch = VDECDispFrame->u16Src10bitPitch;
1396*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr_2bit = VDECDispFrame->u32SrcLumaAddrI_2bit;
1397*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr_2bit = VDECDispFrame->u32SrcChromaAddrI_2bit;
1398*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u8LumaBitdepth = VDECDispFrame->u8LumaBitdepth;
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bIsAfterDiTask = VDECDispFrame->bIsAfterDiTask;
1401*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bIs2ndField = VDECDispFrame->bIs2ndField;
1402*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u8DiOutputRingBufferID = VDECDispFrame->u8DiOutputRingBufferID;
1403*53ee8cc1Swenshuai.xi     }
1404*53ee8cc1Swenshuai.xi     else
1405*53ee8cc1Swenshuai.xi     {
1406*53ee8cc1Swenshuai.xi         // New Flip
1407*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32FrameIndex = VDECDispFrame->u32FrameIndex;
1408*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32VDECStreamID = VDECDispFrame->u32VDECStreamID;
1409*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32VDECStreamVersion = VDECDispFrame->u32VDECStreamVersion;
1410*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32PriData = VDECDispFrame->u32PriData;
1411*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_AddRef_Interlace(u32Window,u16NextWritePointer);
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bValid= TRUE;
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcWidth = VDECDispFrame->u16SrcWidth - VDECDispFrame->u16CropLeft - VDECDispFrame->u16CropRight;
1416*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcHeight = VDECDispFrame->u16SrcHeight - VDECDispFrame->u16CropTop - VDECDispFrame->u16CropBottom;
1417*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16SrcPitch = VDECDispFrame->u16SrcPitch;
1418*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr = VDECDispFrame->u32SrcLumaAddr;
1419*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr = VDECDispFrame->u32SrcChromaAddr;
1420*53ee8cc1Swenshuai.xi 
1421*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32FrameRate = VDECDispFrame->u32FrameRate;
1422*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFmt = VDECDispFrame->eFmt;
1423*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32Window = VDECDispFrame->u32Window;
1424*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eCODEC = VDECDispFrame->eCODEC;
1425*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eScanType = VDECDispFrame->eScanType;
1426*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFieldOrderType = VDECDispFrame->eFieldOrderType;
1427*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eFieldType = VDECDispFrame->eFieldType;
1428*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].eTileMode = VDECDispFrame->eTileMode;
1429*53ee8cc1Swenshuai.xi         // 10 bits
1430*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].b10bitData = VDECDispFrame->b10bitData;
1431*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u16Src10bitPitch = VDECDispFrame->u16Src10bitPitch;
1432*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr_2bit = VDECDispFrame->u32SrcLumaAddr_2bit;
1433*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr_2bit = VDECDispFrame->u32SrcChromaAddr_2bit;
1434*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u8LumaBitdepth = VDECDispFrame->u8LumaBitdepth;
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bIsAfterDiTask = VDECDispFrame->bIsAfterDiTask;
1437*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].bIs2ndField = VDECDispFrame->bIs2ndField;
1438*53ee8cc1Swenshuai.xi         RES_DMSDI._stXC_DIPDIInfo[u32Window][u16NextWritePointer].u8DiOutputRingBufferID = VDECDispFrame->u8DiOutputRingBufferID;
1439*53ee8cc1Swenshuai.xi     }
1440*53ee8cc1Swenshuai.xi     RES_DMSDI._stXC_DIPWriteReadPointerInterlace[u32Window].u16WritePointer = u16NextWritePointer;
1441*53ee8cc1Swenshuai.xi }
1442*53ee8cc1Swenshuai.xi #endif
1443*53ee8cc1Swenshuai.xi #endif //End of DEV_DI
1444*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_AddRef(MS_U32 u32Window,MS_U16 u16BufID)1445*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_AddRef(MS_U32 u32Window, MS_U16 u16BufID)
1446*53ee8cc1Swenshuai.xi {
1447*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1448*53ee8cc1Swenshuai.xi #if NEW_FLIP
1449*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex == DMS_INVALID_FRAME_ID)
1450*53ee8cc1Swenshuai.xi     {
1451*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Add an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
1452*53ee8cc1Swenshuai.xi         return TRUE;
1453*53ee8cc1Swenshuai.xi     }
1454*53ee8cc1Swenshuai.xi 
1455*53ee8cc1Swenshuai.xi     VDEC_StreamId VdecStreamId;
1456*53ee8cc1Swenshuai.xi     VDEC_EX_DispFrame VdecDispFrm;
1457*53ee8cc1Swenshuai.xi     VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
1458*53ee8cc1Swenshuai.xi     VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
1459*53ee8cc1Swenshuai.xi     VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
1460*53ee8cc1Swenshuai.xi     VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
1461*53ee8cc1Swenshuai.xi     VDEC_EX_Result eResult;
1462*53ee8cc1Swenshuai.xi     eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
1463*53ee8cc1Swenshuai.xi     if (eResult != E_VDEC_EX_OK)
1464*53ee8cc1Swenshuai.xi     {
1465*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1466*53ee8cc1Swenshuai.xi             (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1467*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %td, BufID %d, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1468*53ee8cc1Swenshuai.xi         return FALSE;
1469*53ee8cc1Swenshuai.xi     }
1470*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].eScanType))
1471*53ee8cc1Swenshuai.xi     {
1472*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
1473*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
1474*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex_2nd;
1475*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData_2nd;
1476*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
1477*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
1478*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
1479*53ee8cc1Swenshuai.xi         {
1480*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1481*53ee8cc1Swenshuai.xi                 (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1482*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %td, BufID %d, 2nd Field, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1483*53ee8cc1Swenshuai.xi             return FALSE;
1484*53ee8cc1Swenshuai.xi         }
1485*53ee8cc1Swenshuai.xi     }
1486*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[AddRef] Frame[0x%x], PriData[0x%x]\n",_stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex,_stXC_DIPPushInfo[u32Window][u16BufID].u32PriData);
1487*53ee8cc1Swenshuai.xi     RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID]++;
1488*53ee8cc1Swenshuai.xi 
1489*53ee8cc1Swenshuai.xi #if DBG_FPS
1490*53ee8cc1Swenshuai.xi     u32FPS_Add_Counter[u32Window]++;
1491*53ee8cc1Swenshuai.xi #endif
1492*53ee8cc1Swenshuai.xi #endif
1493*53ee8cc1Swenshuai.xi     return TRUE;
1494*53ee8cc1Swenshuai.xi }
1495*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_Release(MS_U32 u32Window,MS_U16 u16BufID)1496*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_Release(MS_U32 u32Window, MS_U16 u16BufID)
1497*53ee8cc1Swenshuai.xi {
1498*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
1499*53ee8cc1Swenshuai.xi #if NEW_FLIP
1500*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex == DMS_INVALID_FRAME_ID)
1501*53ee8cc1Swenshuai.xi     {
1502*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
1503*53ee8cc1Swenshuai.xi         return TRUE;
1504*53ee8cc1Swenshuai.xi     }
1505*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID] == 0)
1506*53ee8cc1Swenshuai.xi     {
1507*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
1508*53ee8cc1Swenshuai.xi         return TRUE;
1509*53ee8cc1Swenshuai.xi     }
1510*53ee8cc1Swenshuai.xi     RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID]--;
1511*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID] == 0)
1512*53ee8cc1Swenshuai.xi     {
1513*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
1514*53ee8cc1Swenshuai.xi         VDEC_EX_DispFrame VdecDispFrm;
1515*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
1516*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
1517*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
1518*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
1519*53ee8cc1Swenshuai.xi 
1520*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
1521*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
1522*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
1523*53ee8cc1Swenshuai.xi         {
1524*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1525*53ee8cc1Swenshuai.xi                 (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1526*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %td, BufID %d, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1527*53ee8cc1Swenshuai.xi             return FALSE;
1528*53ee8cc1Swenshuai.xi         }
1529*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].eScanType))
1530*53ee8cc1Swenshuai.xi         {
1531*53ee8cc1Swenshuai.xi             VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
1532*53ee8cc1Swenshuai.xi             VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
1533*53ee8cc1Swenshuai.xi             VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex_2nd;
1534*53ee8cc1Swenshuai.xi             VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData_2nd;
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi             VDEC_EX_Result eResult;
1537*53ee8cc1Swenshuai.xi             eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
1538*53ee8cc1Swenshuai.xi             if (eResult != E_VDEC_EX_OK)
1539*53ee8cc1Swenshuai.xi             {
1540*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
1541*53ee8cc1Swenshuai.xi                     (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
1542*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] window %td, BufID %d, 2nd Field, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
1543*53ee8cc1Swenshuai.xi                 return FALSE;
1544*53ee8cc1Swenshuai.xi             }
1545*53ee8cc1Swenshuai.xi         }
1546*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[Releas] Frame[0x%x], PriData[0x%x]\n",RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData);
1547*53ee8cc1Swenshuai.xi         if(_IsFrameRefCountZero(u32Window, u16BufID))
1548*53ee8cc1Swenshuai.xi         {
1549*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex = DMS_INVALID_FRAME_ID;
1550*53ee8cc1Swenshuai.xi         }
1551*53ee8cc1Swenshuai.xi     }
1552*53ee8cc1Swenshuai.xi 
1553*53ee8cc1Swenshuai.xi #if DBG_FPS
1554*53ee8cc1Swenshuai.xi     u32FPS_Release_Counter[u32Window]++;
1555*53ee8cc1Swenshuai.xi #endif
1556*53ee8cc1Swenshuai.xi #endif
1557*53ee8cc1Swenshuai.xi     return TRUE;
1558*53ee8cc1Swenshuai.xi }
1559*53ee8cc1Swenshuai.xi 
1560*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
_DMS_SetMVOPTileMode(E_DMS_VIDEO_TILE_MODE eTile)1561*53ee8cc1Swenshuai.xi static MVOP_TileFormat _DMS_SetMVOPTileMode(E_DMS_VIDEO_TILE_MODE eTile)
1562*53ee8cc1Swenshuai.xi {
1563*53ee8cc1Swenshuai.xi     MS_U32 u32TileMode = 0;
1564*53ee8cc1Swenshuai.xi 
1565*53ee8cc1Swenshuai.xi     switch(eTile)
1566*53ee8cc1Swenshuai.xi     {
1567*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_16x32:
1568*53ee8cc1Swenshuai.xi         {
1569*53ee8cc1Swenshuai.xi             u32TileMode = 1;
1570*53ee8cc1Swenshuai.xi             break;
1571*53ee8cc1Swenshuai.xi         }
1572*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_NONE:
1573*53ee8cc1Swenshuai.xi         {
1574*53ee8cc1Swenshuai.xi             u32TileMode = 2;
1575*53ee8cc1Swenshuai.xi             break;
1576*53ee8cc1Swenshuai.xi         }
1577*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x16:
1578*53ee8cc1Swenshuai.xi         {
1579*53ee8cc1Swenshuai.xi             u32TileMode = 3;
1580*53ee8cc1Swenshuai.xi             break;
1581*53ee8cc1Swenshuai.xi         }
1582*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_TILE_MODE_32x32:
1583*53ee8cc1Swenshuai.xi         {
1584*53ee8cc1Swenshuai.xi             u32TileMode = 4;
1585*53ee8cc1Swenshuai.xi             break;
1586*53ee8cc1Swenshuai.xi         }
1587*53ee8cc1Swenshuai.xi         default:
1588*53ee8cc1Swenshuai.xi         {
1589*53ee8cc1Swenshuai.xi             printf("\033[031m[%s:%d]WARNING: NOT surport tile mode:%d\033[0m\n",__FUNCTION__, __LINE__, eTile);
1590*53ee8cc1Swenshuai.xi         }
1591*53ee8cc1Swenshuai.xi     }
1592*53ee8cc1Swenshuai.xi     return u32TileMode;
1593*53ee8cc1Swenshuai.xi }
1594*53ee8cc1Swenshuai.xi 
_DMS_Is422Mode(E_DMS_VIDEO_DATA_FMT eFmt)1595*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is422Mode(E_DMS_VIDEO_DATA_FMT eFmt)
1596*53ee8cc1Swenshuai.xi {
1597*53ee8cc1Swenshuai.xi     MS_BOOL ret = 0;
1598*53ee8cc1Swenshuai.xi     switch(eFmt)
1599*53ee8cc1Swenshuai.xi     {
1600*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_DATA_FMT_YUV420:
1601*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_DATA_FMT_YUV420_H265:
1602*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_DATA_FMT_YUV420_H265_10BITS:
1603*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_DATA_FMT_YUV420_PLANER:
1604*53ee8cc1Swenshuai.xi         case E_DMS_VIDEO_DATA_FMT_YUV420_SEMI_PLANER:
1605*53ee8cc1Swenshuai.xi         {
1606*53ee8cc1Swenshuai.xi             ret = 0;
1607*53ee8cc1Swenshuai.xi             break;
1608*53ee8cc1Swenshuai.xi         }
1609*53ee8cc1Swenshuai.xi         default:
1610*53ee8cc1Swenshuai.xi         {
1611*53ee8cc1Swenshuai.xi             ret = 1;
1612*53ee8cc1Swenshuai.xi             break;
1613*53ee8cc1Swenshuai.xi         }
1614*53ee8cc1Swenshuai.xi     }
1615*53ee8cc1Swenshuai.xi     return ret;
1616*53ee8cc1Swenshuai.xi }
1617*53ee8cc1Swenshuai.xi 
_DMS_GetColorFormat(EN_DMS_COLORFORMAT eColorFormat)1618*53ee8cc1Swenshuai.xi static E_DMS_VIDEO_DATA_FMT _DMS_GetColorFormat(EN_DMS_COLORFORMAT eColorFormat)
1619*53ee8cc1Swenshuai.xi {
1620*53ee8cc1Swenshuai.xi     MS_U32 u32ColorFormat = 0;
1621*53ee8cc1Swenshuai.xi 
1622*53ee8cc1Swenshuai.xi     switch(eColorFormat)
1623*53ee8cc1Swenshuai.xi     {
1624*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_HW_HVD:
1625*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_HW_MVD:
1626*53ee8cc1Swenshuai.xi         {
1627*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_YUV420;
1628*53ee8cc1Swenshuai.xi             break;
1629*53ee8cc1Swenshuai.xi         }
1630*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_SW_RGB565:
1631*53ee8cc1Swenshuai.xi         {
1632*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_RGB565;
1633*53ee8cc1Swenshuai.xi             break;
1634*53ee8cc1Swenshuai.xi         }
1635*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_SW_ARGB8888:
1636*53ee8cc1Swenshuai.xi         {
1637*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_ARGB8888;
1638*53ee8cc1Swenshuai.xi             break;
1639*53ee8cc1Swenshuai.xi         }
1640*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_YUYV:
1641*53ee8cc1Swenshuai.xi         {
1642*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_YUV422;
1643*53ee8cc1Swenshuai.xi             break;
1644*53ee8cc1Swenshuai.xi         }
1645*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_10BIT_TILE:
1646*53ee8cc1Swenshuai.xi         {
1647*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_YUV420_H265_10BITS;
1648*53ee8cc1Swenshuai.xi             break;
1649*53ee8cc1Swenshuai.xi         }
1650*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_SW_YUV420_SEMIPLANAR:
1651*53ee8cc1Swenshuai.xi         {
1652*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_YUV420_SEMI_PLANER;
1653*53ee8cc1Swenshuai.xi             break;
1654*53ee8cc1Swenshuai.xi         }
1655*53ee8cc1Swenshuai.xi         case E_DMS_COLOR_FORMAT_HW_EVD:
1656*53ee8cc1Swenshuai.xi         {
1657*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_YUV420_H265;
1658*53ee8cc1Swenshuai.xi             break;
1659*53ee8cc1Swenshuai.xi         }
1660*53ee8cc1Swenshuai.xi         default:
1661*53ee8cc1Swenshuai.xi         {
1662*53ee8cc1Swenshuai.xi             u32ColorFormat = E_DMS_VIDEO_DATA_FMT_MAX;
1663*53ee8cc1Swenshuai.xi             printf("\033[031m[%s:%d]WARNING:DMS NOT SURPPORT color format:%d\033[0m\n",__FUNCTION__, __LINE__, eColorFormat);
1664*53ee8cc1Swenshuai.xi             break;
1665*53ee8cc1Swenshuai.xi         }
1666*53ee8cc1Swenshuai.xi     }
1667*53ee8cc1Swenshuai.xi     return u32ColorFormat;
1668*53ee8cc1Swenshuai.xi }
1669*53ee8cc1Swenshuai.xi 
_DMS_Is_SourceFieldBaseInterlaceBottom(E_DMS_VIDEO_SCAN_TYPE eScanType,MS_BOOL bIsVdecBot)1670*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Is_SourceFieldBaseInterlaceBottom(E_DMS_VIDEO_SCAN_TYPE eScanType, MS_BOOL bIsVdecBot)
1671*53ee8cc1Swenshuai.xi {
1672*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(eScanType) && bIsVdecBot)
1673*53ee8cc1Swenshuai.xi     {
1674*53ee8cc1Swenshuai.xi         return TRUE;
1675*53ee8cc1Swenshuai.xi     }
1676*53ee8cc1Swenshuai.xi     else
1677*53ee8cc1Swenshuai.xi     {
1678*53ee8cc1Swenshuai.xi         return FALSE;
1679*53ee8cc1Swenshuai.xi     }
1680*53ee8cc1Swenshuai.xi }
_Task_DMS_DisableBob_MainWin(void)1681*53ee8cc1Swenshuai.xi static void _Task_DMS_DisableBob_MainWin(void)
1682*53ee8cc1Swenshuai.xi {
1683*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
1684*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0);
1685*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
1686*53ee8cc1Swenshuai.xi     MS_U32 u32BobDelay = 0;
1687*53ee8cc1Swenshuai.xi     MS_U16 u16RP = 0;
1688*53ee8cc1Swenshuai.xi     MS_U8 u8XCFrameNum = 0;
1689*53ee8cc1Swenshuai.xi     VDEC_StreamId stVDEC_StreamId = {0};
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi     // coverity[no_escape]
1692*53ee8cc1Swenshuai.xi     while(1)
1693*53ee8cc1Swenshuai.xi     {
1694*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(s32DisableBob_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
1695*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1696*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
1697*53ee8cc1Swenshuai.xi 
1698*53ee8cc1Swenshuai.xi         u16RP = RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer;
1699*53ee8cc1Swenshuai.xi         stVDEC_StreamId.u32Version = RES_DMS._stXC_DIPPushInfo[MAIN_WINDOW][u16RP].u32VDECStreamVersion;
1700*53ee8cc1Swenshuai.xi         stVDEC_StreamId.u32Id = RES_DMS._stXC_DIPPushInfo[MAIN_WINDOW][u16RP].u32VDECStreamID;
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi         u8XCFrameNum = MApi_XC_Get_FrameNumFactor(MAIN_WINDOW);
1703*53ee8cc1Swenshuai.xi 
1704*53ee8cc1Swenshuai.xi         if(u32BobDelay == u8XCFrameNum)
1705*53ee8cc1Swenshuai.xi         {
1706*53ee8cc1Swenshuai.xi             MApi_XC_SetBOBMode(FALSE, MAIN_WINDOW);
1707*53ee8cc1Swenshuai.xi             RES_DMS.bXCEnableBob = FALSE;
1708*53ee8cc1Swenshuai.xi             u32BobDelay = 0;
1709*53ee8cc1Swenshuai.xi         }
1710*53ee8cc1Swenshuai.xi         u32BobDelay++;
1711*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1712*53ee8cc1Swenshuai.xi     }
1713*53ee8cc1Swenshuai.xi }
1714*53ee8cc1Swenshuai.xi 
_Task_DMS_SetMVOP(void)1715*53ee8cc1Swenshuai.xi static void _Task_DMS_SetMVOP(void)
1716*53ee8cc1Swenshuai.xi {
1717*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0);
1718*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
1719*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
1720*53ee8cc1Swenshuai.xi     MS_BOOL bVdecTBflag = 0;
1721*53ee8cc1Swenshuai.xi     MS_BOOL bMVOP_FDMask = FALSE;
1722*53ee8cc1Swenshuai.xi     MS_BOOL bIsPause = FALSE;
1723*53ee8cc1Swenshuai.xi     MS_BOOL bPauseIsBot = 0;
1724*53ee8cc1Swenshuai.xi     MS_U32 u32CurReadPointer = 0;
1725*53ee8cc1Swenshuai.xi     MS_U32 u32mfdecMiuSel = 0;
1726*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
1727*53ee8cc1Swenshuai.xi     MS_U8 u8XCFrameNum = 0;
1728*53ee8cc1Swenshuai.xi     MS_BOOL bXC_BobMode = FALSE;
1729*53ee8cc1Swenshuai.xi 
1730*53ee8cc1Swenshuai.xi 
1731*53ee8cc1Swenshuai.xi     MVOP_Handle stHd = {E_MVOP_MODULE_MAIN};
1732*53ee8cc1Swenshuai.xi     MVOP_Result ret = E_MVOP_FAIL;
1733*53ee8cc1Swenshuai.xi     MVOP_DMSStreamINFO stMVOPStreamInfo;
1734*53ee8cc1Swenshuai.xi     MVOP_DMSDisplaySize stMVOPDispSize;
1735*53ee8cc1Swenshuai.xi     MVOP_DMSCropINFO stMVOPCropInfo;
1736*53ee8cc1Swenshuai.xi     MVOP_DMSDisplayADD stMVOPDispAddr;
1737*53ee8cc1Swenshuai.xi 
1738*53ee8cc1Swenshuai.xi     memset(&stMVOPStreamInfo, 0, sizeof(MVOP_DMSStreamINFO));
1739*53ee8cc1Swenshuai.xi     memset(&stMVOPDispSize, 0, sizeof(MVOP_DMSDisplaySize));
1740*53ee8cc1Swenshuai.xi     memset(&stMVOPCropInfo, 0, sizeof(MVOP_DMSCropINFO));
1741*53ee8cc1Swenshuai.xi     memset(&stMVOPDispAddr, 0, sizeof(MVOP_DMSDisplayADD));
1742*53ee8cc1Swenshuai.xi 
1743*53ee8cc1Swenshuai.xi     // coverity[no_escape]
1744*53ee8cc1Swenshuai.xi     while(1)
1745*53ee8cc1Swenshuai.xi     {
1746*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(s32MVOP_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
1747*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1748*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
1749*53ee8cc1Swenshuai.xi 
1750*53ee8cc1Swenshuai.xi 
1751*53ee8cc1Swenshuai.xi         for(i = 0; i<DMS_DIP_QUEUEDEPTH ; i++)
1752*53ee8cc1Swenshuai.xi         {
1753*53ee8cc1Swenshuai.xi             if(RES_DMS.u32ReleaseState[i] >= 2)
1754*53ee8cc1Swenshuai.xi             {
1755*53ee8cc1Swenshuai.xi                  _DMS_VDEC_Frame_Release(MVOP_WINDOW, i);
1756*53ee8cc1Swenshuai.xi                  RES_DMS.u32ReleaseState[i] = 0;
1757*53ee8cc1Swenshuai.xi                  RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][i].bValid = FALSE;
1758*53ee8cc1Swenshuai.xi             }
1759*53ee8cc1Swenshuai.xi         }
1760*53ee8cc1Swenshuai.xi 
1761*53ee8cc1Swenshuai.xi         // make sure: 1. at least one frame is processed 2. DMS_SetMute is called.
1762*53ee8cc1Swenshuai.xi         // than start MuteCounter
1763*53ee8cc1Swenshuai.xi         u8XCFrameNum = MApi_XC_Get_FrameNumFactor(MAIN_WINDOW);
1764*53ee8cc1Swenshuai.xi         if((RES_DMS.u32ReleaseState[RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer] >=1) && RES_DMS.bDisableBlackScreen)
1765*53ee8cc1Swenshuai.xi         {
1766*53ee8cc1Swenshuai.xi             RES_DMS.u32MuteCounter++;
1767*53ee8cc1Swenshuai.xi             if(RES_DMS.u32MuteCounter == u8XCFrameNum)
1768*53ee8cc1Swenshuai.xi             {
1769*53ee8cc1Swenshuai.xi                 if(RES_DMS.bFirstPlay)
1770*53ee8cc1Swenshuai.xi                 {
1771*53ee8cc1Swenshuai.xi                    RES_DMS.bDisableBlackScreen = FALSE;
1772*53ee8cc1Swenshuai.xi                    RES_DMS.bFirstPlay = FALSE;
1773*53ee8cc1Swenshuai.xi                    MApi_XC_GenerateBlackVideoByMode(FALSE, MAIN_WINDOW,E_XC_BLACK_VIDEO_MEMSYNC);
1774*53ee8cc1Swenshuai.xi                 }
1775*53ee8cc1Swenshuai.xi             }
1776*53ee8cc1Swenshuai.xi         }
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi         // prevent from read ponter go through write pointer
1779*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer == RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16WritePointer)
1780*53ee8cc1Swenshuai.xi         {
1781*53ee8cc1Swenshuai.xi            // pause: set FDmask to TRUE
1782*53ee8cc1Swenshuai.xi             if(_DMS_Is_SourceInterlace(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][(RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer)].eScanType) && (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer].u8FieldCtrl == 0))
1783*53ee8cc1Swenshuai.xi             {
1784*53ee8cc1Swenshuai.xi                 bIsPause = TRUE;
1785*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u8BotFlag = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer].eFieldOrderType^1);
1786*53ee8cc1Swenshuai.xi                 bPauseIsBot = stMVOPDispAddr.u8BotFlag;
1787*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u8FDMask = TRUE;
1788*53ee8cc1Swenshuai.xi                 ret = MDrv_MVOP_DMS_SetDispADDInfo(&stHd, E_MVOP_MAIN_WIN, &stMVOPDispAddr, NULL);
1789*53ee8cc1Swenshuai.xi                 if(ret != 0)
1790*53ee8cc1Swenshuai.xi                 {
1791*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[031m[%s:%d]MDrv_MVOP_DMS_SetDispADDInfo fail: %d\033[0m\n",__FUNCTION__, __LINE__, ret);
1792*53ee8cc1Swenshuai.xi                 }
1793*53ee8cc1Swenshuai.xi             }
1794*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1795*53ee8cc1Swenshuai.xi             continue;
1796*53ee8cc1Swenshuai.xi         }
1797*53ee8cc1Swenshuai.xi 
1798*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][((RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer+1)%DMS_DIP_QUEUEDEPTH)].eScanType == E_DMS_VIDEO_SCAN_TYPE_PROGRESSIVE)
1799*53ee8cc1Swenshuai.xi         {
1800*53ee8cc1Swenshuai.xi             _DMS_GetNextInfo(MVOP_WINDOW, FALSE);
1801*53ee8cc1Swenshuai.xi             u32CurReadPointer = RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer;
1802*53ee8cc1Swenshuai.xi         }
1803*53ee8cc1Swenshuai.xi         else
1804*53ee8cc1Swenshuai.xi         {
1805*53ee8cc1Swenshuai.xi             //Issue: Progressive data after FRC jump to interlace frame, and break while by continue due to interlace flag not match
1806*53ee8cc1Swenshuai.xi             //Next round u16ReadPointer will be plus one cause previous one data not be process
1807*53ee8cc1Swenshuai.xi 
1808*53ee8cc1Swenshuai.xi             //Solution: Make sure every interlace data must be process, check condition as below:
1809*53ee8cc1Swenshuai.xi             //Once u16ReadPointer's data is valid  &&  u32ReleaseState ==0, not to update u16ReadPointer
1810*53ee8cc1Swenshuai.xi             if((RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer].bValid == FALSE) || (RES_DMS.u32ReleaseState[RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer] >= 1))
1811*53ee8cc1Swenshuai.xi             {
1812*53ee8cc1Swenshuai.xi                u32CurReadPointer = _GetNextBufferID(RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer);
1813*53ee8cc1Swenshuai.xi             }
1814*53ee8cc1Swenshuai.xi         }
1815*53ee8cc1Swenshuai.xi 
1816*53ee8cc1Swenshuai.xi         if((RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].bValid == TRUE) && (RES_DMS.u32ReleaseState[u32CurReadPointer] == 0))
1817*53ee8cc1Swenshuai.xi         {
1818*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eScanType == E_DMS_VIDEO_SCAN_TYPE_PROGRESSIVE)
1819*53ee8cc1Swenshuai.xi             {
1820*53ee8cc1Swenshuai.xi                 if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].b10bitData)
1821*53ee8cc1Swenshuai.xi                 {
1822*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32LSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr_2bit;
1823*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32LSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr_2bit;
1824*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32LSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr_2bit >= HAL_MIU1_BASE)?1:0 ;
1825*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32LSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr_2bit >= HAL_MIU1_BASE)?1:0;
1826*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[0] = 10;
1827*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[1] = 10;
1828*53ee8cc1Swenshuai.xi                 }
1829*53ee8cc1Swenshuai.xi                 else
1830*53ee8cc1Swenshuai.xi                 {
1831*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[0] = 8;
1832*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[1] = 8;
1833*53ee8cc1Swenshuai.xi 
1834*53ee8cc1Swenshuai.xi                 }
1835*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u32MSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr;
1836*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u32MSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr;
1837*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u8DMSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr >= HAL_MIU1_BASE)? 1:0;
1838*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.u8DMSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr >= HAL_MIU1_BASE)? 1:0;
1839*53ee8cc1Swenshuai.xi                 if(_DMS_Is_ScalingConditionUse2ndBuffer(RES_DMS.gDMS_ScalingCondition))
1840*53ee8cc1Swenshuai.xi                 {
1841*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32MSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].phySrc2ndBufferLumaAddr;
1842*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32MSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].phySrc2ndBufferChromaAddr;
1843*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[0] = 8;
1844*53ee8cc1Swenshuai.xi                     stMVOPDispAddr.u32BIT_DEPTH[1] = 8;
1845*53ee8cc1Swenshuai.xi                 }
1846*53ee8cc1Swenshuai.xi                 stMVOPDispAddr.bOutputIMode = 0;
1847*53ee8cc1Swenshuai.xi             }
1848*53ee8cc1Swenshuai.xi             else if(_DMS_Is_SourceInterlace(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eScanType))
1849*53ee8cc1Swenshuai.xi             {
1850*53ee8cc1Swenshuai.xi                 if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].bIs2ndField)
1851*53ee8cc1Swenshuai.xi                 {
1852*53ee8cc1Swenshuai.xi                     bVdecTBflag = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eFieldOrderType;
1853*53ee8cc1Swenshuai.xi                 }
1854*53ee8cc1Swenshuai.xi                 else
1855*53ee8cc1Swenshuai.xi                 {
1856*53ee8cc1Swenshuai.xi                     bVdecTBflag = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eFieldOrderType ^ 0x0001;
1857*53ee8cc1Swenshuai.xi                 }
1858*53ee8cc1Swenshuai.xi 
1859*53ee8cc1Swenshuai.xi                 // resume
1860*53ee8cc1Swenshuai.xi                 if(bIsPause)
1861*53ee8cc1Swenshuai.xi                 {
1862*53ee8cc1Swenshuai.xi                     if(bVdecTBflag == bPauseIsBot)
1863*53ee8cc1Swenshuai.xi                     {
1864*53ee8cc1Swenshuai.xi                         bMVOP_FDMask = FALSE;
1865*53ee8cc1Swenshuai.xi                         bIsPause = FALSE;
1866*53ee8cc1Swenshuai.xi                     }
1867*53ee8cc1Swenshuai.xi                     else
1868*53ee8cc1Swenshuai.xi                     {
1869*53ee8cc1Swenshuai.xi                         bMVOP_FDMask = TRUE;
1870*53ee8cc1Swenshuai.xi                     }
1871*53ee8cc1Swenshuai.xi                 }
1872*53ee8cc1Swenshuai.xi 
1873*53ee8cc1Swenshuai.xi                 if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u8FieldCtrl)  // ff , rw
1874*53ee8cc1Swenshuai.xi                 {
1875*53ee8cc1Swenshuai.xi                     RES_DMS.bXCEnableBob = TRUE;
1876*53ee8cc1Swenshuai.xi                     if(bVdecTBflag == (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eFieldOrderType^ 0x0001))
1877*53ee8cc1Swenshuai.xi                     {
1878*53ee8cc1Swenshuai.xi                          bMVOP_FDMask = FALSE;
1879*53ee8cc1Swenshuai.xi                     }
1880*53ee8cc1Swenshuai.xi                     else
1881*53ee8cc1Swenshuai.xi                     {
1882*53ee8cc1Swenshuai.xi                          bMVOP_FDMask = TRUE;
1883*53ee8cc1Swenshuai.xi                     }
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi                     if(bXC_BobMode)
1886*53ee8cc1Swenshuai.xi                     {
1887*53ee8cc1Swenshuai.xi                         MApi_XC_SetBOBMode(TRUE, MAIN_WINDOW);
1888*53ee8cc1Swenshuai.xi                     }
1889*53ee8cc1Swenshuai.xi                     bXC_BobMode = TRUE;
1890*53ee8cc1Swenshuai.xi 
1891*53ee8cc1Swenshuai.xi                     bVdecTBflag =  (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eFieldOrderType^ 0x0001);
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi                 }
1894*53ee8cc1Swenshuai.xi                 else
1895*53ee8cc1Swenshuai.xi                 {
1896*53ee8cc1Swenshuai.xi                      if(RES_DMS.bXCEnableBob)
1897*53ee8cc1Swenshuai.xi                      {
1898*53ee8cc1Swenshuai.xi                         bMVOP_FDMask = FALSE;
1899*53ee8cc1Swenshuai.xi                         bXC_BobMode = FALSE;
1900*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(s32DisableBob_Event_id, 0x01);
1901*53ee8cc1Swenshuai.xi                      }
1902*53ee8cc1Swenshuai.xi                 }
1903*53ee8cc1Swenshuai.xi 
1904*53ee8cc1Swenshuai.xi                 if(_DMS_Is_SourceFieldBaseInterlaceBottom(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eScanType, bVdecTBflag))
1905*53ee8cc1Swenshuai.xi                 {
1906*53ee8cc1Swenshuai.xi                      if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].b10bitData)
1907*53ee8cc1Swenshuai.xi                      {
1908*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32LSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddrI_2bit;
1909*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32LSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddrI_2bit;
1910*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32LSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddrI_2bit >= HAL_MIU1_BASE)?1:0 ;
1911*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32LSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddrI_2bit >= HAL_MIU1_BASE)?1:0;
1912*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[0] = 10;
1913*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[1] = 10;
1914*53ee8cc1Swenshuai.xi                      }
1915*53ee8cc1Swenshuai.xi                      else
1916*53ee8cc1Swenshuai.xi                      {
1917*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[0] = 8;
1918*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[1] = 8;
1919*53ee8cc1Swenshuai.xi                      }
1920*53ee8cc1Swenshuai.xi 
1921*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u32MSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddrI;
1922*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u32MSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddrI;
1923*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u8DMSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddrI >= HAL_MIU1_BASE)? 1:0;
1924*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u8DMSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddrI >= HAL_MIU1_BASE)? 1:0;
1925*53ee8cc1Swenshuai.xi 
1926*53ee8cc1Swenshuai.xi                }
1927*53ee8cc1Swenshuai.xi                else
1928*53ee8cc1Swenshuai.xi                {
1929*53ee8cc1Swenshuai.xi                     if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].b10bitData)
1930*53ee8cc1Swenshuai.xi                     {
1931*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32LSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr_2bit;
1932*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32LSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr_2bit;
1933*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32LSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr_2bit >= HAL_MIU1_BASE)?1:0 ;
1934*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32LSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr_2bit >= HAL_MIU1_BASE)?1:0 ;
1935*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32BIT_DEPTH[0] = 10;
1936*53ee8cc1Swenshuai.xi                         stMVOPDispAddr.u32BIT_DEPTH[1] = 10;
1937*53ee8cc1Swenshuai.xi                     }
1938*53ee8cc1Swenshuai.xi                     else
1939*53ee8cc1Swenshuai.xi                     {
1940*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[0] = 8;
1941*53ee8cc1Swenshuai.xi                          stMVOPDispAddr.u32BIT_DEPTH[1] = 8;
1942*53ee8cc1Swenshuai.xi                      }
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u32MSB_FB_ADDR[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr;
1945*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u32MSB_FB_ADDR[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr;
1946*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u8DMSB_FB_MIU[0] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcLumaAddr >= HAL_MIU1_BASE)? 1:0;
1947*53ee8cc1Swenshuai.xi                      stMVOPDispAddr.u8DMSB_FB_MIU[1] = (RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u32SrcChromaAddr >= HAL_MIU1_BASE)? 1:0;
1948*53ee8cc1Swenshuai.xi                }
1949*53ee8cc1Swenshuai.xi                stMVOPDispAddr.bOutputIMode = 1;
1950*53ee8cc1Swenshuai.xi                stMVOPDispAddr.u8BotFlag = bVdecTBflag;
1951*53ee8cc1Swenshuai.xi             }
1952*53ee8cc1Swenshuai.xi             else
1953*53ee8cc1Swenshuai.xi             {
1954*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[031m[%s:%d]Error: undefine scanType:%d\033[0m\n",__FUNCTION__, __LINE__, RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eScanType);
1955*53ee8cc1Swenshuai.xi             }
1956*53ee8cc1Swenshuai.xi             // MVOP StreamInfo
1957*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.u32ApiDMSStream_Version = API_MVOP_DMS_STREAM_VERSION;
1958*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.u16ApiDMSStream_Length = sizeof(MVOP_DMSStreamINFO);
1959*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.eTileFormat = _DMS_SetMVOPTileMode(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eTileMode);
1960*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.bIs422Mode = _DMS_Is422Mode(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].eFmt);
1961*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.bIsDRAMCont = (stMVOPStreamInfo.bIs422Mode == TRUE)? TRUE : FALSE;
1962*53ee8cc1Swenshuai.xi             stMVOPStreamInfo.bDDR4_REMAP = 0;
1963*53ee8cc1Swenshuai.xi             if(_DMS_Is_ScalingConditionUse2ndBuffer(RES_DMS.gDMS_ScalingCondition))
1964*53ee8cc1Swenshuai.xi             {
1965*53ee8cc1Swenshuai.xi                  stMVOPStreamInfo.eTileFormat = _DMS_SetMVOPTileMode(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u8Src2ndBufferTileMode);
1966*53ee8cc1Swenshuai.xi             }
1967*53ee8cc1Swenshuai.xi             // MVOP DispSizeInfo
1968*53ee8cc1Swenshuai.xi             stMVOPDispSize.u32ApiDMSSize_Version = API_MVOP_DMS_DISP_SIZE_VERSION;
1969*53ee8cc1Swenshuai.xi             stMVOPDispSize.u16ApiDMSSize_Length = sizeof(MVOP_DMSDisplaySize);
1970*53ee8cc1Swenshuai.xi             stMVOPDispSize.u16Width = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16SrcWidth;
1971*53ee8cc1Swenshuai.xi             stMVOPDispSize.u16Height = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16SrcHeight;
1972*53ee8cc1Swenshuai.xi             if(_DMS_Is_ScalingConditionUse2ndBuffer(RES_DMS.gDMS_ScalingCondition))
1973*53ee8cc1Swenshuai.xi             {
1974*53ee8cc1Swenshuai.xi                 stMVOPDispSize.u16Pitch[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16Src2ndBufferPitch;
1975*53ee8cc1Swenshuai.xi                 stMVOPDispSize.u16Width = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16Src2ndBufferWidth ;
1976*53ee8cc1Swenshuai.xi                 stMVOPDispSize.u16Height = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16Src2ndBufferHeight ;
1977*53ee8cc1Swenshuai.xi             }
1978*53ee8cc1Swenshuai.xi             else
1979*53ee8cc1Swenshuai.xi             {
1980*53ee8cc1Swenshuai.xi                 stMVOPDispSize.u16Pitch[0] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16SrcPitch;
1981*53ee8cc1Swenshuai.xi             }
1982*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].b10bitData)
1983*53ee8cc1Swenshuai.xi             {
1984*53ee8cc1Swenshuai.xi                 stMVOPDispSize.u16Pitch[1] = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].u16Src10bitPitch;
1985*53ee8cc1Swenshuai.xi             }
1986*53ee8cc1Swenshuai.xi             stMVOPDispSize.U8DSIndex = 0xff;
1987*53ee8cc1Swenshuai.xi             stMVOPDispSize.bDualDV_EN = 0;
1988*53ee8cc1Swenshuai.xi             stMVOPDispSize.bHDup = 0;
1989*53ee8cc1Swenshuai.xi             stMVOPDispSize.bVDup = 0;
1990*53ee8cc1Swenshuai.xi 
1991*53ee8cc1Swenshuai.xi             // MVOP SetDispADDInfo
1992*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u32ApiDMSADD_Version = API_MVOP_DMS_DIPS_ADD_VERSION;
1993*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u16ApiDMSADD_Length = sizeof(MVOP_DMSDisplayADD);
1994*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u8FRAME_ID = 0;  // no use
1995*53ee8cc1Swenshuai.xi             if(_DMS_Is_ScalingConditionUse2ndBuffer(RES_DMS.gDMS_ScalingCondition))
1996*53ee8cc1Swenshuai.xi             {
1997*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.bMFDec_Enable = 0;
1998*53ee8cc1Swenshuai.xi             }
1999*53ee8cc1Swenshuai.xi             stMVOPDispAddr.bMFDEC_EN = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.bMFDec_Enable;
2000*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u8MFDEC_ID = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.u8MFDec_Select;
2001*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u32UNCOMPRESS_MODE = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.bUncompress_mode;
2002*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u32BITLEN_FB_ADDR = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.phyBitlen_Base;
2003*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.phyBitlen_Base >= HAL_MIU1_BASE)
2004*53ee8cc1Swenshuai.xi             {
2005*53ee8cc1Swenshuai.xi                 u32mfdecMiuSel = 1;
2006*53ee8cc1Swenshuai.xi             }
2007*53ee8cc1Swenshuai.xi             else
2008*53ee8cc1Swenshuai.xi             {
2009*53ee8cc1Swenshuai.xi                 u32mfdecMiuSel = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.u8Bitlen_MiuSelect;
2010*53ee8cc1Swenshuai.xi             }
2011*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u8BITLEN_FB_MIU = u32mfdecMiuSel;
2012*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u32BITLEN_FB_PITCH = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u32CurReadPointer].stMFdecInfo.u16Bitlen_Pitch;
2013*53ee8cc1Swenshuai.xi             stMVOPDispAddr.bEN3D = 0;
2014*53ee8cc1Swenshuai.xi             stMVOPDispAddr.u8FDMask = bMVOP_FDMask;
2015*53ee8cc1Swenshuai.xi             stMVOPDispAddr.bXCBOB_EN = 0;
2016*53ee8cc1Swenshuai.xi 
2017*53ee8cc1Swenshuai.xi             ret = MDrv_MVOP_DMS_SetDispSizeInfo(&stHd, E_MVOP_MAIN_WIN, &stMVOPDispSize, NULL);
2018*53ee8cc1Swenshuai.xi             if(ret != 0)
2019*53ee8cc1Swenshuai.xi             {
2020*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[031m[%s:%d]MDrv_MVOP_DMS_SetDispSizeInfo fail: %d\033[0m\n",__FUNCTION__, __LINE__, ret);
2021*53ee8cc1Swenshuai.xi             }
2022*53ee8cc1Swenshuai.xi             ret = MDrv_MVOP_DMS_SetStreamInfo(&stHd, E_MVOP_MAIN_WIN, &stMVOPStreamInfo, NULL);
2023*53ee8cc1Swenshuai.xi             if(ret != 0)
2024*53ee8cc1Swenshuai.xi             {
2025*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[031m[%s:%d]MDrv_MVOP_DMS_SetStreamInfo fail: %d\033[0m\n",__FUNCTION__, __LINE__, ret);
2026*53ee8cc1Swenshuai.xi             }
2027*53ee8cc1Swenshuai.xi             ret = MDrv_MVOP_DMS_SetDispADDInfo(&stHd, E_MVOP_MAIN_WIN, &stMVOPDispAddr, NULL);
2028*53ee8cc1Swenshuai.xi             if(ret != 0)
2029*53ee8cc1Swenshuai.xi             {
2030*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[031m[%s:%d]MDrv_MVOP_DMS_SetDispADDInfo fail: %d\033[0m\n",__FUNCTION__, __LINE__, ret);
2031*53ee8cc1Swenshuai.xi             }
2032*53ee8cc1Swenshuai.xi 
2033*53ee8cc1Swenshuai.xi             for(i = 0; i<DMS_DIP_QUEUEDEPTH ; i++)
2034*53ee8cc1Swenshuai.xi             {
2035*53ee8cc1Swenshuai.xi                 if(RES_DMS.u32ReleaseState[i] >= 1)
2036*53ee8cc1Swenshuai.xi                 {
2037*53ee8cc1Swenshuai.xi                      RES_DMS.u32ReleaseState[i]++;
2038*53ee8cc1Swenshuai.xi                 }
2039*53ee8cc1Swenshuai.xi             }
2040*53ee8cc1Swenshuai.xi             RES_DMS.u32ReleaseState[u32CurReadPointer]++;
2041*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer = u32CurReadPointer;
2042*53ee8cc1Swenshuai.xi          } //if
2043*53ee8cc1Swenshuai.xi          MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
2044*53ee8cc1Swenshuai.xi     }// while(1)
2045*53ee8cc1Swenshuai.xi }
2046*53ee8cc1Swenshuai.xi 
2047*53ee8cc1Swenshuai.xi 
_DMS_MVOP_ISR(void)2048*53ee8cc1Swenshuai.xi  static void _DMS_MVOP_ISR(void)
2049*53ee8cc1Swenshuai.xi {
2050*53ee8cc1Swenshuai.xi     MDrv_MVOP_EnableInterrupt(E_MVOP_INT_NONE);
2051*53ee8cc1Swenshuai.xi     MsOS_SetEvent(s32MVOP_Event_id, 0x01);
2052*53ee8cc1Swenshuai.xi     MDrv_MVOP_EnableInterrupt(E_MVOP_INT_VSYNC);
2053*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_DC);
2054*53ee8cc1Swenshuai.xi }
2055*53ee8cc1Swenshuai.xi 
2056*53ee8cc1Swenshuai.xi #endif // DMS_MAIN_WINDOW_FLOW_VERSION == 0
2057*53ee8cc1Swenshuai.xi 
_IsGwinAvailable(void)2058*53ee8cc1Swenshuai.xi static MS_BOOL _IsGwinAvailable(void)
2059*53ee8cc1Swenshuai.xi {
2060*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2061*53ee8cc1Swenshuai.xi     if(RES_DMS.u8GOPGWinNum == GWIN_NO_AVAILABLE)
2062*53ee8cc1Swenshuai.xi     {
2063*53ee8cc1Swenshuai.xi         return FALSE;
2064*53ee8cc1Swenshuai.xi     }
2065*53ee8cc1Swenshuai.xi     else
2066*53ee8cc1Swenshuai.xi     {
2067*53ee8cc1Swenshuai.xi         return TRUE;
2068*53ee8cc1Swenshuai.xi     }
2069*53ee8cc1Swenshuai.xi }
2070*53ee8cc1Swenshuai.xi 
_DMS_IsWindowUsed(MS_U32 u32Window)2071*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_IsWindowUsed (MS_U32 u32Window)
2072*53ee8cc1Swenshuai.xi {
2073*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2074*53ee8cc1Swenshuai.xi     return RES_DMS._stXC_DIPWinInfo[u32Window].bDIPwinUse;
2075*53ee8cc1Swenshuai.xi }
2076*53ee8cc1Swenshuai.xi 
_DMS_IsCaptureWindowEnable(MS_U32 u32Window)2077*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_IsCaptureWindowEnable (MS_U32 u32Window)
2078*53ee8cc1Swenshuai.xi {
2079*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2080*53ee8cc1Swenshuai.xi     return RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Enable;
2081*53ee8cc1Swenshuai.xi }
2082*53ee8cc1Swenshuai.xi 
_GetPreviousWritePointer(MS_U32 u32Window)2083*53ee8cc1Swenshuai.xi static MS_U16 _GetPreviousWritePointer(MS_U32 u32Window)
2084*53ee8cc1Swenshuai.xi {
2085*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2086*53ee8cc1Swenshuai.xi     return _GetPreviousBufferID(RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2087*53ee8cc1Swenshuai.xi }
2088*53ee8cc1Swenshuai.xi 
_GetNextWritePointer(MS_U32 u32Window)2089*53ee8cc1Swenshuai.xi static MS_U16 _GetNextWritePointer(MS_U32 u32Window)
2090*53ee8cc1Swenshuai.xi {
2091*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2092*53ee8cc1Swenshuai.xi     return _GetNextBufferID(RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2093*53ee8cc1Swenshuai.xi }
2094*53ee8cc1Swenshuai.xi 
2095*53ee8cc1Swenshuai.xi //For RP always Read (WP-1) principle, need marked valid false for drop case
2096*53ee8cc1Swenshuai.xi //         W
2097*53ee8cc1Swenshuai.xi //  o  x  v  o  o  o  o
2098*53ee8cc1Swenshuai.xi //     R
2099*53ee8cc1Swenshuai.xi //===next phase===
2100*53ee8cc1Swenshuai.xi //                  W
2101*53ee8cc1Swenshuai.xi //  o  x  x  x  x  v  o
2102*53ee8cc1Swenshuai.xi //        R'      R
2103*53ee8cc1Swenshuai.xi 
_MarkIgnorableReadBuffer(MS_U32 u32Window,MS_U16 u16TargetID)2104*53ee8cc1Swenshuai.xi static void _MarkIgnorableReadBuffer(MS_U32 u32Window, MS_U16 u16TargetID)
2105*53ee8cc1Swenshuai.xi {
2106*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2107*53ee8cc1Swenshuai.xi     MS_U16 u16CurID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16ReadPointer;
2108*53ee8cc1Swenshuai.xi     sync_print("MarkIg From%d to %d => ",u16CurID,u16TargetID);
2109*53ee8cc1Swenshuai.xi     while (u16CurID != u16TargetID)
2110*53ee8cc1Swenshuai.xi     {
2111*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32Window) && (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC))
2112*53ee8cc1Swenshuai.xi         {
2113*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
2114*53ee8cc1Swenshuai.xi             if(u16CurID != RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer)
2115*53ee8cc1Swenshuai.xi #else
2116*53ee8cc1Swenshuai.xi             if(u16CurID != RES_DMS.gDMS_MVOPShowBufferID && u16CurID != RES_DMS.gDMS_MVOPRemoveBufferID)
2117*53ee8cc1Swenshuai.xi #endif
2118*53ee8cc1Swenshuai.xi             {
2119*53ee8cc1Swenshuai.xi                 _DMS_VDEC_Frame_Release(u32Window,u16CurID);
2120*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16CurID].bValid = FALSE;
2121*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
2122*53ee8cc1Swenshuai.xi                 RES_DMS.u32ReleaseState[u16CurID] = 0;
2123*53ee8cc1Swenshuai.xi #endif
2124*53ee8cc1Swenshuai.xi                 sync_print("MarkIg ID%d => ",u16CurID);
2125*53ee8cc1Swenshuai.xi             }
2126*53ee8cc1Swenshuai.xi         }
2127*53ee8cc1Swenshuai.xi         else
2128*53ee8cc1Swenshuai.xi         {
2129*53ee8cc1Swenshuai.xi #if(DEV_NEW_NEXT == 0)
2130*53ee8cc1Swenshuai.xi             MS_BOOL bOriginFrame = TRUE;
2131*53ee8cc1Swenshuai.xi             if(bOriginFrame == TRUE)
2132*53ee8cc1Swenshuai.xi             {
2133*53ee8cc1Swenshuai.xi                 bOriginFrame = FALSE;
2134*53ee8cc1Swenshuai.xi             }
2135*53ee8cc1Swenshuai.xi             else
2136*53ee8cc1Swenshuai.xi #endif
2137*53ee8cc1Swenshuai.xi             {
2138*53ee8cc1Swenshuai.xi                 _DMS_VDEC_Frame_Release(u32Window,u16CurID);
2139*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16CurID].bValid = FALSE;
2140*53ee8cc1Swenshuai.xi             }
2141*53ee8cc1Swenshuai.xi             //sync_print("MarkIg ID%d => ",u16CurID);
2142*53ee8cc1Swenshuai.xi         }
2143*53ee8cc1Swenshuai.xi         u16CurID = _GetNextBufferID(u16CurID);
2144*53ee8cc1Swenshuai.xi     }
2145*53ee8cc1Swenshuai.xi 
2146*53ee8cc1Swenshuai.xi }
2147*53ee8cc1Swenshuai.xi 
2148*53ee8cc1Swenshuai.xi //Get Nex Read Pointer and check if any buffer could be ignored
2149*53ee8cc1Swenshuai.xi #define nrp_sync_print(fmt, args...) do { if(0) DMS_PRINTF(fmt, ##args);  } while (0)
_GetNextReadPointer(MS_U32 u32Window)2150*53ee8cc1Swenshuai.xi static MS_U16 _GetNextReadPointer(MS_U32 u32Window)
2151*53ee8cc1Swenshuai.xi {
2152*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2153*53ee8cc1Swenshuai.xi     MS_U16 u16NextID = 0;
2154*53ee8cc1Swenshuai.xi     MS_BOOL bFrameBaseFlag = FALSE;
2155*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
2156*53ee8cc1Swenshuai.xi     {
2157*53ee8cc1Swenshuai.xi         sync_print("0.WP %d => ",RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2158*53ee8cc1Swenshuai.xi         if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
2159*53ee8cc1Swenshuai.xi         {
2160*53ee8cc1Swenshuai.xi             u16NextID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2161*53ee8cc1Swenshuai.xi         }
2162*53ee8cc1Swenshuai.xi #if DEV_DI
2163*53ee8cc1Swenshuai.xi         else if(DEV_DI_TIMER == 0 && (RES_DMS._stXC_DIPPushInfo[u32Window][RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer].bIsAfterDiTask == TRUE))
2164*53ee8cc1Swenshuai.xi         {
2165*53ee8cc1Swenshuai.xi             MS_U16 u16CurID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16ReadPointer;
2166*53ee8cc1Swenshuai.xi             MS_U16 u16WP = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2167*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[u32Window][u16WP].eFieldType == E_DMS_VIDEO_FIELD_TYPE_BOTH)
2168*53ee8cc1Swenshuai.xi             {
2169*53ee8cc1Swenshuai.xi                 nrp_sync_print("[%td] Cur %d, WP %d, ",(ptrdiff_t)MsOS_GetSystemTime(),u16CurID,u16WP);
2170*53ee8cc1Swenshuai.xi                 static MS_U16 bForceBFlag = DMS_Invalid_ReadPointer_ID;
2171*53ee8cc1Swenshuai.xi                 MS_BOOL b2ndField = RES_DMS._stXC_DIPPushInfo[u32Window][u16WP].bIs2ndField;
2172*53ee8cc1Swenshuai.xi                 {
2173*53ee8cc1Swenshuai.xi                     if(b2ndField == FALSE)
2174*53ee8cc1Swenshuai.xi                     {
2175*53ee8cc1Swenshuai.xi                         //Get a top field
2176*53ee8cc1Swenshuai.xi                         if(bForceBFlag != DMS_Invalid_ReadPointer_ID)
2177*53ee8cc1Swenshuai.xi                         {
2178*53ee8cc1Swenshuai.xi                             if(bForceBFlag == u16WP)
2179*53ee8cc1Swenshuai.xi                             {
2180*53ee8cc1Swenshuai.xi                                 u16NextID = _GetNextBufferID(u16CurID);
2181*53ee8cc1Swenshuai.xi                                 bFrameBaseFlag = TRUE;
2182*53ee8cc1Swenshuai.xi                                 nrp_sync_print("w_T_force_B.NRP %d => ",u16NextID);
2183*53ee8cc1Swenshuai.xi                             }
2184*53ee8cc1Swenshuai.xi                             else
2185*53ee8cc1Swenshuai.xi                             {
2186*53ee8cc1Swenshuai.xi                                 u16NextID = u16WP;
2187*53ee8cc1Swenshuai.xi                                 nrp_sync_print("w_T_NewTo_%d.NRP %d => ",b2ndField,u16NextID);
2188*53ee8cc1Swenshuai.xi                             }
2189*53ee8cc1Swenshuai.xi                             bForceBFlag = DMS_Invalid_ReadPointer_ID;
2190*53ee8cc1Swenshuai.xi                         }
2191*53ee8cc1Swenshuai.xi                         else
2192*53ee8cc1Swenshuai.xi                         {
2193*53ee8cc1Swenshuai.xi                             u16NextID = u16WP;
2194*53ee8cc1Swenshuai.xi                             nrp_sync_print("w_T.NRP %d => ",u16NextID);
2195*53ee8cc1Swenshuai.xi                         }
2196*53ee8cc1Swenshuai.xi                     }
2197*53ee8cc1Swenshuai.xi                     else
2198*53ee8cc1Swenshuai.xi                     {
2199*53ee8cc1Swenshuai.xi                         //Get a bottom field
2200*53ee8cc1Swenshuai.xi                         if(RES_DMS._stXC_DIPPushInfo[u32Window][_GetPreviousBufferID(u16WP)].bValid == TRUE)
2201*53ee8cc1Swenshuai.xi                         {
2202*53ee8cc1Swenshuai.xi                             u16NextID = _GetPreviousBufferID(u16WP);
2203*53ee8cc1Swenshuai.xi                             nrp_sync_print("w_B_back_T.NRP %d => ",u16NextID);
2204*53ee8cc1Swenshuai.xi                             bForceBFlag = u16WP;
2205*53ee8cc1Swenshuai.xi                         }
2206*53ee8cc1Swenshuai.xi                         else
2207*53ee8cc1Swenshuai.xi                         {
2208*53ee8cc1Swenshuai.xi                             u16NextID = u16WP;
2209*53ee8cc1Swenshuai.xi                             nrp_sync_print("w_B.NRP %d => ",u16NextID);
2210*53ee8cc1Swenshuai.xi                         }
2211*53ee8cc1Swenshuai.xi                     }
2212*53ee8cc1Swenshuai.xi                 }
2213*53ee8cc1Swenshuai.xi             }
2214*53ee8cc1Swenshuai.xi             else
2215*53ee8cc1Swenshuai.xi             {
2216*53ee8cc1Swenshuai.xi                 nrp_sync_print("xx.WP %d \n ",RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2217*53ee8cc1Swenshuai.xi                 u16NextID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2218*53ee8cc1Swenshuai.xi             }
2219*53ee8cc1Swenshuai.xi         }
2220*53ee8cc1Swenshuai.xi         else if(DEV_DI_TIMER == 1 && (RES_DMS._stXC_DIPPushInfo[u32Window][RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer].bIsAfterDiTask == TRUE))
2221*53ee8cc1Swenshuai.xi         {
2222*53ee8cc1Swenshuai.xi             MS_U16 u16CurID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16ReadPointer;
2223*53ee8cc1Swenshuai.xi             MS_U16 u16WP = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2224*53ee8cc1Swenshuai.xi             nrp_sync_print("Cur %d, WP %d, ",u16CurID,u16WP);
2225*53ee8cc1Swenshuai.xi             nrp_sync_print("Timer.WP %d => ",RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2226*53ee8cc1Swenshuai.xi             u16NextID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2227*53ee8cc1Swenshuai.xi         }
2228*53ee8cc1Swenshuai.xi #endif
2229*53ee8cc1Swenshuai.xi         else
2230*53ee8cc1Swenshuai.xi         {
2231*53ee8cc1Swenshuai.xi             nrp_sync_print("b.WP %d => ",RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer);
2232*53ee8cc1Swenshuai.xi             u16NextID = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer;
2233*53ee8cc1Swenshuai.xi         }
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi     else
2236*53ee8cc1Swenshuai.xi     {
2237*53ee8cc1Swenshuai.xi         u16NextID = _GetPreviousWritePointer(u32Window);
2238*53ee8cc1Swenshuai.xi     }
2239*53ee8cc1Swenshuai.xi     nrp_sync_print("Get Next ID%d => RBID %d => ",u16NextID,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u16NextID].u8DiOutputRingBufferID);
2240*53ee8cc1Swenshuai.xi     // Frame base interlace has two continous frame Buffer ID
2241*53ee8cc1Swenshuai.xi     // MarkIgnorableReadBuffer is impossible.
2242*53ee8cc1Swenshuai.xi     if(bFrameBaseFlag == FALSE)
2243*53ee8cc1Swenshuai.xi     {
2244*53ee8cc1Swenshuai.xi         _MarkIgnorableReadBuffer(u32Window, u16NextID);
2245*53ee8cc1Swenshuai.xi     }
2246*53ee8cc1Swenshuai.xi 
2247*53ee8cc1Swenshuai.xi     return u16NextID;
2248*53ee8cc1Swenshuai.xi }
2249*53ee8cc1Swenshuai.xi 
_DMS_DisableByWin(MS_U32 u32Window)2250*53ee8cc1Swenshuai.xi static void _DMS_DisableByWin(MS_U32 u32Window)
2251*53ee8cc1Swenshuai.xi {
2252*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2253*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPWinInfo[u32Window].bDIPwinUse == TRUE)
2254*53ee8cc1Swenshuai.xi     {
2255*53ee8cc1Swenshuai.xi         //Window Count --
2256*53ee8cc1Swenshuai.xi         RES_DMS.u8EnableWindowCount--;
2257*53ee8cc1Swenshuai.xi         RES_DMS.u8UseDIPWindowCount--;
2258*53ee8cc1Swenshuai.xi 
2259*53ee8cc1Swenshuai.xi         //set as invalid
2260*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].bDIPwinUse = FALSE;
2261*53ee8cc1Swenshuai.xi         RES_DMS.u32WindowFrameRate[u32Window] = 0;
2262*53ee8cc1Swenshuai.xi 
2263*53ee8cc1Swenshuai.xi         //Raise the flag "need to clear buffer"
2264*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_0][u32Window].bCleanBuf = TRUE;
2265*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_1][u32Window].bCleanBuf = TRUE;
2266*53ee8cc1Swenshuai.xi 
2267*53ee8cc1Swenshuai.xi         //db_print(" _stXC_DispBuf_Flag[E_MSAPI_DIP_MULTIVIEW_BUF_ID_0][u32Window].bCleanBuf = %d \n", RES_DMS._stXC_DispBuf_Flag[E_MSAPI_DIP_MULTIVIEW_BUF_ID_0][u32Window].bCleanBuf);
2268*53ee8cc1Swenshuai.xi         //db_print(" _stXC_DispBuf_Flag[E_MSAPI_DIP_MULTIVIEW_BUF_ID_1][u32Window].bCleanBuf = %d \n",RES_DMS. _stXC_DispBuf_Flag[E_MSAPI_DIP_MULTIVIEW_BUF_ID_1][u32Window].bCleanBuf);
2269*53ee8cc1Swenshuai.xi     }
2270*53ee8cc1Swenshuai.xi }
2271*53ee8cc1Swenshuai.xi 
_DMS_InvalidateQueueByWin(MS_U32 u32Window)2272*53ee8cc1Swenshuai.xi static void _DMS_InvalidateQueueByWin(MS_U32 u32Window)
2273*53ee8cc1Swenshuai.xi {
2274*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2275*53ee8cc1Swenshuai.xi     int i = 0;
2276*53ee8cc1Swenshuai.xi     for(i=0;i<DMS_DIP_QUEUEDEPTH;i++)
2277*53ee8cc1Swenshuai.xi     {
2278*53ee8cc1Swenshuai.xi        if(RES_DMS._stXC_DIPPushInfo[u32Window][i].u32Window == u32Window)
2279*53ee8cc1Swenshuai.xi        {
2280*53ee8cc1Swenshuai.xi #if DEV_DI
2281*53ee8cc1Swenshuai.xi             _DMS_VDEC_Frame_Release_Interlace(u32Window,i);
2282*53ee8cc1Swenshuai.xi #endif
2283*53ee8cc1Swenshuai.xi             _DMS_VDEC_Frame_Release(u32Window,i);
2284*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u32Window][i].bValid = FALSE;
2285*53ee8cc1Swenshuai.xi        }
2286*53ee8cc1Swenshuai.xi     }
2287*53ee8cc1Swenshuai.xi }
2288*53ee8cc1Swenshuai.xi 
_DMS_DeInitByWin(MS_U32 u32Window)2289*53ee8cc1Swenshuai.xi static void _DMS_DeInitByWin(MS_U32 u32Window)
2290*53ee8cc1Swenshuai.xi {
2291*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2292*53ee8cc1Swenshuai.xi     int i = 0;
2293*53ee8cc1Swenshuai.xi     MS_BOOL bDeInit = TRUE;
2294*53ee8cc1Swenshuai.xi 
2295*53ee8cc1Swenshuai.xi     for(i=0;i<DMS_MAX_WINDOW_NUM;i++)
2296*53ee8cc1Swenshuai.xi     {
2297*53ee8cc1Swenshuai.xi        if( RES_DMS._stXC_DIPWinInfo[i].bDIPwinUse == TRUE )
2298*53ee8cc1Swenshuai.xi        {
2299*53ee8cc1Swenshuai.xi            bDeInit = FALSE;
2300*53ee8cc1Swenshuai.xi            break;
2301*53ee8cc1Swenshuai.xi        }
2302*53ee8cc1Swenshuai.xi     }
2303*53ee8cc1Swenshuai.xi }
2304*53ee8cc1Swenshuai.xi 
_DMS_DIP_ScoreSorting(void)2305*53ee8cc1Swenshuai.xi static void _DMS_DIP_ScoreSorting(void)
2306*53ee8cc1Swenshuai.xi {
2307*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2308*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
2309*53ee8cc1Swenshuai.xi     MS_U8 j = 0;
2310*53ee8cc1Swenshuai.xi     MS_U8 temp = 0;
2311*53ee8cc1Swenshuai.xi 
2312*53ee8cc1Swenshuai.xi     for (i=0; i<DMS_MAX_WINDOW_NUM-1; i++)
2313*53ee8cc1Swenshuai.xi     {
2314*53ee8cc1Swenshuai.xi         for (j=1; j<DMS_MAX_WINDOW_NUM-i-1; j++)
2315*53ee8cc1Swenshuai.xi         {
2316*53ee8cc1Swenshuai.xi             if (RES_DMS.WindowScore[j] > RES_DMS.WindowScore[j+1])
2317*53ee8cc1Swenshuai.xi             {
2318*53ee8cc1Swenshuai.xi                 temp = RES_DMS.WindowScore[j];
2319*53ee8cc1Swenshuai.xi                 RES_DMS.WindowScore[j]   = RES_DMS.WindowScore[j+1];
2320*53ee8cc1Swenshuai.xi                 RES_DMS.WindowScore[j+1] = temp;
2321*53ee8cc1Swenshuai.xi 
2322*53ee8cc1Swenshuai.xi                 temp = RES_DMS.WindowZOrder[j];
2323*53ee8cc1Swenshuai.xi                 RES_DMS.WindowZOrder[j]   = RES_DMS.WindowZOrder[j+1];
2324*53ee8cc1Swenshuai.xi                 RES_DMS.WindowZOrder[j+1] = temp;
2325*53ee8cc1Swenshuai.xi             }
2326*53ee8cc1Swenshuai.xi         }
2327*53ee8cc1Swenshuai.xi     }
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi }
2330*53ee8cc1Swenshuai.xi 
_DMS_DIP_IsDispBufferValid(void * pInstance,E_DMS_DIP_CLIENT eDIPClient)2331*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_IsDispBufferValid(void* pInstance, E_DMS_DIP_CLIENT eDIPClient)
2332*53ee8cc1Swenshuai.xi {
2333*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2334*53ee8cc1Swenshuai.xi     if (RES_DMS.u32DIPAddress_pa[eDIPClient] == NULL)
2335*53ee8cc1Swenshuai.xi     {
2336*53ee8cc1Swenshuai.xi         return FALSE;
2337*53ee8cc1Swenshuai.xi     }
2338*53ee8cc1Swenshuai.xi     else
2339*53ee8cc1Swenshuai.xi     {
2340*53ee8cc1Swenshuai.xi         return TRUE;
2341*53ee8cc1Swenshuai.xi     }
2342*53ee8cc1Swenshuai.xi }
2343*53ee8cc1Swenshuai.xi 
_DMS_DIP_GetDispBufferAddress(void * pInstance,E_DMS_DIP_CLIENT eDIPClient,MS_U16 u16BufID)2344*53ee8cc1Swenshuai.xi static MS_PHY _DMS_DIP_GetDispBufferAddress(void* pInstance, E_DMS_DIP_CLIENT eDIPClient, MS_U16 u16BufID)
2345*53ee8cc1Swenshuai.xi {
2346*53ee8cc1Swenshuai.xi     MS_PHY phyBufAddr = NULL;
2347*53ee8cc1Swenshuai.xi     MS_U32 BytesPerLine = 0;
2348*53ee8cc1Swenshuai.xi     MS_U32 UHDBytesPerLine = 0;
2349*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2350*53ee8cc1Swenshuai.xi     if (_DMS_DIP_IsDispBufferValid(pInstance, eDIPClient) == NULL)
2351*53ee8cc1Swenshuai.xi     {
2352*53ee8cc1Swenshuai.xi         return NULL;
2353*53ee8cc1Swenshuai.xi     }
2354*53ee8cc1Swenshuai.xi 
2355*53ee8cc1Swenshuai.xi     BytesPerLine = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelWidth);
2356*53ee8cc1Swenshuai.xi     UHDBytesPerLine = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt, DMS_Frame_Buffer_Width);
2357*53ee8cc1Swenshuai.xi 
2358*53ee8cc1Swenshuai.xi     if(eDIPClient == E_DMS_DIP_CLIENT_GOP)
2359*53ee8cc1Swenshuai.xi     {
2360*53ee8cc1Swenshuai.xi         phyBufAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + ( (UHDBytesPerLine * DMS_Frame_Buffer_Height) * u16BufID );
2361*53ee8cc1Swenshuai.xi     }
2362*53ee8cc1Swenshuai.xi     else
2363*53ee8cc1Swenshuai.xi     {
2364*53ee8cc1Swenshuai.xi         phyBufAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + ( (BytesPerLine * RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelHeight) * u16BufID );
2365*53ee8cc1Swenshuai.xi     }
2366*53ee8cc1Swenshuai.xi 
2367*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[32m [%s][%d] === u32DIPAddress_pa : 0x%lx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS.u32DIPAddress_pa[eDIPClient]);
2368*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[32m [%s][%d] === u32DIPStartMemAddr : 0x%lx === \033[0m\n",__FUNCTION__,__LINE__,phyBufAddr);
2369*53ee8cc1Swenshuai.xi 
2370*53ee8cc1Swenshuai.xi     return phyBufAddr;
2371*53ee8cc1Swenshuai.xi }
2372*53ee8cc1Swenshuai.xi 
_DMS_GEBitblt(MS_PHY SrcAddress,MS_PHY DstAddress,GFX_DrawRect * stgfxDrawRect)2373*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GEBitblt(MS_PHY SrcAddress, MS_PHY DstAddress, GFX_DrawRect* stgfxDrawRect)
2374*53ee8cc1Swenshuai.xi {
2375*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2376*53ee8cc1Swenshuai.xi     GFX_BufferInfo stSrc, stDst;
2377*53ee8cc1Swenshuai.xi     GFX_Point stgfxPt0, stgfxPt1;
2378*53ee8cc1Swenshuai.xi     MS_U16 fbFmt = 0;
2379*53ee8cc1Swenshuai.xi 
2380*53ee8cc1Swenshuai.xi     switch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt)
2381*53ee8cc1Swenshuai.xi     {
2382*53ee8cc1Swenshuai.xi         case DIP_DATA_FMT_YUV422:
2383*53ee8cc1Swenshuai.xi         default:
2384*53ee8cc1Swenshuai.xi             fbFmt = E_MS_FMT_YUV422;
2385*53ee8cc1Swenshuai.xi             break;
2386*53ee8cc1Swenshuai.xi     }
2387*53ee8cc1Swenshuai.xi 
2388*53ee8cc1Swenshuai.xi     stgfxPt0.x = 0;
2389*53ee8cc1Swenshuai.xi     stgfxPt0.y = 0;
2390*53ee8cc1Swenshuai.xi     stgfxPt1.x = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth;
2391*53ee8cc1Swenshuai.xi     stgfxPt1.y = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight;
2392*53ee8cc1Swenshuai.xi     MApi_GFX_SetClip(&stgfxPt0, &stgfxPt1);
2393*53ee8cc1Swenshuai.xi 
2394*53ee8cc1Swenshuai.xi     stSrc.u32ColorFmt =fbFmt;
2395*53ee8cc1Swenshuai.xi     stSrc.u32Addr =SrcAddress;
2396*53ee8cc1Swenshuai.xi     stSrc.u32Width = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth;
2397*53ee8cc1Swenshuai.xi     stSrc.u32Height = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight;
2398*53ee8cc1Swenshuai.xi     stSrc.u32Pitch =_DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
2399*53ee8cc1Swenshuai.xi     MApi_GFX_SetSrcBufferInfo(&stSrc, 0);
2400*53ee8cc1Swenshuai.xi     stDst.u32ColorFmt = fbFmt;
2401*53ee8cc1Swenshuai.xi     stDst.u32Addr = DstAddress;
2402*53ee8cc1Swenshuai.xi     stDst.u32Width = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth;
2403*53ee8cc1Swenshuai.xi     stDst.u32Height = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight;
2404*53ee8cc1Swenshuai.xi     stDst.u32Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
2405*53ee8cc1Swenshuai.xi     MApi_GFX_SetDstBufferInfo(&stDst, 0);
2406*53ee8cc1Swenshuai.xi 
2407*53ee8cc1Swenshuai.xi     MApi_GFX_BitBlt(stgfxDrawRect, GFXDRAW_FLAG_SCALE);
2408*53ee8cc1Swenshuai.xi     MApi_GFX_FlushQueue();
2409*53ee8cc1Swenshuai.xi 
2410*53ee8cc1Swenshuai.xi     return TRUE;
2411*53ee8cc1Swenshuai.xi }
2412*53ee8cc1Swenshuai.xi 
_DMS_GERendering(void * pInstance,MS_U32 u32Window)2413*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GERendering(void* pInstance, MS_U32 u32Window)
2414*53ee8cc1Swenshuai.xi {
2415*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2416*53ee8cc1Swenshuai.xi     //db_print(" u8WindowID = %d need GERendering to update buffer\n", u8WindowID);
2417*53ee8cc1Swenshuai.xi     GFX_DrawRect stgfxDrawRect;
2418*53ee8cc1Swenshuai.xi     stgfxDrawRect.srcblk.x = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x;
2419*53ee8cc1Swenshuai.xi     stgfxDrawRect.srcblk.y = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y;
2420*53ee8cc1Swenshuai.xi     stgfxDrawRect.srcblk.width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
2421*53ee8cc1Swenshuai.xi     stgfxDrawRect.srcblk.height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
2422*53ee8cc1Swenshuai.xi 
2423*53ee8cc1Swenshuai.xi     stgfxDrawRect.dstblk.x = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x;
2424*53ee8cc1Swenshuai.xi     stgfxDrawRect.dstblk.y = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y;
2425*53ee8cc1Swenshuai.xi     stgfxDrawRect.dstblk.width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
2426*53ee8cc1Swenshuai.xi     stgfxDrawRect.dstblk.height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
2427*53ee8cc1Swenshuai.xi     if (RES_DMS.bDIPWriteFirstAddr)
2428*53ee8cc1Swenshuai.xi     {
2429*53ee8cc1Swenshuai.xi         _DMS_GEBitblt(_DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, E_DMS_DIP_MULTIVIEW_BUF_ID_1),
2430*53ee8cc1Swenshuai.xi             _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, E_DMS_DIP_MULTIVIEW_BUF_ID_0),
2431*53ee8cc1Swenshuai.xi             &stgfxDrawRect);
2432*53ee8cc1Swenshuai.xi     }
2433*53ee8cc1Swenshuai.xi     else
2434*53ee8cc1Swenshuai.xi     {
2435*53ee8cc1Swenshuai.xi         _DMS_GEBitblt(_DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, E_DMS_DIP_MULTIVIEW_BUF_ID_0),
2436*53ee8cc1Swenshuai.xi             _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, E_DMS_DIP_MULTIVIEW_BUF_ID_1),
2437*53ee8cc1Swenshuai.xi             &stgfxDrawRect);
2438*53ee8cc1Swenshuai.xi     }
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi     return TRUE;
2441*53ee8cc1Swenshuai.xi }
2442*53ee8cc1Swenshuai.xi 
_DMS_GE_DrawRect(MS_PHY DstAddress,GFX_Block stRect,MS_U32 u32Data)2443*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GE_DrawRect(MS_PHY DstAddress, GFX_Block stRect, MS_U32 u32Data)
2444*53ee8cc1Swenshuai.xi {
2445*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2446*53ee8cc1Swenshuai.xi     GFX_Point stgfxPt0;
2447*53ee8cc1Swenshuai.xi     GFX_Point stgfxPt1;
2448*53ee8cc1Swenshuai.xi     GFX_BufferInfo stgfxDstBuf;
2449*53ee8cc1Swenshuai.xi     GFX_RectFillInfo pGfxRectFillInfo;
2450*53ee8cc1Swenshuai.xi     memset(&pGfxRectFillInfo, 0, sizeof(GFX_RectFillInfo));
2451*53ee8cc1Swenshuai.xi 
2452*53ee8cc1Swenshuai.xi     //Set Dst buffer
2453*53ee8cc1Swenshuai.xi     stgfxDstBuf.u32ColorFmt = GFX_FMT_YUV422;
2454*53ee8cc1Swenshuai.xi     stgfxDstBuf.u32Addr = DstAddress;
2455*53ee8cc1Swenshuai.xi     stgfxDstBuf.u32Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
2456*53ee8cc1Swenshuai.xi     MApi_GFX_SetDstBufferInfo(&stgfxDstBuf, 0);
2457*53ee8cc1Swenshuai.xi 
2458*53ee8cc1Swenshuai.xi     stgfxPt0.x = 0;
2459*53ee8cc1Swenshuai.xi     stgfxPt0.y = 0;
2460*53ee8cc1Swenshuai.xi     stgfxPt1.x = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth;
2461*53ee8cc1Swenshuai.xi     stgfxPt1.y = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight;
2462*53ee8cc1Swenshuai.xi     MApi_GFX_SetClip(&stgfxPt0, &stgfxPt1);
2463*53ee8cc1Swenshuai.xi 
2464*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.dstBlock.x = stRect.x;
2465*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.dstBlock.y = stRect.y;
2466*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.dstBlock.width= stRect.width;
2467*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.dstBlock.height= stRect.height;
2468*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.fmt = GFX_FMT_YUV422;
2469*53ee8cc1Swenshuai.xi 
2470*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.colorRange.color_s.a = pGfxRectFillInfo.colorRange.color_e.a = 0;
2471*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.colorRange.color_s.r = pGfxRectFillInfo.colorRange.color_e.r = 0;
2472*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.colorRange.color_s.g = pGfxRectFillInfo.colorRange.color_e.g = 0;
2473*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.colorRange.color_s.b = pGfxRectFillInfo.colorRange.color_e.b = 0;
2474*53ee8cc1Swenshuai.xi 
2475*53ee8cc1Swenshuai.xi     pGfxRectFillInfo.flag = GFXRECT_FLAG_COLOR_CONSTANT;
2476*53ee8cc1Swenshuai.xi     MApi_GFX_RectFill(&pGfxRectFillInfo);
2477*53ee8cc1Swenshuai.xi 
2478*53ee8cc1Swenshuai.xi     MApi_GFX_FlushQueue();
2479*53ee8cc1Swenshuai.xi     return TRUE;
2480*53ee8cc1Swenshuai.xi }
2481*53ee8cc1Swenshuai.xi 
2482*53ee8cc1Swenshuai.xi 
2483*53ee8cc1Swenshuai.xi //Draw rectangle with transparent color
_DMS_GE_GetRectAreaByWin(MS_U32 u32Window,GFX_Block * stRect)2484*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GE_GetRectAreaByWin(MS_U32 u32Window, GFX_Block *stRect)
2485*53ee8cc1Swenshuai.xi {
2486*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2487*53ee8cc1Swenshuai.xi     stRect->x = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x;
2488*53ee8cc1Swenshuai.xi     stRect->y= RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y;
2489*53ee8cc1Swenshuai.xi     stRect->width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
2490*53ee8cc1Swenshuai.xi     stRect->height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
2491*53ee8cc1Swenshuai.xi     return TRUE;
2492*53ee8cc1Swenshuai.xi }
2493*53ee8cc1Swenshuai.xi 
2494*53ee8cc1Swenshuai.xi //Draw rectangle with transparent color
_DMS_GE_GetPreviousRectAreaByWin(MS_U32 u32Window,GFX_Block * stRect)2495*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GE_GetPreviousRectAreaByWin(MS_U32 u32Window, GFX_Block *stRect)
2496*53ee8cc1Swenshuai.xi {
2497*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2498*53ee8cc1Swenshuai.xi 
2499*53ee8cc1Swenshuai.xi 
2500*53ee8cc1Swenshuai.xi     stRect->x = RES_DMS._stXC_PreDispWinInfo[u32Window].u32x;
2501*53ee8cc1Swenshuai.xi     stRect->y= RES_DMS._stXC_PreDispWinInfo[u32Window].u32y;
2502*53ee8cc1Swenshuai.xi     stRect->width = RES_DMS._stXC_PreDispWinInfo[u32Window].u32width;
2503*53ee8cc1Swenshuai.xi     stRect->height = RES_DMS._stXC_PreDispWinInfo[u32Window].u32height;
2504*53ee8cc1Swenshuai.xi     return TRUE;
2505*53ee8cc1Swenshuai.xi }
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi //Draw rectangle with transparent color
_DMS_GE_ClearWin(void * pInstance,MS_U16 u16BufID,MS_U32 u32Window)2508*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GE_ClearWin(void *pInstance, MS_U16 u16BufID, MS_U32 u32Window)
2509*53ee8cc1Swenshuai.xi {
2510*53ee8cc1Swenshuai.xi     GFX_Block stRect = {0};
2511*53ee8cc1Swenshuai.xi     MS_PHY phyBaseAddr = NULL;
2512*53ee8cc1Swenshuai.xi 
2513*53ee8cc1Swenshuai.xi     //db_print(" u16BufID = %d, u32Window = %d \n", u16BufID, u32Window);
2514*53ee8cc1Swenshuai.xi 
2515*53ee8cc1Swenshuai.xi     //Get Base Address by Buffer ID
2516*53ee8cc1Swenshuai.xi     phyBaseAddr = _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, u16BufID);
2517*53ee8cc1Swenshuai.xi 
2518*53ee8cc1Swenshuai.xi     if (phyBaseAddr == NULL)
2519*53ee8cc1Swenshuai.xi     {
2520*53ee8cc1Swenshuai.xi         DMS_PRINTF(" phyBaseAddr is invalid (NULL) !! \n");
2521*53ee8cc1Swenshuai.xi         return FALSE;
2522*53ee8cc1Swenshuai.xi     }
2523*53ee8cc1Swenshuai.xi 
2524*53ee8cc1Swenshuai.xi     //Get Rectangle Area by Window Number
2525*53ee8cc1Swenshuai.xi     _DMS_GE_GetRectAreaByWin(u32Window, &stRect);
2526*53ee8cc1Swenshuai.xi 
2527*53ee8cc1Swenshuai.xi     //db_print(" stRect.x = %d, stRect.y = %d, stRect.width = %d, stRect.height = %d \n", stRect.x, stRect.y, stRect.width, stRect.height);
2528*53ee8cc1Swenshuai.xi 
2529*53ee8cc1Swenshuai.xi     //Draw rectangle with transparent color
2530*53ee8cc1Swenshuai.xi     _DMS_GE_DrawRect(phyBaseAddr, stRect, DMS_DIP_MULTIVIEW_TRANSPARENT_COLOR);
2531*53ee8cc1Swenshuai.xi 
2532*53ee8cc1Swenshuai.xi     return TRUE;
2533*53ee8cc1Swenshuai.xi }
2534*53ee8cc1Swenshuai.xi 
2535*53ee8cc1Swenshuai.xi //Draw rectangle with transparent color
_DMS_GE_ClearPreviousWin(void * pInstance,MS_U16 u16BufID,MS_U32 u32Window)2536*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GE_ClearPreviousWin(void* pInstance, MS_U16 u16BufID, MS_U32 u32Window)
2537*53ee8cc1Swenshuai.xi {
2538*53ee8cc1Swenshuai.xi     GFX_Block stRect = {0};
2539*53ee8cc1Swenshuai.xi     MS_PHY phyBaseAddr = NULL;
2540*53ee8cc1Swenshuai.xi 
2541*53ee8cc1Swenshuai.xi     //db_print(" u16BufID = %d, u32Window = %d \n", u16BufID, u32Window);
2542*53ee8cc1Swenshuai.xi 
2543*53ee8cc1Swenshuai.xi     //Get Base Address by Buffer ID
2544*53ee8cc1Swenshuai.xi     phyBaseAddr = _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, u16BufID);
2545*53ee8cc1Swenshuai.xi 
2546*53ee8cc1Swenshuai.xi     //db_print(" phyBaseAddr = 0x%lx, \n", phyBaseAddr);
2547*53ee8cc1Swenshuai.xi 
2548*53ee8cc1Swenshuai.xi     //Get Rectangle Area by Window Number
2549*53ee8cc1Swenshuai.xi     _DMS_GE_GetPreviousRectAreaByWin(u32Window, &stRect);
2550*53ee8cc1Swenshuai.xi 
2551*53ee8cc1Swenshuai.xi     //db_print(" stRect.x = %d, stRect.y = %d, stRect.width = %d, stRect.height = %d \n", stRect.x, stRect.y, stRect.width, stRect.height);
2552*53ee8cc1Swenshuai.xi     //DMS_PRINTF(" stRect.x = %d, stRect.y = %d, stRect.width = %d, stRect.height = %d \n", stRect.x, stRect.y, stRect.width, stRect.height);
2553*53ee8cc1Swenshuai.xi 
2554*53ee8cc1Swenshuai.xi     //Draw rectangle with transparent color
2555*53ee8cc1Swenshuai.xi     _DMS_GE_DrawRect(phyBaseAddr, stRect, DMS_DIP_MULTIVIEW_TRANSPARENT_COLOR);
2556*53ee8cc1Swenshuai.xi 
2557*53ee8cc1Swenshuai.xi     return TRUE;
2558*53ee8cc1Swenshuai.xi }
2559*53ee8cc1Swenshuai.xi 
_DMS_DIP_GetBackgroundBufID(void * pInstance)2560*53ee8cc1Swenshuai.xi static MS_U8 _DMS_DIP_GetBackgroundBufID(void *pInstance)
2561*53ee8cc1Swenshuai.xi {
2562*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2563*53ee8cc1Swenshuai.xi     if (RES_DMS.bDIPWriteFirstAddr == TRUE)
2564*53ee8cc1Swenshuai.xi     {
2565*53ee8cc1Swenshuai.xi         return E_DMS_DIP_MULTIVIEW_BUF_ID_0;
2566*53ee8cc1Swenshuai.xi     }
2567*53ee8cc1Swenshuai.xi     else
2568*53ee8cc1Swenshuai.xi     {
2569*53ee8cc1Swenshuai.xi         return E_DMS_DIP_MULTIVIEW_BUF_ID_1;
2570*53ee8cc1Swenshuai.xi     }
2571*53ee8cc1Swenshuai.xi }
2572*53ee8cc1Swenshuai.xi 
_WinNeedToClear(void * pInstance,MS_U8 u8BufId,MS_U8 u8WindowId)2573*53ee8cc1Swenshuai.xi static MS_BOOL _WinNeedToClear(void *pInstance, MS_U8 u8BufId, MS_U8 u8WindowId)
2574*53ee8cc1Swenshuai.xi {
2575*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2576*53ee8cc1Swenshuai.xi     return RES_DMS._stXC_DispBuf_Flag[u8BufId][u8WindowId].bCleanBuf;
2577*53ee8cc1Swenshuai.xi }
2578*53ee8cc1Swenshuai.xi 
_WinResetClearBufFlag(void * pInstance,MS_U8 u8BufId,MS_U8 u8WindowId)2579*53ee8cc1Swenshuai.xi static void _WinResetClearBufFlag(void* pInstance, MS_U8 u8BufId, MS_U8 u8WindowId)
2580*53ee8cc1Swenshuai.xi {
2581*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2582*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DispBuf_Flag[u8BufId][u8WindowId].bCleanBuf = FALSE;
2583*53ee8cc1Swenshuai.xi }
2584*53ee8cc1Swenshuai.xi 
_DMS_HandleClearFlag(void * pInstance)2585*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_HandleClearFlag(void* pInstance)
2586*53ee8cc1Swenshuai.xi {
2587*53ee8cc1Swenshuai.xi     MS_U8 u8BufId = 0;
2588*53ee8cc1Swenshuai.xi     MS_U8 u8WindowId = 0;
2589*53ee8cc1Swenshuai.xi 
2590*53ee8cc1Swenshuai.xi     u8BufId = _DMS_DIP_GetBackgroundBufID(pInstance);
2591*53ee8cc1Swenshuai.xi     //db_print(" trace, u8BufId = %d \n", u8BufId);
2592*53ee8cc1Swenshuai.xi 
2593*53ee8cc1Swenshuai.xi     for (u8WindowId= (DMS_MVOP_FLOW)? 1 : 0; u8WindowId < DMS_MAX_WINDOW_NUM; u8WindowId++)
2594*53ee8cc1Swenshuai.xi     {
2595*53ee8cc1Swenshuai.xi         if (_WinNeedToClear(pInstance, u8BufId, u8WindowId) == TRUE)
2596*53ee8cc1Swenshuai.xi         {
2597*53ee8cc1Swenshuai.xi             //Reset Buffer of Window
2598*53ee8cc1Swenshuai.xi             _DMS_GE_ClearWin(pInstance, u8BufId, u8WindowId);
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi             //Reset Clear Flag
2601*53ee8cc1Swenshuai.xi             _WinResetClearBufFlag(pInstance, u8BufId, u8WindowId);
2602*53ee8cc1Swenshuai.xi         }
2603*53ee8cc1Swenshuai.xi     }
2604*53ee8cc1Swenshuai.xi     return TRUE;
2605*53ee8cc1Swenshuai.xi }
2606*53ee8cc1Swenshuai.xi 
_WinDispChange(void * pInstance,MS_U8 u8BufId,MS_U8 u8WindowId)2607*53ee8cc1Swenshuai.xi static MS_BOOL _WinDispChange(void* pInstance, MS_U8 u8BufId, MS_U8 u8WindowId)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2610*53ee8cc1Swenshuai.xi     return RES_DMS._stXC_DispBuf_Flag[u8BufId][u8WindowId].bDispChange;
2611*53ee8cc1Swenshuai.xi }
2612*53ee8cc1Swenshuai.xi 
_WinResetDispChangeFlag(void * pInstance,MS_U8 u8BufId,MS_U8 u8WindowId)2613*53ee8cc1Swenshuai.xi static void _WinResetDispChangeFlag(void* pInstance, MS_U8 u8BufId, MS_U8 u8WindowId)
2614*53ee8cc1Swenshuai.xi {
2615*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2616*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DispBuf_Flag[u8BufId][u8WindowId].bDispChange = FALSE;
2617*53ee8cc1Swenshuai.xi }
2618*53ee8cc1Swenshuai.xi 
_DMS_HandleDispChangeFlag(void * pInstance)2619*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_HandleDispChangeFlag(void* pInstance)
2620*53ee8cc1Swenshuai.xi {
2621*53ee8cc1Swenshuai.xi     MS_U8 u8BufId = 0;
2622*53ee8cc1Swenshuai.xi     MS_U8 u8WindowId = 0;
2623*53ee8cc1Swenshuai.xi 
2624*53ee8cc1Swenshuai.xi     u8BufId = _DMS_DIP_GetBackgroundBufID(pInstance);
2625*53ee8cc1Swenshuai.xi 
2626*53ee8cc1Swenshuai.xi     //DMS_PRINTF(" [%s][%d] trace, u8BufId = %d \n", __FUNCTION__, __LINE__, u8BufId);
2627*53ee8cc1Swenshuai.xi     for (u8WindowId=(DMS_MVOP_FLOW)? 1 : 0; u8WindowId < DMS_MAX_WINDOW_NUM; u8WindowId++)
2628*53ee8cc1Swenshuai.xi     {
2629*53ee8cc1Swenshuai.xi         if (_WinDispChange(pInstance, u8BufId, u8WindowId) == TRUE)
2630*53ee8cc1Swenshuai.xi         {
2631*53ee8cc1Swenshuai.xi             //db_print(" trace, u8BufId = %d , u8WindowId =%d \n", u8BufId, u8WindowId);
2632*53ee8cc1Swenshuai.xi 
2633*53ee8cc1Swenshuai.xi             //Reset Buffer of Window
2634*53ee8cc1Swenshuai.xi             _DMS_GE_ClearPreviousWin(pInstance, u8BufId, u8WindowId);
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi             //Reset Clear Flag
2637*53ee8cc1Swenshuai.xi             _WinResetDispChangeFlag(pInstance, u8BufId, u8WindowId);
2638*53ee8cc1Swenshuai.xi         }
2639*53ee8cc1Swenshuai.xi     }
2640*53ee8cc1Swenshuai.xi     return TRUE;
2641*53ee8cc1Swenshuai.xi }
2642*53ee8cc1Swenshuai.xi 
2643*53ee8cc1Swenshuai.xi 
2644*53ee8cc1Swenshuai.xi //Check Display Buffer Flag and Fire
_DMS_CheckDispBufFlag(void * pInstance)2645*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_CheckDispBufFlag(void* pInstance)
2646*53ee8cc1Swenshuai.xi {
2647*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2648*53ee8cc1Swenshuai.xi     //Handle if there any window need to be clear
2649*53ee8cc1Swenshuai.xi     _DMS_HandleClearFlag(pInstance);
2650*53ee8cc1Swenshuai.xi 
2651*53ee8cc1Swenshuai.xi     //Handle if there any display window change
2652*53ee8cc1Swenshuai.xi     _DMS_HandleDispChangeFlag(pInstance);
2653*53ee8cc1Swenshuai.xi 
2654*53ee8cc1Swenshuai.xi     //others
2655*53ee8cc1Swenshuai.xi     //At new vsync start, we can remove marked buffer id safely for MVOP from VDEC
2656*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
2657*53ee8cc1Swenshuai.xi #if DEV_PAUSE
2658*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(MVOP_WINDOW))
2659*53ee8cc1Swenshuai.xi #else
2660*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(MVOP_WINDOW) && (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC))
2661*53ee8cc1Swenshuai.xi #endif
2662*53ee8cc1Swenshuai.xi     {
2663*53ee8cc1Swenshuai.xi         if(RES_DMS.bMVOPMarkRemoveBuffer)
2664*53ee8cc1Swenshuai.xi         {
2665*53ee8cc1Swenshuai.xi             sync_print(" RemoveID %d V:%d =>",RES_DMS.gDMS_MVOPRemoveBufferID,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPRemoveBufferID].bValid);
2666*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPRemoveBufferID].bValid == TRUE && RES_DMS.gDMS_MVOPRemoveBufferID != DMS_Invalid_ReadPointer_ID)
2667*53ee8cc1Swenshuai.xi             {
2668*53ee8cc1Swenshuai.xi                 //sync_print(" Remove %d =>",gDMS_MVOPRemoveBufferID);
2669*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPRemoveBufferID].bValid = FALSE;
2670*53ee8cc1Swenshuai.xi                 _DMS_VDEC_Frame_Release(MVOP_WINDOW,RES_DMS.gDMS_MVOPRemoveBufferID);
2671*53ee8cc1Swenshuai.xi                 RES_DMS.gDMS_MVOPRemoveBufferID = DMS_Invalid_ReadPointer_ID;
2672*53ee8cc1Swenshuai.xi             }
2673*53ee8cc1Swenshuai.xi             RES_DMS.bMVOPMarkRemoveBuffer = FALSE;
2674*53ee8cc1Swenshuai.xi         }
2675*53ee8cc1Swenshuai.xi     }
2676*53ee8cc1Swenshuai.xi 
2677*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(MVOP_WINDOW))
2678*53ee8cc1Swenshuai.xi     {
2679*53ee8cc1Swenshuai.xi         if(RES_DMS.bDMS_Freeze_DoubleBuffer)
2680*53ee8cc1Swenshuai.xi         {
2681*53ee8cc1Swenshuai.xi             _DMS_Add_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE);
2682*53ee8cc1Swenshuai.xi         }
2683*53ee8cc1Swenshuai.xi         else
2684*53ee8cc1Swenshuai.xi         {
2685*53ee8cc1Swenshuai.xi             _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE);
2686*53ee8cc1Swenshuai.xi         }
2687*53ee8cc1Swenshuai.xi     }
2688*53ee8cc1Swenshuai.xi #endif //#if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
2689*53ee8cc1Swenshuai.xi     return TRUE;
2690*53ee8cc1Swenshuai.xi }
2691*53ee8cc1Swenshuai.xi 
2692*53ee8cc1Swenshuai.xi //(5) Get Next round DIP window stage
2693*53ee8cc1Swenshuai.xi #define START_FRC_ACCUMULE_FRAME_COUNT 3
_DMS_GetNextInfo(MS_U16 u16WindowID,MS_BOOL bResetCaptureID)2694*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GetNextInfo(MS_U16 u16WindowID, MS_BOOL bResetCaptureID)
2695*53ee8cc1Swenshuai.xi {
2696*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2697*53ee8cc1Swenshuai.xi     //static MS_U16 u16WindowID = 0;
2698*53ee8cc1Swenshuai.xi     MS_U16 u16NextReadPointer = 0;
2699*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = DMS_Invalid_ReadPointer_ID;
2700*53ee8cc1Swenshuai.xi 
2701*53ee8cc1Swenshuai.xi     if(bResetCaptureID)
2702*53ee8cc1Swenshuai.xi     {
2703*53ee8cc1Swenshuai.xi         RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = DMS_Invalid_ReadPointer_ID;
2704*53ee8cc1Swenshuai.xi     }
2705*53ee8cc1Swenshuai.xi 
2706*53ee8cc1Swenshuai.xi     if(DEV_NEW_NEXT)
2707*53ee8cc1Swenshuai.xi     {
2708*53ee8cc1Swenshuai.xi         MS_U32 u32OutputRate = RES_DMS.u32OutputRate;
2709*53ee8cc1Swenshuai.xi         if(u32OutputRate > 0)
2710*53ee8cc1Swenshuai.xi         {
2711*53ee8cc1Swenshuai.xi             RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = DMS_Invalid_ReadPointer_ID;
2712*53ee8cc1Swenshuai.xi             if(RES_DMS.bStartCountFRC[u16WindowID] != FALSE)
2713*53ee8cc1Swenshuai.xi             {
2714*53ee8cc1Swenshuai.xi                 MS_U16 u16ReadPoint = RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer;
2715*53ee8cc1Swenshuai.xi                 MS_U32 u32InputRate = RES_DMS._stXC_DIPPushInfo[u16WindowID][u16ReadPoint].u32FrameRate;
2716*53ee8cc1Swenshuai.xi                 if(u32InputRate == 0)
2717*53ee8cc1Swenshuai.xi                 {
2718*53ee8cc1Swenshuai.xi                     DMS_PRINTF("[%s] Input Frame rate is 0, can not move FRC\n",__FUNCTION__);
2719*53ee8cc1Swenshuai.xi                 }
2720*53ee8cc1Swenshuai.xi #if TEMP_LOG
2721*53ee8cc1Swenshuai.xi                 DMS_PRINTF(" In:%d ,\n",u32InputRate);
2722*53ee8cc1Swenshuai.xi #endif
2723*53ee8cc1Swenshuai.xi                 if(_DMS_Is_SourceInterlace(RES_DMS._stXC_DIPPushInfo[u16WindowID][u16ReadPoint].eScanType))
2724*53ee8cc1Swenshuai.xi                 {
2725*53ee8cc1Swenshuai.xi                     u32InputRate *= 2;
2726*53ee8cc1Swenshuai.xi                 }
2727*53ee8cc1Swenshuai.xi                 MS_U32 u32ReadPointOffset = 0;
2728*53ee8cc1Swenshuai.xi                 RES_DMS.u32AccumuleInputRate[u16WindowID] += u32InputRate;
2729*53ee8cc1Swenshuai.xi #if TEMP_LOG
2730*53ee8cc1Swenshuai.xi                 DMS_PRINTF("AccumuleInputRate=%d, u32OutputRate=%d\n",RES_DMS.u32AccumuleInputRate[u16WindowID],RES_DMS.u32OutputRate);
2731*53ee8cc1Swenshuai.xi #endif
2732*53ee8cc1Swenshuai.xi                 if(RES_DMS.u32AccumuleInputRate[u16WindowID] >= u32OutputRate)
2733*53ee8cc1Swenshuai.xi                 {
2734*53ee8cc1Swenshuai.xi                     u32ReadPointOffset = RES_DMS.u32AccumuleInputRate[u16WindowID] / u32OutputRate;
2735*53ee8cc1Swenshuai.xi                     RES_DMS.u32AccumuleInputRate[u16WindowID] = RES_DMS.u32AccumuleInputRate[u16WindowID] % u32OutputRate;
2736*53ee8cc1Swenshuai.xi                 }
2737*53ee8cc1Swenshuai.xi #if TEMP_LOG
2738*53ee8cc1Swenshuai.xi                 DMS_PRINTF("AccumuleInputRate=%d, u32ReadPointOffset=%d\n",RES_DMS.u32AccumuleInputRate[u16WindowID],u32ReadPointOffset);
2739*53ee8cc1Swenshuai.xi #endif
2740*53ee8cc1Swenshuai.xi                 if(u32ReadPointOffset > 0)
2741*53ee8cc1Swenshuai.xi                 {
2742*53ee8cc1Swenshuai.xi                     MS_U8 i = 0;
2743*53ee8cc1Swenshuai.xi                     MS_U16 u16NextReadPointer = RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer;
2744*53ee8cc1Swenshuai.xi                     for(i = 0 ; i < u32ReadPointOffset; i++)
2745*53ee8cc1Swenshuai.xi                     {
2746*53ee8cc1Swenshuai.xi                         u16NextReadPointer = _GetNextBufferID(u16NextReadPointer);
2747*53ee8cc1Swenshuai.xi                     }
2748*53ee8cc1Swenshuai.xi                     if (RES_DMS._stXC_DIPPushInfo[u16WindowID][u16NextReadPointer].bValid)
2749*53ee8cc1Swenshuai.xi                     {
2750*53ee8cc1Swenshuai.xi                         _MarkIgnorableReadBuffer(u16WindowID, u16NextReadPointer);
2751*53ee8cc1Swenshuai.xi                         if(RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer != u16NextReadPointer)
2752*53ee8cc1Swenshuai.xi                         {
2753*53ee8cc1Swenshuai.xi                             RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u16NextReadPointer;
2754*53ee8cc1Swenshuai.xi                             RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer = u16NextReadPointer;
2755*53ee8cc1Swenshuai.xi                         }
2756*53ee8cc1Swenshuai.xi                     }
2757*53ee8cc1Swenshuai.xi                     else
2758*53ee8cc1Swenshuai.xi                     {
2759*53ee8cc1Swenshuai.xi                         //DMS_PRINTF("[%s][%d] win %d, now %d, next %d NOT Valid\n",__FUNCTION__,__LINE__,u16WindowID,RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer,u16NextReadPointer);
2760*53ee8cc1Swenshuai.xi                     }
2761*53ee8cc1Swenshuai.xi                 }
2762*53ee8cc1Swenshuai.xi                 else
2763*53ee8cc1Swenshuai.xi                 {
2764*53ee8cc1Swenshuai.xi                     if(_DMS_Is_MVOPFlow(u16WindowID) == FALSE)
2765*53ee8cc1Swenshuai.xi                     {
2766*53ee8cc1Swenshuai.xi                         //No frame has been pushed, display the old frame
2767*53ee8cc1Swenshuai.xi                         if(_DMS_Query_XC_Status(u16WindowID, DMS_XC_UPDATE_FROM_VDEC))
2768*53ee8cc1Swenshuai.xi                         {
2769*53ee8cc1Swenshuai.xi                             RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u8BufferID;
2770*53ee8cc1Swenshuai.xi                         }
2771*53ee8cc1Swenshuai.xi                     }
2772*53ee8cc1Swenshuai.xi                 }
2773*53ee8cc1Swenshuai.xi             }
2774*53ee8cc1Swenshuai.xi             else
2775*53ee8cc1Swenshuai.xi             {
2776*53ee8cc1Swenshuai.xi                 MS_U16 u16WritePoint = RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16WritePointer;
2777*53ee8cc1Swenshuai.xi                 if(RES_DMS._stXC_DIPPushInfo[u16WindowID][u16WritePoint].bValid)
2778*53ee8cc1Swenshuai.xi                 {
2779*53ee8cc1Swenshuai.xi                         _MarkIgnorableReadBuffer(u16WindowID, u16WritePoint);
2780*53ee8cc1Swenshuai.xi                         RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer = u16WritePoint;
2781*53ee8cc1Swenshuai.xi                         RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u16WritePoint;
2782*53ee8cc1Swenshuai.xi                         RES_DMS.bStartCountFRC[u16WindowID] = TRUE;
2783*53ee8cc1Swenshuai.xi                 }
2784*53ee8cc1Swenshuai.xi             }
2785*53ee8cc1Swenshuai.xi         }
2786*53ee8cc1Swenshuai.xi 
2787*53ee8cc1Swenshuai.xi     }
2788*53ee8cc1Swenshuai.xi     else
2789*53ee8cc1Swenshuai.xi     {
2790*53ee8cc1Swenshuai.xi         //Check Window is Enable or Not
2791*53ee8cc1Swenshuai.xi         if (_DMS_IsWindowUsed(u16WindowID) == FALSE)
2792*53ee8cc1Swenshuai.xi         {
2793*53ee8cc1Swenshuai.xi             //Clean Pushframe Info in queue
2794*53ee8cc1Swenshuai.xi             _DMS_InvalidateQueueByWin(u16WindowID);
2795*53ee8cc1Swenshuai.xi             return TRUE;
2796*53ee8cc1Swenshuai.xi         }
2797*53ee8cc1Swenshuai.xi 
2798*53ee8cc1Swenshuai.xi         //Find Next Read Pointer
2799*53ee8cc1Swenshuai.xi         u16NextReadPointer = _GetNextReadPointer(u16WindowID);
2800*53ee8cc1Swenshuai.xi         if((_DMS_Is_MVOPFlow(u16WindowID) == FALSE) ||
2801*53ee8cc1Swenshuai.xi             ((_DMS_Is_MVOPFlow(u16WindowID) == TRUE) && (RES_DMS.eDMS_MVOPFlowCtrl != E_DMS_MVOP_FLOW_FROM_VDEC)))
2802*53ee8cc1Swenshuai.xi         {
2803*53ee8cc1Swenshuai.xi             u8BufferID = RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer;
2804*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer = u16NextReadPointer;
2805*53ee8cc1Swenshuai.xi         }
2806*53ee8cc1Swenshuai.xi 
2807*53ee8cc1Swenshuai.xi         //Set infomation to u8DIPReadytoCaptureID[]
2808*53ee8cc1Swenshuai.xi         if (RES_DMS._stXC_DIPPushInfo[u16WindowID][u16NextReadPointer].bValid)
2809*53ee8cc1Swenshuai.xi         {
2810*53ee8cc1Swenshuai.xi             sync_print(" V, NRP %d => ",u16NextReadPointer);
2811*53ee8cc1Swenshuai.xi             if(_DMS_Is_MVOPFlow(u16WindowID) && (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC))
2812*53ee8cc1Swenshuai.xi             {
2813*53ee8cc1Swenshuai.xi                 if(RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer != u16NextReadPointer)
2814*53ee8cc1Swenshuai.xi                 {
2815*53ee8cc1Swenshuai.xi                     RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u16NextReadPointer;
2816*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_DIPWriteReadPointer[u16WindowID].u16ReadPointer = u16NextReadPointer;
2817*53ee8cc1Swenshuai.xi                 }
2818*53ee8cc1Swenshuai.xi             }
2819*53ee8cc1Swenshuai.xi             else
2820*53ee8cc1Swenshuai.xi             {
2821*53ee8cc1Swenshuai.xi                 if(u8BufferID != u16NextReadPointer)
2822*53ee8cc1Swenshuai.xi                 {
2823*53ee8cc1Swenshuai.xi                     //A new frame has been pushed
2824*53ee8cc1Swenshuai.xi                     if(u8BufferID < DMS_Invalid_ReadPointer_ID)
2825*53ee8cc1Swenshuai.xi                     {
2826*53ee8cc1Swenshuai.xi                         RES_DMS._stXC_DIPPushInfo[u16WindowID][u8BufferID].bValid = FALSE;
2827*53ee8cc1Swenshuai.xi                         _DMS_VDEC_Frame_Release(u16WindowID,u8BufferID);
2828*53ee8cc1Swenshuai.xi                     }
2829*53ee8cc1Swenshuai.xi                     RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u16NextReadPointer;
2830*53ee8cc1Swenshuai.xi                 }
2831*53ee8cc1Swenshuai.xi                 else
2832*53ee8cc1Swenshuai.xi                 {
2833*53ee8cc1Swenshuai.xi                     if(bResetCaptureID == FALSE)
2834*53ee8cc1Swenshuai.xi                     {
2835*53ee8cc1Swenshuai.xi                         //No frame has been pushed, display the old frame
2836*53ee8cc1Swenshuai.xi                         if(_DMS_Query_XC_Status(u16WindowID, DMS_XC_UPDATE_FROM_VDEC))
2837*53ee8cc1Swenshuai.xi                         {
2838*53ee8cc1Swenshuai.xi                             RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = u8BufferID;
2839*53ee8cc1Swenshuai.xi                         }
2840*53ee8cc1Swenshuai.xi                         else
2841*53ee8cc1Swenshuai.xi                         {
2842*53ee8cc1Swenshuai.xi                             RES_DMS.u8DIPReadytoCaptureID[u16WindowID] = DMS_Invalid_ReadPointer_ID;
2843*53ee8cc1Swenshuai.xi                         }
2844*53ee8cc1Swenshuai.xi                     }
2845*53ee8cc1Swenshuai.xi                 }
2846*53ee8cc1Swenshuai.xi             }
2847*53ee8cc1Swenshuai.xi         }
2848*53ee8cc1Swenshuai.xi     }
2849*53ee8cc1Swenshuai.xi 
2850*53ee8cc1Swenshuai.xi     return TRUE;
2851*53ee8cc1Swenshuai.xi }
2852*53ee8cc1Swenshuai.xi 
2853*53ee8cc1Swenshuai.xi //(3) Prepare Next Frame to be Displayed
_DMS_SetDIPRWindow(E_DMS_DIP_ACTION eAction,MS_U32 u32Window,MS_U16 u16BufferID)2854*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPRWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID)
2855*53ee8cc1Swenshuai.xi {
2856*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2857*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
2858*53ee8cc1Swenshuai.xi     ST_XC_DIPR_PROPERTY_EX DIPRWinPropertytoShow_EX;
2859*53ee8cc1Swenshuai.xi     memset(&DIPRWinPropertytoShow_EX,0,sizeof(ST_XC_DIPR_PROPERTY_EX));
2860*53ee8cc1Swenshuai.xi 
2861*53ee8cc1Swenshuai.xi     ST_DIP_DI_SETTING DIP3DDISetting;
2862*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_3DDI
2863*53ee8cc1Swenshuai.xi     static MS_U8 u8count = 0;
2864*53ee8cc1Swenshuai.xi     ST_DIP_DI_NWAY_BUF_INFO stDINwayBuf[32];
2865*53ee8cc1Swenshuai.xi #endif
2866*53ee8cc1Swenshuai.xi     memset(&DIP3DDISetting,0,sizeof(ST_DIP_DI_SETTING));
2867*53ee8cc1Swenshuai.xi 
2868*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_DI)
2869*53ee8cc1Swenshuai.xi     {
2870*53ee8cc1Swenshuai.xi         //DIPR win setting
2871*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt = _DMS_DIP_GetDIPRDataFMT(&RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID]);
2872*53ee8cc1Swenshuai.xi 
2873*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width = DMS_DIPR_Alignment(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u16SrcWidth, DMS_HAL_DIPR_Align_YUV420);
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_3DDI
2876*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFrameBaseInterlace(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eFieldType))
2877*53ee8cc1Swenshuai.xi         {
2878*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u16SrcHeight;
2879*53ee8cc1Swenshuai.xi         }
2880*53ee8cc1Swenshuai.xi         else
2881*53ee8cc1Swenshuai.xi         {
2882*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u16SrcHeight / 2;
2883*53ee8cc1Swenshuai.xi         }
2884*53ee8cc1Swenshuai.xi #else
2885*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u16SrcHeight;
2886*53ee8cc1Swenshuai.xi #endif
2887*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch = _DMS_DIP_CalcPitch(DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u16SrcPitch);
2888*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcLumaAddr;
2889*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcChromaAddr;
2890*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr10Bits = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcLumaAddr;
2891*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr10Bits = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcChromaAddr;
2892*53ee8cc1Swenshuai.xi         //DMS_PRINTF("\033[34m  _DMS_SetDIPRWindowInterlace %d %d\033[0m\n",u16BufferID,DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt);
2893*53ee8cc1Swenshuai.xi 
2894*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFrameBaseInterlace(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eFieldType))
2895*53ee8cc1Swenshuai.xi         {
2896*53ee8cc1Swenshuai.xi             _DMS_DIP_GetFrameBaseInterlaceFieldType(&RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID]);
2897*53ee8cc1Swenshuai.xi         }
2898*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_3DDI
2899*53ee8cc1Swenshuai.xi         if(u8count < 2)
2900*53ee8cc1Swenshuai.xi         {
2901*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnableDI = TRUE;
2902*53ee8cc1Swenshuai.xi             DIP3DDISetting.bInitDI = FALSE;
2903*53ee8cc1Swenshuai.xi             DIP3DDISetting.u8NwayIndex = u32Window;
2904*53ee8cc1Swenshuai.xi             DIP3DDISetting.enDI_Field = _DMS_DIP_GetDIPDiDataFMT(u32Window, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eFieldType);
2905*53ee8cc1Swenshuai.xi 
2906*53ee8cc1Swenshuai.xi             //DIP3DDISetting.phy2ndFieldAddr = 0;
2907*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnaNwayInfoRefresh = FALSE;
2908*53ee8cc1Swenshuai.xi             DIP3DDISetting.u8NwayBufCnt = 1; // Fix me
2909*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnableBob = TRUE;// Fix me
2910*53ee8cc1Swenshuai.xi 
2911*53ee8cc1Swenshuai.xi             stDINwayBuf[0].phyDI_BufAddr = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIStartAddr;
2912*53ee8cc1Swenshuai.xi             stDINwayBuf[0].u32DI_BufSize = RES_DMS._stXC_DIPWinInfo[u32Window].u32DISize;
2913*53ee8cc1Swenshuai.xi             stDINwayBuf[0].u8DIBufCnt = RES_DMS._stXC_DIPWinInfo[u32Window].u8DIBufCnt;
2914*53ee8cc1Swenshuai.xi 
2915*53ee8cc1Swenshuai.xi             DIP3DDISetting.stDINwayBufInfo = (void*)stDINwayBuf;
2916*53ee8cc1Swenshuai.xi 
2917*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
2918*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32size=sizeof(ST_DIP_DI_SETTING);
2919*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
2920*53ee8cc1Swenshuai.xi             u8count ++;
2921*53ee8cc1Swenshuai.xi         }
2922*53ee8cc1Swenshuai.xi         else
2923*53ee8cc1Swenshuai.xi         {
2924*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnableDI = TRUE;
2925*53ee8cc1Swenshuai.xi             DIP3DDISetting.bInitDI = FALSE;
2926*53ee8cc1Swenshuai.xi             DIP3DDISetting.u8NwayIndex = u32Window;
2927*53ee8cc1Swenshuai.xi             DIP3DDISetting.enDI_Field = _DMS_DIP_GetDIPDiDataFMT(u32Window, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eFieldType);
2928*53ee8cc1Swenshuai.xi 
2929*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnaNwayInfoRefresh = FALSE;
2930*53ee8cc1Swenshuai.xi             DIP3DDISetting.u8NwayBufCnt = 1; // Fix me
2931*53ee8cc1Swenshuai.xi             DIP3DDISetting.bEnableBob = FALSE;// Fix me
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi             stDINwayBuf[0].phyDI_BufAddr = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIStartAddr;
2934*53ee8cc1Swenshuai.xi             stDINwayBuf[0].u32DI_BufSize = RES_DMS._stXC_DIPWinInfo[u32Window].u32DISize;
2935*53ee8cc1Swenshuai.xi             stDINwayBuf[0].u8DIBufCnt = RES_DMS._stXC_DIPWinInfo[u32Window].u8DIBufCnt;
2936*53ee8cc1Swenshuai.xi 
2937*53ee8cc1Swenshuai.xi             DIP3DDISetting.stDINwayBufInfo = (void*)stDINwayBuf;
2938*53ee8cc1Swenshuai.xi 
2939*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
2940*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32size=sizeof(ST_DIP_DI_SETTING);
2941*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
2942*53ee8cc1Swenshuai.xi #if 0
2943*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[34m  width %d, Height %d, Pitch %d \033[0m\n",DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width, DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height, DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch);
2944*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m bEnable %d, bInitDI %d, NwayIndex %d, enDiField %d, bEnaNwayInfoRefresh %d, u8NwayBufCnt %d, bEnableBob %d\033[0m\n",
2945*53ee8cc1Swenshuai.xi                 DIP3DDISetting.bEnableDI, DIP3DDISetting.bInitDI, DIP3DDISetting.u8NwayIndex, DIP3DDISetting.enDI_Field, DIP3DDISetting.bEnaNwayInfoRefresh,
2946*53ee8cc1Swenshuai.xi                 DIP3DDISetting.u8NwayBufCnt, DIP3DDISetting.bEnableBob);
2947*53ee8cc1Swenshuai.xi #endif
2948*53ee8cc1Swenshuai.xi 
2949*53ee8cc1Swenshuai.xi         }
2950*53ee8cc1Swenshuai.xi #else
2951*53ee8cc1Swenshuai.xi         DIP3DDISetting.bEnableDI = TRUE;
2952*53ee8cc1Swenshuai.xi         DIP3DDISetting.enDI_Field = _DMS_DIP_GetDIPDiDataFMT(u32Window, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType, RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eFieldType);
2953*53ee8cc1Swenshuai.xi 
2954*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFieldBaseInterlace(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eScanType))
2955*53ee8cc1Swenshuai.xi         {
2956*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotYBufAddr = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcLumaAddrI;
2957*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotCBufAddr = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcChromaAddrI;
2958*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotYBufAddr10Bits = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcLumaAddrI;
2959*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotCBufAddr10Bits = RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].u32SrcChromaAddrI;
2960*53ee8cc1Swenshuai.xi         }
2961*53ee8cc1Swenshuai.xi         else
2962*53ee8cc1Swenshuai.xi         {
2963*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotYBufAddr = DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr;
2964*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotCBufAddr = DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr;
2965*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotYBufAddr10Bits = DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr;
2966*53ee8cc1Swenshuai.xi             DIP3DDISetting.phyBotCBufAddr10Bits = DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr;
2967*53ee8cc1Swenshuai.xi         }
2968*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
2969*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32size=sizeof(ST_DIP_DI_SETTING);
2970*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
2971*53ee8cc1Swenshuai.xi #endif
2972*53ee8cc1Swenshuai.xi     }
2973*53ee8cc1Swenshuai.xi     else
2974*53ee8cc1Swenshuai.xi     {
2975*53ee8cc1Swenshuai.xi         if(u16BufferID < DMS_Invalid_ReadPointer_ID)
2976*53ee8cc1Swenshuai.xi         {
2977*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt = _DMS_DIP_GetDIPRDataFMT(&RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID]);
2978*53ee8cc1Swenshuai.xi 
2979*53ee8cc1Swenshuai.xi             if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
2980*53ee8cc1Swenshuai.xi             {
2981*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt;
2982*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width = DMS_DIPR_Alignment((RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth/2), DMS_HAL_DIPR_Align_YUV420);
2983*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight/2;
2984*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16Src2ndBufferPitch);
2985*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].phySrc2ndBufferLumaAddr;
2986*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].phySrc2ndBufferChromaAddr;
2987*53ee8cc1Swenshuai.xi             }
2988*53ee8cc1Swenshuai.xi             else
2989*53ee8cc1Swenshuai.xi             {
2990*53ee8cc1Swenshuai.xi                 //DIPR win setting
2991*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt;
2992*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width = DMS_DIPR_Alignment(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth, DMS_HAL_DIPR_Align_YUV420);
2993*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
2994*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcPitch);
2995*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcLumaAddr;
2996*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcChromaAddr;
2997*53ee8cc1Swenshuai.xi 
2998*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr10Bits = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcLumaAddr;
2999*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr10Bits = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcChromaAddr;
3000*53ee8cc1Swenshuai.xi             }
3001*53ee8cc1Swenshuai.xi #if DMS_DIP_NWindow_Support_2P5DDI
3002*53ee8cc1Swenshuai.xi             if(_DMS_Is_SourceFrameBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eScanType, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eFieldType))
3003*53ee8cc1Swenshuai.xi             {
3004*53ee8cc1Swenshuai.xi                 _DMS_DIP_GetFrameBaseInterlaceFieldType(&RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID]);
3005*53ee8cc1Swenshuai.xi             }
3006*53ee8cc1Swenshuai.xi 
3007*53ee8cc1Swenshuai.xi             if(_DMS_Is_SourceInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eScanType))
3008*53ee8cc1Swenshuai.xi             {
3009*53ee8cc1Swenshuai.xi                 DIP3DDISetting.bEnableDI = TRUE;
3010*53ee8cc1Swenshuai.xi                 DIP3DDISetting.enDI_Field = _DMS_DIP_GetDIPDiDataFMT(u32Window, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eScanType, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eFieldType);
3011*53ee8cc1Swenshuai.xi                 if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eScanType))
3012*53ee8cc1Swenshuai.xi                 {
3013*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotYBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcLumaAddrI;
3014*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotCBufAddr = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcChromaAddrI;
3015*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotYBufAddr10Bits = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcLumaAddrI;
3016*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotCBufAddr10Bits = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcChromaAddrI;
3017*53ee8cc1Swenshuai.xi                 }
3018*53ee8cc1Swenshuai.xi                 else
3019*53ee8cc1Swenshuai.xi                 {
3020*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotYBufAddr = DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr;
3021*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotCBufAddr = DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr;
3022*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotYBufAddr10Bits = DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr;
3023*53ee8cc1Swenshuai.xi                     DIP3DDISetting.phyBotCBufAddr10Bits = DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr;
3024*53ee8cc1Swenshuai.xi                 }
3025*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
3026*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32size=sizeof(ST_DIP_DI_SETTING);
3027*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
3028*53ee8cc1Swenshuai.xi             }
3029*53ee8cc1Swenshuai.xi             else
3030*53ee8cc1Swenshuai.xi #endif
3031*53ee8cc1Swenshuai.xi             {
3032*53ee8cc1Swenshuai.xi                 DIP3DDISetting.bEnableDI = FALSE;
3033*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32version=1;
3034*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.stDipr3DDI_VerCtl.u32size=sizeof(ST_DIP_DI_SETTING);
3035*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR3DDISetting.pDIPR3DDISetting = (void*)&DIP3DDISetting;
3036*53ee8cc1Swenshuai.xi             }
3037*53ee8cc1Swenshuai.xi 
3038*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.stMFDec_VerCtl.u32version = 0;
3039*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.stMFDec_VerCtl.u32size = sizeof(ST_XC_DIPR_PROPERTY_EX);
3040*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.enMFDec_tile_mode = _DMS_DIP_MFDECTileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode);
3041*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyLuma_FB_Base = (RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcLumaAddr);
3042*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyChroma_FB_Base = (RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u32SrcChromaAddr);
3043*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16FB_Pitch = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcPitch;
3044*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16HSize = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3045*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16VSize = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3046*53ee8cc1Swenshuai.xi 
3047*53ee8cc1Swenshuai.xi             if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3048*53ee8cc1Swenshuai.xi             {
3049*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bMFDec_Enable = FALSE;
3050*53ee8cc1Swenshuai.xi             }
3051*53ee8cc1Swenshuai.xi             else
3052*53ee8cc1Swenshuai.xi             {
3053*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bMFDec_Enable = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.bMFDec_Enable;
3054*53ee8cc1Swenshuai.xi             }
3055*53ee8cc1Swenshuai.xi 
3056*53ee8cc1Swenshuai.xi             if(eAction == E_DMS_DIP_NORMAL)
3057*53ee8cc1Swenshuai.xi             {
3058*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u8MFDec_Select = DMS_MFDEC_NORMAL;
3059*53ee8cc1Swenshuai.xi             }
3060*53ee8cc1Swenshuai.xi             else if(eAction == E_DMS_DIP_CAPTURE)
3061*53ee8cc1Swenshuai.xi             {
3062*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u8MFDec_Select = DMS_MFDEC_CAPTURE;
3063*53ee8cc1Swenshuai.xi             }
3064*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bUncompress_mode = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.bUncompress_mode;
3065*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bBypass_codec_mode = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.bBypass_codec_mode;
3066*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.en_MFDecVP9_mode = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.en_MFDecVP9_mode;
3067*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16StartX = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.u16StartX;
3068*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16StartY = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.u16StartY;
3069*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyBitlen_Base = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.phyBitlen_Base;
3070*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16Bitlen_Pitch = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].stMFdecInfo.u16Bitlen_Pitch;
3071*53ee8cc1Swenshuai.xi         }
3072*53ee8cc1Swenshuai.xi         else
3073*53ee8cc1Swenshuai.xi         {
3074*53ee8cc1Swenshuai.xi             //Case: DIP Replace GE Rendering
3075*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt;
3076*53ee8cc1Swenshuai.xi 
3077*53ee8cc1Swenshuai.xi             //DIPR win setting
3078*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt;
3079*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3080*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3081*53ee8cc1Swenshuai.xi             DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPRFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
3082*53ee8cc1Swenshuai.xi 
3083*53ee8cc1Swenshuai.xi             if(RES_DMS.bDIPWriteFirstAddr)
3084*53ee8cc1Swenshuai.xi             {
3085*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPDoubleBufStartMemAddr;
3086*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPDoubleBufStartMemAddr;
3087*53ee8cc1Swenshuai.xi             }
3088*53ee8cc1Swenshuai.xi             else
3089*53ee8cc1Swenshuai.xi             {
3090*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPStartMemAddr;
3091*53ee8cc1Swenshuai.xi                 DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPStartMemAddr;
3092*53ee8cc1Swenshuai.xi             }
3093*53ee8cc1Swenshuai.xi         }
3094*53ee8cc1Swenshuai.xi     }
3095*53ee8cc1Swenshuai.xi 
3096*53ee8cc1Swenshuai.xi #if 0
3097*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[34m bufID %d, Fmt %d, width %d, height %d, pitch %d, Yaddr 0x%llx, Caddr 0x%llx \033[0m\n",u16BufferID,DIPRWinPropertytoShow_EX.stDIPRProperty.enDataFmt,
3098*53ee8cc1Swenshuai.xi         DIPRWinPropertytoShow_EX.stDIPRProperty.u16Width,DIPRWinPropertytoShow_EX.stDIPRProperty.u16Height,DIPRWinPropertytoShow_EX.stDIPRProperty.u16Pitch,DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr,DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr);
3099*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u32YBufAddr10Bits[0x%llx] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPRProperty.u32YBufAddr10Bits);
3100*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u32CBufAddr10Bits[0x%llx] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPRProperty.u32CBufAddr10Bits);
3101*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u32version[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.stMFDec_VerCtl.u32version);
3102*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u32size[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.stMFDec_VerCtl.u32size);
3103*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== enMFDec_tile_mode[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.enMFDec_tile_mode);
3104*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== phyLuma_FB_Base[0x%llx] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyLuma_FB_Base);
3105*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== phyChroma_FB_Base[0x%llx] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyChroma_FB_Base);
3106*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16FB_Pitch[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16FB_Pitch);
3107*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16HSize[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16HSize);
3108*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16VSize[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16VSize);
3109*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== bMFDec_Enable[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bMFDec_Enable);
3110*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u8MFDec_Select[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u8MFDec_Select);
3111*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== bUncompress_mode[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bUncompress_mode);
3112*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== bBypass_codec_mode[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.bBypass_codec_mode);
3113*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== en_MFDecVP9_mode[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.en_MFDecVP9_mode);
3114*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16StartX[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16StartX);
3115*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16StartY[%d] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16StartY);
3116*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== phyBitlen_Base[0x%llx] ========== \033[0m\n",DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.phyBitlen_Base);
3117*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[34m  ========== u16Bitlen_Pitch[%d] ========== \033[0m\n", DIPRWinPropertytoShow_EX.stDIPR_MFDecInfo.u16Bitlen_Pitch);
3118*53ee8cc1Swenshuai.xi #endif
3119*53ee8cc1Swenshuai.xi 
3120*53ee8cc1Swenshuai.xi     if(MApi_XC_DIP_SetDIPRProperty_EX)
3121*53ee8cc1Swenshuai.xi     {
3122*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetDIPRProperty_EX(&DIPRWinPropertytoShow_EX, u8DIPWindowID);
3123*53ee8cc1Swenshuai.xi     }
3124*53ee8cc1Swenshuai.xi     else
3125*53ee8cc1Swenshuai.xi     {
3126*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetDIPRProperty(&DIPRWinPropertytoShow_EX.stDIPRProperty, u8DIPWindowID);
3127*53ee8cc1Swenshuai.xi     }
3128*53ee8cc1Swenshuai.xi 
3129*53ee8cc1Swenshuai.xi     return TRUE;
3130*53ee8cc1Swenshuai.xi }
3131*53ee8cc1Swenshuai.xi 
_DMS_SetDIPWWindow(E_DMS_DIP_ACTION eAction,MS_U32 u32Window,MS_U16 u16BufferID)3132*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPWWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID)
3133*53ee8cc1Swenshuai.xi {
3134*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3135*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
3136*53ee8cc1Swenshuai.xi     ST_XC_DIP_WINPROPERTY DIPWinPropertytoShow;
3137*53ee8cc1Swenshuai.xi     memset(&DIPWinPropertytoShow,0,sizeof(ST_XC_DIP_WINPROPERTY));
3138*53ee8cc1Swenshuai.xi 
3139*53ee8cc1Swenshuai.xi     DIPWinPropertytoShow.enSource = SCALER_DIP_SOURCE_TYPE_DRAM;
3140*53ee8cc1Swenshuai.xi     DIPWinPropertytoShow.u8BufCnt = DMS_DIP_BUFFER_COUNT;
3141*53ee8cc1Swenshuai.xi 
3142*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_NORMAL)
3143*53ee8cc1Swenshuai.xi     {
3144*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32Window))
3145*53ee8cc1Swenshuai.xi         {
3146*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth);
3147*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width)
3148*53ee8cc1Swenshuai.xi             {
3149*53ee8cc1Swenshuai.xi                 //scaling up
3150*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width;
3151*53ee8cc1Swenshuai.xi             }
3152*53ee8cc1Swenshuai.xi             else
3153*53ee8cc1Swenshuai.xi             {
3154*53ee8cc1Swenshuai.xi                 //scaling down
3155*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3156*53ee8cc1Swenshuai.xi             }
3157*53ee8cc1Swenshuai.xi 
3158*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height)
3159*53ee8cc1Swenshuai.xi             {
3160*53ee8cc1Swenshuai.xi                 //scaling up
3161*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height;
3162*53ee8cc1Swenshuai.xi             }
3163*53ee8cc1Swenshuai.xi             else
3164*53ee8cc1Swenshuai.xi             {
3165*53ee8cc1Swenshuai.xi                 //scaling down
3166*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3167*53ee8cc1Swenshuai.xi             }
3168*53ee8cc1Swenshuai.xi 
3169*53ee8cc1Swenshuai.xi             if(_DMS_Query_XC_Status(u32Window, DMS_XC_FREEZE))
3170*53ee8cc1Swenshuai.xi             {
3171*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u32BufStart = RES_DMS.u32MVOPFreezeAddress_pa;
3172*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u32BufEnd = RES_DMS.u32MVOPFreezeAddress_pa + (RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr - RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr);
3173*53ee8cc1Swenshuai.xi             }
3174*53ee8cc1Swenshuai.xi             else
3175*53ee8cc1Swenshuai.xi             {
3176*53ee8cc1Swenshuai.xi                 if(RES_DMS.bDIPMVOPWriteFirstAddr)
3177*53ee8cc1Swenshuai.xi                 {
3178*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr;
3179*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr;
3180*53ee8cc1Swenshuai.xi                 }
3181*53ee8cc1Swenshuai.xi                 else
3182*53ee8cc1Swenshuai.xi                 {
3183*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufStartMemAddr;
3184*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufEndMemAddr;
3185*53ee8cc1Swenshuai.xi                 }
3186*53ee8cc1Swenshuai.xi             }
3187*53ee8cc1Swenshuai.xi         }
3188*53ee8cc1Swenshuai.xi         else
3189*53ee8cc1Swenshuai.xi         {
3190*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
3191*53ee8cc1Swenshuai.xi             if(u16BufferID < DMS_Invalid_ReadPointer_ID)
3192*53ee8cc1Swenshuai.xi             {
3193*53ee8cc1Swenshuai.xi                 if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3194*53ee8cc1Swenshuai.xi                 {
3195*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3196*53ee8cc1Swenshuai.xi                     if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2)
3197*53ee8cc1Swenshuai.xi                     {
3198*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2;
3199*53ee8cc1Swenshuai.xi                     }
3200*53ee8cc1Swenshuai.xi                     else
3201*53ee8cc1Swenshuai.xi #endif
3202*53ee8cc1Swenshuai.xi                     {
3203*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3204*53ee8cc1Swenshuai.xi                     }
3205*53ee8cc1Swenshuai.xi 
3206*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3207*53ee8cc1Swenshuai.xi                     if(RES_DMS._stXC_DIPWinInfo[ u32Window].stDstWin.u32height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2)
3208*53ee8cc1Swenshuai.xi                     {
3209*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2;
3210*53ee8cc1Swenshuai.xi                     }
3211*53ee8cc1Swenshuai.xi                     else
3212*53ee8cc1Swenshuai.xi #endif
3213*53ee8cc1Swenshuai.xi                     {
3214*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3215*53ee8cc1Swenshuai.xi                     }
3216*53ee8cc1Swenshuai.xi                 }
3217*53ee8cc1Swenshuai.xi                 else
3218*53ee8cc1Swenshuai.xi                 {
3219*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3220*53ee8cc1Swenshuai.xi                     if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth)
3221*53ee8cc1Swenshuai.xi                     {
3222*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3223*53ee8cc1Swenshuai.xi                     }
3224*53ee8cc1Swenshuai.xi                     else
3225*53ee8cc1Swenshuai.xi #endif
3226*53ee8cc1Swenshuai.xi                     {
3227*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3228*53ee8cc1Swenshuai.xi                     }
3229*53ee8cc1Swenshuai.xi 
3230*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3231*53ee8cc1Swenshuai.xi                     if(RES_DMS._stXC_DIPWinInfo[ u32Window].stDstWin.u32height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight)
3232*53ee8cc1Swenshuai.xi                     {
3233*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3234*53ee8cc1Swenshuai.xi                     }
3235*53ee8cc1Swenshuai.xi                     else
3236*53ee8cc1Swenshuai.xi #endif
3237*53ee8cc1Swenshuai.xi                     {
3238*53ee8cc1Swenshuai.xi                         DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3239*53ee8cc1Swenshuai.xi                     }
3240*53ee8cc1Swenshuai.xi                 }
3241*53ee8cc1Swenshuai.xi 
3242*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3243*53ee8cc1Swenshuai.xi                 RES_DMS.bNeedGEstretch = FALSE;
3244*53ee8cc1Swenshuai.xi 
3245*53ee8cc1Swenshuai.xi                 if(((RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPWinInfo[ u32Window].stCropWin.u32width) ||
3246*53ee8cc1Swenshuai.xi                     (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPWinInfo[ u32Window].stCropWin.u32height)))
3247*53ee8cc1Swenshuai.xi                 {
3248*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32GEStartMemAddr;
3249*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32GEEndMemAddr;
3250*53ee8cc1Swenshuai.xi                     RES_DMS.bNeedGEstretch = TRUE;
3251*53ee8cc1Swenshuai.xi                 }
3252*53ee8cc1Swenshuai.xi                 else if(RES_DMS.bDIPWriteFirstAddr)
3253*53ee8cc1Swenshuai.xi #else
3254*53ee8cc1Swenshuai.xi                 if(RES_DMS.bDIPWriteFirstAddr)
3255*53ee8cc1Swenshuai.xi #endif
3256*53ee8cc1Swenshuai.xi                 {
3257*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPStartMemAddr;
3258*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPEndMemAddr;
3259*53ee8cc1Swenshuai.xi                 }
3260*53ee8cc1Swenshuai.xi                 else
3261*53ee8cc1Swenshuai.xi                 {
3262*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPDoubleBufStartMemAddr;
3263*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[ u32Window].u32DIPDoubleBufEndMemAddr;
3264*53ee8cc1Swenshuai.xi                 }
3265*53ee8cc1Swenshuai.xi             }
3266*53ee8cc1Swenshuai.xi             else
3267*53ee8cc1Swenshuai.xi             {
3268*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3269*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3270*53ee8cc1Swenshuai.xi 
3271*53ee8cc1Swenshuai.xi                 if(RES_DMS.bDIPWriteFirstAddr)
3272*53ee8cc1Swenshuai.xi                 {
3273*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr;
3274*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr;
3275*53ee8cc1Swenshuai.xi                 }
3276*53ee8cc1Swenshuai.xi                 else
3277*53ee8cc1Swenshuai.xi                 {
3278*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufStartMemAddr;
3279*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufEndMemAddr;
3280*53ee8cc1Swenshuai.xi                 }
3281*53ee8cc1Swenshuai.xi             }
3282*53ee8cc1Swenshuai.xi         }
3283*53ee8cc1Swenshuai.xi     }
3284*53ee8cc1Swenshuai.xi     else if(eAction == E_DMS_DIP_CAPTURE)
3285*53ee8cc1Swenshuai.xi     {
3286*53ee8cc1Swenshuai.xi         DIPWinPropertytoShow.u16Pitch = _DMS_DIP_CalcPitch(_DMS_DIP_Capture_ColorFmtMapping(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enDIPDataFmt), RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width);
3287*53ee8cc1Swenshuai.xi         if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3288*53ee8cc1Swenshuai.xi         {
3289*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3290*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2)
3291*53ee8cc1Swenshuai.xi             {
3292*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2;
3293*53ee8cc1Swenshuai.xi             }
3294*53ee8cc1Swenshuai.xi             else
3295*53ee8cc1Swenshuai.xi #endif
3296*53ee8cc1Swenshuai.xi             {
3297*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width;
3298*53ee8cc1Swenshuai.xi             }
3299*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3300*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2)
3301*53ee8cc1Swenshuai.xi             {
3302*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2;
3303*53ee8cc1Swenshuai.xi             }
3304*53ee8cc1Swenshuai.xi             else
3305*53ee8cc1Swenshuai.xi #endif
3306*53ee8cc1Swenshuai.xi             {
3307*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height;
3308*53ee8cc1Swenshuai.xi             }
3309*53ee8cc1Swenshuai.xi         }
3310*53ee8cc1Swenshuai.xi         else
3311*53ee8cc1Swenshuai.xi         {
3312*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3313*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth)
3314*53ee8cc1Swenshuai.xi             {
3315*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3316*53ee8cc1Swenshuai.xi             }
3317*53ee8cc1Swenshuai.xi             else
3318*53ee8cc1Swenshuai.xi #endif
3319*53ee8cc1Swenshuai.xi             {
3320*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Width = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width;
3321*53ee8cc1Swenshuai.xi             }
3322*53ee8cc1Swenshuai.xi 
3323*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3324*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight)
3325*53ee8cc1Swenshuai.xi             {
3326*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3327*53ee8cc1Swenshuai.xi             }
3328*53ee8cc1Swenshuai.xi             else
3329*53ee8cc1Swenshuai.xi #endif
3330*53ee8cc1Swenshuai.xi             {
3331*53ee8cc1Swenshuai.xi                 DIPWinPropertytoShow.u16Height = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height;
3332*53ee8cc1Swenshuai.xi             }
3333*53ee8cc1Swenshuai.xi         }
3334*53ee8cc1Swenshuai.xi /*
3335*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
3336*53ee8cc1Swenshuai.xi         RES_DMS.bNeedGEstretch = FALSE;
3337*53ee8cc1Swenshuai.xi 
3338*53ee8cc1Swenshuai.xi         if(((RES_DMS._stXC_DIPCaptureWinInfo[u32Window].u32Width > RES_DMS._stXC_DIPWinInfo[ u32Window].stCropWin.u32width) ||
3339*53ee8cc1Swenshuai.xi             (RES_DMS._stXC_DIPCaptureWinInfo[u32Window].u32Height > RES_DMS._stXC_DIPWinInfo[ u32Window].stCropWin.u32height)))
3340*53ee8cc1Swenshuai.xi         {
3341*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u32BufStart = RES_DMS._stXC_DIPWinInfo[u32Window].u32GEStartMemAddr;
3342*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u32BufEnd = RES_DMS._stXC_DIPWinInfo[u32Window].u32GEEndMemAddr;
3343*53ee8cc1Swenshuai.xi             RES_DMS.bNeedGEstretch = TRUE;
3344*53ee8cc1Swenshuai.xi         }
3345*53ee8cc1Swenshuai.xi         else
3346*53ee8cc1Swenshuai.xi #endif
3347*53ee8cc1Swenshuai.xi */
3348*53ee8cc1Swenshuai.xi         {
3349*53ee8cc1Swenshuai.xi #if(DMS_DIP_Support_IMI == 0)
3350*53ee8cc1Swenshuai.xi             switch(RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u32Window].u16WritePointer)
3351*53ee8cc1Swenshuai.xi             {
3352*53ee8cc1Swenshuai.xi                 case 0:
3353*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32StartMemAddr;
3354*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32EndMemAddr;
3355*53ee8cc1Swenshuai.xi                     break;
3356*53ee8cc1Swenshuai.xi                 case 1:
3357*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32SecondBufStartMemAddr;
3358*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32SecondBufEndMemAddr;
3359*53ee8cc1Swenshuai.xi                     break;
3360*53ee8cc1Swenshuai.xi                 case 2:
3361*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufStart = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32ThirdBufStartMemAddr;
3362*53ee8cc1Swenshuai.xi                     DIPWinPropertytoShow.u32BufEnd = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32ThirdBufEndMemAddr;
3363*53ee8cc1Swenshuai.xi                     break;
3364*53ee8cc1Swenshuai.xi             }
3365*53ee8cc1Swenshuai.xi #else
3366*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u32BufEnd = 0x123456;  //Temp use
3367*53ee8cc1Swenshuai.xi #endif
3368*53ee8cc1Swenshuai.xi         }
3369*53ee8cc1Swenshuai.xi     }
3370*53ee8cc1Swenshuai.xi     else
3371*53ee8cc1Swenshuai.xi     {
3372*53ee8cc1Swenshuai.xi         DIPWinPropertytoShow.u16Pitch = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth);
3373*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width)
3374*53ee8cc1Swenshuai.xi         {//scaling up
3375*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width;
3376*53ee8cc1Swenshuai.xi         }
3377*53ee8cc1Swenshuai.xi         else
3378*53ee8cc1Swenshuai.xi         {//scaling down
3379*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3380*53ee8cc1Swenshuai.xi         }
3381*53ee8cc1Swenshuai.xi 
3382*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height)
3383*53ee8cc1Swenshuai.xi         {//scaling up
3384*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height;
3385*53ee8cc1Swenshuai.xi         }
3386*53ee8cc1Swenshuai.xi         else
3387*53ee8cc1Swenshuai.xi         {//scaling down
3388*53ee8cc1Swenshuai.xi             DIPWinPropertytoShow.u16Height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3389*53ee8cc1Swenshuai.xi         }
3390*53ee8cc1Swenshuai.xi 
3391*53ee8cc1Swenshuai.xi         MS_PHY phyDiBufSize = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr - RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr;
3392*53ee8cc1Swenshuai.xi         DIPWinPropertytoShow.u32BufStart = _GetDIRingBufferAddr(u32Window,RES_DMSDI.u8DIRingBufferID);
3393*53ee8cc1Swenshuai.xi         DIPWinPropertytoShow.u32BufEnd = DIPWinPropertytoShow.u32BufStart + phyDiBufSize;
3394*53ee8cc1Swenshuai.xi     }
3395*53ee8cc1Swenshuai.xi 
3396*53ee8cc1Swenshuai.xi #if 0
3397*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[35m width %d, height %d, pitch %d, bufStart 0x%llx, bufEnd 0x%llx \033[0m\n",
3398*53ee8cc1Swenshuai.xi         DIPWinPropertytoShow.u16Width,DIPWinPropertytoShow.u16Height,DIPWinPropertytoShow.u16Pitch,DIPWinPropertytoShow.u32BufStart,DIPWinPropertytoShow.u32BufEnd);
3399*53ee8cc1Swenshuai.xi #endif
3400*53ee8cc1Swenshuai.xi 
3401*53ee8cc1Swenshuai.xi     MApi_XC_DIP_SetDIPWinProperty(&DIPWinPropertytoShow, u8DIPWindowID);
3402*53ee8cc1Swenshuai.xi     return TRUE;
3403*53ee8cc1Swenshuai.xi }
3404*53ee8cc1Swenshuai.xi 
_DMS_SetDIPWindow(E_DMS_DIP_ACTION eAction,MS_U32 u32Window,MS_U16 u16BufferID)3405*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SetDIPWindow(E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID)
3406*53ee8cc1Swenshuai.xi {
3407*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3408*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
3409*53ee8cc1Swenshuai.xi 
3410*53ee8cc1Swenshuai.xi     XC_SETWIN_INFO xc_dip_wininfotoShow;
3411*53ee8cc1Swenshuai.xi     memset(&xc_dip_wininfotoShow,0,sizeof(XC_SETWIN_INFO));
3412*53ee8cc1Swenshuai.xi 
3413*53ee8cc1Swenshuai.xi     if(eAction != E_DMS_DIP_DI)
3414*53ee8cc1Swenshuai.xi     {
3415*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32Window))
3416*53ee8cc1Swenshuai.xi         {
3417*53ee8cc1Swenshuai.xi             if(RES_DMS.gDMS_ScalingCondition & USE_2ND_BUFFER)
3418*53ee8cc1Swenshuai.xi             {
3419*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth = DMS_FHD_Hszie;
3420*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight = DMS_FHD_Vszie;
3421*53ee8cc1Swenshuai.xi             }
3422*53ee8cc1Swenshuai.xi         }
3423*53ee8cc1Swenshuai.xi     }
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi     // set DIP read window
3426*53ee8cc1Swenshuai.xi     _DMS_SetDIPRWindow(eAction, u32Window, u16BufferID);
3427*53ee8cc1Swenshuai.xi 
3428*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_CAPTURE)
3429*53ee8cc1Swenshuai.xi     {
3430*53ee8cc1Swenshuai.xi         // set tile mode
3431*53ee8cc1Swenshuai.xi         //MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode),u8DIPWindowID);
3432*53ee8cc1Swenshuai.xi         if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3433*53ee8cc1Swenshuai.xi         {
3434*53ee8cc1Swenshuai.xi             MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u8Src2ndBufferTileMode),u8DIPWindowID);
3435*53ee8cc1Swenshuai.xi         }
3436*53ee8cc1Swenshuai.xi         else
3437*53ee8cc1Swenshuai.xi         {
3438*53ee8cc1Swenshuai.xi             // set tile mode
3439*53ee8cc1Swenshuai.xi             MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode),u8DIPWindowID);
3440*53ee8cc1Swenshuai.xi         }
3441*53ee8cc1Swenshuai.xi         // set Capture output tile
3442*53ee8cc1Swenshuai.xi         if(_DMS_DIP_Capture_ColorFmtMapping(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enDIPDataFmt) != DIP_DATA_FMT_YUV422)
3443*53ee8cc1Swenshuai.xi         {
3444*53ee8cc1Swenshuai.xi             MApi_XC_DIP_Set420TileBlock(_DMS_DIP_Capture_TileMapping(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enTileBlock),u8DIPWindowID);
3445*53ee8cc1Swenshuai.xi         }
3446*53ee8cc1Swenshuai.xi 
3447*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.stCapWin.x = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32x;
3448*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.stCapWin.y = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32y;
3449*53ee8cc1Swenshuai.xi         if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3450*53ee8cc1Swenshuai.xi         {
3451*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2;
3452*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2;
3453*53ee8cc1Swenshuai.xi         }
3454*53ee8cc1Swenshuai.xi         else
3455*53ee8cc1Swenshuai.xi         {
3456*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3457*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3458*53ee8cc1Swenshuai.xi         }
3459*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.bPreHCusScaling = TRUE;
3460*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.u16PreHCusScalingSrc = xc_dip_wininfotoShow.stCapWin.width;
3461*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.u16PreHCusScalingDst = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width;
3462*53ee8cc1Swenshuai.xi 
3463*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.bPreVCusScaling = TRUE;
3464*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.u16PreVCusScalingSrc = xc_dip_wininfotoShow.stCapWin.height;
3465*53ee8cc1Swenshuai.xi         xc_dip_wininfotoShow.u16PreVCusScalingDst = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height;
3466*53ee8cc1Swenshuai.xi 
3467*53ee8cc1Swenshuai.xi         if( (RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth) ||
3468*53ee8cc1Swenshuai.xi             (RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight) )
3469*53ee8cc1Swenshuai.xi         {
3470*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 1)
3471*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SetHVSP(TRUE, u8DIPWindowID);
3472*53ee8cc1Swenshuai.xi #else
3473*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth)
3474*53ee8cc1Swenshuai.xi             {
3475*53ee8cc1Swenshuai.xi                 xc_dip_wininfotoShow.u16PreHCusScalingDst = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3476*53ee8cc1Swenshuai.xi             }
3477*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight)
3478*53ee8cc1Swenshuai.xi             {
3479*53ee8cc1Swenshuai.xi                 xc_dip_wininfotoShow.u16PreVCusScalingDst = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3480*53ee8cc1Swenshuai.xi             }
3481*53ee8cc1Swenshuai.xi #endif
3482*53ee8cc1Swenshuai.xi         }
3483*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 1)
3484*53ee8cc1Swenshuai.xi         else
3485*53ee8cc1Swenshuai.xi         {
3486*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SetHVSP(FALSE, u8DIPWindowID);
3487*53ee8cc1Swenshuai.xi         }
3488*53ee8cc1Swenshuai.xi #endif
3489*53ee8cc1Swenshuai.xi     }
3490*53ee8cc1Swenshuai.xi     else
3491*53ee8cc1Swenshuai.xi     {
3492*53ee8cc1Swenshuai.xi         if(_DMS_IsCaptureWindowEnable(u32Window) &&
3493*53ee8cc1Swenshuai.xi             RES_DMS.u8DIP_Window[E_DMS_DIP_CAPTURE] == RES_DMS.u8DIP_Window[E_DMS_DIP_NORMAL])
3494*53ee8cc1Swenshuai.xi         {
3495*53ee8cc1Swenshuai.xi             if(_DMS_Is_CaptureMode_OutputTile(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enTileBlock))
3496*53ee8cc1Swenshuai.xi             {
3497*53ee8cc1Swenshuai.xi                 //Restore DIPW status
3498*53ee8cc1Swenshuai.xi                 MApi_XC_DIP_Set420TileBlock(DIP_TILE_BLOCK_W_16_32, u8DIPWindowID);
3499*53ee8cc1Swenshuai.xi             }
3500*53ee8cc1Swenshuai.xi         }
3501*53ee8cc1Swenshuai.xi         if(eAction == E_DMS_DIP_NORMAL)
3502*53ee8cc1Swenshuai.xi         {
3503*53ee8cc1Swenshuai.xi             if(u16BufferID < DMS_Invalid_ReadPointer_ID)
3504*53ee8cc1Swenshuai.xi             {
3505*53ee8cc1Swenshuai.xi                 if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth, RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3506*53ee8cc1Swenshuai.xi                 {
3507*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u8Src2ndBufferTileMode),u8DIPWindowID);
3508*53ee8cc1Swenshuai.xi                 }
3509*53ee8cc1Swenshuai.xi                 else
3510*53ee8cc1Swenshuai.xi                 {
3511*53ee8cc1Swenshuai.xi                     // set tile mode
3512*53ee8cc1Swenshuai.xi                     MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode),u8DIPWindowID);
3513*53ee8cc1Swenshuai.xi                 }
3514*53ee8cc1Swenshuai.xi             }
3515*53ee8cc1Swenshuai.xi             else
3516*53ee8cc1Swenshuai.xi             {
3517*53ee8cc1Swenshuai.xi                 // set tile mode to NONE
3518*53ee8cc1Swenshuai.xi                 MApi_XC_W2BYTEMSK(0x3616,0x0000,0x8000);
3519*53ee8cc1Swenshuai.xi             }
3520*53ee8cc1Swenshuai.xi         }
3521*53ee8cc1Swenshuai.xi         else
3522*53ee8cc1Swenshuai.xi         {
3523*53ee8cc1Swenshuai.xi             // case E_DMS_DIP_DI, set tile mode
3524*53ee8cc1Swenshuai.xi             MApi_XC_DIP_Set420TileBlock(_DMS_DIP_TileTypeMapping(RES_DMSDI._stXC_DIPDIInfo[u32Window][u16BufferID].eTileMode),u8DIPWindowID);
3525*53ee8cc1Swenshuai.xi         }
3526*53ee8cc1Swenshuai.xi 
3527*53ee8cc1Swenshuai.xi         //Capture window
3528*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32Window))
3529*53ee8cc1Swenshuai.xi         {
3530*53ee8cc1Swenshuai.xi             //consider two case
3531*53ee8cc1Swenshuai.xi             //1. P mode scaling down
3532*53ee8cc1Swenshuai.xi             //    a. scaling from crop to dest, xc not scaling
3533*53ee8cc1Swenshuai.xi             //2. I mode scaling down/up
3534*53ee8cc1Swenshuai.xi             //    a. scaling from crop to dest, xc not scaling
3535*53ee8cc1Swenshuai.xi             //    b. keep ratio crop to dest, xc scaling up
3536*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.x = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32x;
3537*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.y = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32y;
3538*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width;
3539*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height;
3540*53ee8cc1Swenshuai.xi 
3541*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.bPreHCusScaling = TRUE;
3542*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.bPreVCusScaling = TRUE;
3543*53ee8cc1Swenshuai.xi 
3544*53ee8cc1Swenshuai.xi             _DMS_XC_SetCusScaling(&xc_dip_wininfotoShow,FALSE,
3545*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width,
3546*53ee8cc1Swenshuai.xi                 (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width)? RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width : RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width,
3547*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height,
3548*53ee8cc1Swenshuai.xi                 (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height)? RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height : RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height);
3549*53ee8cc1Swenshuai.xi         }
3550*53ee8cc1Swenshuai.xi         else
3551*53ee8cc1Swenshuai.xi         {
3552*53ee8cc1Swenshuai.xi             if(eAction == E_DMS_DIP_NORMAL)
3553*53ee8cc1Swenshuai.xi             {
3554*53ee8cc1Swenshuai.xi                 if(u16BufferID < DMS_Invalid_ReadPointer_ID)
3555*53ee8cc1Swenshuai.xi                 {
3556*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.x = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32x;
3557*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.y = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32y;
3558*53ee8cc1Swenshuai.xi                     if(_DMS_WindowSizeOverFHD(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight))
3559*53ee8cc1Swenshuai.xi                     {
3560*53ee8cc1Swenshuai.xi                         xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth / 2;
3561*53ee8cc1Swenshuai.xi                         xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight / 2;
3562*53ee8cc1Swenshuai.xi                     }
3563*53ee8cc1Swenshuai.xi                     else
3564*53ee8cc1Swenshuai.xi                     {
3565*53ee8cc1Swenshuai.xi                         xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3566*53ee8cc1Swenshuai.xi                         xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3567*53ee8cc1Swenshuai.xi                     }
3568*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.bPreHCusScaling = TRUE;
3569*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreHCusScalingSrc = xc_dip_wininfotoShow.stCapWin.width;
3570*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreHCusScalingDst = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3571*53ee8cc1Swenshuai.xi 
3572*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.bPreVCusScaling = TRUE;
3573*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreVCusScalingSrc = xc_dip_wininfotoShow.stCapWin.height;
3574*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreVCusScalingDst = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3575*53ee8cc1Swenshuai.xi 
3576*53ee8cc1Swenshuai.xi                     if( (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth) ||
3577*53ee8cc1Swenshuai.xi                         (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight) )
3578*53ee8cc1Swenshuai.xi                     {
3579*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 1)
3580*53ee8cc1Swenshuai.xi                         MApi_XC_DIP_SetHVSP(TRUE, u8DIPWindowID);
3581*53ee8cc1Swenshuai.xi #else
3582*53ee8cc1Swenshuai.xi                         if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth)
3583*53ee8cc1Swenshuai.xi                         {
3584*53ee8cc1Swenshuai.xi                             xc_dip_wininfotoShow.u16PreHCusScalingDst = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcWidth;
3585*53ee8cc1Swenshuai.xi                         }
3586*53ee8cc1Swenshuai.xi                         if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height > RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight)
3587*53ee8cc1Swenshuai.xi                         {
3588*53ee8cc1Swenshuai.xi                             xc_dip_wininfotoShow.u16PreVCusScalingDst = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].u16SrcHeight;
3589*53ee8cc1Swenshuai.xi                         }
3590*53ee8cc1Swenshuai.xi #endif
3591*53ee8cc1Swenshuai.xi                     }
3592*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 1)
3593*53ee8cc1Swenshuai.xi                     else
3594*53ee8cc1Swenshuai.xi                     {
3595*53ee8cc1Swenshuai.xi                         MApi_XC_DIP_SetHVSP(FALSE, u8DIPWindowID);
3596*53ee8cc1Swenshuai.xi                     }
3597*53ee8cc1Swenshuai.xi #endif
3598*53ee8cc1Swenshuai.xi                 }
3599*53ee8cc1Swenshuai.xi                 else
3600*53ee8cc1Swenshuai.xi                 {
3601*53ee8cc1Swenshuai.xi                     //Capture window
3602*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.x = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32x;
3603*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.y = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32y;
3604*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3605*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.stCapWin.height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3606*53ee8cc1Swenshuai.xi 
3607*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.bPreHCusScaling = FALSE;
3608*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreHCusScalingSrc = xc_dip_wininfotoShow.stCapWin.width;
3609*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreHCusScalingDst = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
3610*53ee8cc1Swenshuai.xi 
3611*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.bPreVCusScaling = FALSE;
3612*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreVCusScalingSrc = xc_dip_wininfotoShow.stCapWin.height;
3613*53ee8cc1Swenshuai.xi                     xc_dip_wininfotoShow.u16PreVCusScalingDst = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
3614*53ee8cc1Swenshuai.xi                 }
3615*53ee8cc1Swenshuai.xi             }
3616*53ee8cc1Swenshuai.xi         }
3617*53ee8cc1Swenshuai.xi     }
3618*53ee8cc1Swenshuai.xi 
3619*53ee8cc1Swenshuai.xi #if 0
3620*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_DI)
3621*53ee8cc1Swenshuai.xi     {
3622*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[34m  ========== Set Cap[%d %d %d %d] ========== \033[0m\n",xc_dip_wininfotoShow.stCapWin.x,xc_dip_wininfotoShow.stCapWin.y,
3623*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.width,xc_dip_wininfotoShow.stCapWin.height);
3624*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[34m  ========== Set Scaling[%d %d %d %d] ========== \033[0m\n",xc_dip_wininfotoShow.u16PreHCusScalingSrc,xc_dip_wininfotoShow.u16PreHCusScalingDst,
3625*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.u16PreVCusScalingSrc,xc_dip_wininfotoShow.u16PreVCusScalingDst);
3626*53ee8cc1Swenshuai.xi     }
3627*53ee8cc1Swenshuai.xi     else
3628*53ee8cc1Swenshuai.xi     {
3629*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[34m  ========== Set Cap[%d %d %d %d] Tile %d -> %d ========== \033[0m\n",xc_dip_wininfotoShow.stCapWin.x,xc_dip_wininfotoShow.stCapWin.y,
3630*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.stCapWin.width,xc_dip_wininfotoShow.stCapWin.height,
3631*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode,
3632*53ee8cc1Swenshuai.xi             _DMS_DIP_TileTypeMapping(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].eTileMode));
3633*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[34m  ========== Set Scaling[%d %d %d %d] ========== \033[0m\n",xc_dip_wininfotoShow.u16PreHCusScalingSrc,xc_dip_wininfotoShow.u16PreHCusScalingDst,
3634*53ee8cc1Swenshuai.xi             xc_dip_wininfotoShow.u16PreVCusScalingSrc,xc_dip_wininfotoShow.u16PreVCusScalingDst);
3635*53ee8cc1Swenshuai.xi     }
3636*53ee8cc1Swenshuai.xi #endif
3637*53ee8cc1Swenshuai.xi 
3638*53ee8cc1Swenshuai.xi     MApi_XC_SkipWaitVsync(MAIN_WINDOW,TRUE);
3639*53ee8cc1Swenshuai.xi     MApi_XC_DIP_SetWindow(&xc_dip_wininfotoShow,sizeof(XC_SETWIN_INFO),u8DIPWindowID);
3640*53ee8cc1Swenshuai.xi     MApi_XC_SkipWaitVsync(MAIN_WINDOW,FALSE);
3641*53ee8cc1Swenshuai.xi 
3642*53ee8cc1Swenshuai.xi     // set DIP write window
3643*53ee8cc1Swenshuai.xi     _DMS_SetDIPWWindow(eAction, u32Window, u16BufferID);
3644*53ee8cc1Swenshuai.xi     return TRUE;
3645*53ee8cc1Swenshuai.xi }
3646*53ee8cc1Swenshuai.xi 
3647*53ee8cc1Swenshuai.xi ////MVOP XC flow
3648*53ee8cc1Swenshuai.xi #define FLOW_CONDITION_4K           0x01
3649*53ee8cc1Swenshuai.xi #define FLOW_CONDITION_INTERLACE    0x02
3650*53ee8cc1Swenshuai.xi #define FLOW_CONDITION_SHRINK       0x04
3651*53ee8cc1Swenshuai.xi #define CONDITION_4K_WIDTH          3840
3652*53ee8cc1Swenshuai.xi #define CONDITION_4K_HEIGHT         2160
3653*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_MVOP_Set_Flow(MS_U8 u8Id)3654*53ee8cc1Swenshuai.xi static MS_U8 _DMS_MVOP_Set_Flow(MS_U8 u8Id)
3655*53ee8cc1Swenshuai.xi {
3656*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3657*53ee8cc1Swenshuai.xi     MS_U8 u8FlowCondition = 0;
3658*53ee8cc1Swenshuai.xi     MS_BOOL bMVOPFromDIPDi = FALSE;
3659*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_XCCropWinInfo.u32width >= CONDITION_4K_WIDTH && RES_DMS._stXC_XCCropWinInfo.u32height >= CONDITION_4K_HEIGHT)
3660*53ee8cc1Swenshuai.xi     {
3661*53ee8cc1Swenshuai.xi         u8FlowCondition |= FLOW_CONDITION_4K;
3662*53ee8cc1Swenshuai.xi     }
3663*53ee8cc1Swenshuai.xi     if((u8Id < DMS_Invalid_ReadPointer_ID) && (_DMS_Is_SourceInterlace(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u8Id].eScanType) == TRUE))
3664*53ee8cc1Swenshuai.xi     {
3665*53ee8cc1Swenshuai.xi         u8FlowCondition |= FLOW_CONDITION_INTERLACE;
3666*53ee8cc1Swenshuai.xi     }
3667*53ee8cc1Swenshuai.xi     if((RES_DMS._stXC_XCCropWinInfo.u32width > RES_DMS._stXC_XCDispWinInfo.u32width) &&
3668*53ee8cc1Swenshuai.xi         (RES_DMS._stXC_XCCropWinInfo.u32height > RES_DMS._stXC_XCDispWinInfo.u32height))
3669*53ee8cc1Swenshuai.xi     {
3670*53ee8cc1Swenshuai.xi         u8FlowCondition |= FLOW_CONDITION_SHRINK;
3671*53ee8cc1Swenshuai.xi     }
3672*53ee8cc1Swenshuai.xi 
3673*53ee8cc1Swenshuai.xi     if(u8FlowCondition & FLOW_CONDITION_4K)
3674*53ee8cc1Swenshuai.xi     {
3675*53ee8cc1Swenshuai.xi         //4K force from VDEC
3676*53ee8cc1Swenshuai.xi         RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_VDEC;
3677*53ee8cc1Swenshuai.xi     }
3678*53ee8cc1Swenshuai.xi     else if(u8FlowCondition & FLOW_CONDITION_INTERLACE)
3679*53ee8cc1Swenshuai.xi     {
3680*53ee8cc1Swenshuai.xi         //Interlace force From DIP
3681*53ee8cc1Swenshuai.xi         RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_DIP;
3682*53ee8cc1Swenshuai.xi     }
3683*53ee8cc1Swenshuai.xi     else
3684*53ee8cc1Swenshuai.xi     {
3685*53ee8cc1Swenshuai.xi         //P mode
3686*53ee8cc1Swenshuai.xi         if(u8FlowCondition & FLOW_CONDITION_SHRINK)
3687*53ee8cc1Swenshuai.xi         {
3688*53ee8cc1Swenshuai.xi             //P mode shrink, from DIP
3689*53ee8cc1Swenshuai.xi             //4K scaling down case contain in 4K case, use from VDEC
3690*53ee8cc1Swenshuai.xi             RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_DIP;
3691*53ee8cc1Swenshuai.xi         }
3692*53ee8cc1Swenshuai.xi         else
3693*53ee8cc1Swenshuai.xi         {
3694*53ee8cc1Swenshuai.xi             //P mode enlarge or the same, from VDEC
3695*53ee8cc1Swenshuai.xi             RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_VDEC;
3696*53ee8cc1Swenshuai.xi         }
3697*53ee8cc1Swenshuai.xi     }
3698*53ee8cc1Swenshuai.xi 
3699*53ee8cc1Swenshuai.xi     if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE))
3700*53ee8cc1Swenshuai.xi     {
3701*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] freeze setting to DIP to MVOP flow\n",__FUNCTION__);
3702*53ee8cc1Swenshuai.xi         RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_DIP;
3703*53ee8cc1Swenshuai.xi     }
3704*53ee8cc1Swenshuai.xi 
3705*53ee8cc1Swenshuai.xi #if DEV_DI
3706*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u8Id].bIsAfterDiTask == TRUE)
3707*53ee8cc1Swenshuai.xi     {
3708*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] Get After Di Buffer\n",__FUNCTION__);
3709*53ee8cc1Swenshuai.xi         RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_DIP;
3710*53ee8cc1Swenshuai.xi         bMVOPFromDIPDi = TRUE;
3711*53ee8cc1Swenshuai.xi     }
3712*53ee8cc1Swenshuai.xi #endif
3713*53ee8cc1Swenshuai.xi 
3714*53ee8cc1Swenshuai.xi     RES_DMS.bDMS_MVOPFlowFromDi = bMVOPFromDIPDi;
3715*53ee8cc1Swenshuai.xi     return u8FlowCondition;
3716*53ee8cc1Swenshuai.xi }
3717*53ee8cc1Swenshuai.xi #endif
3718*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_MVOP_SetConfig(MVOP_InputSel eInputCfg,MS_BOOL bYUV422,MS_U8 u8MIUSel)3719*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_MVOP_SetConfig(MVOP_InputSel eInputCfg, MS_BOOL bYUV422, MS_U8 u8MIUSel)
3720*53ee8cc1Swenshuai.xi {
3721*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3722*53ee8cc1Swenshuai.xi     MVOP_VidStat stMvopVidSt;
3723*53ee8cc1Swenshuai.xi     MVOP_InputCfg stMvopInputCfg;
3724*53ee8cc1Swenshuai.xi 
3725*53ee8cc1Swenshuai.xi     // Structure initialization
3726*53ee8cc1Swenshuai.xi     memset(&stMvopVidSt, 0, sizeof(MVOP_VidStat));
3727*53ee8cc1Swenshuai.xi     memset(&stMvopInputCfg, 0, sizeof(MVOP_InputCfg));
3728*53ee8cc1Swenshuai.xi 
3729*53ee8cc1Swenshuai.xi     MDrv_MVOP_Init();
3730*53ee8cc1Swenshuai.xi     MDrv_MVOP_Enable(FALSE); // Turn off MVOP before setting it
3731*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_MiuSwitch(u8MIUSel))
3732*53ee8cc1Swenshuai.xi     {
3733*53ee8cc1Swenshuai.xi         DMS_PRINTF("Cannot set MVOP MIU selection!\n");
3734*53ee8cc1Swenshuai.xi         return FALSE;
3735*53ee8cc1Swenshuai.xi     }
3736*53ee8cc1Swenshuai.xi 
3737*53ee8cc1Swenshuai.xi     //For IFrame-Decoder
3738*53ee8cc1Swenshuai.xi     if(eInputCfg == MVOP_INPUT_DRAM)
3739*53ee8cc1Swenshuai.xi     {
3740*53ee8cc1Swenshuai.xi         stMvopInputCfg.u16HSize = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth;
3741*53ee8cc1Swenshuai.xi         stMvopInputCfg.u16VSize = 1080;
3742*53ee8cc1Swenshuai.xi         stMvopInputCfg.u32YOffset = 0;
3743*53ee8cc1Swenshuai.xi         stMvopInputCfg.u32UVOffset = 0;
3744*53ee8cc1Swenshuai.xi         stMvopInputCfg.bProgressive = TRUE;
3745*53ee8cc1Swenshuai.xi         stMvopInputCfg.bUV7bit = FALSE;
3746*53ee8cc1Swenshuai.xi         stMvopInputCfg.bField = FALSE;
3747*53ee8cc1Swenshuai.xi         stMvopInputCfg.u16StripSize = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth;
3748*53ee8cc1Swenshuai.xi         if (bYUV422 == TRUE)
3749*53ee8cc1Swenshuai.xi         {
3750*53ee8cc1Swenshuai.xi             stMvopInputCfg.bSD = FALSE;
3751*53ee8cc1Swenshuai.xi             stMvopInputCfg.bYUV422 = FALSE;
3752*53ee8cc1Swenshuai.xi             stMvopInputCfg.bDramRdContd = FALSE;
3753*53ee8cc1Swenshuai.xi             stMvopInputCfg.b422pack = FALSE;
3754*53ee8cc1Swenshuai.xi             //For H264 IFrame.
3755*53ee8cc1Swenshuai.xi             MDrv_MVOP_SetTileFormat(E_MVOP_TILE_16x32);
3756*53ee8cc1Swenshuai.xi         }
3757*53ee8cc1Swenshuai.xi         else
3758*53ee8cc1Swenshuai.xi         {
3759*53ee8cc1Swenshuai.xi             stMvopInputCfg.bSD = TRUE;
3760*53ee8cc1Swenshuai.xi             stMvopInputCfg.bYUV422 = TRUE;
3761*53ee8cc1Swenshuai.xi             stMvopInputCfg.bDramRdContd = TRUE;
3762*53ee8cc1Swenshuai.xi             stMvopInputCfg.b422pack = TRUE;
3763*53ee8cc1Swenshuai.xi         }
3764*53ee8cc1Swenshuai.xi     }
3765*53ee8cc1Swenshuai.xi 
3766*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_SetInputCfg(eInputCfg, &stMvopInputCfg))
3767*53ee8cc1Swenshuai.xi     {
3768*53ee8cc1Swenshuai.xi         DMS_PRINTF("Set MVOP input config failed!");
3769*53ee8cc1Swenshuai.xi         return FALSE;
3770*53ee8cc1Swenshuai.xi     }
3771*53ee8cc1Swenshuai.xi 
3772*53ee8cc1Swenshuai.xi     MS_BOOL bHS = TRUE;
3773*53ee8cc1Swenshuai.xi     MS_BOOL bXCGen = TRUE;
3774*53ee8cc1Swenshuai.xi     MVOP_Handle stMvopHd = { E_MVOP_MODULE_MAIN };
3775*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_HANDSHAKE_MODE, &bHS);
3776*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_XC_GEN_TIMING, &bXCGen);
3777*53ee8cc1Swenshuai.xi 
3778*53ee8cc1Swenshuai.xi     stMvopVidSt.u16HorSize = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth;
3779*53ee8cc1Swenshuai.xi     stMvopVidSt.u16VerSize = RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth;
3780*53ee8cc1Swenshuai.xi     stMvopVidSt.u16FrameRate = g_IPanel.DefaultVFreq()*100;
3781*53ee8cc1Swenshuai.xi     stMvopVidSt.u8AspectRate = 0;
3782*53ee8cc1Swenshuai.xi     stMvopVidSt.u8Interlace = FALSE;
3783*53ee8cc1Swenshuai.xi 
3784*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_SetOutputCfg(&stMvopVidSt, FALSE))
3785*53ee8cc1Swenshuai.xi     {
3786*53ee8cc1Swenshuai.xi         DMS_PRINTF("Set MVOP output config failed!");
3787*53ee8cc1Swenshuai.xi         return FALSE;
3788*53ee8cc1Swenshuai.xi     }
3789*53ee8cc1Swenshuai.xi     MDrv_MVOP_Enable(TRUE); // Enable MVOP, video pass to Scaler
3790*53ee8cc1Swenshuai.xi     return TRUE;
3791*53ee8cc1Swenshuai.xi }
3792*53ee8cc1Swenshuai.xi #endif
_DMS_XC_SetConnect(INPUT_SOURCE_TYPE_t eInputSrcType)3793*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_XC_SetConnect(INPUT_SOURCE_TYPE_t eInputSrcType)
3794*53ee8cc1Swenshuai.xi {
3795*53ee8cc1Swenshuai.xi     MS_S16 s16PathId;
3796*53ee8cc1Swenshuai.xi     MS_U8 u8Count = 0;
3797*53ee8cc1Swenshuai.xi     XC_MUX_PATH_INFO PathInfo;
3798*53ee8cc1Swenshuai.xi     XC_MUX_PATH_INFO AllPathInfo[MAX_SYNC_DATA_PATH_SUPPORTED];
3799*53ee8cc1Swenshuai.xi 
3800*53ee8cc1Swenshuai.xi     memset(&PathInfo, 0, sizeof(XC_MUX_PATH_INFO));
3801*53ee8cc1Swenshuai.xi     PathInfo.Path_Type = PATH_TYPE_SYNCHRONOUS;
3802*53ee8cc1Swenshuai.xi     PathInfo.src = eInputSrcType;
3803*53ee8cc1Swenshuai.xi     PathInfo.dest = OUTPUT_SCALER_MAIN_WINDOW;
3804*53ee8cc1Swenshuai.xi     PathInfo.SyncEventHandler = NULL;
3805*53ee8cc1Swenshuai.xi     PathInfo.DestOnOff_Event_Handler = NULL;
3806*53ee8cc1Swenshuai.xi     PathInfo.path_thread = NULL;
3807*53ee8cc1Swenshuai.xi     PathInfo.dest_periodic_handler = NULL; //[FIXME] PQ_Adaptive
3808*53ee8cc1Swenshuai.xi 
3809*53ee8cc1Swenshuai.xi     memset(AllPathInfo, 0, sizeof(XC_MUX_PATH_INFO)*MAX_SYNC_DATA_PATH_SUPPORTED);
3810*53ee8cc1Swenshuai.xi     u8Count = MApi_XC_Mux_GetPathInfo(AllPathInfo);
3811*53ee8cc1Swenshuai.xi 
3812*53ee8cc1Swenshuai.xi     if(u8Count > 0)
3813*53ee8cc1Swenshuai.xi     {
3814*53ee8cc1Swenshuai.xi         do{
3815*53ee8cc1Swenshuai.xi             u8Count = u8Count - 1;
3816*53ee8cc1Swenshuai.xi             if(AllPathInfo[u8Count].dest == PathInfo.dest)
3817*53ee8cc1Swenshuai.xi             {
3818*53ee8cc1Swenshuai.xi                 if(AllPathInfo[u8Count].src == (eInputSrcType))
3819*53ee8cc1Swenshuai.xi                 {
3820*53ee8cc1Swenshuai.xi                     DMS_PRINTF("eInputSrc %u was already connected to %u.\n", eInputSrcType, PathInfo.dest);
3821*53ee8cc1Swenshuai.xi                     return TRUE;
3822*53ee8cc1Swenshuai.xi                 }
3823*53ee8cc1Swenshuai.xi                 else
3824*53ee8cc1Swenshuai.xi                 {
3825*53ee8cc1Swenshuai.xi                     if(-1 == MApi_XC_Mux_DeletePath(AllPathInfo[u8Count].src, AllPathInfo[u8Count].dest))
3826*53ee8cc1Swenshuai.xi                     {
3827*53ee8cc1Swenshuai.xi                         DMS_PRINTF(" Delete path fail: src = %d, dest = %d\n", AllPathInfo[u8Count].src, AllPathInfo[u8Count].dest);
3828*53ee8cc1Swenshuai.xi                     }
3829*53ee8cc1Swenshuai.xi                     break;
3830*53ee8cc1Swenshuai.xi                 }
3831*53ee8cc1Swenshuai.xi             }
3832*53ee8cc1Swenshuai.xi         }while(u8Count>0);
3833*53ee8cc1Swenshuai.xi     }
3834*53ee8cc1Swenshuai.xi 
3835*53ee8cc1Swenshuai.xi     s16PathId = MApi_XC_Mux_CreatePath(&PathInfo, sizeof(XC_MUX_PATH_INFO));
3836*53ee8cc1Swenshuai.xi     if (s16PathId == -1)
3837*53ee8cc1Swenshuai.xi     {
3838*53ee8cc1Swenshuai.xi         DMS_PRINTF(" Create path fail, src = %d, dest = %d, your structure has wrong size with library \n", PathInfo.src, PathInfo.dest );
3839*53ee8cc1Swenshuai.xi     }
3840*53ee8cc1Swenshuai.xi     else
3841*53ee8cc1Swenshuai.xi     {
3842*53ee8cc1Swenshuai.xi         MApi_XC_Mux_EnablePath((MS_U16)s16PathId);
3843*53ee8cc1Swenshuai.xi     }
3844*53ee8cc1Swenshuai.xi 
3845*53ee8cc1Swenshuai.xi     MApi_XC_SetInputSource(eInputSrcType, MAIN_WINDOW);
3846*53ee8cc1Swenshuai.xi     MApi_XC_DisableInputSource(DISABLE, MAIN_WINDOW);
3847*53ee8cc1Swenshuai.xi     return TRUE;
3848*53ee8cc1Swenshuai.xi }
3849*53ee8cc1Swenshuai.xi 
_DMS_XC_SetDisconnect(INPUT_SOURCE_TYPE_t eInputSrcType)3850*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_XC_SetDisconnect(INPUT_SOURCE_TYPE_t eInputSrcType)
3851*53ee8cc1Swenshuai.xi {
3852*53ee8cc1Swenshuai.xi     E_DEST_TYPE eDest = OUTPUT_SCALER_MAIN_WINDOW;
3853*53ee8cc1Swenshuai.xi 
3854*53ee8cc1Swenshuai.xi     if(-1 == MApi_XC_Mux_DeletePath(eInputSrcType, eDest))
3855*53ee8cc1Swenshuai.xi     {
3856*53ee8cc1Swenshuai.xi           DMS_PRINTF(" [%s][%d]Delete path fail\n", __FUNCTION__, __LINE__);
3857*53ee8cc1Swenshuai.xi           return FALSE;
3858*53ee8cc1Swenshuai.xi     }
3859*53ee8cc1Swenshuai.xi 
3860*53ee8cc1Swenshuai.xi     return TRUE;
3861*53ee8cc1Swenshuai.xi }
3862*53ee8cc1Swenshuai.xi 
3863*53ee8cc1Swenshuai.xi //Wait Apple's API
_DMS_MVOP_MFDEC_Patch(MS_BOOL bMFDecEnable)3864*53ee8cc1Swenshuai.xi static void _DMS_MVOP_MFDEC_Patch(MS_BOOL bMFDecEnable)
3865*53ee8cc1Swenshuai.xi {
3866*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3867*53ee8cc1Swenshuai.xi     if(bMFDecEnable)
3868*53ee8cc1Swenshuai.xi     {
3869*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x1014A8, 0x01,0x01); //enable
3870*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x1014AE,(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].stMFdecInfo.phyBitlen_Base >> 3) & 0xFFFF,0xFFFF);
3871*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x1014B0,((RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].stMFdecInfo.phyBitlen_Base >> 3)>>16) & 0x0FFF,0x0FFF);
3872*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x1014BC,(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].stMFdecInfo.u16Bitlen_Pitch << 8), 0xFF00);
3873*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x101450, 0x20, 0x20); //h264 nfdec need 32x32
3874*53ee8cc1Swenshuai.xi     }
3875*53ee8cc1Swenshuai.xi     else
3876*53ee8cc1Swenshuai.xi     {
3877*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x1014A8, 0x00,0x01); //disable
3878*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x101450, 0x00, 0x20); //undo h264 nfdec need 32x32
3879*53ee8cc1Swenshuai.xi     }
3880*53ee8cc1Swenshuai.xi }
3881*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_MVOP_CalcPitch(MS_U16 u16Width)3882*53ee8cc1Swenshuai.xi static MS_U16 _DMS_MVOP_CalcPitch(MS_U16 u16Width)
3883*53ee8cc1Swenshuai.xi {
3884*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3885*53ee8cc1Swenshuai.xi     MS_U16 u16Pitch = 0;
3886*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] u16SrcWidth: %d\n",__FUNCTION__,u16Width);
3887*53ee8cc1Swenshuai.xi     if(u16Width % 32 != 0)
3888*53ee8cc1Swenshuai.xi     {
3889*53ee8cc1Swenshuai.xi         u16Width = (((u16Width)/(32)+1) * (32));
3890*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] u16SrcWidth align to : %d\n",__FUNCTION__,u16Width);
3891*53ee8cc1Swenshuai.xi     }
3892*53ee8cc1Swenshuai.xi     if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
3893*53ee8cc1Swenshuai.xi     {
3894*53ee8cc1Swenshuai.xi         //YUV420 pitch is Width / 8
3895*53ee8cc1Swenshuai.xi         u16Pitch = u16Width / 8;
3896*53ee8cc1Swenshuai.xi     }
3897*53ee8cc1Swenshuai.xi     else
3898*53ee8cc1Swenshuai.xi     {
3899*53ee8cc1Swenshuai.xi         //YUV422 pitch is Width / 4
3900*53ee8cc1Swenshuai.xi         u16Pitch = u16Width / 4;
3901*53ee8cc1Swenshuai.xi     }
3902*53ee8cc1Swenshuai.xi     return u16Pitch;
3903*53ee8cc1Swenshuai.xi }
3904*53ee8cc1Swenshuai.xi #endif
3905*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_MVOP_SetPitch(MS_U16 u16Width)3906*53ee8cc1Swenshuai.xi static void _DMS_MVOP_SetPitch(MS_U16 u16Width)
3907*53ee8cc1Swenshuai.xi {
3908*53ee8cc1Swenshuai.xi     MS_U16 u16Pitch = _DMS_MVOP_CalcPitch(u16Width);
3909*53ee8cc1Swenshuai.xi     MApi_XC_Write2ByteMask(0x101440,((u16Pitch & 0xFF) << 8),0xFF00);
3910*53ee8cc1Swenshuai.xi     MApi_XC_WriteByteMask(0x101430,(u16Pitch >> 8),0x03);
3911*53ee8cc1Swenshuai.xi }
3912*53ee8cc1Swenshuai.xi #endif
3913*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_MVOP_SwitchPath(MS_U8 u8Id)3914*53ee8cc1Swenshuai.xi static void _DMS_MVOP_SwitchPath(MS_U8 u8Id)
3915*53ee8cc1Swenshuai.xi {
3916*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3917*53ee8cc1Swenshuai.xi     MApi_XC_WriteByteMask(0x10144E,0x10,0x10);
3918*53ee8cc1Swenshuai.xi 
3919*53ee8cc1Swenshuai.xi     if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
3920*53ee8cc1Swenshuai.xi     {
3921*53ee8cc1Swenshuai.xi         //MVOP Pitch from VDEC need get vdec source size
3922*53ee8cc1Swenshuai.xi         //_DMS_MVOP_SetPitch(_stXC_XCCropWinInfo.width);
3923*53ee8cc1Swenshuai.xi         _DMS_MVOP_SetPitch(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u8Id].u16SrcPitch);
3924*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x101440,0x00,0xB0);
3925*53ee8cc1Swenshuai.xi     }
3926*53ee8cc1Swenshuai.xi     else
3927*53ee8cc1Swenshuai.xi     {
3928*53ee8cc1Swenshuai.xi         //MVOP Pitch is DIP write pitch = DIPWinInfo.stDstWin
3929*53ee8cc1Swenshuai.xi         _DMS_MVOP_SetPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth);
3930*53ee8cc1Swenshuai.xi         MApi_XC_Write2ByteMask(0x101440,0xB0,0xB0);
3931*53ee8cc1Swenshuai.xi     }
3932*53ee8cc1Swenshuai.xi     MApi_XC_WriteByteMask(0x10144E,0x00,0x10);
3933*53ee8cc1Swenshuai.xi }
3934*53ee8cc1Swenshuai.xi #endif
3935*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_DIP_SyncStoredSetting(void)3936*53ee8cc1Swenshuai.xi static void _DMS_DIP_SyncStoredSetting(void)
3937*53ee8cc1Swenshuai.xi {
3938*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3939*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stCropWin,&RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stCropWin,sizeof(ST_DMS_WINDOW));
3940*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stDstWin,&RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin,sizeof(ST_DMS_WINDOW));
3941*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_XCDispWinInfo,&RES_DMS._stXC_XCDispWinInfo_DoubleBuffer,sizeof(ST_DMS_WINDOW));
3942*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_XCCropWinInfo,&RES_DMS._stXC_XCCropWinInfo_DoubleBuffer,sizeof(ST_DMS_WINDOW));
3943*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIPStartMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPStartMemAddr;
3944*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIPEndMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPEndMemAddr;
3945*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIPDoubleBufStartMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPDoubleBufStartMemAddr;
3946*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32DIPDoubleBufEndMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPDoubleBufEndMemAddr;
3947*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
3948*53ee8cc1Swenshuai.xi     for(i = 0; i < DMS_DI_RING_BUFFER; i++)
3949*53ee8cc1Swenshuai.xi     {
3950*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].phyDIPRingBufMemAddr[i] = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.phyDIPRingBufMemAddr[i];
3951*53ee8cc1Swenshuai.xi     }
3952*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].u32RingBufferSize = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32RingBufferSize;
3953*53ee8cc1Swenshuai.xi }
3954*53ee8cc1Swenshuai.xi #endif
3955*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_XC_SetWindow_MVOP_SetPath(void * pInstance,MS_U16 u16ID)3956*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_XC_SetWindow_MVOP_SetPath(void* pInstance, MS_U16 u16ID)
3957*53ee8cc1Swenshuai.xi {
3958*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
3959*53ee8cc1Swenshuai.xi     _DMS_DIP_SyncStoredSetting();
3960*53ee8cc1Swenshuai.xi     MS_WINDOW_TYPE stMVOPWindow; //decribe how to set MVOP crop
3961*53ee8cc1Swenshuai.xi     XC_SETWIN_INFO stXCSetWinInfo;
3962*53ee8cc1Swenshuai.xi     memset(&stXCSetWinInfo, 0, sizeof(XC_SETWIN_INFO));
3963*53ee8cc1Swenshuai.xi 
3964*53ee8cc1Swenshuai.xi     stXCSetWinInfo.enInputSourceType = INPUT_SOURCE_DTV;
3965*53ee8cc1Swenshuai.xi     MVOP_Timing mvop_timing;
3966*53ee8cc1Swenshuai.xi     memset(&mvop_timing, 0, sizeof(MVOP_Timing));
3967*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_GetOutputTiming(&mvop_timing))
3968*53ee8cc1Swenshuai.xi         DMS_PRINTF("MDrv_MVOP_GetOutputTiming failed!!\n");
3969*53ee8cc1Swenshuai.xi 
3970*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bHDuplicate    = mvop_timing.bHDuplicate;
3971*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16InputVTotal = mvop_timing.u16V_TotalCount;
3972*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16DefaultHtotal = mvop_timing.u16H_TotalCount;
3973*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bInterlace     = mvop_timing.bInterlace;
3974*53ee8cc1Swenshuai.xi 
3975*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16InputVFreq = g_IPanel.DefaultVFreq();
3976*53ee8cc1Swenshuai.xi     //cap Window
3977*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCapWin.x = 0;
3978*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCapWin.y = 0;
3979*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCapWin.width = RES_DMS._stXC_XCCropWinInfo.u32width;
3980*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCapWin.height = RES_DMS._stXC_XCCropWinInfo.u32height;
3981*53ee8cc1Swenshuai.xi 
3982*53ee8cc1Swenshuai.xi     //Crop / disp Window
3983*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCropWin.x = 0;
3984*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCropWin.y = 0;
3985*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCropWin.width = RES_DMS._stXC_XCCropWinInfo.u32width;
3986*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stCropWin.height = RES_DMS._stXC_XCCropWinInfo.u32height;
3987*53ee8cc1Swenshuai.xi 
3988*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stDispWin.x = RES_DMS._stXC_XCDispWinInfo.u32x;
3989*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stDispWin.y = RES_DMS._stXC_XCDispWinInfo.u32y;
3990*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stDispWin.width = RES_DMS._stXC_XCDispWinInfo.u32width;
3991*53ee8cc1Swenshuai.xi     stXCSetWinInfo.stDispWin.height = RES_DMS._stXC_XCDispWinInfo.u32height;
3992*53ee8cc1Swenshuai.xi 
3993*53ee8cc1Swenshuai.xi     //-------------------------
3994*53ee8cc1Swenshuai.xi     // customized pre scaling
3995*53ee8cc1Swenshuai.xi     //-------------------------
3996*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bPreHCusScaling = TRUE;
3997*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16PreHCusScalingSrc = RES_DMS._stXC_XCCropWinInfo.u32width;
3998*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16PreHCusScalingDst = RES_DMS._stXC_XCCropWinInfo.u32width;
3999*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bPreVCusScaling = TRUE;
4000*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16PreVCusScalingSrc = RES_DMS._stXC_XCCropWinInfo.u32height;
4001*53ee8cc1Swenshuai.xi     stXCSetWinInfo.u16PreVCusScalingDst = RES_DMS._stXC_XCCropWinInfo.u32height;
4002*53ee8cc1Swenshuai.xi 
4003*53ee8cc1Swenshuai.xi     //customized Post scaling
4004*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bHCusScaling = TRUE;
4005*53ee8cc1Swenshuai.xi     stXCSetWinInfo.bVCusScaling = TRUE;
4006*53ee8cc1Swenshuai.xi     RES_DMS.eDMS_PreMVOPFlowCtrl = RES_DMS.eDMS_MVOPFlowCtrl;
4007*53ee8cc1Swenshuai.xi     MS_U8 u8FlowCondition = _DMS_MVOP_Set_Flow(u16ID);
4008*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[1;36m[%s] 4K:%s(2ndBuf:%s) I:%s shrink:%s(XC90:%s), Flow %s, ID %d\033[0m\n",__FUNCTION__,(u8FlowCondition & FLOW_CONDITION_4K)? "YES" : "NO",
4009*53ee8cc1Swenshuai.xi         (RES_DMS.gDMS_ScalingCondition & USE_2ND_BUFFER)? "YES" : "NO",
4010*53ee8cc1Swenshuai.xi         (u8FlowCondition & FLOW_CONDITION_INTERLACE)? "YES" : "NO",
4011*53ee8cc1Swenshuai.xi         (u8FlowCondition & FLOW_CONDITION_SHRINK)? "YES" : "NO",
4012*53ee8cc1Swenshuai.xi         (RES_DMS.gDMS_ScalingCondition & USE_XC_SCALING_DOWN)? "YES" : "NO",
4013*53ee8cc1Swenshuai.xi         (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)? "From VDEC" : "From DIP",
4014*53ee8cc1Swenshuai.xi         u16ID);
4015*53ee8cc1Swenshuai.xi 
4016*53ee8cc1Swenshuai.xi     if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
4017*53ee8cc1Swenshuai.xi     {
4018*53ee8cc1Swenshuai.xi         //Enlarge or the same case or XC force scaling down 4K to 90%up
4019*53ee8cc1Swenshuai.xi         stMVOPWindow.x = RES_DMS._stXC_XCCropWinInfo.u32x;
4020*53ee8cc1Swenshuai.xi         stMVOPWindow.y = RES_DMS._stXC_XCCropWinInfo.u32y;
4021*53ee8cc1Swenshuai.xi         stMVOPWindow.width = RES_DMS._stXC_XCCropWinInfo.u32width;
4022*53ee8cc1Swenshuai.xi         stMVOPWindow.height = RES_DMS._stXC_XCCropWinInfo.u32height;
4023*53ee8cc1Swenshuai.xi         _DMS_XC_SetCusScaling(&stXCSetWinInfo,TRUE,
4024*53ee8cc1Swenshuai.xi             RES_DMS._stXC_XCCropWinInfo.u32width, RES_DMS._stXC_XCDispWinInfo.u32width,
4025*53ee8cc1Swenshuai.xi             RES_DMS._stXC_XCCropWinInfo.u32height, RES_DMS._stXC_XCDispWinInfo.u32height);
4026*53ee8cc1Swenshuai.xi     }
4027*53ee8cc1Swenshuai.xi     else
4028*53ee8cc1Swenshuai.xi     {
4029*53ee8cc1Swenshuai.xi         //From DIP
4030*53ee8cc1Swenshuai.xi         stMVOPWindow.x = stMVOPWindow.y = 0;
4031*53ee8cc1Swenshuai.xi         if(u8FlowCondition & FLOW_CONDITION_SHRINK)
4032*53ee8cc1Swenshuai.xi         {
4033*53ee8cc1Swenshuai.xi             stMVOPWindow.width = RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stDstWin.u32width;
4034*53ee8cc1Swenshuai.xi             stMVOPWindow.height = RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stDstWin.u32height;
4035*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stDstWin.u32width < RES_DMS._stXC_XCDispWinInfo.u32width)
4036*53ee8cc1Swenshuai.xi             {
4037*53ee8cc1Swenshuai.xi                 //Shrink but for DIP pixel alignment, need enlarge a little by XC case
4038*53ee8cc1Swenshuai.xi                 _DMS_XC_SetCusScaling(&stXCSetWinInfo,TRUE,
4039*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stDstWin.u32width, RES_DMS._stXC_XCDispWinInfo.u32width,
4040*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_XCDispWinInfo.u32height, RES_DMS._stXC_XCDispWinInfo.u32height);
4041*53ee8cc1Swenshuai.xi             }
4042*53ee8cc1Swenshuai.xi             else
4043*53ee8cc1Swenshuai.xi             {
4044*53ee8cc1Swenshuai.xi                 _DMS_XC_SetCusScaling(&stXCSetWinInfo,TRUE,
4045*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_XCDispWinInfo.u32width, RES_DMS._stXC_XCDispWinInfo.u32width,
4046*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_XCDispWinInfo.u32height, RES_DMS._stXC_XCDispWinInfo.u32height);
4047*53ee8cc1Swenshuai.xi             }
4048*53ee8cc1Swenshuai.xi         }
4049*53ee8cc1Swenshuai.xi         else
4050*53ee8cc1Swenshuai.xi         {
4051*53ee8cc1Swenshuai.xi             //From DIP but enlarge => DIP do Di and XC enlarge
4052*53ee8cc1Swenshuai.xi             stMVOPWindow.width = RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stCropWin.u32width;
4053*53ee8cc1Swenshuai.xi             stMVOPWindow.height = RES_DMS._stXC_DIPWinInfo[MVOP_WINDOW].stCropWin.u32height;
4054*53ee8cc1Swenshuai.xi             _DMS_XC_SetCusScaling(&stXCSetWinInfo,TRUE,
4055*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_XCCropWinInfo.u32width, RES_DMS._stXC_XCDispWinInfo.u32width,
4056*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_XCCropWinInfo.u32height, RES_DMS._stXC_XCDispWinInfo.u32height);
4057*53ee8cc1Swenshuai.xi         }
4058*53ee8cc1Swenshuai.xi     }
4059*53ee8cc1Swenshuai.xi #if DBG_DMS_LOG
4060*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] total: %d %d\n",__FUNCTION__,stXCSetWinInfo.u16DefaultHtotal,stXCSetWinInfo.u16InputVTotal);
4061*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] bInterlace: %d, VFreq %d\n",__FUNCTION__,stXCSetWinInfo.bInterlace,stXCSetWinInfo.u16InputVFreq);
4062*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] MVOP: %d %d, %d %d\n",__FUNCTION__,stMVOPWindow.x,stMVOPWindow.y,stMVOPWindow.width,stMVOPWindow.height);
4063*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] Capt: %d %d, %d %d\n",__FUNCTION__,stXCSetWinInfo.stCapWin.x,stXCSetWinInfo.stCapWin.y,stXCSetWinInfo.stCapWin.width,stXCSetWinInfo.stCapWin.height);
4064*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] Crop: %d %d, %d %d\n",__FUNCTION__,stXCSetWinInfo.stCropWin.x,stXCSetWinInfo.stCropWin.y,stXCSetWinInfo.stCropWin.width,stXCSetWinInfo.stCropWin.height);
4065*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] Disp: %d %d, %d %d\n",__FUNCTION__,stXCSetWinInfo.stDispWin.x,stXCSetWinInfo.stDispWin.y,stXCSetWinInfo.stDispWin.width,stXCSetWinInfo.stDispWin.height);
4066*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] Pre : %d -> %d, %d -> %d\n",__FUNCTION__,stXCSetWinInfo.u16PreHCusScalingSrc,stXCSetWinInfo.u16PreHCusScalingDst,stXCSetWinInfo.u16PreVCusScalingSrc,stXCSetWinInfo.u16PreVCusScalingDst);
4067*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] Post: %d -> %d, %d -> %d\n",__FUNCTION__,stXCSetWinInfo.u16HCusScalingSrc,stXCSetWinInfo.u16HCusScalingDst,stXCSetWinInfo.u16VCusScalingSrc,stXCSetWinInfo.u16VCusScalingDst);
4068*53ee8cc1Swenshuai.xi #endif
4069*53ee8cc1Swenshuai.xi     if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FIRST_TIME_SETWINDOW))
4070*53ee8cc1Swenshuai.xi     {
4071*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetStartPos(stMVOPWindow.x, stMVOPWindow.y);
4072*53ee8cc1Swenshuai.xi         //[FIXME] C2 MVOP Driver Bug, H need set Y + H, wait Apple Fix
4073*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetImageWidthHight(stMVOPWindow.width, stMVOPWindow.height + stMVOPWindow.y);
4074*53ee8cc1Swenshuai.xi 
4075*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetRegSizeFromMVD(FALSE);
4076*53ee8cc1Swenshuai.xi         _DMS_MVOP_SwitchPath(RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]);
4077*53ee8cc1Swenshuai.xi 
4078*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] Setwin: %d %d %d %d %d\n",__FUNCTION__,stXCSetWinInfo.bHDuplicate,stXCSetWinInfo.u16InputVTotal,
4079*53ee8cc1Swenshuai.xi             stXCSetWinInfo.u16DefaultHtotal,stXCSetWinInfo.bInterlace,stXCSetWinInfo.u16InputVFreq);
4080*53ee8cc1Swenshuai.xi 
4081*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] Setwin: (%d %d %d %d) (%d %d %d %d) (%d %d %d %d)\n",__FUNCTION__,stXCSetWinInfo.stCapWin.x,stXCSetWinInfo.stCapWin.y,
4082*53ee8cc1Swenshuai.xi             stXCSetWinInfo.stCapWin.width,stXCSetWinInfo.stCapWin.height,stXCSetWinInfo.stCropWin.x,stXCSetWinInfo.stCropWin.y,
4083*53ee8cc1Swenshuai.xi             stXCSetWinInfo.stCropWin.width,stXCSetWinInfo.stCropWin.height,stXCSetWinInfo.stDispWin.x,stXCSetWinInfo.stDispWin.y,
4084*53ee8cc1Swenshuai.xi             stXCSetWinInfo.stDispWin.width,stXCSetWinInfo.stDispWin.height);
4085*53ee8cc1Swenshuai.xi 
4086*53ee8cc1Swenshuai.xi         MApi_XC_SkipWaitVsync(MAIN_WINDOW,TRUE);
4087*53ee8cc1Swenshuai.xi         MApi_XC_SetWindow(&stXCSetWinInfo, sizeof(XC_SETWIN_INFO), MAIN_WINDOW);
4088*53ee8cc1Swenshuai.xi         MApi_XC_SkipWaitVsync(MAIN_WINDOW,FALSE);
4089*53ee8cc1Swenshuai.xi ///Set XC for Virtual Box size
4090*53ee8cc1Swenshuai.xi         MApi_XC_W2BYTE(REG_SC_BK12_0F_L,0x1000);
4091*53ee8cc1Swenshuai.xi         MApi_XC_W2BYTE(REG_SC_BK12_17_L,0x1000);
4092*53ee8cc1Swenshuai.xi         _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_FIRST_TIME_SETWINDOW);
4093*53ee8cc1Swenshuai.xi         HAL_DMS_XC_DSSetConfig(pInstance);
4094*53ee8cc1Swenshuai.xi         if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
4095*53ee8cc1Swenshuai.xi         {
4096*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] u16SrcWidth: %d %d\n",__FUNCTION__,u16ID,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u16ID].u16SrcPitch);
4097*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSSetMVOPPitch(pInstance, _DMS_MVOP_CalcPitch(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u16ID].u16SrcPitch));
4098*53ee8cc1Swenshuai.xi             //HAL_DMS_XC_DSSetMVOPPitch(_DMS_MVOP_CalcPitch(stMVOPWindow.width));
4099*53ee8cc1Swenshuai.xi         }
4100*53ee8cc1Swenshuai.xi         else
4101*53ee8cc1Swenshuai.xi         {
4102*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSSetMVOPPitch(pInstance, _DMS_MVOP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth));
4103*53ee8cc1Swenshuai.xi         }
4104*53ee8cc1Swenshuai.xi         HAL_DMS_XC_DSSetWin(pInstance, &stMVOPWindow, &stXCSetWinInfo,RES_DMS.eDMS_MVOPFlowCtrl);
4105*53ee8cc1Swenshuai.xi     }
4106*53ee8cc1Swenshuai.xi     else
4107*53ee8cc1Swenshuai.xi     {
4108*53ee8cc1Swenshuai.xi         //DS setwin
4109*53ee8cc1Swenshuai.xi         if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
4110*53ee8cc1Swenshuai.xi         {
4111*53ee8cc1Swenshuai.xi             if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE))
4112*53ee8cc1Swenshuai.xi             {
4113*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] VDEC SrcWidth: %d (to id %d) %d\n",__FUNCTION__,u16ID,RES_DMS.gu8DMS_Seq_Change_ID,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gu8DMS_Seq_Change_ID].u16SrcPitch);
4114*53ee8cc1Swenshuai.xi                 HAL_DMS_XC_DSSetMVOPPitch(pInstance, _DMS_MVOP_CalcPitch(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gu8DMS_Seq_Change_ID].u16SrcPitch));
4115*53ee8cc1Swenshuai.xi             }
4116*53ee8cc1Swenshuai.xi             else
4117*53ee8cc1Swenshuai.xi             {
4118*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] SrcWidth: %d %d\n",__FUNCTION__,u16ID,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u16ID].u16SrcPitch);
4119*53ee8cc1Swenshuai.xi                 HAL_DMS_XC_DSSetMVOPPitch(pInstance, _DMS_MVOP_CalcPitch(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u16ID].u16SrcPitch));
4120*53ee8cc1Swenshuai.xi             }
4121*53ee8cc1Swenshuai.xi         }
4122*53ee8cc1Swenshuai.xi         else
4123*53ee8cc1Swenshuai.xi         {
4124*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] DIP SrcWidth: %d (to id %d) %d\n",__FUNCTION__,u16ID,RES_DMS.gu8DMS_Seq_Change_ID,RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth);
4125*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSSetMVOPPitch(pInstance, _DMS_MVOP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth));
4126*53ee8cc1Swenshuai.xi         }
4127*53ee8cc1Swenshuai.xi         HAL_DMS_XC_DSSetWin(pInstance, &stMVOPWindow, &stXCSetWinInfo,RES_DMS.eDMS_MVOPFlowCtrl);
4128*53ee8cc1Swenshuai.xi     }
4129*53ee8cc1Swenshuai.xi 
4130*53ee8cc1Swenshuai.xi     return TRUE;
4131*53ee8cc1Swenshuai.xi }
4132*53ee8cc1Swenshuai.xi #endif
4133*53ee8cc1Swenshuai.xi ////MVOP XC flow
_DMS_DIP_Fire(E_DMS_DIP_ACTION eAction)4134*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_Fire(E_DMS_DIP_ACTION eAction)
4135*53ee8cc1Swenshuai.xi {
4136*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4137*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
4138*53ee8cc1Swenshuai.xi 
4139*53ee8cc1Swenshuai.xi     //enable DIP interrupt
4140*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnaInt(BMASK((DMS_DIP_BUFFER_COUNT-1):0)&0xFF, TRUE, u8DIPWindowID);
4141*53ee8cc1Swenshuai.xi 
4142*53ee8cc1Swenshuai.xi     MApi_XC_DIP_ClearInt(BMASK((DMS_DIP_BUFFER_COUNT-1):0)&0xFF, u8DIPWindowID);
4143*53ee8cc1Swenshuai.xi 
4144*53ee8cc1Swenshuai.xi     // Enable DIPW
4145*53ee8cc1Swenshuai.xi     MApi_XC_DIP_Ena(TRUE,u8DIPWindowID);
4146*53ee8cc1Swenshuai.xi 
4147*53ee8cc1Swenshuai.xi     // Enable DIPR softwave trigger
4148*53ee8cc1Swenshuai.xi     MApi_XC_DIP_CapOneFrameFast(u8DIPWindowID);
4149*53ee8cc1Swenshuai.xi     return TRUE;
4150*53ee8cc1Swenshuai.xi }
4151*53ee8cc1Swenshuai.xi 
4152*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
_DMS_NeedGEstretch(void * pInstance,MS_U32 u32Window)4153*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_NeedGEstretch(void* pInstance, MS_U32 u32Window)
4154*53ee8cc1Swenshuai.xi {
4155*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4156*53ee8cc1Swenshuai.xi     if(RES_DMS.bNeedGEstretch)
4157*53ee8cc1Swenshuai.xi     {
4158*53ee8cc1Swenshuai.xi         GFX_DrawRect stgfxDrawRect;
4159*53ee8cc1Swenshuai.xi         stgfxDrawRect.srcblk.x = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32x;
4160*53ee8cc1Swenshuai.xi         stgfxDrawRect.srcblk.y = RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32y;
4161*53ee8cc1Swenshuai.xi         stgfxDrawRect.srcblk.width = (RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width> RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width)?
4162*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width: RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32width;
4163*53ee8cc1Swenshuai.xi         stgfxDrawRect.srcblk.height = (RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height> RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height)?
4164*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height: RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin.u32height;
4165*53ee8cc1Swenshuai.xi 
4166*53ee8cc1Swenshuai.xi         stgfxDrawRect.dstblk.x = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x;
4167*53ee8cc1Swenshuai.xi         stgfxDrawRect.dstblk.y = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y;
4168*53ee8cc1Swenshuai.xi         stgfxDrawRect.dstblk.width = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
4169*53ee8cc1Swenshuai.xi         stgfxDrawRect.dstblk.height = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
4170*53ee8cc1Swenshuai.xi         _DMS_GEBitblt(RES_DMS._stXC_DIPWinInfo[u32Window].u32GEStartMemAddr,
4171*53ee8cc1Swenshuai.xi             _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, _DMS_DIP_GetBackgroundBufID(pInstance)),
4172*53ee8cc1Swenshuai.xi             &stgfxDrawRect);
4173*53ee8cc1Swenshuai.xi     }
4174*53ee8cc1Swenshuai.xi     return TRUE;
4175*53ee8cc1Swenshuai.xi }
4176*53ee8cc1Swenshuai.xi #endif
4177*53ee8cc1Swenshuai.xi 
_DMS_DIP_WaitWriteDone(E_DMS_DIP_ACTION eAction)4178*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_DIP_WaitWriteDone(E_DMS_DIP_ACTION eAction)
4179*53ee8cc1Swenshuai.xi {
4180*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4181*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
4182*53ee8cc1Swenshuai.xi 
4183*53ee8cc1Swenshuai.xi     MS_U32 u32StartTime = 0;
4184*53ee8cc1Swenshuai.xi     u32StartTime = MsOS_GetSystemTime();
4185*53ee8cc1Swenshuai.xi     while(MApi_XC_DIP_GetIntStatus(u8DIPWindowID) == 0)
4186*53ee8cc1Swenshuai.xi     {
4187*53ee8cc1Swenshuai.xi         if(MsOS_GetSystemTime() - u32StartTime > DMS_DIP_TIMEOUT)
4188*53ee8cc1Swenshuai.xi         {
4189*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[1;31m[%s] DIP %d Timeout!!!!!!!!!!!!!!!! \033[0m\n",__FUNCTION__, u8DIPWindowID);
4190*53ee8cc1Swenshuai.xi             return FALSE;
4191*53ee8cc1Swenshuai.xi         }
4192*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4193*53ee8cc1Swenshuai.xi     }
4194*53ee8cc1Swenshuai.xi     return TRUE;
4195*53ee8cc1Swenshuai.xi }
4196*53ee8cc1Swenshuai.xi 
_DMS_DIP_Flow_PrepareNextFrame(void * pInstance,E_DMS_DIP_ACTION eAction,MS_U32 u32Window,MS_U16 u16BufferID)4197*53ee8cc1Swenshuai.xi static void _DMS_DIP_Flow_PrepareNextFrame(void* pInstance, E_DMS_DIP_ACTION eAction, MS_U32 u32Window, MS_U16 u16BufferID)
4198*53ee8cc1Swenshuai.xi {
4199*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4200*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[eAction];
4201*53ee8cc1Swenshuai.xi 
4202*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4203*53ee8cc1Swenshuai.xi     while(MApi_XC_DIP_GetResource(u8DIPWindowID) == E_APIXC_RET_FAIL)
4204*53ee8cc1Swenshuai.xi     {
4205*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4206*53ee8cc1Swenshuai.xi     }
4207*53ee8cc1Swenshuai.xi 
4208*53ee8cc1Swenshuai.xi     //Disable BK1336 reg3[8]
4209*53ee8cc1Swenshuai.xi     MApi_XC_W2BYTEMSK(REG_SC_BK36_03_L,0x0000,0x0100);
4210*53ee8cc1Swenshuai.xi 
4211*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4212*53ee8cc1Swenshuai.xi 
4213*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_CAPTURE)
4214*53ee8cc1Swenshuai.xi     {
4215*53ee8cc1Swenshuai.xi         if(_DMS_Is_UVSwap(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enColorFormat))
4216*53ee8cc1Swenshuai.xi         {
4217*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapUV(TRUE ,u8DIPWindowID);
4218*53ee8cc1Swenshuai.xi         }
4219*53ee8cc1Swenshuai.xi         else
4220*53ee8cc1Swenshuai.xi         {
4221*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapUV(FALSE ,u8DIPWindowID);
4222*53ee8cc1Swenshuai.xi         }
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi         if(_DMS_Is_YCSwap(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enColorFormat))
4225*53ee8cc1Swenshuai.xi         {
4226*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapYC(TRUE ,u8DIPWindowID);
4227*53ee8cc1Swenshuai.xi         }
4228*53ee8cc1Swenshuai.xi         else
4229*53ee8cc1Swenshuai.xi         {
4230*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapYC(FALSE ,u8DIPWindowID);
4231*53ee8cc1Swenshuai.xi         }
4232*53ee8cc1Swenshuai.xi 
4233*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetOutputDataFmt(_DMS_DIP_Capture_ColorFmtMapping(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].enDIPDataFmt), u8DIPWindowID);
4234*53ee8cc1Swenshuai.xi     }
4235*53ee8cc1Swenshuai.xi     else
4236*53ee8cc1Swenshuai.xi     {
4237*53ee8cc1Swenshuai.xi         if(1)//_DMS_Is_MVOPFlow(u32Window) == FALSE)
4238*53ee8cc1Swenshuai.xi         {
4239*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapUV(TRUE ,u8DIPWindowID);
4240*53ee8cc1Swenshuai.xi         }
4241*53ee8cc1Swenshuai.xi         else
4242*53ee8cc1Swenshuai.xi         {
4243*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SwapUV(FALSE ,u8DIPWindowID);
4244*53ee8cc1Swenshuai.xi         }
4245*53ee8cc1Swenshuai.xi 
4246*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32Window) == FALSE)
4247*53ee8cc1Swenshuai.xi         {
4248*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SetOutputDataFmt(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt, u8DIPWindowID);
4249*53ee8cc1Swenshuai.xi         }
4250*53ee8cc1Swenshuai.xi         else
4251*53ee8cc1Swenshuai.xi         {
4252*53ee8cc1Swenshuai.xi             MApi_XC_DIP_SetOutputDataFmt(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, u8DIPWindowID);
4253*53ee8cc1Swenshuai.xi         }
4254*53ee8cc1Swenshuai.xi     }
4255*53ee8cc1Swenshuai.xi 
4256*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnableR2Y(FALSE,u8DIPWindowID);
4257*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnableY2R(FALSE,u8DIPWindowID);
4258*53ee8cc1Swenshuai.xi 
4259*53ee8cc1Swenshuai.xi     // set DIP read/write window
4260*53ee8cc1Swenshuai.xi     _DMS_SetDIPWindow(eAction, u32Window, u16BufferID);
4261*53ee8cc1Swenshuai.xi 
4262*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_IMI
4263*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_CAPTURE)
4264*53ee8cc1Swenshuai.xi     {
4265*53ee8cc1Swenshuai.xi         MS_BOOL bEnable = TRUE;
4266*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SetConfig(E_XC_DIP_IMI_ENABLE, &bEnable, u8DIPWindowID);
4267*53ee8cc1Swenshuai.xi     }
4268*53ee8cc1Swenshuai.xi #endif
4269*53ee8cc1Swenshuai.xi 
4270*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4271*53ee8cc1Swenshuai.xi     // enable DIP
4272*53ee8cc1Swenshuai.xi     _DMS_DIP_Fire(eAction);
4273*53ee8cc1Swenshuai.xi 
4274*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_IMI
4275*53ee8cc1Swenshuai.xi     if(eAction == E_DMS_DIP_CAPTURE)
4276*53ee8cc1Swenshuai.xi     {
4277*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4278*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_IMICaptureInfo[u32Window].bCaptureRet = TRUE;
4279*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE.bIsFrameValid[u32Window][u16BufferID] == TRUE)
4280*53ee8cc1Swenshuai.xi         {
4281*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE.u8frameRepeatCnt[u32Window][u16BufferID] == 0)
4282*53ee8cc1Swenshuai.xi             {
4283*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u16PreviousWP = u16BufferID;
4284*53ee8cc1Swenshuai.xi             }
4285*53ee8cc1Swenshuai.xi         }
4286*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4287*53ee8cc1Swenshuai.xi     }
4288*53ee8cc1Swenshuai.xi #endif
4289*53ee8cc1Swenshuai.xi 
4290*53ee8cc1Swenshuai.xi     // Wait DIP write done
4291*53ee8cc1Swenshuai.xi     _DMS_DIP_WaitWriteDone(eAction);
4292*53ee8cc1Swenshuai.xi 
4293*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4294*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
4295*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window) == FALSE)
4296*53ee8cc1Swenshuai.xi     {
4297*53ee8cc1Swenshuai.xi         _DMS_NeedGEstretch(pInstance, u32Window);
4298*53ee8cc1Swenshuai.xi     }
4299*53ee8cc1Swenshuai.xi #endif
4300*53ee8cc1Swenshuai.xi 
4301*53ee8cc1Swenshuai.xi #if DEV_PAUSE
4302*53ee8cc1Swenshuai.xi     //if((_DMS_Is_MVOPFlow(u32Window) == TRUE) && (eAction == E_DMS_DIP_NORMAL))
4303*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window) == TRUE)
4304*53ee8cc1Swenshuai.xi     {
4305*53ee8cc1Swenshuai.xi         if(RES_DMS.gDMS_MVOPShowBufferID != DMS_Invalid_ReadPointer_ID)
4306*53ee8cc1Swenshuai.xi         {
4307*53ee8cc1Swenshuai.xi             RES_DMS.gDMS_MVOPRemoveBufferID = RES_DMS.gDMS_MVOPShowBufferID;
4308*53ee8cc1Swenshuai.xi         }
4309*53ee8cc1Swenshuai.xi         RES_DMS.gDMS_MVOPShowBufferID = u16BufferID;
4310*53ee8cc1Swenshuai.xi     }
4311*53ee8cc1Swenshuai.xi #else
4312*53ee8cc1Swenshuai.xi     //if((_DMS_Is_MVOPFlow(u32Window) == TRUE) && (eAction == E_DMS_DIP_NORMAL))
4313*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window) == TRUE)
4314*53ee8cc1Swenshuai.xi     {
4315*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16BufferID].bValid = FALSE;
4316*53ee8cc1Swenshuai.xi 
4317*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_Release(u32Window,u16BufferID);
4318*53ee8cc1Swenshuai.xi     }
4319*53ee8cc1Swenshuai.xi #endif
4320*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4321*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
4322*53ee8cc1Swenshuai.xi     MApi_XC_DIP_Ena(FALSE,u8DIPWindowID);
4323*53ee8cc1Swenshuai.xi #endif
4324*53ee8cc1Swenshuai.xi     MApi_XC_DIP_ReleaseResource(u8DIPWindowID);
4325*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4326*53ee8cc1Swenshuai.xi }
4327*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Flow_PrepareNextFrame(MS_U16 u16BufferID)4328*53ee8cc1Swenshuai.xi static void _DMS_VDEC_Flow_PrepareNextFrame(MS_U16 u16BufferID)
4329*53ee8cc1Swenshuai.xi {
4330*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4331*53ee8cc1Swenshuai.xi     sync_print("prepare ID%d -> %d => ",u16BufferID,RES_DMS.gDMS_MVOPShowBufferID);
4332*53ee8cc1Swenshuai.xi     if(RES_DMS.gDMS_MVOPShowBufferID != DMS_Invalid_ReadPointer_ID)
4333*53ee8cc1Swenshuai.xi     {
4334*53ee8cc1Swenshuai.xi         RES_DMS.gDMS_MVOPRemoveBufferID = RES_DMS.gDMS_MVOPShowBufferID;
4335*53ee8cc1Swenshuai.xi     }
4336*53ee8cc1Swenshuai.xi     RES_DMS.gDMS_MVOPShowBufferID = u16BufferID;
4337*53ee8cc1Swenshuai.xi     //Process MFDEC //patch
4338*53ee8cc1Swenshuai.xi     _DMS_MVOP_MFDEC_Patch(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].stMFdecInfo.bMFDec_Enable);
4339*53ee8cc1Swenshuai.xi }
4340*53ee8cc1Swenshuai.xi 
4341*53ee8cc1Swenshuai.xi //Load Setting for next sync (to sync out of task setting and CapturePushedFrame to the same)
_DMS_SyncSettingForNextFrame(void * pInstance)4342*53ee8cc1Swenshuai.xi static void _DMS_SyncSettingForNextFrame(void* pInstance)
4343*53ee8cc1Swenshuai.xi {
4344*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4345*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
4346*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(MVOP_WINDOW))
4347*53ee8cc1Swenshuai.xi     {
4348*53ee8cc1Swenshuai.xi         //Sync XC/MVOP setting by gu8DMS_SetXC_Status
4349*53ee8cc1Swenshuai.xi         MS_U8 u8ID = RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW];
4350*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
4351*53ee8cc1Swenshuai.xi         if(gDMSDebug >= 1)
4352*53ee8cc1Swenshuai.xi         {
4353*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%d] Main loop sync when Ring ID %d, u8ID %d\n",MsOS_GetSystemTime(),RES_DMSDI._bDiNowShowRingBufID,u8ID);
4354*53ee8cc1Swenshuai.xi         }
4355*53ee8cc1Swenshuai.xi #endif
4356*53ee8cc1Swenshuai.xi         if(u8ID < DMS_Invalid_ReadPointer_ID)
4357*53ee8cc1Swenshuai.xi         {
4358*53ee8cc1Swenshuai.xi             if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE | DMS_XC_RESET_WINDOW_SIZE | DMS_XC_SEQ_CHANGE_PI | DMS_XC_FREEZE_SETTING))
4359*53ee8cc1Swenshuai.xi             {
4360*53ee8cc1Swenshuai.xi #if DBG_DMS_LOG
4361*53ee8cc1Swenshuai.xi                 if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE) && (u8ID != RES_DMS.gu8DMS_Seq_Change_ID))
4362*53ee8cc1Swenshuai.xi                 {
4363*53ee8cc1Swenshuai.xi                     DMS_PRINTF("gu8DMS_SetXC_Status & DMS_XC_SEQ_CHANGE_SIZE && (u8DIPReadytoCaptureID[MVOP_WINDOW] < gu8DMS_Seq_Change_ID)  %d %d\n",RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW], RES_DMS.gu8DMS_Seq_Change_ID);
4364*53ee8cc1Swenshuai.xi                 }
4365*53ee8cc1Swenshuai.xi #endif
4366*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
4367*53ee8cc1Swenshuai.xi                 if(gDMSDebug >= 1)
4368*53ee8cc1Swenshuai.xi                 {
4369*53ee8cc1Swenshuai.xi                     DMS_PRINTF("[%d] Sync setting for after Di case: RBID %d, FBID %d, xc_status 0x%x\n",MsOS_GetSystemTime(),RES_DMSDI._bDiNowShowRingBufID,u8ID,RES_DMS.gu8DMS_SetXC_Status[MVOP_WINDOW]);
4370*53ee8cc1Swenshuai.xi                 }
4371*53ee8cc1Swenshuai.xi #endif
4372*53ee8cc1Swenshuai.xi                 _DMS_XC_SetWindow_MVOP_SetPath(pInstance, u8ID);
4373*53ee8cc1Swenshuai.xi 
4374*53ee8cc1Swenshuai.xi                 //If VDEC to DIP path change for MVOP, Need clean all valid except u8DIPReadytoCaptureID[MVOP_WINDOW]
4375*53ee8cc1Swenshuai.xi #if DEV_PAUSE
4376*53ee8cc1Swenshuai.xi 
4377*53ee8cc1Swenshuai.xi #else
4378*53ee8cc1Swenshuai.xi                 if((RES_DMS.eDMS_PreMVOPFlowCtrl != RES_DMS.eDMS_MVOPFlowCtrl) &&
4379*53ee8cc1Swenshuai.xi                     (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_DIP))
4380*53ee8cc1Swenshuai.xi                 {
4381*53ee8cc1Swenshuai.xi                     MS_U8 i = 0;
4382*53ee8cc1Swenshuai.xi                     for(i=0;i<DMS_DIP_QUEUEDEPTH;i++)
4383*53ee8cc1Swenshuai.xi                     {
4384*53ee8cc1Swenshuai.xi                        if(i != RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW])
4385*53ee8cc1Swenshuai.xi                        {
4386*53ee8cc1Swenshuai.xi                             if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][i].bValid == TRUE)
4387*53ee8cc1Swenshuai.xi                             {
4388*53ee8cc1Swenshuai.xi                                 printf("Change source clear frame ref!! id %d\n",i);
4389*53ee8cc1Swenshuai.xi                                 _DMS_VDEC_Frame_Release(MVOP_WINDOW,i);
4390*53ee8cc1Swenshuai.xi                             }
4391*53ee8cc1Swenshuai.xi                             RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][i].bValid = FALSE;
4392*53ee8cc1Swenshuai.xi                        }
4393*53ee8cc1Swenshuai.xi                     }
4394*53ee8cc1Swenshuai.xi                 }
4395*53ee8cc1Swenshuai.xi #endif
4396*53ee8cc1Swenshuai.xi                 if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_RESET_WINDOW_SIZE))
4397*53ee8cc1Swenshuai.xi                 {
4398*53ee8cc1Swenshuai.xi                     _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_RESET_WINDOW_SIZE);
4399*53ee8cc1Swenshuai.xi                 }
4400*53ee8cc1Swenshuai.xi                 if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_PI))
4401*53ee8cc1Swenshuai.xi                 {
4402*53ee8cc1Swenshuai.xi                     _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_PI);
4403*53ee8cc1Swenshuai.xi                 }
4404*53ee8cc1Swenshuai.xi                 if((_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE_SETTING)) && (FALSE == _DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE)))
4405*53ee8cc1Swenshuai.xi                 {
4406*53ee8cc1Swenshuai.xi                     _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE_SETTING);
4407*53ee8cc1Swenshuai.xi                 }
4408*53ee8cc1Swenshuai.xi                 if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE))
4409*53ee8cc1Swenshuai.xi                 {
4410*53ee8cc1Swenshuai.xi                     _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE);
4411*53ee8cc1Swenshuai.xi                 }
4412*53ee8cc1Swenshuai.xi             }
4413*53ee8cc1Swenshuai.xi         }
4414*53ee8cc1Swenshuai.xi         else if(DEV_PAUSE)
4415*53ee8cc1Swenshuai.xi         {
4416*53ee8cc1Swenshuai.xi             if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_RESET_WINDOW_SIZE) && (_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_SEQ_CHANGE_SIZE) == FALSE)
4417*53ee8cc1Swenshuai.xi                 && (_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FIRST_TIME_SETWINDOW) == FALSE))
4418*53ee8cc1Swenshuai.xi             {
4419*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[1;35m###[River][%s][%d]### pause reset window case\033[0m\n",__FUNCTION__,__LINE__);
4420*53ee8cc1Swenshuai.xi                 if(_DMS_XC_SetWindow_MVOP_SetPath(pInstance, RES_DMS.gDMS_MVOPShowBufferID))
4421*53ee8cc1Swenshuai.xi                 {
4422*53ee8cc1Swenshuai.xi                     _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_RESET_WINDOW_SIZE);
4423*53ee8cc1Swenshuai.xi                     RES_DMS._bForceSwitchBufferFlag = TRUE;
4424*53ee8cc1Swenshuai.xi                 }
4425*53ee8cc1Swenshuai.xi             }
4426*53ee8cc1Swenshuai.xi         }
4427*53ee8cc1Swenshuai.xi     }
4428*53ee8cc1Swenshuai.xi #endif  // #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
4429*53ee8cc1Swenshuai.xi     }
4430*53ee8cc1Swenshuai.xi 
4431*53ee8cc1Swenshuai.xi #define PREPARE_FRAME_CHECK_COUNT 2
4432*53ee8cc1Swenshuai.xi #define DOUBLE_CHECK_LATENCY 2
_DMS_PrepareNextFrame(void * pInstance)4433*53ee8cc1Swenshuai.xi static void _DMS_PrepareNextFrame(void* pInstance)
4434*53ee8cc1Swenshuai.xi {
4435*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4436*53ee8cc1Swenshuai.xi     MS_U8 u8CheckCount = 0;
4437*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
4438*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = DMS_Invalid_ReadPointer_ID;
4439*53ee8cc1Swenshuai.xi     MS_U8 u8Flag = FALSE;
4440*53ee8cc1Swenshuai.xi     MS_U8 u8Idx = 0;
4441*53ee8cc1Swenshuai.xi     MS_BOOL bInOrder = TRUE;
4442*53ee8cc1Swenshuai.xi     MS_U8 WindowZOrder_Local[DMS_MAX_WINDOW_NUM];
4443*53ee8cc1Swenshuai.xi     MS_BOOL bWindowAlreadyUpdated[DMS_MAX_WINDOW_NUM];
4444*53ee8cc1Swenshuai.xi     MS_BOOL bWindowReadyToDisp[DMS_MAX_WINDOW_NUM];
4445*53ee8cc1Swenshuai.xi 
4446*53ee8cc1Swenshuai.xi     for(u8Idx=0; u8Idx < DMS_MAX_WINDOW_NUM; u8Idx++)
4447*53ee8cc1Swenshuai.xi     {
4448*53ee8cc1Swenshuai.xi         WindowZOrder_Local[u8Idx] = RES_DMS.WindowZOrder[u8Idx];
4449*53ee8cc1Swenshuai.xi         bWindowReadyToDisp[u8Idx] = FALSE;
4450*53ee8cc1Swenshuai.xi         bWindowAlreadyUpdated[u8Idx] = FALSE;
4451*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 0)
4452*53ee8cc1Swenshuai.xi         if(u8Idx == MVOP_WINDOW)
4453*53ee8cc1Swenshuai.xi               bWindowAlreadyUpdated[u8Idx] = TRUE;
4454*53ee8cc1Swenshuai.xi #endif
4455*53ee8cc1Swenshuai.xi     }
4456*53ee8cc1Swenshuai.xi 
4457*53ee8cc1Swenshuai.xi     for(u8CheckCount = 0; u8CheckCount < PREPARE_FRAME_CHECK_COUNT; u8CheckCount++)
4458*53ee8cc1Swenshuai.xi     {
4459*53ee8cc1Swenshuai.xi         if(u8CheckCount == 0)
4460*53ee8cc1Swenshuai.xi         {
4461*53ee8cc1Swenshuai.xi #if DEV_DI
4462*53ee8cc1Swenshuai.xi             if(DEV_NEW_NEXT == 0 && RES_DMS.bDMS_MVOPFlowFromDi)
4463*53ee8cc1Swenshuai.xi             {
4464*53ee8cc1Swenshuai.xi                 MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4465*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(10);
4466*53ee8cc1Swenshuai.xi                 MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4467*53ee8cc1Swenshuai.xi             }
4468*53ee8cc1Swenshuai.xi #endif
4469*53ee8cc1Swenshuai.xi             for(u8WindowID=0; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
4470*53ee8cc1Swenshuai.xi             {
4471*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
4472*53ee8cc1Swenshuai.xi                 if(u8WindowID != MVOP_WINDOW)
4473*53ee8cc1Swenshuai.xi #endif
4474*53ee8cc1Swenshuai.xi                 _DMS_GetNextInfo(u8WindowID, TRUE);
4475*53ee8cc1Swenshuai.xi             }
4476*53ee8cc1Swenshuai.xi             //Sync setting to next frame
4477*53ee8cc1Swenshuai.xi             if(DEV_NEW_NEXT == 1)
4478*53ee8cc1Swenshuai.xi             {
4479*53ee8cc1Swenshuai.xi                 _DMS_SyncSettingForNextFrame(pInstance);
4480*53ee8cc1Swenshuai.xi             }
4481*53ee8cc1Swenshuai.xi             else if(RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW] < DMS_Invalid_ReadPointer_ID)
4482*53ee8cc1Swenshuai.xi             {
4483*53ee8cc1Swenshuai.xi                 _DMS_SyncSettingForNextFrame(pInstance);
4484*53ee8cc1Swenshuai.xi                 u8Flag = TRUE;
4485*53ee8cc1Swenshuai.xi             }
4486*53ee8cc1Swenshuai.xi         }
4487*53ee8cc1Swenshuai.xi         else
4488*53ee8cc1Swenshuai.xi         {
4489*53ee8cc1Swenshuai.xi             //To use get next info twice, MVOP case need a delay
4490*53ee8cc1Swenshuai.xi             //For example: Only Main window case, if first getnextinfo do not set u8DIPReadytoCaptureID by timing issue
4491*53ee8cc1Swenshuai.xi             //must delay little time to getnextinfo twice
4492*53ee8cc1Swenshuai.xi             for(u8WindowID=0; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
4493*53ee8cc1Swenshuai.xi             {
4494*53ee8cc1Swenshuai.xi                 if(DEV_NEW_NEXT)
4495*53ee8cc1Swenshuai.xi                 {
4496*53ee8cc1Swenshuai.xi                     continue;
4497*53ee8cc1Swenshuai.xi                 }
4498*53ee8cc1Swenshuai.xi 
4499*53ee8cc1Swenshuai.xi                 if((_DMS_IsWindowUsed(u8WindowID) == TRUE) && (bWindowAlreadyUpdated[u8WindowID] == FALSE))
4500*53ee8cc1Swenshuai.xi                 {
4501*53ee8cc1Swenshuai.xi                     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4502*53ee8cc1Swenshuai.xi                     //DMS_PRINTF("MVOP window 2nd _DMS_GetNextInfo, delay 2ms\n");
4503*53ee8cc1Swenshuai.xi                     MsOS_DelayTask(DOUBLE_CHECK_LATENCY);
4504*53ee8cc1Swenshuai.xi                     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4505*53ee8cc1Swenshuai.xi                     break;
4506*53ee8cc1Swenshuai.xi                 }
4507*53ee8cc1Swenshuai.xi             }
4508*53ee8cc1Swenshuai.xi 
4509*53ee8cc1Swenshuai.xi             for(u8WindowID=0; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
4510*53ee8cc1Swenshuai.xi             {
4511*53ee8cc1Swenshuai.xi                 if(bWindowReadyToDisp[u8WindowID] == FALSE)
4512*53ee8cc1Swenshuai.xi                 {
4513*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
4514*53ee8cc1Swenshuai.xi                     if(u8WindowID != MVOP_WINDOW)
4515*53ee8cc1Swenshuai.xi #endif
4516*53ee8cc1Swenshuai.xi                     _DMS_GetNextInfo(u8WindowID, FALSE);
4517*53ee8cc1Swenshuai.xi                 }
4518*53ee8cc1Swenshuai.xi             }
4519*53ee8cc1Swenshuai.xi 
4520*53ee8cc1Swenshuai.xi             //Sync setting to next frame
4521*53ee8cc1Swenshuai.xi             if(u8Flag == FALSE)
4522*53ee8cc1Swenshuai.xi             {
4523*53ee8cc1Swenshuai.xi                 _DMS_SyncSettingForNextFrame(pInstance);
4524*53ee8cc1Swenshuai.xi             }
4525*53ee8cc1Swenshuai.xi         }
4526*53ee8cc1Swenshuai.xi 
4527*53ee8cc1Swenshuai.xi         for(u8Idx=0; u8Idx < DMS_MAX_WINDOW_NUM; u8Idx++)
4528*53ee8cc1Swenshuai.xi         {
4529*53ee8cc1Swenshuai.xi             u8WindowID = WindowZOrder_Local[u8Idx];
4530*53ee8cc1Swenshuai.xi             u8BufferID = RES_DMS.u8DIPReadytoCaptureID[u8WindowID];
4531*53ee8cc1Swenshuai.xi             SKIP_DMS_MAIN_WINDOW_FLOW(u8WindowID);
4532*53ee8cc1Swenshuai.xi 
4533*53ee8cc1Swenshuai.xi             if(DEV_NEW_NEXT)
4534*53ee8cc1Swenshuai.xi             {
4535*53ee8cc1Swenshuai.xi                 bWindowReadyToDisp[u8WindowID] = TRUE;
4536*53ee8cc1Swenshuai.xi             }
4537*53ee8cc1Swenshuai.xi 
4538*53ee8cc1Swenshuai.xi             if(bWindowAlreadyUpdated[u8WindowID] == FALSE)
4539*53ee8cc1Swenshuai.xi             {
4540*53ee8cc1Swenshuai.xi                 if(_DMS_IsCaptureWindowEnable(u8WindowID))
4541*53ee8cc1Swenshuai.xi                 {
4542*53ee8cc1Swenshuai.xi                     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].u32Visible == FALSE)
4543*53ee8cc1Swenshuai.xi                     {
4544*53ee8cc1Swenshuai.xi                         continue;
4545*53ee8cc1Swenshuai.xi                     }
4546*53ee8cc1Swenshuai.xi                 }
4547*53ee8cc1Swenshuai.xi 
4548*53ee8cc1Swenshuai.xi                 if(u8BufferID < DMS_Invalid_ReadPointer_ID)
4549*53ee8cc1Swenshuai.xi                 {
4550*53ee8cc1Swenshuai.xi                     bWindowReadyToDisp[u8WindowID] = TRUE;
4551*53ee8cc1Swenshuai.xi                     if(_DMS_Is_MVOPFlow(u8WindowID) == TRUE || bInOrder == TRUE)
4552*53ee8cc1Swenshuai.xi                     {
4553*53ee8cc1Swenshuai.xi                         bWindowAlreadyUpdated[u8WindowID] = TRUE;
4554*53ee8cc1Swenshuai.xi                     }
4555*53ee8cc1Swenshuai.xi 
4556*53ee8cc1Swenshuai.xi                     if(_DMS_Is_MVOPFlow(u8WindowID) && _DMS_Query_XC_Status(u8WindowID, DMS_XC_FREEZE))
4557*53ee8cc1Swenshuai.xi                     {
4558*53ee8cc1Swenshuai.xi                         if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_FREEZE_SETTING))
4559*53ee8cc1Swenshuai.xi                         {
4560*53ee8cc1Swenshuai.xi                             _DMS_Remove_XC_Status(u8WindowID, DMS_XC_FREEZE_SETTING);
4561*53ee8cc1Swenshuai.xi                             _DMS_DIP_Flow_PrepareNextFrame(pInstance,E_DMS_DIP_NORMAL,u8WindowID,u8BufferID);
4562*53ee8cc1Swenshuai.xi                             DMS_PRINTF("Freeze By DIP capture!!!!!!!!!!!!!!!!!!!!!!\n");
4563*53ee8cc1Swenshuai.xi                         }
4564*53ee8cc1Swenshuai.xi                     }
4565*53ee8cc1Swenshuai.xi                     else
4566*53ee8cc1Swenshuai.xi                     {
4567*53ee8cc1Swenshuai.xi                         if(_DMS_Is_MVOPFlow(u8WindowID))
4568*53ee8cc1Swenshuai.xi                         {
4569*53ee8cc1Swenshuai.xi                             if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
4570*53ee8cc1Swenshuai.xi                             {
4571*53ee8cc1Swenshuai.xi                                 _DMS_VDEC_Flow_PrepareNextFrame(u8BufferID);
4572*53ee8cc1Swenshuai.xi                             }
4573*53ee8cc1Swenshuai.xi                             else if((RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][u8BufferID].bIsAfterDiTask == FALSE)
4574*53ee8cc1Swenshuai.xi                                 && (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_DIP))
4575*53ee8cc1Swenshuai.xi                             {
4576*53ee8cc1Swenshuai.xi                                 _DMS_DIP_Flow_PrepareNextFrame(pInstance,E_DMS_DIP_NORMAL,u8WindowID,u8BufferID);
4577*53ee8cc1Swenshuai.xi                             }
4578*53ee8cc1Swenshuai.xi                         }
4579*53ee8cc1Swenshuai.xi                         else
4580*53ee8cc1Swenshuai.xi                         {
4581*53ee8cc1Swenshuai.xi                             //First frame has been pushed since zorder or window was adjusted
4582*53ee8cc1Swenshuai.xi                             if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_UPDATE_FROM_VDEC))
4583*53ee8cc1Swenshuai.xi                             {
4584*53ee8cc1Swenshuai.xi                                 _DMS_Add_XC_Status(u8WindowID,  DMS_XC_FIRST_FRAME_FROM_VDEC);
4585*53ee8cc1Swenshuai.xi                             }
4586*53ee8cc1Swenshuai.xi 
4587*53ee8cc1Swenshuai.xi                             if(RES_DMS.bIsWindowMute[u8WindowID] == FALSE)
4588*53ee8cc1Swenshuai.xi                             {
4589*53ee8cc1Swenshuai.xi                                 if(u8CheckCount == 0)
4590*53ee8cc1Swenshuai.xi                                 {
4591*53ee8cc1Swenshuai.xi                                     if(bInOrder == TRUE)
4592*53ee8cc1Swenshuai.xi                                     {
4593*53ee8cc1Swenshuai.xi                                         _DMS_DIP_Flow_PrepareNextFrame(pInstance,E_DMS_DIP_NORMAL,u8WindowID,u8BufferID);
4594*53ee8cc1Swenshuai.xi                                     }
4595*53ee8cc1Swenshuai.xi                                 }
4596*53ee8cc1Swenshuai.xi                                 else
4597*53ee8cc1Swenshuai.xi                                 {
4598*53ee8cc1Swenshuai.xi                                     _DMS_DIP_Flow_PrepareNextFrame(pInstance,E_DMS_DIP_NORMAL,u8WindowID,u8BufferID);
4599*53ee8cc1Swenshuai.xi                                 }
4600*53ee8cc1Swenshuai.xi                             }
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi                         }
4603*53ee8cc1Swenshuai.xi                     }
4604*53ee8cc1Swenshuai.xi                 }
4605*53ee8cc1Swenshuai.xi                 else if(u8BufferID == DMS_Invalid_ReadPointer_ID)
4606*53ee8cc1Swenshuai.xi                 {
4607*53ee8cc1Swenshuai.xi                     if(DEV_NEW_NEXT)
4608*53ee8cc1Swenshuai.xi                     {
4609*53ee8cc1Swenshuai.xi                         if(RES_DMS.bIsWindowMute[u8WindowID] == FALSE)
4610*53ee8cc1Swenshuai.xi                         {
4611*53ee8cc1Swenshuai.xi                             //case: bNeedUpdateFromVDEC == FALSE
4612*53ee8cc1Swenshuai.xi                             if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_UPDATE_FROM_VDEC) == FALSE)
4613*53ee8cc1Swenshuai.xi                             {
4614*53ee8cc1Swenshuai.xi                                 if(_DMS_IsWindowUsed(u8WindowID) == TRUE)
4615*53ee8cc1Swenshuai.xi                                 {
4616*53ee8cc1Swenshuai.xi                                     if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_FIRST_FRAME_FROM_VDEC))
4617*53ee8cc1Swenshuai.xi                                     {
4618*53ee8cc1Swenshuai.xi                                         _DMS_GERendering(pInstance, u8WindowID);
4619*53ee8cc1Swenshuai.xi                                     }
4620*53ee8cc1Swenshuai.xi                                 }
4621*53ee8cc1Swenshuai.xi                             }
4622*53ee8cc1Swenshuai.xi                         }
4623*53ee8cc1Swenshuai.xi                     }
4624*53ee8cc1Swenshuai.xi                     else
4625*53ee8cc1Swenshuai.xi                     {
4626*53ee8cc1Swenshuai.xi                         if(_DMS_Is_MVOPFlow(u8WindowID) == FALSE)
4627*53ee8cc1Swenshuai.xi                         {
4628*53ee8cc1Swenshuai.xi                             if(u8CheckCount == 0)
4629*53ee8cc1Swenshuai.xi                             {
4630*53ee8cc1Swenshuai.xi                                 bInOrder = FALSE;
4631*53ee8cc1Swenshuai.xi                             }
4632*53ee8cc1Swenshuai.xi                             else
4633*53ee8cc1Swenshuai.xi                             {
4634*53ee8cc1Swenshuai.xi                                 if(RES_DMS.bIsWindowMute[u8WindowID] == FALSE)
4635*53ee8cc1Swenshuai.xi                                 {
4636*53ee8cc1Swenshuai.xi                                     //case: bNeedUpdateFromVDEC == FALSE
4637*53ee8cc1Swenshuai.xi                                     if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_UPDATE_FROM_VDEC) == FALSE)
4638*53ee8cc1Swenshuai.xi                                     {
4639*53ee8cc1Swenshuai.xi                                         if(_DMS_IsWindowUsed(u8WindowID) == TRUE)
4640*53ee8cc1Swenshuai.xi                                         {
4641*53ee8cc1Swenshuai.xi                                             if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_FIRST_FRAME_FROM_VDEC))
4642*53ee8cc1Swenshuai.xi                                             {
4643*53ee8cc1Swenshuai.xi                                                 _DMS_GERendering(pInstance, u8WindowID);
4644*53ee8cc1Swenshuai.xi                                             }
4645*53ee8cc1Swenshuai.xi                                         }
4646*53ee8cc1Swenshuai.xi                                     }
4647*53ee8cc1Swenshuai.xi                                 }
4648*53ee8cc1Swenshuai.xi                             }
4649*53ee8cc1Swenshuai.xi                         }
4650*53ee8cc1Swenshuai.xi #if DEV_PAUSE
4651*53ee8cc1Swenshuai.xi                         else if(_DMS_Is_MVOPFlow(u8WindowID) && RES_DMS._bForceSwitchBufferFlag == TRUE)
4652*53ee8cc1Swenshuai.xi                         {
4653*53ee8cc1Swenshuai.xi                             u8BufferID = RES_DMS.gDMS_MVOPShowBufferID;
4654*53ee8cc1Swenshuai.xi                             //pause case
4655*53ee8cc1Swenshuai.xi                             MS_U8 u8WorkID = DMS_Invalid_ReadPointer_ID;
4656*53ee8cc1Swenshuai.xi                             if(u8BufferID != DMS_Invalid_ReadPointer_ID)
4657*53ee8cc1Swenshuai.xi                             {
4658*53ee8cc1Swenshuai.xi                                 bWindowAlreadyUpdated[u8WindowID] = TRUE;
4659*53ee8cc1Swenshuai.xi                                 if((RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_DIP))
4660*53ee8cc1Swenshuai.xi                                 {
4661*53ee8cc1Swenshuai.xi                                     DMS_PRINTF("\033[1;35m###[River][%s][%d]### DIP pause reset window case %d\033[0m\n",__FUNCTION__,__LINE__,u8WorkID);
4662*53ee8cc1Swenshuai.xi                                     _DMS_DIP_Flow_PrepareNextFrame(pInstance,E_DMS_DIP_NORMAL,u8WindowID,u8BufferID);
4663*53ee8cc1Swenshuai.xi                                 }
4664*53ee8cc1Swenshuai.xi                                 else if((RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC))
4665*53ee8cc1Swenshuai.xi                                 {
4666*53ee8cc1Swenshuai.xi                                     DMS_PRINTF("\033[1;35m###[River][%s][%d]### VDEC pause reset window case, ID %d\033[0m\n",__FUNCTION__,__LINE__,RES_DMS.gDMS_MVOPShowBufferID);
4667*53ee8cc1Swenshuai.xi                                     _DMS_VDEC_Flow_PrepareNextFrame(u8BufferID);
4668*53ee8cc1Swenshuai.xi                                 }
4669*53ee8cc1Swenshuai.xi                             }
4670*53ee8cc1Swenshuai.xi                             else
4671*53ee8cc1Swenshuai.xi                             {
4672*53ee8cc1Swenshuai.xi                                 RES_DMS._bForceSwitchBufferFlag = FALSE;
4673*53ee8cc1Swenshuai.xi                                 DMS_PRINTF("\033[1;35m###[River][%s][%d]### pause reset window case, work ID %d error\033[0m\n",__FUNCTION__,__LINE__,u8BufferID);
4674*53ee8cc1Swenshuai.xi                             }
4675*53ee8cc1Swenshuai.xi                         }
4676*53ee8cc1Swenshuai.xi #endif
4677*53ee8cc1Swenshuai.xi                     }
4678*53ee8cc1Swenshuai.xi                 }
4679*53ee8cc1Swenshuai.xi             }
4680*53ee8cc1Swenshuai.xi         }
4681*53ee8cc1Swenshuai.xi     }
4682*53ee8cc1Swenshuai.xi 
4683*53ee8cc1Swenshuai.xi     //DIP case only
4684*53ee8cc1Swenshuai.xi     for(u8WindowID=1; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
4685*53ee8cc1Swenshuai.xi     {
4686*53ee8cc1Swenshuai.xi         if(_DMS_Query_XC_Status(u8WindowID, DMS_XC_FIRST_FRAME_FROM_VDEC) && _DMS_Query_XC_Status(u8WindowID, DMS_XC_UPDATE_FROM_VDEC))
4687*53ee8cc1Swenshuai.xi         {
4688*53ee8cc1Swenshuai.xi             _DMS_Remove_XC_Status(u8WindowID, DMS_XC_UPDATE_FROM_VDEC);
4689*53ee8cc1Swenshuai.xi         }
4690*53ee8cc1Swenshuai.xi     }
4691*53ee8cc1Swenshuai.xi     nrp_sync_print(" End\n");
4692*53ee8cc1Swenshuai.xi }
4693*53ee8cc1Swenshuai.xi 
4694*53ee8cc1Swenshuai.xi //Switch GOP Read Buffer
_DMS_SwitchGOPBuffer(void * pInstance)4695*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SwitchGOPBuffer(void* pInstance)
4696*53ee8cc1Swenshuai.xi {
4697*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4698*53ee8cc1Swenshuai.xi     GOP_GwinInfo stGWin;
4699*53ee8cc1Swenshuai.xi     if (_IsGwinAvailable() == FALSE)
4700*53ee8cc1Swenshuai.xi     {
4701*53ee8cc1Swenshuai.xi         return FALSE;
4702*53ee8cc1Swenshuai.xi     }
4703*53ee8cc1Swenshuai.xi     MApi_GOP_GWIN_GetWinInfo(RES_DMS.u8GOPGWinNum, &stGWin);
4704*53ee8cc1Swenshuai.xi     MApi_GOP_GWIN_UpdateRegOnceEx2(GOP_NUM,TRUE,FALSE);
4705*53ee8cc1Swenshuai.xi     //MApi_GOP_GWIN_UpdateRegOnce(TRUE);
4706*53ee8cc1Swenshuai.xi     stGWin.u32DRAMRBlkStart = _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_GOP, _DMS_DIP_GetBackgroundBufID(pInstance));
4707*53ee8cc1Swenshuai.xi     MApi_GOP_GWIN_SetWinInfo(RES_DMS.u8GOPGWinNum, &stGWin);
4708*53ee8cc1Swenshuai.xi     MApi_GOP_GWIN_Enable(RES_DMS.u8GOPGWinNum, TRUE);//enable GWIN
4709*53ee8cc1Swenshuai.xi     //MApi_GOP_GWIN_UpdateRegOnce(FALSE);
4710*53ee8cc1Swenshuai.xi     MApi_GOP_GWIN_UpdateRegOnceEx2(GOP_NUM,FALSE,FALSE);
4711*53ee8cc1Swenshuai.xi #if DBG_FPS
4712*53ee8cc1Swenshuai.xi     u32FPS_Switch_Counter[1]++;
4713*53ee8cc1Swenshuai.xi #endif
4714*53ee8cc1Swenshuai.xi     RES_DMS.bDIPWriteFirstAddr = !RES_DMS.bDIPWriteFirstAddr;
4715*53ee8cc1Swenshuai.xi 
4716*53ee8cc1Swenshuai.xi     return TRUE;
4717*53ee8cc1Swenshuai.xi }
4718*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_SwitchMVOPBufferByDIP(void * pInstance)4719*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SwitchMVOPBufferByDIP(void* pInstance)
4720*53ee8cc1Swenshuai.xi {
4721*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4722*53ee8cc1Swenshuai.xi     if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE))
4723*53ee8cc1Swenshuai.xi     {
4724*53ee8cc1Swenshuai.xi         MS_PHY phyDIPoutAddr = RES_DMS.u32MVOPFreezeAddress_pa;
4725*53ee8cc1Swenshuai.xi         HAL_DMS_XC_DSSetMVOPAddr(pInstance, phyDIPoutAddr,phyDIPoutAddr,TRUE);
4726*53ee8cc1Swenshuai.xi         HAL_DMS_XC_DSFire(pInstance);
4727*53ee8cc1Swenshuai.xi         return TRUE;
4728*53ee8cc1Swenshuai.xi     }
4729*53ee8cc1Swenshuai.xi     else
4730*53ee8cc1Swenshuai.xi     {
4731*53ee8cc1Swenshuai.xi         MS_PHY phyDIPoutAddr = 0;
4732*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
4733*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].bIsAfterDiTask == TRUE)
4734*53ee8cc1Swenshuai.xi         {
4735*53ee8cc1Swenshuai.xi             if(RES_DMSDI._bDiReleaseShowRingBufID != INVALID_DI_RING_BUFFER_ID)
4736*53ee8cc1Swenshuai.xi             {
4737*53ee8cc1Swenshuai.xi                 RES_DMSDI._bDiReleaseShowRingBufID = INVALID_DI_RING_BUFFER_ID;
4738*53ee8cc1Swenshuai.xi             }
4739*53ee8cc1Swenshuai.xi             MS_U8 u8DiRingBufID = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].u8DiOutputRingBufferID;
4740*53ee8cc1Swenshuai.xi             phyDIPoutAddr = _GetDIRingBufferAddr(MVOP_WINDOW,u8DiRingBufID);
4741*53ee8cc1Swenshuai.xi             tempAddr = phyDIPoutAddr;
4742*53ee8cc1Swenshuai.xi             di_sync_print("\033[1;34mBF R %d: 0x%x, 0x%llx , MainQ %d reading\033[0m\n",MsOS_GetSystemTime(),RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].u32PriData,phyDIPoutAddr,RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]);
4743*53ee8cc1Swenshuai.xi             if(RES_DMSDI._bDiNowShowRingBufID == INVALID_DI_RING_BUFFER_ID)
4744*53ee8cc1Swenshuai.xi             {
4745*53ee8cc1Swenshuai.xi                 RES_DMSDI._bDiNowShowRingBufID = u8DiRingBufID;
4746*53ee8cc1Swenshuai.xi             }
4747*53ee8cc1Swenshuai.xi             else
4748*53ee8cc1Swenshuai.xi             {
4749*53ee8cc1Swenshuai.xi                 if(RES_DMSDI._bDiNowShowRingBufID != u8DiRingBufID)
4750*53ee8cc1Swenshuai.xi                 {
4751*53ee8cc1Swenshuai.xi                     if(gDMSDebug >= 2)
4752*53ee8cc1Swenshuai.xi                     {
4753*53ee8cc1Swenshuai.xi                         DMS_PRINTF("[%d] switch Ring ID from %d to %d => ",MsOS_GetSystemTime(),RES_DMSDI._bDiNowShowRingBufID,u8DiRingBufID);
4754*53ee8cc1Swenshuai.xi                     }
4755*53ee8cc1Swenshuai.xi 
4756*53ee8cc1Swenshuai.xi                     RES_DMSDI._bDiReleaseShowRingBufID = RES_DMSDI._bDiNowShowRingBufID;
4757*53ee8cc1Swenshuai.xi                     //printf("\033[1;32m[%d] Free  Ring Buffer %d\033[0m\n",MsOS_GetSystemTime(),RES_DMSDI._bDiReleaseShowRingBufID);
4758*53ee8cc1Swenshuai.xi                     RES_DMSDI._bDiNowShowRingBufID = u8DiRingBufID;
4759*53ee8cc1Swenshuai.xi                 }
4760*53ee8cc1Swenshuai.xi             }
4761*53ee8cc1Swenshuai.xi             if(gDMSDebug >= 2)
4762*53ee8cc1Swenshuai.xi             {
4763*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%d] now show after set DS table %d\n",MsOS_GetSystemTime(),RES_DMSDI._bDiNowShowRingBufID);
4764*53ee8cc1Swenshuai.xi             }
4765*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].bValid = FALSE;
4766*53ee8cc1Swenshuai.xi         }
4767*53ee8cc1Swenshuai.xi         else
4768*53ee8cc1Swenshuai.xi #endif
4769*53ee8cc1Swenshuai.xi         {
4770*53ee8cc1Swenshuai.xi             phyDIPoutAddr = _DMS_DIP_GetDispBufferAddress(pInstance, E_DMS_DIP_CLIENT_MVOP, (RES_DMS.bDIPMVOPWriteFirstAddr)? E_DMS_DIP_MULTIVIEW_BUF_ID_0 : E_DMS_DIP_MULTIVIEW_BUF_ID_1);
4771*53ee8cc1Swenshuai.xi         }
4772*53ee8cc1Swenshuai.xi 
4773*53ee8cc1Swenshuai.xi         if(gDMSMVOPForceLookVDEC)
4774*53ee8cc1Swenshuai.xi         {
4775*53ee8cc1Swenshuai.xi             MS_PHY phyAddr0 = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].u32SrcLumaAddr;
4776*53ee8cc1Swenshuai.xi             MS_PHY phyAddr1 = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].u32SrcChromaAddr;
4777*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSSetMVOPAddr(pInstance, phyAddr0, phyAddr1,FALSE);
4778*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSFire(pInstance);
4779*53ee8cc1Swenshuai.xi         }
4780*53ee8cc1Swenshuai.xi         else
4781*53ee8cc1Swenshuai.xi         {
4782*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSSetMVOPAddr(pInstance, phyDIPoutAddr,phyDIPoutAddr,TRUE);
4783*53ee8cc1Swenshuai.xi             HAL_DMS_XC_DSFire(pInstance);
4784*53ee8cc1Swenshuai.xi         }
4785*53ee8cc1Swenshuai.xi 
4786*53ee8cc1Swenshuai.xi #if DBG_FPS
4787*53ee8cc1Swenshuai.xi         static MS_U8 u8DIP_FPSID = 0xFF;
4788*53ee8cc1Swenshuai.xi         if(u8DIP_FPSID != RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW])
4789*53ee8cc1Swenshuai.xi         {
4790*53ee8cc1Swenshuai.xi             u32FPS_Switch_Counter[0]++;
4791*53ee8cc1Swenshuai.xi         }
4792*53ee8cc1Swenshuai.xi         u8DIP_FPSID = RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW];
4793*53ee8cc1Swenshuai.xi #endif
4794*53ee8cc1Swenshuai.xi 
4795*53ee8cc1Swenshuai.xi #if DEV_PAUSE
4796*53ee8cc1Swenshuai.xi         if((RES_DMS.gDMS_MVOPRemoveBufferID != DMS_Invalid_ReadPointer_ID) && (RES_DMS.gDMS_MVOPRemoveBufferID != RES_DMS.gDMS_MVOPShowBufferID))
4797*53ee8cc1Swenshuai.xi         {
4798*53ee8cc1Swenshuai.xi             RES_DMS.bMVOPMarkRemoveBuffer = TRUE;
4799*53ee8cc1Swenshuai.xi         }
4800*53ee8cc1Swenshuai.xi #endif
4801*53ee8cc1Swenshuai.xi 
4802*53ee8cc1Swenshuai.xi         RES_DMS.bDIPMVOPWriteFirstAddr = !RES_DMS.bDIPMVOPWriteFirstAddr;
4803*53ee8cc1Swenshuai.xi 
4804*53ee8cc1Swenshuai.xi         return TRUE;
4805*53ee8cc1Swenshuai.xi     }
4806*53ee8cc1Swenshuai.xi }
4807*53ee8cc1Swenshuai.xi #endif
4808*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
_DMS_SwitchMVOPBufferByVDEC(void * pInstance)4809*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SwitchMVOPBufferByVDEC(void* pInstance)
4810*53ee8cc1Swenshuai.xi {
4811*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4812*53ee8cc1Swenshuai.xi     //DMS_PRINTF(" setNexttoNow ");
4813*53ee8cc1Swenshuai.xi     if(RES_DMS.gDMS_ScalingCondition & USE_2ND_BUFFER)
4814*53ee8cc1Swenshuai.xi     {
4815*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].u32SrcLumaAddr = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].phySrc2ndBufferLumaAddr;
4816*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].u32SrcChromaAddr = RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].phySrc2ndBufferChromaAddr;
4817*53ee8cc1Swenshuai.xi     }
4818*53ee8cc1Swenshuai.xi 
4819*53ee8cc1Swenshuai.xi     HAL_DMS_XC_DSSetMVOPAddr(pInstance, RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].u32SrcLumaAddr,RES_DMS._stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.gDMS_MVOPShowBufferID].u32SrcChromaAddr,FALSE);
4820*53ee8cc1Swenshuai.xi     HAL_DMS_XC_DSFire(pInstance);
4821*53ee8cc1Swenshuai.xi 
4822*53ee8cc1Swenshuai.xi #if DBG_FPS
4823*53ee8cc1Swenshuai.xi     static MS_U8 u8VDEC_FPSID = 0xFF;
4824*53ee8cc1Swenshuai.xi     if(u8VDEC_FPSID != RES_DMS.gDMS_MVOPShowBufferID)
4825*53ee8cc1Swenshuai.xi     {
4826*53ee8cc1Swenshuai.xi         u32FPS_Switch_Counter[0]++;
4827*53ee8cc1Swenshuai.xi     }
4828*53ee8cc1Swenshuai.xi     u8VDEC_FPSID = RES_DMS.gDMS_MVOPShowBufferID;
4829*53ee8cc1Swenshuai.xi #endif
4830*53ee8cc1Swenshuai.xi     sync_print("set show ID%d, rm %d => ",RES_DMS.gDMS_MVOPShowBufferID, RES_DMS.gDMS_MVOPRemoveBufferID);
4831*53ee8cc1Swenshuai.xi 
4832*53ee8cc1Swenshuai.xi     //After Switch buffer, now we can remove raw buffer(set to valid false)
4833*53ee8cc1Swenshuai.xi     //Mark remove only, do valid = FALSE in next vsync start to avoid MVOP double buffer timing issue
4834*53ee8cc1Swenshuai.xi     if((RES_DMS.gDMS_MVOPRemoveBufferID != DMS_Invalid_ReadPointer_ID) && (RES_DMS.gDMS_MVOPRemoveBufferID != RES_DMS.gDMS_MVOPShowBufferID))
4835*53ee8cc1Swenshuai.xi     {
4836*53ee8cc1Swenshuai.xi         RES_DMS.bMVOPMarkRemoveBuffer = TRUE;
4837*53ee8cc1Swenshuai.xi     }
4838*53ee8cc1Swenshuai.xi     return TRUE;
4839*53ee8cc1Swenshuai.xi }
4840*53ee8cc1Swenshuai.xi #endif
_DMS_SwitchBuffer(void * pInstance)4841*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_SwitchBuffer(void* pInstance)
4842*53ee8cc1Swenshuai.xi {
4843*53ee8cc1Swenshuai.xi     //Need Switch MVOP first
4844*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4845*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
4846*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(MVOP_WINDOW))
4847*53ee8cc1Swenshuai.xi     {
4848*53ee8cc1Swenshuai.xi         MS_BOOL bRet = FALSE;
4849*53ee8cc1Swenshuai.xi         if(RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW] < DMS_Invalid_ReadPointer_ID || (TRUE == RES_DMS._bForceSwitchBufferFlag))
4850*53ee8cc1Swenshuai.xi         {
4851*53ee8cc1Swenshuai.xi             if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FREEZE) || (RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_DIP))
4852*53ee8cc1Swenshuai.xi             {
4853*53ee8cc1Swenshuai.xi                 bRet = _DMS_SwitchMVOPBufferByDIP(pInstance);
4854*53ee8cc1Swenshuai.xi             }
4855*53ee8cc1Swenshuai.xi             else if(RES_DMS.eDMS_MVOPFlowCtrl == E_DMS_MVOP_FLOW_FROM_VDEC)
4856*53ee8cc1Swenshuai.xi             {
4857*53ee8cc1Swenshuai.xi                 bRet = _DMS_SwitchMVOPBufferByVDEC(pInstance);
4858*53ee8cc1Swenshuai.xi             }
4859*53ee8cc1Swenshuai.xi             RES_DMS._bForceSwitchBufferFlag = FALSE;
4860*53ee8cc1Swenshuai.xi 
4861*53ee8cc1Swenshuai.xi             if(bRet == TRUE && _DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_BLACK_SCREEN_BY_WINUSED))
4862*53ee8cc1Swenshuai.xi             {
4863*53ee8cc1Swenshuai.xi                 MS_BOOL bDIPWinUsed = _DMS_IsWindowUsed(MVOP_WINDOW);
4864*53ee8cc1Swenshuai.xi                 Hal_DMS_XC_SetMute(pInstance, !bDIPWinUsed);
4865*53ee8cc1Swenshuai.xi                 _DMS_Remove_XC_Status(MVOP_WINDOW, DMS_XC_BLACK_SCREEN_BY_WINUSED);
4866*53ee8cc1Swenshuai.xi             }
4867*53ee8cc1Swenshuai.xi         }
4868*53ee8cc1Swenshuai.xi         else
4869*53ee8cc1Swenshuai.xi         {
4870*53ee8cc1Swenshuai.xi             //DMS_PRINTF("No switch _DMS_SwitchBuffer\n");
4871*53ee8cc1Swenshuai.xi         }
4872*53ee8cc1Swenshuai.xi     }
4873*53ee8cc1Swenshuai.xi #endif  //DMS_MAIN_WINDOW_FLOW_VERSION
4874*53ee8cc1Swenshuai.xi     _DMS_SwitchGOPBuffer(pInstance);
4875*53ee8cc1Swenshuai.xi 
4876*53ee8cc1Swenshuai.xi     return TRUE;
4877*53ee8cc1Swenshuai.xi }
4878*53ee8cc1Swenshuai.xi 
4879*53ee8cc1Swenshuai.xi #define DEV_PQ_FOD 0
4880*53ee8cc1Swenshuai.xi #if DEV_PQ_FOD
4881*53ee8cc1Swenshuai.xi #include "drvPQ.h"
4882*53ee8cc1Swenshuai.xi #include "drvPQ_cus.h"
4883*53ee8cc1Swenshuai.xi #endif
_Task_DMS_CapturePushedFrame(void)4884*53ee8cc1Swenshuai.xi static MS_BOOL _Task_DMS_CapturePushedFrame(void)
4885*53ee8cc1Swenshuai.xi {
4886*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0);
4887*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
4888*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
4889*53ee8cc1Swenshuai.xi 
4890*53ee8cc1Swenshuai.xi     // coverity[no_escape]
4891*53ee8cc1Swenshuai.xi     while(1)
4892*53ee8cc1Swenshuai.xi     {
4893*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(XC_Vsync_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
4894*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
4895*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
4896*53ee8cc1Swenshuai.xi 
4897*53ee8cc1Swenshuai.xi         //gDMSMVOPForceLookVDEC = gDMS_externDebugFlag;
4898*53ee8cc1Swenshuai.xi #if DEV_PQ_FOD
4899*53ee8cc1Swenshuai.xi         if(_DMS_Query_XC_Status(MVOP_WINDOW, DMS_XC_FIRST_TIME_SETWINDOW) == 0)
4900*53ee8cc1Swenshuai.xi         {
4901*53ee8cc1Swenshuai.xi             MDrv_PQ_AdaptiveTuning();
4902*53ee8cc1Swenshuai.xi         }
4903*53ee8cc1Swenshuai.xi #endif
4904*53ee8cc1Swenshuai.xi         sync_print("||>> ");
4905*53ee8cc1Swenshuai.xi #if DEV_DI
4906*53ee8cc1Swenshuai.xi         //di_sync_print("\033[1;32mSHOW %d: 0x%x, 0x%llx , MainQ %d reading\033[0m\n",MsOS_GetSystemTime(),_stXC_DIPPushInfo[MVOP_WINDOW][RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]].u32PriData,tempAddr,RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW]);
4907*53ee8cc1Swenshuai.xi #endif
4908*53ee8cc1Swenshuai.xi         sync_print(" next buffer ID %d, now show ID%d => ",RES_DMS.u8DIPReadytoCaptureID[MVOP_WINDOW],RES_DMS.gDMS_MVOPShowBufferID);
4909*53ee8cc1Swenshuai.xi 
4910*53ee8cc1Swenshuai.xi         //(1) Check Display Buffer Flag
4911*53ee8cc1Swenshuai.xi         _DMS_CheckDispBufFlag(pInstance);
4912*53ee8cc1Swenshuai.xi 
4913*53ee8cc1Swenshuai.xi         //(3) Prepare Next Frame to be Displayed
4914*53ee8cc1Swenshuai.xi         _DMS_PrepareNextFrame(pInstance);
4915*53ee8cc1Swenshuai.xi 
4916*53ee8cc1Swenshuai.xi         //(5) Switch GOP Read Buffer
4917*53ee8cc1Swenshuai.xi         _DMS_SwitchBuffer(pInstance);
4918*53ee8cc1Swenshuai.xi 
4919*53ee8cc1Swenshuai.xi         //clear Frame Ref
4920*53ee8cc1Swenshuai.xi         //How to check release frame?
4921*53ee8cc1Swenshuai.xi 
4922*53ee8cc1Swenshuai.xi         sync_print("End \n");
4923*53ee8cc1Swenshuai.xi         //DMS_PRINTF("End \n");
4924*53ee8cc1Swenshuai.xi         if(0)//gDMS_externDebugFlag != 0)
4925*53ee8cc1Swenshuai.xi         {
4926*53ee8cc1Swenshuai.xi             DMS_PRINTF("#end\n");
4927*53ee8cc1Swenshuai.xi             while(1);
4928*53ee8cc1Swenshuai.xi         }
4929*53ee8cc1Swenshuai.xi 
4930*53ee8cc1Swenshuai.xi         if(gDMSDebug >= 3)
4931*53ee8cc1Swenshuai.xi         {
4932*53ee8cc1Swenshuai.xi             gDMSDebug++;
4933*53ee8cc1Swenshuai.xi             if(gDMSDebug > 4)
4934*53ee8cc1Swenshuai.xi                 gDMSDebug = 0;
4935*53ee8cc1Swenshuai.xi         }
4936*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
4937*53ee8cc1Swenshuai.xi 
4938*53ee8cc1Swenshuai.xi #if DBG_FPS
4939*53ee8cc1Swenshuai.xi         u32FPS_Show_Counter[0]++;
4940*53ee8cc1Swenshuai.xi         u32FPS_Show_Counter[1]++;
4941*53ee8cc1Swenshuai.xi #endif
4942*53ee8cc1Swenshuai.xi 
4943*53ee8cc1Swenshuai.xi     }
4944*53ee8cc1Swenshuai.xi     return TRUE;
4945*53ee8cc1Swenshuai.xi }
4946*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_AddRef_CaptureMode(MS_U32 u32Window,MS_U16 u16BufID)4947*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_AddRef_CaptureMode(MS_U32 u32Window, MS_U16 u16BufID)
4948*53ee8cc1Swenshuai.xi {
4949*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
4950*53ee8cc1Swenshuai.xi #if NEW_FLIP
4951*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex == DMS_INVALID_FRAME_ID)
4952*53ee8cc1Swenshuai.xi     {
4953*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
4954*53ee8cc1Swenshuai.xi         return TRUE;
4955*53ee8cc1Swenshuai.xi     }
4956*53ee8cc1Swenshuai.xi 
4957*53ee8cc1Swenshuai.xi     VDEC_StreamId VdecStreamId;
4958*53ee8cc1Swenshuai.xi     VDEC_EX_DispFrame VdecDispFrm;
4959*53ee8cc1Swenshuai.xi     VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
4960*53ee8cc1Swenshuai.xi     VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
4961*53ee8cc1Swenshuai.xi     VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
4962*53ee8cc1Swenshuai.xi     VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
4963*53ee8cc1Swenshuai.xi     VDEC_EX_Result eResult;
4964*53ee8cc1Swenshuai.xi     eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
4965*53ee8cc1Swenshuai.xi     if (eResult != E_VDEC_EX_OK)
4966*53ee8cc1Swenshuai.xi     {
4967*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
4968*53ee8cc1Swenshuai.xi             (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
4969*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %td, BufID %d, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
4970*53ee8cc1Swenshuai.xi         return FALSE;
4971*53ee8cc1Swenshuai.xi     }
4972*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].eScanType))
4973*53ee8cc1Swenshuai.xi     {
4974*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
4975*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
4976*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex_2nd;
4977*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData_2nd;
4978*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
4979*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
4980*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
4981*53ee8cc1Swenshuai.xi         {
4982*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
4983*53ee8cc1Swenshuai.xi                 (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
4984*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %td, BufID %d, 2nd Field, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
4985*53ee8cc1Swenshuai.xi             return FALSE;
4986*53ee8cc1Swenshuai.xi         }
4987*53ee8cc1Swenshuai.xi     }
4988*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[AddRef] Frame[0x%x], PriData[0x%x]\n",_stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex,_stXC_DIPPushInfo[u32Window][u16BufID].u32PriData);
4989*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID]++;
4990*53ee8cc1Swenshuai.xi 
4991*53ee8cc1Swenshuai.xi #if DBG_FPS
4992*53ee8cc1Swenshuai.xi     u32FPS_Add_Counter[u32Window]++;
4993*53ee8cc1Swenshuai.xi #endif
4994*53ee8cc1Swenshuai.xi #endif
4995*53ee8cc1Swenshuai.xi     return TRUE;
4996*53ee8cc1Swenshuai.xi }
4997*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_Release_CaptureMode(MS_U32 u32Window,MS_U16 u16BufID)4998*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_Release_CaptureMode(MS_U32 u32Window, MS_U16 u16BufID)
4999*53ee8cc1Swenshuai.xi {
5000*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5001*53ee8cc1Swenshuai.xi #if NEW_FLIP
5002*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex == DMS_INVALID_FRAME_ID)
5003*53ee8cc1Swenshuai.xi     {
5004*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
5005*53ee8cc1Swenshuai.xi         return TRUE;
5006*53ee8cc1Swenshuai.xi     }
5007*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID] == 0)
5008*53ee8cc1Swenshuai.xi     {
5009*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[%s] ~window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__,u32Window,u16BufID);
5010*53ee8cc1Swenshuai.xi         return TRUE;
5011*53ee8cc1Swenshuai.xi     }
5012*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID]--;
5013*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID] == 0)
5014*53ee8cc1Swenshuai.xi     {
5015*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
5016*53ee8cc1Swenshuai.xi         VDEC_EX_DispFrame VdecDispFrm;
5017*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
5018*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
5019*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
5020*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
5021*53ee8cc1Swenshuai.xi 
5022*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
5023*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
5024*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
5025*53ee8cc1Swenshuai.xi         {
5026*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
5027*53ee8cc1Swenshuai.xi                 (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
5028*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %td, BufID %d, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
5029*53ee8cc1Swenshuai.xi             return FALSE;
5030*53ee8cc1Swenshuai.xi         }
5031*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].eScanType))
5032*53ee8cc1Swenshuai.xi         {
5033*53ee8cc1Swenshuai.xi             VdecStreamId.u32Version = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
5034*53ee8cc1Swenshuai.xi             VdecStreamId.u32Id = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
5035*53ee8cc1Swenshuai.xi             VdecDispFrm.u32Idx = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex_2nd;
5036*53ee8cc1Swenshuai.xi             VdecDispFrm.u32PriData = RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData_2nd;
5037*53ee8cc1Swenshuai.xi 
5038*53ee8cc1Swenshuai.xi             VDEC_EX_Result eResult;
5039*53ee8cc1Swenshuai.xi             eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
5040*53ee8cc1Swenshuai.xi             if (eResult != E_VDEC_EX_OK)
5041*53ee8cc1Swenshuai.xi             {
5042*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] %td %td, %td %td\n",__FUNCTION__,(ptrdiff_t)VdecStreamId.u32Version,(ptrdiff_t)VdecStreamId.u32Id,
5043*53ee8cc1Swenshuai.xi                     (ptrdiff_t)VdecDispFrm.u32Idx,(ptrdiff_t)VdecDispFrm.u32PriData);
5044*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] window %td, BufID %d, 2nd Field, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,eResult);
5045*53ee8cc1Swenshuai.xi                 return FALSE;
5046*53ee8cc1Swenshuai.xi             }
5047*53ee8cc1Swenshuai.xi         }
5048*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[Release] Frame[0x%x], PriData[0x%x]\n",RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex,RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData);
5049*53ee8cc1Swenshuai.xi         if(_IsFrameRefCountZero(u32Window, u16BufID))
5050*53ee8cc1Swenshuai.xi         {
5051*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex = DMS_INVALID_FRAME_ID;
5052*53ee8cc1Swenshuai.xi         }
5053*53ee8cc1Swenshuai.xi     }
5054*53ee8cc1Swenshuai.xi 
5055*53ee8cc1Swenshuai.xi #if DBG_FPS
5056*53ee8cc1Swenshuai.xi     u32FPS_Release_Counter[u32Window]++;
5057*53ee8cc1Swenshuai.xi #endif
5058*53ee8cc1Swenshuai.xi #endif
5059*53ee8cc1Swenshuai.xi     return TRUE;
5060*53ee8cc1Swenshuai.xi }
5061*53ee8cc1Swenshuai.xi 
_DMS_Clear_VDEC_Frame_Ref_CaptureMode(MS_U32 u32Window,MS_U16 u16BufID)5062*53ee8cc1Swenshuai.xi static void _DMS_Clear_VDEC_Frame_Ref_CaptureMode(MS_U32 u32Window, MS_U16 u16BufID)
5063*53ee8cc1Swenshuai.xi {
5064*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5065*53ee8cc1Swenshuai.xi     MS_U8 u8RefCounter = 0;
5066*53ee8cc1Swenshuai.xi     for(u8RefCounter = 0; u8RefCounter < RES_DMSCAPTURE._stXC_LocalFrameRefCountCaptureMode[u32Window][u16BufID]; u8RefCounter++)
5067*53ee8cc1Swenshuai.xi     {
5068*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] CaptureMode window %td release frame for WP %d ct %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,(u8RefCounter+1));
5069*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_Release_CaptureMode(u32Window,u16BufID);
5070*53ee8cc1Swenshuai.xi     }
5071*53ee8cc1Swenshuai.xi }
5072*53ee8cc1Swenshuai.xi 
5073*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
5074*53ee8cc1Swenshuai.xi 
5075*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0) //Fix with FrameBuffer mode variable
_Get_CaptureMode_NextBufferID(MS_U32 u32WindowID,MS_U16 u16CurID)5076*53ee8cc1Swenshuai.xi static MS_U16 _Get_CaptureMode_NextBufferID(MS_U32 u32WindowID, MS_U16 u16CurID)
5077*53ee8cc1Swenshuai.xi {
5078*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5079*53ee8cc1Swenshuai.xi     MS_U16 u16NextID = DMS_CAPTUREWIN_RING_BUFFER;
5080*53ee8cc1Swenshuai.xi 
5081*53ee8cc1Swenshuai.xi     u16NextID = (u16CurID + 1) % DMS_CAPTUREWIN_RING_BUFFER;
5082*53ee8cc1Swenshuai.xi     while(RES_DMSCAPTURE._stXC_CaptureRingBufRefCount[u32WindowID][u16NextID] != 0)
5083*53ee8cc1Swenshuai.xi     {
5084*53ee8cc1Swenshuai.xi         u16NextID = (u16NextID + 1) % DMS_CAPTUREWIN_RING_BUFFER;
5085*53ee8cc1Swenshuai.xi     }
5086*53ee8cc1Swenshuai.xi     return u16NextID;
5087*53ee8cc1Swenshuai.xi }
5088*53ee8cc1Swenshuai.xi 
_Get_CaptureMode_NextRingBufferWritePointer(MS_U32 u32WindowID)5089*53ee8cc1Swenshuai.xi static MS_U16 _Get_CaptureMode_NextRingBufferWritePointer(MS_U32 u32WindowID)
5090*53ee8cc1Swenshuai.xi {
5091*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5092*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u32WindowID].u16PreWritePointer = RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u32WindowID].u16WritePointer;
5093*53ee8cc1Swenshuai.xi     return _Get_CaptureMode_NextBufferID(u32WindowID, RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u32WindowID].u16WritePointer);
5094*53ee8cc1Swenshuai.xi }
5095*53ee8cc1Swenshuai.xi #endif
5096*53ee8cc1Swenshuai.xi 
_MarkIgnorableCaptureBufferID(MS_U32 u32WindowID,MS_U16 u16TargetID)5097*53ee8cc1Swenshuai.xi static void _MarkIgnorableCaptureBufferID(MS_U32 u32WindowID, MS_U16 u16TargetID)
5098*53ee8cc1Swenshuai.xi {
5099*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5100*53ee8cc1Swenshuai.xi     MS_U16 u16CurID = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u16PreviousWP;
5101*53ee8cc1Swenshuai.xi 
5102*53ee8cc1Swenshuai.xi     while (u16CurID != u16TargetID)
5103*53ee8cc1Swenshuai.xi     {
5104*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE.bIsFrameValid[u32WindowID][u16CurID] == TRUE)
5105*53ee8cc1Swenshuai.xi         {
5106*53ee8cc1Swenshuai.xi             _DMS_VDEC_Frame_Release_CaptureMode(u32WindowID, u16CurID);
5107*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE.bIsFrameValid[u32WindowID][u16CurID] = FALSE;
5108*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE.u8frameRepeatCnt[u32WindowID][u16CurID] = 0;
5109*53ee8cc1Swenshuai.xi         }
5110*53ee8cc1Swenshuai.xi         u16CurID = _GetNextBufferID(u16CurID);
5111*53ee8cc1Swenshuai.xi     }
5112*53ee8cc1Swenshuai.xi }
5113*53ee8cc1Swenshuai.xi 
_Task_DMS_CaptureMode_PushedFrame(void)5114*53ee8cc1Swenshuai.xi static MS_BOOL _Task_DMS_CaptureMode_PushedFrame(void)
5115*53ee8cc1Swenshuai.xi {
5116*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0)|BIT(1)|BIT(2)|BIT(3);
5117*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
5118*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
5119*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = 0;
5120*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
5121*53ee8cc1Swenshuai.xi     MS_U8 u8RepeatCnt = 0;
5122*53ee8cc1Swenshuai.xi     MS_U16 u16NextWriteBufID = DMS_CAPTUREWIN_RING_BUFFER;
5123*53ee8cc1Swenshuai.xi #endif
5124*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
5125*53ee8cc1Swenshuai.xi 
5126*53ee8cc1Swenshuai.xi     // coverity[no_escape]
5127*53ee8cc1Swenshuai.xi     while(1)
5128*53ee8cc1Swenshuai.xi     {
5129*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(CaptureMode_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
5130*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
5131*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
5132*53ee8cc1Swenshuai.xi 
5133*53ee8cc1Swenshuai.xi         for(u8WindowID=0; u8WindowID<DMS_MAX_WINDOW_NUM; u8WindowID++)
5134*53ee8cc1Swenshuai.xi         {
5135*53ee8cc1Swenshuai.xi             if(u32Events & BIT(u8WindowID))
5136*53ee8cc1Swenshuai.xi             {
5137*53ee8cc1Swenshuai.xi                 u8BufferID = RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u8WindowID].u16ReadPointer;
5138*53ee8cc1Swenshuai.xi                 _MarkIgnorableCaptureBufferID(u8WindowID, u8BufferID);
5139*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
5140*53ee8cc1Swenshuai.xi                 MS_U8 u8FrameRepeat = RES_DMSCAPTURE.u8frameRepeatCnt[u8WindowID][u8BufferID];
5141*53ee8cc1Swenshuai.xi                 for(u8RepeatCnt=0; u8RepeatCnt<u8FrameRepeat; u8RepeatCnt++)
5142*53ee8cc1Swenshuai.xi #else
5143*53ee8cc1Swenshuai.xi                 if(RES_DMSCAPTURE.u8frameRepeatCnt[u8WindowID][u8BufferID] > 0)
5144*53ee8cc1Swenshuai.xi #endif
5145*53ee8cc1Swenshuai.xi                 {
5146*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE.u8frameRepeatCnt[u8WindowID][u8BufferID]--;
5147*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].u32FrameCount++;
5148*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
5149*53ee8cc1Swenshuai.xi                     u16NextWriteBufID = _Get_CaptureMode_NextRingBufferWritePointer(u8WindowID);
5150*53ee8cc1Swenshuai.xi                     //printf("\033[36m === windowID: %d, BufferID: %d [%d]=== \033[0m\n", u8WindowID, u8BufferID, u16NextWriteBufID);
5151*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u8WindowID].u16WritePointer = u16NextWriteBufID;
5152*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].stCaptureRingBuf[u16NextWriteBufID].u64Pts = RES_DMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].u64Pts;
5153*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].stCaptureRingBuf[u16NextWriteBufID].u32frameCount = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].u32FrameCount;
5154*53ee8cc1Swenshuai.xi #else
5155*53ee8cc1Swenshuai.xi                     //printf("\033[36m === windowID: %d, BufferID: %d, Cnt %d === \033[0m\n", u8WindowID, u8BufferID, RES_DMSCAPTURE.u8frameRepeatCnt[u8WindowID][u8BufferID]);
5156*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].stCaptureRingBuf[0].u64Pts = RES_DMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].u64Pts;
5157*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].stCaptureRingBuf[0].u32frameCount = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].u32FrameCount;
5158*53ee8cc1Swenshuai.xi #endif
5159*53ee8cc1Swenshuai.xi                     _DMS_DIP_Flow_PrepareNextFrame(pInstance, E_DMS_DIP_CAPTURE,u8WindowID,u8BufferID);
5160*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
5161*53ee8cc1Swenshuai.xi                     BUFFER_INFO stBufInfo;
5162*53ee8cc1Swenshuai.xi                     stBufInfo = MApi_XC_DIP_GetBufInfo(RES_DMS.u8DIP_Window[E_DMS_DIP_CAPTURE]);
5163*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].stCaptureRingBuf[u16NextWriteBufID].phyBufferCAddr = stBufInfo.u32CBuf[0];
5164*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE.bIsRingBufAccessed[u16NextWriteBufID] = TRUE;
5165*53ee8cc1Swenshuai.xi #endif
5166*53ee8cc1Swenshuai.xi                 }
5167*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI)
5168*53ee8cc1Swenshuai.xi                 if(RES_DMSCAPTURE.u8frameRepeatCnt[u8WindowID][u8BufferID] == 0)
5169*53ee8cc1Swenshuai.xi #endif
5170*53ee8cc1Swenshuai.xi                 {
5171*53ee8cc1Swenshuai.xi                     if(RES_DMSCAPTURE.bIsFrameValid[u8WindowID][u8BufferID] == TRUE)
5172*53ee8cc1Swenshuai.xi                     {
5173*53ee8cc1Swenshuai.xi                         RES_DMSCAPTURE.bIsFrameValid[u8WindowID][u8BufferID] = FALSE;
5174*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
5175*53ee8cc1Swenshuai.xi                         RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u8WindowID].u16PreviousWP = u8BufferID;
5176*53ee8cc1Swenshuai.xi #endif
5177*53ee8cc1Swenshuai.xi                         _DMS_VDEC_Frame_Release_CaptureMode(u8WindowID, u8BufferID);
5178*53ee8cc1Swenshuai.xi                     }
5179*53ee8cc1Swenshuai.xi                 }
5180*53ee8cc1Swenshuai.xi            }
5181*53ee8cc1Swenshuai.xi         }
5182*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
5183*53ee8cc1Swenshuai.xi     }
5184*53ee8cc1Swenshuai.xi     return TRUE;
5185*53ee8cc1Swenshuai.xi }
5186*53ee8cc1Swenshuai.xi #endif
5187*53ee8cc1Swenshuai.xi 
_DMS_TriggerToCaptureFrame(void * pInstance,MS_U16 u16WindowID)5188*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_TriggerToCaptureFrame(void* pInstance, MS_U16 u16WindowID)
5189*53ee8cc1Swenshuai.xi {
5190*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5191*53ee8cc1Swenshuai.xi     MS_U32 u32OutputRate = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32FrameRate;
5192*53ee8cc1Swenshuai.xi     MS_U16 u16WritePointer = RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16WritePointer;
5193*53ee8cc1Swenshuai.xi     MS_U32 u32InputRate = RES_DMS._stXC_DIPPushInfo[u16WindowID][u16WritePointer].u32FrameRate;
5194*53ee8cc1Swenshuai.xi 
5195*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].bStartCountCapModeFRC != FALSE)
5196*53ee8cc1Swenshuai.xi     {
5197*53ee8cc1Swenshuai.xi         if(u32InputRate > 0)
5198*53ee8cc1Swenshuai.xi         {
5199*53ee8cc1Swenshuai.xi             MS_U8 u8DisplayCount = 0;
5200*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate += u32OutputRate;
5201*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u8ReadPointerOffset++;
5202*53ee8cc1Swenshuai.xi 
5203*53ee8cc1Swenshuai.xi             if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate >= u32InputRate)
5204*53ee8cc1Swenshuai.xi             {
5205*53ee8cc1Swenshuai.xi                 //DMS_PRINTF("\033[36m [%s] Out: %d, In: %d \033[0m\n",__FUNCTION__, RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate, u32InputRate);
5206*53ee8cc1Swenshuai.xi                 u8DisplayCount = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate / u32InputRate;
5207*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate % u32InputRate;
5208*53ee8cc1Swenshuai.xi 
5209*53ee8cc1Swenshuai.xi                 MS_U8 u8RP_Offset = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u8ReadPointerOffset;
5210*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u8ReadPointerOffset = 0;
5211*53ee8cc1Swenshuai.xi                 MS_U8 i = 0;
5212*53ee8cc1Swenshuai.xi                 MS_U16 u16CurReadPointer = RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16ReadPointer;
5213*53ee8cc1Swenshuai.xi                 MS_U16 u16NextReadPointer = u16CurReadPointer;
5214*53ee8cc1Swenshuai.xi                 for(i=0; i < u8RP_Offset; i++)
5215*53ee8cc1Swenshuai.xi                 {
5216*53ee8cc1Swenshuai.xi                     u16NextReadPointer = _GetNextBufferID(u16NextReadPointer);
5217*53ee8cc1Swenshuai.xi                 }
5218*53ee8cc1Swenshuai.xi                 if(RES_DMSCAPTURE.bIsFrameValid[u16WindowID][u16NextReadPointer])
5219*53ee8cc1Swenshuai.xi                 {
5220*53ee8cc1Swenshuai.xi                     while(RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16CurReadPointer] != 0)
5221*53ee8cc1Swenshuai.xi                     {
5222*53ee8cc1Swenshuai.xi                         if(_DMS_IsCaptureWindowEnable(u16WindowID) == FALSE)
5223*53ee8cc1Swenshuai.xi                         {
5224*53ee8cc1Swenshuai.xi                             return FALSE;
5225*53ee8cc1Swenshuai.xi                         }
5226*53ee8cc1Swenshuai.xi                         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
5227*53ee8cc1Swenshuai.xi                         DMS_PRINTF("\033[31m [%s] win %d, CAPTURE Force block flip when %d RepeatCnt %d > 0\033[0m\n",__FUNCTION__, u16WindowID, u16CurReadPointer, RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16CurReadPointer]);
5228*53ee8cc1Swenshuai.xi                         MsOS_DelayTask(1);
5229*53ee8cc1Swenshuai.xi                         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
5230*53ee8cc1Swenshuai.xi                     }
5231*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16ReadPointer = u16NextReadPointer;
5232*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u16NeedDeletePtr = u16NextReadPointer;
5233*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16NextReadPointer] = u8DisplayCount;
5234*53ee8cc1Swenshuai.xi                     //printf("\033[32m Read: %d, RepeatCnt: %d [%d]\033[0m\n", u16NextReadPointer, u8DisplayCount, u32InputRate);
5235*53ee8cc1Swenshuai.xi                     return TRUE;
5236*53ee8cc1Swenshuai.xi                 }
5237*53ee8cc1Swenshuai.xi                 else
5238*53ee8cc1Swenshuai.xi                 {
5239*53ee8cc1Swenshuai.xi                     DMS_PRINTF("win %d, %d (Cnt: %d), next %d NOT Valid\n",u16WindowID, RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16ReadPointer, RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16CurReadPointer], u16NextReadPointer);
5240*53ee8cc1Swenshuai.xi                 }
5241*53ee8cc1Swenshuai.xi             }
5242*53ee8cc1Swenshuai.xi             else
5243*53ee8cc1Swenshuai.xi             {
5244*53ee8cc1Swenshuai.xi                 MS_U16 u16DeletePtr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u16NeedDeletePtr;
5245*53ee8cc1Swenshuai.xi                 u16DeletePtr = _GetNextBufferID(u16DeletePtr);
5246*53ee8cc1Swenshuai.xi                 _DMS_VDEC_Frame_Release_CaptureMode(u16WindowID, u16DeletePtr);
5247*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE.bIsFrameValid[u16WindowID][u16DeletePtr] = FALSE;
5248*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16DeletePtr] = 0;
5249*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u16NeedDeletePtr = u16DeletePtr;
5250*53ee8cc1Swenshuai.xi             }
5251*53ee8cc1Swenshuai.xi         }
5252*53ee8cc1Swenshuai.xi     }
5253*53ee8cc1Swenshuai.xi     else
5254*53ee8cc1Swenshuai.xi     {
5255*53ee8cc1Swenshuai.xi         MS_U16 u16WritePoint = RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16WritePointer;
5256*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE.bIsFrameValid[u16WindowID][u16WritePoint])
5257*53ee8cc1Swenshuai.xi         {
5258*53ee8cc1Swenshuai.xi             MS_U8 i = 0;
5259*53ee8cc1Swenshuai.xi             MS_BOOL bValid = FALSE;
5260*53ee8cc1Swenshuai.xi             for(i = 0 ; i < (START_FRC_ACCUMULE_FRAME_COUNT - 1); i++)
5261*53ee8cc1Swenshuai.xi             {
5262*53ee8cc1Swenshuai.xi                 u16WritePoint = _GetPreviousBufferID(u16WritePoint);
5263*53ee8cc1Swenshuai.xi                 if(RES_DMSCAPTURE.bIsFrameValid[u16WindowID][u16WritePoint])
5264*53ee8cc1Swenshuai.xi                 {
5265*53ee8cc1Swenshuai.xi                     bValid = TRUE;
5266*53ee8cc1Swenshuai.xi                 }
5267*53ee8cc1Swenshuai.xi                 else
5268*53ee8cc1Swenshuai.xi                 {
5269*53ee8cc1Swenshuai.xi                     bValid = FALSE;
5270*53ee8cc1Swenshuai.xi                     break;
5271*53ee8cc1Swenshuai.xi                 }
5272*53ee8cc1Swenshuai.xi             }
5273*53ee8cc1Swenshuai.xi             if(bValid)
5274*53ee8cc1Swenshuai.xi             {
5275*53ee8cc1Swenshuai.xi                 if(u32OutputRate > 0)
5276*53ee8cc1Swenshuai.xi                 {
5277*53ee8cc1Swenshuai.xi                     while(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate < u32InputRate)
5278*53ee8cc1Swenshuai.xi                     {
5279*53ee8cc1Swenshuai.xi                         RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate + u32OutputRate;
5280*53ee8cc1Swenshuai.xi                     }
5281*53ee8cc1Swenshuai.xi                     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u32AccumuleOutputRate % u32InputRate;
5282*53ee8cc1Swenshuai.xi                 }
5283*53ee8cc1Swenshuai.xi                 else
5284*53ee8cc1Swenshuai.xi                 {
5285*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[31m [%s] Error! Capture FrameRate <= 0 \033[0m\n",__FUNCTION__);
5286*53ee8cc1Swenshuai.xi                 }
5287*53ee8cc1Swenshuai.xi 
5288*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16ReadPointer = u16WritePoint;
5289*53ee8cc1Swenshuai.xi                 DMS_PRINTF("win %d, %d \n",u16WindowID, RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u16WindowID].u16ReadPointer);
5290*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].u16PreviousWP = _GetPreviousBufferID(u16WritePoint);
5291*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE.u8frameRepeatCnt[u16WindowID][u16WritePoint] = 1;
5292*53ee8cc1Swenshuai.xi                 RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u16WindowID].bStartCountCapModeFRC = TRUE;
5293*53ee8cc1Swenshuai.xi                 DMS_PRINTF("FRC Start \n");
5294*53ee8cc1Swenshuai.xi                 return TRUE;
5295*53ee8cc1Swenshuai.xi             }
5296*53ee8cc1Swenshuai.xi         }
5297*53ee8cc1Swenshuai.xi     }
5298*53ee8cc1Swenshuai.xi     return FALSE;
5299*53ee8cc1Swenshuai.xi }
5300*53ee8cc1Swenshuai.xi 
5301*53ee8cc1Swenshuai.xi #if DBG_FPS
_Task_DMS_FPS(void)5302*53ee8cc1Swenshuai.xi static MS_BOOL _Task_DMS_FPS(void)
5303*53ee8cc1Swenshuai.xi {
5304*53ee8cc1Swenshuai.xi     MS_U32 t0[2] = {0};
5305*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
5306*53ee8cc1Swenshuai.xi // coverity[no_escape]
5307*53ee8cc1Swenshuai.xi     while(1)
5308*53ee8cc1Swenshuai.xi     {
5309*53ee8cc1Swenshuai.xi         for(i = 0 ; i < 2; i++)
5310*53ee8cc1Swenshuai.xi         {
5311*53ee8cc1Swenshuai.xi             if(bFPS_Start[i])
5312*53ee8cc1Swenshuai.xi             {
5313*53ee8cc1Swenshuai.xi                 MS_U32 t1 = (MsOS_GetSystemTime() - t0[i]);
5314*53ee8cc1Swenshuai.xi                 if((t1 > PRI_PERIOD) || (t0[i] == 0))
5315*53ee8cc1Swenshuai.xi                 {
5316*53ee8cc1Swenshuai.xi #if NEW_FLIP
5317*53ee8cc1Swenshuai.xi                     DMS_PRINTF("FPS(win%d): in %d, flip %d, out %d, Add/Rel %d/%d (%d/%d), Di %d. (time: %d).\n",i,
5318*53ee8cc1Swenshuai.xi #else
5319*53ee8cc1Swenshuai.xi                     DMS_PRINTF("FPS(win%d): in %d, flip %d, out %d, pull (%d/%d). (time: %d)\n",i,
5320*53ee8cc1Swenshuai.xi #endif
5321*53ee8cc1Swenshuai.xi                         ((u32FPS_Push_Counter[i] * 1000) / PRI_PERIOD),
5322*53ee8cc1Swenshuai.xi                         ((u32FPS_Switch_Counter[i] * 1000) / PRI_PERIOD),
5323*53ee8cc1Swenshuai.xi                         ((u32FPS_Show_Counter[i] * 1000) / PRI_PERIOD),
5324*53ee8cc1Swenshuai.xi #if NEW_FLIP
5325*53ee8cc1Swenshuai.xi                         (u32FPS_Add_Counter[i]),
5326*53ee8cc1Swenshuai.xi                         (u32FPS_Release_Counter[i]),
5327*53ee8cc1Swenshuai.xi                         ((u32FPS_Add_Counter[i] * 1000) / PRI_PERIOD),
5328*53ee8cc1Swenshuai.xi                         ((u32FPS_Release_Counter[i] * 1000) / PRI_PERIOD),
5329*53ee8cc1Swenshuai.xi                         (u32FPS_Di_Counter[i]),
5330*53ee8cc1Swenshuai.xi 
5331*53ee8cc1Swenshuai.xi #else
5332*53ee8cc1Swenshuai.xi                         ((u32FPS_Pull_Counter[i] * 1000) / PRI_PERIOD),
5333*53ee8cc1Swenshuai.xi                         ((u32FPS_Pull_NotReady_Counter[i] * 1000) / PRI_PERIOD),
5334*53ee8cc1Swenshuai.xi #endif
5335*53ee8cc1Swenshuai.xi                         t1
5336*53ee8cc1Swenshuai.xi                         );
5337*53ee8cc1Swenshuai.xi                     if(((u32FPS_Push_Counter[i] * 1000) / PRI_PERIOD) > (((u32FPS_Switch_Counter[i] * 1000) / PRI_PERIOD) + 5))
5338*53ee8cc1Swenshuai.xi                     {
5339*53ee8cc1Swenshuai.xi                         //gDMS_externDebugFlag = 1;
5340*53ee8cc1Swenshuai.xi                     }
5341*53ee8cc1Swenshuai.xi                     else
5342*53ee8cc1Swenshuai.xi                     {
5343*53ee8cc1Swenshuai.xi                         //gDMS_externDebugFlag = 0;
5344*53ee8cc1Swenshuai.xi                     }
5345*53ee8cc1Swenshuai.xi                     t0[i] = MsOS_GetSystemTime();
5346*53ee8cc1Swenshuai.xi                     u32FPS_Push_Counter[i] = 0;
5347*53ee8cc1Swenshuai.xi                     u32FPS_Switch_Counter[i] = 0;
5348*53ee8cc1Swenshuai.xi                     u32FPS_Show_Counter[i] = 0;
5349*53ee8cc1Swenshuai.xi                     u32FPS_Pull_Counter[i] = 0;
5350*53ee8cc1Swenshuai.xi                     u32FPS_Pull_NotReady_Counter[i] = 0;
5351*53ee8cc1Swenshuai.xi                     u32FPS_Add_Counter[i] = 0;
5352*53ee8cc1Swenshuai.xi                     u32FPS_Release_Counter[i] = 0;
5353*53ee8cc1Swenshuai.xi                     u32FPS_Di_Counter[i] = 0;
5354*53ee8cc1Swenshuai.xi                 }
5355*53ee8cc1Swenshuai.xi             }
5356*53ee8cc1Swenshuai.xi         }
5357*53ee8cc1Swenshuai.xi         MsOS_DelayTask(5);
5358*53ee8cc1Swenshuai.xi     }
5359*53ee8cc1Swenshuai.xi     return TRUE;
5360*53ee8cc1Swenshuai.xi }
5361*53ee8cc1Swenshuai.xi #endif
5362*53ee8cc1Swenshuai.xi 
_MDrv_DMS_CreateTask(void)5363*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMS_CreateTask(void)
5364*53ee8cc1Swenshuai.xi {
5365*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_NOS
5366*53ee8cc1Swenshuai.xi     if(s32DMSTaskID == -1)
5367*53ee8cc1Swenshuai.xi     {
5368*53ee8cc1Swenshuai.xi         s32DMSTaskID = MsOS_CreateTask((TaskEntry)_Task_DMS_CapturePushedFrame,
5369*53ee8cc1Swenshuai.xi                                     0,
5370*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5371*53ee8cc1Swenshuai.xi                                     TRUE,
5372*53ee8cc1Swenshuai.xi                                     NULL,
5373*53ee8cc1Swenshuai.xi                                     0,
5374*53ee8cc1Swenshuai.xi                                     "DMS_Task");
5375*53ee8cc1Swenshuai.xi #if DBG_FPS
5376*53ee8cc1Swenshuai.xi         s32DMSFPSTaskID = MsOS_CreateTask((TaskEntry)_Task_DMS_FPS,
5377*53ee8cc1Swenshuai.xi                                     0,
5378*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5379*53ee8cc1Swenshuai.xi                                     TRUE,
5380*53ee8cc1Swenshuai.xi                                     NULL,
5381*53ee8cc1Swenshuai.xi                                     0,
5382*53ee8cc1Swenshuai.xi                                     "DMS_FPS_Task");
5383*53ee8cc1Swenshuai.xi #endif
5384*53ee8cc1Swenshuai.xi     }
5385*53ee8cc1Swenshuai.xi     else
5386*53ee8cc1Swenshuai.xi     {
5387*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32DMSTaskID) \n");
5388*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32DMSTaskID);
5389*53ee8cc1Swenshuai.xi     }
5390*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
5391*53ee8cc1Swenshuai.xi #if DEV_DI
5392*53ee8cc1Swenshuai.xi     if(s32DIPTaskID_Interlace == -1)
5393*53ee8cc1Swenshuai.xi     {
5394*53ee8cc1Swenshuai.xi         s32DIPTaskID_Interlace = MsOS_CreateTask((TaskEntry)_Task_CapturePushedInterlaceFrame,
5395*53ee8cc1Swenshuai.xi                                     0,
5396*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5397*53ee8cc1Swenshuai.xi                                     TRUE,
5398*53ee8cc1Swenshuai.xi                                     NULL,
5399*53ee8cc1Swenshuai.xi                                     0,
5400*53ee8cc1Swenshuai.xi                                     "DMS_IModeFrame_Task");
5401*53ee8cc1Swenshuai.xi     }
5402*53ee8cc1Swenshuai.xi     else
5403*53ee8cc1Swenshuai.xi     {
5404*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32DIPTaskID_Interlace) \n");
5405*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32DIPTaskID_Interlace);
5406*53ee8cc1Swenshuai.xi     }
5407*53ee8cc1Swenshuai.xi #endif
5408*53ee8cc1Swenshuai.xi #endif
5409*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
5410*53ee8cc1Swenshuai.xi     if(s32DIPTaskID_CaptureMode == -1)
5411*53ee8cc1Swenshuai.xi     {
5412*53ee8cc1Swenshuai.xi         s32DIPTaskID_CaptureMode = MsOS_CreateTask((TaskEntry)_Task_DMS_CaptureMode_PushedFrame,
5413*53ee8cc1Swenshuai.xi                                     0,
5414*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5415*53ee8cc1Swenshuai.xi                                     TRUE,
5416*53ee8cc1Swenshuai.xi                                     NULL,
5417*53ee8cc1Swenshuai.xi                                     0,
5418*53ee8cc1Swenshuai.xi                                     "DMS_CaptureModeFrame_Task");
5419*53ee8cc1Swenshuai.xi     }
5420*53ee8cc1Swenshuai.xi     else
5421*53ee8cc1Swenshuai.xi     {
5422*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32DIPTaskID_CaptureMode) \n");
5423*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32DIPTaskID_CaptureMode);
5424*53ee8cc1Swenshuai.xi     }
5425*53ee8cc1Swenshuai.xi #endif
5426*53ee8cc1Swenshuai.xi 
5427*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
5428*53ee8cc1Swenshuai.xi     if(s32MVOPTaskID == -1)
5429*53ee8cc1Swenshuai.xi     {
5430*53ee8cc1Swenshuai.xi         s32MVOPTaskID = MsOS_CreateTask((TaskEntry)_Task_DMS_SetMVOP,
5431*53ee8cc1Swenshuai.xi                                     0,
5432*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5433*53ee8cc1Swenshuai.xi                                     TRUE,
5434*53ee8cc1Swenshuai.xi                                     NULL,
5435*53ee8cc1Swenshuai.xi                                     0,
5436*53ee8cc1Swenshuai.xi                                     "DMS_SetMVOP_Task");
5437*53ee8cc1Swenshuai.xi     }
5438*53ee8cc1Swenshuai.xi     else
5439*53ee8cc1Swenshuai.xi     {
5440*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32MVOPTaskID) \n");
5441*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32MVOPTaskID);
5442*53ee8cc1Swenshuai.xi     }
5443*53ee8cc1Swenshuai.xi     if(s32DisableBobTaskID == -1)
5444*53ee8cc1Swenshuai.xi     {
5445*53ee8cc1Swenshuai.xi         s32DisableBobTaskID = MsOS_CreateTask((TaskEntry)_Task_DMS_DisableBob_MainWin,
5446*53ee8cc1Swenshuai.xi                                     0,
5447*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5448*53ee8cc1Swenshuai.xi                                     TRUE,
5449*53ee8cc1Swenshuai.xi                                     NULL,
5450*53ee8cc1Swenshuai.xi                                     0,
5451*53ee8cc1Swenshuai.xi                                     "DMS_DisableBob_Task");
5452*53ee8cc1Swenshuai.xi     }
5453*53ee8cc1Swenshuai.xi     else
5454*53ee8cc1Swenshuai.xi     {
5455*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32DisableBobTaskID) \n");
5456*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32DisableBobTaskID);
5457*53ee8cc1Swenshuai.xi     }
5458*53ee8cc1Swenshuai.xi #endif
5459*53ee8cc1Swenshuai.xi #endif
5460*53ee8cc1Swenshuai.xi     return TRUE;
5461*53ee8cc1Swenshuai.xi }
5462*53ee8cc1Swenshuai.xi 
_MDrv_DMS_InvalidateAllQueue(void)5463*53ee8cc1Swenshuai.xi void _MDrv_DMS_InvalidateAllQueue(void)
5464*53ee8cc1Swenshuai.xi {
5465*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5466*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
5467*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = 0;
5468*53ee8cc1Swenshuai.xi 
5469*53ee8cc1Swenshuai.xi     for (u8WindowID = 0; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
5470*53ee8cc1Swenshuai.xi     {
5471*53ee8cc1Swenshuai.xi         for(u8BufferID=0;u8BufferID<DMS_DIP_QUEUEDEPTH;u8BufferID++)
5472*53ee8cc1Swenshuai.xi         {
5473*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].bValid = FALSE;
5474*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].u32FrameIndex = DMS_INVALID_FRAME_ID;
5475*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].eScanType = E_DMS_VIDEO_SCAN_TYPE_MAX;
5476*53ee8cc1Swenshuai.xi         }
5477*53ee8cc1Swenshuai.xi     }
5478*53ee8cc1Swenshuai.xi }
5479*53ee8cc1Swenshuai.xi 
_TimeToChangeGOPBuffer(void)5480*53ee8cc1Swenshuai.xi static MS_BOOL _TimeToChangeGOPBuffer(void)
5481*53ee8cc1Swenshuai.xi {
5482*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5483*53ee8cc1Swenshuai.xi     MS_U16 u16OutVFreq = g_IPanel.DefaultVFreq() / 10;
5484*53ee8cc1Swenshuai.xi     MS_U32 u32Count = 0;
5485*53ee8cc1Swenshuai.xi 
5486*53ee8cc1Swenshuai.xi     // Counter + 1 in each Vsync
5487*53ee8cc1Swenshuai.xi     RES_DMS.u32VsyncCount++;
5488*53ee8cc1Swenshuai.xi 
5489*53ee8cc1Swenshuai.xi     u32Count = (RES_DMS.u32MaxOutputFrameRate * RES_DMS.u32VsyncCount) / u16OutVFreq;
5490*53ee8cc1Swenshuai.xi 
5491*53ee8cc1Swenshuai.xi     //reset loop
5492*53ee8cc1Swenshuai.xi     if (RES_DMS.u32VsyncCount == u16OutVFreq)
5493*53ee8cc1Swenshuai.xi     {
5494*53ee8cc1Swenshuai.xi         RES_DMS.u32VsyncCount = 0;
5495*53ee8cc1Swenshuai.xi         RES_DMS.u32GOPDispCount = 0;
5496*53ee8cc1Swenshuai.xi 
5497*53ee8cc1Swenshuai.xi         return TRUE;
5498*53ee8cc1Swenshuai.xi     }
5499*53ee8cc1Swenshuai.xi 
5500*53ee8cc1Swenshuai.xi     if (u32Count > RES_DMS.u32GOPDispCount)
5501*53ee8cc1Swenshuai.xi     {
5502*53ee8cc1Swenshuai.xi         RES_DMS.u32GOPDispCount = u32Count;
5503*53ee8cc1Swenshuai.xi         return TRUE;
5504*53ee8cc1Swenshuai.xi     }
5505*53ee8cc1Swenshuai.xi     else
5506*53ee8cc1Swenshuai.xi     {
5507*53ee8cc1Swenshuai.xi         return FALSE;
5508*53ee8cc1Swenshuai.xi     }
5509*53ee8cc1Swenshuai.xi 
5510*53ee8cc1Swenshuai.xi 
5511*53ee8cc1Swenshuai.xi }
5512*53ee8cc1Swenshuai.xi 
_DMS_EmbedXCISR(SC_INT_SRC enIntNum,void * pParam)5513*53ee8cc1Swenshuai.xi static void _DMS_EmbedXCISR(SC_INT_SRC enIntNum, void *pParam)
5514*53ee8cc1Swenshuai.xi {
5515*53ee8cc1Swenshuai.xi     if (_TimeToChangeGOPBuffer() == TRUE)
5516*53ee8cc1Swenshuai.xi     {
5517*53ee8cc1Swenshuai.xi         MsOS_SetEvent (XC_Vsync_Event_id, 0x01);
5518*53ee8cc1Swenshuai.xi     }
5519*53ee8cc1Swenshuai.xi }
5520*53ee8cc1Swenshuai.xi 
_MDrv_DMS_MemData_Init(MS_PHY Address,MS_U32 size,EN_XC_DIP_DATA_FMT eDIPWColorFmt)5521*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_MemData_Init(MS_PHY Address, MS_U32 size, EN_XC_DIP_DATA_FMT eDIPWColorFmt)
5522*53ee8cc1Swenshuai.xi {
5523*53ee8cc1Swenshuai.xi     if(eDIPWColorFmt == DIP_DATA_FMT_YUV422)
5524*53ee8cc1Swenshuai.xi     {
5525*53ee8cc1Swenshuai.xi #if 0
5526*53ee8cc1Swenshuai.xi         MApi_GFX_ClearFrameBufferByWord(Address, size, 0x80108010);
5527*53ee8cc1Swenshuai.xi #else
5528*53ee8cc1Swenshuai.xi         //#define TRANSPARENT_YUYV    0x10361097
5529*53ee8cc1Swenshuai.xi         MApi_GFX_ClearFrameBufferByWord(Address, size, DMS_DIP_MULTIVIEW_TRANSPARENT_COLOR);
5530*53ee8cc1Swenshuai.xi 
5531*53ee8cc1Swenshuai.xi         // Enable YUV422 Transparent Color
5532*53ee8cc1Swenshuai.xi         // TODO, wait utopia API ready
5533*53ee8cc1Swenshuai.xi         #if 1
5534*53ee8cc1Swenshuai.xi         if(!(MApi_XC_ReadByte(0x120200 + (GOP_NUM * 0x300))&0x20))
5535*53ee8cc1Swenshuai.xi         {
5536*53ee8cc1Swenshuai.xi             MApi_XC_Write2ByteMask(0x120200 + (GOP_NUM * 0x300), BIT(5), BIT(5));
5537*53ee8cc1Swenshuai.xi             MApi_XC_Write2ByteMask(0x12024C + (GOP_NUM * 0x300), 0x0000, 0xFFFF);
5538*53ee8cc1Swenshuai.xi             MApi_XC_Write2ByteMask(0x12024E + (GOP_NUM * 0x300), 0x00, 0xFF);
5539*53ee8cc1Swenshuai.xi         }
5540*53ee8cc1Swenshuai.xi         #else
5541*53ee8cc1Swenshuai.xi         ST_Transparent_Color stColor = {0};
5542*53ee8cc1Swenshuai.xi 
5543*53ee8cc1Swenshuai.xi         //Data in Dram: (0x36109710)
5544*53ee8cc1Swenshuai.xi         stColor.color = TRANSPARENT_YUYV;
5545*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_SetTransparentClr(1, GOPTRANSCLR_FMT3, &stColor);
5546*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_EnableTransClr(GOPTRANSCLR_FMT3, ENABLE);
5547*53ee8cc1Swenshuai.xi 
5548*53ee8cc1Swenshuai.xi         #endif
5549*53ee8cc1Swenshuai.xi #endif
5550*53ee8cc1Swenshuai.xi     }
5551*53ee8cc1Swenshuai.xi     else
5552*53ee8cc1Swenshuai.xi     {
5553*53ee8cc1Swenshuai.xi         MApi_GFX_ClearFrameBuffer(Address, size, 0x00);
5554*53ee8cc1Swenshuai.xi     }
5555*53ee8cc1Swenshuai.xi 
5556*53ee8cc1Swenshuai.xi     MApi_GFX_FlushQueue();
5557*53ee8cc1Swenshuai.xi     return TRUE;
5558*53ee8cc1Swenshuai.xi }
5559*53ee8cc1Swenshuai.xi 
_MDrv_DMS_OSD_Init(MS_U8 u8GOP,MS_PHY Address,EN_XC_DIP_DATA_FMT eDIPWColorFmt)5560*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_OSD_Init(MS_U8 u8GOP, MS_PHY Address, EN_XC_DIP_DATA_FMT eDIPWColorFmt)
5561*53ee8cc1Swenshuai.xi {
5562*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5563*53ee8cc1Swenshuai.xi     MS_U16 pitch = 0;
5564*53ee8cc1Swenshuai.xi     MS_U16 fbFmt = 0;
5565*53ee8cc1Swenshuai.xi     static MS_U32 fbID;
5566*53ee8cc1Swenshuai.xi 
5567*53ee8cc1Swenshuai.xi     if(RES_DMS.bIsGOPInit == FALSE)
5568*53ee8cc1Swenshuai.xi     {
5569*53ee8cc1Swenshuai.xi         fbID = 0;
5570*53ee8cc1Swenshuai.xi         GOP_InitInfo stGopInit;
5571*53ee8cc1Swenshuai.xi         GFX_Config stGFXcfg;
5572*53ee8cc1Swenshuai.xi         memset(&stGopInit, 0, sizeof(GOP_InitInfo));
5573*53ee8cc1Swenshuai.xi         memset(&stGFXcfg, 0, sizeof(GFX_Config));
5574*53ee8cc1Swenshuai.xi 
5575*53ee8cc1Swenshuai.xi         // -Initial GE
5576*53ee8cc1Swenshuai.xi         stGFXcfg.u8Miu = 0;
5577*53ee8cc1Swenshuai.xi         stGFXcfg.u8Dither = FALSE;
5578*53ee8cc1Swenshuai.xi         stGFXcfg.u32VCmdQSize = 0;
5579*53ee8cc1Swenshuai.xi         stGFXcfg.u32VCmdQAddr = 0;
5580*53ee8cc1Swenshuai.xi 
5581*53ee8cc1Swenshuai.xi         stGFXcfg.bIsCompt = TRUE;
5582*53ee8cc1Swenshuai.xi         stGFXcfg.bIsHK = TRUE;
5583*53ee8cc1Swenshuai.xi         MApi_GFX_Init(&stGFXcfg);
5584*53ee8cc1Swenshuai.xi         DMS_PRINTF("driver GE init ok\n");
5585*53ee8cc1Swenshuai.xi 
5586*53ee8cc1Swenshuai.xi         stGopInit.u16PanelWidth = g_IPanel.Width();
5587*53ee8cc1Swenshuai.xi         stGopInit.u16PanelHeight = g_IPanel.Height();
5588*53ee8cc1Swenshuai.xi         stGopInit.u16PanelHStr = g_IPanel.HStart();
5589*53ee8cc1Swenshuai.xi 
5590*53ee8cc1Swenshuai.xi         MS_U32 u32DIPSize = (DMS_Frame_Buffer_Height * _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, DMS_Frame_Buffer_Width));
5591*53ee8cc1Swenshuai.xi         MS_U32 u32DIPSizeWithDouble = u32DIPSize * 2; //double buffer
5592*53ee8cc1Swenshuai.xi 
5593*53ee8cc1Swenshuai.xi         stGopInit.u32GOPRBAdr = RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP];
5594*53ee8cc1Swenshuai.xi         stGopInit.u32GOPRegdmaAdr = RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP];
5595*53ee8cc1Swenshuai.xi         stGopInit.u32GOPRBLen = (MS_U32)u32DIPSizeWithDouble;
5596*53ee8cc1Swenshuai.xi         stGopInit.u32GOPRegdmaLen = (MS_U32)u32DIPSizeWithDouble;
5597*53ee8cc1Swenshuai.xi         stGopInit.bEnableVsyncIntFlip = FALSE;
5598*53ee8cc1Swenshuai.xi 
5599*53ee8cc1Swenshuai.xi         if( GOP_API_SUCCESS != MApi_GOP_InitByGOP(&stGopInit, u8GOP) )
5600*53ee8cc1Swenshuai.xi         {
5601*53ee8cc1Swenshuai.xi              DMS_PRINTF("[%s][%d] MApi_GOP_Init failed", __FUNCTION__, __LINE__);
5602*53ee8cc1Swenshuai.xi              return FALSE;
5603*53ee8cc1Swenshuai.xi         }
5604*53ee8cc1Swenshuai.xi 
5605*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_SwitchGOP(u8GOP);//use GOP 0
5606*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_EnableTransClr(GOPTRANSCLR_FMT0, FALSE);
5607*53ee8cc1Swenshuai.xi 
5608*53ee8cc1Swenshuai.xi         if(GOP_API_SUCCESS != MApi_GOP_GWIN_SetGOPDst(u8GOP, E_GOP_DST_OP0))
5609*53ee8cc1Swenshuai.xi         {
5610*53ee8cc1Swenshuai.xi              printf("[%s][%d] HD MApi_GOP_GWIN_SetGOPDst failed", __FUNCTION__, __LINE__);
5611*53ee8cc1Swenshuai.xi              return FALSE;
5612*53ee8cc1Swenshuai.xi         }
5613*53ee8cc1Swenshuai.xi 
5614*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_Set_STRETCHWIN(u8GOP, E_GOP_DST_OP0, 0, 0, stGopInit.u16PanelWidth, stGopInit.u16PanelHeight);
5615*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_OutputColor_EX(u8GOP, GOPOUT_YUV);
5616*53ee8cc1Swenshuai.xi 
5617*53ee8cc1Swenshuai.xi         pitch = _DMS_DIP_CalcPitch((EN_XC_DIP_DATA_FMT)eDIPWColorFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
5618*53ee8cc1Swenshuai.xi 
5619*53ee8cc1Swenshuai.xi         switch(eDIPWColorFmt)
5620*53ee8cc1Swenshuai.xi         {
5621*53ee8cc1Swenshuai.xi             case DIP_DATA_FMT_YUV422:
5622*53ee8cc1Swenshuai.xi             default:
5623*53ee8cc1Swenshuai.xi                 fbFmt = E_MS_FMT_YUV422;
5624*53ee8cc1Swenshuai.xi                 break;
5625*53ee8cc1Swenshuai.xi         }
5626*53ee8cc1Swenshuai.xi 
5627*53ee8cc1Swenshuai.xi         if(RES_DMS.u8GOPGWinNum != 0xFF)
5628*53ee8cc1Swenshuai.xi         {
5629*53ee8cc1Swenshuai.xi             MApi_GOP_GWIN_DeleteWin (RES_DMS.u8GOPGWinNum);
5630*53ee8cc1Swenshuai.xi         }
5631*53ee8cc1Swenshuai.xi         //for Kano temporary use
5632*53ee8cc1Swenshuai.xi         MApi_GOP_MIUSel(u8GOP, E_GOP_SEL_MIU0);
5633*53ee8cc1Swenshuai.xi 
5634*53ee8cc1Swenshuai.xi         if(MApi_GOP_GWIN_Create32FBFrom3rdSurf(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight, fbFmt, Address, pitch, &fbID) != GOP_API_SUCCESS)
5635*53ee8cc1Swenshuai.xi         {
5636*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s][%d] DMS, MApi_GOP_GWIN_Create32FBFrom3rdSurf: failed to create FB \n", __FUNCTION__, __LINE__);
5637*53ee8cc1Swenshuai.xi             return FALSE;
5638*53ee8cc1Swenshuai.xi         }
5639*53ee8cc1Swenshuai.xi 
5640*53ee8cc1Swenshuai.xi         RES_DMS.u8GOPGWinNum = MApi_GOP_GWIN_CreateWin_Assign_32FB(u8GOP, fbID, 0, 0);
5641*53ee8cc1Swenshuai.xi 
5642*53ee8cc1Swenshuai.xi         if(_IsGwinAvailable() == FALSE)
5643*53ee8cc1Swenshuai.xi         {
5644*53ee8cc1Swenshuai.xi             return FALSE;
5645*53ee8cc1Swenshuai.xi         }
5646*53ee8cc1Swenshuai.xi 
5647*53ee8cc1Swenshuai.xi         if( fbFmt == E_MS_FMT_ARGB8888 || fbFmt == E_MS_FMT_ARGB4444)
5648*53ee8cc1Swenshuai.xi         {
5649*53ee8cc1Swenshuai.xi             MApi_GOP_GWIN_SetBlending(RES_DMS.u8GOPGWinNum, true, 0xff);
5650*53ee8cc1Swenshuai.xi         }
5651*53ee8cc1Swenshuai.xi         else
5652*53ee8cc1Swenshuai.xi         {
5653*53ee8cc1Swenshuai.xi             MApi_GOP_GWIN_SetBlending(RES_DMS.u8GOPGWinNum, false, 0xff);
5654*53ee8cc1Swenshuai.xi         }
5655*53ee8cc1Swenshuai.xi 
5656*53ee8cc1Swenshuai.xi         RES_DMS.bIsGOPInit = TRUE;
5657*53ee8cc1Swenshuai.xi     }
5658*53ee8cc1Swenshuai.xi     else
5659*53ee8cc1Swenshuai.xi     {
5660*53ee8cc1Swenshuai.xi         MS_U32 u32DIPSizeWithDouble = (DMS_Frame_Buffer_Height * _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, DMS_Frame_Buffer_Width)) * 2;
5661*53ee8cc1Swenshuai.xi         _MDrv_DMS_MemData_Init(RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP], (MS_U32)u32DIPSizeWithDouble, DIP_DATA_FMT_YUV422);
5662*53ee8cc1Swenshuai.xi 
5663*53ee8cc1Swenshuai.xi         pitch = _DMS_DIP_CalcPitch((EN_XC_DIP_DATA_FMT)eDIPWColorFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth);
5664*53ee8cc1Swenshuai.xi 
5665*53ee8cc1Swenshuai.xi         switch(eDIPWColorFmt)
5666*53ee8cc1Swenshuai.xi         {
5667*53ee8cc1Swenshuai.xi             case DIP_DATA_FMT_YUV422:
5668*53ee8cc1Swenshuai.xi             default:
5669*53ee8cc1Swenshuai.xi                 fbFmt = E_MS_FMT_YUV422;
5670*53ee8cc1Swenshuai.xi                 break;
5671*53ee8cc1Swenshuai.xi         }
5672*53ee8cc1Swenshuai.xi 
5673*53ee8cc1Swenshuai.xi         //for Kano temporary use
5674*53ee8cc1Swenshuai.xi         MApi_GOP_MIUSel(u8GOP, E_GOP_SEL_MIU0);
5675*53ee8cc1Swenshuai.xi 
5676*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_SetGWinShared(RES_DMS.u8GOPGWinNum, TRUE);
5677*53ee8cc1Swenshuai.xi 
5678*53ee8cc1Swenshuai.xi         if(MApi_GOP_GWIN_Create32FBFrom3rdSurf(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight, fbFmt, Address, pitch, &fbID) != GOP_API_SUCCESS)
5679*53ee8cc1Swenshuai.xi         {
5680*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s][%d] DMS, MApi_GOP_GWIN_Create32FBbyStaticAddr2: failed to create FB \n", __FUNCTION__, __LINE__);
5681*53ee8cc1Swenshuai.xi             return FALSE;
5682*53ee8cc1Swenshuai.xi         }
5683*53ee8cc1Swenshuai.xi         //Use existing GWin to re-mapping
5684*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_CreateStaticWin_Assign_32FB(RES_DMS.u8GOPGWinNum, u8GOP, fbID, 0, 0);
5685*53ee8cc1Swenshuai.xi 
5686*53ee8cc1Swenshuai.xi         if(_IsGwinAvailable() == FALSE)
5687*53ee8cc1Swenshuai.xi         {
5688*53ee8cc1Swenshuai.xi             return FALSE;
5689*53ee8cc1Swenshuai.xi         }
5690*53ee8cc1Swenshuai.xi 
5691*53ee8cc1Swenshuai.xi         if( fbFmt == E_MS_FMT_ARGB8888 || fbFmt == E_MS_FMT_ARGB4444)
5692*53ee8cc1Swenshuai.xi         {
5693*53ee8cc1Swenshuai.xi             MApi_GOP_GWIN_SetBlending(RES_DMS.u8GOPGWinNum, true, 0xff);
5694*53ee8cc1Swenshuai.xi         }
5695*53ee8cc1Swenshuai.xi         else
5696*53ee8cc1Swenshuai.xi         {
5697*53ee8cc1Swenshuai.xi             MApi_GOP_GWIN_SetBlending(RES_DMS.u8GOPGWinNum, false, 0xff);
5698*53ee8cc1Swenshuai.xi         }
5699*53ee8cc1Swenshuai.xi     }
5700*53ee8cc1Swenshuai.xi 
5701*53ee8cc1Swenshuai.xi     return TRUE;
5702*53ee8cc1Swenshuai.xi }
5703*53ee8cc1Swenshuai.xi 
_MDrv_DMS_ZOrder_Init(void)5704*53ee8cc1Swenshuai.xi static void _MDrv_DMS_ZOrder_Init(void)
5705*53ee8cc1Swenshuai.xi {
5706*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5707*53ee8cc1Swenshuai.xi     MS_U8 u8Window = 0;
5708*53ee8cc1Swenshuai.xi     memset(RES_DMS.WindowZOrder, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM);
5709*53ee8cc1Swenshuai.xi     memset(RES_DMS.WindowScore, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM);
5710*53ee8cc1Swenshuai.xi 
5711*53ee8cc1Swenshuai.xi     for(u8Window = 0; u8Window < DMS_MAX_WINDOW_NUM; u8Window++)
5712*53ee8cc1Swenshuai.xi     {
5713*53ee8cc1Swenshuai.xi         RES_DMS.WindowZOrder[u8Window] = u8Window;
5714*53ee8cc1Swenshuai.xi     }
5715*53ee8cc1Swenshuai.xi }
5716*53ee8cc1Swenshuai.xi 
5717*53ee8cc1Swenshuai.xi #if(DMS_DONT_USE_CMA == 1)
5718*53ee8cc1Swenshuai.xi struct CMA_Pool_Init_Param stDMSCMA_Pool_Init_PARAM[E_DMS_MEMORY_TYPE_MAX];
5719*53ee8cc1Swenshuai.xi #endif
5720*53ee8cc1Swenshuai.xi #define BPP_OF_YUV422 2
5721*53ee8cc1Swenshuai.xi #define BPP_OF_ARGB8888 4
_MDrv_DMS_Setup_CMA(void * pInstance,EN_DMS_MEMORY_TYPE enMemType,MS_U32 u32CMAHeapID,MS_PHY * phyOutAddr)5722*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Setup_CMA(void* pInstance, EN_DMS_MEMORY_TYPE enMemType, MS_U32 u32CMAHeapID, MS_PHY* phyOutAddr)
5723*53ee8cc1Swenshuai.xi {
5724*53ee8cc1Swenshuai.xi #if(DMS_DONT_USE_CMA == 1)
5725*53ee8cc1Swenshuai.xi     /* 1. do CMA_POOL_INIT */
5726*53ee8cc1Swenshuai.xi     stDMSCMA_Pool_Init_PARAM[enMemType].heap_id     = u32CMAHeapID;
5727*53ee8cc1Swenshuai.xi     stDMSCMA_Pool_Init_PARAM[enMemType].flags       = CMA_FLAG_MAP_VMA;
5728*53ee8cc1Swenshuai.xi     if (stDMSCMA_Pool_Init_PARAM[enMemType].heap_id != DMS_INVALID_CMA_HEAP_ID)
5729*53ee8cc1Swenshuai.xi     {
5730*53ee8cc1Swenshuai.xi         MS_BOOL ret = MApi_CMA_Pool_Init(&stDMSCMA_Pool_Init_PARAM[enMemType]);
5731*53ee8cc1Swenshuai.xi         if(ret == FALSE)
5732*53ee8cc1Swenshuai.xi         {
5733*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m   Function = %s, Line = %d, CMA_POOL_INIT ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__);
5734*53ee8cc1Swenshuai.xi             return FALSE;
5735*53ee8cc1Swenshuai.xi         }
5736*53ee8cc1Swenshuai.xi         else
5737*53ee8cc1Swenshuai.xi         {
5738*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m  Function = %s, Line = %d, get pool_handle_id is %u\033[m\n", __PRETTY_FUNCTION__, __LINE__, stDMSCMA_Pool_Init_PARAM[enMemType].pool_handle_id);
5739*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m  Function = %s, Line = %d, get miu is %u\033[m\n", __PRETTY_FUNCTION__,__LINE__, stDMSCMA_Pool_Init_PARAM[enMemType].miu);
5740*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m  Function = %s, Line = %d, get heap_miu_start_offset is 0x%x\033[m\n", __PRETTY_FUNCTION__, __LINE__, (MS_U32)stDMSCMA_Pool_Init_PARAM[enMemType].heap_miu_start_offset);
5741*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[35m  Function = %s, Line = %d, get heap_length is 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, stDMSCMA_Pool_Init_PARAM[enMemType].heap_length);
5742*53ee8cc1Swenshuai.xi         }
5743*53ee8cc1Swenshuai.xi     }
5744*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DMS_Setup_CMA(pInstance,enMemType,stDMSCMA_Pool_Init_PARAM[enMemType].pool_handle_id))
5745*53ee8cc1Swenshuai.xi     {
5746*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[1;31m[%s][%d] error, HAL_DMS_Setup_CMA failed\033[0m\n",__FUNCTION__,__LINE__);
5747*53ee8cc1Swenshuai.xi         return FALSE;
5748*53ee8cc1Swenshuai.xi     }
5749*53ee8cc1Swenshuai.xi     else
5750*53ee8cc1Swenshuai.xi     {
5751*53ee8cc1Swenshuai.xi         *phyOutAddr = stDMSCMA_Pool_Init_PARAM[enMemType].heap_miu_start_offset;
5752*53ee8cc1Swenshuai.xi     }
5753*53ee8cc1Swenshuai.xi #endif
5754*53ee8cc1Swenshuai.xi     return TRUE;
5755*53ee8cc1Swenshuai.xi }
5756*53ee8cc1Swenshuai.xi 
_MDrv_DMS_Setup_Memory(void * pInstance,EN_DMS_MEMORY_TYPE enMemType,MS_PHY phyMemBufferAddr,MS_PHY u32MemBufferSize,MS_U32 u32CMAHeapID)5757*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Setup_Memory(void* pInstance, EN_DMS_MEMORY_TYPE enMemType, MS_PHY phyMemBufferAddr, MS_PHY u32MemBufferSize, MS_U32 u32CMAHeapID)
5758*53ee8cc1Swenshuai.xi {
5759*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
5760*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5761*53ee8cc1Swenshuai.xi     switch(enMemType)
5762*53ee8cc1Swenshuai.xi     {
5763*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_GOP_DISPLAY:
5764*53ee8cc1Swenshuai.xi         {
5765*53ee8cc1Swenshuai.xi             MS_U32 u32DIPSizeWithDouble = 0;
5766*53ee8cc1Swenshuai.xi             if(u32CMAHeapID != DMS_INVALID_CMA_HEAP_ID)
5767*53ee8cc1Swenshuai.xi             {
5768*53ee8cc1Swenshuai.xi                 if(FALSE == _MDrv_DMS_Setup_CMA(pInstance,enMemType,u32CMAHeapID,&phyMemBufferAddr))
5769*53ee8cc1Swenshuai.xi                 {
5770*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, _MDrv_DMS_Setup_CMA failed\033[0m\n",__FUNCTION__,__LINE__);
5771*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5772*53ee8cc1Swenshuai.xi                 }
5773*53ee8cc1Swenshuai.xi                 MS_U32 u32DIPSize = (DMS_Frame_Buffer_Height * _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, DMS_Frame_Buffer_Width));
5774*53ee8cc1Swenshuai.xi                 u32DIPSizeWithDouble = u32DIPSize * 2; //double buffer
5775*53ee8cc1Swenshuai.xi             }
5776*53ee8cc1Swenshuai.xi             else
5777*53ee8cc1Swenshuai.xi             {
5778*53ee8cc1Swenshuai.xi                 MS_PHY phyMaxNeedSize = DMS_Frame_Buffer_Width * DMS_Frame_Buffer_Height * BPP_OF_YUV422 * 2;
5779*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
5780*53ee8cc1Swenshuai.xi                 phyMaxNeedSize += (DMS_Frame_Buffer_Width * DMS_Frame_Buffer_Height * BPP_OF_YUV422);
5781*53ee8cc1Swenshuai.xi #endif
5782*53ee8cc1Swenshuai.xi                 if(phyMaxNeedSize > u32MemBufferSize)
5783*53ee8cc1Swenshuai.xi                 {
5784*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, buffer not enough u32MemBufferSize 0x%tx , need 0x%tx\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32MemBufferSize, (ptrdiff_t)phyMaxNeedSize);
5785*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5786*53ee8cc1Swenshuai.xi                 }
5787*53ee8cc1Swenshuai.xi                 //DIP size
5788*53ee8cc1Swenshuai.xi                 MS_U32 u32DIPSize = (DMS_Frame_Buffer_Height * _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, DMS_Frame_Buffer_Width));
5789*53ee8cc1Swenshuai.xi                 u32DIPSizeWithDouble = u32DIPSize * 2; //double buffer
5790*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
5791*53ee8cc1Swenshuai.xi                 u32DIPSizeWithDouble += u32DIPSize;
5792*53ee8cc1Swenshuai.xi #endif
5793*53ee8cc1Swenshuai.xi             }
5794*53ee8cc1Swenshuai.xi 
5795*53ee8cc1Swenshuai.xi             if(bRet)
5796*53ee8cc1Swenshuai.xi             {
5797*53ee8cc1Swenshuai.xi                 RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP] = phyMemBufferAddr;
5798*53ee8cc1Swenshuai.xi                 _MDrv_DMS_MemData_Init(RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP], (MS_U32)u32DIPSizeWithDouble, DIP_DATA_FMT_YUV422);
5799*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
5800*53ee8cc1Swenshuai.xi                 RES_DMS.u32GEAddress_pa = RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP] + u32DIPSizeWithDouble;
5801*53ee8cc1Swenshuai.xi #endif
5802*53ee8cc1Swenshuai.xi             }
5803*53ee8cc1Swenshuai.xi             break;
5804*53ee8cc1Swenshuai.xi         }
5805*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_FREEZE:
5806*53ee8cc1Swenshuai.xi         {
5807*53ee8cc1Swenshuai.xi             if(u32CMAHeapID != DMS_INVALID_CMA_HEAP_ID)
5808*53ee8cc1Swenshuai.xi             {
5809*53ee8cc1Swenshuai.xi                 if(FALSE == _MDrv_DMS_Setup_CMA(pInstance,enMemType,u32CMAHeapID,&phyMemBufferAddr))
5810*53ee8cc1Swenshuai.xi                 {
5811*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, _MDrv_DMS_Setup_CMA failed\033[0m\n",__FUNCTION__,__LINE__);
5812*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5813*53ee8cc1Swenshuai.xi                 }
5814*53ee8cc1Swenshuai.xi             }
5815*53ee8cc1Swenshuai.xi             else
5816*53ee8cc1Swenshuai.xi             {
5817*53ee8cc1Swenshuai.xi                 MS_PHY phyMaxNeedSize = DMS_FHD_Hszie * DMS_FHD_Vszie * BPP_OF_YUV422;
5818*53ee8cc1Swenshuai.xi                 if(phyMaxNeedSize > u32MemBufferSize)
5819*53ee8cc1Swenshuai.xi                 {
5820*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, buffer not enough u32MemBufferSize 0x%tx , need 0x%tx\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32MemBufferSize, (ptrdiff_t)phyMaxNeedSize);
5821*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5822*53ee8cc1Swenshuai.xi                 }
5823*53ee8cc1Swenshuai.xi             }
5824*53ee8cc1Swenshuai.xi             if(bRet)
5825*53ee8cc1Swenshuai.xi             {
5826*53ee8cc1Swenshuai.xi                 RES_DMS.u32MVOPFreezeAddress_pa = phyMemBufferAddr;
5827*53ee8cc1Swenshuai.xi                 _MDrv_DMS_MemData_Init(RES_DMS.u32MVOPFreezeAddress_pa, (MS_U32)u32MemBufferSize, DIP_DATA_FMT_YUV422);
5828*53ee8cc1Swenshuai.xi             }
5829*53ee8cc1Swenshuai.xi             break;
5830*53ee8cc1Swenshuai.xi         }
5831*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_MVOP_DISPLAY:
5832*53ee8cc1Swenshuai.xi         {
5833*53ee8cc1Swenshuai.xi             if(u32CMAHeapID != DMS_INVALID_CMA_HEAP_ID)
5834*53ee8cc1Swenshuai.xi             {
5835*53ee8cc1Swenshuai.xi                 if(FALSE == _MDrv_DMS_Setup_CMA(pInstance,enMemType,u32CMAHeapID,&phyMemBufferAddr))
5836*53ee8cc1Swenshuai.xi                 {
5837*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, _MDrv_DMS_Setup_CMA failed\033[0m\n",__FUNCTION__,__LINE__);
5838*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5839*53ee8cc1Swenshuai.xi                 }
5840*53ee8cc1Swenshuai.xi             }
5841*53ee8cc1Swenshuai.xi             else
5842*53ee8cc1Swenshuai.xi             {
5843*53ee8cc1Swenshuai.xi                 MS_PHY phyMaxNeedSize = DMS_FHD_Hszie * DMS_FHD_Vszie * BPP_OF_YUV422 * DMS_DI_RING_BUFFER;
5844*53ee8cc1Swenshuai.xi                 if(phyMaxNeedSize > u32MemBufferSize)
5845*53ee8cc1Swenshuai.xi                 {
5846*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, buffer not enough u32MemBufferSize 0x%tx , need 0x%tx\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32MemBufferSize, (ptrdiff_t)phyMaxNeedSize);
5847*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5848*53ee8cc1Swenshuai.xi                 }
5849*53ee8cc1Swenshuai.xi             }
5850*53ee8cc1Swenshuai.xi             if(bRet)
5851*53ee8cc1Swenshuai.xi             {
5852*53ee8cc1Swenshuai.xi                 MS_U32 u32DIPMVOPSize = (RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelHeight * _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth));
5853*53ee8cc1Swenshuai.xi                 MS_U32 u32DIPMVOPSizeWithDouble = u32DIPMVOPSize * DMS_DI_RING_BUFFER; //double buffer
5854*53ee8cc1Swenshuai.xi                 RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_MVOP] = phyMemBufferAddr;
5855*53ee8cc1Swenshuai.xi                 _MDrv_DMS_MemData_Init(RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_MVOP], (MS_U32)u32DIPMVOPSizeWithDouble, DIP_DATA_FMT_YUV422);
5856*53ee8cc1Swenshuai.xi             }
5857*53ee8cc1Swenshuai.xi             break;
5858*53ee8cc1Swenshuai.xi         }
5859*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_DIPDI:
5860*53ee8cc1Swenshuai.xi         {
5861*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_3DDI
5862*53ee8cc1Swenshuai.xi             if(u32CMAHeapID != DMS_INVALID_CMA_HEAP_ID)
5863*53ee8cc1Swenshuai.xi             {
5864*53ee8cc1Swenshuai.xi                 if(FALSE == _MDrv_DMS_Setup_CMA(pInstance,enMemType,u32CMAHeapID,&phyMemBufferAddr))
5865*53ee8cc1Swenshuai.xi                 {
5866*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, _MDrv_DMS_Setup_CMA failed\033[0m\n",__FUNCTION__,__LINE__);
5867*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5868*53ee8cc1Swenshuai.xi                 }
5869*53ee8cc1Swenshuai.xi             }
5870*53ee8cc1Swenshuai.xi             else
5871*53ee8cc1Swenshuai.xi             {
5872*53ee8cc1Swenshuai.xi                 MS_PHY phyMaxNeedSize = (4/2) * DMS_FHD_Hszie * DMS_FHD_Vszie * BPP_OF_ARGB8888;
5873*53ee8cc1Swenshuai.xi                 if(phyMaxNeedSize > u32MemBufferSize)
5874*53ee8cc1Swenshuai.xi                 {
5875*53ee8cc1Swenshuai.xi                     DMS_PRINTF("\033[1;31m[%s][%d] error, buffer not enough u32MemBufferSize 0x%tx , need 0x%tx\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32MemBufferSize, (ptrdiff_t)phyMaxNeedSize);
5876*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5877*53ee8cc1Swenshuai.xi                 }
5878*53ee8cc1Swenshuai.xi             }
5879*53ee8cc1Swenshuai.xi             if(bRet)
5880*53ee8cc1Swenshuai.xi             {
5881*53ee8cc1Swenshuai.xi                 RES_DMSDI.u32DIPDIAddress_pa = phyMemBufferAddr;
5882*53ee8cc1Swenshuai.xi                 _MDrv_DMS_MemData_Init(RES_DMSDI.u32DIPDIAddress_pa, (MS_U32)u32MemBufferSize, DIP_DATA_FMT_YUV422);
5883*53ee8cc1Swenshuai.xi             }
5884*53ee8cc1Swenshuai.xi 
5885*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
5886*53ee8cc1Swenshuai.xi             _MDrv_DMS_DI_Init();
5887*53ee8cc1Swenshuai.xi #endif
5888*53ee8cc1Swenshuai.xi #endif
5889*53ee8cc1Swenshuai.xi             break;
5890*53ee8cc1Swenshuai.xi         }
5891*53ee8cc1Swenshuai.xi         default:
5892*53ee8cc1Swenshuai.xi         {
5893*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[1;31m[%s][%d] unuse mem type %d\033[0m\n",__FUNCTION__,__LINE__,enMemType);
5894*53ee8cc1Swenshuai.xi             break;
5895*53ee8cc1Swenshuai.xi         }
5896*53ee8cc1Swenshuai.xi     }
5897*53ee8cc1Swenshuai.xi     return bRet;
5898*53ee8cc1Swenshuai.xi }
5899*53ee8cc1Swenshuai.xi 
_MDrv_DMS_Init(void * pInstance,MS_U8 u8GOP,EN_DMS_DIP_FMT eDIPWColorFmt,MS_PHY phyMemBufferAddr,MS_U32 u32MemBufferSize)5900*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Init(void* pInstance, MS_U8 u8GOP, EN_DMS_DIP_FMT eDIPWColorFmt, MS_PHY phyMemBufferAddr, MS_U32 u32MemBufferSize)
5901*53ee8cc1Swenshuai.xi {
5902*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
5903*53ee8cc1Swenshuai.xi     if(pDMSResPri->bDrvInit == TRUE)
5904*53ee8cc1Swenshuai.xi     {
5905*53ee8cc1Swenshuai.xi         DMS_PRINTF("Driver has inited!!!!!!!!\n");
5906*53ee8cc1Swenshuai.xi         return TRUE;
5907*53ee8cc1Swenshuai.xi     }
5908*53ee8cc1Swenshuai.xi     // Create Event
5909*53ee8cc1Swenshuai.xi     if(XC_Vsync_Event_id < 0)
5910*53ee8cc1Swenshuai.xi     {
5911*53ee8cc1Swenshuai.xi         XC_Vsync_Event_id = MsOS_CreateEventGroup("DMS_XC_Vsync_Event");
5912*53ee8cc1Swenshuai.xi     }
5913*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
5914*53ee8cc1Swenshuai.xi     // Create  Di Event
5915*53ee8cc1Swenshuai.xi     if(XC_Di_Push_Event_id < 0)
5916*53ee8cc1Swenshuai.xi     {
5917*53ee8cc1Swenshuai.xi         XC_Di_Push_Event_id = MsOS_CreateEventGroup("DMS_XC_Di_Push_Event");
5918*53ee8cc1Swenshuai.xi     }
5919*53ee8cc1Swenshuai.xi #endif
5920*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
5921*53ee8cc1Swenshuai.xi     if(CaptureMode_Event_id < 0)
5922*53ee8cc1Swenshuai.xi     {
5923*53ee8cc1Swenshuai.xi         CaptureMode_Event_id = MsOS_CreateEventGroup("DMS_CaptureMode_Event");
5924*53ee8cc1Swenshuai.xi     }
5925*53ee8cc1Swenshuai.xi #endif
5926*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_IMI
5927*53ee8cc1Swenshuai.xi     if(StartFRC_Event_id < 0)
5928*53ee8cc1Swenshuai.xi     {
5929*53ee8cc1Swenshuai.xi         StartFRC_Event_id = MsOS_CreateEventGroup("DMS_IMI_StartFRC_Event");
5930*53ee8cc1Swenshuai.xi     }
5931*53ee8cc1Swenshuai.xi #endif
5932*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
5933*53ee8cc1Swenshuai.xi      // create MVOP event
5934*53ee8cc1Swenshuai.xi      if(s32MVOP_Event_id < 0)
5935*53ee8cc1Swenshuai.xi     {
5936*53ee8cc1Swenshuai.xi         s32MVOP_Event_id = MsOS_CreateEventGroup("DMS_MVOP_Event");
5937*53ee8cc1Swenshuai.xi     }
5938*53ee8cc1Swenshuai.xi     // create Disable Bob Mode event
5939*53ee8cc1Swenshuai.xi     if(s32DisableBob_Event_id < 0)
5940*53ee8cc1Swenshuai.xi     {
5941*53ee8cc1Swenshuai.xi         s32DisableBob_Event_id = MsOS_CreateEventGroup("DMS_DisableBob_Event");
5942*53ee8cc1Swenshuai.xi     }
5943*53ee8cc1Swenshuai.xi #endif
5944*53ee8cc1Swenshuai.xi     // inital DIP
5945*53ee8cc1Swenshuai.xi     MApi_XC_DIP_InitByDIP(DIP_WINDOW);
5946*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnaInt(0xFF, FALSE, DIP_WINDOW);
5947*53ee8cc1Swenshuai.xi 
5948*53ee8cc1Swenshuai.xi     MApi_XC_DIP_InitByDIP(DWIN0_WINDOW);
5949*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnaInt(0xFF, FALSE, DWIN0_WINDOW);
5950*53ee8cc1Swenshuai.xi 
5951*53ee8cc1Swenshuai.xi     MApi_XC_DIP_InitByDIP(DWIN1_WINDOW);
5952*53ee8cc1Swenshuai.xi     MApi_XC_DIP_EnaInt(0xFF, FALSE, DWIN1_WINDOW);
5953*53ee8cc1Swenshuai.xi 
5954*53ee8cc1Swenshuai.xi     // Store DIP need data
5955*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt = (EN_XC_DIP_DATA_FMT)eDIPWColorFmt;
5956*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth = g_IPanel.Width();
5957*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight = g_IPanel.Height();
5958*53ee8cc1Swenshuai.xi 
5959*53ee8cc1Swenshuai.xi     // Store DIP to MVOP need Data (force value)
5960*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].eDIPWFmt = (EN_XC_DIP_DATA_FMT)eDIPWColorFmt;
5961*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelWidth = DMS_FHD_Hszie;
5962*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_MVOP].u32PanelHeight = DMS_FHD_Vszie;
5963*53ee8cc1Swenshuai.xi 
5964*53ee8cc1Swenshuai.xi     MApi_XC_DIP_SetOutputDataFmt(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, DMS_DIPWindow_NORMAL);
5965*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt == E_DMS_DIP_FMT_YUV422)
5966*53ee8cc1Swenshuai.xi     {
5967*53ee8cc1Swenshuai.xi         MApi_XC_DIP_SwapUV(TRUE ,DMS_DIPWindow_NORMAL);
5968*53ee8cc1Swenshuai.xi     }
5969*53ee8cc1Swenshuai.xi 
5970*53ee8cc1Swenshuai.xi     // Attach ISR and Set STB_DISP_IRQ
5971*53ee8cc1Swenshuai.xi     MApi_XC_InterruptAttach(SC_INT_VSINT, _DMS_EmbedXCISR, NULL);
5972*53ee8cc1Swenshuai.xi 
5973*53ee8cc1Swenshuai.xi     // Clear VDEC info
5974*53ee8cc1Swenshuai.xi     memset(RES_DMS._stXC_DIPPushInfo, 0x0, sizeof(DMS_VDECFRAME_INFO)*DMS_DIP_QUEUEDEPTH);
5975*53ee8cc1Swenshuai.xi     memset(&RES_DMS._stXC_DIPWriteReadPointer, 0x0, sizeof(DMS_DIPWriteReadPointer));
5976*53ee8cc1Swenshuai.xi     memset(RES_DMS._stXC_DIPWinInfo, 0x0, sizeof(DMS_DIPWIN_INFO)*DMS_MAX_WINDOW_NUM);
5977*53ee8cc1Swenshuai.xi     memset(RES_DMS.u32WindowFrameRate, 0x0, sizeof(RES_DMS.u32WindowFrameRate));
5978*53ee8cc1Swenshuai.xi 
5979*53ee8cc1Swenshuai.xi     _MDrv_DMS_ZOrder_Init();
5980*53ee8cc1Swenshuai.xi 
5981*53ee8cc1Swenshuai.xi     pTaskInstance = pInstance;
5982*53ee8cc1Swenshuai.xi     _MDrv_DMS_CreateTask();
5983*53ee8cc1Swenshuai.xi 
5984*53ee8cc1Swenshuai.xi     _MDrv_DMS_InvalidateAllQueue();
5985*53ee8cc1Swenshuai.xi 
5986*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
5987*53ee8cc1Swenshuai.xi     memset(&RES_DMSDI._stXC_DIPWriteReadPointerInterlace, 0x0, sizeof(DMS_DIPWriteReadPointer));
5988*53ee8cc1Swenshuai.xi #endif
5989*53ee8cc1Swenshuai.xi 
5990*53ee8cc1Swenshuai.xi     if(DMS_MVOP_FLOW)
5991*53ee8cc1Swenshuai.xi     {
5992*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(MVOP_WINDOW, DMS_XC_BLACK_SCREEN_BY_WINUSED | DMS_XC_NO_FRAME | DMS_XC_FIRST_TIME_SETWINDOW);
5993*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
5994*53ee8cc1Swenshuai.xi         //set MVOP config
5995*53ee8cc1Swenshuai.xi         _DMS_MVOP_SetConfig(MVOP_INPUT_DRAM,TRUE,0);
5996*53ee8cc1Swenshuai.xi 
5997*53ee8cc1Swenshuai.xi         _DMS_XC_SetConnect(INPUT_SOURCE_DTV);
5998*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(TRUE);
5999*53ee8cc1Swenshuai.xi #endif
6000*53ee8cc1Swenshuai.xi         RES_DMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_FROM_VDEC;
6001*53ee8cc1Swenshuai.xi     }
6002*53ee8cc1Swenshuai.xi     pDMSResPri->bDrvInit = TRUE;
6003*53ee8cc1Swenshuai.xi 
6004*53ee8cc1Swenshuai.xi     return TRUE;
6005*53ee8cc1Swenshuai.xi }
6006*53ee8cc1Swenshuai.xi 
_DMS_Regen_CropWindow(MS_U16 u16NewSrcWidth,MS_U16 u16NewSrcHeight)6007*53ee8cc1Swenshuai.xi static void _DMS_Regen_CropWindow(MS_U16 u16NewSrcWidth, MS_U16 u16NewSrcHeight)
6008*53ee8cc1Swenshuai.xi {
6009*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6010*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW* pstSrcCropWin = &RES_DMS._stXC_XCCropWinInfo_raw;
6011*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW stCropWin;
6012*53ee8cc1Swenshuai.xi     stCropWin.u32x = pstSrcCropWin->u32x * u16NewSrcWidth/ RES_DMS.u16FirstSrcWidth;
6013*53ee8cc1Swenshuai.xi     stCropWin.u32width = pstSrcCropWin->u32width * u16NewSrcWidth / RES_DMS.u16FirstSrcWidth;
6014*53ee8cc1Swenshuai.xi     stCropWin.u32y = pstSrcCropWin->u32y * u16NewSrcHeight / RES_DMS.u16FirstSrcHeight;
6015*53ee8cc1Swenshuai.xi     stCropWin.u32height = pstSrcCropWin->u32height * u16NewSrcHeight / RES_DMS.u16FirstSrcHeight;
6016*53ee8cc1Swenshuai.xi     _DMS_XC_WindowAlignto2(&stCropWin);
6017*53ee8cc1Swenshuai.xi     DMS_PRINTF("new crop size:%td %td, user crop size:%td %td, src is: %d %d, base on: %d %d\n",
6018*53ee8cc1Swenshuai.xi         (ptrdiff_t)stCropWin.u32width,(ptrdiff_t)stCropWin.u32height,
6019*53ee8cc1Swenshuai.xi         (ptrdiff_t)RES_DMS._stXC_XCCropWinInfo_raw.u32width,(ptrdiff_t)RES_DMS._stXC_XCCropWinInfo_raw.u32height,
6020*53ee8cc1Swenshuai.xi         u16NewSrcWidth,u16NewSrcHeight,RES_DMS.u16FirstSrcWidth,RES_DMS.u16FirstSrcHeight);
6021*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stCropWin,&stCropWin,sizeof(stCropWin));
6022*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_XCCropWinInfo_DoubleBuffer,&stCropWin,sizeof(stCropWin));
6023*53ee8cc1Swenshuai.xi }
6024*53ee8cc1Swenshuai.xi 
_DMS_Clear_VDEC_Frame_Ref(MS_U32 u32Window,MS_U16 u16BufID)6025*53ee8cc1Swenshuai.xi static void _DMS_Clear_VDEC_Frame_Ref(MS_U32 u32Window, MS_U16 u16BufID)
6026*53ee8cc1Swenshuai.xi {
6027*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6028*53ee8cc1Swenshuai.xi     MS_U8 u8RefCounter = 0;
6029*53ee8cc1Swenshuai.xi     for(u8RefCounter = 0; u8RefCounter < RES_DMS._stXC_LocalFrameRefCount[u32Window][u16BufID]; u8RefCounter++)
6030*53ee8cc1Swenshuai.xi     {
6031*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %td release frame for WP %d ct %d\n",__FUNCTION__,(ptrdiff_t)u32Window,u16BufID,(u8RefCounter+1));
6032*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_Release(u32Window,u16BufID);
6033*53ee8cc1Swenshuai.xi     }
6034*53ee8cc1Swenshuai.xi }
6035*53ee8cc1Swenshuai.xi 
_DMS_StoreVDECInfo2DIPQueue(void * pInstance,DMS_VDECFRAME_INFO * VDECDispFrame)6036*53ee8cc1Swenshuai.xi static void _DMS_StoreVDECInfo2DIPQueue(void* pInstance, DMS_VDECFRAME_INFO *VDECDispFrame)
6037*53ee8cc1Swenshuai.xi {
6038*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6039*53ee8cc1Swenshuai.xi     MS_U16 u16NextWritePointer = 0;
6040*53ee8cc1Swenshuai.xi     MS_U32 u32Window = VDECDispFrame->u32Window;
6041*53ee8cc1Swenshuai.xi     MS_U16 u16RP = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16ReadPointer;
6042*53ee8cc1Swenshuai.xi 
6043*53ee8cc1Swenshuai.xi     //Jump to Next Write Pointer
6044*53ee8cc1Swenshuai.xi     u16NextWritePointer = _GetNextWritePointer(u32Window);
6045*53ee8cc1Swenshuai.xi     //DMS_PRINTF("=====PUSH Frame=%d====",u16NextWritePointer);
6046*53ee8cc1Swenshuai.xi 
6047*53ee8cc1Swenshuai.xi     while(_GetNextBufferID(u16NextWritePointer) == u16RP)
6048*53ee8cc1Swenshuai.xi     {
6049*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6050*53ee8cc1Swenshuai.xi         //DMS_PRINTF("\033[31m [%s] window %d Force block flip when Read Write Diff < 2 (%d) \033[0m\n",__FUNCTION__, u32Window, u16RP);
6051*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
6052*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6053*53ee8cc1Swenshuai.xi         u16RP = RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16ReadPointer;
6054*53ee8cc1Swenshuai.xi     }
6055*53ee8cc1Swenshuai.xi 
6056*53ee8cc1Swenshuai.xi #if NEW_FLIP
6057*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32FrameIndex != DMS_INVALID_FRAME_ID)
6058*53ee8cc1Swenshuai.xi     {
6059*53ee8cc1Swenshuai.xi         if(DEV_NEW_NEXT == 0)
6060*53ee8cc1Swenshuai.xi         {
6061*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bValid == TRUE)
6062*53ee8cc1Swenshuai.xi             {
6063*53ee8cc1Swenshuai.xi                 //VDEC push too fast
6064*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] (Window, Buffer) (%td, %d) valid check ring back, Time %td \n",__FUNCTION__, (ptrdiff_t)u32Window, u16NextWritePointer, (ptrdiff_t)MsOS_GetSystemTime());
6065*53ee8cc1Swenshuai.xi                 _DMS_Clear_VDEC_Frame_Ref(u32Window,u16NextWritePointer);
6066*53ee8cc1Swenshuai.xi             }
6067*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_LocalFrameRefCount[u32Window][u16NextWritePointer] > 0)
6068*53ee8cc1Swenshuai.xi             {
6069*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s] LocalFrameRefCount check ring back\n",__FUNCTION__);
6070*53ee8cc1Swenshuai.xi                 _DMS_Clear_VDEC_Frame_Ref(u32Window,u16NextWritePointer);
6071*53ee8cc1Swenshuai.xi             }
6072*53ee8cc1Swenshuai.xi         }
6073*53ee8cc1Swenshuai.xi         else
6074*53ee8cc1Swenshuai.xi         {
6075*53ee8cc1Swenshuai.xi             while(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bValid == TRUE)
6076*53ee8cc1Swenshuai.xi             {
6077*53ee8cc1Swenshuai.xi                 MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6078*53ee8cc1Swenshuai.xi                 //DMS_PRINTF("[%s] win %d, Force block flip when bValid\n",__FUNCTION__, u32Window);
6079*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(1);
6080*53ee8cc1Swenshuai.xi                 MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6081*53ee8cc1Swenshuai.xi             }
6082*53ee8cc1Swenshuai.xi         }
6083*53ee8cc1Swenshuai.xi     }
6084*53ee8cc1Swenshuai.xi #endif
6085*53ee8cc1Swenshuai.xi 
6086*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
6087*53ee8cc1Swenshuai.xi     if((_DMS_Is_MVOPFlow(u32Window) == FALSE) && _DMS_IsCaptureWindowEnable(u32Window))
6088*53ee8cc1Swenshuai.xi     {
6089*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].u32Visible == FALSE)
6090*53ee8cc1Swenshuai.xi         {
6091*53ee8cc1Swenshuai.xi             // case: full speed decode
6092*53ee8cc1Swenshuai.xi             MS_U16 u16Prev = u16NextWritePointer;
6093*53ee8cc1Swenshuai.xi             u16Prev = _GetPreviousBufferID(u16Prev);
6094*53ee8cc1Swenshuai.xi             u16Prev = _GetPreviousBufferID(u16Prev);
6095*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[u32Window][u16Prev].bValid == TRUE)
6096*53ee8cc1Swenshuai.xi             {
6097*53ee8cc1Swenshuai.xi                 //DMS_PRINTF("\033[32m [%s] (Window, Buffer) (%d, %d) clear prev 2, Time %d \033[0m\n",__FUNCTION__, u32Window, u16Prev, MsOS_GetSystemTime());
6098*53ee8cc1Swenshuai.xi                 _DMS_Clear_VDEC_Frame_Ref(u32Window,u16Prev);
6099*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16Prev].bValid = FALSE;
6100*53ee8cc1Swenshuai.xi             }
6101*53ee8cc1Swenshuai.xi         }
6102*53ee8cc1Swenshuai.xi     }
6103*53ee8cc1Swenshuai.xi #endif
6104*53ee8cc1Swenshuai.xi 
6105*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer], VDECDispFrame, sizeof(DMS_VDECFRAME_INFO));
6106*53ee8cc1Swenshuai.xi 
6107*53ee8cc1Swenshuai.xi     // New Flip
6108*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32FrameIndex = VDECDispFrame->u32FrameIndex;
6109*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32VDECStreamID = VDECDispFrame->u32VDECStreamID;
6110*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32VDECStreamVersion = VDECDispFrame->u32VDECStreamVersion;
6111*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32PriData = VDECDispFrame->u32PriData;
6112*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u64Pts = VDECDispFrame->u64Pts;
6113*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eScanType = VDECDispFrame->eScanType;
6114*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eScanType))
6115*53ee8cc1Swenshuai.xi     {
6116*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32FrameIndex_2nd = VDECDispFrame->u32FrameIndex_2nd;
6117*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32PriData_2nd = VDECDispFrame->u32PriData_2nd;
6118*53ee8cc1Swenshuai.xi     }
6119*53ee8cc1Swenshuai.xi     _DMS_VDEC_Frame_AddRef(u32Window,u16NextWritePointer);
6120*53ee8cc1Swenshuai.xi 
6121*53ee8cc1Swenshuai.xi #if DMS_DIP_Support_IMI
6122*53ee8cc1Swenshuai.xi     if(_DMS_IsCaptureWindowEnable(u32Window))
6123*53ee8cc1Swenshuai.xi     {
6124*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE.bIsFrameValid[u32Window][u16NextWritePointer] = TRUE;
6125*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_AddRef_CaptureMode(u32Window,u16NextWritePointer);
6126*53ee8cc1Swenshuai.xi         printf("\033[32m [%d] === win[%td], buf[%d]: %td === \033[0m\n",__LINE__,(ptrdiff_t)u32Window,u16NextWritePointer,(ptrdiff_t)MsOS_GetSystemTime());
6127*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u32Window].u16WritePointer = u16NextWritePointer;
6128*53ee8cc1Swenshuai.xi     }
6129*53ee8cc1Swenshuai.xi 
6130*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32Window].bStartGetCapture == TRUE)
6131*53ee8cc1Swenshuai.xi     {
6132*53ee8cc1Swenshuai.xi         if(_DMS_TriggerToCaptureFrame(pInstance, u32Window) && (RES_DMSCAPTURE._stXC_IMICaptureInfo[u32Window].bFirstCapFrame == FALSE))
6133*53ee8cc1Swenshuai.xi         {
6134*53ee8cc1Swenshuai.xi             MsOS_SetEvent(StartFRC_Event_id, BIT(u32Window));
6135*53ee8cc1Swenshuai.xi         }
6136*53ee8cc1Swenshuai.xi     }
6137*53ee8cc1Swenshuai.xi     else
6138*53ee8cc1Swenshuai.xi     {
6139*53ee8cc1Swenshuai.xi         MS_U16 u16Prev = u16NextWritePointer;
6140*53ee8cc1Swenshuai.xi         MS_U8 i;
6141*53ee8cc1Swenshuai.xi         for(i = 0 ; i < (START_FRC_ACCUMULE_FRAME_COUNT-1); i++)
6142*53ee8cc1Swenshuai.xi         {
6143*53ee8cc1Swenshuai.xi             u16Prev = _GetPreviousBufferID(u16Prev);
6144*53ee8cc1Swenshuai.xi         }
6145*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE.bIsFrameValid[u32Window][u16Prev])
6146*53ee8cc1Swenshuai.xi         {
6147*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[32m [%s] IMI flow, win %td, clear prev 2 (buf: %d) \033[0m\n",__FUNCTION__, (ptrdiff_t)u32Window, u16Prev);
6148*53ee8cc1Swenshuai.xi             _DMS_VDEC_Frame_Release_CaptureMode(u32Window, u16Prev);
6149*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE.bIsFrameValid[u32Window][u16Prev] = FALSE;
6150*53ee8cc1Swenshuai.xi         }
6151*53ee8cc1Swenshuai.xi     }
6152*53ee8cc1Swenshuai.xi #else
6153*53ee8cc1Swenshuai.xi     if(_DMS_IsCaptureWindowEnable(u32Window))
6154*53ee8cc1Swenshuai.xi     {
6155*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE.bIsFrameValid[u32Window][u16NextWritePointer] = TRUE;
6156*53ee8cc1Swenshuai.xi         _DMS_VDEC_Frame_AddRef_CaptureMode(u32Window,u16NextWritePointer);
6157*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u32Window].u16WritePointer = u16NextWritePointer;
6158*53ee8cc1Swenshuai.xi         //printf("u16WritePointer (%d, %d)", u32Window, RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u32Window].u16WritePointer);
6159*53ee8cc1Swenshuai.xi         if(_DMS_TriggerToCaptureFrame(pInstance, u32Window))
6160*53ee8cc1Swenshuai.xi         {
6161*53ee8cc1Swenshuai.xi             printf("\033[33m setEvent %d, time %d \033[0m\n", BIT(u32Window), MsOS_GetSystemTime());
6162*53ee8cc1Swenshuai.xi             MsOS_SetEvent(CaptureMode_Event_id, BIT(u32Window));
6163*53ee8cc1Swenshuai.xi         }
6164*53ee8cc1Swenshuai.xi     }
6165*53ee8cc1Swenshuai.xi #endif
6166*53ee8cc1Swenshuai.xi     sync_print("#### Push %d ####",u16NextWritePointer);
6167*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bValid= TRUE;
6168*53ee8cc1Swenshuai.xi     //printf("\033[1;31m[%d] Push to Main %d, RBID %d\033[0m\n",MsOS_GetSystemTime(),u16NextWritePointer, VDECDispFrame->u8DiOutputRingBufferID);
6169*53ee8cc1Swenshuai.xi 
6170*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcWidth = VDECDispFrame->u16SrcWidth - VDECDispFrame->u16CropLeft - VDECDispFrame->u16CropRight;
6171*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcHeight = VDECDispFrame->u16SrcHeight - VDECDispFrame->u16CropTop - VDECDispFrame->u16CropBottom;
6172*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcPitch = VDECDispFrame->u16SrcPitch;
6173*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr = VDECDispFrame->u32SrcLumaAddr;
6174*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr = VDECDispFrame->u32SrcChromaAddr;
6175*53ee8cc1Swenshuai.xi 
6176*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32FrameRate = VDECDispFrame->u32FrameRate;
6177*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFmt = VDECDispFrame->eFmt;
6178*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32Window = VDECDispFrame->u32Window;
6179*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eCODEC = VDECDispFrame->eCODEC;
6180*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldOrderType = VDECDispFrame->eFieldOrderType;
6181*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldType = VDECDispFrame->eFieldType;
6182*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eTileMode = VDECDispFrame->eTileMode;
6183*53ee8cc1Swenshuai.xi 
6184*53ee8cc1Swenshuai.xi     if(_DMS_Is_SourceFieldBaseInterlace(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eScanType))
6185*53ee8cc1Swenshuai.xi     {
6186*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32FrameIndex_2nd = VDECDispFrame->u32FrameIndex_2nd;
6187*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32PriData_2nd = VDECDispFrame->u32PriData_2nd;
6188*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcLumaAddrI = VDECDispFrame->u32SrcLumaAddrI;
6189*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcChromaAddrI = VDECDispFrame->u32SrcChromaAddrI;
6190*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldOrderType == E_DMS_VIDEO_FIELD_ORDER_TYPE_TOP)
6191*53ee8cc1Swenshuai.xi         {
6192*53ee8cc1Swenshuai.xi             if(VDECDispFrame->bIs2ndField == TRUE)
6193*53ee8cc1Swenshuai.xi             {
6194*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldType = E_DMS_VIDEO_FIELD_TYPE_BOTTOM;
6195*53ee8cc1Swenshuai.xi             }
6196*53ee8cc1Swenshuai.xi             else
6197*53ee8cc1Swenshuai.xi             {
6198*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldType = E_DMS_VIDEO_FIELD_TYPE_TOP;
6199*53ee8cc1Swenshuai.xi             }
6200*53ee8cc1Swenshuai.xi         }
6201*53ee8cc1Swenshuai.xi         else
6202*53ee8cc1Swenshuai.xi         {
6203*53ee8cc1Swenshuai.xi             if(VDECDispFrame->bIs2ndField == TRUE)
6204*53ee8cc1Swenshuai.xi             {
6205*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldType = E_DMS_VIDEO_FIELD_TYPE_TOP;
6206*53ee8cc1Swenshuai.xi             }
6207*53ee8cc1Swenshuai.xi             else
6208*53ee8cc1Swenshuai.xi             {
6209*53ee8cc1Swenshuai.xi                 RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eFieldType = E_DMS_VIDEO_FIELD_TYPE_BOTTOM;
6210*53ee8cc1Swenshuai.xi             }
6211*53ee8cc1Swenshuai.xi         }
6212*53ee8cc1Swenshuai.xi     }
6213*53ee8cc1Swenshuai.xi 
6214*53ee8cc1Swenshuai.xi     // MFDec info
6215*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.bMFDec_Enable = VDECDispFrame->stMFdecInfo.bMFDec_Enable;
6216*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
6217*53ee8cc1Swenshuai.xi     if(u32Window == MVOP_WINDOW)
6218*53ee8cc1Swenshuai.xi     {
6219*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.u8MFDec_Select = 0;
6220*53ee8cc1Swenshuai.xi     }
6221*53ee8cc1Swenshuai.xi     else
6222*53ee8cc1Swenshuai.xi #endif
6223*53ee8cc1Swenshuai.xi     {
6224*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.u8MFDec_Select = VDECDispFrame->stMFdecInfo.u8MFDec_Select;
6225*53ee8cc1Swenshuai.xi     }
6226*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.bUncompress_mode = VDECDispFrame->stMFdecInfo.bUncompress_mode;
6227*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.bBypass_codec_mode = VDECDispFrame->stMFdecInfo.bBypass_codec_mode;
6228*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.en_MFDecVP9_mode = VDECDispFrame->stMFdecInfo.en_MFDecVP9_mode;
6229*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.u16StartX = VDECDispFrame->stMFdecInfo.u16StartX;
6230*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.u16StartY = VDECDispFrame->stMFdecInfo.u16StartY;
6231*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.phyBitlen_Base = VDECDispFrame->stMFdecInfo.phyBitlen_Base;
6232*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].stMFdecInfo.u16Bitlen_Pitch = VDECDispFrame->stMFdecInfo.u16Bitlen_Pitch;
6233*53ee8cc1Swenshuai.xi     // 10 bits
6234*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].b10bitData = VDECDispFrame->b10bitData;
6235*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16Src10bitPitch = VDECDispFrame->u16Src10bitPitch;
6236*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcLumaAddr_2bit = VDECDispFrame->u32SrcLumaAddr_2bit;
6237*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u32SrcChromaAddr_2bit = VDECDispFrame->u32SrcChromaAddr_2bit;
6238*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u8LumaBitdepth = VDECDispFrame->u8LumaBitdepth;
6239*53ee8cc1Swenshuai.xi 
6240*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bIsAfterDiTask = VDECDispFrame->bIsAfterDiTask;
6241*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bIs2ndField = VDECDispFrame->bIs2ndField;
6242*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u8DiOutputRingBufferID = VDECDispFrame->u8DiOutputRingBufferID;
6243*53ee8cc1Swenshuai.xi 
6244*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWriteReadPointer[u32Window].u16WritePointer = u16NextWritePointer;
6245*53ee8cc1Swenshuai.xi     RES_DMS.u32WindowFrameRate[u32Window] = VDECDispFrame->u32FrameRate/1000;
6246*53ee8cc1Swenshuai.xi 
6247*53ee8cc1Swenshuai.xi     //2nd buffer
6248*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].phySrc2ndBufferLumaAddr = VDECDispFrame->phySrc2ndBufferLumaAddr;
6249*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].phySrc2ndBufferChromaAddr = VDECDispFrame->phySrc2ndBufferChromaAddr;
6250*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16Src2ndBufferPitch = VDECDispFrame->u16Src2ndBufferPitch;
6251*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u8Src2ndBufferV7DataValid = VDECDispFrame->u8Src2ndBufferV7DataValid;
6252*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16Src2ndBufferWidth = VDECDispFrame->u16Src2ndBufferWidth;
6253*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16Src2ndBufferHeight = VDECDispFrame->u16Src2ndBufferHeight;
6254*53ee8cc1Swenshuai.xi 
6255*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u8FieldCtrl = VDECDispFrame->u8FieldCtrl;
6256*53ee8cc1Swenshuai.xi 
6257*53ee8cc1Swenshuai.xi 
6258*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
6259*53ee8cc1Swenshuai.xi     if(u32Window == MVOP_WINDOW)
6260*53ee8cc1Swenshuai.xi     {
6261*53ee8cc1Swenshuai.xi         RES_DMS.u32ReleaseState[u16NextWritePointer] = 0;
6262*53ee8cc1Swenshuai.xi     }
6263*53ee8cc1Swenshuai.xi #endif
6264*53ee8cc1Swenshuai.xi 
6265*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
6266*53ee8cc1Swenshuai.xi     {
6267*53ee8cc1Swenshuai.xi         if(_DMS_Query_XC_Status(u32Window, DMS_XC_NO_FRAME))
6268*53ee8cc1Swenshuai.xi         {
6269*53ee8cc1Swenshuai.xi             _DMS_Remove_XC_Status(u32Window, DMS_XC_NO_FRAME);
6270*53ee8cc1Swenshuai.xi             RES_DMS.u16FirstSrcWidth = RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcWidth;
6271*53ee8cc1Swenshuai.xi             RES_DMS.u16FirstSrcHeight = RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcHeight;
6272*53ee8cc1Swenshuai.xi         }
6273*53ee8cc1Swenshuai.xi         else //if(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].bIsAfterDiTask == FALSE)
6274*53ee8cc1Swenshuai.xi         {
6275*53ee8cc1Swenshuai.xi             MS_U16 u16PreID = _GetPreviousWritePointer(u32Window);
6276*53ee8cc1Swenshuai.xi             if(RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].eScanType != RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eScanType)
6277*53ee8cc1Swenshuai.xi             {
6278*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[1;35m###[%s][%d][%td]### SeqChange (eScanType change %d -> %d) !!!!!!\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)MsOS_GetSystemTime(),RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].eScanType,RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].eScanType);
6279*53ee8cc1Swenshuai.xi                 _DMS_Add_XC_Status(u32Window, DMS_XC_SEQ_CHANGE_PI);
6280*53ee8cc1Swenshuai.xi                 RES_DMS.gu8DMS_Seq_Change_ID = u16NextWritePointer;
6281*53ee8cc1Swenshuai.xi             }
6282*53ee8cc1Swenshuai.xi 
6283*53ee8cc1Swenshuai.xi             if((RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].u16SrcWidth != RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcWidth) ||
6284*53ee8cc1Swenshuai.xi                 (RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].u16SrcHeight != RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcHeight))
6285*53ee8cc1Swenshuai.xi             {
6286*53ee8cc1Swenshuai.xi                 DMS_PRINTF("\033[1;35m###[%s][%d][%td]### SeqChange at WP:%d (Size change (%d,%d) -> (%d,%d)) !!!!!!\033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)MsOS_GetSystemTime(),u16NextWritePointer,RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16PreID].u16SrcHeight,RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcWidth,RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcHeight);
6287*53ee8cc1Swenshuai.xi                 _DMS_Add_XC_Status(u32Window, DMS_XC_SEQ_CHANGE_SIZE);
6288*53ee8cc1Swenshuai.xi                 RES_DMS.gu8DMS_Seq_Change_ID = u16NextWritePointer;
6289*53ee8cc1Swenshuai.xi                 printf("\033[1;35m###[%s][%d][%td]### %d %d %d %d %d %d !!!!!!\033[0m\n",__FUNCTION__,__LINE__,
6290*53ee8cc1Swenshuai.xi                     (ptrdiff_t)MsOS_GetSystemTime(),
6291*53ee8cc1Swenshuai.xi                     VDECDispFrame->u16SrcWidth, VDECDispFrame->u16SrcHeight,
6292*53ee8cc1Swenshuai.xi                     VDECDispFrame->u16CropLeft, VDECDispFrame->u16CropRight,
6293*53ee8cc1Swenshuai.xi                     VDECDispFrame->u16CropTop, VDECDispFrame->u16CropBottom);
6294*53ee8cc1Swenshuai.xi 
6295*53ee8cc1Swenshuai.xi                 _DMS_Regen_CropWindow(RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcWidth,
6296*53ee8cc1Swenshuai.xi                     RES_DMS._stXC_DIPPushInfo[u32Window][u16NextWritePointer].u16SrcHeight);
6297*53ee8cc1Swenshuai.xi             }
6298*53ee8cc1Swenshuai.xi 
6299*53ee8cc1Swenshuai.xi         }
6300*53ee8cc1Swenshuai.xi     }
6301*53ee8cc1Swenshuai.xi     //DMS_PRINTF("scan %d, fieldType %d, fieldOrderType %d, LAddr : 0x%llx, CAddr : 0x%llx\n",VDECDispFrame->eScanType,VDECDispFrame->eFieldType,VDECDispFrame->eFieldOrderType,
6302*53ee8cc1Swenshuai.xi     //    VDECDispFrame->u32SrcLumaAddr,VDECDispFrame->u32SrcChromaAddr);
6303*53ee8cc1Swenshuai.xi 
6304*53ee8cc1Swenshuai.xi }
6305*53ee8cc1Swenshuai.xi 
_CalculateMaxOutputFrameRate(void)6306*53ee8cc1Swenshuai.xi static void _CalculateMaxOutputFrameRate(void)
6307*53ee8cc1Swenshuai.xi {
6308*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6309*53ee8cc1Swenshuai.xi     MS_U16 u16OutVFreq = g_IPanel.DefaultVFreq() /10;
6310*53ee8cc1Swenshuai.xi     //if(RES_DMS.u8EnableWindowCount == 0)
6311*53ee8cc1Swenshuai.xi     if(RES_DMS.u8UseDIPWindowCount == 0)
6312*53ee8cc1Swenshuai.xi     {
6313*53ee8cc1Swenshuai.xi         RES_DMS.u32MaxOutputFrameRate = u16OutVFreq;
6314*53ee8cc1Swenshuai.xi     }
6315*53ee8cc1Swenshuai.xi     else
6316*53ee8cc1Swenshuai.xi     {
6317*53ee8cc1Swenshuai.xi         //RES_DMS.u32MaxOutputFrameRate = 1000 / (DMS_DIP_TIMESLICE * RES_DMS.u8EnableWindowCount);
6318*53ee8cc1Swenshuai.xi         RES_DMS.u32MaxOutputFrameRate = 1000 / (DMS_DIP_TIMESLICE * RES_DMS.u8UseDIPWindowCount);
6319*53ee8cc1Swenshuai.xi     }
6320*53ee8cc1Swenshuai.xi 
6321*53ee8cc1Swenshuai.xi     //reset VsyncCount
6322*53ee8cc1Swenshuai.xi     RES_DMS.u32VsyncCount = 0;
6323*53ee8cc1Swenshuai.xi     RES_DMS.u32GOPDispCount = 0;
6324*53ee8cc1Swenshuai.xi     RES_DMS.u32OutputRate = ((MS_U32)g_IPanel.DefaultVFreq()) * 100;
6325*53ee8cc1Swenshuai.xi 
6326*53ee8cc1Swenshuai.xi     //DMS_PRINTF("DIP_TimeSlice = %d \n", DMS_DIP_TIMESLICE);
6327*53ee8cc1Swenshuai.xi     //DMS_PRINTF("u8Enablu32WindowCount = %d \n", u8Enablu32WindowCount);
6328*53ee8cc1Swenshuai.xi     //DMS_PRINTF("u32MaxOutputFrameRate = %d \n", RES_DMS.u32MaxOutputFrameRate);
6329*53ee8cc1Swenshuai.xi 
6330*53ee8cc1Swenshuai.xi }
6331*53ee8cc1Swenshuai.xi 
_MDrv_DMS_Final(void * pInstance,MS_U32 u32Window)6332*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Final(void* pInstance, MS_U32 u32Window)
6333*53ee8cc1Swenshuai.xi {
6334*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6335*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
6336*53ee8cc1Swenshuai.xi     {
6337*53ee8cc1Swenshuai.xi         Hal_DMS_XC_SetMute(pInstance, TRUE);
6338*53ee8cc1Swenshuai.xi         RES_DMS.gDMS_MVOPShowBufferID = DMS_Invalid_ReadPointer_ID;
6339*53ee8cc1Swenshuai.xi         RES_DMS.gDMS_MVOPRemoveBufferID = DMS_Invalid_ReadPointer_ID;
6340*53ee8cc1Swenshuai.xi         RES_DMS.bMVOPMarkRemoveBuffer = FALSE;
6341*53ee8cc1Swenshuai.xi         MS_U8 u8BufID = 0;
6342*53ee8cc1Swenshuai.xi         for(u8BufID = 0; u8BufID < DMS_DIP_QUEUEDEPTH; u8BufID++)
6343*53ee8cc1Swenshuai.xi         {
6344*53ee8cc1Swenshuai.xi             _DMS_Clear_VDEC_Frame_Ref(u32Window, u8BufID);
6345*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
6346*53ee8cc1Swenshuai.xi             RES_DMS.u32ReleaseState[u8BufID] = 0;
6347*53ee8cc1Swenshuai.xi #endif
6348*53ee8cc1Swenshuai.xi         }
6349*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(u32Window, DMS_XC_RESET_WINDOW_SIZE | DMS_XC_BLACK_SCREEN_BY_WINUSED | DMS_XC_NO_FRAME | DMS_XC_FIRST_TIME_SETWINDOW);
6350*53ee8cc1Swenshuai.xi         RES_DMSDI._u8DMS_DiSetEventBufferID = DMS_Invalid_ReadPointer_ID;
6351*53ee8cc1Swenshuai.xi         RES_DMSDI._u8DMS_DiReleaseVDECFrameBufferID = DMS_Invalid_ReadPointer_ID;
6352*53ee8cc1Swenshuai.xi         for(u8BufID = 0; u8BufID < DMS_DIP_QUEUEDEPTH; u8BufID++)
6353*53ee8cc1Swenshuai.xi         {
6354*53ee8cc1Swenshuai.xi             _DMS_Clear_VDEC_Frame_Ref_Interlace(u32Window, u8BufID);
6355*53ee8cc1Swenshuai.xi         }
6356*53ee8cc1Swenshuai.xi         RES_DMS.bDMS_MVOPFlowFromDi = FALSE;
6357*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
6358*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16ReadPointer = 0;
6359*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWriteReadPointer[MVOP_WINDOW].u16WritePointer = 0;
6360*53ee8cc1Swenshuai.xi #endif
6361*53ee8cc1Swenshuai.xi     }
6362*53ee8cc1Swenshuai.xi     RES_DMS.bStartCountFRC[u32Window] = FALSE;
6363*53ee8cc1Swenshuai.xi     //Close Win and Show No Signal Color
6364*53ee8cc1Swenshuai.xi     _DMS_DisableByWin(u32Window);
6365*53ee8cc1Swenshuai.xi 
6366*53ee8cc1Swenshuai.xi     //Clean Pushframe Info in queue;
6367*53ee8cc1Swenshuai.xi     _DMS_InvalidateQueueByWin(u32Window);
6368*53ee8cc1Swenshuai.xi 
6369*53ee8cc1Swenshuai.xi     //Check if exist any window and DeInit when no window is open
6370*53ee8cc1Swenshuai.xi     _DMS_DeInitByWin(u32Window);
6371*53ee8cc1Swenshuai.xi 
6372*53ee8cc1Swenshuai.xi     _CalculateMaxOutputFrameRate();
6373*53ee8cc1Swenshuai.xi 
6374*53ee8cc1Swenshuai.xi     _DMS_XC_SetDisconnect(INPUT_SOURCE_DTV);
6375*53ee8cc1Swenshuai.xi 
6376*53ee8cc1Swenshuai.xi     return TRUE;
6377*53ee8cc1Swenshuai.xi }
6378*53ee8cc1Swenshuai.xi 
6379*53ee8cc1Swenshuai.xi //Set Display Window Change Flag
_DMS_IsDispWindowChange(MS_U32 u32Window,ST_DMS_WINDOW * ptDstWin)6380*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_IsDispWindowChange (MS_U32 u32Window, ST_DMS_WINDOW *ptDstWin)
6381*53ee8cc1Swenshuai.xi {
6382*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6383*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x != ptDstWin->u32x)
6384*53ee8cc1Swenshuai.xi         return TRUE;
6385*53ee8cc1Swenshuai.xi 
6386*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y != ptDstWin->u32y)
6387*53ee8cc1Swenshuai.xi         return TRUE;
6388*53ee8cc1Swenshuai.xi 
6389*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width != ptDstWin->u32width)
6390*53ee8cc1Swenshuai.xi         return TRUE;
6391*53ee8cc1Swenshuai.xi 
6392*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height != ptDstWin->u32height)
6393*53ee8cc1Swenshuai.xi         return TRUE;
6394*53ee8cc1Swenshuai.xi 
6395*53ee8cc1Swenshuai.xi     return FALSE;
6396*53ee8cc1Swenshuai.xi }
6397*53ee8cc1Swenshuai.xi 
_DMS_SetDispWindowChangeFlag(MS_U32 u32Window)6398*53ee8cc1Swenshuai.xi static void _DMS_SetDispWindowChangeFlag (MS_U32 u32Window)
6399*53ee8cc1Swenshuai.xi {
6400*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6401*53ee8cc1Swenshuai.xi     //Raise the flag "Display Window Change"
6402*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_0][u32Window].bDispChange = TRUE;
6403*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_1][u32Window].bDispChange = TRUE;
6404*53ee8cc1Swenshuai.xi }
6405*53ee8cc1Swenshuai.xi 
6406*53ee8cc1Swenshuai.xi //Set Display Window Change Flag
_DMS_GetDispWindowChangeFlag(MS_U32 u32Window)6407*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_GetDispWindowChangeFlag (MS_U32 u32Window)
6408*53ee8cc1Swenshuai.xi {
6409*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6410*53ee8cc1Swenshuai.xi     //Raise the flag "Display Window Change"
6411*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_0][u32Window].bDispChange == TRUE)
6412*53ee8cc1Swenshuai.xi     {
6413*53ee8cc1Swenshuai.xi         return TRUE;
6414*53ee8cc1Swenshuai.xi     }
6415*53ee8cc1Swenshuai.xi 
6416*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_1][u32Window].bDispChange == TRUE)
6417*53ee8cc1Swenshuai.xi     {
6418*53ee8cc1Swenshuai.xi         return TRUE;
6419*53ee8cc1Swenshuai.xi     }
6420*53ee8cc1Swenshuai.xi 
6421*53ee8cc1Swenshuai.xi     return FALSE;
6422*53ee8cc1Swenshuai.xi }
6423*53ee8cc1Swenshuai.xi 
6424*53ee8cc1Swenshuai.xi //Store Display Window Info as Previous one
_DMS_StorePreviousWindowInfo(MS_U32 u32Window)6425*53ee8cc1Swenshuai.xi static void _DMS_StorePreviousWindowInfo (MS_U32 u32Window)
6426*53ee8cc1Swenshuai.xi {
6427*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6428*53ee8cc1Swenshuai.xi     RES_DMS._stXC_PreDispWinInfo[u32Window].u32x = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x;
6429*53ee8cc1Swenshuai.xi     RES_DMS._stXC_PreDispWinInfo[u32Window].u32y = RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y;
6430*53ee8cc1Swenshuai.xi     RES_DMS._stXC_PreDispWinInfo[u32Window].u32width= RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width;
6431*53ee8cc1Swenshuai.xi     RES_DMS._stXC_PreDispWinInfo[u32Window].u32height= RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height;
6432*53ee8cc1Swenshuai.xi }
6433*53ee8cc1Swenshuai.xi 
_DMS_CheckIfDispWindowChange(MS_U32 u32Window,ST_DMS_WINDOW * ptDstWin)6434*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_CheckIfDispWindowChange (MS_U32 u32Window, ST_DMS_WINDOW *ptDstWin)
6435*53ee8cc1Swenshuai.xi {
6436*53ee8cc1Swenshuai.xi     if (_DMS_IsWindowUsed(u32Window) == TRUE)
6437*53ee8cc1Swenshuai.xi     {
6438*53ee8cc1Swenshuai.xi         if (_DMS_IsDispWindowChange(u32Window, ptDstWin) == TRUE)
6439*53ee8cc1Swenshuai.xi         {
6440*53ee8cc1Swenshuai.xi             //If (Window Change Flag != TRUE), Store Old Window info
6441*53ee8cc1Swenshuai.xi             if (_DMS_GetDispWindowChangeFlag(u32Window) != TRUE)
6442*53ee8cc1Swenshuai.xi             {
6443*53ee8cc1Swenshuai.xi                 _DMS_StorePreviousWindowInfo(u32Window);
6444*53ee8cc1Swenshuai.xi             }
6445*53ee8cc1Swenshuai.xi 
6446*53ee8cc1Swenshuai.xi             //Set Display Window Change Flag
6447*53ee8cc1Swenshuai.xi             _DMS_SetDispWindowChangeFlag(u32Window);
6448*53ee8cc1Swenshuai.xi         }
6449*53ee8cc1Swenshuai.xi     }
6450*53ee8cc1Swenshuai.xi     return TRUE;
6451*53ee8cc1Swenshuai.xi }
6452*53ee8cc1Swenshuai.xi 
6453*53ee8cc1Swenshuai.xi //Condition: (HAL Level function?)
6454*53ee8cc1Swenshuai.xi //0:scaling down 90%             Use XC scaling,
6455*53ee8cc1Swenshuai.xi //1:scaling down 90% ~ 2K,    Use 2nd buffer. change to XC enlarge/same case
6456*53ee8cc1Swenshuai.xi //2:scaling 2Kdown ~ more,     Use 2nd buffer. DIP scaling down
6457*53ee8cc1Swenshuai.xi 
_DMS_XC_Set_ScalingDown_Condition(ST_DMS_WINDOW * ptCropWin,ST_DMS_WINDOW * ptDstWin)6458*53ee8cc1Swenshuai.xi static void _DMS_XC_Set_ScalingDown_Condition(ST_DMS_WINDOW *ptCropWin, ST_DMS_WINDOW *ptDstWin)
6459*53ee8cc1Swenshuai.xi {
6460*53ee8cc1Swenshuai.xi     //condition check
6461*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6462*53ee8cc1Swenshuai.xi     RES_DMS.gDMS_ScalingCondition = 0;
6463*53ee8cc1Swenshuai.xi 
6464*53ee8cc1Swenshuai.xi     // Decide scaling Strategy Only if Crop window larger than FHD
6465*53ee8cc1Swenshuai.xi     if(_DMS_WindowSizeOverFHD(ptCropWin->u32width,ptCropWin->u32height))
6466*53ee8cc1Swenshuai.xi     {
6467*53ee8cc1Swenshuai.xi         if(ptDstWin->u32width >= ptCropWin->u32width &&
6468*53ee8cc1Swenshuai.xi            ptDstWin->u32height >= ptCropWin->u32height)
6469*53ee8cc1Swenshuai.xi         {
6470*53ee8cc1Swenshuai.xi             //4k in 4k out
6471*53ee8cc1Swenshuai.xi             //3840 in 4096 out,scaling up, Use XC scaling
6472*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] H %td->%td, V %td->%td, enlarge case\n",__FUNCTION__,
6473*53ee8cc1Swenshuai.xi                 (ptrdiff_t)ptCropWin->u32width,(ptrdiff_t)ptDstWin->u32width,
6474*53ee8cc1Swenshuai.xi                 (ptrdiff_t)ptCropWin->u32height,(ptrdiff_t)ptDstWin->u32height);
6475*53ee8cc1Swenshuai.xi             RES_DMS.gDMS_ScalingCondition |= USE_XC_FBL;
6476*53ee8cc1Swenshuai.xi         }
6477*53ee8cc1Swenshuai.xi         else if(ptDstWin->u32width >= ((ptCropWin->u32width * 9)/10) &&
6478*53ee8cc1Swenshuai.xi             ptDstWin->u32height >= ((ptCropWin->u32height * 9)/10))
6479*53ee8cc1Swenshuai.xi         {
6480*53ee8cc1Swenshuai.xi             //scaling down 90%up, Use XC scaling
6481*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] H %td->%td, V %td->%td, 90up case, scaling by XC\n",__FUNCTION__,
6482*53ee8cc1Swenshuai.xi                 (ptrdiff_t)((ptCropWin->u32width * 9)/10),(ptrdiff_t)ptDstWin->u32width,
6483*53ee8cc1Swenshuai.xi                 (ptrdiff_t)((ptCropWin->u32height * 9)/10),(ptrdiff_t)ptDstWin->u32height);
6484*53ee8cc1Swenshuai.xi             RES_DMS.gDMS_ScalingCondition |= USE_XC_SCALING_DOWN;
6485*53ee8cc1Swenshuai.xi         }
6486*53ee8cc1Swenshuai.xi         else if(ptDstWin->u32width >= (ptCropWin->u32width/2) &&
6487*53ee8cc1Swenshuai.xi             ptDstWin->u32height >= (ptCropWin->u32height/2))
6488*53ee8cc1Swenshuai.xi         {
6489*53ee8cc1Swenshuai.xi             //scaling down 90% ~ 2K, Use 2nd buffer. change to XC enlarge/same case
6490*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] H %td->%td, V %td->%td, 90 to 2K, 2nd buffer scaling up by XC\n",__FUNCTION__,
6491*53ee8cc1Swenshuai.xi                 (ptrdiff_t)(ptCropWin->u32width/2),(ptrdiff_t)ptDstWin->u32width,
6492*53ee8cc1Swenshuai.xi                 (ptrdiff_t)(ptCropWin->u32height/2),(ptrdiff_t)ptDstWin->u32height);
6493*53ee8cc1Swenshuai.xi             RES_DMS.gDMS_ScalingCondition |= USE_2ND_BUFFER;
6494*53ee8cc1Swenshuai.xi         }
6495*53ee8cc1Swenshuai.xi         else
6496*53ee8cc1Swenshuai.xi         {
6497*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] H %td->%td, V %td->%td, 2K ~ more, 2nd buffer scaling down\n",__FUNCTION__,
6498*53ee8cc1Swenshuai.xi                 (ptrdiff_t)ptCropWin->u32width,(ptrdiff_t)ptDstWin->u32width,
6499*53ee8cc1Swenshuai.xi                 (ptrdiff_t)ptCropWin->u32height,(ptrdiff_t)ptDstWin->u32height);
6500*53ee8cc1Swenshuai.xi             RES_DMS.gDMS_ScalingCondition |= USE_2ND_BUFFER;
6501*53ee8cc1Swenshuai.xi         }
6502*53ee8cc1Swenshuai.xi     }
6503*53ee8cc1Swenshuai.xi }
6504*53ee8cc1Swenshuai.xi 
_MDrv_DMS_SetWin(void * pInstance,ST_DMS_WINDOW * ptCropWin,ST_DMS_WINDOW * ptDstWin,MS_U32 u32Window)6505*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_SetWin(void* pInstance, ST_DMS_WINDOW *ptCropWin, ST_DMS_WINDOW *ptDstWin, MS_U32 u32Window)
6506*53ee8cc1Swenshuai.xi {
6507*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6508*53ee8cc1Swenshuai.xi     MS_U32 BytesPerLine = 0;
6509*53ee8cc1Swenshuai.xi     MS_U32 UHDBytesPerLine = 0;
6510*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW stCropWin = {0};
6511*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW stDispWin = {0};
6512*53ee8cc1Swenshuai.xi     E_DMS_DIP_CLIENT eDIPClient = E_DMS_DIP_CLIENT_GOP;
6513*53ee8cc1Swenshuai.xi 
6514*53ee8cc1Swenshuai.xi     if(ptCropWin == NULL || ptDstWin == NULL)
6515*53ee8cc1Swenshuai.xi     {
6516*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] error, Set window parameter cannot be NULL\n",__FUNCTION__);
6517*53ee8cc1Swenshuai.xi         return FALSE;
6518*53ee8cc1Swenshuai.xi     }
6519*53ee8cc1Swenshuai.xi 
6520*53ee8cc1Swenshuai.xi     memcpy(&stCropWin,ptCropWin,sizeof(stCropWin));
6521*53ee8cc1Swenshuai.xi     memcpy(&stDispWin,ptDstWin,sizeof(stDispWin));
6522*53ee8cc1Swenshuai.xi 
6523*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
6524*53ee8cc1Swenshuai.xi     {
6525*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6526*53ee8cc1Swenshuai.xi         _DMS_XC_Set_ScalingDown_Condition(&stCropWin, &stDispWin);
6527*53ee8cc1Swenshuai.xi         if(RES_DMS.gDMS_ScalingCondition & USE_2ND_BUFFER)
6528*53ee8cc1Swenshuai.xi         {
6529*53ee8cc1Swenshuai.xi             stCropWin.u32width /= 2;
6530*53ee8cc1Swenshuai.xi             stCropWin.u32height /= 2;
6531*53ee8cc1Swenshuai.xi         }
6532*53ee8cc1Swenshuai.xi #endif
6533*53ee8cc1Swenshuai.xi     }
6534*53ee8cc1Swenshuai.xi     else
6535*53ee8cc1Swenshuai.xi     {
6536*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(u32Window, DMS_XC_UPDATE_FROM_VDEC);
6537*53ee8cc1Swenshuai.xi         _DMS_Remove_XC_Status(u32Window, DMS_XC_FIRST_FRAME_FROM_VDEC);
6538*53ee8cc1Swenshuai.xi         RES_DMS.bIsWindowMute[u32Window] = FALSE;
6539*53ee8cc1Swenshuai.xi     }
6540*53ee8cc1Swenshuai.xi 
6541*53ee8cc1Swenshuai.xi #if DBG_FPS
6542*53ee8cc1Swenshuai.xi     bFPS_Start[u32Window] = TRUE;
6543*53ee8cc1Swenshuai.xi #endif
6544*53ee8cc1Swenshuai.xi     _DMS_XC_WindowAlignto2(&stCropWin);
6545*53ee8cc1Swenshuai.xi     _DMS_XC_WindowAlignto2(&stDispWin);
6546*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6547*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
6548*53ee8cc1Swenshuai.xi     {
6549*53ee8cc1Swenshuai.xi         eDIPClient = E_DMS_DIP_CLIENT_MVOP;
6550*53ee8cc1Swenshuai.xi         memcpy(&RES_DMS._stXC_XCCropWinInfo_DoubleBuffer,&stCropWin,sizeof(stCropWin));
6551*53ee8cc1Swenshuai.xi         memcpy(&RES_DMS._stXC_XCDispWinInfo_DoubleBuffer,&stDispWin,sizeof(stCropWin));
6552*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(u32Window, DMS_XC_RESET_WINDOW_SIZE);
6553*53ee8cc1Swenshuai.xi         if(_DMS_Query_XC_Status(u32Window, DMS_XC_NO_FRAME))
6554*53ee8cc1Swenshuai.xi         {
6555*53ee8cc1Swenshuai.xi             memcpy(&RES_DMS._stXC_XCCropWinInfo_raw,&stCropWin,sizeof(stCropWin));
6556*53ee8cc1Swenshuai.xi         }
6557*53ee8cc1Swenshuai.xi #if DEV_DI
6558*53ee8cc1Swenshuai.xi         if(_DMS_Query_XC_Status(u32Window, DMS_XC_NO_FRAME))
6559*53ee8cc1Swenshuai.xi         {
6560*53ee8cc1Swenshuai.xi             RES_DMSDI._bSetwinToDiTask_DoubleBuffer = TRUE;
6561*53ee8cc1Swenshuai.xi         }
6562*53ee8cc1Swenshuai.xi         else
6563*53ee8cc1Swenshuai.xi         {
6564*53ee8cc1Swenshuai.xi             if(RES_DMS.bDMS_MVOPFlowFromDi == TRUE)
6565*53ee8cc1Swenshuai.xi             {
6566*53ee8cc1Swenshuai.xi                 RES_DMSDI._bSetwinToDiTask_DoubleBuffer = TRUE;
6567*53ee8cc1Swenshuai.xi                 _DMS_Remove_XC_Status(u32Window, DMS_XC_RESET_WINDOW_SIZE);
6568*53ee8cc1Swenshuai.xi             }
6569*53ee8cc1Swenshuai.xi         }
6570*53ee8cc1Swenshuai.xi #endif
6571*53ee8cc1Swenshuai.xi     }
6572*53ee8cc1Swenshuai.xi #endif  //DMS_MAIN_WINDOW_FLOW_VERSION == 1
6573*53ee8cc1Swenshuai.xi 
6574*53ee8cc1Swenshuai.xi     MS_BOOL bResChange = FALSE;
6575*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth != g_IPanel.Width())
6576*53ee8cc1Swenshuai.xi     {
6577*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth = g_IPanel.Width();
6578*53ee8cc1Swenshuai.xi         bResChange = TRUE;
6579*53ee8cc1Swenshuai.xi     }
6580*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight != g_IPanel.Height())
6581*53ee8cc1Swenshuai.xi     {
6582*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight = g_IPanel.Height();
6583*53ee8cc1Swenshuai.xi         bResChange = TRUE;
6584*53ee8cc1Swenshuai.xi     }
6585*53ee8cc1Swenshuai.xi 
6586*53ee8cc1Swenshuai.xi     if(bResChange)
6587*53ee8cc1Swenshuai.xi     {
6588*53ee8cc1Swenshuai.xi         MApi_GOP_GWIN_Set_STRETCHWIN(GOP_NUM, E_GOP_DST_OP0, 0, 0, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelWidth, RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].u32PanelHeight);
6589*53ee8cc1Swenshuai.xi         _MDrv_DMS_OSD_Init(GOP_NUM, RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP], DIP_DATA_FMT_YUV422);
6590*53ee8cc1Swenshuai.xi     }
6591*53ee8cc1Swenshuai.xi 
6592*53ee8cc1Swenshuai.xi     BytesPerLine = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt, RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelWidth);
6593*53ee8cc1Swenshuai.xi     UHDBytesPerLine = _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt, DMS_Frame_Buffer_Width);
6594*53ee8cc1Swenshuai.xi 
6595*53ee8cc1Swenshuai.xi     // Handle Window Change
6596*53ee8cc1Swenshuai.xi     _DMS_CheckIfDispWindowChange(u32Window, &stDispWin);
6597*53ee8cc1Swenshuai.xi 
6598*53ee8cc1Swenshuai.xi     if (RES_DMS._stXC_DIPWinInfo[u32Window].bDIPwinUse == FALSE)
6599*53ee8cc1Swenshuai.xi     {
6600*53ee8cc1Swenshuai.xi         // record enable window number
6601*53ee8cc1Swenshuai.xi         RES_DMS.u8EnableWindowCount++;
6602*53ee8cc1Swenshuai.xi         RES_DMS.u8UseDIPWindowCount++;
6603*53ee8cc1Swenshuai.xi     }
6604*53ee8cc1Swenshuai.xi 
6605*53ee8cc1Swenshuai.xi     RES_DMS._stXC_DIPWinInfo[u32Window].bDIPwinUse = TRUE;
6606*53ee8cc1Swenshuai.xi 
6607*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32Window))
6608*53ee8cc1Swenshuai.xi     {
6609*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6610*53ee8cc1Swenshuai.xi         memcpy(&RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stCropWin,&stCropWin,sizeof(stCropWin));
6611*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32x = 0;
6612*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32y = 0;
6613*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32width = DMS_DIP_Alignment(stDispWin.u32width, DMS_HAL_DIP_Align);
6614*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32height = stDispWin.u32height;
6615*53ee8cc1Swenshuai.xi 
6616*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPStartMemAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + (BytesPerLine * RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32y) + ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt, RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32x));
6617*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPEndMemAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + (BytesPerLine * (RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32y + RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32height)) +
6618*53ee8cc1Swenshuai.xi         ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt,(RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32x + RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin.u32width)));
6619*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPDoubleBufStartMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPStartMemAddr + (BytesPerLine * RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelHeight);
6620*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPDoubleBufEndMemAddr = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPEndMemAddr + (BytesPerLine *  RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelHeight);
6621*53ee8cc1Swenshuai.xi 
6622*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.phyDIPRingBufMemAddr[0] = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPStartMemAddr;
6623*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.phyDIPRingBufMemAddr[1] = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPDoubleBufStartMemAddr;
6624*53ee8cc1Swenshuai.xi         MS_U8 i = 2;
6625*53ee8cc1Swenshuai.xi         for(i = 2; i < DMS_DI_RING_BUFFER; i++)
6626*53ee8cc1Swenshuai.xi         {
6627*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.phyDIPRingBufMemAddr[i] = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.phyDIPRingBufMemAddr[i-1] + (BytesPerLine * RES_DMS._stXC_DIPMemInfo[eDIPClient].u32PanelHeight);
6628*53ee8cc1Swenshuai.xi         }
6629*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32RingBufferSize = RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPEndMemAddr - RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.u32DIPStartMemAddr;
6630*53ee8cc1Swenshuai.xi #endif   //#if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6631*53ee8cc1Swenshuai.xi     }
6632*53ee8cc1Swenshuai.xi     else
6633*53ee8cc1Swenshuai.xi     {
6634*53ee8cc1Swenshuai.xi         memcpy(&RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin,&stCropWin,sizeof(stCropWin));
6635*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x = DMS_DIP_Alignment(stDispWin.u32x, DMS_HAL_DIP_Align);
6636*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y = stDispWin.u32y;
6637*53ee8cc1Swenshuai.xi 
6638*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width = DMS_DIP_Alignment(stDispWin.u32width, DMS_HAL_DIP_Align);
6639*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height = stDispWin.u32height;
6640*53ee8cc1Swenshuai.xi 
6641*53ee8cc1Swenshuai.xi         if(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y == 0)
6642*53ee8cc1Swenshuai.xi         {
6643*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt,RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x));
6644*53ee8cc1Swenshuai.xi         }
6645*53ee8cc1Swenshuai.xi         else
6646*53ee8cc1Swenshuai.xi         {
6647*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + (BytesPerLine * (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y-1)) + ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt,RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x));
6648*53ee8cc1Swenshuai.xi         }
6649*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr = RES_DMS.u32DIPAddress_pa[eDIPClient] + (BytesPerLine * (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y + RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height - 1)) +
6650*53ee8cc1Swenshuai.xi         ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[eDIPClient].eDIPWFmt,(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x + RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width)));
6651*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufStartMemAddr = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr + (UHDBytesPerLine * DMS_Frame_Buffer_Height);
6652*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufEndMemAddr = RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr + (UHDBytesPerLine * DMS_Frame_Buffer_Height);
6653*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
6654*53ee8cc1Swenshuai.xi         if(eDIPClient == E_DMS_DIP_CLIENT_GOP)
6655*53ee8cc1Swenshuai.xi         {
6656*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].u32GEStartMemAddr = RES_DMS.u32GEAddress_pa + (BytesPerLine * RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y) + ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt, RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x));
6657*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u32Window].u32GEEndMemAddr = RES_DMS.u32GEAddress_pa + (BytesPerLine * (RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32y + RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32height)) +
6658*53ee8cc1Swenshuai.xi                 ( _DMS_DIP_CalcPitch(RES_DMS._stXC_DIPMemInfo[E_DMS_DIP_CLIENT_GOP].eDIPWFmt,(RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32x + RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin.u32width)));
6659*53ee8cc1Swenshuai.xi         }
6660*53ee8cc1Swenshuai.xi #endif
6661*53ee8cc1Swenshuai.xi     }
6662*53ee8cc1Swenshuai.xi 
6663*53ee8cc1Swenshuai.xi     //Re-calculate Max Output Frame Rate
6664*53ee8cc1Swenshuai.xi     _CalculateMaxOutputFrameRate();
6665*53ee8cc1Swenshuai.xi #if DBG_DMS_LOG
6666*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW *pstCropLogWin = (_DMS_Is_MVOPFlow(u32Window))? &RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stCropWin : &RES_DMS._stXC_DIPWinInfo[u32Window].stCropWin;
6667*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW *pstDispLogWin = (_DMS_Is_MVOPFlow(u32Window))? &RES_DMS._stXC_DIPWinInfo_MVOPDoubleBuffer.stDstWin : &RES_DMS._stXC_DIPWinInfo[u32Window].stDstWin;
6668*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === %s === \033[0m\n",__FUNCTION__,__LINE__,(DMS_MVOP_FLOW)? "MVOP flow!!!" : "DIP to GOP flow!!!");
6669*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Window : %d === \033[0m\n",__FUNCTION__,__LINE__,u32Window);
6670*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32DIPAddress_pa : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS.u32DIPAddress_pa[eDIPClient]);
6671*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Crop_Window === \033[0m\n",__FUNCTION__,__LINE__);
6672*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === X : %d, Y : %d, W : %d, H : %d  === \033[0m\n",__FUNCTION__,__LINE__,pstCropLogWin->u32x,pstCropLogWin->u32y,pstCropLogWin->u32width,pstCropLogWin->u32height);
6673*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === DST_Window === \033[0m\n",__FUNCTION__,__LINE__);
6674*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === X : %d, Y : %d, W : %d, H : %d === \033[0m\n",__FUNCTION__,__LINE__,pstDispLogWin->u32x,pstDispLogWin->u32y, pstDispLogWin->u32width,pstDispLogWin->u32height);
6675*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === DIP Addr === \033[0m\n",__FUNCTION__,__LINE__);
6676*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32DIPStartMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPStartMemAddr);
6677*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32DIPEndMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPEndMemAddr);
6678*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32DIPDoubleBufStartMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufStartMemAddr);
6679*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32DIPDoubleBufEndMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32DIPDoubleBufEndMemAddr);
6680*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32GEStartMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32GEStartMemAddr);
6681*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32GEEndMemAddr : 0x%llx === \033[0m\n",__FUNCTION__,__LINE__,RES_DMS._stXC_DIPWinInfo[u32Window].u32GEEndMemAddr);
6682*53ee8cc1Swenshuai.xi #endif
6683*53ee8cc1Swenshuai.xi     gDMSDebug = 0;
6684*53ee8cc1Swenshuai.xi 
6685*53ee8cc1Swenshuai.xi     return TRUE;
6686*53ee8cc1Swenshuai.xi }
6687*53ee8cc1Swenshuai.xi 
_MDrv_DMS_SetWindowZOrder(MS_U32 u32WindowID,MS_U32 u32ZOrder)6688*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_SetWindowZOrder(MS_U32 u32WindowID, MS_U32 u32ZOrder)
6689*53ee8cc1Swenshuai.xi {
6690*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6691*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
6692*53ee8cc1Swenshuai.xi 
6693*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32WindowID) == TRUE)
6694*53ee8cc1Swenshuai.xi     {
6695*53ee8cc1Swenshuai.xi         RES_DMS.WindowScore[u32WindowID] = u32ZOrder;
6696*53ee8cc1Swenshuai.xi 
6697*53ee8cc1Swenshuai.xi         if(RES_DMS.WindowScore[u32WindowID] < RES_DMS.WindowScore[1])
6698*53ee8cc1Swenshuai.xi         {
6699*53ee8cc1Swenshuai.xi             MApi_XC_SetVideoOnOSD(E_VIDEO_ON_OSD_LAYER_0,MAIN_WINDOW);
6700*53ee8cc1Swenshuai.xi         }
6701*53ee8cc1Swenshuai.xi         else if(RES_DMS.WindowScore[u32WindowID] > RES_DMS.WindowScore[DMS_MAX_WINDOW_NUM-1])
6702*53ee8cc1Swenshuai.xi         {
6703*53ee8cc1Swenshuai.xi             MApi_XC_SetVideoOnOSD(E_VIDEO_ON_OSD_LAYER_4,MAIN_WINDOW);
6704*53ee8cc1Swenshuai.xi         }
6705*53ee8cc1Swenshuai.xi         else
6706*53ee8cc1Swenshuai.xi         {
6707*53ee8cc1Swenshuai.xi             MApi_XC_SetVideoOnOSD(E_VIDEO_ON_OSD_LAYER_0,MAIN_WINDOW);
6708*53ee8cc1Swenshuai.xi             RES_DMS.WindowScore[u32WindowID] = 0;
6709*53ee8cc1Swenshuai.xi         }
6710*53ee8cc1Swenshuai.xi     }
6711*53ee8cc1Swenshuai.xi     else
6712*53ee8cc1Swenshuai.xi     {
6713*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(u8WindowID,  DMS_XC_UPDATE_FROM_VDEC);
6714*53ee8cc1Swenshuai.xi         _DMS_Remove_XC_Status(u8WindowID,  DMS_XC_FIRST_FRAME_FROM_VDEC);
6715*53ee8cc1Swenshuai.xi 
6716*53ee8cc1Swenshuai.xi         for(u8WindowID=1; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
6717*53ee8cc1Swenshuai.xi         {
6718*53ee8cc1Swenshuai.xi             if(RES_DMS.WindowZOrder[u8WindowID] == u32WindowID)
6719*53ee8cc1Swenshuai.xi             {
6720*53ee8cc1Swenshuai.xi                 RES_DMS.WindowScore[u8WindowID] = u32ZOrder;
6721*53ee8cc1Swenshuai.xi                 break;
6722*53ee8cc1Swenshuai.xi             }
6723*53ee8cc1Swenshuai.xi         }
6724*53ee8cc1Swenshuai.xi         _DMS_DIP_ScoreSorting();
6725*53ee8cc1Swenshuai.xi     }
6726*53ee8cc1Swenshuai.xi 
6727*53ee8cc1Swenshuai.xi     return TRUE;
6728*53ee8cc1Swenshuai.xi }
6729*53ee8cc1Swenshuai.xi 
MDrv_DMS_Init(void * pInstance,ST_DMS_INITDATA * pstDMS_InitData)6730*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Init(void* pInstance, ST_DMS_INITDATA *pstDMS_InitData)
6731*53ee8cc1Swenshuai.xi {
6732*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
6733*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6734*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Init(pInstance, GOP_NUM, E_DMS_DIP_FMT_YUV422, 0, 0);
6735*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6736*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
6737*53ee8cc1Swenshuai.xi }
6738*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetMemoryType(void * pInstance,ST_DMS_SET_MEMORY_TYPE * pstDMS_SetMemType)6739*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetMemoryType(void* pInstance, ST_DMS_SET_MEMORY_TYPE* pstDMS_SetMemType)
6740*53ee8cc1Swenshuai.xi {
6741*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
6742*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6743*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6744*53ee8cc1Swenshuai.xi 
6745*53ee8cc1Swenshuai.xi     printf("MDrv_DMS_SetMemoryType\n");
6746*53ee8cc1Swenshuai.xi     if(pstDMS_SetMemType->eMemoryType == E_DMS_MEMORY_TYPE_GOP_DISPLAY)
6747*53ee8cc1Swenshuai.xi     {
6748*53ee8cc1Swenshuai.xi         _MDrv_DMS_OSD_Init(GOP_NUM, RES_DMS.u32DIPAddress_pa[E_DMS_DIP_CLIENT_GOP], DIP_DATA_FMT_YUV422);
6749*53ee8cc1Swenshuai.xi     }
6750*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Setup_Memory(pInstance, pstDMS_SetMemType->eMemoryType, pstDMS_SetMemType->phyAddr,pstDMS_SetMemType->phySize,pstDMS_SetMemType->u32CMAHeapID);
6751*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6752*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
6753*53ee8cc1Swenshuai.xi }
6754*53ee8cc1Swenshuai.xi 
MDrv_DMS_CreateWindow(void * pInstance,ST_DMS_WINDOW * pstOutputWin,ST_DMS_CREATE_WIN_INFO * pstCreateWin_Info,MS_U32 * pu32WindowID)6755*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_CreateWindow(void* pInstance, ST_DMS_WINDOW *pstOutputWin, ST_DMS_CREATE_WIN_INFO *pstCreateWin_Info, MS_U32 *pu32WindowID)
6756*53ee8cc1Swenshuai.xi {
6757*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6758*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
6759*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6760*53ee8cc1Swenshuai.xi     MS_U16 u16WindowID = 0;
6761*53ee8cc1Swenshuai.xi     for(u16WindowID=0; u16WindowID<DMS_MAX_WINDOW_NUM; u16WindowID++)
6762*53ee8cc1Swenshuai.xi     {
6763*53ee8cc1Swenshuai.xi         if(_DMS_IsWindowUsed(u16WindowID) == FALSE)
6764*53ee8cc1Swenshuai.xi         {
6765*53ee8cc1Swenshuai.xi             // record enable window number
6766*53ee8cc1Swenshuai.xi             RES_DMS.u8EnableWindowCount++;
6767*53ee8cc1Swenshuai.xi             RES_DMS.u8UseDIPWindowCount++;
6768*53ee8cc1Swenshuai.xi 
6769*53ee8cc1Swenshuai.xi             RES_DMS._stXC_DIPWinInfo[u16WindowID].bDIPwinUse = TRUE;
6770*53ee8cc1Swenshuai.xi             *pu32WindowID = u16WindowID;
6771*53ee8cc1Swenshuai.xi 
6772*53ee8cc1Swenshuai.xi             bRet = TRUE;
6773*53ee8cc1Swenshuai.xi             break;
6774*53ee8cc1Swenshuai.xi         }
6775*53ee8cc1Swenshuai.xi     }
6776*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6777*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
6778*53ee8cc1Swenshuai.xi }
6779*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 0)
_DMS_MVOP_SetConfig_From_Vdec(void * pInstance,MS_U32 u32WindowID,ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)6780*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_MVOP_SetConfig_From_Vdec(void* pInstance, MS_U32 u32WindowID, ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat)
6781*53ee8cc1Swenshuai.xi {
6782*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6783*53ee8cc1Swenshuai.xi 
6784*53ee8cc1Swenshuai.xi     MVOP_VidStat stMvopVidSt;
6785*53ee8cc1Swenshuai.xi     MVOP_InputCfg stMvopInputCfg;
6786*53ee8cc1Swenshuai.xi     MVOP_InputSel eInputCfg = MVOP_INPUT_DRAM;
6787*53ee8cc1Swenshuai.xi     MS_U8 u8MIUSel = 0;
6788*53ee8cc1Swenshuai.xi     MS_BOOL bHS = TRUE;
6789*53ee8cc1Swenshuai.xi     MS_BOOL bXCGen = FALSE;
6790*53ee8cc1Swenshuai.xi     MS_BOOL bEnableUvSwap = FALSE;
6791*53ee8cc1Swenshuai.xi     MVOP_Handle stMvopHd = { E_MVOP_MODULE_MAIN };
6792*53ee8cc1Swenshuai.xi 
6793*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6794*53ee8cc1Swenshuai.xi 
6795*53ee8cc1Swenshuai.xi 
6796*53ee8cc1Swenshuai.xi     // Structure initialization
6797*53ee8cc1Swenshuai.xi     memset(&stMvopVidSt, 0, sizeof(MVOP_VidStat));
6798*53ee8cc1Swenshuai.xi     memset(&stMvopInputCfg, 0, sizeof(MVOP_InputCfg));
6799*53ee8cc1Swenshuai.xi 
6800*53ee8cc1Swenshuai.xi     RES_DMS.bDisableBlackScreen = FALSE;
6801*53ee8cc1Swenshuai.xi     RES_DMS.bFirstPlay = TRUE;
6802*53ee8cc1Swenshuai.xi     RES_DMS.u32MuteCounter = 0;
6803*53ee8cc1Swenshuai.xi 
6804*53ee8cc1Swenshuai.xi     MDrv_MVOP_Init();
6805*53ee8cc1Swenshuai.xi     MDrv_MVOP_Enable(FALSE); // Turn off MVOP before setting it
6806*53ee8cc1Swenshuai.xi     //u8MIUSel = (pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr >=0x80000000)?1:0;
6807*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_MiuSwitch(u8MIUSel))
6808*53ee8cc1Swenshuai.xi     {
6809*53ee8cc1Swenshuai.xi         DMS_PRINTF("Cannot set MVOP MIU selection!\n");
6810*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6811*53ee8cc1Swenshuai.xi         return FALSE;
6812*53ee8cc1Swenshuai.xi     }
6813*53ee8cc1Swenshuai.xi 
6814*53ee8cc1Swenshuai.xi     stMvopInputCfg.u16HSize = pstDispFrameFormat->stFrames[0].u32Width;
6815*53ee8cc1Swenshuai.xi     stMvopInputCfg.u16VSize = pstDispFrameFormat->stFrames[0].u32Height;
6816*53ee8cc1Swenshuai.xi     stMvopInputCfg.u32YOffset = 0;
6817*53ee8cc1Swenshuai.xi     stMvopInputCfg.u32UVOffset = 0;
6818*53ee8cc1Swenshuai.xi     stMvopInputCfg.bProgressive = (_DMS_Is_SourceInterlace(_DMS_GetDMSScanType(pstDispFrameFormat->u8Interlace)) == TRUE)?0:1;
6819*53ee8cc1Swenshuai.xi     stMvopInputCfg.bUV7bit = FALSE;
6820*53ee8cc1Swenshuai.xi     stMvopInputCfg.bField = (_DMS_GetDMSScanType(pstDispFrameFormat->u8Interlace) == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)? 1:0;
6821*53ee8cc1Swenshuai.xi     stMvopInputCfg.u16StripSize = pstDispFrameFormat->stFrames[0].stHWFormat.u32LumaPitch;
6822*53ee8cc1Swenshuai.xi     stMvopInputCfg.bYUV422 = _DMS_Is422Mode(_DMS_GetColorFormat(pstDispFrameFormat->enColorFormat));
6823*53ee8cc1Swenshuai.xi     stMvopInputCfg.bSD = ((pstDispFrameFormat->stFrames[0].u32Width <= 720) && (pstDispFrameFormat->stFrames[0].u32Height <= 576))?1:0;
6824*53ee8cc1Swenshuai.xi     if (stMvopInputCfg.bYUV422 == TRUE)
6825*53ee8cc1Swenshuai.xi     {
6826*53ee8cc1Swenshuai.xi         stMvopInputCfg.bDramRdContd = TRUE;
6827*53ee8cc1Swenshuai.xi         stMvopInputCfg.b422pack = TRUE;
6828*53ee8cc1Swenshuai.xi     }
6829*53ee8cc1Swenshuai.xi     else
6830*53ee8cc1Swenshuai.xi     {
6831*53ee8cc1Swenshuai.xi         stMvopInputCfg.bDramRdContd = FALSE;
6832*53ee8cc1Swenshuai.xi         stMvopInputCfg.b422pack = FALSE;
6833*53ee8cc1Swenshuai.xi     }
6834*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_SetInputCfg(eInputCfg, &stMvopInputCfg))
6835*53ee8cc1Swenshuai.xi     {
6836*53ee8cc1Swenshuai.xi         DMS_PRINTF("Set MVOP input config failed!");
6837*53ee8cc1Swenshuai.xi         printf("Set MVOP input config failed!");
6838*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6839*53ee8cc1Swenshuai.xi         return FALSE;
6840*53ee8cc1Swenshuai.xi     }
6841*53ee8cc1Swenshuai.xi 
6842*53ee8cc1Swenshuai.xi     if(stMvopInputCfg.bProgressive == TRUE)
6843*53ee8cc1Swenshuai.xi     {
6844*53ee8cc1Swenshuai.xi         bXCGen = TRUE;
6845*53ee8cc1Swenshuai.xi     }
6846*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_HANDSHAKE_MODE, &bHS);
6847*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_XC_GEN_TIMING, &bXCGen);
6848*53ee8cc1Swenshuai.xi 
6849*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_UV_SWAP, &bEnableUvSwap);
6850*53ee8cc1Swenshuai.xi 
6851*53ee8cc1Swenshuai.xi     stMvopVidSt.u16HorSize = pstDispFrameFormat->stFrames[0].u32Width;
6852*53ee8cc1Swenshuai.xi     stMvopVidSt.u16VerSize = pstDispFrameFormat->stFrames[0].u32Height;
6853*53ee8cc1Swenshuai.xi     stMvopVidSt.u8AspectRate = pstDispFrameFormat->u8AspectRate;
6854*53ee8cc1Swenshuai.xi     stMvopVidSt.u8Interlace = _DMS_GetDMSScanType(pstDispFrameFormat->u8Interlace);
6855*53ee8cc1Swenshuai.xi 
6856*53ee8cc1Swenshuai.xi     if(stMvopInputCfg.bProgressive == FALSE)
6857*53ee8cc1Swenshuai.xi     {
6858*53ee8cc1Swenshuai.xi         stMvopVidSt.u16FrameRate = pstDispFrameFormat->u32FrameRate;
6859*53ee8cc1Swenshuai.xi     }
6860*53ee8cc1Swenshuai.xi     else
6861*53ee8cc1Swenshuai.xi     {
6862*53ee8cc1Swenshuai.xi         //printf("[%s][%d]========= pstDispFrameFormat->u32FrameRate=%ld===========\n",__FUNCTION__,__LINE__, pstDispFrameFormat->u32FrameRate);
6863*53ee8cc1Swenshuai.xi         //printf("[%s][%d]=========g_IPanel.DefaultVFreq()=%d===========\n",__FUNCTION__,__LINE__,g_IPanel.DefaultVFreq());
6864*53ee8cc1Swenshuai.xi         stMvopVidSt.u16FrameRate = g_IPanel.DefaultVFreq() * 100;
6865*53ee8cc1Swenshuai.xi     }
6866*53ee8cc1Swenshuai.xi 
6867*53ee8cc1Swenshuai.xi     if(E_MVOP_OK != MDrv_MVOP_SetOutputCfg(&stMvopVidSt, FALSE))
6868*53ee8cc1Swenshuai.xi     {
6869*53ee8cc1Swenshuai.xi         DMS_PRINTF("Set MVOP output config failed!");
6870*53ee8cc1Swenshuai.xi         printf("Set MVOP output config failed!");
6871*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6872*53ee8cc1Swenshuai.xi         return FALSE;
6873*53ee8cc1Swenshuai.xi     }
6874*53ee8cc1Swenshuai.xi     MDrv_MVOP_Enable(TRUE); // Enable MVOP, video pass to Scaler
6875*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(E_INT_IRQ_DC);
6876*53ee8cc1Swenshuai.xi     MDrv_MVOP_EnableInterrupt(E_MVOP_INT_NONE);
6877*53ee8cc1Swenshuai.xi     MsOS_AttachInterrupt(E_INT_IRQ_DC, (InterruptCb)_DMS_MVOP_ISR);
6878*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_DC);
6879*53ee8cc1Swenshuai.xi     MDrv_MVOP_EnableInterrupt(E_MVOP_INT_VSYNC);
6880*53ee8cc1Swenshuai.xi     _CalculateMaxOutputFrameRate();
6881*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6882*53ee8cc1Swenshuai.xi 
6883*53ee8cc1Swenshuai.xi     return TRUE;
6884*53ee8cc1Swenshuai.xi 
6885*53ee8cc1Swenshuai.xi }
6886*53ee8cc1Swenshuai.xi #endif
6887*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetDigitalDecodeSignalInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)6888*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetDigitalDecodeSignalInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat)
6889*53ee8cc1Swenshuai.xi {
6890*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6891*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl %d=== \033[0m\n",__FUNCTION__,__LINE__,u32WindowID);
6892*53ee8cc1Swenshuai.xi #else
6893*53ee8cc1Swenshuai.xi     if(u32WindowID == MVOP_WINDOW)
6894*53ee8cc1Swenshuai.xi     {
6895*53ee8cc1Swenshuai.xi         MApi_XC_SetBOBMode(FALSE, MAIN_WINDOW);
6896*53ee8cc1Swenshuai.xi         _DMS_MVOP_SetConfig_From_Vdec(pInstance, u32WindowID, pstDispFrameFormat);
6897*53ee8cc1Swenshuai.xi     }
6898*53ee8cc1Swenshuai.xi #endif
6899*53ee8cc1Swenshuai.xi     return E_DMS_OK;
6900*53ee8cc1Swenshuai.xi }
6901*53ee8cc1Swenshuai.xi 
MDrv_DMS_ClearDigitalDecodeSignalInfo(void * pInstance,MS_U32 u32WindowID)6902*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_ClearDigitalDecodeSignalInfo(void* pInstance, MS_U32 u32WindowID)
6903*53ee8cc1Swenshuai.xi {
6904*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6905*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl %d=== \033[0m\n",__FUNCTION__,__LINE__,u32WindowID);
6906*53ee8cc1Swenshuai.xi #else
6907*53ee8cc1Swenshuai.xi     MVOP_Handle stHd = {E_MVOP_MODULE_MAIN};
6908*53ee8cc1Swenshuai.xi     MVOP_Result ret = E_MVOP_FAIL;
6909*53ee8cc1Swenshuai.xi     MVOP_DMSDisplayADD stMVOPDispAddr;
6910*53ee8cc1Swenshuai.xi 
6911*53ee8cc1Swenshuai.xi     memset(&stMVOPDispAddr, 0, sizeof(MVOP_DMSDisplayADD));
6912*53ee8cc1Swenshuai.xi 
6913*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6914*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
6915*53ee8cc1Swenshuai.xi 
6916*53ee8cc1Swenshuai.xi     if(u32WindowID == MVOP_WINDOW)
6917*53ee8cc1Swenshuai.xi     {
6918*53ee8cc1Swenshuai.xi         ret = MDrv_MVOP_DMS_SetDispADDInfo(&stHd, E_MVOP_MAIN_WIN, &stMVOPDispAddr, NULL);
6919*53ee8cc1Swenshuai.xi         if(ret != 0)
6920*53ee8cc1Swenshuai.xi         {
6921*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[031m[%s:%d]MDrv_MVOP_DMS_SetDispADDInfo fail: %d\033[0m\n",__FUNCTION__, __LINE__, ret);
6922*53ee8cc1Swenshuai.xi         }
6923*53ee8cc1Swenshuai.xi 
6924*53ee8cc1Swenshuai.xi         MDrv_MVOP_EnableInterrupt(E_MVOP_INT_NONE);
6925*53ee8cc1Swenshuai.xi         MsOS_DisableInterrupt(E_INT_IRQ_DC);
6926*53ee8cc1Swenshuai.xi         MsOS_DetachInterrupt(E_INT_IRQ_DC);
6927*53ee8cc1Swenshuai.xi         MDrv_MVOP_Enable(FALSE);
6928*53ee8cc1Swenshuai.xi         MDrv_MVOP_Exit();
6929*53ee8cc1Swenshuai.xi     }
6930*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6931*53ee8cc1Swenshuai.xi #endif
6932*53ee8cc1Swenshuai.xi     return E_DMS_OK;
6933*53ee8cc1Swenshuai.xi }
6934*53ee8cc1Swenshuai.xi 
MDrv_DMS_DestroyWindow(void * pInstance,MS_U32 u32WindowID)6935*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_DestroyWindow(void* pInstance, MS_U32 u32WindowID)
6936*53ee8cc1Swenshuai.xi {
6937*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
6938*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6939*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Final(pInstance, u32WindowID);
6940*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
6941*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
6942*53ee8cc1Swenshuai.xi }
6943*53ee8cc1Swenshuai.xi 
6944*53ee8cc1Swenshuai.xi //static MS_BOOL bOnce = FALSE;
MDrv_DMS_SetWindow(void * pInstance,MS_U32 u32WindowID,ST_DMS_SETWIN_INFO * pstDMS_SetWin_Info)6945*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetWindow(void* pInstance, MS_U32 u32WindowID, ST_DMS_SETWIN_INFO *pstDMS_SetWin_Info)
6946*53ee8cc1Swenshuai.xi {
6947*53ee8cc1Swenshuai.xi #if 0
6948*53ee8cc1Swenshuai.xi     if(bOnce)
6949*53ee8cc1Swenshuai.xi     {
6950*53ee8cc1Swenshuai.xi         return E_DMS_OK;
6951*53ee8cc1Swenshuai.xi     }
6952*53ee8cc1Swenshuai.xi     else
6953*53ee8cc1Swenshuai.xi     {
6954*53ee8cc1Swenshuai.xi         bOnce = TRUE;
6955*53ee8cc1Swenshuai.xi     }
6956*53ee8cc1Swenshuai.xi #endif
6957*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
6958*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
6959*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
6960*53ee8cc1Swenshuai.xi     if(pstDMS_SetWin_Info->u32XCWinInfoValid)
6961*53ee8cc1Swenshuai.xi     {
6962*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s][%d] Do setXC win by DMS!\n\n",__FUNCTION__,__LINE__);
6963*53ee8cc1Swenshuai.xi         XC_SETWIN_INFO stXCSetWinInfo;
6964*53ee8cc1Swenshuai.xi         memset(&stXCSetWinInfo, 0, sizeof(XC_SETWIN_INFO));
6965*53ee8cc1Swenshuai.xi 
6966*53ee8cc1Swenshuai.xi         stXCSetWinInfo.enInputSourceType = pstDMS_SetWin_Info->stXCWinInfo.u32InputSourceType;
6967*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stCapWin, &pstDMS_SetWin_Info->stXCWinInfo.stCapWin);
6968*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stDispWin, &pstDMS_SetWin_Info->stXCWinInfo.stDispWin);
6969*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stCropWin, &pstDMS_SetWin_Info->stXCWinInfo.stCropWin);
6970*53ee8cc1Swenshuai.xi 
6971*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bInterlace = pstDMS_SetWin_Info->stXCWinInfo.u32Interlace;
6972*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bHDuplicate = pstDMS_SetWin_Info->stXCWinInfo.u32HDuplicate;
6973*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16InputVFreq = pstDMS_SetWin_Info->stXCWinInfo.u32InputVFreq;
6974*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16InputVTotal = pstDMS_SetWin_Info->stXCWinInfo.u32InputVTotal;
6975*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16DefaultHtotal = pstDMS_SetWin_Info->stXCWinInfo.u32DefaultHtotal;
6976*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16DefaultPhase = pstDMS_SetWin_Info->stXCWinInfo.u32DefaultPhase;
6977*53ee8cc1Swenshuai.xi 
6978*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bHCusScaling = pstDMS_SetWin_Info->stXCWinInfo.u32HCusScaling;
6979*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bVCusScaling = pstDMS_SetWin_Info->stXCWinInfo.u32VCusScaling;
6980*53ee8cc1Swenshuai.xi         _DMS_XC_SetCusScaling(&stXCSetWinInfo,TRUE,pstDMS_SetWin_Info->stXCWinInfo.u32HCusScalingSrc,pstDMS_SetWin_Info->stXCWinInfo.u32HCusScalingDst,
6981*53ee8cc1Swenshuai.xi             pstDMS_SetWin_Info->stXCWinInfo.u32VCusScalingSrc,pstDMS_SetWin_Info->stXCWinInfo.u32VCusScalingDst);
6982*53ee8cc1Swenshuai.xi 
6983*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bDisplayNineLattice = pstDMS_SetWin_Info->stXCWinInfo.u32DisplayNineLattice;        ///<used to indicate where to display in panel and where to put in frame buffer
6984*53ee8cc1Swenshuai.xi 
6985*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bPreHCusScaling = pstDMS_SetWin_Info->stXCWinInfo.u32PreHCusScaling;
6986*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bPreVCusScaling = pstDMS_SetWin_Info->stXCWinInfo.u32PreVCusScaling;
6987*53ee8cc1Swenshuai.xi         _DMS_XC_SetCusScaling(&stXCSetWinInfo,FALSE,pstDMS_SetWin_Info->stXCWinInfo.u32PreHCusScalingSrc,pstDMS_SetWin_Info->stXCWinInfo.u32PreHCusScalingDst,
6988*53ee8cc1Swenshuai.xi             pstDMS_SetWin_Info->stXCWinInfo.u32PreVCusScalingSrc,pstDMS_SetWin_Info->stXCWinInfo.u32PreVCusScalingDst);
6989*53ee8cc1Swenshuai.xi 
6990*53ee8cc1Swenshuai.xi         MApi_XC_SetWindow(&stXCSetWinInfo, sizeof(XC_SETWIN_INFO), MAIN_WINDOW);
6991*53ee8cc1Swenshuai.xi     }
6992*53ee8cc1Swenshuai.xi #else
6993*53ee8cc1Swenshuai.xi     if(u32WindowID == MVOP_WINDOW)
6994*53ee8cc1Swenshuai.xi     {
6995*53ee8cc1Swenshuai.xi         _DMS_XC_SetConnect(INPUT_SOURCE_DTV);
6996*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s][%d] Do setXC win by DMS!\n\n",__FUNCTION__,__LINE__);
6997*53ee8cc1Swenshuai.xi         DMS_GET_RES_PRI;
6998*53ee8cc1Swenshuai.xi         XC_SETWIN_INFO stXCSetWinInfo;
6999*53ee8cc1Swenshuai.xi         XC_DynamicScaling_Info stXCDsInfo;
7000*53ee8cc1Swenshuai.xi         MS_U32 u32DSInfoLen;
7001*53ee8cc1Swenshuai.xi         XC_OUTPUTFRAME_Info stOutFrameInfo;
7002*53ee8cc1Swenshuai.xi 
7003*53ee8cc1Swenshuai.xi         memset(&stXCSetWinInfo, 0, sizeof(XC_SETWIN_INFO));
7004*53ee8cc1Swenshuai.xi         memset(&stXCDsInfo, 0, sizeof(XC_DynamicScaling_Info));
7005*53ee8cc1Swenshuai.xi         memset(&stOutFrameInfo, 0, sizeof(XC_OUTPUTFRAME_Info));
7006*53ee8cc1Swenshuai.xi 
7007*53ee8cc1Swenshuai.xi         stXCSetWinInfo.enInputSourceType = INPUT_SOURCE_DTV;
7008*53ee8cc1Swenshuai.xi         MVOP_Timing mvop_timing;
7009*53ee8cc1Swenshuai.xi         MVOP_Handle stHd = { E_MVOP_MODULE_MAIN };
7010*53ee8cc1Swenshuai.xi         MS_BOOL bIsXCGenTiming;
7011*53ee8cc1Swenshuai.xi         memset(&mvop_timing, 0, sizeof(MVOP_Timing));
7012*53ee8cc1Swenshuai.xi         if(E_MVOP_OK != MDrv_MVOP_GetOutputTiming(&mvop_timing))
7013*53ee8cc1Swenshuai.xi            DMS_PRINTF("MDrv_MVOP_GetOutputTiming failed!!\n");
7014*53ee8cc1Swenshuai.xi 
7015*53ee8cc1Swenshuai.xi         if(E_MVOP_OK != MDrv_MVOP_GetCommand(&stHd , E_MVOP_CMD_GET_IS_XC_GEN_TIMING, &bIsXCGenTiming , sizeof(bIsXCGenTiming)))
7016*53ee8cc1Swenshuai.xi         {
7017*53ee8cc1Swenshuai.xi             DMS_PRINTF("MDrv_MVOP_Get_XC_GEN_TIMING failed!!\n");
7018*53ee8cc1Swenshuai.xi         }
7019*53ee8cc1Swenshuai.xi 
7020*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bInterlace     = mvop_timing.bInterlace;
7021*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bHDuplicate    = mvop_timing.bHDuplicate;
7022*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16InputVFreq = (bIsXCGenTiming)?g_IPanel.DefaultVFreq():mvop_timing.u8Framerate;
7023*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16InputVTotal = mvop_timing.u16V_TotalCount;
7024*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16DefaultHtotal = mvop_timing.u16H_TotalCount;
7025*53ee8cc1Swenshuai.xi 
7026*53ee8cc1Swenshuai.xi 
7027*53ee8cc1Swenshuai.xi         stOutFrameInfo.u16InVFreq = stXCSetWinInfo.u16InputVFreq;
7028*53ee8cc1Swenshuai.xi         stOutFrameInfo.u16OutVFreq = g_IPanel.DefaultVFreq();
7029*53ee8cc1Swenshuai.xi         stOutFrameInfo.bInterlace = stXCSetWinInfo.bInterlace;
7030*53ee8cc1Swenshuai.xi 
7031*53ee8cc1Swenshuai.xi         //-------------------------
7032*53ee8cc1Swenshuai.xi         _DMS_XC_Set_ScalingDown_Condition(&pstDMS_SetWin_Info->stOutputWinInfo.stCropWin, &pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin);
7033*53ee8cc1Swenshuai.xi         if(_DMS_Is_ScalingConditionUse2ndBuffer(RES_DMS.gDMS_ScalingCondition))
7034*53ee8cc1Swenshuai.xi         {
7035*53ee8cc1Swenshuai.xi             pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32width = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32width / 2;
7036*53ee8cc1Swenshuai.xi             pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32height = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32height / 2;
7037*53ee8cc1Swenshuai.xi         }
7038*53ee8cc1Swenshuai.xi 
7039*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stCapWin, &pstDMS_SetWin_Info->stOutputWinInfo.stCropWin);
7040*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stDispWin, &pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin);
7041*53ee8cc1Swenshuai.xi         _DMS_XC_DMSWintoXCWin(&stXCSetWinInfo.stCropWin, &pstDMS_SetWin_Info->stOutputWinInfo.stCropWin);
7042*53ee8cc1Swenshuai.xi 
7043*53ee8cc1Swenshuai.xi         //-------------------------
7044*53ee8cc1Swenshuai.xi         // customized pre scaling
7045*53ee8cc1Swenshuai.xi         //-------------------------
7046*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bPreHCusScaling = FALSE;
7047*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16PreHCusScalingSrc = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32width;
7048*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16PreHCusScalingDst = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32width;
7049*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bPreVCusScaling = FALSE;
7050*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16PreVCusScalingSrc = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32height;
7051*53ee8cc1Swenshuai.xi         stXCSetWinInfo.u16PreVCusScalingDst = pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32height;
7052*53ee8cc1Swenshuai.xi 
7053*53ee8cc1Swenshuai.xi         //customized Post scaling
7054*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bHCusScaling = FALSE;
7055*53ee8cc1Swenshuai.xi         stXCSetWinInfo.bVCusScaling = FALSE;
7056*53ee8cc1Swenshuai.xi 
7057*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetStartPos(stXCSetWinInfo.stCropWin.x, stXCSetWinInfo.stCropWin.y);
7058*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetImageWidthHight(stXCSetWinInfo.stCropWin.width, stXCSetWinInfo.stCropWin.height);
7059*53ee8cc1Swenshuai.xi         MDrv_MVOP_SetRegSizeFromMVD(FALSE);
7060*53ee8cc1Swenshuai.xi 
7061*53ee8cc1Swenshuai.xi         // ds patch
7062*53ee8cc1Swenshuai.xi         stXCDsInfo.bOP_DS_On = FALSE;
7063*53ee8cc1Swenshuai.xi         stXCDsInfo.bIPS_DS_On = FALSE;
7064*53ee8cc1Swenshuai.xi         stXCDsInfo.bIPM_DS_On = FALSE;
7065*53ee8cc1Swenshuai.xi         u32DSInfoLen = sizeof(XC_DynamicScaling_Info);
7066*53ee8cc1Swenshuai.xi         MApi_XC_SetDynamicScaling(&stXCDsInfo, u32DSInfoLen, 0);
7067*53ee8cc1Swenshuai.xi 
7068*53ee8cc1Swenshuai.xi         MApi_XC_SkipWaitVsync(MAIN_WINDOW,TRUE);
7069*53ee8cc1Swenshuai.xi         MApi_XC_SetWindow(&stXCSetWinInfo, sizeof(XC_SETWIN_INFO), MAIN_WINDOW);
7070*53ee8cc1Swenshuai.xi         MApi_XC_SkipWaitVsync(MAIN_WINDOW,FALSE);
7071*53ee8cc1Swenshuai.xi 
7072*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(_DMS_Is_ScalingConditionUseFBL(RES_DMS.gDMS_ScalingCondition));
7073*53ee8cc1Swenshuai.xi         MApi_XC_OutputFrameCtrl(TRUE, &stOutFrameInfo, MAIN_WINDOW);
7074*53ee8cc1Swenshuai.xi     }
7075*53ee8cc1Swenshuai.xi #endif
7076*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_SetWin(pInstance, &pstDMS_SetWin_Info->stOutputWinInfo.stCropWin, &pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin, u32WindowID);
7077*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7078*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
7079*53ee8cc1Swenshuai.xi }
7080*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetWindowInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_WINDOW_INFO * pstDMS_GetWin_Info)7081*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetWindowInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_WINDOW_INFO *pstDMS_GetWin_Info)
7082*53ee8cc1Swenshuai.xi {
7083*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7084*53ee8cc1Swenshuai.xi }
7085*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Flip(void * pInstance,MS_U32 u32WindowID,ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)7086*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Flip(void* pInstance, MS_U32 u32WindowID, ST_DMS_DISPFRAMEFORMAT* pstDispFrameFormat)
7087*53ee8cc1Swenshuai.xi {
7088*53ee8cc1Swenshuai.xi     DMS_VDECFRAME_INFO stFrameInfo;
7089*53ee8cc1Swenshuai.xi     memset(&stFrameInfo, 0 , sizeof(stFrameInfo));
7090*53ee8cc1Swenshuai.xi     stFrameInfo.u32Window = u32WindowID;
7091*53ee8cc1Swenshuai.xi 
7092*53ee8cc1Swenshuai.xi     stFrameInfo.u16SrcWidth = pstDispFrameFormat->stFrames[0].u32Width;
7093*53ee8cc1Swenshuai.xi     stFrameInfo.u16SrcHeight = pstDispFrameFormat->stFrames[0].u32Height;
7094*53ee8cc1Swenshuai.xi     stFrameInfo.u16SrcPitch = pstDispFrameFormat->stFrames[0].stHWFormat.u32LumaPitch;
7095*53ee8cc1Swenshuai.xi     stFrameInfo.u32SrcLumaAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr;
7096*53ee8cc1Swenshuai.xi     stFrameInfo.u32SrcChromaAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr;
7097*53ee8cc1Swenshuai.xi     stFrameInfo.eFieldType = pstDispFrameFormat->stFrames[0].enFieldType;
7098*53ee8cc1Swenshuai.xi 
7099*53ee8cc1Swenshuai.xi     stFrameInfo.u16CropRight = pstDispFrameFormat->stFrames[0].u32CropRight;
7100*53ee8cc1Swenshuai.xi     stFrameInfo.u16CropLeft = pstDispFrameFormat->stFrames[0].u32CropLeft;
7101*53ee8cc1Swenshuai.xi     stFrameInfo.u16CropBottom = pstDispFrameFormat->stFrames[0].u32CropBottom;
7102*53ee8cc1Swenshuai.xi     stFrameInfo.u16CropTop = pstDispFrameFormat->stFrames[0].u32CropTop;
7103*53ee8cc1Swenshuai.xi 
7104*53ee8cc1Swenshuai.xi     stFrameInfo.u32FrameRate = pstDispFrameFormat->u32FrameRate;
7105*53ee8cc1Swenshuai.xi     stFrameInfo.eCODEC = pstDispFrameFormat->u32CodecType;
7106*53ee8cc1Swenshuai.xi     stFrameInfo.eTileMode = pstDispFrameFormat->u32TileMode;
7107*53ee8cc1Swenshuai.xi     stFrameInfo.eFmt = _DMS_GetColorFormat(pstDispFrameFormat->enColorFormat);
7108*53ee8cc1Swenshuai.xi 
7109*53ee8cc1Swenshuai.xi     stFrameInfo.eScanType = _DMS_GetDMSScanType(pstDispFrameFormat->u8Interlace);
7110*53ee8cc1Swenshuai.xi     stFrameInfo.eFieldOrderType  = !(pstDispFrameFormat->u8BottomFieldFirst);
7111*53ee8cc1Swenshuai.xi 
7112*53ee8cc1Swenshuai.xi     if(stFrameInfo.eScanType == E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD)
7113*53ee8cc1Swenshuai.xi     {
7114*53ee8cc1Swenshuai.xi         stFrameInfo.u32SrcLumaAddrI = pstDispFrameFormat->stFrames[1].stHWFormat.phyLumaAddr;
7115*53ee8cc1Swenshuai.xi         stFrameInfo.u32SrcChromaAddrI = pstDispFrameFormat->stFrames[1].stHWFormat.phyChromaAddr;
7116*53ee8cc1Swenshuai.xi         stFrameInfo.u32FrameIndex_2nd = pstDispFrameFormat->stFrames[1].u32Idx;
7117*53ee8cc1Swenshuai.xi         stFrameInfo.u32PriData_2nd = pstDispFrameFormat->stFrames[1].u32PriData;
7118*53ee8cc1Swenshuai.xi     }
7119*53ee8cc1Swenshuai.xi 
7120*53ee8cc1Swenshuai.xi     stFrameInfo.b10bitData = (pstDispFrameFormat->enColorFormat == E_DMS_COLOR_FORMAT_10BIT_TILE)? TRUE : FALSE;
7121*53ee8cc1Swenshuai.xi     if(stFrameInfo.b10bitData)
7122*53ee8cc1Swenshuai.xi     {
7123*53ee8cc1Swenshuai.xi         stFrameInfo.u16Src10bitPitch = pstDispFrameFormat->stFrames[0].stHWFormat.u32LumaPitch2Bit;
7124*53ee8cc1Swenshuai.xi         stFrameInfo.u32SrcLumaAddr_2bit = pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr2Bit;
7125*53ee8cc1Swenshuai.xi         stFrameInfo.u32SrcChromaAddr_2bit = pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr2Bit;
7126*53ee8cc1Swenshuai.xi         stFrameInfo.u8LumaBitdepth = pstDispFrameFormat->stFrames[0].u8LumaBitdepth;
7127*53ee8cc1Swenshuai.xi     }
7128*53ee8cc1Swenshuai.xi 
7129*53ee8cc1Swenshuai.xi     /// Frame index
7130*53ee8cc1Swenshuai.xi     stFrameInfo.u32FrameIndex = pstDispFrameFormat->stFrames[0].u32Idx;
7131*53ee8cc1Swenshuai.xi     stFrameInfo.u32VDECStreamID = pstDispFrameFormat->u32VdecStreamId;
7132*53ee8cc1Swenshuai.xi     stFrameInfo.u32VDECStreamVersion = pstDispFrameFormat->u32VdecStreamVersion;
7133*53ee8cc1Swenshuai.xi     stFrameInfo.u32PriData = pstDispFrameFormat->stFrames[0].u32PriData;
7134*53ee8cc1Swenshuai.xi     stFrameInfo.u64Pts = pstDispFrameFormat->u64Pts;
7135*53ee8cc1Swenshuai.xi     if(gDMSMVOPForceLookVDEC)
7136*53ee8cc1Swenshuai.xi     {
7137*53ee8cc1Swenshuai.xi         //DMS_PRINTF("Flip%d: Y 0x%llx, C 0x%llx, pri 0x%x\n",u32WindowID,stFrameInfo.u32SrcLumaAddr,stFrameInfo.u32SrcChromaAddr,stFrameInfo.u32PriData);
7138*53ee8cc1Swenshuai.xi     }
7139*53ee8cc1Swenshuai.xi 
7140*53ee8cc1Swenshuai.xi     //mfcodec info
7141*53ee8cc1Swenshuai.xi     stFrameInfo.stMFdecInfo.bMFDec_Enable = pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo & 0xFF ;
7142*53ee8cc1Swenshuai.xi     if(stFrameInfo.stMFdecInfo.bMFDec_Enable != 0 && stFrameInfo.stMFdecInfo.bMFDec_Enable != 0xFF)
7143*53ee8cc1Swenshuai.xi     {
7144*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.bMFDec_Enable = 1;
7145*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.bBypass_codec_mode = 0;
7146*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.u8MFDec_Select = (pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo >> 8) & 0x3;     //Bit[8]      MFDec ID. 1: MFDec 1; 0: MFDec 0; 2 MFDec 2;
7147*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.bUncompress_mode = (pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo >> 28) & 0x1;  //Bit[28]     1: MFCodec uncompress mode; 0: data is compressed
7148*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.en_MFDecVP9_mode = (pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo >> 29) & 0x1;  //Bit[29]     1: MFCodec 3.0 vp9 mode; 0: MFCodec 3.0 h26x mode
7149*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.u16Bitlen_Pitch = (pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo >> 16) & 0xFF; //Bits[23:16] MFCodec pitch setting
7150*53ee8cc1Swenshuai.xi 
7151*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.u16StartX = stFrameInfo.u16CropLeft;
7152*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.u16StartY = stFrameInfo.u16CropTop;
7153*53ee8cc1Swenshuai.xi 
7154*53ee8cc1Swenshuai.xi         MS_U8 u8BitLenmiu = 0;
7155*53ee8cc1Swenshuai.xi         u8BitLenmiu = (pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo >> 24) & 0xF ;
7156*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.u8Bitlen_MiuSelect = u8BitLenmiu;
7157*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.phyBitlen_Base = (u8BitLenmiu == 0) ? (MS_PHY)pstDispFrameFormat->stFrames[0].stHWFormat.phyMFCBITLEN : ((MS_PHY)pstDispFrameFormat->stFrames[0].stHWFormat.phyMFCBITLEN | HAL_MIU1_BASE);
7158*53ee8cc1Swenshuai.xi     }
7159*53ee8cc1Swenshuai.xi     else
7160*53ee8cc1Swenshuai.xi     {
7161*53ee8cc1Swenshuai.xi         stFrameInfo.stMFdecInfo.bMFDec_Enable = 0;
7162*53ee8cc1Swenshuai.xi     }
7163*53ee8cc1Swenshuai.xi 
7164*53ee8cc1Swenshuai.xi     //set 2nd buffer (real case use a flag to control MVOP watch which buffer)
7165*53ee8cc1Swenshuai.xi     if(pstDispFrameFormat->stFrames[0].stHWFormat.u8V7DataValid & BIT(0))
7166*53ee8cc1Swenshuai.xi     {
7167*53ee8cc1Swenshuai.xi         stFrameInfo.phySrc2ndBufferLumaAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr_subsample;
7168*53ee8cc1Swenshuai.xi         stFrameInfo.phySrc2ndBufferChromaAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr_subsample;
7169*53ee8cc1Swenshuai.xi         stFrameInfo.u16Src2ndBufferPitch = pstDispFrameFormat->stFrames[0].stHWFormat.u16Pitch_subsample;
7170*53ee8cc1Swenshuai.xi         stFrameInfo.u8Src2ndBufferTileMode = pstDispFrameFormat->stFrames[0].stHWFormat.u8TileMode_subsample;
7171*53ee8cc1Swenshuai.xi         stFrameInfo.u8Src2ndBufferV7DataValid = pstDispFrameFormat->stFrames[0].stHWFormat.u8V7DataValid;
7172*53ee8cc1Swenshuai.xi         stFrameInfo.u16Src2ndBufferWidth = pstDispFrameFormat->stFrames[0].stHWFormat.u16Width_subsample;
7173*53ee8cc1Swenshuai.xi         stFrameInfo.u16Src2ndBufferHeight = pstDispFrameFormat->stFrames[0].stHWFormat.u16Height_subsample;
7174*53ee8cc1Swenshuai.xi     }
7175*53ee8cc1Swenshuai.xi     else
7176*53ee8cc1Swenshuai.xi     {
7177*53ee8cc1Swenshuai.xi         //Patch for no 2nd buffer come
7178*53ee8cc1Swenshuai.xi         if(stFrameInfo.u16SrcWidth >= CONDITION_4K_WIDTH && stFrameInfo.u16SrcHeight >= CONDITION_4K_HEIGHT)
7179*53ee8cc1Swenshuai.xi         {
7180*53ee8cc1Swenshuai.xi             static MS_BOOL v7verify = TRUE;
7181*53ee8cc1Swenshuai.xi             if(v7verify)
7182*53ee8cc1Swenshuai.xi             {
7183*53ee8cc1Swenshuai.xi                 VDEC_EX_FrameInfoExt_v7 stFrmInfo_v7;
7184*53ee8cc1Swenshuai.xi                 memset(&stFrmInfo_v7,0,sizeof(VDEC_EX_FrameInfoExt_v7));
7185*53ee8cc1Swenshuai.xi                 VDEC_EX_VerCtl *stVerCrl = (VDEC_EX_VerCtl *) &stFrmInfo_v7;
7186*53ee8cc1Swenshuai.xi                 stVerCrl->u32version = 7;
7187*53ee8cc1Swenshuai.xi                 stVerCrl->u32size = sizeof(VDEC_EX_FrameInfoExt_v7);
7188*53ee8cc1Swenshuai.xi                 VDEC_StreamId stVDEC_StreamId;
7189*53ee8cc1Swenshuai.xi                 stVDEC_StreamId.u32Id = stFrameInfo.u32VDECStreamID;
7190*53ee8cc1Swenshuai.xi                 stVDEC_StreamId.u32Version = stFrameInfo.u32VDECStreamVersion;
7191*53ee8cc1Swenshuai.xi                 if (E_VDEC_EX_OK == MApi_VDEC_EX_GetControl(&stVDEC_StreamId, E_VDEC_EX_USER_CMD_GET_NEXT_DISP_FRAME_INFO_EXT, (MS_U32 *)&stFrmInfo_v7))
7192*53ee8cc1Swenshuai.xi                 {
7193*53ee8cc1Swenshuai.xi                     stFrameInfo.phySrc2ndBufferLumaAddr = stFrmInfo_v7.phyLumaAddr_subsample;
7194*53ee8cc1Swenshuai.xi                     stFrameInfo.phySrc2ndBufferChromaAddr = stFrmInfo_v7.phyChromaAddr_subsample;
7195*53ee8cc1Swenshuai.xi                     stFrameInfo.u16Src2ndBufferPitch = stFrmInfo_v7.u16Pitch_subsample;
7196*53ee8cc1Swenshuai.xi                     if(stFrameInfo.u16Src2ndBufferPitch != 0)
7197*53ee8cc1Swenshuai.xi                     {
7198*53ee8cc1Swenshuai.xi                         static MS_BOOL bLogFlag = FALSE;
7199*53ee8cc1Swenshuai.xi                         if(!bLogFlag)
7200*53ee8cc1Swenshuai.xi                         {
7201*53ee8cc1Swenshuai.xi                             DMS_PRINTF("[%s] Get 2nd Buffer in DMS! This is patch, need flip info for DMS!\n",__FUNCTION__);
7202*53ee8cc1Swenshuai.xi                             bLogFlag = TRUE;
7203*53ee8cc1Swenshuai.xi                         }
7204*53ee8cc1Swenshuai.xi                     }
7205*53ee8cc1Swenshuai.xi                     else
7206*53ee8cc1Swenshuai.xi                     {
7207*53ee8cc1Swenshuai.xi                         v7verify = FALSE;
7208*53ee8cc1Swenshuai.xi                         DMS_PRINTF("[%s] Get 2nd Buffer in DMS! But pitch is 0, do not get any more!\n",__FUNCTION__);
7209*53ee8cc1Swenshuai.xi                     }
7210*53ee8cc1Swenshuai.xi                 }
7211*53ee8cc1Swenshuai.xi                 else
7212*53ee8cc1Swenshuai.xi                 {
7213*53ee8cc1Swenshuai.xi                     DMS_PRINTF("[%s] VDEC info ver7 not impl, get sub_buffer failed\n",__FUNCTION__);
7214*53ee8cc1Swenshuai.xi                     v7verify = FALSE;
7215*53ee8cc1Swenshuai.xi                 }
7216*53ee8cc1Swenshuai.xi             }
7217*53ee8cc1Swenshuai.xi         }
7218*53ee8cc1Swenshuai.xi     }
7219*53ee8cc1Swenshuai.xi 
7220*53ee8cc1Swenshuai.xi     //Field ctrl
7221*53ee8cc1Swenshuai.xi     stFrameInfo.u8FieldCtrl = pstDispFrameFormat->u8FieldCtrl;
7222*53ee8cc1Swenshuai.xi 
7223*53ee8cc1Swenshuai.xi     //DMS_PRINTF("%d %d %d\n",stFrameInfo.eScanType,pstDispFrameFormat->u8Interlace,stFrameInfo.eTileMode);
7224*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7225*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7226*53ee8cc1Swenshuai.xi 
7227*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 0)
7228*53ee8cc1Swenshuai.xi #if 0
7229*53ee8cc1Swenshuai.xi     if(u32WindowID == MVOP_WINDOW)
7230*53ee8cc1Swenshuai.xi     {
7231*53ee8cc1Swenshuai.xi         MS_BOOL ret;
7232*53ee8cc1Swenshuai.xi         MS_U16 NextWritePointer = 0;
7233*53ee8cc1Swenshuai.xi 
7234*53ee8cc1Swenshuai.xi         NextWritePointer = RES_DMS._stXC_DIPWriteReadPointer[stFrameInfo.u32Window].u16WritePointer;
7235*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DIPWriteReadPointer[stFrameInfo.u32Window].u16WritePointer = NextWritePointer;
7236*53ee8cc1Swenshuai.xi         memcpy(&RES_DMS.stFrameInfo_mainWin[NextWritePointer], &stFrameInfo, sizeof(DMS_VDECFRAME_INFO));
7237*53ee8cc1Swenshuai.xi 
7238*53ee8cc1Swenshuai.xi         ret = _DMS_VDEC_Frame_AddRef_MVOP(pDMSResPri->stDrvDMSMvop.s32Frame_index);
7239*53ee8cc1Swenshuai.xi         //if(pDMSResPri->stDrvDMSMvop.s32Release_Frame_index >= 0)
7240*53ee8cc1Swenshuai.xi         //{
7241*53ee8cc1Swenshuai.xi         //    ret = _DMS_VDEC_Frame_Release_MVOP(pDMSResPri->stDrvDMSMvop.s32Release_Frame_index);
7242*53ee8cc1Swenshuai.xi         //}
7243*53ee8cc1Swenshuai.xi 
7244*53ee8cc1Swenshuai.xi         //MsOS_EnableInterrupt(E_INT_IRQ_DC);
7245*53ee8cc1Swenshuai.xi         //MDrv_MVOP_EnableInterrupt(E_MVOP_INT_VSYNC);
7246*53ee8cc1Swenshuai.xi 
7247*53ee8cc1Swenshuai.xi     }
7248*53ee8cc1Swenshuai.xi #endif
7249*53ee8cc1Swenshuai.xi #else
7250*53ee8cc1Swenshuai.xi #if (DEV_DI == 1)
7251*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32WindowID) && _DMS_Is_SourceInterlace(stFrameInfo.eScanType))
7252*53ee8cc1Swenshuai.xi     {
7253*53ee8cc1Swenshuai.xi         _DMS_StoreVDECInfo2DIPInterlaceQueue(&stFrameInfo);
7254*53ee8cc1Swenshuai.xi         RES_DMSDI._u8DMS_DiSetEventBufferID = RES_DMSDI._stXC_DIPWriteReadPointerInterlace[u32WindowID].u16WritePointer;
7255*53ee8cc1Swenshuai.xi #if DEV_DI_EVENT
7256*53ee8cc1Swenshuai.xi         //MsOS_SetEvent(XC_Di_Push_Event_id, 0x01);
7257*53ee8cc1Swenshuai.xi #else
7258*53ee8cc1Swenshuai.xi         RES_DMSDI.bFlipToDiTask = TRUE;
7259*53ee8cc1Swenshuai.xi #endif
7260*53ee8cc1Swenshuai.xi         if(_DMS_Is_SourceFrameBaseInterlace(stFrameInfo.eScanType,stFrameInfo.eFieldType)
7261*53ee8cc1Swenshuai.xi             || _DMS_Is_SourceFieldBaseInterlace(stFrameInfo.eScanType))
7262*53ee8cc1Swenshuai.xi         {
7263*53ee8cc1Swenshuai.xi             stFrameInfo.bIs2ndField = TRUE;
7264*53ee8cc1Swenshuai.xi             _DMS_StoreVDECInfo2DIPInterlaceQueue(&stFrameInfo);
7265*53ee8cc1Swenshuai.xi         }
7266*53ee8cc1Swenshuai.xi     }
7267*53ee8cc1Swenshuai.xi     else
7268*53ee8cc1Swenshuai.xi #endif
7269*53ee8cc1Swenshuai.xi #endif
7270*53ee8cc1Swenshuai.xi     {
7271*53ee8cc1Swenshuai.xi #if 0
7272*53ee8cc1Swenshuai.xi         if(u32WindowID != MVOP_WINDOW)
7273*53ee8cc1Swenshuai.xi #endif
7274*53ee8cc1Swenshuai.xi         {
7275*53ee8cc1Swenshuai.xi             _DMS_StoreVDECInfo2DIPQueue(pInstance, &stFrameInfo);
7276*53ee8cc1Swenshuai.xi         }
7277*53ee8cc1Swenshuai.xi #if (DMS_MAIN_WINDOW_FLOW_VERSION == 1)
7278*53ee8cc1Swenshuai.xi         if(_DMS_Is_MVOPFlow(u32WindowID))
7279*53ee8cc1Swenshuai.xi         {
7280*53ee8cc1Swenshuai.xi             RES_DMSDI._u8DMS_DiSetEventBufferID = DMS_Invalid_ReadPointer_ID;
7281*53ee8cc1Swenshuai.xi         }
7282*53ee8cc1Swenshuai.xi #endif
7283*53ee8cc1Swenshuai.xi #if 0
7284*53ee8cc1Swenshuai.xi         if(u32WindowID != MVOP_WINDOW)
7285*53ee8cc1Swenshuai.xi #endif
7286*53ee8cc1Swenshuai.xi         {
7287*53ee8cc1Swenshuai.xi             if(_DMS_Is_SourceFrameBaseInterlace(stFrameInfo.eScanType,stFrameInfo.eFieldType)
7288*53ee8cc1Swenshuai.xi                 || _DMS_Is_SourceFieldBaseInterlace(stFrameInfo.eScanType))
7289*53ee8cc1Swenshuai.xi             {
7290*53ee8cc1Swenshuai.xi                 stFrameInfo.bIs2ndField = TRUE;
7291*53ee8cc1Swenshuai.xi                 _DMS_StoreVDECInfo2DIPQueue(pInstance, &stFrameInfo);
7292*53ee8cc1Swenshuai.xi             }
7293*53ee8cc1Swenshuai.xi         }
7294*53ee8cc1Swenshuai.xi     }
7295*53ee8cc1Swenshuai.xi #if DBG_FPS
7296*53ee8cc1Swenshuai.xi     u32FPS_Push_Counter[u32WindowID]++;
7297*53ee8cc1Swenshuai.xi #endif
7298*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7299*53ee8cc1Swenshuai.xi 
7300*53ee8cc1Swenshuai.xi     return TRUE;
7301*53ee8cc1Swenshuai.xi }
7302*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetZOrder(void * pInstance,MS_U32 u32WindowID,MS_U32 u32ZOrder)7303*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetZOrder(void* pInstance, MS_U32 u32WindowID, MS_U32 u32ZOrder)
7304*53ee8cc1Swenshuai.xi {
7305*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7306*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7307*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
7308*53ee8cc1Swenshuai.xi 
7309*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_SetWindowZOrder(u32WindowID, u32ZOrder);
7310*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7311*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
7312*53ee8cc1Swenshuai.xi }
7313*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Freeze(void * pInstance,MS_U32 u32WindowID,MS_U32 u32Enable)7314*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Freeze(void* pInstance, MS_U32 u32WindowID, MS_U32 u32Enable)
7315*53ee8cc1Swenshuai.xi {
7316*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7317*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7318*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32Enable : %td === \033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32Enable);
7319*53ee8cc1Swenshuai.xi     if(u32Enable)
7320*53ee8cc1Swenshuai.xi     {
7321*53ee8cc1Swenshuai.xi         RES_DMS.bDMS_Freeze_DoubleBuffer = TRUE;
7322*53ee8cc1Swenshuai.xi     }
7323*53ee8cc1Swenshuai.xi     else
7324*53ee8cc1Swenshuai.xi     {
7325*53ee8cc1Swenshuai.xi         RES_DMS.bDMS_Freeze_DoubleBuffer = FALSE;
7326*53ee8cc1Swenshuai.xi     }
7327*53ee8cc1Swenshuai.xi 
7328*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32WindowID) == TRUE)
7329*53ee8cc1Swenshuai.xi     {
7330*53ee8cc1Swenshuai.xi         _DMS_Add_XC_Status(u32WindowID, DMS_XC_FREEZE_SETTING);
7331*53ee8cc1Swenshuai.xi     }
7332*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7333*53ee8cc1Swenshuai.xi     return TRUE;
7334*53ee8cc1Swenshuai.xi }
7335*53ee8cc1Swenshuai.xi 
_MDrv_DMS_SetMute(void * pInstance,MS_U32 u32WindowID,MS_U32 u32Enable)7336*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_SetMute(void* pInstance, MS_U32 u32WindowID, MS_U32 u32Enable)
7337*53ee8cc1Swenshuai.xi {
7338*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7339*53ee8cc1Swenshuai.xi     if(_DMS_Is_MVOPFlow(u32WindowID) == TRUE)
7340*53ee8cc1Swenshuai.xi     {
7341*53ee8cc1Swenshuai.xi #if(DMS_MAIN_WINDOW_FLOW_VERSION == 1)
7342*53ee8cc1Swenshuai.xi         Hal_DMS_XC_SetMute(pInstance, u32Enable);
7343*53ee8cc1Swenshuai.xi #else
7344*53ee8cc1Swenshuai.xi       if(u32Enable)
7345*53ee8cc1Swenshuai.xi       {
7346*53ee8cc1Swenshuai.xi           Hal_DMS_XC_SetMute(pInstance, u32Enable);
7347*53ee8cc1Swenshuai.xi       }
7348*53ee8cc1Swenshuai.xi       else
7349*53ee8cc1Swenshuai.xi       {
7350*53ee8cc1Swenshuai.xi           if(RES_DMS.bFirstPlay)
7351*53ee8cc1Swenshuai.xi           {
7352*53ee8cc1Swenshuai.xi               RES_DMS.bDisableBlackScreen = TRUE;
7353*53ee8cc1Swenshuai.xi           }
7354*53ee8cc1Swenshuai.xi           else
7355*53ee8cc1Swenshuai.xi           {
7356*53ee8cc1Swenshuai.xi               Hal_DMS_XC_SetMute(pInstance, u32Enable);
7357*53ee8cc1Swenshuai.xi           }
7358*53ee8cc1Swenshuai.xi        }
7359*53ee8cc1Swenshuai.xi #endif
7360*53ee8cc1Swenshuai.xi     }
7361*53ee8cc1Swenshuai.xi     else
7362*53ee8cc1Swenshuai.xi     {
7363*53ee8cc1Swenshuai.xi         RES_DMS.bIsWindowMute[u32WindowID] = u32Enable;
7364*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_0][u32WindowID].bCleanBuf = u32Enable;
7365*53ee8cc1Swenshuai.xi         RES_DMS._stXC_DispBuf_Flag[E_DMS_DIP_MULTIVIEW_BUF_ID_1][u32WindowID].bCleanBuf = u32Enable;
7366*53ee8cc1Swenshuai.xi     }
7367*53ee8cc1Swenshuai.xi     return TRUE;
7368*53ee8cc1Swenshuai.xi }
7369*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Mute(void * pInstance,MS_U32 u32WindowID,MS_U32 u32Enable)7370*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Mute(void* pInstance, MS_U32 u32WindowID, MS_U32 u32Enable)
7371*53ee8cc1Swenshuai.xi {
7372*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7373*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7374*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
7375*53ee8cc1Swenshuai.xi 
7376*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_SetMute(pInstance, u32WindowID, u32Enable);
7377*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7378*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
7379*53ee8cc1Swenshuai.xi }
7380*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_MuteColor(void * pInstance,MS_U32 u32WindowID,ST_DMS_COLOR stMuteColor)7381*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_MuteColor(void* pInstance, MS_U32 u32WindowID, ST_DMS_COLOR stMuteColor)
7382*53ee8cc1Swenshuai.xi {
7383*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl %td=== \033[0m\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32WindowID);
7384*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7385*53ee8cc1Swenshuai.xi }
7386*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetStatus(void * pInstance,MS_U32 * pu32Status)7387*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetStatus(void* pInstance, MS_U32 *pu32Status)
7388*53ee8cc1Swenshuai.xi {
7389*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl === \033[0m\n",__FUNCTION__,__LINE__);
7390*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7391*53ee8cc1Swenshuai.xi }
7392*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetCapability(void * pInstance,EN_DMS_CAPABILITY * peCapability)7393*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetCapability(void* pInstance, EN_DMS_CAPABILITY *peCapability)
7394*53ee8cc1Swenshuai.xi {
7395*53ee8cc1Swenshuai.xi     HAL_DMS_XC_GetCaps(pInstance, peCapability);
7396*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7397*53ee8cc1Swenshuai.xi }
7398*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetOutputLayer(void * pInstance,ST_DMS_WINDOW * pstLayer)7399*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetOutputLayer(void* pInstance, ST_DMS_WINDOW *pstLayer)
7400*53ee8cc1Swenshuai.xi {
7401*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7402*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7403*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS.stOutputLayer,pstLayer,sizeof(ST_DMS_WINDOW));
7404*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7405*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7406*53ee8cc1Swenshuai.xi }
7407*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_3D_Mode(void * pInstance,MS_U32 u32WindowID,ST_DMS_3D_INFO * pst3DInfo)7408*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_3D_Mode(void* pInstance, MS_U32 u32WindowID, ST_DMS_3D_INFO *pst3DInfo)
7409*53ee8cc1Swenshuai.xi {
7410*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
7411*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7412*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7413*53ee8cc1Swenshuai.xi     if(MApi_XC_Set_3D_Mode(pst3DInfo->en3DInputMode, pst3DInfo->en3DOutputMode, pst3DInfo->en3DPanelType, MAIN_WINDOW))
7414*53ee8cc1Swenshuai.xi     {
7415*53ee8cc1Swenshuai.xi         if(FALSE == MApi_XC_Set_3D_Mode(pst3DInfo->en3DInputMode, pst3DInfo->en3DOutputMode, pst3DInfo->en3DPanelType, SUB_WINDOW))
7416*53ee8cc1Swenshuai.xi         {
7417*53ee8cc1Swenshuai.xi             DMS_PRINTF("MApi_XC_Set_3D_Mode for Sub window failed\n");
7418*53ee8cc1Swenshuai.xi             bRet = FALSE;
7419*53ee8cc1Swenshuai.xi         }
7420*53ee8cc1Swenshuai.xi     }
7421*53ee8cc1Swenshuai.xi     else
7422*53ee8cc1Swenshuai.xi     {
7423*53ee8cc1Swenshuai.xi         DMS_PRINTF("MApi_XC_Set_3D_Mode for Main window failed\n");
7424*53ee8cc1Swenshuai.xi         bRet = FALSE;
7425*53ee8cc1Swenshuai.xi     }
7426*53ee8cc1Swenshuai.xi 
7427*53ee8cc1Swenshuai.xi     if(pst3DInfo->en3DInputMode == E_DMS_3D_INPUT_MODE_NONE || pst3DInfo->en3DOutputMode == E_DMS_3D_OUTPUT_MODE_NONE)
7428*53ee8cc1Swenshuai.xi     {
7429*53ee8cc1Swenshuai.xi         DMS_PRINTF("Disable 3D\n");
7430*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(TRUE);
7431*53ee8cc1Swenshuai.xi         MApi_XC_Set_DynamicScalingFlag(TRUE);
7432*53ee8cc1Swenshuai.xi     }
7433*53ee8cc1Swenshuai.xi     else
7434*53ee8cc1Swenshuai.xi     {
7435*53ee8cc1Swenshuai.xi         DMS_PRINTF("Enable 3D\n");
7436*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(FALSE);
7437*53ee8cc1Swenshuai.xi         MApi_XC_Set_DynamicScalingFlag(FALSE);
7438*53ee8cc1Swenshuai.xi     }
7439*53ee8cc1Swenshuai.xi 
7440*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7441*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
7442*53ee8cc1Swenshuai.xi }
7443*53ee8cc1Swenshuai.xi 
_MDrv_DMS_CaptureMode_ColorFmtMapping(MS_U32 u32WindowID,EN_DMS_CAPTURE_COLORFORMAT enColorFormat)7444*53ee8cc1Swenshuai.xi EN_DMS_DIP_FMT _MDrv_DMS_CaptureMode_ColorFmtMapping(MS_U32 u32WindowID, EN_DMS_CAPTURE_COLORFORMAT enColorFormat)
7445*53ee8cc1Swenshuai.xi {
7446*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7447*53ee8cc1Swenshuai.xi     EN_DMS_DIP_FMT eFmt;
7448*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enTileBlock = DMS_DIP_TILE_BLOCK_W_16_32;
7449*53ee8cc1Swenshuai.xi     switch(enColorFormat)
7450*53ee8cc1Swenshuai.xi     {
7451*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_16X32TILE:
7452*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_YUV420;
7453*53ee8cc1Swenshuai.xi             break;
7454*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_32X16TILE:
7455*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_YUV420;
7456*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enTileBlock = DMS_DIP_TILE_BLOCK_W_32_16;
7457*53ee8cc1Swenshuai.xi             break;
7458*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_32X32TILE:
7459*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_YUV420;
7460*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enTileBlock = DMS_DIP_TILE_BLOCK_W_32_32;
7461*53ee8cc1Swenshuai.xi             break;
7462*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_YUYV:
7463*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_YVYU:
7464*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_UYVY:
7465*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_VYUY:
7466*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_YUV422;
7467*53ee8cc1Swenshuai.xi             break;
7468*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_NV12:
7469*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_NV21:
7470*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_YUV420_SEMI_PLANER;
7471*53ee8cc1Swenshuai.xi             break;
7472*53ee8cc1Swenshuai.xi         case E_DMS_CAPTURE_COLOR_FORMAT_MAX:
7473*53ee8cc1Swenshuai.xi         default:
7474*53ee8cc1Swenshuai.xi             eFmt = E_DMS_DIP_FMT_MAX;
7475*53ee8cc1Swenshuai.xi             printf("\033[31m [%s][%d] === Wrong color fmt! === \033[0m\n",__FUNCTION__,__LINE__);
7476*53ee8cc1Swenshuai.xi             break;
7477*53ee8cc1Swenshuai.xi     }
7478*53ee8cc1Swenshuai.xi     return eFmt;
7479*53ee8cc1Swenshuai.xi }
7480*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_CaptureInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_SET_CAPTURE_INFO * pstSetCaptureInfo)7481*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_CaptureInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_SET_CAPTURE_INFO *pstSetCaptureInfo)
7482*53ee8cc1Swenshuai.xi {
7483*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
7484*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7485*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7486*53ee8cc1Swenshuai.xi 
7487*53ee8cc1Swenshuai.xi     if(pstSetCaptureInfo->u32Enable == FALSE)
7488*53ee8cc1Swenshuai.xi     {
7489*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Enable = pstSetCaptureInfo->u32Enable;
7490*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].bStartGetCapture = FALSE;
7491*53ee8cc1Swenshuai.xi         MS_U8 u8BufID;
7492*53ee8cc1Swenshuai.xi         for(u8BufID = 0; u8BufID < DMS_DIP_QUEUEDEPTH; u8BufID++)
7493*53ee8cc1Swenshuai.xi         {
7494*53ee8cc1Swenshuai.xi             _DMS_Clear_VDEC_Frame_Ref_CaptureMode(u32WindowID, u8BufID);
7495*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE.bIsFrameValid[u32WindowID][u8BufID] = FALSE;
7496*53ee8cc1Swenshuai.xi         }
7497*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7498*53ee8cc1Swenshuai.xi         return E_DMS_OK;
7499*53ee8cc1Swenshuai.xi     }
7500*53ee8cc1Swenshuai.xi 
7501*53ee8cc1Swenshuai.xi     if(RES_DMS._stXC_DIPWinInfo[u32WindowID].bDIPwinUse == FALSE)
7502*53ee8cc1Swenshuai.xi     {
7503*53ee8cc1Swenshuai.xi         RES_DMS.u8UseDIPWindowCount++;
7504*53ee8cc1Swenshuai.xi         _CalculateMaxOutputFrameRate();
7505*53ee8cc1Swenshuai.xi 
7506*53ee8cc1Swenshuai.xi         if(pstSetCaptureInfo->u32Visible == TRUE)
7507*53ee8cc1Swenshuai.xi         {
7508*53ee8cc1Swenshuai.xi             pstSetCaptureInfo->u32Visible = FALSE;
7509*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[1;31m[%s][%d] error, Visible can't be TRUE before setting window info\033[0m\n",__FUNCTION__,__LINE__);
7510*53ee8cc1Swenshuai.xi         }
7511*53ee8cc1Swenshuai.xi     }
7512*53ee8cc1Swenshuai.xi     RES_DMS.u8DIP_Window[E_DMS_DIP_CAPTURE] = DMS_DIPWindow_CAPTURE;
7513*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Enable = pstSetCaptureInfo->u32Enable;
7514*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Visible = pstSetCaptureInfo->u32Visible;
7515*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Visible == FALSE)
7516*53ee8cc1Swenshuai.xi     {
7517*53ee8cc1Swenshuai.xi         _MDrv_DMS_SetMute(pInstance, u32WindowID, TRUE);
7518*53ee8cc1Swenshuai.xi     }
7519*53ee8cc1Swenshuai.xi     else
7520*53ee8cc1Swenshuai.xi     {
7521*53ee8cc1Swenshuai.xi         _MDrv_DMS_SetMute(pInstance, u32WindowID, FALSE);
7522*53ee8cc1Swenshuai.xi     }
7523*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32FrameRate = pstSetCaptureInfo->u32FrameRate;
7524*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Width = pstSetCaptureInfo->u32Width;
7525*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height = pstSetCaptureInfo->u32Height;
7526*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enColorFormat = pstSetCaptureInfo->enColorFormat;
7527*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enDIPDataFmt = _MDrv_DMS_CaptureMode_ColorFmtMapping(u32WindowID, pstSetCaptureInfo->enColorFormat);
7528*53ee8cc1Swenshuai.xi     //RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enColorFormat = E_DMS_DIP_FMT_YUV422;
7529*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
7530*53ee8cc1Swenshuai.xi     MS_U32 BytesPerLine = 0;
7531*53ee8cc1Swenshuai.xi     BytesPerLine = _DMS_DIP_CalcPitch(_DMS_DIP_Capture_ColorFmtMapping(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].enDIPDataFmt), RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Width);
7532*53ee8cc1Swenshuai.xi 
7533*53ee8cc1Swenshuai.xi     MS_PHY phyMaxNeedSize = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height * BytesPerLine * DMS_CAPTUREWIN_RING_BUFFER;
7534*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_HVSP == 0)
7535*53ee8cc1Swenshuai.xi     //phyMaxNeedSize += (RES_DMS._stXC_DIPCaptureWinInfo[u32WindowID].u32Height * BytesPerLine);
7536*53ee8cc1Swenshuai.xi #endif
7537*53ee8cc1Swenshuai.xi     if(phyMaxNeedSize > pstSetCaptureInfo->phySize)
7538*53ee8cc1Swenshuai.xi     {
7539*53ee8cc1Swenshuai.xi         DMS_PRINTF("\033[1;31m[%s][%d] error, buffer not enough u32MemBufferSize 0x%llx , need 0x%llx\033[0m\n",__FUNCTION__,__LINE__,pstSetCaptureInfo->phySize, phyMaxNeedSize);
7540*53ee8cc1Swenshuai.xi         return E_DMS_FAIL;
7541*53ee8cc1Swenshuai.xi     }
7542*53ee8cc1Swenshuai.xi 
7543*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32StartMemAddr = pstSetCaptureInfo->phyAddr;
7544*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32EndMemAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32StartMemAddr + (BytesPerLine * RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height);
7545*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32SecondBufStartMemAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32StartMemAddr + (BytesPerLine * RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height);
7546*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32SecondBufEndMemAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32EndMemAddr + (BytesPerLine * RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height);
7547*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32ThirdBufStartMemAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32SecondBufStartMemAddr + (BytesPerLine * RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height);
7548*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32ThirdBufEndMemAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32SecondBufEndMemAddr + (BytesPerLine * RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32Height);
7549*53ee8cc1Swenshuai.xi 
7550*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[0].phyBufferYAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32StartMemAddr;
7551*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[1].phyBufferYAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32SecondBufStartMemAddr;
7552*53ee8cc1Swenshuai.xi     RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[2].phyBufferYAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32ThirdBufStartMemAddr;
7553*53ee8cc1Swenshuai.xi #endif
7554*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7555*53ee8cc1Swenshuai.xi #endif
7556*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7557*53ee8cc1Swenshuai.xi }
7558*53ee8cc1Swenshuai.xi 
MDrv_DMS_Get_CaptureBuffer(void * pInstance,MS_U32 u32WindowID,ST_DMS_CAPTURE_INFO * pstCaptureInfo)7559*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Get_CaptureBuffer(void* pInstance, MS_U32 u32WindowID, ST_DMS_CAPTURE_INFO *pstCaptureInfo)
7560*53ee8cc1Swenshuai.xi {
7561*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
7562*53ee8cc1Swenshuai.xi 
7563*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
7564*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7565*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7566*53ee8cc1Swenshuai.xi     MS_U16 u16CurRingBufID = RES_DMSCAPTURE._stXC_DIPCaptureWin_RingBufferPointer[u32WindowID].u16PreWritePointer;
7567*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE.bIsRingBufAccessed[u16CurRingBufID] == TRUE)
7568*53ee8cc1Swenshuai.xi     {
7569*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_CaptureRingBufRefCount[u32WindowID][u16CurRingBufID]++;
7570*53ee8cc1Swenshuai.xi 
7571*53ee8cc1Swenshuai.xi         pstCaptureInfo->phyBufferYAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[u16CurRingBufID].phyBufferYAddr;
7572*53ee8cc1Swenshuai.xi         pstCaptureInfo->phyBufferCAddr = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[u16CurRingBufID].phyBufferCAddr;
7573*53ee8cc1Swenshuai.xi         pstCaptureInfo->u64Pts = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[u16CurRingBufID].u64Pts;
7574*53ee8cc1Swenshuai.xi         pstCaptureInfo->u32frameCount = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32FrameCount;
7575*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE.bIsRingBufAccessed[u16CurRingBufID] = FALSE;
7576*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7577*53ee8cc1Swenshuai.xi         return E_DMS_OK;
7578*53ee8cc1Swenshuai.xi     }
7579*53ee8cc1Swenshuai.xi     else
7580*53ee8cc1Swenshuai.xi     {
7581*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7582*53ee8cc1Swenshuai.xi         return E_DMS_FAIL;
7583*53ee8cc1Swenshuai.xi     }
7584*53ee8cc1Swenshuai.xi #else
7585*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = BIT(0)|BIT(1)|BIT(2)|BIT(3);
7586*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
7587*53ee8cc1Swenshuai.xi 
7588*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7589*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].bStartGetCapture == FALSE)
7590*53ee8cc1Swenshuai.xi     {
7591*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].bStartGetCapture = TRUE;
7592*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bCaptureRet = FALSE;
7593*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(StartFRC_Event_id, u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
7594*53ee8cc1Swenshuai.xi 
7595*53ee8cc1Swenshuai.xi         if(u32Events == BIT(u32WindowID))
7596*53ee8cc1Swenshuai.xi         {
7597*53ee8cc1Swenshuai.xi             printf("\033[32m [%s][%d] Receive Event %td, %d, time %td !!!!!!\033[0m\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32Events , BIT(u32WindowID), (ptrdiff_t)MsOS_GetSystemTime());
7598*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bFirstCapFrame = TRUE;
7599*53ee8cc1Swenshuai.xi         }
7600*53ee8cc1Swenshuai.xi         else
7601*53ee8cc1Swenshuai.xi         {
7602*53ee8cc1Swenshuai.xi             printf("\033[31m [%s][%d] Receive Wrong Event %td, %d !\033[0m\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32Events , BIT(u32WindowID));
7603*53ee8cc1Swenshuai.xi         }
7604*53ee8cc1Swenshuai.xi     }
7605*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7606*53ee8cc1Swenshuai.xi 
7607*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bIsEventSent == FALSE)
7608*53ee8cc1Swenshuai.xi     {
7609*53ee8cc1Swenshuai.xi         RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bCaptureRet = FALSE;
7610*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u16PreviousWP != RES_DMSCAPTURE._stXC_DIPCapWin_WriteReadPointer[u32WindowID].u16ReadPointer)
7611*53ee8cc1Swenshuai.xi         {
7612*53ee8cc1Swenshuai.xi             MsOS_SetEvent(CaptureMode_Event_id, BIT(u32WindowID));
7613*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bIsEventSent = TRUE;
7614*53ee8cc1Swenshuai.xi         }
7615*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7616*53ee8cc1Swenshuai.xi         return E_DMS_FAIL;
7617*53ee8cc1Swenshuai.xi     }
7618*53ee8cc1Swenshuai.xi     else
7619*53ee8cc1Swenshuai.xi     {
7620*53ee8cc1Swenshuai.xi         if(RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bCaptureRet == TRUE)
7621*53ee8cc1Swenshuai.xi         {
7622*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_IMICaptureInfo[u32WindowID].bIsEventSent = FALSE;
7623*53ee8cc1Swenshuai.xi             pstCaptureInfo->u64Pts = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[0].u64Pts;
7624*53ee8cc1Swenshuai.xi             pstCaptureInfo->u32frameCount = RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].u32FrameCount;
7625*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7626*53ee8cc1Swenshuai.xi             return E_DMS_OK;
7627*53ee8cc1Swenshuai.xi         }
7628*53ee8cc1Swenshuai.xi         else
7629*53ee8cc1Swenshuai.xi         {
7630*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7631*53ee8cc1Swenshuai.xi             return E_DMS_FAIL;
7632*53ee8cc1Swenshuai.xi         }
7633*53ee8cc1Swenshuai.xi     }
7634*53ee8cc1Swenshuai.xi #endif
7635*53ee8cc1Swenshuai.xi 
7636*53ee8cc1Swenshuai.xi #endif
7637*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7638*53ee8cc1Swenshuai.xi }
7639*53ee8cc1Swenshuai.xi 
7640*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
_MDrv_DMS_IsContentMatch(MS_U32 u32WindowID,MS_U8 u8BufferID,ST_DMS_CAPTURE_INFO * pstCaptureInfo)7641*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_IsContentMatch(MS_U32 u32WindowID, MS_U8 u8BufferID, ST_DMS_CAPTURE_INFO *pstCaptureInfo)
7642*53ee8cc1Swenshuai.xi {
7643*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7644*53ee8cc1Swenshuai.xi     if(RES_DMSCAPTURE._stXC_DIPCaptureWinInfo[u32WindowID].stCaptureRingBuf[u8BufferID].phyBufferYAddr == pstCaptureInfo->phyBufferYAddr)
7645*53ee8cc1Swenshuai.xi     {
7646*53ee8cc1Swenshuai.xi         return TRUE;
7647*53ee8cc1Swenshuai.xi     }
7648*53ee8cc1Swenshuai.xi     else
7649*53ee8cc1Swenshuai.xi     {
7650*53ee8cc1Swenshuai.xi         return FALSE;
7651*53ee8cc1Swenshuai.xi     }
7652*53ee8cc1Swenshuai.xi }
7653*53ee8cc1Swenshuai.xi #endif
7654*53ee8cc1Swenshuai.xi 
MDrv_DMS_Release_CaptureBuffer(void * pInstance,MS_U32 u32WindowID,ST_DMS_CAPTURE_INFO * pstCaptureInfo)7655*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Release_CaptureBuffer(void* pInstance, MS_U32 u32WindowID, ST_DMS_CAPTURE_INFO *pstCaptureInfo)
7656*53ee8cc1Swenshuai.xi {
7657*53ee8cc1Swenshuai.xi #if DEV_CAPMODE
7658*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
7659*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
7660*53ee8cc1Swenshuai.xi #if (DMS_DIP_Support_IMI == 0)
7661*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = 0;
7662*53ee8cc1Swenshuai.xi     for(u8BufferID=0; u8BufferID<DMS_CAPTUREWIN_RING_BUFFER; u8BufferID++)
7663*53ee8cc1Swenshuai.xi     {
7664*53ee8cc1Swenshuai.xi         if(_MDrv_DMS_IsContentMatch(u32WindowID, u8BufferID, pstCaptureInfo) == TRUE)
7665*53ee8cc1Swenshuai.xi         {
7666*53ee8cc1Swenshuai.xi             RES_DMSCAPTURE._stXC_CaptureRingBufRefCount[u32WindowID][u8BufferID]--;
7667*53ee8cc1Swenshuai.xi         }
7668*53ee8cc1Swenshuai.xi     }
7669*53ee8cc1Swenshuai.xi #else
7670*53ee8cc1Swenshuai.xi     MS_U8 u8DIPWindowID = RES_DMS.u8DIP_Window[E_DMS_DIP_CAPTURE];
7671*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7672*53ee8cc1Swenshuai.xi     while(MApi_XC_DIP_GetResource(u8DIPWindowID) == E_APIXC_RET_FAIL)
7673*53ee8cc1Swenshuai.xi     {
7674*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
7675*53ee8cc1Swenshuai.xi     }
7676*53ee8cc1Swenshuai.xi     MApi_XC_DIP_Ena(FALSE,u8DIPWindowID);
7677*53ee8cc1Swenshuai.xi     MApi_XC_DIP_ReleaseResource(u8DIPWindowID);
7678*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7679*53ee8cc1Swenshuai.xi #endif
7680*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
7681*53ee8cc1Swenshuai.xi #endif
7682*53ee8cc1Swenshuai.xi     return E_DMS_OK;
7683*53ee8cc1Swenshuai.xi }
7684*53ee8cc1Swenshuai.xi 
7685*53ee8cc1Swenshuai.xi 
7686