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_Basecomponent.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *             Yunji Kim (yunji.kim@samsung.com)
2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version    2.0.0
2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *    2012.02.20 : Create
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <unistd.h>
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Resourcemanager.h"
4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_BASE_COMP"
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
4638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* Change CHECK_SIZE_VERSION Macro */
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Check_SizeVersion(OMX_PTR header, OMX_U32 size)
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_VERSIONTYPE* version = NULL;
5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (header == NULL) {
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    version = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32));
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (*((OMX_U32*)header) != size) {
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (version->s.nVersionMajor != VERSIONMAJOR_NUMBER ||
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        version->s.nVersionMinor != VERSIONMINOR_NUMBER) {
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorVersionMismatch;
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetComponentVersion(
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE   hComponent,
7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_STRING       pComponentName,
7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_VERSIONTYPE *pComponentVersion,
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_VERSIONTYPE *pSpecVersion,
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_UUIDTYPE    *pComponentUUID)
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   compUUID[3];
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* check parameters */
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent     == NULL ||
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pComponentName == NULL || pComponentVersion == NULL ||
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSpecVersion   == NULL || pComponentUUID    == NULL) {
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pComponentName, pExynosComponent->componentName);
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memcpy(pComponentVersion, &(pExynosComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memcpy(pSpecVersion, &(pExynosComponent->specVersion), sizeof(OMX_VERSIONTYPE));
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Fill UUID with handle address, PID and UID.
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang     * This should guarantee uiniqness */
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    compUUID[0] = (OMX_U32)pOMXComponent;
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    compUUID[1] = getpid();
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    compUUID[2] = getuid();
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memcpy(*pComponentUUID, compUUID, 3 * sizeof(*compUUID));
12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetState (
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_STATETYPE *pState)
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pState == NULL) {
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    *pState = pExynosComponent->currentState;
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 messageParam)
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_STATETYPE             destState = messageParam;
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_STATETYPE             currentState = pExynosComponent->currentState;
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                   countValue = 0;
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int              i = 0, j = 0;
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int                       k = 0;
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* check parameters */
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (currentState == destState) {
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang         ret = OMX_ErrorSameState;
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (currentState == OMX_StateInvalid) {
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((currentState == OMX_StateLoaded) && (destState == OMX_StateIdle)) {
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Get_Resource(pOMXComponent);
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
1946201909bad11eab8339ec8dbef4d0152231308afDima Zavin            Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent);
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (((currentState == OMX_StateIdle) && (destState == OMX_StateLoaded))       ||
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((currentState == OMX_StateIdle) && (destState == OMX_StateInvalid))      ||
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((currentState == OMX_StateExecuting) && (destState == OMX_StateInvalid)) ||
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((currentState == OMX_StatePause) && (destState == OMX_StateInvalid))) {
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_Release_Resource(pOMXComponent);
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2050996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d currentState: %d", destState, currentState);
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (destState) {
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StateInvalid:
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateWaitForResources:
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OMX_Out_WaitForResource(pOMXComponent);
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateIdle:
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateExecuting:
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StatePause:
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateLoaded:
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateInvalid;
21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
22238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
22538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
22638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
22838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pExynosPort[i].hPortMutex = NULL;
23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pauseEvent = NULL;
23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].pauseEvent = NULL;
23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
240d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim                        Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
24138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
24238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
24738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pExynosPort[i].bufferSemID = NULL;
24838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
24938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->exynos_codec_componentTerminate != NULL)
25038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInvalidState;
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInvalidState;
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StateLoaded:
26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateIdle:
26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
26638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pExynosPort[i].hPortMutex = NULL;
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pauseEvent = NULL;
28038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].pauseEvent = NULL;
28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
285d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim                        Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
28838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->pExynosPort[i].bufferSemID = NULL;
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < (pExynosComponent->portParam.nPorts); i++) {
29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort = (pExynosComponent->pExynosPort + i);
29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        if (message != NULL)
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            Exynos_OSAL_Free(message);
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = pExynosComponent->exynos_FreeTunnelBuffer(pExynosPort, i);
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (OMX_ErrorNone != ret) {
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        goto EXIT;
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (CHECK_PORT_ENABLED(pExynosPort)) {
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosPort->portDefinition.bPopulated = OMX_FALSE;
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateLoaded;
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateWaitForResources:
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = Exynos_OMX_Out_WaitForResource(pOMXComponent);
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateLoaded;
32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateExecuting:
32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StatePause:
32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StateIdle:
33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateLoaded:
33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort = (pExynosComponent->pExynosPort + i);
33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (pExynosPort == NULL) {
33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorBadParameter;
33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    goto EXIT;
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (CHECK_PORT_ENABLED(pExynosPort)) {
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        ret = pExynosComponent->exynos_AllocateTunnelBuffer(pExynosPort, i);
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        if (ret!=OMX_ErrorNone)
34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            goto EXIT;
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (CHECK_PORT_ENABLED(pExynosPort)) {
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[i].loadedResource);
347d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim                        if (pExynosComponent->abendState == OMX_TRUE) {
348d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim                            Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent);
349d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim                            ret = Exynos_OMX_Release_Resource(pOMXComponent);
350d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim                            goto EXIT;
351d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim                        }
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosPort->portDefinition.bPopulated = OMX_TRUE;
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = pExynosComponent->exynos_codec_componentInit(pOMXComponent);
35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (ret != OMX_ErrorNone) {
35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /*
35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                 */
3610996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin                Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent);
3620996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin                Exynos_OMX_Release_Resource(pOMXComponent);
36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SignalCreate(&pExynosComponent->pauseEvent);
36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].pauseEvent);
37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE)
37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->pExynosPort[i].bufferSemID);
37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (ret != OMX_ErrorNone) {
37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorInsufficientResources;
37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    goto EXIT;
38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < ALL_PORT_NUM; i++) {
38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (ret != OMX_ErrorNone) {
38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret = OMX_ErrorInsufficientResources;
38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        goto EXIT;
38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (ret != OMX_ErrorNone) {
39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret = OMX_ErrorInsufficientResources;
39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        goto EXIT;
39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (ret != OMX_ErrorNone) {
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret = OMX_ErrorInsufficientResources;
40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        goto EXIT;
40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].hPortMutex);
40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (ret != OMX_ErrorNone) {
40620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorInsufficientResources;
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    goto EXIT;
40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = pExynosComponent->exynos_BufferProcessCreate(pOMXComponent);
41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (ret != OMX_ErrorNone) {
41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /*
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                 */
41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pauseEvent = NULL;
41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else {
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    for (i = 0; i < ALL_PORT_NUM; i++) {
42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].pauseEvent = NULL;
42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
424d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim                            Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        }
42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosComponent->pExynosPort[i].hPortMutex = NULL;
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pExynosComponent->pExynosPort[i].bufferSemID = NULL;
44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorInsufficientResources;
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateIdle;
45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateExecuting:
45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StatePause:
45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OMX_BufferFlushProcess(pOMXComponent, ALL_PORT_INDEX, OMX_FALSE);
45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateIdle;
45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateWaitForResources:
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateIdle;
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StateExecuting:
46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateLoaded:
46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateIdle:
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort = &pExynosComponent->pExynosPort[i];
47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    for (j = 0; j < pExynosPort->tunnelBufferNum; j++) {
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->transientState = EXYNOS_OMX_TransStateMax;
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateExecuting;
48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StatePause:
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort = &pExynosComponent->pExynosPort[i];
49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    OMX_S32 semaValue = 0, cnt = 0;
49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &semaValue);
49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > semaValue) {
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        cnt = Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) - semaValue;
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        for (k = 0; k < cnt; k++) {
49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        }
50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateExecuting;
50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                for (i = 0; i < ALL_PORT_NUM; i++) {
51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateWaitForResources:
51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StatePause:
52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateLoaded:
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateIdle:
52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StatePause;
52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateExecuting:
53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StatePause;
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateWaitForResources:
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_StateWaitForResources:
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        switch (currentState) {
54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateLoaded:
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = Exynos_OMX_In_WaitForResource(pOMXComponent);
54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->currentState = OMX_StateWaitForResources;
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateIdle:
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StateExecuting:
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        case OMX_StatePause:
55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        default:
55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateTransition;
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateTransition;
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret == OMX_ErrorNone) {
56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->pCallbacks != NULL) {
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->callbackData,
56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            OMX_EventCmdComplete, OMX_CommandStateSet,
56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            destState, NULL);
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__);
57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->pCallbacks != NULL) {
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->callbackData,
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            OMX_EventError, ret, 0, NULL);
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_MessageHandlerThread(OMX_PTR threadData)
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message = NULL;
58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   messageType = 0, portIndex = 0;
59020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (threadData == NULL) {
59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    while (pExynosComponent->bExitMessageHandlerThread == OMX_FALSE) {
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosComponent->msgSemaphoreHandle);
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosComponent->messageQ);
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (message != NULL) {
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            messageType = message->messageType;
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            switch (messageType) {
61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case OMX_CommandStateSet:
61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = Exynos_OMX_ComponentStateSet(pOMXComponent, message->messageParam);
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case OMX_CommandFlush:
61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = Exynos_OMX_BufferFlushProcess(pOMXComponent, message->messageParam, OMX_TRUE);
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case OMX_CommandPortDisable:
61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = Exynos_OMX_PortDisableProcess(pOMXComponent, message->messageParam);
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case OMX_CommandPortEnable:
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = Exynos_OMX_PortEnableProcess(pOMXComponent, message->messageParam);
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case OMX_CommandMarkBuffer:
62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                portIndex = message->messageParam;
62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->pExynosPort[portIndex].markType.hMarkTargetComponent = ((OMX_MARKTYPE *)message->pCmdData)->hMarkTargetComponent;
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->pExynosPort[portIndex].markType.pMarkData            = ((OMX_MARKTYPE *)message->pCmdData)->pMarkData;
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            case (OMX_COMMANDTYPE)EXYNOS_OMX_CommandComponentDeInit:
63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->bExitMessageHandlerThread = OMX_TRUE;
63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            default:
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                break;
63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Free(message);
63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            message = NULL;
63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_ThreadExit(NULL);
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_StateSet(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 destState = nParam;
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 i = 0;
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateLoaded)) {
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->transientState = EXYNOS_OMX_TransStateLoadedToIdle;
65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for(i = 0; i < pExynosComponent->portParam.nPorts; i++) {
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[i].portState = OMX_StateIdle;
65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if ((destState == OMX_StateLoaded) && (pExynosComponent->currentState == OMX_StateIdle)) {
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToLoaded;
66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[i].portState = OMX_StateLoaded;
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateLoaded");
66520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateExecuting)) {
66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->transientState = EXYNOS_OMX_TransStateExecutingToIdle;
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if ((destState == OMX_StateExecuting) && (pExynosComponent->currentState == OMX_StateIdle)) {
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToExecuting;
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateExecuting");
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else if (destState == OMX_StateInvalid) {
67220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[i].portState = OMX_StateInvalid;
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return OMX_ErrorNone;
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortFlush(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE        ret = OMX_ErrorNone;
68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32              portIndex = nParam;
68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U16              i = 0, cnt = 0, index = 0;
68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState == OMX_StateExecuting) ||
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState == OMX_StatePause)) {
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((portIndex != ALL_PORT_INDEX) &&
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang           ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /*********************
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        *    need flush event set ?????
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        **********************/
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        cnt = (portIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for (i = 0; i < cnt; i++) {
70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (portIndex == ALL_PORT_INDEX)
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                index = i;
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            else
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                index = portIndex;
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[index].bIsPortFlushed = OMX_TRUE;
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortEnable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE        ret = OMX_ErrorNone;
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32              portIndex = nParam;
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U16              i = 0, cnt = 0;
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((portIndex != ALL_PORT_INDEX) &&
72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (portIndex == ALL_PORT_INDEX) {
73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[i];
73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (CHECK_PORT_ENABLED(pExynosPort)) {
73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorIncorrectStateOperation;
73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->portState = OMX_StateIdle;
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (CHECK_PORT_ENABLED(pExynosPort)) {
74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->portState = OMX_StateIdle;
74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortDisable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE        ret = OMX_ErrorNone;
76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32              portIndex = nParam;
76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U16              i = 0, cnt = 0;
76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((portIndex != ALL_PORT_INDEX) &&
77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (portIndex == ALL_PORT_INDEX) {
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[i];
77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (!CHECK_PORT_ENABLED(pExynosPort)) {
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorIncorrectStateOperation;
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->portState = OMX_StateLoaded;
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->bIsPortDisabled = OMX_TRUE;
78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
78520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portState = OMX_StateLoaded;
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->bIsPortDisabled = OMX_TRUE;
78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetMarkBuffer(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE        ret = OMX_ErrorNone;
80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32              portIndex = nParam;
80320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U16              i = 0, cnt = 0;
80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nParam >= pExynosComponent->portParam.nPorts) {
80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
80820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
80920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
81020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState == OMX_StateExecuting) ||
81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState == OMX_StatePause)) {
81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
82120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_CommandQueue(
82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMMANDTYPE        Cmd,
82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                nParam,
82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR                pCmdData)
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE    ret = OMX_ErrorNone;
82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE *command = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (command == NULL) {
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    command->messageType  = (OMX_U32)Cmd;
83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    command->messageParam = nParam;
83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    command->pCmdData     = pCmdData;
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosComponent->messageQ, (void *)command);
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != 0) {
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SendCommand(
85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_COMMANDTYPE Cmd,
85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32         nParam,
85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR         pCmdData)
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message = NULL;
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (Cmd) {
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_CommandStateSet :
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandStateSet");
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_StateSet(pExynosComponent, nParam);
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_CommandFlush :
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandFlush");
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_SetPortFlush(pExynosComponent, nParam);
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone)
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_CommandPortDisable :
89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortDisable");
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_SetPortDisable(pExynosComponent, nParam);
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone)
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_CommandPortEnable :
90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortEnable");
90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_SetPortEnable(pExynosComponent, nParam);
90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone)
90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_CommandMarkBuffer :
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandMarkBuffer");
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_SetMarkBuffer(pExynosComponent, nParam);
91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone)
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_CommandQueue(pExynosComponent, Cmd, nParam, pCmdData);
91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetParameter(
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     ComponentParameterStructure)
92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ComponentParameterStructure == NULL) {
95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioInit:
96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoInit:
96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamImageInit:
96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamOtherInit:
96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portParam->nPorts         = 0;
97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portParam->nStartPortNumber     = 0;
97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamPortDefinition:
97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                       portIndex = portDefinition->nPortIndex;
98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT          *pExynosPort;
98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (portIndex >= pExynosComponent->portParam.nPorts) {
98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);
99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamPriorityMgmt:
99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        compPriority->nGroupID       = pExynosComponent->compPriority.nGroupID;
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        compPriority->nGroupPriority = pExynosComponent->compPriority.nGroupPriority;
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamCompBufferSupplier:
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                       portIndex = bufferSupplier->nPortIndex;
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT          *pExynosPort;
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState == OMX_StateLoaded) ||
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->currentState == OMX_StateWaitForResources)) {
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (portIndex >= pExynosComponent->portParam.nPorts) {
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorBadPortIndex;
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (ret != OMX_ErrorNone) {
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        {
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetParameter(
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        ComponentParameterStructure)
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ComponentParameterStructure == NULL) {
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioInit:
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamVideoInit:
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamImageInit:
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamOtherInit:
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) &&
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->currentState != OMX_StateWaitForResources)) {
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* Exynos_OSAL_Memcpy(&pExynosComponent->portParam, portParam, sizeof(OMX_PORT_PARAM_TYPE)); */
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamPortDefinition:
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                       portIndex = portDefinition->nPortIndex;
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT          *pExynosPort;
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (portIndex >= pExynosComponent->portParam.nPorts) {
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorIncorrectStateOperation;
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (portDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, portDefinition, portDefinition->nSize);
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamPriorityMgmt:
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) &&
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->currentState != OMX_StateWaitForResources)) {
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->compPriority.nGroupID = compPriority->nGroupID;
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->compPriority.nGroupPriority = compPriority->nGroupPriority;
117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamCompBufferSupplier:
117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32           portIndex = bufferSupplier->nPortIndex;
118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (portIndex >= pExynosComponent->portParam.nPorts) {
118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
119320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
119520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorIncorrectStateOperation;
119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
120220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyUnspecified) {
120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (CHECK_PORT_TUNNELED(pExynosPort) == 0) {
120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone; /*OMX_ErrorNone ?????*/
120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /*
121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
121520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorNone;
121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                */
121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (pExynosPort->portDefinition.eDir == OMX_DirOutput) {
123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorNone;
123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /*
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorNone;
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                */
124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetConfig(
127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     pComponentConfigStructure)
127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
128520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
128620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
129220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
129320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetConfig(
131820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
131920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
132020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
132120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
132220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
132320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
132720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
132920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
133920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
134720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
135720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
136020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
136520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetExtensionIndex(
136620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_STRING      cParameterName,
136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_INDEXTYPE *pIndexType)
136920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
137320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
137820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
137920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
138220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
138320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
138420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
138520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
138620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
138720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
138820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
139120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
139220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
139320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
139420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
139520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
139620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
139920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
140020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorBadParameter;
140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
140420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
140720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
140920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetCallbacks (
141020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE    hComponent,
141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_CALLBACKTYPE* pCallbacks,
141220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR           pAppData)
141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
141420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
141520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
141820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pCallbacks == NULL) {
143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
143820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
144020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState != OMX_StateLoaded) {
144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->pCallbacks = pCallbacks;
145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->callbackData = pAppData;
145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
145320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
145820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_UseEGLImage(
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE            hComponent,
146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32                   nPortIndex,
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR                   pAppPrivate,
146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN void                     *eglImage)
146620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return OMX_ErrorNotImplemented;
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_BaseComponent_Constructor(
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent)
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
147420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent;
147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
148120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
148520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASECOMPONENT));
148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent == NULL) {
148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent, 0, sizeof(EXYNOS_OMX_BASECOMPONENT));
149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->pComponentPrivate = (OMX_PTR)pExynosComponent;
149320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->msgSemaphoreHandle);
149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
149920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
150020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->compMutex);
150120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
150520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
1506d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    ret = Exynos_OSAL_SignalCreate(&pExynosComponent->abendStateEvent);
1507d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    if (ret != OMX_ErrorNone) {
1508d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        ret = OMX_ErrorInsufficientResources;
1509d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1510d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        goto EXIT;
1511d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    }
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bExitMessageHandlerThread = OMX_FALSE;
151438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_QueueCreate(&pExynosComponent->messageQ, MAX_QUEUE_ELEMENTS);
151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_ThreadCreate(&pExynosComponent->hMessageHandler, Exynos_OMX_MessageHandlerThread, pOMXComponent);
151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
152120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bMultiThreadProcess = OMX_FALSE;
152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->GetComponentVersion = &Exynos_OMX_GetComponentVersion;
152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->SendCommand         = &Exynos_OMX_SendCommand;
152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->GetState            = &Exynos_OMX_GetState;
152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->SetCallbacks        = &Exynos_OMX_SetCallbacks;
152820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->UseEGLImage         = &Exynos_OMX_UseEGLImage;
152920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
153120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_BaseComponent_Destructor(
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent)
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                   semaValue = 0;
154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
155520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
155920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OMX_CommandQueue(pExynosComponent, EXYNOS_OMX_CommandComponentDeInit, 0, NULL);
156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_SleepMillisec(0);
156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->msgSemaphoreHandle, &semaValue);
156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (semaValue == 0)
156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
156820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
156920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_ThreadTerminate(pExynosComponent->hMessageHandler);
157020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->hMessageHandler = NULL;
157120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1572d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    Exynos_OSAL_SignalTerminate(pExynosComponent->abendStateEvent);
1573d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    pExynosComponent->abendStateEvent = NULL;
157420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_MutexTerminate(pExynosComponent->compMutex);
157520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->compMutex = NULL;
157620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_SemaphoreTerminate(pExynosComponent->msgSemaphoreHandle);
157720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->msgSemaphoreHandle = NULL;
157820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_QueueTerminate(&pExynosComponent->messageQ);
157920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
158020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent);
158120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = NULL;
158220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
158320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
158420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
158520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
158620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
158720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
158820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
158920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
159020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1591