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