OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComponent) { OMX_ERRORTYPE ret = OMX_ErrorNone; EXYNOS_OMX_COMPONENT *currentComponent = NULL; EXYNOS_OMX_COMPONENT *deleteComponent = NULL; FunctionIn(); if ((gInitialized != 1) || (gLoadComponentList == NULL)) { ret = OMX_ErrorNotReady; goto EXIT; } if (!hComponent) { ret = OMX_ErrorBadParameter; goto EXIT; } Exynos_OSAL_MutexLock(ghLoadComponentListMutex); if (gLoadComponentList->pOMXComponent == hComponent) { deleteComponent = gLoadComponentList; gLoadComponentList = gLoadComponentList->nextOMXComp; } else { currentComponent = gLoadComponentList; while ((currentComponent != NULL) && (currentComponent->nextOMXComp != NULL)) { if (currentComponent->nextOMXComp->pOMXComponent == hComponent) { deleteComponent = currentComponent->nextOMXComp; currentComponent->nextOMXComp = deleteComponent->nextOMXComp; break; } currentComponent = currentComponent->nextOMXComp; } if (deleteComponent == NULL) { ret = OMX_ErrorComponentNotFound; Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex); goto EXIT; } } Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex); Exynos_OMX_ComponentUnload(deleteComponent); Exynos_OSAL_Free(deleteComponent); EXIT: FunctionOut(); return ret; }
OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_GetHandle( OMX_OUT OMX_HANDLETYPE *pHandle, OMX_IN OMX_STRING cComponentName, OMX_IN OMX_PTR pAppData, OMX_IN OMX_CALLBACKTYPE *pCallBacks) { OMX_ERRORTYPE ret = OMX_ErrorNone; EXYNOS_OMX_COMPONENT *loadComponent; EXYNOS_OMX_COMPONENT *currentComponent; unsigned int i = 0; FunctionIn(); if (gInitialized != 1) { ret = OMX_ErrorNotReady; goto EXIT; } if ((pHandle == NULL) || (cComponentName == NULL) || (pCallBacks == NULL)) { ret = OMX_ErrorBadParameter; goto EXIT; } Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ComponentName : %s", cComponentName); for (i = 0; i < gComponentNum; i++) { if (Exynos_OSAL_Strcmp(cComponentName, gComponentList[i].component.componentName) == 0) { loadComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_COMPONENT)); Exynos_OSAL_Memset(loadComponent, 0, sizeof(EXYNOS_OMX_COMPONENT)); Exynos_OSAL_Strcpy(loadComponent->libName, gComponentList[i].libName); Exynos_OSAL_Strcpy(loadComponent->componentName, gComponentList[i].component.componentName); ret = Exynos_OMX_ComponentLoad(loadComponent); if (ret != OMX_ErrorNone) { Exynos_OSAL_Free(loadComponent); Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); goto EXIT; } ret = loadComponent->pOMXComponent->SetCallbacks(loadComponent->pOMXComponent, pCallBacks, pAppData); if (ret != OMX_ErrorNone) { Exynos_OMX_ComponentUnload(loadComponent); Exynos_OSAL_Free(loadComponent); Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); goto EXIT; } Exynos_OSAL_MutexLock(ghLoadComponentListMutex); if (gLoadComponentList == NULL) { gLoadComponentList = loadComponent; } else { currentComponent = gLoadComponentList; while (currentComponent->nextOMXComp != NULL) { currentComponent = currentComponent->nextOMXComp; } currentComponent->nextOMXComp = loadComponent; } Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex); *pHandle = loadComponent->pOMXComponent; ret = OMX_ErrorNone; Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_OMX_GetHandle : %s", "OMX_ErrorNone"); goto EXIT; } } ret = OMX_ErrorComponentNotFound; EXIT: FunctionOut(); return ret; }