138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* 238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * you may not use this file except in compliance with the License. 738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * You may obtain a copy of the License at 838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 1138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Unless required by applicable law or agreed to in writing, software 1238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * See the License for the specific language governing permissions and 1538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * limitations under the License. 1638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang */ 1738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 1838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* 1938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @file Exynos_OMX_VdecControl.c 2038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @brief 2138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @history 2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang */ 2638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 2738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <stdio.h> 2838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <stdlib.h> 2938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <string.h> 3038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Macros.h" 3138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h" 3238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Vdec.h" 3338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_VdecControl.h" 3438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Thread.h" 3638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Mutex.h" 3838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_ETC.h" 3938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_SharedMemory.h" 4038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Queue.h" 4138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "csc.h" 4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB 4438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Android.h" 4538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 4638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#undef EXYNOS_LOG_TAG 4838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DECCONTROL" 4938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#define EXYNOS_LOG_OFF 5038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 5138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Log.h" 5238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 5338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 5438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_UseBuffer( 5538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr, 5738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nPortIndex, 5838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_PTR pAppPrivate, 5938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nSizeBytes, 6038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U8 *pBuffer) 6138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 6238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 6438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 6538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 6638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL; 6738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0; 6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 6938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 7438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 8038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 8238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 8538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 8638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 8738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[nPortIndex]; 8838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex >= pExynosComponent->portParam.nPorts) { 8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 9038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->portState != OMX_StateIdle) { 9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 9938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 10038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 10138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 10238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE)); 10338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (temp_bufferHeader == NULL) { 10438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 10538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 10638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 10738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE)); 10838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 10938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 11038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) { 11138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader; 11238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED); 11338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE); 11438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->pBuffer = pBuffer; 11538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nAllocLen = nSizeBytes; 11638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->pAppPrivate = pAppPrivate; 11738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) 11838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX; 11938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 12038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX; 12138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 12238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->assignedBufferNum++; 12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) { 12438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_TRUE; 12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */ 12638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource); 12738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */ 12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 12938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *ppBufferHdr = temp_bufferHeader; 13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 13538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(temp_bufferHeader); 13638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 13738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 13838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 13938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 14038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 14138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 14238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 14338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 14438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateBuffer( 14538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 14638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer, 14738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nPortIndex, 14838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_PTR pAppPrivate, 14938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nSizeBytes) 15038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 15138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 15638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL; 15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U8 *temp_buffer = NULL; 15821015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim int temp_buffer_fd = -1; 15938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0; 16001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin MEMORY_TYPE mem_type; 16138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 16238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 16338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 16438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 16538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 16638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 16738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 16838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 16938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 17038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 17138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 17238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 17338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 17438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 17538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 17638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 17738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 17838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 17938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 18038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 18138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[nPortIndex]; 18238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex >= pExynosComponent->portParam.nPorts) { 18338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 18438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 18538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 18638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* 18738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->portState != OMX_StateIdle ) { 18838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 18938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 19038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 19138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang*/ 19238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 19338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 19438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 19538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 19638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) { 19801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin mem_type = SECURE_MEMORY; 19938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) { 20001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin mem_type = NORMAL_MEMORY; 20138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 20201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin mem_type = SYSTEM_MEMORY; 20301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin } 20401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, mem_type); 20501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin if (temp_buffer == NULL) { 20601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ret = OMX_ErrorInsufficientResources; 20701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin goto EXIT; 20838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 20901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, temp_buffer); 21038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 21138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE)); 21238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (temp_bufferHeader == NULL) { 21301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer); 21438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 21538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 21738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE)); 21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { 22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) { 22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader; 22201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pExynosPort->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd; 22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED); 22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE); 22521015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim if (mem_type == SECURE_MEMORY) 22621015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim temp_bufferHeader->pBuffer = temp_buffer_fd; 22721015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim else 22821015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim temp_bufferHeader->pBuffer = temp_buffer; 22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nAllocLen = nSizeBytes; 23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->pAppPrivate = pAppPrivate; 23138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) 23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX; 23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX; 23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->assignedBufferNum++; 23638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) { 23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_TRUE; 23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */ 23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource); 24038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */ 24138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 24238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *ppBuffer = temp_bufferHeader; 24338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 24738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 24838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(temp_bufferHeader); 24901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer); 25038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 25238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 25438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 25538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 25738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 25838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 25938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeBuffer( 26038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 26138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nPortIndex, 26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr) 26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 26438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 26638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL; 27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U8 *temp_buffer = NULL; 27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0; 27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 27638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 28038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 28838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 28938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 29038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[nPortIndex]; 29238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) { 29438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 29638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 29738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) { 29938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent, 30038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 30138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (OMX_U32)OMX_EventError, 30238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (OMX_U32)OMX_ErrorPortUnpopulated, 30338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang nPortIndex, NULL); 30438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 30538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 30638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) { 30738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) { 30838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) { 30938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) { 31021015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) { 31121015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory, (int)pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer); 31221015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, mapBuffer); 31321015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim } else { 31421015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer); 31521015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim } 31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL; 31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferHdr->pBuffer = NULL; 31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) { 31938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ; /* None*/ 32038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->assignedBufferNum--; 32238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) { 32338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader); 32438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL; 32538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pBufferHdr = NULL; 32638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 32738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE; 32838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 32938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 33038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 33138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 33238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 33338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 33438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) { 33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->assignedBufferNum == 0) { 33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set"); 33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */ 33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource); 34038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */ 34138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.bPopulated = OMX_FALSE; 34238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 34338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 34438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 34538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 34638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 34738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 34838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 34938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 35038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex) 35138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 35238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 35338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 35438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL; 35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U8 *temp_buffer = NULL; 35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 bufferSize = 0; 35738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE portDefinition; 35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorTunnelingUnsupported; 36038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 36138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex) 36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT* pExynosPort = NULL; 36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL; 36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U8 *temp_buffer = NULL; 37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 bufferSize = 0; 37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorTunnelingUnsupported; 37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest( 37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComp, 37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nPort, 38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hTunneledComp, 38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_U32 nTunneledPort, 38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup) 38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorTunnelingUnsupported; 38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[]) 39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pDataBuffer = NULL; 39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->portWayType == WAY1_PORT) { 40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer; 40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosPort->portWayType == WAY2_PORT) { 40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer); 40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer); 40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 40738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex) 41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 416c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *bufferHeader = NULL; 41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *pDataPortBuffer[2] = {NULL, NULL}; 42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 flushNum = 0; 42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 semValue = 0; 42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int i = 0, maxBufferNum = 0; 42438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) { 42938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue); 43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (semValue == 0) 43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID); 43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID); 43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) { 43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData; 43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nFilledLen = 0; 43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == OUTPUT_PORT_INDEX) { 44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader); 44138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (portIndex == INPUT_PORT_INDEX) { 44238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader); 44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(message); 44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang message = NULL; 44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer); 45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == INPUT_PORT_INDEX) { 45138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataPortBuffer[0]->dataValid == OMX_TRUE) 452f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[0]); 45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataPortBuffer[1]->dataValid == OMX_TRUE) 454f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[1]); 45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (portIndex == OUTPUT_PORT_INDEX) { 45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataPortBuffer[0]->dataValid == OMX_TRUE) 457f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[0]); 45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pDataPortBuffer[1]->dataValid == OMX_TRUE) 459f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[1]); 46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) { 46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferProcessType == BUFFER_SHARE) { 46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->processData.bufferHeader != NULL) { 46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == INPUT_PORT_INDEX) { 46638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader); 46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (portIndex == OUTPUT_PORT_INDEX) { 46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader); 46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(&pExynosPort->processData); 47238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 473bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim maxBufferNum = pExynosPort->portDefinition.nBufferCountActual; 47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < maxBufferNum; i++) { 47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) { 47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == OUTPUT_PORT_INDEX) { 47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader); 47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (portIndex == INPUT_PORT_INDEX) { 47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader); 48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(&pExynosPort->processData); 48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 4883b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if ((pExynosPort->bufferProcessType == BUFFER_SHARE) && 4893b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim (portIndex == OUTPUT_PORT_INDEX)){ 4903b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 4913b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim 4923b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if (pOMXComponent->pComponentPrivate == NULL) { 4933b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim ret = OMX_ErrorBadParameter; 4943b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim goto EXIT; 4953b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } 4963b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 4973b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 4983b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim 4993b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim Exynos_OSAL_RefANB_Reset(pVideoDec->hRefHandle); 5003b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } 5013b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim 50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while(1) { 50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 cnt = 0; 50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt); 50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (cnt <= 0) 50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID); 50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ); 51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent) 51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL; 52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL}; 52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 i = 0, cnt = 0; 52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent == NULL) { 52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex); 54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 54638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE; 54738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { 54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent); 55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent); 55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[nPortIndex]; 55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer); 55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY) 55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID); 55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); 56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex); 56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex); 56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_stop(pOMXComponent, nPortIndex); 56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex); 56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex); 566c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim if (pVideoDec->bReconfigDPB == OMX_TRUE) 567c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim pVideoDec->exynos_codec_reconfigAllBuffers(pOMXComponent, nPortIndex); 568c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim else if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY) 56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoDec->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex); 57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(&pExynosPort->processData); 57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) { 57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPortIndex == INPUT_PORT_INDEX) { 57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE; 57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP); 57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS); 57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->getAllDelayBuffer = OMX_FALSE; 57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 58081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim pExynosComponent->bBehaviorEOS = OMX_FALSE; 58138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->reInputData = OMX_FALSE; 58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE; 58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex); 58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bEvent == OMX_TRUE) 58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventCmdComplete, 59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_CommandFlush, nPortIndex, NULL); 59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex); 59338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex); 59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 59638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) { 59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__); 59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, 60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret, 0, NULL); 60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 609bd09b8148180c902648b5ac57d024f457f852efaSeungBeom KimOMX_ERRORTYPE Exynos_ResolutionUpdate(OMX_COMPONENTTYPE *pOMXComponent) 610bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim{ 611bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 612bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 613bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 614bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim EXYNOS_OMX_BASEPORT *pInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 615bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim EXYNOS_OMX_BASEPORT *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 616bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 617bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->cropRectangle.nTop = pOutputPort->newCropRectangle.nTop; 618bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->cropRectangle.nLeft = pOutputPort->newCropRectangle.nLeft; 619bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->cropRectangle.nWidth = pOutputPort->newCropRectangle.nWidth; 620bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->cropRectangle.nHeight = pOutputPort->newCropRectangle.nHeight; 621bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 622bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pInputPort->portDefinition.format.video.nFrameWidth = pInputPort->newPortDefinition.format.video.nFrameWidth; 623bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pInputPort->portDefinition.format.video.nFrameHeight = pInputPort->newPortDefinition.format.video.nFrameHeight; 624bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pInputPort->portDefinition.format.video.nStride = pInputPort->newPortDefinition.format.video.nStride; 625bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pInputPort->portDefinition.format.video.nSliceHeight = pInputPort->newPortDefinition.format.video.nSliceHeight; 626bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 627bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->portDefinition.nBufferCountActual = pOutputPort->newPortDefinition.nBufferCountActual; 628bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim pOutputPort->portDefinition.nBufferCountMin = pOutputPort->newPortDefinition.nBufferCountMin; 629bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 630bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim Exynos_UpdateFrameSize(pOMXComponent); 631bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 632bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim return ret; 633bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim} 634bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim 635f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer) 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *bufferHeader = NULL; 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader = dataBuffer->bufferHeader; 64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader != NULL) { 64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) { 64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent; 64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData; 65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang exynosOMXInputPort->markType.hMarkTargetComponent = NULL; 65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang exynosOMXInputPort->markType.pMarkData = NULL; 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader->hMarkTargetComponent != NULL) { 65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader->hMarkTargetComponent == pOMXComponent) { 65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventMark, 65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 0, 0, bufferHeader->pMarkData); 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent; 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData; 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nFilledLen = 0; 66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nOffset = 0; 66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader); 66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* reset dataBuffer */ 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetDataBuffer(dataBuffer); 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 682440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorUndefined; 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL; 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer); 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState != OMX_StateExecuting) { 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) { 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID); 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (inputUseBuffer->dataValid != OMX_TRUE) { 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (message == NULL) { 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) { 704440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(message); 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorCodecFlush; 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData); 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->allocSize = inputUseBuffer->bufferHeader->nAllocLen; 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->dataLen = inputUseBuffer->bufferHeader->nFilledLen; 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->remainDataLen = inputUseBuffer->dataLen; 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->usedDataLen = 0; 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->dataValid = OMX_TRUE; 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->nFlags = inputUseBuffer->bufferHeader->nFlags; 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->timeStamp = inputUseBuffer->bufferHeader->nTimeStamp; 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(message); 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen) 72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen); 72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 731f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer) 73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BUFFERHEADERTYPE *bufferHeader = NULL; 73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader = dataBuffer->bufferHeader; 74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (bufferHeader != NULL) { 74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nFilledLen = dataBuffer->remainDataLen; 74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nOffset = 0; 74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nFlags = dataBuffer->nFlags; 74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nTimeStamp = dataBuffer->timeStamp; 74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 7487987a0882319055826a1426b7c31c9424575d34aSeungBeom Kim if ((exynosOMXOutputPort->bStoreMetaData == OMX_TRUE) && (bufferHeader->nFilledLen > 0)) 7493b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim bufferHeader->nFilledLen = bufferHeader->nAllocLen; 7503b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim 75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) { 75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent; 75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData; 75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL; 75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->propagateMarkType.pMarkData = NULL; 75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) { 75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!"); 76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler(pOMXComponent, 76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventBufferFlag, 76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OUTPUT_PORT_INDEX, 76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang bufferHeader->nFlags, NULL); 76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader); 76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* reset dataBuffer */ 77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetDataBuffer(dataBuffer); 77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 77838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 781440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorUndefined; 78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL; 78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer); 79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) { 79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer); 79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState != OMX_StateExecuting) { 79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && 79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){ 79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID); 80038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (outputUseBuffer->dataValid != OMX_TRUE) { 80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (message == NULL) { 80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 80438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 80538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 80638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) { 807440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim Exynos_OSAL_Free(message); 80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorCodecFlush; 80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 81138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData); 81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->allocSize = outputUseBuffer->bufferHeader->nAllocLen; 81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen; 81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->remainDataLen = outputUseBuffer->dataLen; 81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset; 81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->dataValid = OMX_TRUE; 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */ 81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */ 82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/* 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bufferProcessType == BUFFER_SHARE) 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->pPrivate = outputUseBuffer->bufferHeader->pOutputPortPrivate; 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer; 82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->processData.allocSize = outputUseBuffer->bufferHeader->nAllocLen; 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang*/ 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Free(message); 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 84054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimOMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) 84154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim{ 84254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim OMX_BUFFERHEADERTYPE *retBuffer = NULL; 84354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 84454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim EXYNOS_OMX_MESSAGE *message = NULL; 84554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 84654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim FunctionIn(); 84754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 84854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim if (pExynosComponent->currentState != OMX_StateExecuting) { 84954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim retBuffer = NULL; 85054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim goto EXIT; 85154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && 85254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){ 85354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID); 85454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 85554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); 85654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim if (message == NULL) { 85754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim retBuffer = NULL; 85854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim goto EXIT; 85954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim } 86054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) { 86154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim Exynos_OSAL_Free(message); 86254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim retBuffer = NULL; 86354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim goto EXIT; 86454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim } 86554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 86654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim retBuffer = (OMX_BUFFERHEADERTYPE *)(message->pCmdData); 86754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim Exynos_OSAL_Free(message); 86854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim } 86954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 87054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimEXIT: 87154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim FunctionOut(); 87254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 87354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim return retBuffer; 87454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim} 87554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim 87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data) 87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort= &pExynosComponent->pExynosPort[PortIndex]; 88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (data == NULL) { 88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInsufficientResources; 88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data); 89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != 0) { 89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID); 89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data) 90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 tempData; 91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[PortIndex]; 91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID); 91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ); 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (tempData == NULL) { 91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *data = NULL; 91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *data = (OMX_PTR)tempData; 92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 92938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 93038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 93138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex) 93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 93438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 93538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 93638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 93738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort= &pExynosComponent->pExynosPort[PortIndex]; 93938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 94038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ); 94138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != 0) { 94238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 94338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 94438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 94538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (1) { 94638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang int cnt = 0; 9473e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt); 94838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (cnt > 0) 94938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID); 95038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang else 95138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 95238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 95338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 95438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 95538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 95638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 95738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 95838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 95938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 96038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 96138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetParameter( 96238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 96338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_INDEXTYPE nParamIndex, 96438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INOUT OMX_PTR ComponentParameterStructure) 96538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 96638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 96738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 96838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 96938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 97038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 97138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 97238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 97338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 97438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 97538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 97638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 97738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 97838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 97938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 98038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 98138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 98238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 98338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 98438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 98538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 98638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 98738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 98838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 98938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 99038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 99138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 99238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 99338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 99438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ComponentParameterStructure == NULL) { 99538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 99638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 99738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 99938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nParamIndex) { 100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoInit: 100138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 100238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure; 100338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE)); 100438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 100538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 100638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 100738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portParam->nPorts = pExynosComponent->portParam.nPorts; 100938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber; 101038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 101138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 101238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 101338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoPortFormat: 101438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 101538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure; 101638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 portIndex = portFormat->nPortIndex; 101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 index = portFormat->nIndex; 101838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 101938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL; 102038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 supportFormatNum = 0; /* supportFormatNum = N-1 */ 102138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 102238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)); 102338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 102438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 102538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 102638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 102738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((portIndex >= pExynosComponent->portParam.nPorts)) { 102838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 102938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 103038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 103138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 103238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 103338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == INPUT_PORT_INDEX) { 103438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1; 103538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (index > supportFormatNum) { 103638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNoMore; 103738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 103838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 103938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 104038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 104138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition = &pExynosPort->portDefinition; 104238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 104338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat; 104438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portFormat->eColorFormat = portDefinition->format.video.eColorFormat; 104538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portFormat->xFramerate = portDefinition->format.video.xFramerate; 104638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (portIndex == OUTPUT_PORT_INDEX) { 104738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 104838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition = &pExynosPort->portDefinition; 104938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 10503b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if ((pExynosPort->bIsANBEnabled == OMX_FALSE) && 10513b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim (pExynosPort->bStoreMetaData == OMX_FALSE)) { 105281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim switch (index) { 105381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim case supportFormat_0: 105481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; 105581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar; 105681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->xFramerate = portDefinition->format.video.xFramerate; 105781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 105881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim case supportFormat_1: 105981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; 106081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 106181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->xFramerate = portDefinition->format.video.xFramerate; 106281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 106381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim case supportFormat_2: 106481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; 106581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12TPhysicalAddress; 106681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->xFramerate = portDefinition->format.video.xFramerate; 106781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 106881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim case supportFormat_3: 106981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; 107081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12Tiled; 107181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->xFramerate = portDefinition->format.video.xFramerate; 107281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 107381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim default: 107481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim if (index > supportFormat_0) { 107581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim ret = OMX_ErrorNoMore; 107681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim goto EXIT; 107781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim } 107881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 107981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim } 108081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim } else { 108181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim switch (index) { 108281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim case supportFormat_0: 108381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; 108481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12Tiled; 108581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim portFormat->xFramerate = portDefinition->format.video.xFramerate; 108681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 108781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim default: 108881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim if (index > supportFormat_0) { 108981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim ret = OMX_ErrorNoMore; 109081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim goto EXIT; 109181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim } 109281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim break; 109338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 109438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 109538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 109638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNone; 109738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 109838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 109938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB 110038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamGetAndroidNativeBuffer: 110138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 110238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_GetANBParameter(hComponent, nParamIndex, ComponentParameterStructure); 110338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 110438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 110538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamPortDefinition: 110638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 110738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure; 110838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 portIndex = portDefinition->nPortIndex; 110938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort; 111038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 111138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure); 111238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 111338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 111438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 111538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 111638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* at this point, GetParameter has done all the verification, we 111738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * just dereference things directly here 111838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang */ 111938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 11203b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if ((pExynosPort->bIsANBEnabled == OMX_TRUE) || 11213b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim (pExynosPort->bStoreMetaData == OMX_TRUE)){ 112238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition->format.video.eColorFormat = 112338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (OMX_COLOR_FORMATTYPE)Exynos_OSAL_OMX2HalPixelFormat(portDefinition->format.video.eColorFormat); 11243b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portDefinition->format.video.eColorFormat:0x%x", portDefinition->format.video.eColorFormat); 112538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 1126bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar 1127bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar // WORKAROUND provided by Google engineer 1128bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar if (portIndex == OUTPUT_PORT_INDEX && 1129bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar (pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 1130bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar // Decoder actually uses width and height as stride and slice height for buffer copy. 1131bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar // Changing only at getParam as the internal value may be used elsewhere 1132bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar portDefinition->format.video.nStride = portDefinition->format.video.nFrameWidth; 1133bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar portDefinition->format.video.nSliceHeight = portDefinition->format.video.nFrameHeight; 1134bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar } 113538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 113638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 113738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 113838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 113938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 114038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure); 114138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 114238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 114338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 114438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 114538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 114638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 114738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 114838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 114938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 115038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter( 115138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 115238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_INDEXTYPE nIndex, 115338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_PTR ComponentParameterStructure) 115438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 115538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 115638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 115738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 115838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 115938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 116038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 116138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 116238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 116338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 116438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 116538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 116638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 116738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 116838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 117438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 117538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 117638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 117738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid ) { 117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 118238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 118338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ComponentParameterStructure == NULL) { 118438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 118538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 118638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nIndex) { 118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamVideoPortFormat: 119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure; 119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 portIndex = portFormat->nPortIndex; 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 index = portFormat->nIndex; 119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL; 119638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 supportFormatNum = 0; 119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)); 119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((portIndex >= pExynosComponent->portParam.nPorts)) { 120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 120538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 120638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 120738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 120838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition = &pExynosPort->portDefinition; 120938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition->format.video.eColorFormat = portFormat->eColorFormat; 121138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat; 121238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang portDefinition->format.video.xFramerate = portFormat->xFramerate; 12133b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim 12143b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portIndex:%d, portFormat->eColorFormat:0x%x", portIndex, portFormat->eColorFormat); 121538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 121638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamPortDefinition: 121938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 1220f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure; 1221f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 1222f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim OMX_U32 portIndex = pPortDefinition->nPortIndex; 1223f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosPort; 122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 width, height, size; 122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 realWidth, realHeight; 12260b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih OMX_U32 originalWidth, originalHeight; 122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex >= pExynosComponent->portParam.nPorts) { 122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadPortIndex; 123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); 123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[portIndex]; 123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) { 124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) { 124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorIncorrectStateOperation; 124238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 124338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 1245f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim if ((pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) || 1246f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && 1247f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim (pPortDefinition->nBufferCountActual > (pExynosPort->portDefinition.nBufferCountMin + MAX_DISPLAY_EXTRA_BUFFER)))) { 124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 12520b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih originalWidth = pExynosPort->portDefinition.format.video.nFrameWidth; 12530b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih originalHeight = pExynosPort->portDefinition.format.video.nFrameHeight; 125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize); 125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 125638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB // Modified by Google engineer 125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* should not affect the format since in ANB case, the caller 125838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * is providing us a HAL format */ 12593b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if ((pExynosPort->bIsANBEnabled == OMX_TRUE) || 12603b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim (pExynosPort->bStoreMetaData == OMX_TRUE)) { 126138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = 126238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort->portDefinition.format.video.eColorFormat); 126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 126438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 126538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang realWidth = pExynosPort->portDefinition.format.video.nFrameWidth; 126738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang realHeight = pExynosPort->portDefinition.format.video.nFrameHeight; 126838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang width = ((realWidth + 15) & (~15)); 126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang height = ((realHeight + 15) & (~15)); 127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang size = (width * height * 3) / 2; 127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.format.video.nStride = width; 127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = height; 127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize; 127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 12750b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih if (realWidth != originalWidth || realHeight != originalHeight) { 12760b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosPort->cropRectangle.nTop = 0; 12770b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosPort->cropRectangle.nLeft = 0; 12780b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosPort->cropRectangle.nWidth = realWidth; 12790b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosPort->cropRectangle.nHeight = realHeight; 12800b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih } 128148d08f911e9d5c4380344a53b290a0a37023a831SeungBeom Kim 128238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (portIndex == INPUT_PORT_INDEX) { 128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth; 128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight; 128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.format.video.nStride = width; 128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.format.video.nSliceHeight = height; 12880b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih // if resetting the output port size, also reset the crop size for the output port; 12890b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih // otherwise, output crop will not be updated when setting up the output port because 12900b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih // the output size would not have changed after we updated it here 12910b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih if (realWidth != originalWidth || realHeight != originalHeight) { 12920b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosOutputPort->cropRectangle.nTop = 0; 12930b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosOutputPort->cropRectangle.nLeft = 0; 12940b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosOutputPort->cropRectangle.nWidth = realWidth; 12950b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih pExynosOutputPort->cropRectangle.nHeight = realHeight; 12960b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih } 129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) { 129938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_COLOR_FormatYUV420Planar: 130038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_COLOR_FormatYUV420SemiPlanar: 130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_SEC_COLOR_FormatNV12TPhysicalAddress: 130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2; 130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_SEC_COLOR_FormatNV12Tiled: 130538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.nBufferSize = 130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) + 130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1); 130838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!"); 131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUnsupportedSetting; 131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) { 131638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosOutputPort->portDefinition.nBufferSize = 131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) + 131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1); 131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB 132438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamEnableAndroidBuffers: 132538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang case OMX_IndexParamUseAndroidNativeBuffer: 13263b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim case OMX_IndexParamStoreMetaDataBuffer: 132738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure); 132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 133038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 1332e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim case OMX_IndexParamEnableThumbnailMode: 1333e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim { 1334e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim EXYNOS_OMX_VIDEO_THUMBNAILMODE *pThumbnailMode = (EXYNOS_OMX_VIDEO_THUMBNAILMODE *)ComponentParameterStructure; 1335e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; 1336e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim 1337e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim ret = Exynos_OMX_Check_SizeVersion(pThumbnailMode, sizeof(EXYNOS_OMX_VIDEO_THUMBNAILMODE)); 1338e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (ret != OMX_ErrorNone) { 1339e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim goto EXIT; 1340e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 1341e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim 1342e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim pVideoDec->bThumbnailMode = pThumbnailMode->bEnable; 1343e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (pVideoDec->bThumbnailMode == OMX_TRUE) { 1344e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 1345e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountMin = 1; 1346e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim pExynosOutputPort->portDefinition.nBufferCountActual = 1; 1347e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 1348e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim 1349e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim ret = OMX_ErrorNone; 1350e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 1351e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim break; 135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang { 135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure); 135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetConfig( 136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_HANDLETYPE hComponent, 136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INDEXTYPE nIndex, 136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR pComponentConfigStructure) 136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pComponentConfigStructure == NULL) { 139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nIndex) { 140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 140138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure); 140238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 141138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig( 141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_HANDLETYPE hComponent, 141338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_INDEXTYPE nIndex, 141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR pComponentConfigStructure) 141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 142338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 143338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 143538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pComponentConfigStructure == NULL) { 143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 144138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang switch (nIndex) { 144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang default: 144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure); 144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 144938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 145438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 145738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex( 145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_HANDLETYPE hComponent, 145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_IN OMX_STRING cParameterName, 146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_OUT OMX_INDEXTYPE *pIndexType) 146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 146438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 146838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (hComponent == NULL) { 146938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 147138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 147238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 147538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 147638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 147738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 147938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 148038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 148238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 148338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 148438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((cParameterName == NULL) || (pIndexType == NULL)) { 148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 148838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->currentState == OMX_StateInvalid) { 148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorInvalidState; 149038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 149138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 149238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB 1494e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0) { 149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers; 1496e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim goto EXIT; 1497e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 1498e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0) { 149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamGetAndroidNativeBuffer; 1500e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim goto EXIT; 1501e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 1502e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0) { 150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamUseAndroidNativeBuffer; 1504e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim goto EXIT; 1505e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 1507e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) { 1508e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim *pIndexType = OMX_IndexParamEnableThumbnailMode; 1509e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim goto EXIT; 1510e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim } 15113b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim#ifdef USE_STOREMETADATA 15123b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) { 15133b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer; 15143b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim goto EXIT; 15153b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } 15163b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim#endif 1517e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim 1518e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType); 151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 152038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB 152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_PLANE nPlane) 152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 152938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 153038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 width, height; 153101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin ExynosVideoPlane planes[MAX_BUFFER_PLANE]; 153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 153301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin memset(planes, 0, sizeof(planes)); 153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 15353b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim width = pExynosPort->portDefinition.format.video.nFrameWidth; 15363b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim height = pExynosPort->portDefinition.format.video.nFrameHeight; 153738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 15383b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if ((pExynosPort->bIsANBEnabled == OMX_TRUE) || 15393b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim (pExynosPort->bStoreMetaData == OMX_TRUE)) { 15403b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim OMX_U32 stride; 154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pUseBuffer->bufferHeader != NULL) && (pUseBuffer->bufferHeader->pBuffer != NULL)) { 15423b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim if (pExynosPort->bIsANBEnabled == OMX_TRUE) { 15431e339948fd5bcee9312ea3701e7b9ace092b37dbSeungBeom Kim Exynos_OSAL_LockANBHandle(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes); 15443b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } else if (pExynosPort->bStoreMetaData == OMX_TRUE) { 15453b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim Exynos_OSAL_LockMetaData(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes); 15463b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } 154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->dataLen = sizeof(void *); 154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (nPlane == TWO_PLANE) { 156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* Case of Shared Buffer, Only support two PlaneBuffer */ 156101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pData->buffer.multiPlaneBuffer.dataBuffer[0] = planes[0].addr; 156201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd; 156301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pData->buffer.multiPlaneBuffer.dataBuffer[1] = planes[1].addr; 156401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin pData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd; 156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane"); 156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorNotImplemented; 156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->allocSize = pUseBuffer->allocSize; 157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = pUseBuffer->dataLen; 157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = pUseBuffer->usedDataLen; 157438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = pUseBuffer->remainDataLen; 157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = pUseBuffer->timeStamp; 157638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = pUseBuffer->nFlags; 157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = pUseBuffer->pPrivate; 157838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = pUseBuffer->bufferHeader; 157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_BASEPORT *pExynosPort) 158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->bufferHeader = pData->bufferHeader; 158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->allocSize = pData->allocSize; 159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->dataLen = pData->dataLen; 159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->usedDataLen = pData->usedDataLen; 159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->remainDataLen = pData->remainDataLen; 159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->timeStamp = pData->timeStamp; 159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->nFlags = pData->nFlags; 159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pUseBuffer->pPrivate = pData->pPrivate; 159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((pUseBuffer->bufferHeader == NULL) || 159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pUseBuffer->bufferHeader->pBuffer == NULL)) { 159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorUndefined; 160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 160138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosPort->bIsANBEnabled == OMX_TRUE) { 16041e339948fd5bcee9312ea3701e7b9ace092b37dbSeungBeom Kim Exynos_OSAL_UnlockANBHandle(pUseBuffer->bufferHeader->pBuffer); 16053b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim } else if (pExynosPort->bStoreMetaData == OMX_TRUE) { 16063b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim Exynos_OSAL_UnlockMetaData(pUseBuffer->bufferHeader->pBuffer); 160738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__); 160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 161138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 161238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 1617