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_Baseport.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * HyeYeon Chung (hyeon.chung@samsung.com) 2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h" 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h" 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_BASE_PORT" 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader) 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 4938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 5138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 5238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0; 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 5538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 5738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE; 5838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader); 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader) 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0; 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE; 7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader); 8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent) 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 portIndex = 0; 9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL}; 9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0, cnt = 0; 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1; 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < cnt; i++) { 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent); 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__); 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, 13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret, 0, NULL); 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EnablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex) 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource); 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_TRUE; 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->exceptionFlag = GENERAL_STATE; 15638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex) 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = 0; 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1; 19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < cnt; i++) { 19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex); 19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) { 20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventCmdComplete, 20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_CommandPortEnable, portIndex, NULL); 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, 21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret, 0, NULL); 21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_DisablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex) 22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, elemNum = 0; 22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!CHECK_PORT_ENABLED(pExynosPort)) { 23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState != OMX_StateLoaded) { 23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) { 24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(message); 24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_FALSE; 24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource); 24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_FALSE; 24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex) 25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 26038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = 0; 26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL}; 26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1; 28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* port flush*/ 28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < cnt; i++) { 28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE); 29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < cnt; i++) { 29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex); 30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE; 30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) { 30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventCmdComplete, 30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_CommandPortDisable, portIndex, NULL); 30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, 31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret, 0, NULL); 31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer( 32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL findBuffer = OMX_FALSE; 33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0; 33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer == NULL) { 35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) { 36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateIdle) && 37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateExecuting) && 37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StatePause)) { 37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosPort)) || 38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) && 38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) || 38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) && 38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) { 38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE; 39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang findBuffer = OMX_TRUE; 39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (findBuffer == OMX_FALSE) { 39820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); 40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message == NULL) { 40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageType = EXYNOS_OMX_CommandEmptyBuffer; 41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageParam = (OMX_U32) i; 41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->pCmdData = (OMX_PTR)pBuffer; 41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message); 41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != 0) { 41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); 42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 42320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FillThisBuffer( 42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL findBuffer = OMX_FALSE; 43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0; 43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer == NULL) { 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) { 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateIdle) && 47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateExecuting) && 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StatePause)) { 47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosPort)) || 48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) && 48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) || 48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) && 48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) { 48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE; 49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang findBuffer = OMX_TRUE; 49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (findBuffer == OMX_FALSE) { 50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); 50920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message == NULL) { 51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageType = EXYNOS_OMX_CommandFillBuffer; 51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageParam = (OMX_U32) i; 51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->pCmdData = (OMX_PTR)pBuffer; 51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message); 51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != 0) { 52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); 52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent) 53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE); 56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->portParam.nPorts = ALL_PORT_NUM; 56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX; 56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM); 56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort == NULL) { 57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM); 57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort = pExynosPort; 57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input Port */ 57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX]; 57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS); 58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosInputPort->extendBufferHeader == NULL) { 58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM); 59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosInputPort->bufferStateAllocate == NULL) { 59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM); 60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferSemID = NULL; 60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->assignedBufferNum = 0; 60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portState = OMX_StateMax; 60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bIsPortFlushed = OMX_FALSE; 60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bIsPortDisabled = OMX_FALSE; 60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunneledComponent = NULL; 61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunneledPort = 0; 61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunnelBufferNum = 0; 61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified; 61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunnelFlags = 0; 61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource); 61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource); 62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE); 63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX; 63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.eDir = OMX_DirInput; 64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferCountActual = 0; 64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferCountMin = 0; 64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferSize = 0; 64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bEnabled = OMX_FALSE; 64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bPopulated = OMX_FALSE; 64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax; 64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE; 64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferAlignment = 0; 64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->markType.hMarkTargetComponent = NULL; 64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->markType.pMarkData = NULL; 65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->exceptionFlag = GENERAL_STATE; 65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output Port */ 65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX]; 65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */ 65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->extendBufferHeader == NULL) { 65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM); 67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosOutputPort->bufferStateAllocate == NULL) { 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM); 69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferSemID = NULL; 69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->assignedBufferNum = 0; 69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portState = OMX_StateMax; 69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bIsPortFlushed = OMX_FALSE; 69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bIsPortDisabled = OMX_FALSE; 69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunneledComponent = NULL; 70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunneledPort = 0; 70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunnelBufferNum = 0; 70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified; 70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunnelFlags = 0; 70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource); 70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate); 70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = NULL; 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource); 72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource); 72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->loadedResource = NULL; 72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate); 72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = NULL; 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE); 74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX; 74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.eDir = OMX_DirOutput; 74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferCountActual = 0; 74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferCountMin = 0; 75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferSize = 0; 75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE; 75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE; 75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax; 75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE; 75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferAlignment = 0; 75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->markType.hMarkTargetComponent = NULL; 75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->markType.pMarkData = NULL; 75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = GENERAL_STATE; 75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.startTimeStamp = 0; 76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.nStartFlags = 0x0; 76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer; 76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->FillThisBuffer = &Exynos_OMX_FillThisBuffer; 76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent) 77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 777d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 778d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_COMPONENTTYPE *pOMXComponent = NULL; 77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 782d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_S32 countValue = 0; 78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 785d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim FunctionIn(); 786d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 801d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 802d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim if (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) { 803d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim pExynosComponent->abendState = OMX_TRUE; 804d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim for (i = 0; i < ALL_PORT_NUM; i++) { 805d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim pExynosPort = &pExynosComponent->pExynosPort[i]; 806d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource); 807d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 808d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalWait(pExynosComponent->abendStateEvent, DEF_MAX_WAIT_TIME); 809d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalReset(pExynosComponent->abendStateEvent); 810d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 811d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource); 81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->loadedResource = NULL; 81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource); 81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->unloadedResource = NULL; 81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort->bufferStateAllocate); 82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->bufferStateAllocate = NULL; 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosPort->extendBufferHeader); 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader = NULL; 82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ); 82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent->pExynosPort); 82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort = NULL; 82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer) 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataBuffer == NULL) { 84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->dataValid = OMX_FALSE; 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->dataLen = 0; 84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->remainDataLen = 0; 84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->usedDataLen = 0; 84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->bufferHeader = NULL; 84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->nFlags = 0; 85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->timeStamp = 0; 85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->pPrivate = NULL; 85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData) 85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pData == NULL) { 86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = 0; 86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = 0; 86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = 0; 86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = 0; 87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = 0; 87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = NULL; 87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = NULL; 87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane) 87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPlane == ONE_PLANE) { 88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Case of Shared Buffer, Only support singlePlaneBuffer */ 88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer; 88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane"); 88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNotImplemented; 88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->allocSize = pUseBuffer->allocSize; 89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = pUseBuffer->dataLen; 89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = pUseBuffer->usedDataLen; 89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = pUseBuffer->remainDataLen; 89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = pUseBuffer->timeStamp; 89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = pUseBuffer->nFlags; 89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = pUseBuffer->pPrivate; 89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = pUseBuffer->bufferHeader; 89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer) 90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->bufferHeader = pData->bufferHeader; 90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->allocSize = pData->allocSize; 91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->dataLen = pData->dataLen; 91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->usedDataLen = pData->usedDataLen; 91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->remainDataLen = pData->remainDataLen; 91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->timeStamp = pData->timeStamp; 91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->nFlags = pData->nFlags; 91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->pPrivate = pData->pPrivate; 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 919