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_Adec.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author      Yunji Kim (yunji.kim@samsung.com)
2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @version     1.1.0
2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *   2012.02.28 : Create
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h"
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Adec.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "srp_api.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_AUDIO_DEC"
4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_UseBuffer(
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE            hComponent,
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32                   nPortIndex,
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR                   pAppPrivate,
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32                   nSizeBytes,
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U8                   *pBuffer)
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE     *temp_bufferHeader = NULL;
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   i = 0;
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosPort->portState != OMX_StateIdle) {
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (temp_bufferHeader == NULL) {
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
10338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->pBuffer        = pBuffer;
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->nAllocLen      = nSizeBytes;
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->pAppPrivate    = pAppPrivate;
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (nPortIndex == INPUT_PORT_INDEX)
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            else
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->assignedBufferNum++;
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            *ppBufferHdr = temp_bufferHeader;
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(temp_bufferHeader);
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorInsufficientResources;
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE            hComponent,
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32                   nPortIndex,
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR                   pAppPrivate,
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32                   nSizeBytes)
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE     *temp_bufferHeader = NULL;
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8                   *temp_buffer = NULL;
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   i = 0;
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosPort->portState != OMX_StateIdle ) {
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang*/
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (temp_buffer == NULL) {
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (temp_bufferHeader == NULL) {
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(temp_buffer);
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        temp_buffer = NULL;
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
20238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->pBuffer        = temp_buffer;
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->nAllocLen      = nSizeBytes;
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            temp_bufferHeader->pAppPrivate    = pAppPrivate;
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (nPortIndex == INPUT_PORT_INDEX)
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            else
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->assignedBufferNum++;
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            *ppBuffer = temp_bufferHeader;
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(temp_bufferHeader);
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(temp_buffer);
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorInsufficientResources;
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeBuffer(
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32        nPortIndex,
23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE     *temp_bufferHeader = NULL;
24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8                   *temp_buffer = NULL;
24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   i = 0;
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosComponent->callbackData,
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        (OMX_U32)OMX_EventError,
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        (OMX_U32)OMX_ErrorPortUnpopulated,
27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        nPortIndex, NULL);
27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pBufferHdr->pBuffer = NULL;
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ; /* None*/
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->assignedBufferNum--;
29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
29238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pBufferHdr = NULL;
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret == OMX_ErrorNone) {
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosPort->assignedBufferNum == 0) {
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort->portDefinition.bPopulated = OMX_FALSE;
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;
32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;
32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8                       *temp_buffer = NULL;
32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                       bufferSize = 0;
32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;
32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U8 *temp_buffer = NULL;
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32 bufferSize = 0;
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComp,
34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32        nPort,
34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hTunneledComp,
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_U32        nTunneledPort,
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState == OMX_StateExecuting) &&
36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portState == OMX_StateIdle) &&
36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portState == OMX_StateIdle) &&
36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_TRUE;
36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        return OMX_FALSE;
37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *dataBuffer = &exynosOMXInputPort->way.port1WayDataBuffer.dataBuffer;
38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = dataBuffer->bufferHeader;
38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bufferHeader != NULL) {
38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            exynosOMXInputPort->markType.pMarkData = NULL;
39020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (bufferHeader->hMarkTargetComponent != NULL) {
39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                pExynosComponent->callbackData,
39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                OMX_EventMark,
39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                0, 0, bufferHeader->pMarkData);
39820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nFilledLen = 0;
40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
40620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState == OMX_StatePause) &&
40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->dataValid     = OMX_FALSE;
41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->dataLen       = 0;
41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->remainDataLen = 0;
41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->usedDataLen   = 0;
41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->bufferHeader  = NULL;
41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->nFlags        = 0;
42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->timeStamp     = 0;
42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
42320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE    *message = NULL;
43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort= &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState != OMX_StateExecuting) {
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (dataBuffer->dataValid != OMX_TRUE) {
44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (message == NULL) {
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorUndefined;
45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->dataLen = dataBuffer->bufferHeader->nFilledLen;
45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->remainDataLen = dataBuffer->dataLen;
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->usedDataLen = 0;
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->dataValid = OMX_TRUE;
46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags;
46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->timeStamp = dataBuffer->bufferHeader->nTimeStamp;
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Free(message);
46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (dataBuffer->allocSize <= dataBuffer->dataLen)
46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", dataBuffer->allocSize, dataBuffer->dataLen);
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *dataBuffer = &exynosOMXOutputPort->way.port1WayDataBuffer.dataBuffer;
48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = dataBuffer->bufferHeader;
48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (bufferHeader != NULL) {
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bufferHeader->nFilledLen = dataBuffer->remainDataLen;
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bufferHeader->nOffset    = 0;
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bufferHeader->nFlags     = dataBuffer->nFlags;
49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        bufferHeader->nTimeStamp = dataBuffer->timeStamp;
49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->propagateMarkType.pMarkData = NULL;
49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) {
50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventBufferFlag,
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OUTPUT_PORT_INDEX,
50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            bufferHeader->nFlags, NULL);
50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
51120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState == OMX_StatePause) &&
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* reset dataBuffer */
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->dataValid     = OMX_FALSE;
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->dataLen       = 0;
52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->remainDataLen = 0;
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->usedDataLen   = 0;
52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->bufferHeader  = NULL;
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->nFlags        = 0;
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    dataBuffer->timeStamp     = 0;
52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE    *message = NULL;
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort= &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState != OMX_StateExecuting) {
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (dataBuffer->dataValid != OMX_TRUE) {
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (message == NULL) {
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorUndefined;
55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->remainDataLen = dataBuffer->dataLen;
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            dataBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            dataBuffer->dataValid = OMX_TRUE;
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
56738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = dataBuffer->bufferHeader->pBuffer;
56838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->processData.allocSize = dataBuffer->bufferHeader->nAllocLen;
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Free(message);
57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent)
58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL                  ret = OMX_FALSE;
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATA          *inputData = &exynosInputPort->processData;
58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   copySize = 0;
59020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BYTE                  checkInputStream = NULL;
59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   checkInputStreamLen = 0;
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   checkedSize = 0;
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL                  flagEOF = OMX_FALSE;
59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL                  previousFrameEOF = OMX_FALSE;
59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (inputUseBuffer->dataValid == OMX_TRUE) {
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        checkInputStreamLen = inputUseBuffer->remainDataLen;
60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (inputData->dataLen == 0) {
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            previousFrameEOF = OMX_TRUE;
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            previousFrameEOF = OMX_FALSE;
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        /* Audio extractor should parse into frame units. */
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        flagEOF = OMX_TRUE;
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        checkedSize = checkInputStreamLen;
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        copySize = checkedSize;
61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->bSaveFlagEOS = OMX_TRUE;
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (((inputData->allocSize) - (inputData->dataLen)) >= copySize) {
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (copySize > 0)
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Memcpy(inputData->buffer.singlePlaneBuffer.dataBuffer + inputData->dataLen, checkInputStream, copySize);
61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputUseBuffer->dataLen -= copySize;
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputUseBuffer->remainDataLen -= copySize;
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputUseBuffer->usedDataLen += copySize;
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputData->dataLen += copySize;
62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputData->remainDataLen += copySize;
62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (previousFrameEOF == OMX_TRUE) {
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                inputData->timeStamp = inputUseBuffer->timeStamp;
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                inputData->nFlags = inputUseBuffer->nFlags;
63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosComponent->bUseFlagEOF == OMX_TRUE) {
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (pExynosComponent->bSaveFlagEOS == OMX_TRUE) {
63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    inputData->nFlags |= OMX_BUFFERFLAG_EOS;
63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    flagEOF = OMX_TRUE;
63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if ((checkedSize == checkInputStreamLen) && (pExynosComponent->bSaveFlagEOS == OMX_TRUE)) {
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        ((inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ||
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        (inputData->dataLen == 0))) {
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        inputData->nFlags |= OMX_BUFFERFLAG_EOS;
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        flagEOF = OMX_TRUE;
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->bSaveFlagEOS = OMX_FALSE;
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    } else if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                               (!(inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) &&
65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                               (inputData->dataLen != 0)) {
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        flagEOF = OMX_TRUE;
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosComponent->bSaveFlagEOS = OMX_TRUE;
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    }
65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                } else {
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    inputData->nFlags = (inputUseBuffer->nFlags & (~OMX_BUFFERFLAG_EOS));
65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /*????????????????????????????????? Error ?????????????????????????????????*/
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_ResetCodecData(inputData);
66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            flagEOF = OMX_FALSE;
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
66520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((inputUseBuffer->remainDataLen == 0) ||
66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (CHECK_PORT_BEING_FLUSHED(exynosInputPort)))
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_InputBufferReturn(pOMXComponent);
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            inputUseBuffer->dataValid = OMX_TRUE;
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (flagEOF == OMX_TRUE) {
67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* Flush SRP buffers */
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            SRP_Flush();
67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->checkTimeStamp.startTimeStamp = inputData->timeStamp;
67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->checkTimeStamp.nStartFlags = inputData->nFlags;
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                inputData->timeStamp, inputData->timeStamp / 1E6);
68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_TRUE;
68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_FALSE;
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL                  ret = OMX_FALSE;
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATA          *outputData = &exynosOutputPort->processData;
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   copySize = 0;
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (outputUseBuffer->dataValid == OMX_TRUE) {
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pExynosComponent->checkTimeStamp.startTimeStamp == outputData->timeStamp) {
70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_ResetCodecData(outputData);
71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_TRUE;
71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_ResetCodecData(outputData);
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_TRUE;
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (outputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) {
72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            copySize = outputData->remainDataLen;
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            outputUseBuffer->dataLen += copySize;
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            outputUseBuffer->remainDataLen += copySize;
72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            outputUseBuffer->nFlags = outputData->nFlags;
73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            outputUseBuffer->timeStamp = outputData->timeStamp;
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_TRUE;
73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* reset outputData */
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_ResetCodecData(outputData);
73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if ((outputUseBuffer->remainDataLen > 0) ||
73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) ||
73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OutputBufferReturn(pOMXComponent);
74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_FALSE;
74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* reset outputData */
74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_ResetCodecData(outputData);
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_FALSE;
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATA          *inputData = &exynosInputPort->processData;
77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATA          *outputData = &exynosOutputPort->processData;
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                   copySize = 0;
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->reInputData = OMX_FALSE;
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (!pAudioDec->bExitBufferProcessThread) {
77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SleepMillisec(0);
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (((pExynosComponent->currentState == OMX_StatePause) ||
78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->currentState == OMX_StateIdle) ||
78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded)&&
78520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ((!CHECK_PORT_BEING_FLUSHED(exynosInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))) {
78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        while ((Exynos_Check_BufferProcess_State(pExynosComponent)) && (!pAudioDec->bExitBufferProcessThread)) {
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_SleepMillisec(0);
79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if ((outputUseBuffer->dataValid != OMX_TRUE) &&
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = Exynos_OutputBufferGetQueue(pExynosComponent);
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if ((ret == OMX_ErrorUndefined) ||
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    (exynosInputPort->portState != OMX_StateIdle) ||
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    (exynosOutputPort->portState != OMX_StateIdle)) {
80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    break;
80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
80320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
80738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosComponent->reInputData == OMX_FALSE) {
80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if ((Exynos_Preprocessor_InputData(pOMXComponent) == OMX_FALSE) &&
81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
81138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret = Exynos_InputBufferGetQueue(pExynosComponent);
81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        break;
81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                }
81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = pAudioDec->exynos_codec_bufferProcess(pOMXComponent, inputData, outputData);
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (ret == OMX_ErrorInputDataDecodeYet)
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->reInputData = OMX_TRUE;
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            else
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->reInputData = OMX_FALSE;
82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_Postprocess_OutputData(pOMXComponent);
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER **pDataBuffer)
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->portWayType == WAY2_PORT) {
85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *pDataBuffer = NULL;
85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer = NULL;
86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_MESSAGE       *message = NULL;
87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   flushNum = 0;
87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32                   semValue = 0;
87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (semValue == 0)
88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (message != NULL) {
88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->nFilledLen = 0;
88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (portIndex == OUTPUT_PORT_INDEX) {
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Free(message);
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            message = NULL;
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (flushPortBuffer != NULL) {
90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (flushPortBuffer->dataValid == OMX_TRUE) {
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (portIndex == INPUT_PORT_INDEX)
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_InputBufferReturn(pOMXComponent);
90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            else if (portIndex == OUTPUT_PORT_INDEX)
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OutputBufferReturn(pOMXComponent);
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while(1) {
91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_S32 cnt = 0;
91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (cnt <= 0)
91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            break;
91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SetElemNum(&pExynosPort->bufferQ, 0);
91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.dataLen       = 0;
91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.nFlags        = 0;
92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.remainDataLen = 0;
92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.timeStamp     = 0;
92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.usedDataLen   = 0;
92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
92938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
93138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
93438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
93538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
93638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER         *flushPortBuffer = NULL;
93738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                        i = 0, cnt = 0;
93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
94038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
94138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
94238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
94338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
94438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
94538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
94638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
94738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
94838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
94938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
95038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
95138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
95238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
95338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
95438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
95538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
95638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
95738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
95838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
95938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
96038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
96138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
96238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(flushPortBuffer->bufferMutex);
96338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
96438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(flushPortBuffer->bufferMutex);
96538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
96638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
96738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
96838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (bEvent == OMX_TRUE && ret == OMX_ErrorNone) {
96938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
97038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            pExynosComponent->callbackData,
97138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OMX_EventCmdComplete,
97238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OMX_CommandFlush, nPortIndex, NULL);
97338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
97438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
97538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex == INPUT_PORT_INDEX) {
97638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
97738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
97838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
97938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
98038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->getAllDelayBuffer = OMX_FALSE;
98138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->bSaveFlagEOS = OMX_FALSE;
98238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->reInputData = OMX_FALSE;
98338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
98438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
98538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
98638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
98738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
98838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
98938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->callbackData,
99038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        OMX_EventError,
99138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret, 0, NULL);
99238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
99338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
99438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
99538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
99638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
99738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeGetParameter(
100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR     ComponentParameterStructure)
100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ComponentParameterStructure == NULL) {
103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioInit:
103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portParam->nPorts           = pExynosComponent->portParam.nPorts;
104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioPortFormat:
105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         portIndex = portFormat->nPortIndex;
105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         index    = portFormat->nIndex;
105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         supportFormatNum = 0; /* supportFormatNum = N-1 */
105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (portIndex == INPUT_PORT_INDEX) {
107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (index > supportFormatNum) {
107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNoMore;
107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portDefinition = &pExynosPort->portDefinition;
108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portFormat->eEncoding = portDefinition->format.audio.eEncoding;
108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (portIndex == OUTPUT_PORT_INDEX) {
108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (index > supportFormatNum) {
108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNoMore;
108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                goto EXIT;
108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portDefinition = &pExynosPort->portDefinition;
109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portFormat->eEncoding = portDefinition->format.audio.eEncoding;
109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeSetParameter(
111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        ComponentParameterStructure)
111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ComponentParameterStructure == NULL) {
114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioPortFormat:
114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         portIndex = portFormat->nPortIndex;
115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         index    = portFormat->nIndex;
115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_U32                         supportFormatNum = 0; /* supportFormatNum = N-1 */
115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portDefinition = &pExynosPort->portDefinition;
116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        portDefinition->format.audio.eEncoding = portFormat->eEncoding;
117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeGetConfig(
118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE nIndex,
119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR pComponentConfigStructure)
119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
119320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
119420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
119520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
120220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
121520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeSetConfig(
123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_HANDLETYPE hComponent,
123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INDEXTYPE nIndex,
123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR pComponentConfigStructure)
123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
125720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pComponentConfigStructure == NULL) {
126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexConfigAudioMute:
127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioMute");
127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexConfigAudioVolume:
127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioVolume");
128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUnsupportedIndex;
128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
128520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
128620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
129320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeGetExtensionIndex(
129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_STRING      cParameterName,
129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_INDEXTYPE *pIndexType)
129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
131820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
131920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
132020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
132120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
132220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
132320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
132620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
132720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
132820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
132920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
133938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_BufferProcessThread(OMX_PTR threadData)
134038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
134138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
134238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
134338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pSECComponent = NULL;
134438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_MESSAGE       *message = NULL;
134538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
134638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
134738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
134838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (threadData == NULL) {
134938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
135038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
135138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pSECComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OMX_BufferProcess(pOMXComponent);
135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_ThreadExit(NULL);
136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec->bExitBufferProcessThread = OMX_FALSE;
137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OSAL_ThreadCreate(&pAudioDec->hBufferProcessThread,
138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 Exynos_OMX_BufferProcessThread,
138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                 pOMXComponent);
138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32                countValue = 0;
139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    unsigned int           i = 0;
139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec->bExitBufferProcessThread = OMX_TRUE;
140138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
140238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < ALL_PORT_NUM; i++) {
140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &countValue);
140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (countValue == 0)
140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_ThreadTerminate(pAudioDec->hBufferProcessThread);
141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec->hBufferProcessThread = NULL;
141138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
141338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
141820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
143820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
144020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Port_Constructor(pOMXComponent);
144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
145320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pAudioDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pAudioDec == NULL) {
145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
145820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pAudioDec, 0, sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pAudioDec;
146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->bMultiThreadProcess = OMX_FALSE;
146620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_INPUTBUFFER_NUM;
147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_INPUTBUFFER_NUM;
147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_INPUT_BUFFER_SIZE;
147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
147420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
148120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_OUTPUTBUFFER_NUM;
148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_OUTPUTBUFFER_NUM;
148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE;
148520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->UseBuffer              = &Exynos_OMX_UseBuffer;
149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->AllocateBuffer         = &Exynos_OMX_AllocateBuffer;
149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->FreeBuffer             = &Exynos_OMX_FreeBuffer;
149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
149920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
150020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->exynos_FreeTunnelBuffer     = &Exynos_OMX_FreeTunnelBuffer;
150138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_BufferProcessCreate    = &Exynos_OMX_BufferProcess_Create;
150238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_BufferFlush          = &Exynos_OMX_BufferFlush;
150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
150620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
150720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
150820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
150920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
151020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
151120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
151420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
151838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int                            i = 0;
151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
152120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
152220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
152320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
152820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
152920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
153120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pAudioDec);
154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->hComponentHandle = pAudioDec = NULL;
154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < ALL_PORT_NUM; i++) {
154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[i];
154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort->portDefinition.format.audio.cMIMEType);
154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.format.audio.cMIMEType = NULL;
154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Port_Destructor(pOMXComponent);
154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
155520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
1557