xref: /utopia/UTPA2-700.0.x/modules/dms/drv/dms_vsyncbridge/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 
123*53ee8cc1Swenshuai.xi // utopia DRV
124*53ee8cc1Swenshuai.xi #include "drvMVOP.h"
125*53ee8cc1Swenshuai.xi #include "drvSYS.h"
126*53ee8cc1Swenshuai.xi #include "apiXC.h"
127*53ee8cc1Swenshuai.xi #include "apiPNL.h"
128*53ee8cc1Swenshuai.xi #include "apiXC_DWIN.h"
129*53ee8cc1Swenshuai.xi #include "apiVDEC_EX.h"
130*53ee8cc1Swenshuai.xi #include "apiGOP.h"
131*53ee8cc1Swenshuai.xi #include "apiGFX.h"
132*53ee8cc1Swenshuai.xi 
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 #include "halCHIP.h"
138*53ee8cc1Swenshuai.xi #include "fwHVD_if.h"
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi void* g_pDMSRes = NULL;
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define DMS_ENABLE_MVOP_INT
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi #if 1
145*53ee8cc1Swenshuai.xi #include "ULog.h"
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi #define DMS_PRINTF(format,args...)  ULOGD("DMS", format, ##args)
148*53ee8cc1Swenshuai.xi #define DMS_PRINTI(format,args...)  ULOGI("DMS", format, ##args)
149*53ee8cc1Swenshuai.xi #define DMS_PRINTD(format,args...)  ULOGD("DMS", format, ##args)
150*53ee8cc1Swenshuai.xi #define DMS_ERR(format,args...) ULOGE("DMS", format, ##args)
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi #else
153*53ee8cc1Swenshuai.xi #ifndef ANDROID
154*53ee8cc1Swenshuai.xi //#define DMS_PRINTF
155*53ee8cc1Swenshuai.xi #define DMS_PRINTF printf
156*53ee8cc1Swenshuai.xi #else
157*53ee8cc1Swenshuai.xi #include <sys/mman.h>
158*53ee8cc1Swenshuai.xi #include <cutils/ashmem.h>
159*53ee8cc1Swenshuai.xi #include <cutils/log.h>
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi #define DMS_PRINTF ALOGD
162*53ee8cc1Swenshuai.xi #endif
163*53ee8cc1Swenshuai.xi #endif
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi // FIXME: it needs XC/MVOP to add it to header file.
166*53ee8cc1Swenshuai.xi MS_U8   __attribute__((weak))   MApi_XC_GetSWDSIndex(SCALER_WIN eWindow);
167*53ee8cc1Swenshuai.xi void    __attribute__((weak))   MApi_SWDS_Fire(SCALER_WIN eWindow);
168*53ee8cc1Swenshuai.xi MS_U8   __attribute__((weak))   MDrv_MVOP_GetIntStatus(void);
169*53ee8cc1Swenshuai.xi MS_BOOL __attribute__((weak))   MDrv_MVOP_EnableInterrupt(MS_U8 eIntType);
170*53ee8cc1Swenshuai.xi MS_U8   __attribute__((weak))   MDrv_MVOP_SubGetIntStatus(void);
171*53ee8cc1Swenshuai.xi MS_BOOL __attribute__((weak))   MDrv_MVOP_SubEnableInterrupt(MS_U8 eIntType);
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi E_APIXC_ReturnValue __attribute__((weak)) MApi_XC_GetPixelShift(MS_S8 *ps8HOffset, MS_S8 *ps8VOffset);
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
176*53ee8cc1Swenshuai.xi //  Driver Compiler Options
177*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
178*53ee8cc1Swenshuai.xi #define DMS_FHD_Hszie           1920
179*53ee8cc1Swenshuai.xi #define DMS_FHD_Vszie           1080
180*53ee8cc1Swenshuai.xi #define DMS_4K_Hsize            4096
181*53ee8cc1Swenshuai.xi #define DMS_4K_Vsize            2160
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi #define NEW_FLIP        1
184*53ee8cc1Swenshuai.xi #define ENABLE_FRAME_CONVERT 1
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
187*53ee8cc1Swenshuai.xi // Macros
188*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
189*53ee8cc1Swenshuai.xi #define DNRFrameNUM       5
190*53ee8cc1Swenshuai.xi #define DMS_INVALID_FRAME_ID 0xFF
191*53ee8cc1Swenshuai.xi #define FRAME_DURATION(x) (1000000 / ((x) ? (x) : 30000))
192*53ee8cc1Swenshuai.xi #define WAIT_MVOP_TIME 100      // 0.1 ms
193*53ee8cc1Swenshuai.xi #define DISPQ_FIRST_R_INDEX         1
194*53ee8cc1Swenshuai.xi 
195*53ee8cc1Swenshuai.xi static MS_S32 s32DMSEventID[DMS_MAX_WINDOW_NUM] = {-1, -1};
196*53ee8cc1Swenshuai.xi static MS_S32 s32DMSTaskID[DMS_MAX_WINDOW_NUM] = {-1, -1};
197*53ee8cc1Swenshuai.xi static MS_S32 s32DMSVsyncEventID[DMS_MAX_WINDOW_NUM] = {-1, -1};
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi static DMS_DRV_CTRL gDMSCtrl[DMS_MAX_WINDOW_NUM];
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi static MS_BOOL bMsLogON = FALSE;
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi //Marco to simplize resource usage
204*53ee8cc1Swenshuai.xi #define DMS_GET_RES_PRI DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;\
205*53ee8cc1Swenshuai.xi                         UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri))
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi #define RES_DMS pDMSResPri->stDrvDMS
208*53ee8cc1Swenshuai.xi //#define RES_DMSCAPTURE pDMSResPri->stDrvDMSCapMode
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi #define ENABLE_DMS_MUTEX
211*53ee8cc1Swenshuai.xi #ifdef ENABLE_DMS_MUTEX
212*53ee8cc1Swenshuai.xi static  MS_S32 s32DMSMutexID[DMS_MAX_WINDOW_NUM] = {-1, -1};
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi #define _DRV_DMS_MutexCreate(WinID)                             \
215*53ee8cc1Swenshuai.xi     do                                                          \
216*53ee8cc1Swenshuai.xi     {                                                           \
217*53ee8cc1Swenshuai.xi         if (s32DMSMutexID[WinID] < 0)                           \
218*53ee8cc1Swenshuai.xi         {                                                       \
219*53ee8cc1Swenshuai.xi             if (WinID) {                                        \
220*53ee8cc1Swenshuai.xi                 s32DMSMutexID[WinID] = MsOS_CreateMutex(E_MSOS_FIFO, "DMS_Drv_0", MSOS_PROCESS_SHARED); \
221*53ee8cc1Swenshuai.xi             } else {                                            \
222*53ee8cc1Swenshuai.xi                 s32DMSMutexID[WinID] = MsOS_CreateMutex(E_MSOS_FIFO, "DMS_Drv_1", MSOS_PROCESS_SHARED); \
223*53ee8cc1Swenshuai.xi             }                                                   \
224*53ee8cc1Swenshuai.xi         }                                                       \
225*53ee8cc1Swenshuai.xi     } while (0)
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi #define _DRV_DMS_MutexDelete(WinID)                                  \
228*53ee8cc1Swenshuai.xi     do                                                          \
229*53ee8cc1Swenshuai.xi     {                                                           \
230*53ee8cc1Swenshuai.xi         if (s32DMSMutexID[WinID] >= 0)                          \
231*53ee8cc1Swenshuai.xi         {                                                       \
232*53ee8cc1Swenshuai.xi             MsOS_DeleteMutex(s32DMSMutexID[WinID]);             \
233*53ee8cc1Swenshuai.xi             s32DMSMutexID[WinID] = -1;                          \
234*53ee8cc1Swenshuai.xi         }                                                       \
235*53ee8cc1Swenshuai.xi     } while (0)
236*53ee8cc1Swenshuai.xi 
237*53ee8cc1Swenshuai.xi #define  _DRV_DMS_Entry(WinID)                                                       \
238*53ee8cc1Swenshuai.xi     do                                                                          \
239*53ee8cc1Swenshuai.xi     {                                                                           \
240*53ee8cc1Swenshuai.xi         if (s32DMSMutexID[WinID] >= 0)                                          \
241*53ee8cc1Swenshuai.xi         {                                                                       \
242*53ee8cc1Swenshuai.xi             if (!MsOS_ObtainMutex(s32DMSMutexID[WinID], MSOS_WAIT_FOREVER))     \
243*53ee8cc1Swenshuai.xi             {                                                                   \
244*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[DMS][%06d] Mutex taking timeout\n", __LINE__);     \
245*53ee8cc1Swenshuai.xi             }                                                                   \
246*53ee8cc1Swenshuai.xi         }                                                                       \
247*53ee8cc1Swenshuai.xi     } while (0)
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi #define _DRV_DMS_Return(WinID, _ret_)                                  \
250*53ee8cc1Swenshuai.xi     do                                                          \
251*53ee8cc1Swenshuai.xi     {                                                           \
252*53ee8cc1Swenshuai.xi         if (s32DMSMutexID[WinID] >= 0)                          \
253*53ee8cc1Swenshuai.xi         {                                                       \
254*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32DMSMutexID[WinID]);            \
255*53ee8cc1Swenshuai.xi         }                                                       \
256*53ee8cc1Swenshuai.xi         return _ret_;                                           \
257*53ee8cc1Swenshuai.xi     } while(0)
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi #define _DRV_DMS_Release(WinID)                                 \
260*53ee8cc1Swenshuai.xi     do                                                          \
261*53ee8cc1Swenshuai.xi     {                                                           \
262*53ee8cc1Swenshuai.xi         if (s32DMSMutexID[WinID] >= 0)                          \
263*53ee8cc1Swenshuai.xi         {                                                       \
264*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32DMSMutexID[WinID]);            \
265*53ee8cc1Swenshuai.xi         }                                                       \
266*53ee8cc1Swenshuai.xi     } while (0)
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi #else
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi #define _DRV_DMS_MutexCreate(WinID)
271*53ee8cc1Swenshuai.xi #define _DRV_DMS_MutexDelete(WinID)
272*53ee8cc1Swenshuai.xi #define _DRV_DMS_Entry(WinID)
273*53ee8cc1Swenshuai.xi #define _DRV_DMS_Return(WinID, _ret)      {return _ret;}
274*53ee8cc1Swenshuai.xi #define _DRV_DMS_Release(WinID)
275*53ee8cc1Swenshuai.xi 
276*53ee8cc1Swenshuai.xi #endif
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
279*53ee8cc1Swenshuai.xi //  Global Variables
280*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
283*53ee8cc1Swenshuai.xi //  Local Variables
284*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
285*53ee8cc1Swenshuai.xi MS_U16 gDMS_externDebugFlag = 0;
286*53ee8cc1Swenshuai.xi //MS_U16 gDMSMVOPForceLookVDEC = 0;
287*53ee8cc1Swenshuai.xi #define sync_print(fmt, args...) do { if(0) DMS_PRINTF(fmt, ##args);  } while (0)
288*53ee8cc1Swenshuai.xi MS_U16 gDMSDebug = 0;
289*53ee8cc1Swenshuai.xi void* pTaskInstance = NULL;
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi #define DBG_DISABLE_SEMAPHORE 0
MDrv_DMS_Get_Semaphore(void * pInstance,EN_DMS_POOL_TYPE ePoolType)292*53ee8cc1Swenshuai.xi MS_U32 MDrv_DMS_Get_Semaphore(void* pInstance, EN_DMS_POOL_TYPE ePoolType)
293*53ee8cc1Swenshuai.xi {
294*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
295*53ee8cc1Swenshuai.xi     static MS_BOOL bGetRes = FALSE;
296*53ee8cc1Swenshuai.xi     if(bGetRes)
297*53ee8cc1Swenshuai.xi     {
298*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_SUCCESS;
299*53ee8cc1Swenshuai.xi     }
300*53ee8cc1Swenshuai.xi #endif
301*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
302*53ee8cc1Swenshuai.xi     //DMS_PRINTF("get SHM!!\n");
303*53ee8cc1Swenshuai.xi     if (pInstance == NULL)
304*53ee8cc1Swenshuai.xi     {
305*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s, %d]No instance existed, please get an instance by calling MApi_DMS_Init() first\n", __FUNCTION__, __LINE__);
306*53ee8cc1Swenshuai.xi         return u32Return;
307*53ee8cc1Swenshuai.xi     }
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi     void* pModule = NULL;
310*53ee8cc1Swenshuai.xi     UtopiaInstanceGetModule(pInstance, &pModule);
311*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModule, E_DMS_POOL_ID_INTERNAL_VARIABLE, &g_pDMSRes) != UTOPIA_STATUS_SUCCESS)
312*53ee8cc1Swenshuai.xi     {
313*53ee8cc1Swenshuai.xi         DMS_PRINTF("UtopiaResourceObtain fail\n");
314*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_ERR_RESOURCE;
315*53ee8cc1Swenshuai.xi     }
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi     u32Return = UTOPIA_STATUS_SUCCESS;
318*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
319*53ee8cc1Swenshuai.xi     printf("\033[1;31m Disable semaphore get!!!!!!!!!!!!!!!!\033[0m\n");
320*53ee8cc1Swenshuai.xi     bGetRes = TRUE;
321*53ee8cc1Swenshuai.xi #endif
322*53ee8cc1Swenshuai.xi     return u32Return;
323*53ee8cc1Swenshuai.xi }
324*53ee8cc1Swenshuai.xi 
MDrv_DMS_Release_Semaphore(void * pInstance,EN_DMS_POOL_TYPE ePoolType)325*53ee8cc1Swenshuai.xi MS_U32 MDrv_DMS_Release_Semaphore(void* pInstance, EN_DMS_POOL_TYPE ePoolType)
326*53ee8cc1Swenshuai.xi {
327*53ee8cc1Swenshuai.xi #if DBG_DISABLE_SEMAPHORE
328*53ee8cc1Swenshuai.xi     return UTOPIA_STATUS_SUCCESS;
329*53ee8cc1Swenshuai.xi #endif
330*53ee8cc1Swenshuai.xi     //DMS_PRINTF("release SHM!!\n");
331*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
332*53ee8cc1Swenshuai.xi     u32Return = UtopiaResourceRelease(g_pDMSRes);
333*53ee8cc1Swenshuai.xi     return u32Return;
334*53ee8cc1Swenshuai.xi }
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
337*53ee8cc1Swenshuai.xi //  Local Defines
338*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_DMS_Wait_MVOP_Vsync(unsigned char Overlay_ID,const ST_DMS_DISPFRAMEFORMAT * dff)339*53ee8cc1Swenshuai.xi static void _DMS_Wait_MVOP_Vsync(unsigned char Overlay_ID, const ST_DMS_DISPFRAMEFORMAT *dff)
340*53ee8cc1Swenshuai.xi {
341*53ee8cc1Swenshuai.xi #ifdef DMS_ENABLE_MVOP_INT
342*53ee8cc1Swenshuai.xi     MVOP_Handle stMvopHd;
343*53ee8cc1Swenshuai.xi     MS_U16 u16Vcnt = 0;
344*53ee8cc1Swenshuai.xi     MS_BOOL bEnable = FALSE;
345*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = E_MVOP_INT_VSYNC;
346*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi     if (Overlay_ID == 0) {
349*53ee8cc1Swenshuai.xi         MDrv_MVOP_GetIsEnable(&bEnable);
350*53ee8cc1Swenshuai.xi     } else {
351*53ee8cc1Swenshuai.xi         MDrv_MVOP_SubGetIsEnable(&bEnable);
352*53ee8cc1Swenshuai.xi     }
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi     if (!bEnable || !gDMSCtrl[Overlay_ID].bVsyncIntAlive) {
355*53ee8cc1Swenshuai.xi         if (bMsLogON)
356*53ee8cc1Swenshuai.xi         DMS_PRINTF("MVOP not enable bVsyncIntAlive = %d !!\n", gDMSCtrl[Overlay_ID].bVsyncIntAlive);
357*53ee8cc1Swenshuai.xi         return;
358*53ee8cc1Swenshuai.xi     }
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi     if (s32DMSVsyncEventID[Overlay_ID] == -1) {
361*53ee8cc1Swenshuai.xi         DMS_PRINTF("s32DMSVsyncEventID[%d] = %d !!\n", Overlay_ID, (int)s32DMSVsyncEventID[Overlay_ID]);
362*53ee8cc1Swenshuai.xi         return;
363*53ee8cc1Swenshuai.xi     }
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi     MsOS_WaitEvent(s32DMSVsyncEventID[Overlay_ID], u32WaitEventFlag, &u32Events, E_OR_CLEAR, FRAME_DURATION(dff->u32FrameRate));
366*53ee8cc1Swenshuai.xi     MDrv_MVOP_GetCommand(&stMvopHd, E_MVOP_CMD_GET_VCOUNT, &u16Vcnt, sizeof(u16Vcnt));
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi     if (bMsLogON)
369*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%d] Wait mvop timing end u16Vcnt = %d !!\n", Overlay_ID, u16Vcnt);
370*53ee8cc1Swenshuai.xi #endif
371*53ee8cc1Swenshuai.xi }
372*53ee8cc1Swenshuai.xi 
_DMS_Need_XC_HDR_DS(const ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)373*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_Need_XC_HDR_DS(const ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat)
374*53ee8cc1Swenshuai.xi {
375*53ee8cc1Swenshuai.xi #if defined(UFO_XC_SET_DSINFO_V0) && (API_XCDS_INFO_VERSION >= 2)
376*53ee8cc1Swenshuai.xi     if (pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_HEVC_DV
377*53ee8cc1Swenshuai.xi         || (pstDispFrameFormat->stHDRInfo.u32FrmInfoExtAvail &
378*53ee8cc1Swenshuai.xi         (E_DMS_HDR_METADATA_TCH + E_DMS_HDR_METADATA_HDR10_PER_FRAME + E_DMS_HDR_METATYPE_DYNAMIC))) {
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi         if ((pstDispFrameFormat->stHDRInfo.u32FrmInfoExtAvail & E_DMS_HDR_METATYPE_DYNAMIC)
381*53ee8cc1Swenshuai.xi             && !pstDispFrameFormat->stHDRInfo.stDolbyHDRInfo.u8DMEnable) {
382*53ee8cc1Swenshuai.xi             return FALSE;
383*53ee8cc1Swenshuai.xi         }
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi         return TRUE;
386*53ee8cc1Swenshuai.xi     } else
387*53ee8cc1Swenshuai.xi #endif
388*53ee8cc1Swenshuai.xi     {
389*53ee8cc1Swenshuai.xi         return FALSE;
390*53ee8cc1Swenshuai.xi     }
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi 
_DMS_Update_DS_Table(void * pInstance,unsigned char Overlay_ID,ST_DMS_DISPFRAMEFORMAT * dff,MS_U8 u8FrameIndex,MS_BOOL bSizeChange)393*53ee8cc1Swenshuai.xi static void _DMS_Update_DS_Table(void* pInstance, unsigned char Overlay_ID, ST_DMS_DISPFRAMEFORMAT *dff, MS_U8 u8FrameIndex, MS_BOOL bSizeChange)
394*53ee8cc1Swenshuai.xi {
395*53ee8cc1Swenshuai.xi     MS_U32 u32Time = MsOS_GetSystemTime();
396*53ee8cc1Swenshuai.xi     MS_U16 u16Width = dff->stFrames[u8FrameIndex].u32Width
397*53ee8cc1Swenshuai.xi                       - dff->stFrames[u8FrameIndex].u32CropLeft
398*53ee8cc1Swenshuai.xi                       - dff->stFrames[u8FrameIndex].u32CropRight;
399*53ee8cc1Swenshuai.xi     MS_U16 u16Height = dff->stFrames[u8FrameIndex].u32Height
400*53ee8cc1Swenshuai.xi                        - dff->stFrames[u8FrameIndex].u32CropTop
401*53ee8cc1Swenshuai.xi                        - dff->stFrames[u8FrameIndex].u32CropBottom;
402*53ee8cc1Swenshuai.xi     XC_SETWIN_INFO stXC_SetWin_Info;
403*53ee8cc1Swenshuai.xi     memset(&stXC_SetWin_Info, 0, sizeof(XC_SETWIN_INFO));
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi 
406*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW CropWin = {0, 0, 0, 0};
407*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW DispWin = {0, 0, 0, 0};;
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
410*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes, (void**)(&pDMSResPri));
411*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
412*53ee8cc1Swenshuai.xi     if (pDMSResPri->stDrvDMS.bWindowInfoReady[Overlay_ID]) {
413*53ee8cc1Swenshuai.xi         DispWin.u32x = pDMSResPri->stDrvDMS.stDisplayWin[Overlay_ID].u32x;
414*53ee8cc1Swenshuai.xi         DispWin.u32y = pDMSResPri->stDrvDMS.stDisplayWin[Overlay_ID].u32y;
415*53ee8cc1Swenshuai.xi         DispWin.u32width = pDMSResPri->stDrvDMS.stDisplayWin[Overlay_ID].u32width;
416*53ee8cc1Swenshuai.xi         DispWin.u32height = pDMSResPri->stDrvDMS.stDisplayWin[Overlay_ID].u32height;
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi         CropWin.u32x = pDMSResPri->stDrvDMS.stOutputWinInfo[Overlay_ID].stCropWin.u32x;
419*53ee8cc1Swenshuai.xi         CropWin.u32y = pDMSResPri->stDrvDMS.stOutputWinInfo[Overlay_ID].stCropWin.u32y;
420*53ee8cc1Swenshuai.xi         CropWin.u32width = pDMSResPri->stDrvDMS.stOutputWinInfo[Overlay_ID].stCropWin.u32width;
421*53ee8cc1Swenshuai.xi         CropWin.u32height = pDMSResPri->stDrvDMS.stOutputWinInfo[Overlay_ID].stCropWin.u32height;
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi         // clear the outside crop win
424*53ee8cc1Swenshuai.xi         memset(&pDMSResPri->stDrvDMS.stOutputWinInfo[Overlay_ID].stCropWin, 0, sizeof(ST_DMS_WINDOW));
425*53ee8cc1Swenshuai.xi     }
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi     if (CropWin.u32x || CropWin.u32y
428*53ee8cc1Swenshuai.xi         || CropWin.u32width || CropWin.u32height) {
429*53ee8cc1Swenshuai.xi         // outside crop win assigned
430*53ee8cc1Swenshuai.xi         gDMSCtrl[Overlay_ID].stOutSideCropWin = CropWin;
431*53ee8cc1Swenshuai.xi         gDMSCtrl[Overlay_ID].u32WidthForOutsideCrop = u16Width;
432*53ee8cc1Swenshuai.xi         gDMSCtrl[Overlay_ID].u32HeightForOutsideCrop = u16Height;
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi     } else if (gDMSCtrl[Overlay_ID].stOutSideCropWin.u32x || gDMSCtrl[Overlay_ID].stOutSideCropWin.u32y
435*53ee8cc1Swenshuai.xi         || gDMSCtrl[Overlay_ID].stOutSideCropWin.u32width || gDMSCtrl[Overlay_ID].stOutSideCropWin.u32height) {
436*53ee8cc1Swenshuai.xi         // apply the saved crop ratio
437*53ee8cc1Swenshuai.xi 
438*53ee8cc1Swenshuai.xi         CropWin.u32x = (u16Width * gDMSCtrl[Overlay_ID].stOutSideCropWin.u32x) / gDMSCtrl[Overlay_ID].u32WidthForOutsideCrop;
439*53ee8cc1Swenshuai.xi         CropWin.u32y = (u16Height * gDMSCtrl[Overlay_ID].stOutSideCropWin.u32y) / gDMSCtrl[Overlay_ID].u32HeightForOutsideCrop;
440*53ee8cc1Swenshuai.xi         CropWin.u32width = (u16Width * gDMSCtrl[Overlay_ID].stOutSideCropWin.u32width) / gDMSCtrl[Overlay_ID].u32WidthForOutsideCrop;
441*53ee8cc1Swenshuai.xi         CropWin.u32height = (u16Height * gDMSCtrl[Overlay_ID].stOutSideCropWin.u32height) / gDMSCtrl[Overlay_ID].u32HeightForOutsideCrop;
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi     } else {
444*53ee8cc1Swenshuai.xi         // no out side crop win, use source video crop win
445*53ee8cc1Swenshuai.xi         CropWin.u32x = dff->stFrames[u8FrameIndex].u32CropLeft;
446*53ee8cc1Swenshuai.xi         CropWin.u32y = dff->stFrames[u8FrameIndex].u32CropTop;
447*53ee8cc1Swenshuai.xi         CropWin.u32width = u16Width;
448*53ee8cc1Swenshuai.xi         CropWin.u32height = u16Height;
449*53ee8cc1Swenshuai.xi     }
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWinChanged[Overlay_ID] = FALSE;
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi     if (!pDMSResPri->stDrvDMS.bWindowInfoReady[Overlay_ID]) {
454*53ee8cc1Swenshuai.xi         // no window info, only trigger MApi_XC_SetDSInfo / MApi_SWDS_Fire / MApi_XC_GetSWDSIndex
455*53ee8cc1Swenshuai.xi         bSizeChange = FALSE;
456*53ee8cc1Swenshuai.xi     }
457*53ee8cc1Swenshuai.xi 
458*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
459*53ee8cc1Swenshuai.xi 
460*53ee8cc1Swenshuai.xi     if (!MApi_XC_GetDynamicScalingStatus()) {
461*53ee8cc1Swenshuai.xi         DMS_PRINTF("MApi_XC_GetDynamicScalingStatus() is FALSE\n");
462*53ee8cc1Swenshuai.xi         return;
463*53ee8cc1Swenshuai.xi     }
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi     // apple panel ratio
466*53ee8cc1Swenshuai.xi     // ....
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SETWINDOW_LITE
469*53ee8cc1Swenshuai.xi     ST_XC_APISTATUSNODELAY stXCStatus;
470*53ee8cc1Swenshuai.xi #else
471*53ee8cc1Swenshuai.xi     XC_ApiStatus stXCStatus;
472*53ee8cc1Swenshuai.xi #endif
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi     MVOP_Timing stMVOPTiming;
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi     if (Overlay_ID) {
477*53ee8cc1Swenshuai.xi         MDrv_MVOP_SubGetOutputTiming(&stMVOPTiming);
478*53ee8cc1Swenshuai.xi     } else {
479*53ee8cc1Swenshuai.xi         MDrv_MVOP_GetOutputTiming(&stMVOPTiming);
480*53ee8cc1Swenshuai.xi     }
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi     // get scaler information
483*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SETWINDOW_LITE
484*53ee8cc1Swenshuai.xi     if (MApi_XC_GetStatusNodelay(&stXCStatus, (SCALER_WIN) Overlay_ID) == FALSE) {
485*53ee8cc1Swenshuai.xi         DMS_PRINTF("MApi_XC_GetStatusNodealy failed.\n");
486*53ee8cc1Swenshuai.xi     }
487*53ee8cc1Swenshuai.xi #else
488*53ee8cc1Swenshuai.xi     if (MApi_XC_GetStatus(&stXCStatus, (SCALER_WIN) Overlay_ID) == FALSE) {
489*53ee8cc1Swenshuai.xi         DMS_PRINTF("MApi_XC_GetStatus failed.\n");
490*53ee8cc1Swenshuai.xi     }
491*53ee8cc1Swenshuai.xi #endif
492*53ee8cc1Swenshuai.xi 
493*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.enInputSourceType = stXCStatus.enInputSourceType;
494*53ee8cc1Swenshuai.xi 
495*53ee8cc1Swenshuai.xi     if (Overlay_ID) {
496*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCapWin.x = MDrv_MVOP_SubGetHStart();
497*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCapWin.y = MDrv_MVOP_SubGetVStart();
498*53ee8cc1Swenshuai.xi     } else {
499*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCapWin.x = MDrv_MVOP_GetHStart();
500*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCapWin.y = MDrv_MVOP_GetVStart();
501*53ee8cc1Swenshuai.xi     }
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.stCapWin.width = u16Width;
504*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.stCapWin.height = u16Height;
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.stDispWin.width = stXCStatus.stDispWin.width;
507*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.stDispWin.height = stXCStatus.stDispWin.height;
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi     // Timing
510*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bHDuplicate = stMVOPTiming.bHDuplicate;
511*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16InputVTotal = stMVOPTiming.u16V_TotalCount;
512*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bInterlace = stMVOPTiming.bInterlace;
513*53ee8cc1Swenshuai.xi     if (stXC_SetWin_Info.bInterlace) {
514*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16InputVFreq = (stMVOPTiming.u16ExpFrameRate * 2) / 100;
515*53ee8cc1Swenshuai.xi     } else {
516*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16InputVFreq = stMVOPTiming.u16ExpFrameRate / 100;
517*53ee8cc1Swenshuai.xi     }
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     if (gDMSCtrl[Overlay_ID].u8ForcePMode) {
520*53ee8cc1Swenshuai.xi         DMS_PRINTF("set real interlace mode to XC %d\n", dff->u8Interlace);
521*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.bInterlace = dff->u8Interlace;
522*53ee8cc1Swenshuai.xi     }
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi     #ifndef UFO_XC_SETWINDOW_LITE
525*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16DefaultHtotal = stXCStatus.u16DefaultHtotal;
526*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u8DefaultPhase = stXCStatus.u8DefaultPhase;
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi     // customized scaling //post
529*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bHCusScaling = stXCStatus.bHCusScaling;
530*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16HCusScalingSrc = stXCStatus.u16HCusScalingSrc; //stXC_SetWin_Info.stCapWin.width
531*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16HCusScalingDst = stXCStatus.u16HCusScalingDst;
532*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bVCusScaling = stXCStatus.bVCusScaling;
533*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16VCusScalingSrc = stXCStatus.u16VCusScalingSrc; //stXC_SetWin_Info.stCapWin.height
534*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16VCusScalingDst = stXCStatus.u16VCusScalingDst;
535*53ee8cc1Swenshuai.xi     // 9 lattice
536*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bDisplayNineLattice = stXCStatus.bDisplayNineLattice;
537*53ee8cc1Swenshuai.xi     #else
538*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bHCusScaling = 0;
539*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bVCusScaling = 0;
540*53ee8cc1Swenshuai.xi     #endif
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi     //add // force disable prescaling
543*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bPreHCusScaling = TRUE;
544*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.bPreVCusScaling = TRUE;
545*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16PreHCusScalingSrc = stXC_SetWin_Info.stCapWin.width;
546*53ee8cc1Swenshuai.xi     if (gDMSCtrl[Overlay_ID].u8SaveBandwidthMode && (u16Width >= 3840)) {
547*53ee8cc1Swenshuai.xi         // for saving BW, 4K video H prescaling down 1/2
548*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16PreHCusScalingDst = stXC_SetWin_Info.stCapWin.width / 2;
549*53ee8cc1Swenshuai.xi     } else if (u16Width >= 3840) {
550*53ee8cc1Swenshuai.xi         // exceed 3840, prescaling down to 3840
551*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16PreHCusScalingDst = 3840;
552*53ee8cc1Swenshuai.xi     } else {
553*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16PreHCusScalingDst = stXC_SetWin_Info.stCapWin.width;
554*53ee8cc1Swenshuai.xi     }
555*53ee8cc1Swenshuai.xi     stXC_SetWin_Info.u16PreVCusScalingSrc = stXC_SetWin_Info.stCapWin.height;
556*53ee8cc1Swenshuai.xi     // height exceed 2160, prescaling down to 2160
557*53ee8cc1Swenshuai.xi     if (u16Height >= 2160) {
558*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16PreVCusScalingDst = 2160;
559*53ee8cc1Swenshuai.xi     } else {
560*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.u16PreVCusScalingDst = stXC_SetWin_Info.stCapWin.height;
561*53ee8cc1Swenshuai.xi     }
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi     if (bSizeChange) {
564*53ee8cc1Swenshuai.xi #if 0
565*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] DispW:%d DispH:%d \n", __func__, __LINE__,
566*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.width, stXC_SetWin_Info.stDispWin.height);
567*53ee8cc1Swenshuai.xi 
568*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] Cap.x:%d Cap.y:%d CapW:%d CapH:%d \n", __func__, __LINE__,
569*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCapWin.x, stXC_SetWin_Info.stCapWin.y,
570*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCapWin.width, stXC_SetWin_Info.stCapWin.height);
571*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] enInputSourceType:%d \n",__func__,__LINE__,stXC_SetWin_Info.enInputSourceType);
572*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] u16InputVTotal:%d  u16InputVFreq:%d \n", __func__, __LINE__,
573*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.u16InputVTotal, stXC_SetWin_Info.u16InputVFreq);
574*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] bInterlace:%d  u16DefaultHtotal:%d \n", __func__, __LINE__,
575*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.bInterlace, stXC_SetWin_Info.u16DefaultHtotal);
576*53ee8cc1Swenshuai.xi         //prescaling
577*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] bPreHCusScaling:%d  bPreVCusScaling:%d \n", __func__, __LINE__,
578*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.bPreHCusScaling, stXC_SetWin_Info.bPreVCusScaling);
579*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] u16PreHCusScalingSrc:%d  u16PreHCusScalingDst:%d \n", __func__, __LINE__,
580*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.u16PreHCusScalingSrc, stXC_SetWin_Info.u16PreHCusScalingDst);
581*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] u16PreVCusScalingSrc:%d  u16PreVCusScalingSrc:%d \n", __func__, __LINE__,
582*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.u16PreVCusScalingSrc, stXC_SetWin_Info.u16PreVCusScalingDst);
583*53ee8cc1Swenshuai.xi         //postscaling
584*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] bHCusScaling:%d  bVCusScaling:%d \n", __func__, __LINE__,
585*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.bHCusScaling, stXC_SetWin_Info.bVCusScaling);
586*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] u16HCusScalingSrc:%d  u16HCusScalingDst:%d \n", __func__, __LINE__,
587*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.u16HCusScalingSrc, stXC_SetWin_Info.u16HCusScalingDst);
588*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] u16VCusScalingSrc:%d  u16VCusScalingDst:%d \n", __func__, __LINE__,
589*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.u16VCusScalingSrc, stXC_SetWin_Info.u16VCusScalingDst);
590*53ee8cc1Swenshuai.xi #endif
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi #ifdef PORTING_MMSDK
593*53ee8cc1Swenshuai.xi         if ((OutSideCropWin[Overlay_ID].x != 0)
594*53ee8cc1Swenshuai.xi             || (OutSideCropWin[Overlay_ID].y != 0)
595*53ee8cc1Swenshuai.xi             || (OutSideCropWin[Overlay_ID].width != 0)
596*53ee8cc1Swenshuai.xi             || (OutSideCropWin[Overlay_ID].height != 0)) {
597*53ee8cc1Swenshuai.xi 
598*53ee8cc1Swenshuai.xi             vInfo.u16CropLeft = OutSideCropWin[Overlay_ID].x;
599*53ee8cc1Swenshuai.xi             vInfo.u16CropTop = OutSideCropWin[Overlay_ID].y;
600*53ee8cc1Swenshuai.xi             vInfo.u16CropRight = vInfo.u16HorSize
601*53ee8cc1Swenshuai.xi                                 - OutSideCropWin[Overlay_ID].x
602*53ee8cc1Swenshuai.xi                                 - OutSideCropWin[Overlay_ID].width;
603*53ee8cc1Swenshuai.xi             vInfo.u16CropBottom = vInfo.u16VerSize
604*53ee8cc1Swenshuai.xi                                 - OutSideCropWin[Overlay_ID].y
605*53ee8cc1Swenshuai.xi                                 - OutSideCropWin[Overlay_ID].height;
606*53ee8cc1Swenshuai.xi 
607*53ee8cc1Swenshuai.xi             DMS_PRINTF("update ds table src w:%d h:%d, **apply** crop w:%d h:%d, disp w:%d h:%d\n",
608*53ee8cc1Swenshuai.xi                 u16SrcWidth[Overlay_ID], u16SrcHeight[Overlay_ID],
609*53ee8cc1Swenshuai.xi                 OutSideCropWin[Overlay_ID].width, OutSideCropWin[Overlay_ID].height,
610*53ee8cc1Swenshuai.xi                 OutputWin[Overlay_ID].width, OutputWin[Overlay_ID].height);
611*53ee8cc1Swenshuai.xi             DMS_PRINTF("apply dff crop x:%d y:%d w:%d h:%d\n", vInfo.u16CropLeft, vInfo.u16CropTop,
612*53ee8cc1Swenshuai.xi                 vInfo.u16HorSize - vInfo.u16CropLeft - vInfo.u16CropRight,
613*53ee8cc1Swenshuai.xi                 vInfo.u16VerSize - vInfo.u16CropTop - vInfo.u16CropBottom);
614*53ee8cc1Swenshuai.xi 
615*53ee8cc1Swenshuai.xi             OutSideCropWinRatio[Overlay_ID].x = (float)OutSideCropWin[Overlay_ID].x / (float)u16Width;
616*53ee8cc1Swenshuai.xi             OutSideCropWinRatio[Overlay_ID].y =  (float)OutSideCropWin[Overlay_ID].y / (float)u16Height;
617*53ee8cc1Swenshuai.xi             OutSideCropWinRatio[Overlay_ID].width = (float)OutSideCropWin[Overlay_ID].width / (float)u16Width;
618*53ee8cc1Swenshuai.xi             OutSideCropWinRatio[Overlay_ID].height = (float)OutSideCropWin[Overlay_ID].height / (float)u16Height;
619*53ee8cc1Swenshuai.xi 
620*53ee8cc1Swenshuai.xi             DMS_PRINTF("save crop ratio x:%f y:%f w:%f h:%f\n", OutSideCropWinRatio[Overlay_ID].x,
621*53ee8cc1Swenshuai.xi                 OutSideCropWinRatio[Overlay_ID].y,
622*53ee8cc1Swenshuai.xi                 OutSideCropWinRatio[Overlay_ID].width,
623*53ee8cc1Swenshuai.xi                 OutSideCropWinRatio[Overlay_ID].height);
624*53ee8cc1Swenshuai.xi         } else if ((OutSideCropWinRatio[Overlay_ID].x != 0)
625*53ee8cc1Swenshuai.xi             || (OutSideCropWinRatio[Overlay_ID].y != 0)
626*53ee8cc1Swenshuai.xi             || (OutSideCropWinRatio[Overlay_ID].width != 0)
627*53ee8cc1Swenshuai.xi             || (OutSideCropWinRatio[Overlay_ID].height != 0)) {
628*53ee8cc1Swenshuai.xi 
629*53ee8cc1Swenshuai.xi             MS_WINDOW newCropWin;
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi             newCropWin.x = u16Width * OutSideCropWinRatio[Overlay_ID].x;
632*53ee8cc1Swenshuai.xi             newCropWin.y = u16Height * OutSideCropWinRatio[Overlay_ID].y;
633*53ee8cc1Swenshuai.xi             newCropWin.width = u16Width * OutSideCropWinRatio[Overlay_ID].width;
634*53ee8cc1Swenshuai.xi             newCropWin.height = u16Height * OutSideCropWinRatio[Overlay_ID].height;
635*53ee8cc1Swenshuai.xi 
636*53ee8cc1Swenshuai.xi             vInfo.u16CropLeft = newCropWin.x;
637*53ee8cc1Swenshuai.xi             vInfo.u16CropTop = newCropWin.y;
638*53ee8cc1Swenshuai.xi             vInfo.u16CropRight = vInfo.u16HorSize
639*53ee8cc1Swenshuai.xi                                 - newCropWin.x
640*53ee8cc1Swenshuai.xi                                 - newCropWin.width;
641*53ee8cc1Swenshuai.xi             vInfo.u16CropBottom = vInfo.u16VerSize
642*53ee8cc1Swenshuai.xi                                 - newCropWin.y
643*53ee8cc1Swenshuai.xi                                 - newCropWin.height;
644*53ee8cc1Swenshuai.xi 
645*53ee8cc1Swenshuai.xi             DMS_PRINTF("apply saved crop ratio x:%d y:%d w:%d h:%d\n", vInfo.u16CropLeft, vInfo.u16CropTop,
646*53ee8cc1Swenshuai.xi                 vInfo.u16HorSize - vInfo.u16CropLeft - vInfo.u16CropRight,
647*53ee8cc1Swenshuai.xi                 vInfo.u16VerSize - vInfo.u16CropTop - vInfo.u16CropBottom);
648*53ee8cc1Swenshuai.xi         }
649*53ee8cc1Swenshuai.xi #endif
650*53ee8cc1Swenshuai.xi 
651*53ee8cc1Swenshuai.xi #ifndef PORTING_MMSDK
652*53ee8cc1Swenshuai.xi         //vsync_bridge_CalAspectRatio(Overlay_ID, &DispWin, &CropWin, dff, TRUE);
653*53ee8cc1Swenshuai.xi #endif
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi #if 0
656*53ee8cc1Swenshuai.xi         if (bSizeChange) {
657*53ee8cc1Swenshuai.xi           Wrapper_SurfaceVideoSizeChange(Overlay_ID, DispWin.x,
658*53ee8cc1Swenshuai.xi               DispWin.y, DispWin.width, DispWin.height, u16SrcWidth[Overlay_ID],
659*53ee8cc1Swenshuai.xi               u16SrcHeight[Overlay_ID]);
660*53ee8cc1Swenshuai.xi         }
661*53ee8cc1Swenshuai.xi #endif
662*53ee8cc1Swenshuai.xi 
663*53ee8cc1Swenshuai.xi         if (gDMSCtrl[Overlay_ID].u8MirrorMode & E_VOPMIRROR_HORIZONTALL) {
664*53ee8cc1Swenshuai.xi             DispWin.u32x = gDMSCtrl[Overlay_ID].panelWidth - (DispWin.u32x + DispWin.u32width);
665*53ee8cc1Swenshuai.xi             CropWin.u32x = u16Width - (CropWin.u32x + CropWin.u32width);
666*53ee8cc1Swenshuai.xi         }
667*53ee8cc1Swenshuai.xi         if (gDMSCtrl[Overlay_ID].u8MirrorMode & E_VOPMIRROR_VERTICAL) {
668*53ee8cc1Swenshuai.xi             DispWin.u32y = gDMSCtrl[Overlay_ID].panelHeight - (DispWin.u32y + DispWin.u32height);
669*53ee8cc1Swenshuai.xi             CropWin.u32y = u16Height - (CropWin.u32y + CropWin.u32height);
670*53ee8cc1Swenshuai.xi         }
671*53ee8cc1Swenshuai.xi         if (bSizeChange && (gDMSCtrl[Overlay_ID].u8MirrorMode & E_VOPMIRROR_HVBOTH)) {
672*53ee8cc1Swenshuai.xi             DMS_PRINTF("DS MVOP Mirror %d [%d %d %d %d] [%d %d %d %d]\n", (int)gDMSCtrl[Overlay_ID].u8MirrorMode,
673*53ee8cc1Swenshuai.xi                 (int)DispWin.u32x, (int)DispWin.u32y, (int)DispWin.u32width, (int)DispWin.u32height,
674*53ee8cc1Swenshuai.xi                 (int)CropWin.u32x, (int)CropWin.u32y, (int)CropWin.u32width, (int)CropWin.u32height);
675*53ee8cc1Swenshuai.xi         }
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCropWin.x = CropWin.u32x;
678*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCropWin.y = CropWin.u32y;
679*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCropWin.width = CropWin.u32width;
680*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stCropWin.height = CropWin.u32height;
681*53ee8cc1Swenshuai.xi 
682*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stDispWin.x = DispWin.u32x;
683*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stDispWin.y = DispWin.u32y;
684*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stDispWin.width = DispWin.u32width;
685*53ee8cc1Swenshuai.xi         stXC_SetWin_Info.stDispWin.height = DispWin.u32height;
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi         if (!stXC_SetWin_Info.stDispWin.width || !stXC_SetWin_Info.stDispWin.height) {
688*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s,%5d] Disp Win is 0, set a default value\n", __func__, __LINE__);
689*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.x = 0;
690*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.y = 0;
691*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.width = g_IPanel.Width();
692*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.height = g_IPanel.Height();
693*53ee8cc1Swenshuai.xi         }
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi         // disable force index !!!!!!!!!!!!!!!!!
696*53ee8cc1Swenshuai.xi         MApi_XC_Set_DSForceIndex(0, 0, (SCALER_WIN)Overlay_ID);
697*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] SW DS !!! u8ForceInterlace = %d\n", __func__, __LINE__, gDMSCtrl[Overlay_ID].u8ForceInterlace);
698*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] Cap.x:%d Cap.y:%d Cap.W:%d Cap.H:%d \n", __func__, __LINE__,
699*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCapWin.x, stXC_SetWin_Info.stCapWin.y,
700*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCapWin.width, stXC_SetWin_Info.stCapWin.height);
701*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] Disp.x:%d Disp.y:%d Disp.W:%d Disp.H:%d \n", __func__, __LINE__,
702*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.x, stXC_SetWin_Info.stDispWin.y,
703*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stDispWin.width, stXC_SetWin_Info.stDispWin.height);
704*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] Crop.x:%d Crop.y:%d Crop.W:%d Crop.H:%d \n", __func__, __LINE__,
705*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCropWin.x, stXC_SetWin_Info.stCropWin.y,
706*53ee8cc1Swenshuai.xi             stXC_SetWin_Info.stCropWin.width, stXC_SetWin_Info.stCropWin.height);
707*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] MApi_XC_GetDynamicScalingStatus():%d \n", __func__, __LINE__, MApi_XC_GetDynamicScalingStatus());
708*53ee8cc1Swenshuai.xi     }
709*53ee8cc1Swenshuai.xi 
710*53ee8cc1Swenshuai.xi     if (MApi_XC_GetDynamicScalingStatus()) {
711*53ee8cc1Swenshuai.xi 
712*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SWDS_SW_FILM_ENABLE
713*53ee8cc1Swenshuai.xi         if ((gDMSCtrl[Overlay_ID].u8ForceInterlace || gDMSCtrl[Overlay_ID].u8ForcePMode) && MApi_XC_Set_DS_ForceI_DeInterlaceMode) {
714*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s,%5d] SW DS !!! \n", __func__, __LINE__);
715*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s,%5d] MApi_XC_Set_DS_ForceI_DeInterlaceMode %d %d\n", __func__, __LINE__, dff->u8Interlace, dff->u32FrameRate);
716*53ee8cc1Swenshuai.xi             MApi_XC_Set_DS_ForceI_DeInterlaceMode(dff->u8Interlace ? 0 : 1, TRUE, dff->u32FrameRate, (SCALER_WIN)Overlay_ID);
717*53ee8cc1Swenshuai.xi         }
718*53ee8cc1Swenshuai.xi #endif
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SET_DSINFO_V0
721*53ee8cc1Swenshuai.xi         // Inform xc to update the ds info in mcu mode
722*53ee8cc1Swenshuai.xi         if (MApi_XC_SetDSInfo)
723*53ee8cc1Swenshuai.xi         {
724*53ee8cc1Swenshuai.xi             XC_DS_INFO stXCDSInfo = {0, };
725*53ee8cc1Swenshuai.xi 
726*53ee8cc1Swenshuai.xi             stXCDSInfo.u32ApiDSInfo_Version = API_XCDS_INFO_VERSION;
727*53ee8cc1Swenshuai.xi             stXCDSInfo.u16ApiDSInfo_Length = sizeof(XC_DS_INFO);
728*53ee8cc1Swenshuai.xi             stXCDSInfo.bUpdate_DS_CMD[(SCALER_WIN) Overlay_ID] = TRUE;
729*53ee8cc1Swenshuai.xi 
730*53ee8cc1Swenshuai.xi #if (API_XCDS_INFO_VERSION == 1)
731*53ee8cc1Swenshuai.xi             if (sizeof(XC_DS_HDRInfo) == sizeof(MS_HDRInfo)) {
732*53ee8cc1Swenshuai.xi                 memcpy(&stXCDSInfo.stHDRInfo, &dff->sHDRInfo, sizeof(XC_DS_HDRInfo));
733*53ee8cc1Swenshuai.xi             } else {
734*53ee8cc1Swenshuai.xi                 DMS_PRINTF("MS_HDRInfo/XC_DS_HDRInfo size is not match\n");
735*53ee8cc1Swenshuai.xi             }
736*53ee8cc1Swenshuai.xi #elif (API_XCDS_INFO_VERSION >= 2)
737*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.u32FrmInfoExtAvail = dff->stHDRInfo.u32FrmInfoExtAvail;
738*53ee8cc1Swenshuai.xi 
739*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stColorDescription.u8ColorPrimaries = dff->stHDRInfo.stColorDescription.u8ColorPrimaries;
740*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stColorDescription.u8MatrixCoefficients = dff->stHDRInfo.stColorDescription.u8MatrixCoefficients;
741*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stColorDescription.u8TransferCharacteristics = dff->stHDRInfo.stColorDescription.u8TransferCharacteristics;
742*53ee8cc1Swenshuai.xi 
743*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u32MaxLuminance = dff->stHDRInfo.stMasterColorDisplay.u32MaxLuminance;
744*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u32MinLuminance = dff->stHDRInfo.stMasterColorDisplay.u32MinLuminance;
745*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[0][0] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[0][0];
746*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[0][1] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[0][1];
747*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[1][0] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[1][0];
748*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[1][1] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[1][1];
749*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[2][0] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[2][0];
750*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[2][1] = dff->stHDRInfo.stMasterColorDisplay.u16DisplayPrimaries[2][1];
751*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16WhitePoint[0] = dff->stHDRInfo.stMasterColorDisplay.u16WhitePoint[0];
752*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.stMasterColorDisplay.u16WhitePoint[1] = dff->stHDRInfo.stMasterColorDisplay.u16WhitePoint[1];
753*53ee8cc1Swenshuai.xi 
754*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.u8CurrentIndex = dff->stHDRInfo.stDolbyHDRInfo.u8CurrentIndex;
755*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.phyRegAddr = dff->stHDRInfo.stDolbyHDRInfo.phyHDRRegAddr;
756*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.u32RegSize = dff->stHDRInfo.stDolbyHDRInfo.u32HDRRegSize;
757*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.phyLutAddr = dff->stHDRInfo.stDolbyHDRInfo.phyHDRLutAddr;
758*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.u32LutSize = dff->stHDRInfo.stDolbyHDRInfo.u32HDRLutSize;
759*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.bDMEnable = dff->stHDRInfo.stDolbyHDRInfo.u8DMEnable;
760*53ee8cc1Swenshuai.xi             stXCDSInfo.stHDRInfo.bCompEnable = dff->stHDRInfo.stDolbyHDRInfo.u8CompEnable;
761*53ee8cc1Swenshuai.xi #endif
762*53ee8cc1Swenshuai.xi 
763*53ee8cc1Swenshuai.xi 
764*53ee8cc1Swenshuai.xi #if (API_XCDS_INFO_VERSION >= 3)
765*53ee8cc1Swenshuai.xi             stXCDSInfo.bEnableDNR[(SCALER_WIN) Overlay_ID] = (gDMSCtrl[Overlay_ID].u8DNRFrameCnt == DNRFrameNUM);
766*53ee8cc1Swenshuai.xi #endif
767*53ee8cc1Swenshuai.xi 
768*53ee8cc1Swenshuai.xi #if (API_XCDS_INFO_VERSION >= 4)
769*53ee8cc1Swenshuai.xi             stXCDSInfo.bEnable_ForceP[(SCALER_WIN) Overlay_ID] = gDMSCtrl[Overlay_ID].u8ForcePMode;
770*53ee8cc1Swenshuai.xi #endif
771*53ee8cc1Swenshuai.xi 
772*53ee8cc1Swenshuai.xi             MApi_XC_SetDSInfo(&stXCDSInfo, sizeof(stXCDSInfo), (SCALER_WIN) Overlay_ID);
773*53ee8cc1Swenshuai.xi         }
774*53ee8cc1Swenshuai.xi #endif
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SETWINDOW_LITE
778*53ee8cc1Swenshuai.xi         if (!bSizeChange) {
779*53ee8cc1Swenshuai.xi             MApi_SWDS_Fire((SCALER_WIN)Overlay_ID);
780*53ee8cc1Swenshuai.xi         } else
781*53ee8cc1Swenshuai.xi #endif
782*53ee8cc1Swenshuai.xi         if (MApi_XC_SetWindow(&stXC_SetWin_Info, sizeof(XC_SETWIN_INFO), (SCALER_WIN)Overlay_ID) == FALSE) {
783*53ee8cc1Swenshuai.xi             DMS_PRINTF("MApi_XC_SetWindow failed!\n");
784*53ee8cc1Swenshuai.xi         }
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SWDS_SW_FILM_ENABLE
787*53ee8cc1Swenshuai.xi         if ((gDMSCtrl[Overlay_ID].u8ForceInterlace || (gDMSCtrl[Overlay_ID].u8ForcePMode && dff->u8Interlace))
788*53ee8cc1Swenshuai.xi             && MApi_XC_Set_DS_ForceI_DeInterlaceMode) {
789*53ee8cc1Swenshuai.xi 
790*53ee8cc1Swenshuai.xi             gDMSCtrl[Overlay_ID].ds_curr_index.u4DSIndex0 = MApi_XC_GetSWDSIndex((SCALER_WIN)Overlay_ID);
791*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s,%5d] MApi_XC_Set_DS_ForceI_DeInterlaceMode %d %d\n", __func__, __LINE__, dff->u8Interlace, dff->u32FrameRate);
792*53ee8cc1Swenshuai.xi 
793*53ee8cc1Swenshuai.xi             MApi_XC_Set_DS_ForceI_DeInterlaceMode(dff->u8Interlace ? 0 : 1, FALSE, dff->u32FrameRate, (SCALER_WIN) Overlay_ID);
794*53ee8cc1Swenshuai.xi 
795*53ee8cc1Swenshuai.xi             if (MApi_XC_SetWindow(&stXC_SetWin_Info, sizeof(XC_SETWIN_INFO), (SCALER_WIN) Overlay_ID) == FALSE) {
796*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%s,%5d] MApi_XC_SetWindow failed!\n", __func__, __LINE__);
797*53ee8cc1Swenshuai.xi             }
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi             gDMSCtrl[Overlay_ID].ds_curr_index.u4DSIndex1 = MApi_XC_GetSWDSIndex((SCALER_WIN)Overlay_ID);
800*53ee8cc1Swenshuai.xi         } else
801*53ee8cc1Swenshuai.xi #endif
802*53ee8cc1Swenshuai.xi         {
803*53ee8cc1Swenshuai.xi             gDMSCtrl[Overlay_ID].ds_curr_index.u8DSIndex = MApi_XC_GetSWDSIndex((SCALER_WIN)Overlay_ID);
804*53ee8cc1Swenshuai.xi         }
805*53ee8cc1Swenshuai.xi     }
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi     if (bMsLogON) {
808*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s,%5d] [%d].u8DSIndex = 0x%x, time = %d ms\n", __func__,
809*53ee8cc1Swenshuai.xi             __LINE__, Overlay_ID, gDMSCtrl[Overlay_ID].ds_curr_index.u8DSIndex, (int)(MsOS_GetSystemTime() - u32Time));
810*53ee8cc1Swenshuai.xi     }
811*53ee8cc1Swenshuai.xi }
812*53ee8cc1Swenshuai.xi 
_DMS_Ddecide_SW_FRC_Mode(MS_U32 u32WindowID,const ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat,MS_U32 u32OutputFrmRate)813*53ee8cc1Swenshuai.xi void _DMS_Ddecide_SW_FRC_Mode(MS_U32 u32WindowID, const ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat, MS_U32 u32OutputFrmRate)
814*53ee8cc1Swenshuai.xi {
815*53ee8cc1Swenshuai.xi     MS_U32 u32FrameRate = pstDispFrameFormat->u32FrameRate;
816*53ee8cc1Swenshuai.xi     MS_U8 u8NextFrcMode = E_HVD_FRC_NORMAL;
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi     if (u32OutputFrmRate) {
819*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->u8Interlace) {   // Only Interlace Mode
820*53ee8cc1Swenshuai.xi             if ((u32FrameRate << 1) == u32OutputFrmRate) {   // Ex: 30x2 = 60i
821*53ee8cc1Swenshuai.xi                 u8NextFrcMode = E_HVD_FRC_NORMAL;
822*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 60000) {   // Input 120i
823*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 50000) {
824*53ee8cc1Swenshuai.xi                     // 120i -> 50i
825*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_120I_50I;
826*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 60000) {
827*53ee8cc1Swenshuai.xi                     // 120i -> 60i
828*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_HALF_I;
829*53ee8cc1Swenshuai.xi                 }
830*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 50000) {   // Input 100i
831*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {
832*53ee8cc1Swenshuai.xi                     // 100i -> 60i
833*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_100I_60I;
834*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 50000) {
835*53ee8cc1Swenshuai.xi                     // 100i -> 50i
836*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_HALF_I;
837*53ee8cc1Swenshuai.xi                 }
838*53ee8cc1Swenshuai.xi             } else if (u32FrameRate >= 29970
839*53ee8cc1Swenshuai.xi                        && u32FrameRate <= 30000) {
840*53ee8cc1Swenshuai.xi                 // 60i -> 50i
841*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 50000) {
842*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_NTSC2PAL;
843*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 30000) {
844*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_HALF_I;
845*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 25000) {
846*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_120I_50I; // 30 fps interlace = 60i, 60i to 25i == 120i to 50i
847*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 24000) {
848*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_30_24;
849*53ee8cc1Swenshuai.xi                 }
850*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 25000) {   // Input 50i
851*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {   // 50i -> 60i
852*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_PAL2NTSC;
853*53ee8cc1Swenshuai.xi                 } else if ((u32OutputFrmRate == 30000)) {
854*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_25_30;
855*53ee8cc1Swenshuai.xi                 }
856*53ee8cc1Swenshuai.xi             } else if (u32FrameRate >= 23970
857*53ee8cc1Swenshuai.xi                     && u32FrameRate <= 24000) {
858*53ee8cc1Swenshuai.xi 
859*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {   // 48i -> 60i
860*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_32PULLDOWN;
861*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 50000) {   // 48i -> 50i
862*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_NORMAL;
863*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 30000) {   // 48i -> 30i
864*53ee8cc1Swenshuai.xi                      u8NextFrcMode = E_HVD_FRC_24_30;
865*53ee8cc1Swenshuai.xi                 }
866*53ee8cc1Swenshuai.xi             }
867*53ee8cc1Swenshuai.xi         } else {   // Only Progressive Mode
868*53ee8cc1Swenshuai.xi             if (u32FrameRate == u32OutputFrmRate) {   // Ex: 25p = 25p
869*53ee8cc1Swenshuai.xi                 u8NextFrcMode = E_HVD_FRC_NORMAL;
870*53ee8cc1Swenshuai.xi             } else if ((u32FrameRate<<1) == u32OutputFrmRate) {   // Ex: 25p x 2 = 50p
871*53ee8cc1Swenshuai.xi                 u8NextFrcMode = E_HVD_FRC_DISP_2X;
872*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 60000) {
873*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 50000) {   // 60p -> 50p
874*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_60P_50P;
875*53ee8cc1Swenshuai.xi                 }
876*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 50000) {
877*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {   // 50p -> 60p
878*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_50P_60P;
879*53ee8cc1Swenshuai.xi                 }
880*53ee8cc1Swenshuai.xi             } else if (u32FrameRate >= 29970
881*53ee8cc1Swenshuai.xi                        && u32FrameRate <= 30000) {
882*53ee8cc1Swenshuai.xi                 // 30p -> 50p
883*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 50000) {
884*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_NTSC2PAL;
885*53ee8cc1Swenshuai.xi                 } else if ((u32OutputFrmRate == 60000)) {
886*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_DISP_2X;
887*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 25000) {
888*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_60P_50P;  // 30p -> 25p, 60p -> 50p, the same rule
889*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 24000) {
890*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_30_24;
891*53ee8cc1Swenshuai.xi                 }
892*53ee8cc1Swenshuai.xi             } else if (u32FrameRate == 25000) {
893*53ee8cc1Swenshuai.xi                 // 25p -> 60p
894*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {
895*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_PAL2NTSC;
896*53ee8cc1Swenshuai.xi                 } else if ((u32OutputFrmRate == 30000)) {
897*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_25_30;
898*53ee8cc1Swenshuai.xi                 }
899*53ee8cc1Swenshuai.xi             } else if (u32FrameRate >= 23970
900*53ee8cc1Swenshuai.xi                     && u32FrameRate <= 24000) {
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi                 if (u32OutputFrmRate == 60000) {
903*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_32PULLDOWN;
904*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 50000) {
905*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_24_50;
906*53ee8cc1Swenshuai.xi                 } else if (u32OutputFrmRate == 30000) {   // 24p -> 30p
907*53ee8cc1Swenshuai.xi                     u8NextFrcMode = E_HVD_FRC_24_30;
908*53ee8cc1Swenshuai.xi                 }
909*53ee8cc1Swenshuai.xi             }
910*53ee8cc1Swenshuai.xi         }
911*53ee8cc1Swenshuai.xi     }
912*53ee8cc1Swenshuai.xi 
913*53ee8cc1Swenshuai.xi     gDMSCtrl[u32WindowID].u8FrcMode = u8NextFrcMode;
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi     if (pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_RV8
916*53ee8cc1Swenshuai.xi         || pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_RV9) {
917*53ee8cc1Swenshuai.xi         // rmvb is variable framerate, don't do FRC
918*53ee8cc1Swenshuai.xi         gDMSCtrl[u32WindowID].u8FrcMode = E_HVD_FRC_NORMAL;
919*53ee8cc1Swenshuai.xi     }
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi     DMS_PRINTF("u32FrameRate=%d, u32OutputFrmRate=%d, u8FrcMode[%d] = %d",
922*53ee8cc1Swenshuai.xi         (int)u32FrameRate, (int)u32OutputFrmRate, (int)u32WindowID, gDMSCtrl[u32WindowID].u8FrcMode);
923*53ee8cc1Swenshuai.xi }
924*53ee8cc1Swenshuai.xi 
_DMS_Update_SW_FRC_Mode(MS_U32 u32WindowID,const ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)925*53ee8cc1Swenshuai.xi static void _DMS_Update_SW_FRC_Mode(MS_U32 u32WindowID, const ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat)
926*53ee8cc1Swenshuai.xi {
927*53ee8cc1Swenshuai.xi     // Get is XC gen timing or not, if XC gen timing, enable SW FRC
928*53ee8cc1Swenshuai.xi     MVOP_Handle stMvopHd;
929*53ee8cc1Swenshuai.xi     MS_BOOL bIsXCGenTiming = FALSE;
930*53ee8cc1Swenshuai.xi 
931*53ee8cc1Swenshuai.xi     if (u32WindowID == 0) {
932*53ee8cc1Swenshuai.xi         stMvopHd.eModuleNum = E_MVOP_MODULE_MAIN;
933*53ee8cc1Swenshuai.xi     } else {
934*53ee8cc1Swenshuai.xi         stMvopHd.eModuleNum = E_MVOP_MODULE_SUB;
935*53ee8cc1Swenshuai.xi     }
936*53ee8cc1Swenshuai.xi 
937*53ee8cc1Swenshuai.xi     MDrv_MVOP_GetCommand(&stMvopHd, E_MVOP_CMD_GET_IS_XC_GEN_TIMING, &bIsXCGenTiming, sizeof(bIsXCGenTiming));
938*53ee8cc1Swenshuai.xi 
939*53ee8cc1Swenshuai.xi     if (bIsXCGenTiming) {
940*53ee8cc1Swenshuai.xi         _DMS_Ddecide_SW_FRC_Mode(u32WindowID, pstDispFrameFormat, MApi_XC_GetOutputVFreqX100() * 10);
941*53ee8cc1Swenshuai.xi     } else {
942*53ee8cc1Swenshuai.xi         gDMSCtrl[u32WindowID].u8FrcMode = E_HVD_FRC_NORMAL;
943*53ee8cc1Swenshuai.xi     }
944*53ee8cc1Swenshuai.xi }
945*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_AddRef(MS_U32 u32Window,MS_U16 u16BufID)946*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_AddRef(MS_U32 u32Window, MS_U16 u16BufID)
947*53ee8cc1Swenshuai.xi {
948*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
949*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
950*53ee8cc1Swenshuai.xi #if NEW_FLIP
951*53ee8cc1Swenshuai.xi     VDEC_StreamId VdecStreamId;
952*53ee8cc1Swenshuai.xi     VDEC_EX_DispFrame VdecDispFrm;
953*53ee8cc1Swenshuai.xi     VdecStreamId.u32Version = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
954*53ee8cc1Swenshuai.xi     VdecStreamId.u32Id = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
955*53ee8cc1Swenshuai.xi     VdecDispFrm.u32Idx = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
956*53ee8cc1Swenshuai.xi     VdecDispFrm.u32PriData = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
957*53ee8cc1Swenshuai.xi     VDEC_EX_Result eResult;
958*53ee8cc1Swenshuai.xi     eResult = MApi_VDEC_EX_DisplayFrame((VDEC_StreamId*)&VdecStreamId, &VdecDispFrm);
959*53ee8cc1Swenshuai.xi     if (eResult != E_VDEC_EX_OK)
960*53ee8cc1Swenshuai.xi     {
961*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] %d %d, %d %d\n", __FUNCTION__, (int)VdecStreamId.u32Version, (int)VdecStreamId.u32Id,
962*53ee8cc1Swenshuai.xi             (int)VdecDispFrm.u32Idx, (int)VdecDispFrm.u32PriData);
963*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %d, BufID %d, MApi_VDEC_EX_DisplayFrame return %d\n",__FUNCTION__, (int)u32Window,u16BufID, eResult);
964*53ee8cc1Swenshuai.xi         return FALSE;
965*53ee8cc1Swenshuai.xi     }
966*53ee8cc1Swenshuai.xi     //DMS_PRINTF("[AddRef] u16BufID[%d] Frame[0x%x], PriData[0x%x]\n", u16BufID, VdecDispFrm.u32Idx, VdecDispFrm.u32PriData);
967*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Window][u16BufID]++;
968*53ee8cc1Swenshuai.xi #endif
969*53ee8cc1Swenshuai.xi     return TRUE;
970*53ee8cc1Swenshuai.xi }
971*53ee8cc1Swenshuai.xi 
_DMS_VDEC_Frame_Release(MS_U32 u32Window,MS_U16 u16BufID)972*53ee8cc1Swenshuai.xi static MS_BOOL _DMS_VDEC_Frame_Release(MS_U32 u32Window, MS_U16 u16BufID)
973*53ee8cc1Swenshuai.xi {
974*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
975*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
976*53ee8cc1Swenshuai.xi #if NEW_FLIP
977*53ee8cc1Swenshuai.xi     if(pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Window][u16BufID] == 0)
978*53ee8cc1Swenshuai.xi     {
979*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] window %d, BufID %d, Release an invalid buffer\n",__FUNCTION__, (int)u32Window, u16BufID);
980*53ee8cc1Swenshuai.xi         return TRUE;
981*53ee8cc1Swenshuai.xi     }
982*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Window][u16BufID]--;
983*53ee8cc1Swenshuai.xi     if(pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Window][u16BufID] == 0)
984*53ee8cc1Swenshuai.xi     {
985*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
986*53ee8cc1Swenshuai.xi         VDEC_EX_DispFrame VdecDispFrm;
987*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamVersion;
988*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32VDECStreamID;
989*53ee8cc1Swenshuai.xi         VdecDispFrm.u32Idx = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32FrameIndex;
990*53ee8cc1Swenshuai.xi         VdecDispFrm.u32PriData = pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32Window][u16BufID].u32PriData;
991*53ee8cc1Swenshuai.xi 
992*53ee8cc1Swenshuai.xi         VDEC_EX_Result eResult;
993*53ee8cc1Swenshuai.xi         eResult = MApi_VDEC_EX_ReleaseFrame((VDEC_StreamId *) &VdecStreamId, &VdecDispFrm);
994*53ee8cc1Swenshuai.xi         if (eResult != E_VDEC_EX_OK)
995*53ee8cc1Swenshuai.xi         {
996*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] %d %d, %d %d\n",__FUNCTION__, (int)VdecStreamId.u32Version, (int)VdecStreamId.u32Id,
997*53ee8cc1Swenshuai.xi                 (int)VdecDispFrm.u32Idx, (int)VdecDispFrm.u32PriData);
998*53ee8cc1Swenshuai.xi             DMS_PRINTF("[%s] window %d, BufID %d, MApi_VDEC_EX_ReleaseFrame return %d\n",__FUNCTION__, (int)u32Window, u16BufID, eResult);
999*53ee8cc1Swenshuai.xi             return FALSE;
1000*53ee8cc1Swenshuai.xi         }
1001*53ee8cc1Swenshuai.xi         //DMS_PRINTF("[DecRef] u16BufID[%d] Frame[0x%x], PriData[0x%x]\n", u16BufID, VdecDispFrm.u32Idx, VdecDispFrm.u32PriData);
1002*53ee8cc1Swenshuai.xi     }
1003*53ee8cc1Swenshuai.xi #endif
1004*53ee8cc1Swenshuai.xi     return TRUE;
1005*53ee8cc1Swenshuai.xi }
1006*53ee8cc1Swenshuai.xi 
_DMS_MVOP_ISR(InterruptNum eIntNum)1007*53ee8cc1Swenshuai.xi static void _DMS_MVOP_ISR(InterruptNum eIntNum)
1008*53ee8cc1Swenshuai.xi {
1009*53ee8cc1Swenshuai.xi     MS_U8 u8IntStatus;
1010*53ee8cc1Swenshuai.xi     MS_U8 u8MvopId = ((E_INT_IRQ_DCSUB == eIntNum) ? 1 : 0);
1011*53ee8cc1Swenshuai.xi 
1012*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi     if (E_INT_IRQ_DC == eIntNum) {
1015*53ee8cc1Swenshuai.xi         u8IntStatus = MDrv_MVOP_GetIntStatus();
1016*53ee8cc1Swenshuai.xi     } else {
1017*53ee8cc1Swenshuai.xi         u8IntStatus = MDrv_MVOP_SubGetIntStatus();
1018*53ee8cc1Swenshuai.xi     }
1019*53ee8cc1Swenshuai.xi #endif
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi     //if (bMsLogON)
1022*53ee8cc1Swenshuai.xi     //    DMS_PRINTF("_DMS_MVOP_ISR eIntNum %d mvop %d int, status = 0x%x\n", eIntNum, u8MvopId, u8IntStatus);
1023*53ee8cc1Swenshuai.xi 
1024*53ee8cc1Swenshuai.xi     if (u8MvopId) {
1025*53ee8cc1Swenshuai.xi         MDrv_MVOP_SubEnableInterrupt(0);
1026*53ee8cc1Swenshuai.xi         MDrv_MVOP_SubEnableInterrupt(E_MVOP_INT_VSYNC);
1027*53ee8cc1Swenshuai.xi         MsOS_EnableInterrupt(E_INT_IRQ_DCSUB);
1028*53ee8cc1Swenshuai.xi     } else {
1029*53ee8cc1Swenshuai.xi         MDrv_MVOP_EnableInterrupt(0);
1030*53ee8cc1Swenshuai.xi         MDrv_MVOP_EnableInterrupt(E_MVOP_INT_VSYNC);
1031*53ee8cc1Swenshuai.xi         MsOS_EnableInterrupt(E_INT_IRQ_DC);
1032*53ee8cc1Swenshuai.xi     }
1033*53ee8cc1Swenshuai.xi     //if (u8IntStatus & E_MVOP_INT_VSYNC) {
1034*53ee8cc1Swenshuai.xi         MsOS_SetEvent(s32DMSEventID[u8MvopId], E_MVOP_INT_VSYNC);
1035*53ee8cc1Swenshuai.xi         MsOS_SetEvent(s32DMSVsyncEventID[u8MvopId], E_MVOP_INT_VSYNC);
1036*53ee8cc1Swenshuai.xi     //}
1037*53ee8cc1Swenshuai.xi }
1038*53ee8cc1Swenshuai.xi 
_Task_DMS_Mointor(MS_U32 u32Id)1039*53ee8cc1Swenshuai.xi static void _Task_DMS_Mointor(MS_U32 u32Id)
1040*53ee8cc1Swenshuai.xi {
1041*53ee8cc1Swenshuai.xi     MS_U32 u32WaitEventFlag = E_MVOP_INT_VSYNC;
1042*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
1043*53ee8cc1Swenshuai.xi     void *pInstance = pTaskInstance;
1044*53ee8cc1Swenshuai.xi 
1045*53ee8cc1Swenshuai.xi     while(1) {
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi #ifdef DMS_ENABLE_MVOP_INT
1048*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(s32DMSEventID[u32Id], u32WaitEventFlag, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
1049*53ee8cc1Swenshuai.xi #else
1050*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(s32DMSEventID[u32Id], u32WaitEventFlag, &u32Events, E_OR_CLEAR, 16);
1051*53ee8cc1Swenshuai.xi #endif
1052*53ee8cc1Swenshuai.xi         _DRV_DMS_Entry(u32Id);
1053*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1054*53ee8cc1Swenshuai.xi         DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1055*53ee8cc1Swenshuai.xi         UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi         gDMSCtrl[u32Id].bVsyncIntAlive = TRUE;
1058*53ee8cc1Swenshuai.xi         MCU_DISPQ_INFO *pSHM = (MCU_DISPQ_INFO *)MsOS_PA2KSEG1(pDMSResPri->stDrvDMS.phyVsyncbridgeAddr[u32Id] + ((MS_U32)u32Id * sizeof(MCU_DISPQ_INFO)));
1059*53ee8cc1Swenshuai.xi #if 0
1060*53ee8cc1Swenshuai.xi         DMS_PRINTF("  _Task_DMS_Mointor ---> [%d %d %d %d %d %d %d %d] %d %d \n",
1061*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][0],
1062*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][1],
1063*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][2],
1064*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][3],
1065*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][4],
1066*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][5],
1067*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][6],
1068*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][7],
1069*53ee8cc1Swenshuai.xi             pSHM->u8McuDispQWPtr,
1070*53ee8cc1Swenshuai.xi             pSHM->u8McuDispQRPtr);
1071*53ee8cc1Swenshuai.xi #endif
1072*53ee8cc1Swenshuai.xi         int i;
1073*53ee8cc1Swenshuai.xi         for (i = 0; i < MAX_VSYNC_BRIDGE_DISPQ_NUM; i++) {
1074*53ee8cc1Swenshuai.xi 
1075*53ee8cc1Swenshuai.xi             if (pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32Id][i]) {
1076*53ee8cc1Swenshuai.xi                 // reference count is not 0
1077*53ee8cc1Swenshuai.xi                 if(pSHM->u8McuDispQRPtr != i && pSHM->McuDispQueue[i].u8Tog_Time == 0) {
1078*53ee8cc1Swenshuai.xi                     _DMS_VDEC_Frame_Release(u32Id, i);
1079*53ee8cc1Swenshuai.xi                     if (bMsLogON)
1080*53ee8cc1Swenshuai.xi                         DMS_PRINTF("  _Task_DMS_Mointor Overlay[%d] W %d, R %d, Cur %d, disp_cnt = %d\n", (int)u32Id,
1081*53ee8cc1Swenshuai.xi                               pSHM->u8McuDispQWPtr, pSHM->u8McuDispQRPtr, i,
1082*53ee8cc1Swenshuai.xi                               pSHM->McuDispQueue[i].u16DispCnt);
1083*53ee8cc1Swenshuai.xi                 }
1084*53ee8cc1Swenshuai.xi             }
1085*53ee8cc1Swenshuai.xi         }
1086*53ee8cc1Swenshuai.xi 
1087*53ee8cc1Swenshuai.xi         // display win changed in pause state
1088*53ee8cc1Swenshuai.xi         if (pSHM->u8McuDispSwitch
1089*53ee8cc1Swenshuai.xi             && (pSHM->u8McuDispQWPtr == pSHM->u8McuDispQRPtr)
1090*53ee8cc1Swenshuai.xi             && !pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8Tog_Time
1091*53ee8cc1Swenshuai.xi             && pDMSResPri->stDrvDMS.bWinChanged[u32Id]) {
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi                 MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1094*53ee8cc1Swenshuai.xi 
1095*53ee8cc1Swenshuai.xi                 _DMS_Update_DS_Table(pInstance, u32Id, &gDMSCtrl[u32Id].lastdff, 0, TRUE);
1096*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16CropLeft = gDMSCtrl[u32Id].stCurrentCropWin.u32x;
1097*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16CropTop = gDMSCtrl[u32Id].stCurrentCropWin.u32y;
1098*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16CropRight = pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16Width
1099*53ee8cc1Swenshuai.xi                                                             - gDMSCtrl[u32Id].stCurrentCropWin.u32width
1100*53ee8cc1Swenshuai.xi                                                             - gDMSCtrl[u32Id].stCurrentCropWin.u32x;
1101*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16CropBottom = pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u16Height
1102*53ee8cc1Swenshuai.xi                                                             - gDMSCtrl[u32Id].stCurrentCropWin.u32height
1103*53ee8cc1Swenshuai.xi                                                             - gDMSCtrl[u32Id].stCurrentCropWin.u32y;
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi                 if (pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8Interlace) {
1106*53ee8cc1Swenshuai.xi                     MS_U8 u8WRBankMappingNum = MApi_XC_GetWRBankMappingNum((SCALER_WIN)u32Id) + 1;
1107*53ee8cc1Swenshuai.xi                     DMS_PRINTF("u8WRBankMappingNum = %d , FRAME_DURATION = %d", u8WRBankMappingNum, FRAME_DURATION(gDMSCtrl[u32Id].u16FrameRate));
1108*53ee8cc1Swenshuai.xi                     pSHM->u8ToggleMethod = 1;
1109*53ee8cc1Swenshuai.xi                     pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8Tog_Time = u8WRBankMappingNum;
1110*53ee8cc1Swenshuai.xi                     pSHM->u8ToggledTime = u8WRBankMappingNum;
1111*53ee8cc1Swenshuai.xi                 }
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8DSIndex = gDMSCtrl[u32Id].ds_curr_index.u8DSIndex;
1114*53ee8cc1Swenshuai.xi 
1115*53ee8cc1Swenshuai.xi                 DMS_PRINTF("  _Task_DMS_Mointor DS_Idx=0x%x, DS_Idx1=0x%x, u8DSIndex = 0x%x, MVOP ID=%d",
1116*53ee8cc1Swenshuai.xi                     gDMSCtrl[u32Id].ds_curr_index.u4DSIndex0 , gDMSCtrl[u32Id].ds_curr_index.u4DSIndex1,
1117*53ee8cc1Swenshuai.xi                     pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8DSIndex, (int)u32Id);
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi         }
1120*53ee8cc1Swenshuai.xi         else
1121*53ee8cc1Swenshuai.xi         {
1122*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1123*53ee8cc1Swenshuai.xi         }
1124*53ee8cc1Swenshuai.xi 
1125*53ee8cc1Swenshuai.xi         _DRV_DMS_Release(u32Id);
1126*53ee8cc1Swenshuai.xi     }
1127*53ee8cc1Swenshuai.xi }
1128*53ee8cc1Swenshuai.xi 
_MDrv_DMS_CreateTask(MS_U32 u32Id)1129*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMS_CreateTask(MS_U32 u32Id)
1130*53ee8cc1Swenshuai.xi {
1131*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_NOS
1132*53ee8cc1Swenshuai.xi     // Create Event
1133*53ee8cc1Swenshuai.xi     if(s32DMSEventID[u32Id] < 0)
1134*53ee8cc1Swenshuai.xi     {
1135*53ee8cc1Swenshuai.xi         s32DMSEventID[u32Id] = MsOS_CreateEventGroup(u32Id ? "DMS_Sub_Event" : "DMS_Main_Event");
1136*53ee8cc1Swenshuai.xi     }
1137*53ee8cc1Swenshuai.xi 
1138*53ee8cc1Swenshuai.xi     if(s32DMSVsyncEventID[u32Id] < 0)
1139*53ee8cc1Swenshuai.xi     {
1140*53ee8cc1Swenshuai.xi         s32DMSVsyncEventID[u32Id] = MsOS_CreateEventGroup(u32Id ? "DMS_Sub_Vsync_Event" : "DMS_Main_Vsync_Event");
1141*53ee8cc1Swenshuai.xi     }
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     if(s32DMSTaskID[u32Id] == -1)
1144*53ee8cc1Swenshuai.xi     {
1145*53ee8cc1Swenshuai.xi         s32DMSTaskID[u32Id] = MsOS_CreateTask((TaskEntry)_Task_DMS_Mointor,
1146*53ee8cc1Swenshuai.xi                                     u32Id,
1147*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
1148*53ee8cc1Swenshuai.xi                                     TRUE,
1149*53ee8cc1Swenshuai.xi                                     NULL,
1150*53ee8cc1Swenshuai.xi                                     0,
1151*53ee8cc1Swenshuai.xi                                     "DMS_Task");
1152*53ee8cc1Swenshuai.xi     }
1153*53ee8cc1Swenshuai.xi     else
1154*53ee8cc1Swenshuai.xi     {
1155*53ee8cc1Swenshuai.xi         DMS_PRINTF("MsOS_ResumeTask(s32DMSTaskID) \n");
1156*53ee8cc1Swenshuai.xi         MsOS_ResumeTask(s32DMSTaskID[u32Id]);
1157*53ee8cc1Swenshuai.xi     }
1158*53ee8cc1Swenshuai.xi 
1159*53ee8cc1Swenshuai.xi #endif
1160*53ee8cc1Swenshuai.xi     return TRUE;
1161*53ee8cc1Swenshuai.xi }
1162*53ee8cc1Swenshuai.xi 
_MDrv_DMS_InvalidateAllQueue(void)1163*53ee8cc1Swenshuai.xi void _MDrv_DMS_InvalidateAllQueue(void)
1164*53ee8cc1Swenshuai.xi {
1165*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1166*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi     MS_U8 u8WindowID = 0;
1169*53ee8cc1Swenshuai.xi     MS_U8 u8BufferID = 0;
1170*53ee8cc1Swenshuai.xi 
1171*53ee8cc1Swenshuai.xi     for (u8WindowID = 0; u8WindowID < DMS_MAX_WINDOW_NUM; u8WindowID++)
1172*53ee8cc1Swenshuai.xi     {
1173*53ee8cc1Swenshuai.xi         for(u8BufferID=0;u8BufferID<DMS_DIP_QUEUEDEPTH;u8BufferID++)
1174*53ee8cc1Swenshuai.xi         {
1175*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].bValid = FALSE;
1176*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u8WindowID][u8BufferID].u32FrameIndex = DMS_INVALID_FRAME_ID;
1177*53ee8cc1Swenshuai.xi         }
1178*53ee8cc1Swenshuai.xi     }
1179*53ee8cc1Swenshuai.xi }
1180*53ee8cc1Swenshuai.xi 
_MDrv_DMS_ZOrder_Init(void)1181*53ee8cc1Swenshuai.xi static void _MDrv_DMS_ZOrder_Init(void)
1182*53ee8cc1Swenshuai.xi {
1183*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1184*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1185*53ee8cc1Swenshuai.xi     MS_U8 u8Window = 0;
1186*53ee8cc1Swenshuai.xi     memset(pDMSResPri->stDrvDMS.WindowZOrder, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM);
1187*53ee8cc1Swenshuai.xi     memset(pDMSResPri->stDrvDMS.WindowScore, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM);
1188*53ee8cc1Swenshuai.xi 
1189*53ee8cc1Swenshuai.xi     for(u8Window = 0; u8Window < DMS_MAX_WINDOW_NUM; u8Window++)
1190*53ee8cc1Swenshuai.xi     {
1191*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.WindowZOrder[u8Window] = u8Window;
1192*53ee8cc1Swenshuai.xi     }
1193*53ee8cc1Swenshuai.xi }
1194*53ee8cc1Swenshuai.xi 
1195*53ee8cc1Swenshuai.xi #define BPP_OF_YUV422 2
_MDrv_DMS_Setup_Memory(EN_DMS_MEMORY_TYPE enMemType,MS_PHY phyMemBufferAddr,MS_PHY u32MemBufferSize)1196*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Setup_Memory(EN_DMS_MEMORY_TYPE enMemType, MS_PHY phyMemBufferAddr, MS_PHY u32MemBufferSize)
1197*53ee8cc1Swenshuai.xi {
1198*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1199*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1200*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1201*53ee8cc1Swenshuai.xi     switch(enMemType)
1202*53ee8cc1Swenshuai.xi     {
1203*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_GOP_DISPLAY:
1204*53ee8cc1Swenshuai.xi         {
1205*53ee8cc1Swenshuai.xi             break;
1206*53ee8cc1Swenshuai.xi         }
1207*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_FREEZE:
1208*53ee8cc1Swenshuai.xi         {
1209*53ee8cc1Swenshuai.xi             break;
1210*53ee8cc1Swenshuai.xi         }
1211*53ee8cc1Swenshuai.xi         case E_DMS_MEMORY_TYPE_MVOP_DISPLAY:
1212*53ee8cc1Swenshuai.xi         {
1213*53ee8cc1Swenshuai.xi             break;
1214*53ee8cc1Swenshuai.xi         }
1215*53ee8cc1Swenshuai.xi         default:
1216*53ee8cc1Swenshuai.xi         {
1217*53ee8cc1Swenshuai.xi             DMS_PRINTF("\033[1;31m[%s][%d] unuse mem type %d\033[0m\n",__FUNCTION__,__LINE__,enMemType);
1218*53ee8cc1Swenshuai.xi             break;
1219*53ee8cc1Swenshuai.xi         }
1220*53ee8cc1Swenshuai.xi     }
1221*53ee8cc1Swenshuai.xi     return bRet;
1222*53ee8cc1Swenshuai.xi }
1223*53ee8cc1Swenshuai.xi 
_MDrv_DMS_Init(void * pInstance)1224*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Init(void* pInstance)
1225*53ee8cc1Swenshuai.xi {
1226*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1227*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1228*53ee8cc1Swenshuai.xi     if(pDMSResPri->bDrvInit == TRUE)
1229*53ee8cc1Swenshuai.xi     {
1230*53ee8cc1Swenshuai.xi         DMS_PRINTF("Driver has inited!!!!!!!!\n");
1231*53ee8cc1Swenshuai.xi         return TRUE;
1232*53ee8cc1Swenshuai.xi     }
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi #ifdef DMS_ENABLE_MVOP_INT
1235*53ee8cc1Swenshuai.xi     //MDrv_SYS_GlobalInit();
1236*53ee8cc1Swenshuai.xi     MDrv_MVOP_Init();
1237*53ee8cc1Swenshuai.xi     MDrv_MVOP_SubInit();
1238*53ee8cc1Swenshuai.xi     MDrv_MVOP_SetMMIOMapBase();
1239*53ee8cc1Swenshuai.xi 
1240*53ee8cc1Swenshuai.xi     //XC_INITDATA XC_InitData;
1241*53ee8cc1Swenshuai.xi     // xc not init.
1242*53ee8cc1Swenshuai.xi     //memset((void*)&XC_InitData, 0, sizeof(XC_InitData));
1243*53ee8cc1Swenshuai.xi     //MApi_XC_Init(&XC_InitData, 0);
1244*53ee8cc1Swenshuai.xi     //MApi_PNL_IOMapBaseInit();
1245*53ee8cc1Swenshuai.xi #endif
1246*53ee8cc1Swenshuai.xi 
1247*53ee8cc1Swenshuai.xi     #if 0
1248*53ee8cc1Swenshuai.xi     // Create Event
1249*53ee8cc1Swenshuai.xi     if(s32DMSEventID[0] < 0)
1250*53ee8cc1Swenshuai.xi     {
1251*53ee8cc1Swenshuai.xi         s32DMSEventID[0] = MsOS_CreateEventGroup("DMS_Main_Vsync_Event");
1252*53ee8cc1Swenshuai.xi     }
1253*53ee8cc1Swenshuai.xi     if(s32DMSEventID[1] < 0)
1254*53ee8cc1Swenshuai.xi     {
1255*53ee8cc1Swenshuai.xi         s32DMSEventID[1] = MsOS_CreateEventGroup("DMS_Sub_Vsync_Event");
1256*53ee8cc1Swenshuai.xi     }
1257*53ee8cc1Swenshuai.xi     _MDrv_DMS_CreateTask(0);
1258*53ee8cc1Swenshuai.xi     _MDrv_DMS_CreateTask(1);
1259*53ee8cc1Swenshuai.xi     #endif
1260*53ee8cc1Swenshuai.xi 
1261*53ee8cc1Swenshuai.xi     // Clear VDEC info
1262*53ee8cc1Swenshuai.xi     memset(pDMSResPri->stDrvDMS._stXC_DIPPushInfo, 0x0, sizeof(DMS_VDECFRAME_INFO)*DMS_DIP_QUEUEDEPTH);
1263*53ee8cc1Swenshuai.xi 
1264*53ee8cc1Swenshuai.xi     _MDrv_DMS_ZOrder_Init();
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi     pTaskInstance = pInstance;
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi     _MDrv_DMS_InvalidateAllQueue();
1269*53ee8cc1Swenshuai.xi 
1270*53ee8cc1Swenshuai.xi     pDMSResPri->bDrvInit = TRUE;
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi     return TRUE;
1273*53ee8cc1Swenshuai.xi }
1274*53ee8cc1Swenshuai.xi 
_MDrv_DMS_SetWin(void * pInstance,MS_U32 u32Window,ST_DMS_SETWIN_INFO * pstDMS_SetWin_Info)1275*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_SetWin(void* pInstance, MS_U32 u32Window, ST_DMS_SETWIN_INFO *pstDMS_SetWin_Info)
1276*53ee8cc1Swenshuai.xi {
1277*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1278*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1279*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW stCropWin = {0};
1280*53ee8cc1Swenshuai.xi     ST_DMS_WINDOW stDispWin = {0};
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi     if(pstDMS_SetWin_Info == NULL)
1283*53ee8cc1Swenshuai.xi     {
1284*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] error, Set window parameter cannot be NULL\n", __FUNCTION__);
1285*53ee8cc1Swenshuai.xi         return FALSE;
1286*53ee8cc1Swenshuai.xi     }
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi     if (u32Window >= DMS_MAX_WINDOW_NUM) {
1289*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s] error, u32Window number exceed limit\n", __FUNCTION__);
1290*53ee8cc1Swenshuai.xi         return FALSE;
1291*53ee8cc1Swenshuai.xi     }
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi     memcpy(&pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stCropWin ,
1294*53ee8cc1Swenshuai.xi         &pstDMS_SetWin_Info->stOutputWinInfo.stCropWin, sizeof(stCropWin));
1295*53ee8cc1Swenshuai.xi     memcpy(&pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stOutputWin,
1296*53ee8cc1Swenshuai.xi         &pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin, sizeof(stDispWin));
1297*53ee8cc1Swenshuai.xi     memcpy(&pDMSResPri->stDrvDMS.stDisplayWin[u32Window],
1298*53ee8cc1Swenshuai.xi         &pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin, sizeof(stDispWin));
1299*53ee8cc1Swenshuai.xi 
1300*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s] crop[%d %d %d %d] disp[%d %d %d %d]\n", __FUNCTION__ ,
1301*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32x,
1302*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32y,
1303*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32width,
1304*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stCropWin.u32height,
1305*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin.u32x,
1306*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin.u32y,
1307*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin.u32width,
1308*53ee8cc1Swenshuai.xi         (int)pstDMS_SetWin_Info->stOutputWinInfo.stOutputWin.u32height);
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi     if (pstDMS_SetWin_Info->enARC != E_DMS_AR_DEFAULT) {
1311*53ee8cc1Swenshuai.xi         // calculate ARC here
1312*53ee8cc1Swenshuai.xi 
1313*53ee8cc1Swenshuai.xi     }
1314*53ee8cc1Swenshuai.xi 
1315*53ee8cc1Swenshuai.xi     if (pstDMS_SetWin_Info->u32OnOutputLayer && pDMSResPri->stDrvDMS.stOutputLayer.u32width
1316*53ee8cc1Swenshuai.xi         && pDMSResPri->stDrvDMS.stOutputLayer.u32height) {
1317*53ee8cc1Swenshuai.xi         // calculate the real window to XC
1318*53ee8cc1Swenshuai.xi 
1319*53ee8cc1Swenshuai.xi         MS_U32 u32PanelWidth = g_IPanel.Width();
1320*53ee8cc1Swenshuai.xi         MS_U32 u32PanelHeight = g_IPanel.Height();
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi         DMS_PRINTF("panel [%d %d] osd [%d %d] \n", (int)u32PanelWidth, (int)u32PanelHeight,
1323*53ee8cc1Swenshuai.xi             (int)pDMSResPri->stDrvDMS.stOutputLayer.u32width,
1324*53ee8cc1Swenshuai.xi             (int)pDMSResPri->stDrvDMS.stOutputLayer.u32height);
1325*53ee8cc1Swenshuai.xi         if (pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32x < 0) {
1326*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32x = 0;
1327*53ee8cc1Swenshuai.xi         } else {
1328*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32x =
1329*53ee8cc1Swenshuai.xi                 ((pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32x * u32PanelWidth)
1330*53ee8cc1Swenshuai.xi                 / pDMSResPri->stDrvDMS.stOutputLayer.u32width);
1331*53ee8cc1Swenshuai.xi         }
1332*53ee8cc1Swenshuai.xi 
1333*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32width =
1334*53ee8cc1Swenshuai.xi             ((pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32width * u32PanelWidth)
1335*53ee8cc1Swenshuai.xi             / pDMSResPri->stDrvDMS.stOutputLayer.u32width);
1336*53ee8cc1Swenshuai.xi         if (pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32width > u32PanelWidth) {
1337*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32width = u32PanelWidth;
1338*53ee8cc1Swenshuai.xi         }
1339*53ee8cc1Swenshuai.xi 
1340*53ee8cc1Swenshuai.xi         if (pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32y < 0) {
1341*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32y = 0;
1342*53ee8cc1Swenshuai.xi         } else {
1343*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32y =
1344*53ee8cc1Swenshuai.xi                 ((pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32y * u32PanelHeight)
1345*53ee8cc1Swenshuai.xi                 / pDMSResPri->stDrvDMS.stOutputLayer.u32height);
1346*53ee8cc1Swenshuai.xi         }
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32height =
1349*53ee8cc1Swenshuai.xi             ((pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32height * u32PanelHeight)
1350*53ee8cc1Swenshuai.xi             / pDMSResPri->stDrvDMS.stOutputLayer.u32height);
1351*53ee8cc1Swenshuai.xi         if (pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32height > u32PanelHeight) {
1352*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32height = u32PanelHeight;
1353*53ee8cc1Swenshuai.xi         }
1354*53ee8cc1Swenshuai.xi 
1355*53ee8cc1Swenshuai.xi         DMS_PRINTF("apply ratio, disp_win[%d %d %d %d] crop_win[%d %d %d %d]\n",
1356*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32x,
1357*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32y,
1358*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32width,
1359*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stDisplayWin[u32Window].u32height,
1360*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stCropWin.u32x,
1361*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stCropWin.u32y,
1362*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stCropWin.u32width,
1363*53ee8cc1Swenshuai.xi               (int)pDMSResPri->stDrvDMS.stOutputWinInfo[u32Window].stCropWin.u32height);
1364*53ee8cc1Swenshuai.xi     }
1365*53ee8cc1Swenshuai.xi 
1366*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWindowInfoReady[u32Window] = TRUE;
1367*53ee8cc1Swenshuai.xi 
1368*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWinChanged[u32Window] = TRUE;
1369*53ee8cc1Swenshuai.xi 
1370*53ee8cc1Swenshuai.xi     return TRUE;
1371*53ee8cc1Swenshuai.xi }
1372*53ee8cc1Swenshuai.xi 
_MDrv_DMS_Final(void * pInstance,MS_U32 u32Window)1373*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMS_Final(void* pInstance, MS_U32 u32Window)
1374*53ee8cc1Swenshuai.xi {
1375*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1376*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi 
1379*53ee8cc1Swenshuai.xi     if (u32Window >= DMS_MAX_WINDOW_NUM) {
1380*53ee8cc1Swenshuai.xi         return FALSE;
1381*53ee8cc1Swenshuai.xi     }
1382*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWindowInfoReady[u32Window] = FALSE;
1383*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWinUsed[u32Window] = FALSE;
1384*53ee8cc1Swenshuai.xi     // clear drv control
1385*53ee8cc1Swenshuai.xi     memset(&gDMSCtrl[u32Window], 0, sizeof(DMS_DRV_CTRL));
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi     if (u32Window)
1388*53ee8cc1Swenshuai.xi         MDrv_MVOP_SubEnableInterrupt(0);
1389*53ee8cc1Swenshuai.xi     else
1390*53ee8cc1Swenshuai.xi         MDrv_MVOP_EnableInterrupt(0);
1391*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(u32Window ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC);
1392*53ee8cc1Swenshuai.xi     MsOS_DetachInterrupt(u32Window ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC);
1393*53ee8cc1Swenshuai.xi 
1394*53ee8cc1Swenshuai.xi     return TRUE;
1395*53ee8cc1Swenshuai.xi }
1396*53ee8cc1Swenshuai.xi 
MDrv_DMS_Init(void * pInstance,ST_DMS_INITDATA * pstDMS_InitData)1397*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Init(void* pInstance, ST_DMS_INITDATA *pstDMS_InitData)
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1400*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1401*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Init(pInstance);
1402*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1403*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
1404*53ee8cc1Swenshuai.xi }
1405*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetMemoryType(void * pInstance,ST_DMS_SET_MEMORY_TYPE * pstDMS_SetMemType)1406*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetMemoryType(void* pInstance, ST_DMS_SET_MEMORY_TYPE* pstDMS_SetMemType)
1407*53ee8cc1Swenshuai.xi {
1408*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1409*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1410*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1411*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1412*53ee8cc1Swenshuai.xi     DMS_PRINTF("MDrv_DMS_SetMemoryType\n");
1413*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Setup_Memory(pstDMS_SetMemType->eMemoryType, pstDMS_SetMemType->phyAddr,pstDMS_SetMemType->phySize);
1414*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1415*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
1416*53ee8cc1Swenshuai.xi }
1417*53ee8cc1Swenshuai.xi 
MDrv_DMS_CreateWindow(void * pInstance,ST_DMS_WINDOW * pstOutputWin,ST_DMS_CREATE_WIN_INFO * pstCreateWin_Info,MS_U32 * pu32WindowID)1418*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_CreateWindow(void* pInstance, ST_DMS_WINDOW *pstOutputWin, ST_DMS_CREATE_WIN_INFO *pstCreateWin_Info, MS_U32 *pu32WindowID)
1419*53ee8cc1Swenshuai.xi {
1420*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1421*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1422*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1423*53ee8cc1Swenshuai.xi 
1424*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1425*53ee8cc1Swenshuai.xi 
1426*53ee8cc1Swenshuai.xi     if (*pu32WindowID >= DMS_MAX_WINDOW_NUM) {
1427*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s %d] u32WindowID %d exceed limit\n", __FUNCTION__, __LINE__, (int)*pu32WindowID);
1428*53ee8cc1Swenshuai.xi     }
1429*53ee8cc1Swenshuai.xi 
1430*53ee8cc1Swenshuai.xi #if 1
1431*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWinUsed[*pu32WindowID] = TRUE;
1432*53ee8cc1Swenshuai.xi #else
1433*53ee8cc1Swenshuai.xi     pDMSResPri->stDrvDMS.bWinUsed[*pu32WindowID] = TRUE;
1434*53ee8cc1Swenshuai.xi 
1435*53ee8cc1Swenshuai.xi     _DRV_DMS_MutexCreate(*pu32WindowID);
1436*53ee8cc1Swenshuai.xi     // create monitor thread
1437*53ee8cc1Swenshuai.xi     _MDrv_DMS_CreateTask(*pu32WindowID);
1438*53ee8cc1Swenshuai.xi #endif
1439*53ee8cc1Swenshuai.xi 
1440*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1441*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
1442*53ee8cc1Swenshuai.xi }
1443*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetDigitalDecodeSignalInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)1444*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetDigitalDecodeSignalInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_DISPFRAMEFORMAT *pstDispFrameFormat)
1445*53ee8cc1Swenshuai.xi {
1446*53ee8cc1Swenshuai.xi     DMS_PRINTF("[%s %d] u32WindowID = %d\n", __FUNCTION__, __LINE__, (int)u32WindowID);
1447*53ee8cc1Swenshuai.xi 
1448*53ee8cc1Swenshuai.xi     if (u32WindowID >= DMS_MAX_WINDOW_NUM) {
1449*53ee8cc1Swenshuai.xi         DMS_PRINTF("[%s %d] u32WindowID %d exceed limit\n", __FUNCTION__, __LINE__, (int)u32WindowID);
1450*53ee8cc1Swenshuai.xi         return E_DMS_WINID_ILLEGAL;
1451*53ee8cc1Swenshuai.xi     }
1452*53ee8cc1Swenshuai.xi 
1453*53ee8cc1Swenshuai.xi     if (pstDispFrameFormat) {
1454*53ee8cc1Swenshuai.xi         DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1455*53ee8cc1Swenshuai.xi         UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1456*53ee8cc1Swenshuai.xi 
1457*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
1458*53ee8cc1Swenshuai.xi         MS_PHY phyVsyncbridgeAddr, phyVsyncbridgeExtAddr;
1459*53ee8cc1Swenshuai.xi 
1460*53ee8cc1Swenshuai.xi         VdecStreamId.u32Version = pstDispFrameFormat->u32VdecStreamVersion;
1461*53ee8cc1Swenshuai.xi         VdecStreamId.u32Id = pstDispFrameFormat->u32VdecStreamId;
1462*53ee8cc1Swenshuai.xi 
1463*53ee8cc1Swenshuai.xi         if (E_VDEC_EX_OK == MApi_VDEC_EX_GetControl(&VdecStreamId, E_VDEC_EX_USER_CMD_GET_VSYNC_BRIDGE_ADDR, (MS_U32 *)&phyVsyncbridgeAddr)) {
1464*53ee8cc1Swenshuai.xi             DMS_PRINTF("phyVsyncbridgeAddr = 0x%x\n", (unsigned int)phyVsyncbridgeAddr);
1465*53ee8cc1Swenshuai.xi         } else {
1466*53ee8cc1Swenshuai.xi             DMS_PRINTF("E_VDEC_EX_USER_CMD_GET_VSYNC_BRIDGE_ADDR FAIL!!!\n");
1467*53ee8cc1Swenshuai.xi         }
1468*53ee8cc1Swenshuai.xi 
1469*53ee8cc1Swenshuai.xi         if (E_VDEC_EX_OK == MApi_VDEC_EX_GetControl(&VdecStreamId, E_VDEC_EX_USER_CMD_GET_VSYNC_BRIDGE_EXT_ADDR, (MS_U32 *)&phyVsyncbridgeExtAddr)) {
1470*53ee8cc1Swenshuai.xi             DMS_PRINTF("phyVsyncbridgeExtAddr = 0x%x\n", (unsigned int)phyVsyncbridgeExtAddr);
1471*53ee8cc1Swenshuai.xi         } else {
1472*53ee8cc1Swenshuai.xi             DMS_PRINTF("E_VDEC_EX_USER_CMD_GET_VSYNC_BRIDGE_EXT_ADDR FAIL!!!\n");
1473*53ee8cc1Swenshuai.xi         }
1474*53ee8cc1Swenshuai.xi 
1475*53ee8cc1Swenshuai.xi         // clear drv control
1476*53ee8cc1Swenshuai.xi         memset(&gDMSCtrl[u32WindowID], 0, sizeof(DMS_DRV_CTRL));
1477*53ee8cc1Swenshuai.xi 
1478*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.bWinUsed[u32WindowID] = TRUE;
1479*53ee8cc1Swenshuai.xi 
1480*53ee8cc1Swenshuai.xi #if 1
1481*53ee8cc1Swenshuai.xi         _DRV_DMS_MutexCreate(u32WindowID);
1482*53ee8cc1Swenshuai.xi         // create monitor thread
1483*53ee8cc1Swenshuai.xi         _MDrv_DMS_CreateTask(u32WindowID);
1484*53ee8cc1Swenshuai.xi #endif
1485*53ee8cc1Swenshuai.xi 
1486*53ee8cc1Swenshuai.xi         MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1487*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.phyVsyncbridgeAddr[u32WindowID] = phyVsyncbridgeAddr;
1488*53ee8cc1Swenshuai.xi         pDMSResPri->stDrvDMS.phyVsyncbridgeExtAddr[u32WindowID] = phyVsyncbridgeExtAddr;
1489*53ee8cc1Swenshuai.xi 
1490*53ee8cc1Swenshuai.xi 
1491*53ee8cc1Swenshuai.xi         int u8BufID;
1492*53ee8cc1Swenshuai.xi         for(u8BufID = 0; u8BufID < DMS_DIP_QUEUEDEPTH; u8BufID++)
1493*53ee8cc1Swenshuai.xi         {
1494*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32WindowID][u8BufID] = 0;
1495*53ee8cc1Swenshuai.xi         }
1496*53ee8cc1Swenshuai.xi 
1497*53ee8cc1Swenshuai.xi         MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1498*53ee8cc1Swenshuai.xi 
1499*53ee8cc1Swenshuai.xi         VDEC_EX_DynmcDispPath stDynmcDispPath;
1500*53ee8cc1Swenshuai.xi         stDynmcDispPath.bConnect = TRUE;
1501*53ee8cc1Swenshuai.xi         stDynmcDispPath.eMvopPath = u32WindowID ? E_VDEC_EX_DISPLAY_PATH_MVOP_SUB : E_VDEC_EX_DISPLAY_PATH_MVOP_MAIN;
1502*53ee8cc1Swenshuai.xi 
1503*53ee8cc1Swenshuai.xi         MApi_VDEC_EX_SetControl((VDEC_StreamId *)&VdecStreamId, E_VDEC_EX_USER_CMD_SET_DYNAMIC_DISP_PATH, (MS_U32)&stDynmcDispPath);
1504*53ee8cc1Swenshuai.xi 
1505*53ee8cc1Swenshuai.xi #ifdef DMS_ENABLE_MVOP_INT
1506*53ee8cc1Swenshuai.xi         DMS_PRINTF("Attach and enable MVOP interrupt E_INT_IRQ_DC = %d\n", E_INT_IRQ_DC);
1507*53ee8cc1Swenshuai.xi         MsOS_DisableInterrupt(u32WindowID ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC);
1508*53ee8cc1Swenshuai.xi         if (u32WindowID) {
1509*53ee8cc1Swenshuai.xi             MDrv_MVOP_SubEnableInterrupt(0);
1510*53ee8cc1Swenshuai.xi         } else {
1511*53ee8cc1Swenshuai.xi             MDrv_MVOP_EnableInterrupt(0);
1512*53ee8cc1Swenshuai.xi         }
1513*53ee8cc1Swenshuai.xi         MsOS_AttachInterrupt(u32WindowID ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC, _DMS_MVOP_ISR);
1514*53ee8cc1Swenshuai.xi         MsOS_EnableInterrupt(u32WindowID ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC);
1515*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
1516*53ee8cc1Swenshuai.xi         MsOS_CompleteInterrupt(u32WindowID ? E_INT_IRQ_DCSUB : E_INT_IRQ_DC);
1517*53ee8cc1Swenshuai.xi #endif
1518*53ee8cc1Swenshuai.xi 
1519*53ee8cc1Swenshuai.xi         if (u32WindowID) {
1520*53ee8cc1Swenshuai.xi             MDrv_MVOP_SubEnableInterrupt(E_MVOP_INT_VSYNC);
1521*53ee8cc1Swenshuai.xi         } else {
1522*53ee8cc1Swenshuai.xi             MDrv_MVOP_EnableInterrupt(E_MVOP_INT_VSYNC);
1523*53ee8cc1Swenshuai.xi         }
1524*53ee8cc1Swenshuai.xi #endif
1525*53ee8cc1Swenshuai.xi     }
1526*53ee8cc1Swenshuai.xi 
1527*53ee8cc1Swenshuai.xi     return E_DMS_OK;
1528*53ee8cc1Swenshuai.xi }
1529*53ee8cc1Swenshuai.xi 
MDrv_DMS_ClearDigitalDecodeSignalInfo(void * pInstance,MS_U32 u32WindowID)1530*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_ClearDigitalDecodeSignalInfo(void* pInstance, MS_U32 u32WindowID)
1531*53ee8cc1Swenshuai.xi {
1532*53ee8cc1Swenshuai.xi     //DMS_PRINTF("\033[32m [%s][%d] === Not Impl %d=== \033[0m\n",__FUNCTION__,__LINE__, (int)u32WindowID);
1533*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1534*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1535*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Final(pInstance, u32WindowID);
1536*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1537*53ee8cc1Swenshuai.xi     return E_DMS_OK;
1538*53ee8cc1Swenshuai.xi }
1539*53ee8cc1Swenshuai.xi 
MDrv_DMS_DestroyWindow(void * pInstance,MS_U32 u32WindowID)1540*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_DestroyWindow(void* pInstance, MS_U32 u32WindowID)
1541*53ee8cc1Swenshuai.xi {
1542*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1543*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1544*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_Final(pInstance, u32WindowID);
1545*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1546*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetWindow(void * pInstance,MS_U32 u32WindowID,ST_DMS_SETWIN_INFO * pstDMS_SetWin_Info)1549*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetWindow(void* pInstance, MS_U32 u32WindowID, ST_DMS_SETWIN_INFO *pstDMS_SetWin_Info)
1550*53ee8cc1Swenshuai.xi {
1551*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1552*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1553*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMS_SetWin(pInstance, u32WindowID, pstDMS_SetWin_Info);
1554*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1555*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
1556*53ee8cc1Swenshuai.xi }
1557*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetWindowInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_WINDOW_INFO * pstDMS_GetWin_Info)1558*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetWindowInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_WINDOW_INFO *pstDMS_GetWin_Info)
1559*53ee8cc1Swenshuai.xi {
1560*53ee8cc1Swenshuai.xi     return E_DMS_OK;
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi 
_DMS_GetDMSScanType(MS_U8 u8ScanType)1563*53ee8cc1Swenshuai.xi E_DMS_VIDEO_SCAN_TYPE _DMS_GetDMSScanType(MS_U8 u8ScanType)
1564*53ee8cc1Swenshuai.xi {
1565*53ee8cc1Swenshuai.xi     // ProgressiveFrame = 0,   /** Picture is a progressive frame */
1566*53ee8cc1Swenshuai.xi     // InterlacedFrame  = 2,    /** Picture is an interlaced frame */
1567*53ee8cc1Swenshuai.xi     // InterlacedField  = 3,      /** Picture is two interlaced fields */
1568*53ee8cc1Swenshuai.xi     // InterlacedField  = 1,      MVD bring 1 to push interlace frame
1569*53ee8cc1Swenshuai.xi     E_DMS_VIDEO_SCAN_TYPE eScanType = E_DMS_VIDEO_SCAN_TYPE_MAX;
1570*53ee8cc1Swenshuai.xi     switch (u8ScanType)
1571*53ee8cc1Swenshuai.xi     {
1572*53ee8cc1Swenshuai.xi         case 0:
1573*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_PROGRESSIVE;
1574*53ee8cc1Swenshuai.xi             break;
1575*53ee8cc1Swenshuai.xi         case 1:
1576*53ee8cc1Swenshuai.xi         case 2:
1577*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FRAME;
1578*53ee8cc1Swenshuai.xi             break;
1579*53ee8cc1Swenshuai.xi         case 3:
1580*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_INTERLACE_FIELD;
1581*53ee8cc1Swenshuai.xi             break;
1582*53ee8cc1Swenshuai.xi         default:
1583*53ee8cc1Swenshuai.xi             eScanType = E_DMS_VIDEO_SCAN_TYPE_MAX;
1584*53ee8cc1Swenshuai.xi             break;
1585*53ee8cc1Swenshuai.xi     }
1586*53ee8cc1Swenshuai.xi     return eScanType;
1587*53ee8cc1Swenshuai.xi }
1588*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Flip(void * pInstance,MS_U32 u32WindowID,ST_DMS_DISPFRAMEFORMAT * pstDispFrameFormat)1589*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Flip(void* pInstance, MS_U32 u32WindowID, ST_DMS_DISPFRAMEFORMAT* pstDispFrameFormat)
1590*53ee8cc1Swenshuai.xi {
1591*53ee8cc1Swenshuai.xi     EN_DMS_RESULT eResult = E_DMS_FAIL;
1592*53ee8cc1Swenshuai.xi 
1593*53ee8cc1Swenshuai.xi     MCU_DISPQ_INFO *pSHM = 0;
1594*53ee8cc1Swenshuai.xi     if (pstDispFrameFormat->u32OverlayID < 2) {
1595*53ee8cc1Swenshuai.xi         pSHM = (MCU_DISPQ_INFO *)MsOS_PA2KSEG1(pstDispFrameFormat->phyVsyncBridgeAddr +
1596*53ee8cc1Swenshuai.xi             ((MS_U32)pstDispFrameFormat->u32OverlayID * sizeof(MCU_DISPQ_INFO)));
1597*53ee8cc1Swenshuai.xi     } else {
1598*53ee8cc1Swenshuai.xi         pSHM = (MCU_DISPQ_INFO *)MsOS_PA2KSEG1(pstDispFrameFormat->phyVsyncBridgeAddr);
1599*53ee8cc1Swenshuai.xi     }
1600*53ee8cc1Swenshuai.xi 
1601*53ee8cc1Swenshuai.xi     MS_U32 lumaAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr;
1602*53ee8cc1Swenshuai.xi     MS_U32 chromAddr = pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr;
1603*53ee8cc1Swenshuai.xi     MS_U32 lumaAddr2 = pstDispFrameFormat->stFrames[1].stHWFormat.phyLumaAddr;
1604*53ee8cc1Swenshuai.xi     MS_U32 chromAddr2 = pstDispFrameFormat->stFrames[1].stHWFormat.phyChromaAddr;
1605*53ee8cc1Swenshuai.xi     MS_U16 u16Width = pstDispFrameFormat->stFrames[0].u32Width
1606*53ee8cc1Swenshuai.xi                       - pstDispFrameFormat->stFrames[0].u32CropLeft
1607*53ee8cc1Swenshuai.xi                       - pstDispFrameFormat->stFrames[0].u32CropRight;
1608*53ee8cc1Swenshuai.xi     MS_U16 u16Height = pstDispFrameFormat->stFrames[0].u32Height
1609*53ee8cc1Swenshuai.xi                        - pstDispFrameFormat->stFrames[0].u32CropTop
1610*53ee8cc1Swenshuai.xi                        - pstDispFrameFormat->stFrames[0].u32CropBottom;
1611*53ee8cc1Swenshuai.xi 
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi     if (u32WindowID >= DMS_MAX_WINDOW_NUM) {
1614*53ee8cc1Swenshuai.xi         DMS_PRINTF("u32WindowID = %d exceed limit\n", (int)u32WindowID);
1615*53ee8cc1Swenshuai.xi         return E_DMS_WINSIZE_ERROR;
1616*53ee8cc1Swenshuai.xi     }
1617*53ee8cc1Swenshuai.xi 
1618*53ee8cc1Swenshuai.xi     if (pstDispFrameFormat->u8MCUMode) {
1619*53ee8cc1Swenshuai.xi         if (bMsLogON) {
1620*53ee8cc1Swenshuai.xi             DMS_PRINTF("MCU render_frame [%d] pts = %lld, luma=0x%x, chroma=0x%x, B_F = %d, Time = %d, Interlace = %d, Frc = %d\n",
1621*53ee8cc1Swenshuai.xi                   (int)pstDispFrameFormat->u32OverlayID, pstDispFrameFormat->u64Pts,
1622*53ee8cc1Swenshuai.xi                   (unsigned int)lumaAddr, (unsigned int)chromAddr, pstDispFrameFormat->u8BottomFieldFirst,
1623*53ee8cc1Swenshuai.xi                   pstDispFrameFormat->u8ToggleTime, pstDispFrameFormat->u8Interlace, pstDispFrameFormat->u8FrcMode);
1624*53ee8cc1Swenshuai.xi         }
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi         if (u32WindowID == 0) {
1627*53ee8cc1Swenshuai.xi             MDrv_MVOP_SetBaseAdd(lumaAddr, chromAddr, 1, 0);
1628*53ee8cc1Swenshuai.xi         } else {
1629*53ee8cc1Swenshuai.xi             MDrv_MVOP_SubSetBaseAdd(lumaAddr, chromAddr, 1, 0);
1630*53ee8cc1Swenshuai.xi         }
1631*53ee8cc1Swenshuai.xi         return eResult;
1632*53ee8cc1Swenshuai.xi     }
1633*53ee8cc1Swenshuai.xi 
1634*53ee8cc1Swenshuai.xi     if (pSHM) {
1635*53ee8cc1Swenshuai.xi 
1636*53ee8cc1Swenshuai.xi         MS_U8 u8WIndex = pSHM->u8McuDispQWPtr;
1637*53ee8cc1Swenshuai.xi         MS_U32 u32Cnt = 10;
1638*53ee8cc1Swenshuai.xi 
1639*53ee8cc1Swenshuai.xi         _DRV_DMS_Entry(u32WindowID);
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi #if 1 //def DYNAMIC_DISP_PATH    // TODO
1642*53ee8cc1Swenshuai.xi         VDEC_EX_DynmcDispPath stDynmcDispPath;
1643*53ee8cc1Swenshuai.xi         VDEC_StreamId VdecStreamId;
1644*53ee8cc1Swenshuai.xi 
1645*53ee8cc1Swenshuai.xi         if (u32WindowID == 0) {
1646*53ee8cc1Swenshuai.xi             if (gDMSCtrl[u32WindowID].lastdff.u32OverlayID != pstDispFrameFormat->u32OverlayID) {
1647*53ee8cc1Swenshuai.xi                 if (gDMSCtrl[u32WindowID].CodecType != pstDispFrameFormat->u32CodecType) {
1648*53ee8cc1Swenshuai.xi                     //bVideoMute = TRUE;
1649*53ee8cc1Swenshuai.xi                     //Wrapper_Video_setMute(Overlay_ID, 1);
1650*53ee8cc1Swenshuai.xi                     // will seq_change latter
1651*53ee8cc1Swenshuai.xi                 }
1652*53ee8cc1Swenshuai.xi                 VdecStreamId.u32Version = gDMSCtrl[u32WindowID].lastdff.u32VdecStreamVersion;
1653*53ee8cc1Swenshuai.xi                 VdecStreamId.u32Id = gDMSCtrl[u32WindowID].lastdff.u32VdecStreamId;
1654*53ee8cc1Swenshuai.xi                 stDynmcDispPath.bConnect = FALSE;
1655*53ee8cc1Swenshuai.xi                 stDynmcDispPath.eMvopPath = E_VDEC_EX_DISPLAY_PATH_MVOP_MAIN;
1656*53ee8cc1Swenshuai.xi                 MApi_VDEC_EX_SetControl((VDEC_StreamId *)&VdecStreamId, E_VDEC_EX_USER_CMD_SET_DYNAMIC_DISP_PATH,(MS_U32)&stDynmcDispPath);
1657*53ee8cc1Swenshuai.xi 
1658*53ee8cc1Swenshuai.xi                 VdecStreamId.u32Version = pstDispFrameFormat->u32VdecStreamVersion;
1659*53ee8cc1Swenshuai.xi                 VdecStreamId.u32Id = pstDispFrameFormat->u32VdecStreamId;
1660*53ee8cc1Swenshuai.xi                 stDynmcDispPath.bConnect = TRUE;
1661*53ee8cc1Swenshuai.xi                 MApi_VDEC_EX_SetControl((VDEC_StreamId *)&VdecStreamId, E_VDEC_EX_USER_CMD_SET_DYNAMIC_DISP_PATH, (MS_U32)&stDynmcDispPath);
1662*53ee8cc1Swenshuai.xi                 //bStreamChange = TRUE;
1663*53ee8cc1Swenshuai.xi             }
1664*53ee8cc1Swenshuai.xi         }
1665*53ee8cc1Swenshuai.xi #endif
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi         if (pSHM->u8McuDispSwitch == 0) {
1668*53ee8cc1Swenshuai.xi             // fill ctrl flags
1669*53ee8cc1Swenshuai.xi 
1670*53ee8cc1Swenshuai.xi             DMS_PRINTF("VSYNC_BRIDGE_INIT clear dispQ\n");
1671*53ee8cc1Swenshuai.xi             memset(pSHM, 0, sizeof(MCU_DISPQ_INFO));
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi             u8WIndex = DISPQ_FIRST_R_INDEX - 1;
1674*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u16SrcWidth = pstDispFrameFormat->stFrames[0].u32Width;
1675*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u16SrcHeight = pstDispFrameFormat->stFrames[0].u32Height;
1676*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u16FrameRate = (MS_U16)pstDispFrameFormat->u32FrameRate;
1677*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].CodecType = pstDispFrameFormat->u32CodecType;
1678*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8Interlace = pstDispFrameFormat->u8Interlace;
1679*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u32AspectWidth = pstDispFrameFormat->u32AspectWidth;
1680*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u32AspectHeight = pstDispFrameFormat->u32AspectHeight;
1681*53ee8cc1Swenshuai.xi 
1682*53ee8cc1Swenshuai.xi             pSHM->u2MirrorMode =  gDMSCtrl[u32WindowID].u8MirrorMode;
1683*53ee8cc1Swenshuai.xi 
1684*53ee8cc1Swenshuai.xi #if ENABLE_FRAME_CONVERT
1685*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8UpdateFrcMode = 1;
1686*53ee8cc1Swenshuai.xi #endif
1687*53ee8cc1Swenshuai.xi         }
1688*53ee8cc1Swenshuai.xi 
1689*53ee8cc1Swenshuai.xi         if (gDMSCtrl[u32WindowID].u16FrameRate != (MS_U16)pstDispFrameFormat->u32FrameRate) {
1690*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8UpdateFrcMode = 1;
1691*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u16FrameRate = pstDispFrameFormat->u32FrameRate;
1692*53ee8cc1Swenshuai.xi         }
1693*53ee8cc1Swenshuai.xi 
1694*53ee8cc1Swenshuai.xi #if ENABLE_FRAME_CONVERT
1695*53ee8cc1Swenshuai.xi         if (gDMSCtrl[u32WindowID].u8UpdateFrcMode) {
1696*53ee8cc1Swenshuai.xi             _DMS_Update_SW_FRC_Mode(u32WindowID, pstDispFrameFormat);
1697*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8UpdateFrcMode = 0;
1698*53ee8cc1Swenshuai.xi         }
1699*53ee8cc1Swenshuai.xi #endif
1700*53ee8cc1Swenshuai.xi 
1701*53ee8cc1Swenshuai.xi         if (bMsLogON)
1702*53ee8cc1Swenshuai.xi             DMS_PRINTF("dms render_frame [%d] pts = %lld, luma=0x%x, chroma=0x%x, Interlace = %d, B_F = %d, TG = %d, Last_TG = %d\n",
1703*53ee8cc1Swenshuai.xi                   (int)pstDispFrameFormat->u32OverlayID, pstDispFrameFormat->u64Pts,
1704*53ee8cc1Swenshuai.xi                   (unsigned int)lumaAddr, (unsigned int)chromAddr, pstDispFrameFormat->u8Interlace,
1705*53ee8cc1Swenshuai.xi                   pstDispFrameFormat->u8BottomFieldFirst, pstDispFrameFormat->u8ToggleTime,
1706*53ee8cc1Swenshuai.xi                   pSHM->McuDispQueue[pSHM->u8McuDispQWPtr].u8Tog_Time);
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi         DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1709*53ee8cc1Swenshuai.xi         UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1710*53ee8cc1Swenshuai.xi         while (pDMSResPri->stDrvDMS._stXC_LocalFrameRefCount[u32WindowID][((u8WIndex + 1) % MAX_VSYNC_BRIDGE_DISPQ_NUM)]
1711*53ee8cc1Swenshuai.xi             && u32Cnt--) {
1712*53ee8cc1Swenshuai.xi         //while ((((u8WIndex + 1) % MAX_VSYNC_BRIDGE_DISPQ_NUM) == pSHM->u8McuDispQRPtr) && u32Cnt--) {
1713*53ee8cc1Swenshuai.xi             _DRV_DMS_Release(u32WindowID);
1714*53ee8cc1Swenshuai.xi             #if 0
1715*53ee8cc1Swenshuai.xi             return E_DMS_OK;
1716*53ee8cc1Swenshuai.xi             #else
1717*53ee8cc1Swenshuai.xi             if (bMsLogON)
1718*53ee8cc1Swenshuai.xi             DMS_PRINTF("DMS Display Queue Full !! Waiting... [u32SHMAddr = 0x%x]\n", (int)pstDispFrameFormat->phyVsyncBridgeAddr);
1719*53ee8cc1Swenshuai.xi             _DMS_Wait_MVOP_Vsync(u32WindowID, pstDispFrameFormat);
1720*53ee8cc1Swenshuai.xi             _DRV_DMS_Entry(u32WindowID);
1721*53ee8cc1Swenshuai.xi             #endif
1722*53ee8cc1Swenshuai.xi         }
1723*53ee8cc1Swenshuai.xi 
1724*53ee8cc1Swenshuai.xi         u8WIndex = (u8WIndex + 1)%MAX_VSYNC_BRIDGE_DISPQ_NUM;
1725*53ee8cc1Swenshuai.xi 
1726*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u32LumaAddr0 = lumaAddr;
1727*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u32ChromaAddr0 = chromAddr;
1728*53ee8cc1Swenshuai.xi 
1729*53ee8cc1Swenshuai.xi 
1730*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_MVC) {
1731*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u16Width = (u16Width + 1) & ~1;
1732*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u16Height = u16Height;
1733*53ee8cc1Swenshuai.xi         } else {
1734*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u16Width = (pstDispFrameFormat->stFrames[0].u32Width + 1) & ~1;
1735*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u16Height = pstDispFrameFormat->stFrames[0].u32Height;
1736*53ee8cc1Swenshuai.xi         }
1737*53ee8cc1Swenshuai.xi 
1738*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u16Pitch = pstDispFrameFormat->stFrames[0].stHWFormat.u32LumaPitch;
1739*53ee8cc1Swenshuai.xi         //pSHM->McuDispQueue[u8WIndex].u32CodecType = pstDispFrameFormat->u32CodecType;
1740*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u8Interlace = pstDispFrameFormat->u8Interlace;
1741*53ee8cc1Swenshuai.xi 
1742*53ee8cc1Swenshuai.xi         if (gDMSCtrl[u32WindowID].u8FieldCtrl != pstDispFrameFormat->u8FieldCtrl) {
1743*53ee8cc1Swenshuai.xi             if (u32WindowID) {
1744*53ee8cc1Swenshuai.xi                 // FIXME: wait MVOP implement sub API
1745*53ee8cc1Swenshuai.xi                 //MDrv_MVOP_SubSEL_OP_FIELD(TRUE);
1746*53ee8cc1Swenshuai.xi             } else {
1747*53ee8cc1Swenshuai.xi                 DMS_PRINTF("MDrv_MVOP_SEL_OP_FIELD = 0x%d\n", (pstDispFrameFormat->u8FieldCtrl ? TRUE : FALSE));
1748*53ee8cc1Swenshuai.xi                 MDrv_MVOP_SEL_OP_FIELD(pstDispFrameFormat->u8FieldCtrl ? TRUE : FALSE);
1749*53ee8cc1Swenshuai.xi             }
1750*53ee8cc1Swenshuai.xi             // enable BOB mode to prevent FF/RF playback De-interlace garbage.
1751*53ee8cc1Swenshuai.xi             DMS_PRINTF("MApi_XC_SetBOBMode = %d\n", (pstDispFrameFormat->u8FieldCtrl ? TRUE : FALSE));
1752*53ee8cc1Swenshuai.xi             MApi_XC_SetBOBMode(pstDispFrameFormat->u8FieldCtrl ? TRUE : FALSE, u32WindowID);
1753*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8FieldCtrl = pstDispFrameFormat->u8FieldCtrl;
1754*53ee8cc1Swenshuai.xi         }
1755*53ee8cc1Swenshuai.xi 
1756*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u8FieldCtrl = pstDispFrameFormat->u8FieldCtrl;
1757*53ee8cc1Swenshuai.xi 
1758*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->enColorFormat == E_DMS_COLOR_FORMAT_YUYV) {
1759*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8ColorFormat = 1; //422
1760*53ee8cc1Swenshuai.xi         } else if (pstDispFrameFormat->enColorFormat == E_DMS_COLOR_FORMAT_10BIT_TILE) {
1761*53ee8cc1Swenshuai.xi 
1762*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8ColorFormat = 2; //420 10 bits
1763*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u16Pitch1 = pstDispFrameFormat->stFrames[0].stHWFormat.u32LumaPitch2Bit;
1764*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8RangeMapY = pstDispFrameFormat->stFrames[0].u8LumaBitdepth;
1765*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8RangeMapUV = pstDispFrameFormat->stFrames[0].u8ChromaBitdepth;
1766*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u32LumaAddr1 = pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr2Bit;
1767*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u32ChromaAddr1 = pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr2Bit;
1768*53ee8cc1Swenshuai.xi         } else {
1769*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8ColorFormat = 0; //420
1770*53ee8cc1Swenshuai.xi         }
1771*53ee8cc1Swenshuai.xi 
1772*53ee8cc1Swenshuai.xi         //if (u8Interlace[Overlay_ID] != dff->u8Interlace) {
1773*53ee8cc1Swenshuai.xi         //    DMS_PRINTF("WARNING [%d] pts = %lld, luma=0x%x, chroma=0x%x, BoT_First = %d, TogTime = %d, Interlace = %d",
1774*53ee8cc1Swenshuai.xi         //          dff->OverlayID, dff->u64Pts, (unsigned int)lumaAddr, (unsigned int)chromAddr, dff->u8BottomFieldFirst,
1775*53ee8cc1Swenshuai.xi         //          dff->u8ToggleTime, dff->u8Interlace);
1776*53ee8cc1Swenshuai.xi         //}
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_VC1_ADV
1779*53ee8cc1Swenshuai.xi             || pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_VC1_MAIN) {
1780*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8RangeMapY = pstDispFrameFormat->stFrames[0].u8LumaBitdepth;
1781*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8RangeMapUV = pstDispFrameFormat->stFrames[0].u8ChromaBitdepth;
1782*53ee8cc1Swenshuai.xi         }
1783*53ee8cc1Swenshuai.xi 
1784*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->u32CodecType == E_DMS_CODEC_TYPE_MVC) {
1785*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8FrameNum = 2;
1786*53ee8cc1Swenshuai.xi             if ((gDMSCtrl[u32WindowID].u8MirrorMode == (MS_U8)E_VOPMIRROR_HVBOTH) && (pstDispFrameFormat->u83DMode == E_DMS_3DMODE_SIDEBYSIDE)) {
1787*53ee8cc1Swenshuai.xi                 // MVOP mirror and MVC side by side, swap L R
1788*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32LumaAddr0 = lumaAddr2;
1789*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32ChromaAddr0 = chromAddr2;
1790*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32LumaAddr1 = lumaAddr;
1791*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32ChromaAddr1 = chromAddr;
1792*53ee8cc1Swenshuai.xi             } else {
1793*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32LumaAddr1 = lumaAddr2;
1794*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u32ChromaAddr1 = chromAddr2;
1795*53ee8cc1Swenshuai.xi             }
1796*53ee8cc1Swenshuai.xi         }
1797*53ee8cc1Swenshuai.xi 
1798*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->u8ToggleTime == 0) {
1799*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8TB_toggle = 0;
1800*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8Tog_Time = 1;
1801*53ee8cc1Swenshuai.xi 
1802*53ee8cc1Swenshuai.xi         } else if (pstDispFrameFormat->u8Interlace) {   //interlace
1803*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8TB_toggle = pstDispFrameFormat->u8BottomFieldFirst ? 1 : 0;    //0, TOP then BOTTOM, 1 BOT then TOP
1804*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8Tog_Time = pstDispFrameFormat->u8ToggleTime;
1805*53ee8cc1Swenshuai.xi 
1806*53ee8cc1Swenshuai.xi             if ((pstDispFrameFormat->u8ToggleTime == 1)
1807*53ee8cc1Swenshuai.xi                 && (pstDispFrameFormat->stFrames[0].enFieldType == E_DMS_FIELD_TYPE_BOTH)) {
1808*53ee8cc1Swenshuai.xi                 // prevent de-interlace wrong...
1809*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u8Tog_Time = 2;
1810*53ee8cc1Swenshuai.xi             }
1811*53ee8cc1Swenshuai.xi         } else {
1812*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u8TB_toggle = 0;
1813*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u8Tog_Time = 1;
1814*53ee8cc1Swenshuai.xi         }
1815*53ee8cc1Swenshuai.xi 
1816*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u1BottomFieldFirst = pstDispFrameFormat->u8BottomFieldFirst;
1817*53ee8cc1Swenshuai.xi 
1818*53ee8cc1Swenshuai.xi         MS_PHY phyTemp;
1819*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(pSHM->McuDispQueue[u8WIndex].u2Luma0Miu, phyTemp, pstDispFrameFormat->stFrames[0].stHWFormat.phyLumaAddr);
1820*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(pSHM->McuDispQueue[u8WIndex].u2Chroma0Miu, phyTemp, pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr);
1821*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(pSHM->McuDispQueue[u8WIndex].u2Luma1Miu, phyTemp, pstDispFrameFormat->stFrames[1].stHWFormat.phyLumaAddr);
1822*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(pSHM->McuDispQueue[u8WIndex].u2Chroma1Miu, phyTemp, pstDispFrameFormat->stFrames[0].stHWFormat.phyChromaAddr);
1823*53ee8cc1Swenshuai.xi 
1824*53ee8cc1Swenshuai.xi #if ENABLE_FRAME_CONVERT
1825*53ee8cc1Swenshuai.xi         pSHM->u5FRCMode = gDMSCtrl[u32WindowID].u8FrcMode;
1826*53ee8cc1Swenshuai.xi #endif
1827*53ee8cc1Swenshuai.xi 
1828*53ee8cc1Swenshuai.xi         // TODO: implement force P
1829*53ee8cc1Swenshuai.xi         //....
1830*53ee8cc1Swenshuai.xi 
1831*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat->phyVsyncBridgeExtAddr) {
1832*53ee8cc1Swenshuai.xi             // has vsync_bridge EXT addr
1833*53ee8cc1Swenshuai.xi             MCU_DISPQ_INFO_EXT *pDispQ_Ext = 0;//kk
1834*53ee8cc1Swenshuai.xi 
1835*53ee8cc1Swenshuai.xi             if (pstDispFrameFormat->u32OverlayID < 2) {
1836*53ee8cc1Swenshuai.xi                 pDispQ_Ext = (MCU_DISPQ_INFO_EXT *)MsOS_PA2KSEG1(pstDispFrameFormat->phyVsyncBridgeExtAddr +
1837*53ee8cc1Swenshuai.xi                     ((MS_U32)pstDispFrameFormat->u32OverlayID * sizeof(MCU_DISPQ_INFO_EXT)));
1838*53ee8cc1Swenshuai.xi             } else {
1839*53ee8cc1Swenshuai.xi                 pDispQ_Ext = (MCU_DISPQ_INFO_EXT *)MsOS_PA2KSEG1(pstDispFrameFormat->phyVsyncBridgeExtAddr);
1840*53ee8cc1Swenshuai.xi             }
1841*53ee8cc1Swenshuai.xi 
1842*53ee8cc1Swenshuai.xi             if (pDispQ_Ext /*&& (pDispQ_Ext->u32Version <= VSYNC_BRIDGE_EXT_VERSION)*/) {
1843*53ee8cc1Swenshuai.xi                 // vsync bridge extened header --> vbeh magic number
1844*53ee8cc1Swenshuai.xi                 pDispQ_Ext->u8Pattern[0] = 'v';
1845*53ee8cc1Swenshuai.xi                 pDispQ_Ext->u8Pattern[1] = 'b';
1846*53ee8cc1Swenshuai.xi                 pDispQ_Ext->u8Pattern[2] = 'e';
1847*53ee8cc1Swenshuai.xi                 pDispQ_Ext->u8Pattern[3] = 'h';
1848*53ee8cc1Swenshuai.xi                 pDispQ_Ext->u32Version = 0;
1849*53ee8cc1Swenshuai.xi                 #if 1
1850*53ee8cc1Swenshuai.xi                 int i = 0;
1851*53ee8cc1Swenshuai.xi                 for (i = 0; i < MS_DISP_FRM_INFO_EXT_TYPE_MAX; i++) {
1852*53ee8cc1Swenshuai.xi                     pDispQ_Ext->McuDispQueue[u8WIndex].u32LumaAddrExt[i] = pstDispFrameFormat->stDispFrmInfoExt.u32LumaAddrExt[i];
1853*53ee8cc1Swenshuai.xi                     pDispQ_Ext->McuDispQueue[u8WIndex].u32ChromaAddrExt[i] = pstDispFrameFormat->stDispFrmInfoExt.u32ChromaAddrExt[i];
1854*53ee8cc1Swenshuai.xi                 }
1855*53ee8cc1Swenshuai.xi                 pDispQ_Ext->McuDispQueue[u8WIndex].MFCodecInfo = pstDispFrameFormat->stFrames[0].stHWFormat.u32MFCodecInfo;
1856*53ee8cc1Swenshuai.xi                 pDispQ_Ext->McuDispQueue[u8WIndex].u16Width = pstDispFrameFormat->stDispFrmInfoExt.u16Width;
1857*53ee8cc1Swenshuai.xi                 pDispQ_Ext->McuDispQueue[u8WIndex].u16Height = pstDispFrameFormat->stDispFrmInfoExt.u16Height;
1858*53ee8cc1Swenshuai.xi                 pDispQ_Ext->McuDispQueue[u8WIndex].u16Pitch[0] = pstDispFrameFormat->stDispFrmInfoExt.u16Pitch[0];
1859*53ee8cc1Swenshuai.xi                 pDispQ_Ext->McuDispQueue[u8WIndex].u16Pitch[1] = pstDispFrameFormat->stDispFrmInfoExt.u16Pitch[1];
1860*53ee8cc1Swenshuai.xi                 #else
1861*53ee8cc1Swenshuai.xi                 memcpy(&pDispQ_Ext->McuDispQueue[u8WIndex], &pstDispFrameFormat->stDispFrmInfoExt, sizeof(DISP_FRM_INFO_EXT));
1862*53ee8cc1Swenshuai.xi                 #endif
1863*53ee8cc1Swenshuai.xi             } else {
1864*53ee8cc1Swenshuai.xi                 DMS_PRINTF("pDispQ_Ext is NULL\n");
1865*53ee8cc1Swenshuai.xi             }
1866*53ee8cc1Swenshuai.xi         }
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi 
1869*53ee8cc1Swenshuai.xi         // TODO: handle DS
1870*53ee8cc1Swenshuai.xi         //if (gDMSCtrl[u32WindowID].bDS_Enable) {
1871*53ee8cc1Swenshuai.xi         //if (u32WindowID ? MApi_XC_GetDynamicScalingStatus() : MApi_XC_GetDynamicScalingStatus()) {
1872*53ee8cc1Swenshuai.xi         if (MApi_XC_GetDynamicScalingStatus()) {
1873*53ee8cc1Swenshuai.xi 
1874*53ee8cc1Swenshuai.xi             // source resolution change
1875*53ee8cc1Swenshuai.xi             if ((gDMSCtrl[u32WindowID].u16SrcWidth != pstDispFrameFormat->stFrames[0].u32Width)
1876*53ee8cc1Swenshuai.xi                 || (gDMSCtrl[u32WindowID].u16SrcHeight != pstDispFrameFormat->stFrames[0].u32Height)
1877*53ee8cc1Swenshuai.xi                 || (gDMSCtrl[u32WindowID].u32AspectWidth != pstDispFrameFormat->u32AspectWidth
1878*53ee8cc1Swenshuai.xi                     && gDMSCtrl[u32WindowID].u32AspectHeight != pstDispFrameFormat->u32AspectHeight)) {
1879*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u32AspectWidth = pstDispFrameFormat->u32AspectWidth;
1880*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u32AspectHeight = pstDispFrameFormat->u32AspectHeight;
1881*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u16SrcWidth = pstDispFrameFormat->stFrames[0].u32Width;
1882*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u16SrcHeight = pstDispFrameFormat->stFrames[0].u32Height;
1883*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u8SizeChange = 1;
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi                 #ifdef UFO_SWDS_NR_RESOLUTION_CHANGE
1886*53ee8cc1Swenshuai.xi                 MApi_XC_Set_DS_DNR(DISABLE, Overlay_ID);
1887*53ee8cc1Swenshuai.xi                 #endif
1888*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u8DNRFrameCnt = 0;
1889*53ee8cc1Swenshuai.xi             }
1890*53ee8cc1Swenshuai.xi 
1891*53ee8cc1Swenshuai.xi             if (!pSHM->u8McuDispSwitch
1892*53ee8cc1Swenshuai.xi                 || gDMSCtrl[u32WindowID].u8SizeChange
1893*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SWDS_DYMAMIC_CONTROL_DNR
1894*53ee8cc1Swenshuai.xi                 || (gDMSCtrl[u32WindowID].u8DNRFrameCnt == DNRFrameNUM)
1895*53ee8cc1Swenshuai.xi #endif
1896*53ee8cc1Swenshuai.xi                 || _DMS_Need_XC_HDR_DS(pstDispFrameFormat)) {
1897*53ee8cc1Swenshuai.xi 
1898*53ee8cc1Swenshuai.xi                 _DMS_Update_DS_Table(pInstance, u32WindowID, pstDispFrameFormat, 0,
1899*53ee8cc1Swenshuai.xi                     !pSHM->u8McuDispSwitch || gDMSCtrl[u32WindowID].u8SizeChange
1900*53ee8cc1Swenshuai.xi #ifndef UFO_XC_SETWINDOW_LITE
1901*53ee8cc1Swenshuai.xi                     || _DMS_Need_XC_HDR_DS(pstDispFrameFormat)
1902*53ee8cc1Swenshuai.xi #endif
1903*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SWDS_DYMAMIC_CONTROL_DNR
1904*53ee8cc1Swenshuai.xi                     || (gDMSCtrl[u32WindowID].u8DNRFrameCnt == DNRFrameNUM)
1905*53ee8cc1Swenshuai.xi #endif
1906*53ee8cc1Swenshuai.xi                 );
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi                 gDMSCtrl[u32WindowID].u8SizeChange = 0;
1909*53ee8cc1Swenshuai.xi             }
1910*53ee8cc1Swenshuai.xi 
1911*53ee8cc1Swenshuai.xi #ifdef UFO_XC_SWDS_SW_FILM_ENABLE
1912*53ee8cc1Swenshuai.xi             if ((u8ForceInterlace[Overlay_ID] || (u8ForcePMode[Overlay_ID] && dff->u8Interlace))
1913*53ee8cc1Swenshuai.xi                 && MApi_XC_Set_DS_ForceI_DeInterlaceMode) {
1914*53ee8cc1Swenshuai.xi                 pSHM->McuDispQueue[u8WIndex].u1DSIndex1Valid = 1;
1915*53ee8cc1Swenshuai.xi             }
1916*53ee8cc1Swenshuai.xi #endif
1917*53ee8cc1Swenshuai.xi 
1918*53ee8cc1Swenshuai.xi             pSHM->McuDispQueue[u8WIndex].u8DSIndex = gDMSCtrl[u32WindowID].ds_curr_index.u8DSIndex;
1919*53ee8cc1Swenshuai.xi         } else {
1920*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8SizeChange = 1;
1921*53ee8cc1Swenshuai.xi         }
1922*53ee8cc1Swenshuai.xi 
1923*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u16CropLeft = gDMSCtrl[u32WindowID].stCurrentCropWin.u32x;
1924*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u16CropTop = gDMSCtrl[u32WindowID].stCurrentCropWin.u32y;
1925*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u16CropRight = pSHM->McuDispQueue[u8WIndex].u16Width
1926*53ee8cc1Swenshuai.xi                                                     - gDMSCtrl[u32WindowID].stCurrentCropWin.u32width
1927*53ee8cc1Swenshuai.xi                                                     - gDMSCtrl[u32WindowID].stCurrentCropWin.u32x;
1928*53ee8cc1Swenshuai.xi         pSHM->McuDispQueue[u8WIndex].u16CropBottom = pSHM->McuDispQueue[u8WIndex].u16Height
1929*53ee8cc1Swenshuai.xi                                                     - gDMSCtrl[u32WindowID].stCurrentCropWin.u32height
1930*53ee8cc1Swenshuai.xi                                                     - gDMSCtrl[u32WindowID].stCurrentCropWin.u32y;
1931*53ee8cc1Swenshuai.xi 
1932*53ee8cc1Swenshuai.xi         // if render interval large than 500 ms, maybe pause, needs to wait timing
1933*53ee8cc1Swenshuai.xi         if (pSHM->u8McuDispSwitch && ((MsOS_GetSystemTime() - gDMSCtrl[u32WindowID].u32LastTime) > 500)) {
1934*53ee8cc1Swenshuai.xi             _DMS_Wait_MVOP_Vsync(u32WindowID, pstDispFrameFormat);
1935*53ee8cc1Swenshuai.xi         }
1936*53ee8cc1Swenshuai.xi         gDMSCtrl[u32WindowID].u32LastTime = MsOS_GetSystemTime();
1937*53ee8cc1Swenshuai.xi 
1938*53ee8cc1Swenshuai.xi         pSHM->u8McuDispQWPtr = u8WIndex;
1939*53ee8cc1Swenshuai.xi 
1940*53ee8cc1Swenshuai.xi         //pstDispFrameFormat->u8CurIndex = u8WIndex;
1941*53ee8cc1Swenshuai.xi 
1942*53ee8cc1Swenshuai.xi         if (pSHM->u8McuDispSwitch == 0) {
1943*53ee8cc1Swenshuai.xi             pSHM->u8DispQueNum = MAX_VSYNC_BRIDGE_DISPQ_NUM;
1944*53ee8cc1Swenshuai.xi 
1945*53ee8cc1Swenshuai.xi             _DMS_Wait_MVOP_Vsync(u32WindowID, pstDispFrameFormat);
1946*53ee8cc1Swenshuai.xi 
1947*53ee8cc1Swenshuai.xi             pSHM->u8McuDispSwitch = 1;
1948*53ee8cc1Swenshuai.xi         }
1949*53ee8cc1Swenshuai.xi         gDMSCtrl[u32WindowID].u32FrameCount++;
1950*53ee8cc1Swenshuai.xi         if (pstDispFrameFormat != &gDMSCtrl[u32WindowID].lastdff)
1951*53ee8cc1Swenshuai.xi             memcpy(&gDMSCtrl[u32WindowID].lastdff, pstDispFrameFormat, sizeof(ST_DMS_DISPFRAMEFORMAT));
1952*53ee8cc1Swenshuai.xi 
1953*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
1954*53ee8cc1Swenshuai.xi 
1955*53ee8cc1Swenshuai.xi         if (gDMSCtrl[u32WindowID].u8Freeze) {
1956*53ee8cc1Swenshuai.xi             gDMSCtrl[u32WindowID].u8Freeze--;
1957*53ee8cc1Swenshuai.xi             if (gDMSCtrl[u32WindowID].u8Freeze == 0) {
1958*53ee8cc1Swenshuai.xi                 DMS_PRINTF("[%d]MApi_XC_UnFreezeImg\n", (int)u32WindowID);
1959*53ee8cc1Swenshuai.xi                 MApi_XC_FreezeImg(FALSE, (SCALER_WIN)(u32WindowID ? 1 : 0));
1960*53ee8cc1Swenshuai.xi             }
1961*53ee8cc1Swenshuai.xi         }
1962*53ee8cc1Swenshuai.xi 
1963*53ee8cc1Swenshuai.xi         _DRV_DMS_Release(u32WindowID);
1964*53ee8cc1Swenshuai.xi 
1965*53ee8cc1Swenshuai.xi         {
1966*53ee8cc1Swenshuai.xi             MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1967*53ee8cc1Swenshuai.xi             DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1968*53ee8cc1Swenshuai.xi             UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1969*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32WindowID][u8WIndex].u32VDECStreamVersion = pstDispFrameFormat->u32VdecStreamVersion;
1970*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32WindowID][u8WIndex].u32VDECStreamID = pstDispFrameFormat->u32VdecStreamId;
1971*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32WindowID][u8WIndex].u32FrameIndex = pstDispFrameFormat->stFrames[0].u32Idx;
1972*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS._stXC_DIPPushInfo[u32WindowID][u8WIndex].u32PriData = pstDispFrameFormat->stFrames[0].u32PriData;
1973*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.phyVsyncbridgeAddr[u32WindowID] = pstDispFrameFormat->phyVsyncBridgeAddr;
1974*53ee8cc1Swenshuai.xi             pDMSResPri->stDrvDMS.phyVsyncbridgeExtAddr[u32WindowID] = pstDispFrameFormat->phyVsyncBridgeExtAddr;
1975*53ee8cc1Swenshuai.xi             _DMS_VDEC_Frame_AddRef(u32WindowID, u8WIndex);
1976*53ee8cc1Swenshuai.xi             MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1977*53ee8cc1Swenshuai.xi         }
1978*53ee8cc1Swenshuai.xi 
1979*53ee8cc1Swenshuai.xi         eResult = E_DMS_OK;
1980*53ee8cc1Swenshuai.xi     } else {
1981*53ee8cc1Swenshuai.xi         DMS_PRINTF("%s %d pSHM is NULL\n", __FUNCTION__, __LINE__);
1982*53ee8cc1Swenshuai.xi         eResult = E_DMS_FAIL;
1983*53ee8cc1Swenshuai.xi     }
1984*53ee8cc1Swenshuai.xi 
1985*53ee8cc1Swenshuai.xi     return eResult;
1986*53ee8cc1Swenshuai.xi }
1987*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetZOrder(void * pInstance,MS_U32 u32WindowID,MS_U32 u32ZOrder)1988*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetZOrder(void* pInstance, MS_U32 u32WindowID, MS_U32 u32ZOrder)
1989*53ee8cc1Swenshuai.xi {
1990*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
1991*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
1992*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
1995*53ee8cc1Swenshuai.xi     return E_DMS_OK;
1996*53ee8cc1Swenshuai.xi }
1997*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Freeze(void * pInstance,MS_U32 u32WindowID,MS_U32 u32Enable)1998*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Freeze(void* pInstance, MS_U32 u32WindowID, MS_U32 u32Enable)
1999*53ee8cc1Swenshuai.xi {
2000*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
2001*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
2002*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
2003*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === u32Enable : %d === \033[0m\n", __FUNCTION__, __LINE__, (int)u32Enable);
2004*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
2005*53ee8cc1Swenshuai.xi     return TRUE;
2006*53ee8cc1Swenshuai.xi }
2007*53ee8cc1Swenshuai.xi 
MDrv_DMS_Video_Mute(void * pInstance,MS_U32 u32WindowID,MS_U32 u32Enable)2008*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Video_Mute(void* pInstance, MS_U32 u32WindowID, MS_U32 u32Enable)
2009*53ee8cc1Swenshuai.xi {
2010*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
2011*53ee8cc1Swenshuai.xi     DMS_RESOURCE_PRIVATE* pDMSResPri = NULL;
2012*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pDMSRes,(void**)(&pDMSResPri));
2013*53ee8cc1Swenshuai.xi     //Hal_DMS_XC_SetMute(pInstance, u32Enable);
2014*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
2015*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2016*53ee8cc1Swenshuai.xi }
2017*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_MuteColor(void * pInstance,MS_U32 u32WindowID,ST_DMS_COLOR stMuteColor)2018*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_MuteColor(void* pInstance, MS_U32 u32WindowID, ST_DMS_COLOR stMuteColor)
2019*53ee8cc1Swenshuai.xi {
2020*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl %d=== \033[0m\n", __FUNCTION__, __LINE__, (int)u32WindowID);
2021*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2022*53ee8cc1Swenshuai.xi }
2023*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetStatus(void * pInstance,MS_U32 * pu32Status)2024*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetStatus(void* pInstance, MS_U32 *pu32Status)
2025*53ee8cc1Swenshuai.xi {
2026*53ee8cc1Swenshuai.xi     DMS_PRINTF("\033[32m [%s][%d] === Not Impl === \033[0m\n", __FUNCTION__, __LINE__);
2027*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2028*53ee8cc1Swenshuai.xi }
2029*53ee8cc1Swenshuai.xi 
MDrv_DMS_GetCapability(void * pInstance,EN_DMS_CAPABILITY * peCapability)2030*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_GetCapability(void* pInstance, EN_DMS_CAPABILITY *peCapability)
2031*53ee8cc1Swenshuai.xi {
2032*53ee8cc1Swenshuai.xi     *peCapability = E_DMS_CAPABILITY_VSYNC_BRIDGE;
2033*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2034*53ee8cc1Swenshuai.xi }
2035*53ee8cc1Swenshuai.xi 
MDrv_DMS_SetOutputLayer(void * pInstance,ST_DMS_WINDOW * pstLayer)2036*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_SetOutputLayer(void* pInstance, ST_DMS_WINDOW *pstLayer)
2037*53ee8cc1Swenshuai.xi {
2038*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
2039*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2040*53ee8cc1Swenshuai.xi     memcpy(&RES_DMS.stOutputLayer, pstLayer,sizeof(ST_DMS_WINDOW));
2041*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
2042*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2043*53ee8cc1Swenshuai.xi }
2044*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_3D_Mode(void * pInstance,MS_U32 u32WindowID,ST_DMS_3D_INFO * pst3DInfo)2045*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_3D_Mode(void* pInstance, MS_U32 u32WindowID, ST_DMS_3D_INFO *pst3DInfo)
2046*53ee8cc1Swenshuai.xi {
2047*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2048*53ee8cc1Swenshuai.xi     MDrv_DMS_Get_Semaphore(pInstance, E_DMS_ID_VAR);
2049*53ee8cc1Swenshuai.xi     DMS_GET_RES_PRI;
2050*53ee8cc1Swenshuai.xi     if(MApi_XC_Set_3D_Mode(pst3DInfo->en3DInputMode, pst3DInfo->en3DOutputMode, pst3DInfo->en3DPanelType, MAIN_WINDOW))
2051*53ee8cc1Swenshuai.xi     {
2052*53ee8cc1Swenshuai.xi         if(FALSE == MApi_XC_Set_3D_Mode(pst3DInfo->en3DInputMode, pst3DInfo->en3DOutputMode, pst3DInfo->en3DPanelType, SUB_WINDOW))
2053*53ee8cc1Swenshuai.xi         {
2054*53ee8cc1Swenshuai.xi             DMS_PRINTF("MApi_XC_Set_3D_Mode for Sub window failed\n");
2055*53ee8cc1Swenshuai.xi             bRet = FALSE;
2056*53ee8cc1Swenshuai.xi         }
2057*53ee8cc1Swenshuai.xi     }
2058*53ee8cc1Swenshuai.xi     else
2059*53ee8cc1Swenshuai.xi     {
2060*53ee8cc1Swenshuai.xi         DMS_PRINTF("MApi_XC_Set_3D_Mode for Main window failed\n");
2061*53ee8cc1Swenshuai.xi         bRet = FALSE;
2062*53ee8cc1Swenshuai.xi     }
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi     if(pst3DInfo->en3DInputMode == E_DMS_3D_INPUT_MODE_NONE || pst3DInfo->en3DOutputMode == E_DMS_3D_OUTPUT_MODE_NONE)
2065*53ee8cc1Swenshuai.xi     {
2066*53ee8cc1Swenshuai.xi         DMS_PRINTF("Disable 3D\n");
2067*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(TRUE);
2068*53ee8cc1Swenshuai.xi         MApi_XC_Set_DynamicScalingFlag(TRUE);
2069*53ee8cc1Swenshuai.xi     }
2070*53ee8cc1Swenshuai.xi     else
2071*53ee8cc1Swenshuai.xi     {
2072*53ee8cc1Swenshuai.xi         DMS_PRINTF("Enable 3D\n");
2073*53ee8cc1Swenshuai.xi         MApi_XC_EnableFrameBufferLess(FALSE);
2074*53ee8cc1Swenshuai.xi         MApi_XC_Set_DynamicScalingFlag(FALSE);
2075*53ee8cc1Swenshuai.xi     }
2076*53ee8cc1Swenshuai.xi 
2077*53ee8cc1Swenshuai.xi     MDrv_DMS_Release_Semaphore(pInstance, E_DMS_ID_VAR);
2078*53ee8cc1Swenshuai.xi     return (bRet)? E_DMS_OK : E_DMS_FAIL;
2079*53ee8cc1Swenshuai.xi }
2080*53ee8cc1Swenshuai.xi 
2081*53ee8cc1Swenshuai.xi 
MDrv_DMS_Set_CaptureInfo(void * pInstance,MS_U32 u32WindowID,ST_DMS_SET_CAPTURE_INFO * pstSetCaptureInfo)2082*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Set_CaptureInfo(void* pInstance, MS_U32 u32WindowID, ST_DMS_SET_CAPTURE_INFO *pstSetCaptureInfo)
2083*53ee8cc1Swenshuai.xi {
2084*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2085*53ee8cc1Swenshuai.xi }
2086*53ee8cc1Swenshuai.xi 
MDrv_DMS_Get_CaptureBuffer(void * pInstance,MS_U32 u32WindowID,ST_DMS_CAPTURE_INFO * pstCaptureInfo)2087*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Get_CaptureBuffer(void* pInstance, MS_U32 u32WindowID, ST_DMS_CAPTURE_INFO *pstCaptureInfo)
2088*53ee8cc1Swenshuai.xi {
2089*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2090*53ee8cc1Swenshuai.xi }
2091*53ee8cc1Swenshuai.xi 
MDrv_DMS_Release_CaptureBuffer(void * pInstance,MS_U32 u32WindowID,ST_DMS_CAPTURE_INFO * pstCaptureInfo)2092*53ee8cc1Swenshuai.xi EN_DMS_RESULT MDrv_DMS_Release_CaptureBuffer(void* pInstance, MS_U32 u32WindowID, ST_DMS_CAPTURE_INFO *pstCaptureInfo)
2093*53ee8cc1Swenshuai.xi {
2094*53ee8cc1Swenshuai.xi     return E_DMS_OK;
2095*53ee8cc1Swenshuai.xi }
2096