120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License. 720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at 820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software 1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and 1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License. 1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file Exynos_OMX_Resourcemanager.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Resourcemanager.h" 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Memory.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_RM" 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define MAX_RESOURCE_VIDEO_DEC 3 /* for Android */ 4325bee067b500484f8b0a1976da0ff672a7eb7e9eDmitry Shmidt#define MAX_RESOURCE_VIDEO_ENC 2 /* for Android */ 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* Max allowable video scheduler component instance */ 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoDecRMComponentList = NULL; 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoDecRMWaitingList = NULL; 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoEncRMComponentList = NULL; 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoEncRMWaitingList = NULL; 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_HANDLETYPE ghVideoRMComponentListMutex = NULL; 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE addElementList(EXYNOS_OMX_RM_COMPONENT_LIST **ppList, OMX_COMPONENTTYPE *pOMXComponent) 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pTempComp = NULL; 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (*ppList != NULL) { 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp = *ppList; 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pTempComp->pNext != NULL) { 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp = pTempComp->pNext; 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp->pNext = (EXYNOS_OMX_RM_COMPONENT_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_RM_COMPONENT_LIST)); 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pTempComp->pNext == NULL) { 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->pNext = NULL; 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->pOMXStandComp = pOMXComponent; 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->groupPriority = pExynosComponent->compPriority.nGroupPriority; 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *ppList = (EXYNOS_OMX_RM_COMPONENT_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_RM_COMPONENT_LIST)); 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (*ppList == NULL) { 7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp = *ppList; 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp->pNext = NULL; 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp->pOMXStandComp = pOMXComponent; 8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp->groupPriority = pExynosComponent->compPriority.nGroupPriority; 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE removeElementList(EXYNOS_OMX_RM_COMPONENT_LIST **ppList, OMX_COMPONENTTYPE *pOMXComponent) 9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pCurrComp = NULL; 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pPrevComp = NULL; 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL bDetectComp = OMX_FALSE; 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (*ppList == NULL) { 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComp = *ppList; 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pCurrComp != NULL) { 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pCurrComp->pOMXStandComp == pOMXComponent) { 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (*ppList == pCurrComp) { 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *ppList = pCurrComp->pNext; 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComp); 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pPrevComp != NULL) 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pPrevComp->pNext = pCurrComp->pNext; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComp); 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bDetectComp = OMX_TRUE; 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pPrevComp = pCurrComp; 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComp = pCurrComp->pNext; 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (bDetectComp == OMX_FALSE) 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorComponentNotFound; 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changint searchLowPriority(EXYNOS_OMX_RM_COMPONENT_LIST *RMComp_list, OMX_U32 inComp_priority, EXYNOS_OMX_RM_COMPONENT_LIST **outLowComp) 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int ret = 0; 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pTempComp = NULL; 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pCandidateComp = NULL; 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (RMComp_list == NULL) 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = -1; 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp = RMComp_list; 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *outLowComp = 0; 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pTempComp != NULL) { 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pTempComp->groupPriority > inComp_priority) { 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pCandidateComp != NULL) { 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pCandidateComp->groupPriority < pTempComp->groupPriority) 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCandidateComp = pTempComp; 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCandidateComp = pTempComp; 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pTempComp = pTempComp->pNext; 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *outLowComp = pCandidateComp; 15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pCandidateComp == NULL) 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 0; 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = 1; 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE removeComponent(OMX_COMPONENTTYPE *pOMXComponent) 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateIdle) { 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pOMXComponent, pExynosComponent->callbackData, 17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, OMX_ErrorResourcesLost, 0, NULL); 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_SendCommand(pOMXComponent, OMX_CommandStateSet, OMX_StateLoaded, NULL); 17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if ((pExynosComponent->currentState == OMX_StateExecuting) || (pExynosComponent->currentState == OMX_StatePause)) { 18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Todo */ 18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ResourceManager_Init() 19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_MutexCreate(&ghVideoRMComponentListMutex); 19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ResourceManager_Deinit() 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pCurrComponent; 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pNextComponent; 20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex); 21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoDecRMComponentList) { 21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = gpVideoDecRMComponentList; 21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pCurrComponent != NULL) { 21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pNextComponent = pCurrComponent->pNext; 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComponent); 21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = pNextComponent; 21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang gpVideoDecRMComponentList = NULL; 22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoDecRMWaitingList) { 22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = gpVideoDecRMWaitingList; 22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pCurrComponent != NULL) { 22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pNextComponent = pCurrComponent->pNext; 22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComponent); 22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = pNextComponent; 22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang gpVideoDecRMWaitingList = NULL; 23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoEncRMComponentList) { 23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = gpVideoEncRMComponentList; 23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pCurrComponent != NULL) { 23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pNextComponent = pCurrComponent->pNext; 23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComponent); 23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = pNextComponent; 23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang gpVideoEncRMComponentList = NULL; 24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoEncRMWaitingList) { 24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = gpVideoEncRMWaitingList; 24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pCurrComponent != NULL) { 24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pNextComponent = pCurrComponent->pNext; 24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pCurrComponent); 24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pCurrComponent = pNextComponent; 24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang gpVideoEncRMWaitingList = NULL; 24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex); 25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexTerminate(ghVideoRMComponentListMutex); 25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ghVideoRMComponentListMutex = NULL; 25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Get_Resource(OMX_COMPONENTTYPE *pOMXComponent) 26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pComponentTemp = NULL; 26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pComponentCandidate = NULL; 26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int numElem = 0; 27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int lowCompDetect = 0; 27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex); 27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) { 27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = gpVideoDecRMComponentList; 28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pComponentTemp != NULL) { 28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pComponentTemp) { 28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem++; 28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = pComponentTemp->pNext; 28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem = 0; 28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (numElem >= MAX_RESOURCE_VIDEO_DEC) { 28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang lowCompDetect = searchLowPriority(gpVideoDecRMComponentList, pExynosComponent->compPriority.nGroupPriority, &pComponentCandidate); 29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (lowCompDetect <= 0) { 29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeComponent(pComponentCandidate->pOMXStandComp); 29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoDecRMComponentList, pComponentCandidate->pOMXStandComp); 30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoDecRMComponentList, pOMXComponent); 30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoDecRMComponentList, pOMXComponent); 30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) { 31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = gpVideoEncRMComponentList; 31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pComponentTemp != NULL) { 31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pComponentTemp) { 31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem++; 31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = pComponentTemp->pNext; 32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem = 0; 32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (numElem >= MAX_RESOURCE_VIDEO_ENC) { 32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang lowCompDetect = searchLowPriority(gpVideoEncRMComponentList, pExynosComponent->compPriority.nGroupPriority, &pComponentCandidate); 32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (lowCompDetect <= 0) { 32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeComponent(pComponentCandidate->pOMXStandComp); 33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoEncRMComponentList, pComponentCandidate->pOMXStandComp); 33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoEncRMComponentList, pOMXComponent); 33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoEncRMComponentList, pOMXComponent); 34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex); 35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Release_Resource(OMX_COMPONENTTYPE *pOMXComponent) 36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_RM_COMPONENT_LIST *pComponentTemp = NULL; 36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXWaitComponent = NULL; 36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int numElem = 0; 36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex); 37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 375f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim 37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) { 37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = gpVideoDecRMWaitingList; 37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoDecRMComponentList == NULL) { 37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoDecRMComponentList, pOMXComponent); 38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pComponentTemp) { 38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem++; 39020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = pComponentTemp->pNext; 39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (numElem > 0) { 39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXWaitComponent = gpVideoDecRMWaitingList->pOMXStandComp; 39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang removeElementList(&gpVideoDecRMWaitingList, pOMXWaitComponent); 39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_SendCommand(pOMXWaitComponent, OMX_CommandStateSet, OMX_StateIdle, NULL); 39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 39820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) { 40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = gpVideoEncRMWaitingList; 40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (gpVideoEncRMComponentList == NULL) { 40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoEncRMComponentList, pOMXComponent); 40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pComponentTemp) { 41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang numElem++; 41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentTemp = pComponentTemp->pNext; 41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (numElem > 0) { 41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXWaitComponent = gpVideoEncRMWaitingList->pOMXStandComp; 41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang removeElementList(&gpVideoEncRMWaitingList, pOMXWaitComponent); 41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_SendCommand(pOMXWaitComponent, OMX_CommandStateSet, OMX_StateIdle, NULL); 42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 42320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex); 42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_In_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent) 43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex); 44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) 44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoDecRMWaitingList, pOMXComponent); 44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) 44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = addElementList(&gpVideoEncRMWaitingList, pOMXComponent); 44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex); 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Out_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent) 45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex); 46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) 46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoDecRMWaitingList, pOMXComponent); 46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) 47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = removeElementList(&gpVideoEncRMWaitingList, pOMXComponent); 47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex); 47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 479