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_Basecomponent.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Yunji Kim (yunji.kim@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#include <unistd.h> 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h" 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h" 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h" 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Resourcemanager.h" 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_BASE_COMP" 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 4638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* Change CHECK_SIZE_VERSION Macro */ 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Check_SizeVersion(OMX_PTR header, OMX_U32 size) 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_VERSIONTYPE* version = NULL; 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (header == NULL) { 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang version = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32)); 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (*((OMX_U32*)header) != size) { 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (version->s.nVersionMajor != VERSIONMAJOR_NUMBER || 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang version->s.nVersionMinor != VERSIONMINOR_NUMBER) { 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorVersionMismatch; 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetComponentVersion( 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_STRING pComponentName, 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_VERSIONTYPE *pComponentVersion, 7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_VERSIONTYPE *pSpecVersion, 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_UUIDTYPE *pComponentUUID) 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 compUUID[3]; 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* check parameters */ 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || 9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pComponentName == NULL || pComponentVersion == NULL || 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pSpecVersion == NULL || pComponentUUID == NULL) { 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pComponentName, pExynosComponent->componentName); 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memcpy(pComponentVersion, &(pExynosComponent->componentVersion), sizeof(OMX_VERSIONTYPE)); 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memcpy(pSpecVersion, &(pExynosComponent->specVersion), sizeof(OMX_VERSIONTYPE)); 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Fill UUID with handle address, PID and UID. 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * This should guarantee uiniqness */ 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang compUUID[0] = (OMX_U32)pOMXComponent; 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang compUUID[1] = getpid(); 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang compUUID[2] = getuid(); 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memcpy(*pComponentUUID, compUUID, 3 * sizeof(*compUUID)); 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetState ( 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_STATETYPE *pState) 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL || pState == NULL) { 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *pState = pExynosComponent->currentState; 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 messageParam) 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message; 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_STATETYPE destState = messageParam; 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_STATETYPE currentState = pExynosComponent->currentState; 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 countValue = 0; 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang unsigned int i = 0, j = 0; 17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int k = 0; 17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* check parameters */ 18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (currentState == destState) { 18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorSameState; 18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (currentState == OMX_StateInvalid) { 18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((currentState == OMX_StateLoaded) && (destState == OMX_StateIdle)) { 19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Get_Resource(pOMXComponent); 19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 1946201909bad11eab8339ec8dbef4d0152231308afDima Zavin Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent); 19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (((currentState == OMX_StateIdle) && (destState == OMX_StateLoaded)) || 19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((currentState == OMX_StateIdle) && (destState == OMX_StateInvalid)) || 20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((currentState == OMX_StateExecuting) && (destState == OMX_StateInvalid)) || 20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((currentState == OMX_StatePause) && (destState == OMX_StateInvalid))) { 20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_Release_Resource(pOMXComponent); 20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2050996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d currentState: %d", destState, currentState); 20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (destState) { 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateInvalid: 20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_Out_WaitForResource(pOMXComponent); 21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateInvalid; 21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent); 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) { 22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex); 22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL; 22238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) { 22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex); 22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL; 22538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex); 22638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL; 22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex); 22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hPortMutex = NULL; 23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent); 23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pauseEvent = NULL; 23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent); 23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].pauseEvent = NULL; 23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) { 240d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent); 24138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL; 24238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID); 24738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].bufferSemID = NULL; 24838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 24938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->exynos_codec_componentTerminate != NULL) 25038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentTerminate(pOMXComponent); 25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent); 26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) { 26638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex); 26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL; 26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) { 26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex); 27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL; 27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex); 27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL; 27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex); 27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hPortMutex = NULL; 27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent); 27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pauseEvent = NULL; 28038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent); 28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].pauseEvent = NULL; 28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) { 285d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent); 28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL; 28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID); 29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[i].bufferSemID = NULL; 29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_codec_componentTerminate(pOMXComponent); 29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < (pExynosComponent->portParam.nPorts); i++) { 29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = (pExynosComponent->pExynosPort + i); 29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) { 30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message != NULL) 30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(message); 30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = pExynosComponent->exynos_FreeTunnelBuffer(pExynosPort, i); 30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (OMX_ErrorNone != ret) { 30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_ENABLED(pExynosPort)) { 31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource); 31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_FALSE; 31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateLoaded; 31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Out_WaitForResource(pOMXComponent); 32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateLoaded; 32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = (pExynosComponent->pExynosPort + i); 33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort == NULL) { 33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_ENABLED(pExynosPort)) { 34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = pExynosComponent->exynos_AllocateTunnelBuffer(pExynosPort, i); 34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret!=OMX_ErrorNone) 34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_ENABLED(pExynosPort)) { 34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[i].loadedResource); 347d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim if (pExynosComponent->abendState == OMX_TRUE) { 348d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent); 349d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim ret = Exynos_OMX_Release_Resource(pOMXComponent); 350d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim goto EXIT; 351d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_TRUE; 35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pExynosComponent->exynos_codec_componentInit(pOMXComponent); 35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free 36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 3610996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent); 3620996d9d5d25dcf3c90e40288a2e151dfbbf16959Dima Zavin Exynos_OMX_Release_Resource(pOMXComponent); 36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pExynosComponent->pauseEvent); 36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].pauseEvent); 37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) 37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent); 37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->pExynosPort[i].bufferSemID); 37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) { 38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex); 38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) { 39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex); 39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex); 39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].hPortMutex); 40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 40620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pExynosComponent->exynos_BufferProcessCreate(pOMXComponent); 41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free 41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent); 41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pauseEvent = NULL; 41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent); 42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].pauseEvent = NULL; 42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) { 424d866f455acab131be8f058733abd9c1ede2fcfeaSeungBeom Kim Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent); 42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL; 42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) { 43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex); 43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL; 43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) { 43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex); 43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL; 43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex); 43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL; 43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex); 44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[i].hPortMutex = NULL; 44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID); 44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[i].bufferSemID = NULL; 44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateIdle; 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_BufferFlushProcess(pOMXComponent, ALL_PORT_INDEX, OMX_FALSE); 45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateIdle; 45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateIdle; 45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) { 47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (j = 0; j < pExynosPort->tunnelBufferNum; j++) { 47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID); 47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->transientState = EXYNOS_OMX_TransStateMax; 48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateExecuting; 48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent); 48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent); 48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) { 49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 semaValue = 0, cnt = 0; 49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &semaValue); 49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > semaValue) { 49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) - semaValue; 49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (k = 0; k < cnt; k++) { 49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID); 50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateExecuting; 50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent); 50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < ALL_PORT_NUM; i++) { 51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent); 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StatePause; 52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StatePause; 53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateWaitForResources: 54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (currentState) { 54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateLoaded: 54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_In_WaitForResource(pOMXComponent); 54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->currentState = OMX_StateWaitForResources; 54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateIdle: 54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StateExecuting: 54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_StatePause: 55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateTransition; 55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret == OMX_ErrorNone) { 56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->pCallbacks != NULL) { 56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventCmdComplete, OMX_CommandStateSet, 56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang destState, NULL); 56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__); 57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->pCallbacks != NULL) { 57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData, 57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_EventError, ret, 0, NULL); 57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_MessageHandlerThread(OMX_PTR threadData) 58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 messageType = 0, portIndex = 0; 59020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (threadData == NULL) { 59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (pExynosComponent->bExitMessageHandlerThread == OMX_FALSE) { 60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosComponent->msgSemaphoreHandle); 60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosComponent->messageQ); 60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (message != NULL) { 61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang messageType = message->messageType; 61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (messageType) { 61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandStateSet: 61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_ComponentStateSet(pOMXComponent, message->messageParam); 61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandFlush: 61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_BufferFlushProcess(pOMXComponent, message->messageParam, OMX_TRUE); 61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandPortDisable: 61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_PortDisableProcess(pOMXComponent, message->messageParam); 62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandPortEnable: 62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_PortEnableProcess(pOMXComponent, message->messageParam); 62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandMarkBuffer: 62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portIndex = message->messageParam; 62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[portIndex].markType.hMarkTargetComponent = ((OMX_MARKTYPE *)message->pCmdData)->hMarkTargetComponent; 62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[portIndex].markType.pMarkData = ((OMX_MARKTYPE *)message->pCmdData)->pMarkData; 62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case (OMX_COMMANDTYPE)EXYNOS_OMX_CommandComponentDeInit: 63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->bExitMessageHandlerThread = OMX_TRUE; 63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(message); 63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang message = NULL; 63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_ThreadExit(NULL); 64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_StateSet(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam) 64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 destState = nParam; 65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 i = 0; 65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateLoaded)) { 65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->transientState = EXYNOS_OMX_TransStateLoadedToIdle; 65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < pExynosComponent->portParam.nPorts; i++) { 65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[i].portState = OMX_StateIdle; 65720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle"); 65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if ((destState == OMX_StateLoaded) && (pExynosComponent->currentState == OMX_StateIdle)) { 66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToLoaded; 66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[i].portState = OMX_StateLoaded; 66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateLoaded"); 66520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateExecuting)) { 66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->transientState = EXYNOS_OMX_TransStateExecutingToIdle; 66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle"); 66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if ((destState == OMX_StateExecuting) && (pExynosComponent->currentState == OMX_StateIdle)) { 66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToExecuting; 67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateExecuting"); 67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (destState == OMX_StateInvalid) { 67220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[i].portState = OMX_StateInvalid; 67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorNone; 67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortFlush(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam) 68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = nParam; 68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U16 i = 0, cnt = 0, index = 0; 68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState == OMX_StateExecuting) || 68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState == OMX_StatePause)) { 69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((portIndex != ALL_PORT_INDEX) && 69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) { 69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /********************* 69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * need flush event set ????? 69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang **********************/ 69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang cnt = (portIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1; 70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < cnt; i++) { 70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex == ALL_PORT_INDEX) 70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang index = i; 70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang index = portIndex; 70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pExynosPort[index].bIsPortFlushed = OMX_TRUE; 70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortEnable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam) 71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = nParam; 72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U16 i = 0, cnt = 0; 72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((portIndex != ALL_PORT_INDEX) && 72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) { 72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex == ALL_PORT_INDEX) { 73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_ENABLED(pExynosPort)) { 73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portState = OMX_StateIdle; 74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_ENABLED(pExynosPort)) { 74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portState = OMX_StateIdle; 74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetPortDisable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam) 76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 portIndex = nParam; 76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U16 i = 0, cnt = 0; 76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((portIndex != ALL_PORT_INDEX) && 77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) { 77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex == ALL_PORT_INDEX) { 77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < pExynosComponent->portParam.nPorts; i++) { 77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!CHECK_PORT_ENABLED(pExynosPort)) { 77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portState = OMX_StateLoaded; 78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->bIsPortDisabled = OMX_TRUE; 78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 78520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portState = OMX_StateLoaded; 78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->bIsPortDisabled = OMX_TRUE; 78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_SetMarkBuffer(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam) 79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 portIndex = nParam; 80320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U16 i = 0, cnt = 0; 80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (nParam >= pExynosComponent->portParam.nPorts) { 80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 80820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 80920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 81020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 81120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState == OMX_StateExecuting) || 81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState == OMX_StatePause)) { 81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 82120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_CommandQueue( 82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent, 82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMMANDTYPE Cmd, 82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 nParam, 82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PTR pCmdData) 82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *command = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); 83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (command == NULL) { 83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang command->messageType = (OMX_U32)Cmd; 83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang command->messageParam = nParam; 83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang command->pCmdData = pCmdData; 83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_Queue(&pExynosComponent->messageQ, (void *)command); 84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != 0) { 84120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 84220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 84320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 84420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle); 84520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 84620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 84920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SendCommand( 85120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_COMMANDTYPE Cmd, 85320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_U32 nParam, 85420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pCmdData) 85520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 85820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 85920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 86020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 86120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 86220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 86320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 86420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 86520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 86720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 86820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 86920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 87420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 88020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 88220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 88320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (Cmd) { 88520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandStateSet : 88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandStateSet"); 88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_StateSet(pExynosComponent, nParam); 88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 88920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandFlush : 89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandFlush"); 89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_SetPortFlush(pExynosComponent, nParam); 89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) 89320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandPortDisable : 89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortDisable"); 89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_SetPortDisable(pExynosComponent, nParam); 89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) 89920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 90120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandPortEnable : 90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortEnable"); 90320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_SetPortEnable(pExynosComponent, nParam); 90420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) 90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 90620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 90720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_CommandMarkBuffer : 90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandMarkBuffer"); 90920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_SetMarkBuffer(pExynosComponent, nParam); 91020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) 91120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 91220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 91320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 91420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 91620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_CommandQueue(pExynosComponent, Cmd, nParam, pCmdData); 91820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 92020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 92320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 92420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 92520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetParameter( 92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 92720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 92820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_PTR ComponentParameterStructure) 92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 93020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 93820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 94120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 94320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 94720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 95120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ComponentParameterStructure == NULL) { 95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 95720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nParamIndex) { 96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamAudioInit: 96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoInit: 96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamImageInit: 96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamOtherInit: 96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 96720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure; 96820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE)); 96920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 97020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portParam->nPorts = 0; 97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang portParam->nStartPortNumber = 0; 97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 97620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamPortDefinition: 97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure; 97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 portIndex = portDefinition->nPortIndex; 98020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort; 98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex >= pExynosComponent->portParam.nPorts) { 98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 98820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize); 99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamPriorityMgmt: 99620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure; 99820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE)); 100020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 100120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang compPriority->nGroupID = pExynosComponent->compPriority.nGroupID; 100520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang compPriority->nGroupPriority = pExynosComponent->compPriority.nGroupPriority; 100620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 100720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 100820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamCompBufferSupplier: 101020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 101120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure; 101220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 portIndex = bufferSupplier->nPortIndex; 101320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort; 101420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 101520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState == OMX_StateLoaded) || 101620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState == OMX_StateWaitForResources)) { 101720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex >= pExynosComponent->portParam.nPorts) { 101820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 101920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 102320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 102420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 102720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort->portDefinition.eDir == OMX_DirInput) { 103020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 103120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput; 103220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (CHECK_PORT_TUNNELED(pExynosPort)) { 103320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput; 103420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 103520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified; 103620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 103720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 103820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 103920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput; 104020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (CHECK_PORT_TUNNELED(pExynosPort)) { 104120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput; 104220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 104320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified; 104420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 104720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 104820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 104920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 105020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 105120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 105220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 105320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 105420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 105520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 105620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUnsupportedIndex; 105720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 105820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 105920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 106020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 106120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 106220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 106320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 106420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 106520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 106620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 106720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 106820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 106920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 107020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 107120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetParameter( 107220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR ComponentParameterStructure) 107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ComponentParameterStructure == NULL) { 109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamAudioInit: 110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamVideoInit: 111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamImageInit: 111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamOtherInit: 111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure; 111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE)); 111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && 112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateWaitForResources)) { 112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Exynos_OSAL_Memcpy(&pExynosComponent->portParam, portParam, sizeof(OMX_PORT_PARAM_TYPE)); */ 112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamPortDefinition: 112920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 113020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure; 113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 portIndex = portDefinition->nPortIndex; 113220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort; 113320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex >= pExynosComponent->portParam.nPorts) { 113520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 113620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) { 114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) { 115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, portDefinition, portDefinition->nSize); 115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamPriorityMgmt: 116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure; 116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && 116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->currentState != OMX_StateWaitForResources)) { 116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE)); 117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->compPriority.nGroupID = compPriority->nGroupID; 117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->compPriority.nGroupPriority = compPriority->nGroupPriority; 117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang case OMX_IndexParamCompBufferSupplier: 117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure; 118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 portIndex = bufferSupplier->nPortIndex; 118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (portIndex >= pExynosComponent->portParam.nPorts) { 118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadPortIndex; 118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)); 119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 119320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 119520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) { 119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 120220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyUnspecified) { 120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) == 0) { 120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; /*OMX_ErrorNone ?????*/ 120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosPort->portDefinition.eDir == OMX_DirInput) { 121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) { 121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 121520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER; 121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->nPortIndex = pExynosPort->tunneledPort; 122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier); 122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) { 122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER; 122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang bufferSupplier->nPortIndex = pExynosPort->tunneledPort; 122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier); 122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 123120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (pExynosPort->portDefinition.eDir == OMX_DirOutput) { 123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) { 123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER; 123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) { 124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* 124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER; 124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 125020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 125120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 125220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 125320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang { 125420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUnsupportedIndex; 125520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 125620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 125720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 125820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 125920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 126120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 126320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 126520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 126720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 126820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 126920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetConfig( 127020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 127120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 127220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_PTR pComponentConfigStructure) 127320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 127420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 127520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 127620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 127720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 127820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 127920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 128020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 128120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 128220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 128320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 128420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 128520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 128620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 128720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 128820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 128920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 129120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 129220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 129320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 129420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 129520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 129620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pComponentConfigStructure == NULL) { 129720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 129820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 129920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 130020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 130120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 130220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 130320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 130420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 130520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 130620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 130720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUnsupportedIndex; 130820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 130920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 131020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 131120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 131220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 131320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 131420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 131520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 131620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 131720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetConfig( 131820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 131920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 132020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pComponentConfigStructure) 132120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 132220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 132320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 132420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 132520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 132620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 132720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 132820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 132920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 133020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 133120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 133220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 133320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 133420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 133520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 133620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 133720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 133820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 133920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 134020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 134120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 134220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 134320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 134420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pComponentConfigStructure == NULL) { 134520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 134620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 134720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 134820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 134920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 135020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 135120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 135220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang switch (nIndex) { 135420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang default: 135520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUnsupportedIndex; 135620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 135720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 135820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 135920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 136020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 136120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 136220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 136320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 136420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 136520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetExtensionIndex( 136620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 136720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_STRING cParameterName, 136820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_OUT OMX_INDEXTYPE *pIndexType) 136920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 137020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 137120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 137220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 137320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 137520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 137620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 137720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 137820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 137920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 138020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 138120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 138220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 138320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 138420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 138520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 138620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 138720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 138820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 138920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 139020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 139120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 139220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 139320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 139420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 139520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 139620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 139720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 139820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 139920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 140020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 140220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 140420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 140520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 140720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 140820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 140920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_SetCallbacks ( 141020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 141120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_CALLBACKTYPE* pCallbacks, 141220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pAppData) 141320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 141420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 141520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 141620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 141720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 141820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 141920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 142020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 142120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 142220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 142320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 142420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 142520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 142620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 142720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 142820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 142920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 143120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 143220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 143320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 143420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 143520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 143620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pCallbacks == NULL) { 143720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 143820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 143920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 144020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 144120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidState; 144220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 144320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 144420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->currentState != OMX_StateLoaded) { 144520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 144620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 144720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 144820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 144920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->pCallbacks = pCallbacks; 145020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->callbackData = pAppData; 145120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 145220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 145320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 145420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 145520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 145620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 145720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 145820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 145920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 146020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_UseEGLImage( 146120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 146220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr, 146320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_U32 nPortIndex, 146420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_PTR pAppPrivate, 146520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN void *eglImage) 146620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 146720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorNotImplemented; 146820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 146920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_BaseComponent_Constructor( 147120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent) 147220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 147320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 147420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent; 147520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 147620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 147820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 147920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 148020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 148120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__); 148220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 148320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 148420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 148520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASECOMPONENT)); 148620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent == NULL) { 148720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 148820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 148920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 149020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 149120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pExynosComponent, 0, sizeof(EXYNOS_OMX_BASECOMPONENT)); 149220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->pComponentPrivate = (OMX_PTR)pExynosComponent; 149320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 149420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->msgSemaphoreHandle); 149520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 149620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 149720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 149820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 149920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 150020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_MutexCreate(&pExynosComponent->compMutex); 150120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 150220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 150320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 150420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 150520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 1506d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim ret = Exynos_OSAL_SignalCreate(&pExynosComponent->abendStateEvent); 1507d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim if (ret != OMX_ErrorNone) { 1508d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim ret = OMX_ErrorInsufficientResources; 1509d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 1510d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim goto EXIT; 1511d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim } 151220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 151320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->bExitMessageHandlerThread = OMX_FALSE; 151438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_QueueCreate(&pExynosComponent->messageQ, MAX_QUEUE_ELEMENTS); 151520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_ThreadCreate(&pExynosComponent->hMessageHandler, Exynos_OMX_MessageHandlerThread, pOMXComponent); 151620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 151720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 151820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 151920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 152020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 152120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bMultiThreadProcess = OMX_FALSE; 152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 152420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->GetComponentVersion = &Exynos_OMX_GetComponentVersion; 152520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->SendCommand = &Exynos_OMX_SendCommand; 152620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->GetState = &Exynos_OMX_GetState; 152720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->SetCallbacks = &Exynos_OMX_SetCallbacks; 152820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->UseEGLImage = &Exynos_OMX_UseEGLImage; 152920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 153120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 153220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 153420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 153520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 153620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_BaseComponent_Destructor( 153720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_IN OMX_HANDLETYPE hComponent) 153820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 153920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 154020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 154120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 154220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_S32 semaValue = 0; 154320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 154520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 154620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 154720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 154820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 154920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 155120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 155220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 155320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 155420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 155520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 155620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 155720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 155820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 155920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 156020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 156120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 156220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_CommandQueue(pExynosComponent, EXYNOS_OMX_CommandComponentDeInit, 0, NULL); 156320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SleepMillisec(0); 156420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->msgSemaphoreHandle, &semaValue); 156520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (semaValue == 0) 156620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle); 156720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle); 156820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 156920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_ThreadTerminate(pExynosComponent->hMessageHandler); 157020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->hMessageHandler = NULL; 157120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1572d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim Exynos_OSAL_SignalTerminate(pExynosComponent->abendStateEvent); 1573d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim pExynosComponent->abendStateEvent = NULL; 157420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexTerminate(pExynosComponent->compMutex); 157520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->compMutex = NULL; 157620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SemaphoreTerminate(pExynosComponent->msgSemaphoreHandle); 157720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->msgSemaphoreHandle = NULL; 157820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_QueueTerminate(&pExynosComponent->messageQ); 157920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 158020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosComponent); 158120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = NULL; 158220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 158320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 158420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 158520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 158620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 158720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 158820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 158920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 159020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1591