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_Mp3dec.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author    Yunji Kim (yunji.kim@samsung.com)
2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @version   1.1.0
2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *   2012.02.28 : Create
2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Adec.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "library_register.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Mp3dec.h"
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "srp_api.h"
4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_MP3_DEC"
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang//#define SRP_DUMP_TO_FILE
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef SRP_DUMP_TO_FILE
4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "stdio.h"
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangFILE *inFile;
5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangFILE *outFile;
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetParameter(
5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN    OMX_HANDLETYPE hComponent,
5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN    OMX_INDEXTYPE  nParamIndex,
5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_INOUT OMX_PTR        pComponentParameterStructure)
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nParamIndex) {
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioMp3:
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = NULL;
9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MP3_HANDLE       *pMp3Dec = NULL;
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstMp3Param->nPortIndex >= ALL_PORT_NUM) {
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcMp3Param = &pMp3Dec->mp3Param;
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioPcm:
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = NULL;
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MP3_HANDLE           *pMp3Dec = NULL;
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pDstPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pDstPcmParam->nPortIndex >= ALL_PORT_NUM) {
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pSrcPcmParam = &pMp3Dec->pcmParam;
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_S32 codecType;
13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_AudioDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetParameter(
15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentParameterStructure)
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentParameterStructure == NULL) {
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioMp3:
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = NULL;
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MP3_HANDLE       *pMp3Dec = NULL;
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcMp3Param->nPortIndex >= ALL_PORT_NUM) {
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstMp3Param = &pMp3Dec->mp3Param;
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamAudioPcm:
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = NULL;
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        EXYNOS_MP3_HANDLE           *pMp3Dec = NULL;
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pSrcPcmParam->nPortIndex >= ALL_PORT_NUM) {
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadPortIndex;
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pDstPcmParam = &pMp3Dec->pcmParam;
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    case OMX_IndexParamStandardComponentRole:
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    {
23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret != OMX_ErrorNone) {
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorIncorrectStateOperation;
24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE)) {
24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorBadParameter;
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_AudioDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetConfig(
26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_AudioDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetConfig(
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_PTR        pComponentConfigStructure)
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL || pComponentConfigStructure == NULL) {
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    switch (nIndex) {
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    default:
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_AudioDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        break;
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetExtensionIndex(
34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_STRING      cParameterName,
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_INDEXTYPE *pIndexType)
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_AudioDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
39020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_ComponentRoleEnum(
39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_HANDLETYPE hComponent,
39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_OUT OMX_U8        *cRole,
39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN  OMX_U32        nIndex)
39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE               ret = OMX_ErrorNone;
39820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE          *pOMXComponent = NULL;
39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                     codecType;
40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (cRole == NULL)) {
40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
40620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNoMore;
41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
42320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_MP3_HANDLE             *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bUseFlagEOF = OMX_TRUE; /* Mp3 extractor should parse into frame unit. */
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_FALSE;
45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef SRP_DUMP_TO_FILE
45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    inFile = fopen("/data/InFile.mp3", "w+");
45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    outFile = fopen("/data/OutFile.pcm", "w+");
45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef SRP_DUMP_TO_FILE
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    fclose(inFile);
47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    fclose(outFile);
47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3_Decode_Block(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_MP3_HANDLE             *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    struct srp_dec_info            codecDecInfo;
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                        returnCodec = 0;
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned long                  isSRPStopped = 0;
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR                        dataBuffer = NULL;
49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int                   dataLen = 0;
49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL                       isSRPIbufOverflow = OMX_FALSE;
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef SRP_DUMP_TO_FILE
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->reInputData == OMX_FALSE) {
49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        fwrite(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen, 1, inFile);
50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Save timestamp and flags of input data */
50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOutputData->timeStamp = pInputData->timeStamp;
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOutputData->nFlags = pInputData->nFlags & (~OMX_BUFFERFLAG_EOS);
50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Decoding mp3 frames by SRP */
50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->getAllDelayBuffer == OMX_FALSE) {
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        returnCodec = SRP_Decode(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen);
51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (returnCodec >= 0) {
51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                SRP_Send_EOS();
51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_TRUE;
51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else if (returnCodec == SRP_ERROR_IBUF_OVERFLOW) {
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            isSRPIbufOverflow = OMX_TRUE;
51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataDecodeYet;
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMp3Dec->hSRPMp3Handle.bConfiguredSRP == OMX_FALSE) {
52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if ((pInputData->dataLen <= 0) && (pInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        returnCodec = SRP_Get_Dec_Info(&codecDecInfo);
53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (returnCodec < 0) {
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Dec_Info failed: %d", returnCodec);
53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorHardware;
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (!codecDecInfo.sample_rate || !codecDecInfo.channels) {
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pOutputData->dataLen = 0;
54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->getAllDelayBuffer = OMX_TRUE;
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorInputDataDecodeYet;
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->getAllDelayBuffer = OMX_FALSE;
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                if (isSRPIbufOverflow)
54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorInputDataDecodeYet;
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                else
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                    ret = OMX_ErrorNone;
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            goto EXIT;
55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "numChannels(%d), samplingRate(%d)",
55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            codecDecInfo.channels, codecDecInfo.sample_rate);
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pMp3Dec->pcmParam.nChannels != codecDecInfo.channels ||
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMp3Dec->pcmParam.nSamplingRate != codecDecInfo.sample_rate) {
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* Change channel count and sampling rate information */
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMp3Dec->pcmParam.nChannels = codecDecInfo.channels;
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMp3Dec->pcmParam.nSamplingRate = codecDecInfo.sample_rate;
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            /* Send Port Settings changed call back */
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (*(pExynosComponent->pCallbacks->EventHandler))
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                  (pOMXComponent,
56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                   pExynosComponent->callbackData,
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                   OMX_EventPortSettingsChanged, /* The command was completed */
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                   OMX_DirOutput, /* This is the port index */
56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                   0,
56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                   NULL);
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_TRUE;
57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->dataLen = 0;
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->getAllDelayBuffer = OMX_TRUE;
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataDecodeYet;
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (isSRPIbufOverflow)
58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorInputDataDecodeYet;
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            else
58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Get decoded data from SRP */
58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    returnCodec = SRP_Get_PCM(&dataBuffer, &dataLen);
58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (dataLen > 0) {
59020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->dataLen = dataLen;
59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Memcpy(pOutputData->buffer.singlePlaneBuffer.dataBuffer, dataBuffer, dataLen);
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->dataLen = 0;
59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef SRP_DUMP_TO_FILE
59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOutputData->dataLen > 0)
59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        fwrite(pOutputData->buffer.singlePlaneBuffer.dataBuffer, pOutputData->dataLen, 1, outFile);
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Delay EOS signal until all the PCM is returned from the SRP driver. */
60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            returnCodec = SRP_GetParams(SRP_STOP_EOS_STATE, &isSRPStopped);
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (returnCodec != 0)
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail SRP_STOP_EOS_STATE");
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            if (isSRPStopped == 1) {
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->getAllDelayBuffer = OMX_FALSE;
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE; /* for repeating one song */
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorNone;
61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            } else {
61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                pExynosComponent->getAllDelayBuffer = OMX_TRUE;
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                ret = OMX_ErrorInputDataDecodeYet;
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else { /* Flush after EOS */
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_SRP_Mp3Dec_bufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((!CHECK_PORT_ENABLED(pInputPort)) || (!CHECK_PORT_ENABLED(pOutputPort)) ||
63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            (!CHECK_PORT_POPULATED(pInputPort)) || (!CHECK_PORT_POPULATED(pOutputPort))) {
63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataDecodeYet;
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent)) {
64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorInputDataDecodeYet;
64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            ret = OMX_ErrorNone;
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_SRP_Mp3_Decode_Block(pOMXComponent, pInputData, pOutputData);
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorInputDataDecodeYet) {
65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->usedDataLen = 0;
65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pOutputData->remainDataLen = pOutputData->dataLen;
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        } else {
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                                    pExynosComponent->callbackData,
66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                                                    OMX_EventError, ret, 0, NULL);
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    } else {
66520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->usedDataLen += pInputData->dataLen;
66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->remainDataLen = pInputData->dataLen - pInputData->usedDataLen;
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->dataLen -= pInputData->usedDataLen;
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pInputData->usedDataLen = 0;
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->usedDataLen = 0;
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pOutputData->remainDataLen = pOutputData->dataLen;
67220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_MP3_HANDLE             *pMp3Dec = NULL;
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR                        pInputBuffer = NULL;
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_PTR                        pOutputBuffer = NULL;
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int                   inputBufferSize = 0;
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int                   inputBufferNum = 0;
69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int                   outputBufferSize = 0;
69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    unsigned int                   outputBufferNum = 0;
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                        returnCodec;
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((hComponent == NULL) || (componentName == NULL)) {
70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MP3_DEC, componentName) != 0) {
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_AudioDecodeComponentInit(pOMXComponent);
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_AudioDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->codecType = HW_AUDIO_DEC_CODEC;
71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->componentName == NULL) {
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_1;
72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MP3_DEC);
72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MP3_HANDLE));
72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMp3Dec == NULL) {
73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MP3_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_2;
73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pMp3Dec, 0, sizeof(EXYNOS_MP3_HANDLE));
73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pAudioDec->hCodecHandle = (OMX_HANDLETYPE)pMp3Dec;
73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Create and Init SRP */
73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_FALSE;
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    returnCodec = SRP_Create(SRP_INIT_BLOCK_MODE);
74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (returnCodec < 0) {
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Create failed: %d", returnCodec);
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorHardware;
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_3;
74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->hSRPMp3Handle.hSRPHandle = (OMX_HANDLETYPE)returnCodec; /* SRP's fd */
74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    returnCodec = SRP_Init();
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (returnCodec < 0) {
74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Init failed: %d", returnCodec);
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorHardware;
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_4;
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_TRUE;
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Get input buffer info from SRP */
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    returnCodec = SRP_Get_Ibuf_Info(&pInputBuffer, &inputBufferSize, &inputBufferNum);
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (returnCodec < 0) {
75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Ibuf_Info failed: %d", returnCodec);
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorHardware;
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_5;
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.allocSize = inputBufferSize;
76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = Exynos_OSAL_Malloc(inputBufferSize);
76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer == NULL) {
76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Input data buffer alloc failed");
76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_5;
77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Get output buffer info from SRP */
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    returnCodec = SRP_Get_Obuf_Info(&pOutputBuffer, &outputBufferSize, &outputBufferNum);
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (returnCodec < 0) {
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Obuf_Info failed: %d", returnCodec);
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorHardware;
77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT_ERROR_6;
77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set componentVersion */
78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
78520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Set specVersion */
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input port */
79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountActual = inputBufferNum;
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountMin = inputBufferNum;
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = inputBufferSize;
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/mpeg");
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY1_PORT;
80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output port */
80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountActual = outputBufferNum;
80820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferCountMin = outputBufferNum;
80920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.nBufferSize = outputBufferSize;
81020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
81120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portWayType = WAY1_PORT;
81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Default values for Mp3 audio param */
81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pMp3Dec->mp3Param, OMX_AUDIO_PARAM_MP3TYPE);
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.nPortIndex      = INPUT_PORT_INDEX;
82120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.nChannels       = DEFAULT_AUDIO_CHANNELS_NUM;
82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.nBitRate        = 0;
82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.nSampleRate     = DEFAULT_AUDIO_SAMPLING_FREQ;
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.nAudioBandWidth = 0;
82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.eChannelMode    = OMX_AUDIO_ChannelModeStereo;
82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->mp3Param.eFormat         = OMX_AUDIO_MP3StreamFormatMP1Layer3;
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Default values for PCM audio param */
82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pMp3Dec->pcmParam, OMX_AUDIO_PARAM_PCMMODETYPE);
83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.nPortIndex         = OUTPUT_PORT_INDEX;
83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.nChannels          = DEFAULT_AUDIO_CHANNELS_NUM;
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.eNumData           = OMX_NumericalDataSigned;
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.eEndian            = OMX_EndianLittle;
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.bInterleaved       = OMX_TRUE;
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.nBitPerSample      = DEFAULT_AUDIO_BIT_PER_SAMPLE;
83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.nSamplingRate      = DEFAULT_AUDIO_SAMPLING_FREQ;
83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.ePCMMode           = OMX_AUDIO_PCMModeLinear;
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec->pcmParam.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->GetParameter      = &Exynos_SRP_Mp3Dec_GetParameter;
84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->SetParameter      = &Exynos_SRP_Mp3Dec_SetParameter;
84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->GetConfig         = &Exynos_SRP_Mp3Dec_GetConfig;
84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->SetConfig         = &Exynos_SRP_Mp3Dec_SetConfig;
84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->GetExtensionIndex = &Exynos_SRP_Mp3Dec_GetExtensionIndex;
84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentRoleEnum = &Exynos_SRP_Mp3Dec_ComponentRoleEnum;
84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* ToDo: Change the function name associated with a specific codec */
85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentInit      = &Exynos_SRP_Mp3Dec_Init;
85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->exynos_codec_componentTerminate = &Exynos_SRP_Mp3Dec_Terminate;
85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec->exynos_codec_bufferProcess = &Exynos_SRP_Mp3Dec_bufferProcess;
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pAudioDec->exynos_checkInputFrame = NULL;
85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->currentState = OMX_StateLoaded;
85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    goto EXIT; /* This function is performed successfully. */
85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_6:
86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->processData.allocSize = 0;
86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_5:
86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    SRP_Deinit();
86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_4:
86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    SRP_Terminate();
86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_3:
87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pMp3Dec);
87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pAudioDec->hCodecHandle = NULL;
87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_2:
87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT_ERROR_1:
87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_MP3_HANDLE        *pMp3Dec = NULL;
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->componentName);
90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->componentName = NULL;
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer) {
90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->processData.allocSize = 0;
90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pMp3Dec != NULL) {
91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (pMp3Dec->hSRPMp3Handle.bSRPLoaded == OMX_TRUE) {
91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            SRP_Deinit();
91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            SRP_Terminate();
91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pMp3Dec);
91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
931