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); 76c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim for (i = 0; i < MAX_BUFFER_NUM; 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 86c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom KimEXIT: 87c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d, bufferHeader:0x%x", __FUNCTION__, __LINE__, bufferHeader); 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent) 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 portIndex = 0; 9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL}; 9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0, cnt = 0; 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1; 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < cnt; i++) { 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent); 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__); 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, 13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret, 0, NULL); 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EnablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex) 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource); 155c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim 156c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim if (pExynosPort->exceptionFlag == INVALID_STATE) { 157c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim pExynosPort->exceptionFlag = NEED_PORT_DISABLE; 158c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim goto EXIT; 159c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim } 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_TRUE; 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 16238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->exceptionFlag = GENERAL_STATE; 16338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_TRUE; 16438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex) 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = 0; 17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1; 19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < cnt; i++) { 20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex); 20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) { 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventCmdComplete, 21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_CommandPortEnable, portIndex, NULL); 21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, 21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret, 0, NULL); 22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_DisablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex) 22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, elemNum = 0; 23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!CHECK_PORT_ENABLED(pExynosPort)) { 24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState != OMX_StateLoaded) { 24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) { 24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(message); 24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_FALSE; 25238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource); 25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bEnabled = OMX_FALSE; 25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex) 26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = 0; 26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0, cnt = 0; 27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL}; 27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent == NULL) { 27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1; 29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* port flush*/ 29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < cnt; i++) { 29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE); 29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < cnt; i++) { 30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nPortIndex == ALL_PORT_INDEX) 30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = i; 30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = nPortIndex; 30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex); 30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE; 30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) { 31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventCmdComplete, 31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_CommandPortDisable, portIndex, NULL); 31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, 32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret, 0, NULL); 32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer( 33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL findBuffer = OMX_FALSE; 33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0; 34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer == NULL) { 36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) { 36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateIdle) && 37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateExecuting) && 38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StatePause)) { 38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosPort)) || 387c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim (CHECK_PORT_BEING_FLUSHED(pExynosPort) && 38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) || 38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) && 39020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) { 39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE; 39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang findBuffer = OMX_TRUE; 40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (findBuffer == OMX_FALSE) { 40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); 41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message == NULL) { 41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageType = EXYNOS_OMX_CommandEmptyBuffer; 41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageParam = (OMX_U32) i; 41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->pCmdData = (OMX_PTR)pBuffer; 41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message); 42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != 0) { 42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); 42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FillThisBuffer( 43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL findBuffer = OMX_FALSE; 44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0; 44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer == NULL) { 47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) { 47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateIdle) && 48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateExecuting) && 48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StatePause)) { 48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((!CHECK_PORT_ENABLED(pExynosPort)) || 492c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim (CHECK_PORT_BEING_FLUSHED(pExynosPort) && 49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) || 49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) && 49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) { 49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); 501c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim for (i = 0; i < MAX_BUFFER_NUM; i++) { 50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { 50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE; 50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang findBuffer = OMX_TRUE; 50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (findBuffer == OMX_FALSE) { 51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); 51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message == NULL) { 51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageType = EXYNOS_OMX_CommandFillBuffer; 52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->messageParam = (OMX_U32) i; 52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message->pCmdData = (OMX_PTR)pBuffer; 52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message); 52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != 0) { 52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); 53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); 53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent) 54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL; 54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL; 54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE); 57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->portParam.nPorts = ALL_PORT_NUM; 57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX; 57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM); 57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort == NULL) { 57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM); 58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort = pExynosPort; 58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input Port */ 58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX]; 58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS); 58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosInputPort->extendBufferHeader == NULL) { 59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM); 60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosInputPort->bufferStateAllocate == NULL) { 60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM); 61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferSemID = NULL; 61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->assignedBufferNum = 0; 61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portState = OMX_StateMax; 61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bIsPortFlushed = OMX_FALSE; 61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bIsPortDisabled = OMX_FALSE; 61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunneledComponent = NULL; 61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunneledPort = 0; 61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunnelBufferNum = 0; 61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified; 62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->tunnelFlags = 0; 62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource); 62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource); 63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE); 64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX; 64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.eDir = OMX_DirInput; 64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferCountActual = 0; 64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferCountMin = 0; 64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferSize = 0; 65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bEnabled = OMX_FALSE; 65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bPopulated = OMX_FALSE; 65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax; 65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE; 65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->portDefinition.nBufferAlignment = 0; 65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->markType.hMarkTargetComponent = NULL; 65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->markType.pMarkData = NULL; 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->exceptionFlag = GENERAL_STATE; 65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output Port */ 66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX]; 66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 662c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */ 66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->extendBufferHeader == NULL) { 66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM); 68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM); 68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosOutputPort->bufferStateAllocate == NULL) { 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM); 70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferSemID = NULL; 70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->assignedBufferNum = 0; 70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portState = OMX_StateMax; 70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bIsPortFlushed = OMX_FALSE; 70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bIsPortDisabled = OMX_FALSE; 70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunneledComponent = NULL; 70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunneledPort = 0; 70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunnelBufferNum = 0; 70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified; 71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->tunnelFlags = 0; 71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource); 71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate); 71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = NULL; 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource); 73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource); 73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->loadedResource = NULL; 73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate); 73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->bufferStateAllocate = NULL; 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader); 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->extendBufferHeader = NULL; 73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource); 74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->unloadedResource = NULL; 74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource); 74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->loadedResource = NULL; 74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate); 74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosInputPort->bufferStateAllocate = NULL; 74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader); 74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosInputPort->extendBufferHeader = NULL; 74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort); 74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = NULL; 74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE); 75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX; 75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.eDir = OMX_DirOutput; 75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferCountActual = 0; 75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferCountMin = 0; 75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferSize = 0; 75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE; 75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE; 76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax; 76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE; 76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->portDefinition.nBufferAlignment = 0; 76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->markType.hMarkTargetComponent = NULL; 76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosOutputPort->markType.pMarkData = NULL; 76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->exceptionFlag = GENERAL_STATE; 76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.startTimeStamp = 0; 77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.nStartFlags = 0x0; 77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer; 77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->FillThisBuffer = &Exynos_OMX_FillThisBuffer; 77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent) 78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 784d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 785d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_COMPONENTTYPE *pOMXComponent = NULL; 78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 789d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim OMX_S32 countValue = 0; 79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 792d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim FunctionIn(); 793d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 80320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 808d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 809d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim if (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) { 810d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim pExynosComponent->abendState = OMX_TRUE; 811d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim for (i = 0; i < ALL_PORT_NUM; i++) { 812d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim pExynosPort = &pExynosComponent->pExynosPort[i]; 813d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource); 814d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 815d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalWait(pExynosComponent->abendStateEvent, DEF_MAX_WAIT_TIME); 816d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalReset(pExynosComponent->abendStateEvent); 817d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 818d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim 81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 82120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource); 82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->loadedResource = NULL; 82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource); 82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->unloadedResource = NULL; 82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort->bufferStateAllocate); 82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->bufferStateAllocate = NULL; 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosPort->extendBufferHeader); 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader = NULL; 83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ); 83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent->pExynosPort); 83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort = NULL; 83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer) 84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataBuffer == NULL) { 84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->dataValid = OMX_FALSE; 85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->dataLen = 0; 85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->remainDataLen = 0; 85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->usedDataLen = 0; 85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->bufferHeader = NULL; 85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->nFlags = 0; 85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->timeStamp = 0; 85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer->pPrivate = NULL; 85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData) 86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pData == NULL) { 86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = 0; 87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = 0; 87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = 0; 87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = 0; 87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = 0; 87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = NULL; 87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = NULL; 880f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim pData->allocSize = 0; 88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane) 88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPlane == ONE_PLANE) { 89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Case of Shared Buffer, Only support singlePlaneBuffer */ 89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer; 89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane"); 89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNotImplemented; 89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->allocSize = pUseBuffer->allocSize; 90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = pUseBuffer->dataLen; 90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = pUseBuffer->usedDataLen; 90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = pUseBuffer->remainDataLen; 90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = pUseBuffer->timeStamp; 90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = pUseBuffer->nFlags; 90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = pUseBuffer->pPrivate; 90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = pUseBuffer->bufferHeader; 90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer) 91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->bufferHeader = pData->bufferHeader; 91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->allocSize = pData->allocSize; 91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->dataLen = pData->dataLen; 91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->usedDataLen = pData->usedDataLen; 92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->remainDataLen = pData->remainDataLen; 92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->timeStamp = pData->timeStamp; 92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->nFlags = pData->nFlags; 92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->pPrivate = pData->pPrivate; 92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 927