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