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