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