xref: /utopia/UTPA2-700.0.x/modules/mfe/api/mfe_ex/apiMFE_v2.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 
2 
3 #include "string.h"
4 #include "MsTypes.h"
5 #include <stdio.h>
6 #include "utopia_dapi.h"
7 #include "MsOS.h"
8 
9 #include "utopia.h"
10 
11 #include "apiMFE_priv.h"
12 #include "apiMFE_v2.h"
13 
14 #include "MFE_chip.h"
15 #include "mfe_type.h"
16 #include "mfe_common.h"
17 #include "madp_ms_dprintf.h"
18 #include "mdrv_mfe_io.h"
19 #include "drv_mfe_st.h"
20 #include "madp_mfe.h"
21 #include "apiVOIPMFE.h"
22 
23 
24 
25 
26 enum
27 {
28     MFE_POOL_ID_MFE0=0,
29     MFE_POOL_ID_MFE_MAX
30 } eMfePoolID;
31 
32 
33 
34 // this func will be call to init by utopia20 framework
MFERegisterToUtopia(FUtopiaOpen ModuleType)35 void MFERegisterToUtopia(FUtopiaOpen ModuleType)
36 {
37     void* pModuleMFE_V2 = NULL;
38     printf("MFERegisterToUtopia\n");
39     // 1. deal with module
40     UtopiaModuleCreate(MODULE_MFE, 4, &pModuleMFE_V2);
41     UtopiaModuleRegister(pModuleMFE_V2);
42     // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
43     UtopiaModuleSetupFunctionPtr(pModuleMFE_V2,
44                                     (FUtopiaOpen)MFEOpen,
45                                     (FUtopiaClose)MFEClose,
46                                     (FUtopiaIOctl)MFEIoctl);
47 
48     // 2. deal with resource
49     void* psResource = NULL;
50     UtopiaModuleAddResourceStart(pModuleMFE_V2, MFE_POOL_ID_MFE0);
51     UtopiaResourceCreate("MFE", sizeof(MFE_RESOURCE_PRIVATE), &psResource);
52     UtopiaResourceRegister(pModuleMFE_V2, psResource, MFE_POOL_ID_MFE0);
53     UtopiaModuleAddResourceEnd(pModuleMFE_V2, MFE_POOL_ID_MFE0);
54 
55     //init Instance number
56     MFE_RESOURCE_PRIVATE* pMFE_ResourcePrivate;
57     UtopiaResourceGetPrivate(psResource,(void*)(&pMFE_ResourcePrivate));
58     pMFE_ResourcePrivate->sAliveInstance = 0;
59 }
60 
MFEOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)61 MS_U32 MFEOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
62 {
63     MFE_INSTANCE_PRIVATE* psMFE_InstPri = NULL;
64     printf("MFEOpen\n");
65     //Create instance
66     UtopiaInstanceCreate(sizeof(MFE_INSTANCE_PRIVATE), ppInstance);
67     UtopiaInstanceGetPrivate(*ppInstance, (void**)&psMFE_InstPri);
68 
69     psMFE_InstPri->fpMFEInit = (IOCTL_MFE_INIT)_MApi_MFE_Init;
70     psMFE_InstPri->fpMFEEncode = (IOCTL_MFE_ENCODE)_MApi_MFE_Encode;
71     psMFE_InstPri->fpMFEGetVOL = (IOCTL_MFE_GETVOL)_MApi_MFE_GetVOL;
72     psMFE_InstPri->fpMFECompressOnePicture = (IOCTL_MFE_COMPRESSONEPICTURE)_MApi_MFE_CompressOnePicture;
73     psMFE_InstPri->fpMFEDeInit = (IOCTL_MFE_DEINIT)_MApi_MFE_DeInit;
74     psMFE_InstPri->fpMFEPowerOff = (IOCTL_MFE_POWEROFF)_MApi_MFE_PowerOff;
75 
76     psMFE_InstPri->fpMFEGetOBuf = (IOCTL_MFE_GETOBUF)_MApi_MFE_GetOBuf;
77 
78     psMFE_InstPri->fpMFESetBitrateFramerate = (IOCTL_MFE_SETBITRATE_FRAMERATE)_MApi_MFE_SetBitrateFramerate;
79     psMFE_InstPri->fpMFESetColorFormat = (IOCTL_MFE_SETCOLORFORMAT)_MApi_MFE_SetColorFormat;
80     psMFE_InstPri->fpMFESetISR = (IOCTL_MFE_SETISR) _MApi_MFE_ISREnable;
81     psMFE_InstPri->fpMFEResetSPSPPS = (IOCTL_MFE_RESETSPSPPS)_MApi_MFE_ResetSPSPPS;
82     psMFE_InstPri->fpMFESetFrameType = (IOCTL_MFE_SETFRAMETYPE)_MApi_MFE_SetFrameType;
83     psMFE_InstPri->fpMFEGetHWCap = (IOCTL_MFE_GETHWCAP)_MApi_MFE_GetHWCap;
84     psMFE_InstPri->fpMFEGetOutputInfo = (IOCTL_MFE_GETOUTPUT_INFO)_MApi_MFE_GetOutputInfo;
85     psMFE_InstPri->fpMFESetVUI = (IOCTL_MFE_SETVUI)_MApi_MFE_SetVUI;
86     return UTOPIA_STATUS_SUCCESS;
87 }
88 
89 
MFEIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)90 MS_U32 MFEIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
91 {
92     MFE_INSTANCE_PRIVATE* psMFE_InstPri = NULL;
93     UtopiaInstanceGetPrivate(pInstance, (void*)&psMFE_InstPri);
94     E_MFE_V2_IOCTL_CMD IOcmd = (E_MFE_V2_IOCTL_CMD)u32Cmd;
95     MS_U32 ret = UTOPIA_STATUS_SUCCESS;
96 
97     void* pResource = NULL;
98     void* pModule = NULL;
99     UtopiaInstanceGetModule(pInstance, &pModule);
100     if(UtopiaResourceObtain(pModule, MFE_POOL_ID_MFE0, &pResource) != UTOPIA_STATUS_SUCCESS)
101     {
102         printf("UtopiaResourceObtain fail,%s,%d\n",__FUNCTION__,__LINE__);
103         return UTOPIA_STATUS_ERR_RESOURCE;
104     }
105 
106     switch(IOcmd)
107     {
108         case MApi_CMD_MFE_Init:
109             {
110                 PMFE_INIT_PARAM pInit = NULL;
111                 pInit = (PMFE_INIT_PARAM)pArgs;
112                 if (pInit->mfe_Info->mfe_state != MFE_Invalid &&
113                     pInit->mfe_Info->mfe_state != MFE_DeInit  &&
114                     pInit->mfe_Info->mfe_state != MFE_ReInit)
115                 {
116                     printf("Incorrect state for initialization.\n");
117                     ret = UTOPIA_STATUS_ERR_STATE;
118                     break;
119                 }
120 
121                 MFE_RESOURCE_PRIVATE* pMFE_ResourcePrivate;
122                 UtopiaResourceGetPrivate(pResource,(void*)(&pMFE_ResourcePrivate));
123                 pMFE_ResourcePrivate->sAliveInstance += 1;
124                 printf("MFEOpen sAliveInstance = %d\n", (MS_S16)pMFE_ResourcePrivate->sAliveInstance);
125                 printf("MApi_CMD_MFE_Init\n");
126                 printf("MApi_CMD_MFE_Init, pInit=%p\n",pInit);
127                 pInit->retVal = psMFE_InstPri->fpMFEInit(pInit->mfe_Info);
128                 if(pInit->retVal == FALSE)
129                     ret = UTOPIA_STATUS_FAIL;
130                 break;
131             }
132         case MApi_CMD_MFE_Encode:
133             {
134                 PMFE_INIT_PARAM pInit = NULL;
135                 pInit = (PMFE_INIT_PARAM)pArgs;
136                 pInit->retVal = psMFE_InstPri->fpMFEEncode(pInit->mfe_Info);
137                 if(pInit->retVal == FALSE)
138                     ret = UTOPIA_STATUS_FAIL;
139                 break;
140             }
141         case MApi_CMD_MFE_GetVOL:
142             {
143                 PMFE_GETVOL_PARAM pGetVOL = NULL;
144                 pGetVOL = (PMFE_GETVOL_PARAM)pArgs;
145                 pGetVOL->retVal = psMFE_InstPri->fpMFEGetVOL(pGetVOL->mfe_Info,pGetVOL->header_info);
146                 if(pGetVOL->retVal == FALSE)
147                     ret = UTOPIA_STATUS_FAIL;
148                 break;
149             }
150         case MApi_CMD_MFE_CompressOnePicture:
151             {
152                 PMFE_COMPRESSONEPICTURE_PARAM pCompressOnePicture = NULL;
153                 pCompressOnePicture = (PMFE_COMPRESSONEPICTURE_PARAM)pArgs;
154                 pCompressOnePicture->retVal =
155                     psMFE_InstPri->fpMFECompressOnePicture(pCompressOnePicture->mfe_Info,pCompressOnePicture->YUVPlane,pCompressOnePicture->bForceIframe);
156                 if(pCompressOnePicture->retVal == FALSE)
157                     ret = UTOPIA_STATUS_FAIL;
158                 break;
159             }
160         case MApi_CMD_MFE_DeInit:
161             {
162                 PMFE_INIT_PARAM pInit = NULL;
163                 pInit = (PMFE_INIT_PARAM)pArgs;
164                 pInit->retVal = psMFE_InstPri->fpMFEDeInit(pInit->mfe_Info);
165                 if(pInit->retVal == FALSE)
166                     ret = UTOPIA_STATUS_FAIL;
167                 break;
168             }
169         case MApi_CMD_MFE_PowerOff:
170             {
171                 PMFE_INIT_PARAM pInit = NULL;
172                 pInit = (PMFE_INIT_PARAM)pArgs;
173                 pInit->retVal = psMFE_InstPri->fpMFEPowerOff(pInit->mfe_Info);
174                 if(pInit->retVal == FALSE)
175                     ret = UTOPIA_STATUS_FAIL;
176                 break;
177             }
178         case MApi_CMD_MFE_GetOutBuffer:
179             {
180                 PMFE_GET_OBUF_PARAM pGetOBuf = NULL;
181                 pGetOBuf = (PMFE_GET_OBUF_PARAM)pArgs;
182                 pGetOBuf->retVal = psMFE_InstPri->fpMFEGetOBuf(pGetOBuf->mfe_Info,pGetOBuf->outbuf);
183                 if(pGetOBuf->retVal == FALSE)
184                     ret = UTOPIA_STATUS_FAIL;
185                 break;
186             }
187         case MApi_CMD_MFE_GetHWCap:
188             {
189                 PMFE_GET_HWCAP_PARAM pGetHWCap = NULL;
190                 pGetHWCap = (PMFE_GET_HWCAP_PARAM)pArgs;
191                 pGetHWCap->retVal = psMFE_InstPri->fpMFEGetHWCap(pGetHWCap->mfe_Info,pGetHWCap->pDrv, pGetHWCap->HwCap_len);
192                 if(pGetHWCap->retVal == FALSE)
193                     ret = UTOPIA_STATUS_FAIL;
194                 break;
195             }
196         case MApi_CMD_MFE_SetBitrateFramerate:
197             {
198                 PMFE_INIT_PARAM pSet = NULL;
199                 pSet = (PMFE_INIT_PARAM)pArgs;
200                 pSet->retVal = psMFE_InstPri->fpMFESetBitrateFramerate(pSet->mfe_Info);
201                 if(pSet->retVal == FALSE)
202                     ret = UTOPIA_STATUS_FAIL;
203                 break;
204             }
205         case MApi_CMD_MFE_SetColorFormat:
206             {
207                 PMFE_INIT_PARAM pSet = NULL;
208                 pSet = (PMFE_INIT_PARAM)pArgs;
209                 pSet->retVal = psMFE_InstPri->fpMFESetColorFormat(pSet->mfe_Info);
210                 if(pSet->retVal == FALSE)
211                     ret = UTOPIA_STATUS_FAIL;
212                 break;
213             }
214         case MApi_CMD_MFE_SetISR:
215             {
216                 PMFE_INIT_PARAM pSet = NULL;
217                 pSet = (PMFE_INIT_PARAM)pArgs;
218                 pSet->retVal = psMFE_InstPri->fpMFESetISR(pSet->mfe_Info);
219                 if(pSet->retVal == FALSE)
220                     ret = UTOPIA_STATUS_FAIL;
221                 break;
222             }
223         case MApi_CMD_MFE_ResetSPSPPS:
224             {
225                 PMFE_INIT_PARAM pSet = NULL;
226                 pSet = (PMFE_INIT_PARAM)pArgs;
227                 pSet->retVal = psMFE_InstPri->fpMFEResetSPSPPS(pSet->mfe_Info);
228                 if(pSet->retVal == FALSE)
229                     ret = UTOPIA_STATUS_FAIL;
230                 break;
231             }
232         case MApi_CMD_MFE_SetFrameType:
233             {
234                 PMFE_SET_PARAM pSet = NULL;
235                 pSet = (PMFE_SET_PARAM)pArgs;
236                 pSet->retVal = psMFE_InstPri->fpMFESetFrameType(pSet->mfe_Info,pSet->frametype);
237                 if(pSet->retVal == FALSE)
238                     ret = UTOPIA_STATUS_FAIL;
239                 break;
240             }
241         case MApi_CMD_MFE_GetOutputInfo:
242             {
243                 PMFE_GETOUTPUT_PARAM pSet = NULL;
244                 pSet = (PMFE_GETOUTPUT_PARAM)pArgs;
245                 pSet->retVal = psMFE_InstPri->fpMFEGetOutputInfo(pSet->mfe_Info, &pSet->frametype, &pSet->size);
246                 if(pSet->retVal == FALSE)
247                     ret = UTOPIA_STATUS_FAIL;
248                 break;
249             }
250         case MApi_CMD_MFE_SetVUI:
251             {
252                 PMFE_SETVUI_PARAM pSet = NULL;
253                 VUI_Info vui_info;
254 
255                 pSet = (PMFE_SETVUI_PARAM)pArgs;
256                 vui_info.level = pSet->setLevel;
257                 vui_info.aspect_ratio_info_present_flag = pSet->setVUI_aspect_ratio_info_present_flag;
258                 vui_info.aspect_ratio_idc = pSet->setVUI_aspect_ratio_idc;
259                 vui_info.sar_width = pSet->setVUI_sar_width;
260                 vui_info.sar_height = pSet->setVUI_sar_height;
261 
262                 pSet->retVal = psMFE_InstPri->fpMFESetVUI(pSet->mfe_Info, &vui_info);
263                 if(pSet->retVal == FALSE)
264                     ret = UTOPIA_STATUS_FAIL;
265                 break;
266             }
267         case MApi_CMD_MFE_GetConfig:
268             {
269                 PMFE_GET_CONFIG_PARAM pParam = (PMFE_GET_CONFIG_PARAM)pArgs;
270                 if (NULL == pParam) {
271                     ret = UTOPIA_STATUS_FAIL;
272                 } else {
273                     pParam->retVal = MApi_MFE_GetConfig(MFE_ENC_GETCONF_CONFIG, pParam->mfe_Info);
274                 }
275                 break;
276             }
277         default:
278             ret = UTOPIA_STATUS_NOT_SUPPORTED;
279             printf("Error Command = %u\n", (MS_U16)u32Cmd);
280             break;
281 
282     }
283 
284     UtopiaResourceRelease(pResource);
285     return ret;
286 }
MFEClose(void * pInstance)287 MS_U32 MFEClose(void* pInstance)
288 {
289     void* pResource = NULL;
290     void* pModule = NULL;
291     UtopiaInstanceGetModule(pInstance, &pModule);
292     if(UtopiaResourceObtain(pModule, MFE_POOL_ID_MFE0, &pResource) != UTOPIA_STATUS_SUCCESS)
293     {
294         printf("UtopiaResourceObtain fail,%s,%d\n",__FUNCTION__,__LINE__);
295         return UTOPIA_STATUS_ERR_RESOURCE;
296     }
297     MFE_RESOURCE_PRIVATE* pMFE_ResourcePrivate;
298     UtopiaResourceGetPrivate(pResource,(void*)(&pMFE_ResourcePrivate));
299     pMFE_ResourcePrivate->sAliveInstance -= 1;
300     if(pMFE_ResourcePrivate->sAliveInstance < 0) {
301         printf("[ERROR]MFEClose sAliveInstance = %d, %s, %d\n",
302             (MS_S16)pMFE_ResourcePrivate->sAliveInstance, __FUNCTION__, __LINE__);
303         UtopiaResourceRelease(pResource);
304         return UTOPIA_STATUS_ERR_RESOURCE;
305     } else if(pMFE_ResourcePrivate->sAliveInstance == 0) {
306         MFE_INSTANCE_PRIVATE* psMFE_InstPri = NULL;
307         UtopiaInstanceGetPrivate(pInstance, (void*)&psMFE_InstPri);
308         psMFE_InstPri->fpMFEPowerOff(NULL);
309         printf("power off MFE HW\n");
310     }
311     printf("MFEClose sAliveInstance = %d\n", (MS_S16)pMFE_ResourcePrivate->sAliveInstance);
312     UtopiaResourceRelease(pResource);
313 
314     UtopiaInstanceDelete(pInstance);
315     return UTOPIA_STATUS_SUCCESS;
316 }
317 
318 
MFE_Open(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)319 MS_U32 MFE_Open(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
320 {
321     if (!ppInstance)
322         return UTOPIA_STATUS_PARAMETER_ERROR;
323 
324    return UtopiaOpen(MODULE_MFE, ppInstance, u32ModuleVersion, pAttribute);
325 }
326 
327 
MFE_Close(void * pInstance)328 MS_U32 MFE_Close(void* pInstance)
329 {
330     if (!pInstance)
331         return UTOPIA_STATUS_PARAMETER_ERROR;
332 
333     return UtopiaClose(pInstance);
334 }
335 
336 
MFE_Ioctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)337 MS_U32 MFE_Ioctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
338 {
339     if (!pInstance || !pArgs)
340         return UTOPIA_STATUS_PARAMETER_ERROR;
341 
342     return UtopiaIoctl(pInstance, u32Cmd, pArgs);
343 }
344