xref: /utopia/UTPA2-700.0.x/modules/dms/api/dms/apiDMS_v2.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 #define _DMS_C_
2 
3 #include "MsTypes.h"
4 #ifndef MSOS_TYPE_LINUX_KERNEL
5 #include <stdio.h>
6 #include <string.h>
7 #endif
8 #include "MsCommon.h"
9 #include "utopia.h"
10 #include "utopia_dapi.h"
11 #include "apiDMS.h"
12 #include "apiDMS_v2.h"
13 #include "drvDMS.h"
14 #include "halDMS.h"
15 #include "apiDMS_private.h"
16 
17 #include "UFO.h"
18 //-------------------------------------------------------------------------------------------------
19 //  Local Compiler Options
20 //-------------------------------------------------------------------------------------------------
21 // for semaphore POOL
22 
23 
24 //Below is dbg msg for some important dbg function, like:setmux, set gop dst, atexit,etc...
25 
26 
27 //-------------------------------------------------------------------------------------------------
28 //  Local Defines
29 //-------------------------------------------------------------------------------------------------
30 
31 // this func will be call to init by utopia20 framework
DMSRegisterToUtopia(void)32 void DMSRegisterToUtopia(void)
33 {
34     MS_U32 u32ResourceStatusCheck[E_DMS_POOL_ID_MAX] = {UTOPIA_STATUS_FAIL};
35     // 1. deal with module
36     void* pUtopiaModule = NULL;
37 	UtopiaModuleCreate(MODULE_DMS, 0, &pUtopiaModule);
38     UtopiaModuleRegister(pUtopiaModule);
39     // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
40     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)DMSOpen, (FUtopiaClose)DMSClose, (FUtopiaIOctl)DMSIoctl);
41 
42     // 2. deal with resource
43     void* psResource = NULL;
44     // start func to add res, call once will create 2 access in resource. Also can declare BDMA_POOL_ID_BDMA1 for another channel depend on driver owner.
45 	UtopiaModuleAddResourceStart(pUtopiaModule, E_DMS_POOL_ID_INTERNAL_VARIABLE);
46     // resource can alloc private for internal use, ex, BDMA_RESOURCE_PRIVATE
47     u32ResourceStatusCheck[E_DMS_POOL_ID_INTERNAL_VARIABLE] = UtopiaResourceCreate("DMS", sizeof(DMS_RESOURCE_PRIVATE), &psResource);
48     // func to reg res
49     UtopiaResourceRegister(pUtopiaModule, psResource, E_DMS_POOL_ID_INTERNAL_VARIABLE);
50 
51 	UtopiaModuleAddResourceEnd(pUtopiaModule, E_DMS_POOL_ID_INTERNAL_VARIABLE);
52 
53     //4. init resource private members here   (aka, global variable)
54     DMS_RESOURCE_PRIVATE* pDMSResourcePrivate = NULL;
55     UtopiaResourceGetPrivate(psResource,(void**)(&pDMSResourcePrivate));
56 
57     //pXCResourcePrivate->bResourceRegistered will automatically cleared by UtopiaResourceRegister
58     if (u32ResourceStatusCheck[E_DMS_POOL_ID_INTERNAL_VARIABLE] == UTOPIA_STATUS_SHM_EXIST)
59     {
60         // do nothing, since it is already inited
61     }
62     else
63     {
64         // Init flow control related variables here. Other global variable should be
65         // inited in each of its init function relatively.
66         pDMSResourcePrivate->bResourceRegistered = TRUE;
67         pDMSResourcePrivate->bDrvInit = FALSE;
68         pDMSResourcePrivate->stHalDMS.phyDSAddr = 0x0;
69         pDMSResourcePrivate->stHalDMS.u8DSIndex = 0;
70         memset(&pDMSResourcePrivate->stHalDMS.stDMS_DSSWDB, 0 , sizeof(pDMSResourcePrivate->stHalDMS.stDMS_DSSWDB));
71 
72 #ifdef DMS_VERSION_DIPGOP
73         MS_U8 u8WindowID=0;
74 
75         memset(pDMSResourcePrivate->stDrvDMS._stXC_DIPMemInfo, 0 , sizeof(DMS_DIPMEM_INFO) * E_DMS_DIP_CLIENT_MAX);
76         memset(pDMSResourcePrivate->stDrvDMS._stXC_PreDispWinInfo, 0 , sizeof(ST_DMS_WINDOW) * DMS_MAX_WINDOW_NUM);
77         memset(pDMSResourcePrivate->stDrvDMS._stXC_PreDispWinInfo, 0 , sizeof(DMS_DISP_BUFFER_FLAG) * E_DMS_DIP_MULTIVIEW_BUF_ID_MAX * DMS_MAX_WINDOW_NUM);
78         pDMSResourcePrivate->stDrvDMS.u32MaxOutputFrameRate = 0;
79         pDMSResourcePrivate->stDrvDMS.u32VsyncCount = 0;
80         pDMSResourcePrivate->stDrvDMS.u32GOPDispCount = 0;
81         for(u8WindowID=0; u8WindowID<DMS_MAX_WINDOW_NUM; u8WindowID++)
82         {
83             pDMSResourcePrivate->stDrvDMS.u8DIPReadytoCaptureID[u8WindowID] = DMS_Invalid_ReadPointer_ID;
84         }
85 
86         memset(pDMSResourcePrivate->stDrvDMS.u32DIPAddress_pa, 0 , sizeof(MS_PHY) * E_DMS_DIP_CLIENT_MAX);
87         memset(pDMSResourcePrivate->stDrvDMS.u8DIP_Window, 0 , sizeof(MS_U8) * E_DMS_DIP_MAX);
88         pDMSResourcePrivate->stDrvDMS.u32GEAddress_pa = 0x0;
89         pDMSResourcePrivate->stDrvDMS.u8GOPGWinNum = 0xFF;
90         pDMSResourcePrivate->stDrvDMS.bIsGOPInit = FALSE;
91         pDMSResourcePrivate->stDrvDMS.bDIPWriteFirstAddr = TRUE;
92         pDMSResourcePrivate->stDrvDMS.bDIPMVOPWriteFirstAddr = TRUE;
93         pDMSResourcePrivate->stDrvDMS.u8EnableWindowCount = 0;
94         pDMSResourcePrivate->stDrvDMS.u8UseDIPWindowCount = 0;
95         pDMSResourcePrivate->stDrvDMS.bNeedGEstretch = FALSE;
96 
97         pDMSResourcePrivate->stDrvDMS.eDMS_MVOPFlowCtrl = E_DMS_MVOP_FLOW_UNKNOWN;
98         pDMSResourcePrivate->stDrvDMS.bDMS_MVOPFlowFromDi = FALSE;
99         pDMSResourcePrivate->stDrvDMS.eDMS_PreMVOPFlowCtrl = E_DMS_MVOP_FLOW_UNKNOWN;
100         pDMSResourcePrivate->stDrvDMS.gDMS_MVOPShowBufferID = DMS_Invalid_ReadPointer_ID;
101         pDMSResourcePrivate->stDrvDMS.gDMS_MVOPRemoveBufferID = DMS_Invalid_ReadPointer_ID;
102         pDMSResourcePrivate->stDrvDMS.bMVOPMarkRemoveBuffer = FALSE;
103         memset(&pDMSResourcePrivate->stDrvDMS.bIsWindowMute, 0, sizeof(MS_BOOL) * DMS_MAX_WINDOW_NUM);
104 
105         pDMSResourcePrivate->stDrvDMS.gDMS_ScalingCondition = 0;
106         memset(pDMSResourcePrivate->stDrvDMS.gu8DMS_SetXC_Status, 0, sizeof(MS_U32) * DMS_MAX_WINDOW_NUM);
107         pDMSResourcePrivate->stDrvDMS.gu8DMS_Seq_Change_ID = DMS_Invalid_ReadPointer_ID;
108         memset(&pDMSResourcePrivate->stDrvDMS._stXC_XCDispWinInfo, 0, sizeof(pDMSResourcePrivate->stDrvDMS._stXC_XCDispWinInfo));
109         memset(&pDMSResourcePrivate->stDrvDMS._stXC_XCCropWinInfo, 0, sizeof(pDMSResourcePrivate->stDrvDMS._stXC_XCCropWinInfo));
110         memset(&pDMSResourcePrivate->stDrvDMS._stXC_XCDispWinInfo_DoubleBuffer, 0, sizeof(pDMSResourcePrivate->stDrvDMS._stXC_XCDispWinInfo_DoubleBuffer));
111         memset(&pDMSResourcePrivate->stDrvDMS._stXC_XCCropWinInfo_DoubleBuffer, 0, sizeof(pDMSResourcePrivate->stDrvDMS._stXC_XCCropWinInfo_DoubleBuffer));
112 
113         memset(&pDMSResourcePrivate->stDrvDMS._stXC_LocalFrameRefCount, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM * DMS_DIP_QUEUEDEPTH);
114         pDMSResourcePrivate->stDrvDMS.u32MVOPFreezeAddress_pa = 0x0;
115         pDMSResourcePrivate->stDrvDMS.bDMS_Freeze_DoubleBuffer = FALSE;
116         pDMSResourcePrivate->stDrvDMS._bForceSwitchBufferFlag = FALSE;
117         memset(&pDMSResourcePrivate->stDrvDMS.u32ReleaseState, 0, sizeof(MS_U32) * DMS_DIP_QUEUEDEPTH);
118 
119         pDMSResourcePrivate->stDrvDMS.u32OutputRate = 0;
120         memset(pDMSResourcePrivate->stDrvDMS.bStartCountFRC, 0, sizeof(MS_U32) * DMS_MAX_WINDOW_NUM);
121         memset(pDMSResourcePrivate->stDrvDMS.u32AccumuleInputRate, 0, sizeof(MS_U32) * DMS_MAX_WINDOW_NUM);
122 
123         //Di
124         pDMSResourcePrivate->stDrvDMSDi.bFlipToDiTask = FALSE;
125         pDMSResourcePrivate->stDrvDMSDi._u8DMS_DiSetEventBufferID = DMS_Invalid_ReadPointer_ID;
126         pDMSResourcePrivate->stDrvDMSDi._u8DMS_DiReleaseVDECFrameBufferID = DMS_Invalid_ReadPointer_ID;
127         memset(&pDMSResourcePrivate->stDrvDMSDi._stXC_LocalFrameRefCountInterlace, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM * DMS_DIP_QUEUEDEPTH);
128         memset(pDMSResourcePrivate->stDrvDMSDi.u8DIPReadytoCaptureIDInterlace,DMS_Invalid_ReadPointer_ID, sizeof(pDMSResourcePrivate->stDrvDMSDi.u8DIPReadytoCaptureIDInterlace));
129         pDMSResourcePrivate->stDrvDMSDi.u8DIRingBufferID = 0;
130         pDMSResourcePrivate->stDrvDMSDi._bDiNowShowRingBufID = INVALID_DI_RING_BUFFER_ID;
131         pDMSResourcePrivate->stDrvDMSDi._bDiReleaseShowRingBufID = INVALID_DI_RING_BUFFER_ID;
132         pDMSResourcePrivate->stDrvDMSDi._bSetwinToDiTask_DoubleBuffer = FALSE;
133         for(u8WindowID=0; u8WindowID<DMS_MAX_WINDOW_NUM; u8WindowID++)
134         {
135             MS_U8 u8BufID = 0;
136             for(u8BufID=0; u8BufID<DMS_DIP_QUEUEDEPTH; u8BufID++)
137             {
138                 pDMSResourcePrivate->stDrvDMSDi._stXC_DIPDIInfo[u8WindowID][u8BufID].bValid = FALSE;
139             }
140         }
141         pDMSResourcePrivate->stDrvDMSDi.u32DIPDIAddress_pa = 0x0;
142 
143         //Capture Mode
144         memset(pDMSResourcePrivate->stDrvDMSCapMode._stXC_DIPCaptureWinInfo, 0 , sizeof(DMS_DIPCAPTUREWIN_INFO) * DMS_MAX_WINDOW_NUM);
145         memset(&pDMSResourcePrivate->stDrvDMSCapMode._stXC_CaptureRingBufRefCount, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM * DMS_CAPTUREWIN_RING_BUFFER);
146         memset(&pDMSResourcePrivate->stDrvDMSCapMode._stXC_LocalFrameRefCountCaptureMode, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM * DMS_DIP_QUEUEDEPTH);
147         memset(&pDMSResourcePrivate->stDrvDMSCapMode._stXC_DIPCapWin_WriteReadPointer, 0, sizeof(DMS_DIPWriteReadPointer) * DMS_MAX_WINDOW_NUM);
148         memset(&pDMSResourcePrivate->stDrvDMSCapMode._stXC_DIPCaptureWin_RingBufferPointer, 0, sizeof(DMS_DIPCaptureWin_WritePointer) * DMS_MAX_WINDOW_NUM);
149         pDMSResourcePrivate->stDrvDMSCapMode.u8CapturedWinNum = 0;
150         memset(pDMSResourcePrivate->stDrvDMSCapMode.u8frameRepeatCnt, 0, sizeof(MS_U8) * DMS_MAX_WINDOW_NUM * DMS_DIP_QUEUEDEPTH);
151         memset(pDMSResourcePrivate->stDrvDMSCapMode.bIsFrameValid, 0, sizeof(MS_U32) * DMS_MAX_WINDOW_NUM * DMS_DIP_QUEUEDEPTH);
152         memset(pDMSResourcePrivate->stDrvDMSCapMode.bIsRingBufAccessed, 0, sizeof(MS_U32) * DMS_CAPTUREWIN_RING_BUFFER);
153 #if DMS_DIP_Support_IMI
154         memset(pDMSResourcePrivate->stDrvDMSCapMode._stXC_IMICaptureInfo, 0, sizeof(DMS_DIPCAPTURE_IMI_INFO) * DMS_MAX_WINDOW_NUM);
155 #endif
156         pDMSResourcePrivate->stDrvDMS.bFirstPlay = FALSE;
157         pDMSResourcePrivate->stDrvDMS.bDisableBlackScreen = FALSE;
158         pDMSResourcePrivate->stDrvDMS.u32MuteCounter = 0;
159         pDMSResourcePrivate->stDrvDMS.bXCEnableBob = FALSE;
160 #endif
161     }
162 }
163 
DMSOpen(void ** ppInstance,const void * const pAttribute)164 MS_U32 DMSOpen(void** ppInstance, const void* const pAttribute)
165 {
166     DMS_INSTANT_PRIVATE *pDMSPri = NULL;
167 
168     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,printf("enter %s %d\n",__FUNCTION__,__LINE__));
169     // instance is allocated here, also can allocate private for internal use, ex, BDMA_INSTANT_PRIVATE
170     UtopiaInstanceCreate(sizeof(DMS_INSTANT_PRIVATE), ppInstance);
171     // setup func in private and assign the calling func in func ptr in instance private
172     UtopiaInstanceGetPrivate(*ppInstance, (void**)&pDMSPri);
173 
174     pDMSPri->fpDMSInit              = MApi_DMS_Init_U2;
175     pDMSPri->fpDMSSetMemType        = MApi_DMS_SetMemory_U2;
176     pDMSPri->fpDMSCreateWin         = MApi_DMS_CreateWindow_U2;
177     pDMSPri->fpDMSSetDigiDecInfo    = MApi_DMS_SetDigitalDecodeSignalInfo_U2;
178     pDMSPri->fpDMSClearDigiDecInfo  = MApi_DMS_ClearDigitalDecodeSignalInfo_U2;
179     pDMSPri->fpDMSDestoryWin        = MApi_DMS_DestroyWindow_U2;
180     pDMSPri->fpDMSSetWin            = MApi_DMS_SetWindow_U2;
181     pDMSPri->fpDMSGetWinInfo        = MApi_DMS_GetWindowInfo_U2;
182     pDMSPri->fpDMSFlip              = MApi_DMS_Video_Flip_U2;
183     pDMSPri->fpDMSZOrder            = MApi_DMS_SetZOrder_U2;
184     pDMSPri->fpDMSMute              = MApi_DMS_Video_Mute_U2;
185     pDMSPri->fpDMSSetMuteColor      = MApi_DMS_Set_MuteColor_U2;
186     pDMSPri->fpDMSFreeze            = MApi_DMS_Video_Freeze_U2;
187     pDMSPri->fpDMSGetStatus         = MApi_DMS_GetStatus_U2;
188     pDMSPri->fpDMSGetCaps           = MApi_DMS_GetCapability_U2;
189     pDMSPri->fpDMSGetExistWin       = MApi_DMS_GetExistedWindows_U2;
190     pDMSPri->fpDMSSetOutputLayer    = MApi_DMS_SetOutputLayer_U2;
191     pDMSPri->fpDMSSet3DMode         = MApi_DMS_Set_3D_Mode_U2;
192     pDMSPri->fpDMSSetCaptureInfo    = MApi_DMS_Set_CaptureInfo_U2;
193     pDMSPri->fpDMSGetCaptureBuf     = MApi_DMS_Get_CaptureBuffer_U2;
194     pDMSPri->fpDMSReleaseCaptureBuf = MApi_DMS_Release_CaptureBuffer_U2;
195 
196 	return UTOPIA_STATUS_SUCCESS;
197 }
198 
DMSIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)199 MS_U32 DMSIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
200 {
201     if(pInstance == NULL)
202     {
203         printf("[%s] pInstance is NULL\n",__FUNCTION__);
204         return UTOPIA_STATUS_FAIL;
205     }
206 	void* pModule = NULL;
207 	UtopiaInstanceGetModule(pInstance, &pModule);
208     DMS_INSTANT_PRIVATE* psDMSInstPri = NULL;
209 	UtopiaInstanceGetPrivate(pInstance, (void**)&psDMSInstPri);
210     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
211 
212     switch(u32Cmd)
213     {
214         case E_DMS_CMD_INIT:
215         {
216             PST_DMS_INIT ptr = (PST_DMS_INIT)pArgs;
217             ptr->eReturnValue = psDMSInstPri->fpDMSInit(pInstance, ptr->pstDMS_InitData);
218             u32Return = UTOPIA_STATUS_SUCCESS;
219             break;
220         }
221         case E_DMS_CMD_SETMEMORY:
222         {
223             PST_DMS_SETMEMTYPE ptr = (PST_DMS_SETMEMTYPE)pArgs;
224             ptr->eReturnValue = psDMSInstPri->fpDMSSetMemType(pInstance, ptr->pstDMS_SetMemType);
225             u32Return = UTOPIA_STATUS_SUCCESS;
226             break;
227         }
228         case E_DMS_CMD_CREATEWINDOW:
229         {
230             PST_DMS_CREATEWIN ptr = (PST_DMS_CREATEWIN)pArgs;
231             ptr->eReturnValue = psDMSInstPri->fpDMSCreateWin(pInstance, ptr->pstOutputWin, ptr->pstCreateWin_Info, ptr->pu32WindowID);
232             u32Return = UTOPIA_STATUS_SUCCESS;
233             break;
234         }
235         case E_DMS_CMD_SETDIGITALDECODESIGNALINFO:
236         {
237             PST_DMS_SETDIGIDECINFO ptr = (PST_DMS_SETDIGIDECINFO)pArgs;
238             ptr->eReturnValue = psDMSInstPri->fpDMSSetDigiDecInfo(pInstance, ptr->u32WindowID, ptr->pstDispFrameFormat);
239             u32Return = UTOPIA_STATUS_SUCCESS;
240             break;
241         }
242         case E_DMS_CMD_CLEARDIGITALDECODESIGNALINFO:
243         {
244             PST_DMS_CLEARDIGIDECINFO ptr = (PST_DMS_CLEARDIGIDECINFO)pArgs;
245             ptr->eReturnValue = psDMSInstPri->fpDMSClearDigiDecInfo(pInstance, ptr->u32WindowID);
246             u32Return = UTOPIA_STATUS_SUCCESS;
247             break;
248         }
249         case E_DMS_CMD_DESTORYWINDOW:
250         {
251             PST_DMS_DESTORYWIN ptr = (PST_DMS_DESTORYWIN)pArgs;
252             ptr->eReturnValue = psDMSInstPri->fpDMSDestoryWin(pInstance, ptr->u32WindowID);
253             u32Return = UTOPIA_STATUS_SUCCESS;
254             break;
255         }
256         case E_DMS_CMD_SETWINDOW:
257         {
258             PST_DMS_SETWIN ptr = (PST_DMS_SETWIN)pArgs;
259             ptr->eReturnValue = psDMSInstPri->fpDMSSetWin(pInstance, ptr->u32WindowID, ptr->pstDMS_SetWin_Info);
260             u32Return = UTOPIA_STATUS_SUCCESS;
261             break;
262         }
263         case E_DMS_CMD_GETWINDOWINFO:
264         {
265             PST_DMS_GETWININFO ptr = (PST_DMS_GETWININFO)pArgs;
266             ptr->eReturnValue = psDMSInstPri->fpDMSGetWinInfo(pInstance, ptr->u32WindowID, ptr->pstDMS_GetWin_Info);
267             u32Return = UTOPIA_STATUS_SUCCESS;
268             break;
269         }
270         case E_DMS_CMD_VIDEOFLIP:
271         {
272             PST_DMS_FLIP ptr = (PST_DMS_FLIP)pArgs;
273             ptr->eReturnValue = psDMSInstPri->fpDMSFlip(pInstance, ptr->u32WindowID, ptr->pstDispFrameFormat);
274             u32Return = UTOPIA_STATUS_SUCCESS;
275             break;
276         }
277         case E_DMS_CMD_SETZORDER:
278         {
279             PST_DMS_ZORDER ptr = (PST_DMS_ZORDER)pArgs;
280             ptr->eReturnValue = psDMSInstPri->fpDMSZOrder(pInstance, ptr->u32WindowID, ptr->pstZorderInfo);
281             u32Return = UTOPIA_STATUS_SUCCESS;
282             break;
283         }
284         case E_DMS_CMD_VIDEOMUTE:
285         {
286             PST_DMS_MUTE ptr = (PST_DMS_MUTE)pArgs;
287             ptr->eReturnValue = psDMSInstPri->fpDMSMute(pInstance, ptr->u32WindowID, ptr->pstWindowMute);
288             u32Return = UTOPIA_STATUS_SUCCESS;
289             break;
290         }
291         case E_DMS_CMD_SETMUTECOLOR:
292         {
293             PST_DMS_MUTECOLOR ptr = (PST_DMS_MUTECOLOR)pArgs;
294             ptr->eReturnValue = psDMSInstPri->fpDMSSetMuteColor(pInstance, ptr->u32WindowID, ptr->pstMuteColor);
295             u32Return = UTOPIA_STATUS_SUCCESS;
296             break;
297         }
298         case E_DMS_CMD_VIDEOFREEZE:
299         {
300             PST_DMS_FREEZE ptr = (PST_DMS_FREEZE)pArgs;
301             ptr->eReturnValue = psDMSInstPri->fpDMSFreeze(pInstance, ptr->u32WindowID, ptr->pstWindowFreeze);
302             u32Return = UTOPIA_STATUS_SUCCESS;
303             break;
304         }
305         case E_DMS_CMD_GETSTATUS:
306         {
307             PST_DMS_GETSTATUS ptr = (PST_DMS_GETSTATUS)pArgs;
308             ptr->eReturnValue = psDMSInstPri->fpDMSGetStatus(pInstance, ptr->peStatus);
309             u32Return = UTOPIA_STATUS_SUCCESS;
310             break;
311         }
312         case E_DMS_CMD_GETCAPS:
313         {
314             PST_DMS_GETCAPS ptr = (PST_DMS_GETCAPS)pArgs;
315             ptr->eReturnValue = psDMSInstPri->fpDMSGetCaps(pInstance, ptr->peCapability);
316             u32Return = UTOPIA_STATUS_SUCCESS;
317             break;
318         }
319         case E_DMS_CMD_GETEXISTEDWINDOW:
320         {
321             PST_DMS_GETEXISTWIN ptr = (PST_DMS_GETEXISTWIN)pArgs;
322             ptr->eReturnValue = psDMSInstPri->fpDMSGetExistWin(pInstance, ptr->pu32WindowNums);
323             u32Return = UTOPIA_STATUS_SUCCESS;
324             break;
325         }
326         case E_DMS_CMD_SETOUTPUTLAYER:
327         {
328             PST_DMS_SETOUTPUTLAYER ptr = (PST_DMS_SETOUTPUTLAYER)pArgs;
329             ptr->eReturnValue = psDMSInstPri->fpDMSSetOutputLayer(pInstance, ptr->pstLayer);
330             u32Return = UTOPIA_STATUS_SUCCESS;
331             break;
332         }
333         case E_DMS_CMD_SET3DMODE:
334         {
335             PST_DMS_SET3DMODE ptr = (PST_DMS_SET3DMODE)pArgs;
336             ptr->eReturnValue = psDMSInstPri->fpDMSSet3DMode(pInstance, ptr->u32WindowID, ptr->pst3DInfo);
337             u32Return = UTOPIA_STATUS_SUCCESS;
338             break;
339         }
340         case E_DMS_CMD_SETCAPTUREINFO:
341         {
342             PST_DMS_SETCAPTUREINFO ptr = (PST_DMS_SETCAPTUREINFO)pArgs;
343             ptr->eReturnValue = psDMSInstPri->fpDMSSetCaptureInfo(pInstance, ptr->u32WindowID, ptr->pstSetCaptureInfo);
344             u32Return = UTOPIA_STATUS_SUCCESS;
345             break;
346         }
347         case E_DMS_CMD_GETCAPTUREBUFFER:
348         {
349             PST_DMS_GETCAPTUREBUF ptr = (PST_DMS_GETCAPTUREBUF)pArgs;
350             ptr->eReturnValue = psDMSInstPri->fpDMSGetCaptureBuf(pInstance, ptr->u32WindowID, ptr->pstCaptureInfo);
351             u32Return = UTOPIA_STATUS_SUCCESS;
352             break;
353         }
354         case E_DMS_CMD_RELEASECAPTUREBUFFER:
355         {
356             PST_DMS_RELEASECAPTUREBUF ptr = (PST_DMS_RELEASECAPTUREBUF)pArgs;
357             ptr->eReturnValue = psDMSInstPri->fpDMSReleaseCaptureBuf(pInstance, ptr->u32WindowID, ptr->pstCaptureInfo);
358             u32Return = UTOPIA_STATUS_SUCCESS;
359             break;
360         }
361         default:
362             printf("[%s] out of DMS cmd:%td\n",__FUNCTION__,(ptrdiff_t)u32Cmd);
363             break;
364     };
365 
366 	return u32Return;
367 }
368 
DMSClose(void * pInstance)369 MS_U32 DMSClose(void* pInstance)
370 {
371 	UtopiaInstanceDelete(pInstance);
372 
373 	return TRUE;
374 }
375 
376 
377