-/*\r
- *\r
- * Copyright 2012 Samsung Electronics S.LSI Co. LTD\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/*\r
- * @file Exynos_OMX_VencControl.c\r
- * @brief\r
- * @author SeungBeom Kim (sbcrux.kim@samsung.com)\r
- * @version 2.0.0\r
- * @history\r
- * 2012.02.20 : Create\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include "Exynos_OMX_Macros.h"\r
-#include "Exynos_OSAL_Event.h"\r
-#include "Exynos_OMX_Venc.h"\r
-#include "Exynos_OMX_VencControl.h"\r
-#include "Exynos_OMX_Basecomponent.h"\r
-#include "Exynos_OSAL_Thread.h"\r
-#include "Exynos_OSAL_Semaphore.h"\r
-#include "Exynos_OSAL_Mutex.h"\r
-#include "Exynos_OSAL_ETC.h"\r
-#include "Exynos_OSAL_SharedMemory.h"\r
-\r
-#ifdef USE_ANB\r
-#include "Exynos_OSAL_Android.h"\r
-#endif\r
-\r
-#undef EXYNOS_LOG_TAG\r
-#define EXYNOS_LOG_TAG "EXYNOS_VIDEO_ENCCONTROL"\r
-#define EXYNOS_LOG_OFF\r
-//#define EXYNOS_TRACE_ON\r
-#include "Exynos_OSAL_Log.h"\r
-\r
-\r
-OMX_ERRORTYPE Exynos_OMX_UseBuffer(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,\r
- OMX_IN OMX_U32 nPortIndex,\r
- OMX_IN OMX_PTR pAppPrivate,\r
- OMX_IN OMX_U32 nSizeBytes,\r
- OMX_IN OMX_U8 *pBuffer)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;\r
- OMX_U32 i = 0;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
- if (nPortIndex >= pExynosComponent->portParam.nPorts) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
- if (pExynosPort->portState != OMX_StateIdle) {\r
- ret = OMX_ErrorIncorrectStateOperation;\r
- goto EXIT;\r
- }\r
-\r
- if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
-\r
- temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));\r
- if (temp_bufferHeader == NULL) {\r
- ret = OMX_ErrorInsufficientResources;\r
- goto EXIT;\r
- }\r
- Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));\r
-\r
- for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {\r
- if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {\r
- pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;\r
- pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);\r
- INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);\r
- temp_bufferHeader->pBuffer = pBuffer;\r
- temp_bufferHeader->nAllocLen = nSizeBytes;\r
- temp_bufferHeader->pAppPrivate = pAppPrivate;\r
- if (nPortIndex == INPUT_PORT_INDEX)\r
- temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;\r
- else\r
- temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;\r
-\r
- pExynosPort->assignedBufferNum++;\r
- if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {\r
- pExynosPort->portDefinition.bPopulated = OMX_TRUE;\r
- /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
- Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);\r
- /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
- }\r
- *ppBufferHdr = temp_bufferHeader;\r
- ret = OMX_ErrorNone;\r
- goto EXIT;\r
- }\r
- }\r
-\r
- Exynos_OSAL_Free(temp_bufferHeader);\r
- ret = OMX_ErrorInsufficientResources;\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,\r
- OMX_IN OMX_U32 nPortIndex,\r
- OMX_IN OMX_PTR pAppPrivate,\r
- OMX_IN OMX_U32 nSizeBytes)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;\r
- OMX_U8 *temp_buffer = NULL;\r
- OMX_U32 i = 0;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
- if (nPortIndex >= pExynosComponent->portParam.nPorts) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
-/*\r
- if (pExynosPort->portState != OMX_StateIdle ) {\r
- ret = OMX_ErrorIncorrectStateOperation;\r
- goto EXIT;\r
- }\r
-*/\r
- if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
-\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, NORMAL_MEMORY);\r
- if (temp_buffer == NULL) {\r
- ret = OMX_ErrorInsufficientResources;\r
- goto EXIT;\r
- }\r
- } else {\r
- temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);\r
- if (temp_buffer == NULL) {\r
- ret = OMX_ErrorInsufficientResources;\r
- goto EXIT;\r
- }\r
- }\r
-\r
- temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));\r
- if (temp_bufferHeader == NULL) {\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);\r
- } else {\r
- Exynos_OSAL_Free(temp_buffer);\r
- }\r
-\r
- temp_buffer = NULL;\r
- ret = OMX_ErrorInsufficientResources;\r
- goto EXIT;\r
- }\r
- Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));\r
-\r
- for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {\r
- if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {\r
- pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;\r
- pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);\r
- INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);\r
- temp_bufferHeader->pBuffer = temp_buffer;\r
- temp_bufferHeader->nAllocLen = nSizeBytes;\r
- temp_bufferHeader->pAppPrivate = pAppPrivate;\r
- if (nPortIndex == INPUT_PORT_INDEX)\r
- temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;\r
- else\r
- temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;\r
- pExynosPort->assignedBufferNum++;\r
- if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {\r
- pExynosPort->portDefinition.bPopulated = OMX_TRUE;\r
- /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
- Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);\r
- /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
- }\r
- *ppBuffer = temp_bufferHeader;\r
- ret = OMX_ErrorNone;\r
- goto EXIT;\r
- }\r
- }\r
-\r
- Exynos_OSAL_Free(temp_bufferHeader);\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);\r
- } else {\r
- Exynos_OSAL_Free(temp_buffer);\r
- }\r
-\r
- ret = OMX_ErrorInsufficientResources;\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FreeBuffer(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_IN OMX_U32 nPortIndex,\r
- OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;\r
- OMX_U8 *temp_buffer = NULL;\r
- OMX_U32 i = 0;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
- pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
-\r
- if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
-\r
- if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {\r
- (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,\r
- pExynosComponent->callbackData,\r
- (OMX_U32)OMX_EventError,\r
- (OMX_U32)OMX_ErrorPortUnpopulated,\r
- nPortIndex, NULL);\r
- }\r
-\r
- for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { // JH Chang for test\r
-// for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {\r
- if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {\r
- if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {\r
- if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);\r
- } else {\r
- Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);\r
- }\r
- pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;\r
- pBufferHdr->pBuffer = NULL;\r
- } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {\r
- ; /* None*/\r
- }\r
- pExynosPort->assignedBufferNum--;\r
- if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {\r
- Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
- pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;\r
- pBufferHdr = NULL;\r
- }\r
- pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;\r
- ret = OMX_ErrorNone;\r
- goto EXIT;\r
- }\r
- }\r
- }\r
-\r
-EXIT:\r
- if (ret == OMX_ErrorNone) {\r
- if (pExynosPort->assignedBufferNum == 0) {\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");\r
- /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
- Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);\r
- /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
- pExynosPort->portDefinition.bPopulated = OMX_FALSE;\r
- }\r
- }\r
-\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;\r
- OMX_U8 *temp_buffer = NULL;\r
- OMX_U32 bufferSize = 0;\r
- OMX_PARAM_PORTDEFINITIONTYPE portDefinition;\r
-\r
- ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT* pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;\r
- OMX_U8 *temp_buffer = NULL;\r
- OMX_U32 bufferSize = 0;\r
-\r
- ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(\r
- OMX_IN OMX_HANDLETYPE hComp,\r
- OMX_IN OMX_U32 nPort,\r
- OMX_IN OMX_HANDLETYPE hTunneledComp,\r
- OMX_IN OMX_U32 nTunneledPort,\r
- OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
-\r
- ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
-\r
- FunctionIn();\r
-\r
- *pDataBuffer = NULL;\r
-\r
- if (pExynosPort->portWayType == WAY1_PORT) {\r
- *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;\r
- } else if (pExynosPort->portWayType == WAY2_PORT) {\r
- pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
- pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);\r
- }\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_BUFFERHEADERTYPE *bufferHeader = NULL;\r
- EXYNOS_OMX_DATABUFFER *pDataPortBuffer[2] = {NULL, NULL};\r
- EXYNOS_OMX_MESSAGE *message = NULL;\r
- OMX_U32 flushNum = 0;\r
- OMX_S32 semValue = 0;\r
- int i = 0, maxBufferNum = 0;\r
- FunctionIn();\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-\r
- while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {\r
- Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);\r
- if (semValue == 0)\r
- Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
-\r
- Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
- message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
- if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {\r
- bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;\r
- bufferHeader->nFilledLen = 0;\r
-\r
- if (portIndex == OUTPUT_PORT_INDEX) {\r
- Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
- } else if (portIndex == INPUT_PORT_INDEX) {\r
- Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
- }\r
- }\r
- Exynos_OSAL_Free(message);\r
- message = NULL;\r
- }\r
-\r
- Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);\r
- if (portIndex == INPUT_PORT_INDEX) {\r
- if (pDataPortBuffer[0]->dataValid == OMX_TRUE)\r
- Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[0]);\r
- if (pDataPortBuffer[1]->dataValid == OMX_TRUE)\r
- Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[1]);\r
- } else if (portIndex == OUTPUT_PORT_INDEX) {\r
- if (pDataPortBuffer[0]->dataValid == OMX_TRUE)\r
- Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);\r
- if (pDataPortBuffer[1]->dataValid == OMX_TRUE)\r
- Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);\r
- }\r
-\r
- if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- if (pExynosPort->processData.bufferHeader != NULL) {\r
- if (portIndex == INPUT_PORT_INDEX) {\r
- Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);\r
- } else if (portIndex == OUTPUT_PORT_INDEX) {\r
- Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);\r
- }\r
- }\r
- Exynos_ResetCodecData(&pExynosPort->processData);\r
-\r
- maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;\r
- for (i = 0; i < maxBufferNum; i++) {\r
- if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {\r
- if (portIndex == OUTPUT_PORT_INDEX) {\r
- Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
- } else if (portIndex == INPUT_PORT_INDEX) {\r
- Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
- }\r
- }\r
- }\r
- }\r
- } else {\r
- Exynos_ResetCodecData(&pExynosPort->processData);\r
- }\r
-\r
- while(1) {\r
- OMX_S32 cnt = 0;\r
- Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);\r
- if (cnt <= 0)\r
- break;\r
- Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
- }\r
- Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL};\r
- OMX_U32 i = 0, cnt = 0;\r
-\r
- FunctionIn();\r
-\r
- if (pOMXComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);\r
-\r
- pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;\r
-\r
- if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {\r
- Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);\r
- } else {\r
- Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);\r
- }\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
- Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);\r
-\r
- if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)\r
- Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);\r
- Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);\r
-\r
- pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);\r
- Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);\r
- pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);\r
- Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);\r
- ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);\r
- if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)\r
- pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);\r
- Exynos_ResetCodecData(&pExynosPort->processData);\r
-\r
- if (ret == OMX_ErrorNone) {\r
- if (nPortIndex == INPUT_PORT_INDEX) {\r
- pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;\r
- pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;\r
- Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);\r
- Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);\r
- pExynosComponent->getAllDelayBuffer = OMX_FALSE;\r
- pExynosComponent->bSaveFlagEOS = OMX_FALSE;\r
- pExynosComponent->reInputData = OMX_FALSE;\r
- }\r
-\r
- pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", pOMXComponent, nPortIndex);\r
- if (bEvent == OMX_TRUE)\r
- pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventCmdComplete,\r
- OMX_CommandFlush, nPortIndex, NULL);\r
- }\r
- Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);\r
- Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);\r
-\r
-EXIT:\r
- if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {\r
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);\r
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventError,\r
- ret, 0, NULL);\r
- }\r
-\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
- EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;\r
- OMX_BUFFERHEADERTYPE *bufferHeader = NULL;\r
-\r
- FunctionIn();\r
-\r
- if ((exynosOMXInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
- dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.inputDataBuffer);\r
- } else if (exynosOMXInputPort->bufferProcessType == BUFFER_SHARE) {\r
- dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.outputDataBuffer);\r
- }\r
-\r
- bufferHeader = dataBuffer->bufferHeader;\r
-\r
- if (bufferHeader != NULL) {\r
- if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {\r
- bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent;\r
- bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData;\r
- exynosOMXInputPort->markType.hMarkTargetComponent = NULL;\r
- exynosOMXInputPort->markType.pMarkData = NULL;\r
- }\r
-\r
- if (bufferHeader->hMarkTargetComponent != NULL) {\r
- if (bufferHeader->hMarkTargetComponent == pOMXComponent) {\r
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventMark,\r
- 0, 0, bufferHeader->pMarkData);\r
- } else {\r
- pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;\r
- pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;\r
- }\r
- }\r
-\r
- bufferHeader->nFilledLen = 0;\r
- bufferHeader->nOffset = 0;\r
- Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
- }\r
-\r
- /* reset dataBuffer */\r
- Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
- OMX_BUFFERHEADERTYPE *bufferHeader = NULL;\r
-\r
- FunctionIn();\r
-\r
- bufferHeader = dataBuffer->bufferHeader;\r
-\r
- if (bufferHeader != NULL) {\r
- if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {\r
- bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent;\r
- bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData;\r
- exynosOMXInputPort->markType.hMarkTargetComponent = NULL;\r
- exynosOMXInputPort->markType.pMarkData = NULL;\r
- }\r
-\r
- if (bufferHeader->hMarkTargetComponent != NULL) {\r
- if (bufferHeader->hMarkTargetComponent == pOMXComponent) {\r
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventMark,\r
- 0, 0, bufferHeader->pMarkData);\r
- } else {\r
- pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;\r
- pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;\r
- }\r
- }\r
-\r
- bufferHeader->nFilledLen = 0;\r
- bufferHeader->nOffset = 0;\r
- Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
- }\r
-\r
- /* reset dataBuffer */\r
- Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
- EXYNOS_OMX_MESSAGE *message = NULL;\r
- EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;\r
-\r
- FunctionIn();\r
-\r
- inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
-\r
- if (pExynosComponent->currentState != OMX_StateExecuting) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&\r
- (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {\r
- Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);\r
- if (inputUseBuffer->dataValid != OMX_TRUE) {\r
- message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
- if (message == NULL) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- }\r
-\r
- if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {\r
- ret = OMX_ErrorCodecFlush;\r
- goto EXIT;\r
- }\r
-\r
- inputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);\r
- inputUseBuffer->allocSize = inputUseBuffer->bufferHeader->nAllocLen;\r
- inputUseBuffer->dataLen = inputUseBuffer->bufferHeader->nFilledLen;\r
- inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;\r
- inputUseBuffer->usedDataLen = 0;\r
- inputUseBuffer->dataValid = OMX_TRUE;\r
- inputUseBuffer->nFlags = inputUseBuffer->bufferHeader->nFlags;\r
- inputUseBuffer->timeStamp = inputUseBuffer->bufferHeader->nTimeStamp;\r
-\r
- Exynos_OSAL_Free(message);\r
-\r
- if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)\r
- Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
- EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;\r
- OMX_BUFFERHEADERTYPE *bufferHeader = NULL;\r
-\r
- FunctionIn();\r
-\r
- dataBuffer = &(exynosOMXOutputPort->way.port2WayDataBuffer.outputDataBuffer);\r
- bufferHeader = dataBuffer->bufferHeader;\r
-\r
- if (bufferHeader != NULL) {\r
- bufferHeader->nFilledLen = dataBuffer->remainDataLen;\r
- bufferHeader->nOffset = 0;\r
- bufferHeader->nFlags = dataBuffer->nFlags;\r
- bufferHeader->nTimeStamp = dataBuffer->timeStamp;\r
-\r
- if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {\r
- bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;\r
- bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;\r
- pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;\r
- pExynosComponent->propagateMarkType.pMarkData = NULL;\r
- }\r
-\r
- if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {\r
- bufferHeader->nFilledLen = 0;\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");\r
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventBufferFlag,\r
- OUTPUT_PORT_INDEX,\r
- bufferHeader->nFlags, NULL);\r
- }\r
-\r
- Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
- }\r
-\r
- /* reset dataBuffer */\r
- Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
- OMX_BUFFERHEADERTYPE *bufferHeader = NULL;\r
-\r
- FunctionIn();\r
-\r
- bufferHeader = dataBuffer->bufferHeader;\r
-\r
- if (bufferHeader != NULL) {\r
- bufferHeader->nFilledLen = dataBuffer->remainDataLen;\r
- bufferHeader->nOffset = 0;\r
- bufferHeader->nFlags = dataBuffer->nFlags;\r
- bufferHeader->nTimeStamp = dataBuffer->timeStamp;\r
-\r
- if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {\r
- bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;\r
- bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;\r
- pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;\r
- pExynosComponent->propagateMarkType.pMarkData = NULL;\r
- }\r
-\r
- if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {\r
- bufferHeader->nFilledLen = 0;\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");\r
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
- pExynosComponent->callbackData,\r
- OMX_EventBufferFlag,\r
- OUTPUT_PORT_INDEX,\r
- bufferHeader->nFlags, NULL);\r
- }\r
-\r
- Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
- }\r
-\r
- /* reset dataBuffer */\r
- Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
- EXYNOS_OMX_MESSAGE *message = NULL;\r
- EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;\r
-\r
- FunctionIn();\r
-\r
- if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
- outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);\r
- } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
- outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
- }\r
-\r
- if (pExynosComponent->currentState != OMX_StateExecuting) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&\r
- (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){\r
- Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);\r
- if (outputUseBuffer->dataValid != OMX_TRUE) {\r
- message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
- if (message == NULL) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- }\r
- if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {\r
- ret = OMX_ErrorCodecFlush;\r
- goto EXIT;\r
- }\r
-\r
- outputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);\r
- outputUseBuffer->allocSize = outputUseBuffer->bufferHeader->nAllocLen;\r
- outputUseBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;\r
- outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;\r
- outputUseBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;\r
- outputUseBuffer->dataValid = OMX_TRUE;\r
- /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */\r
- /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */\r
-/*\r
- if (pExynosPort->bufferProcessType == BUFFER_SHARE)\r
- outputUseBuffer->pPrivate = outputUseBuffer->bufferHeader->pOutputPortPrivate;\r
- else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
- pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;\r
- pExynosPort->processData.allocSize = outputUseBuffer->bufferHeader->nAllocLen;\r
- }\r
-*/\r
-\r
- Exynos_OSAL_Free(message);\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- FunctionIn();\r
-\r
- pExynosPort= &pExynosComponent->pExynosPort[PortIndex];\r
-\r
- if (data == NULL) {\r
- ret = OMX_ErrorInsufficientResources;\r
- goto EXIT;\r
- }\r
-\r
- ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);\r
- if (ret != 0) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- }\r
- Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);\r
-\r
- ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_U32 tempData;\r
-\r
- FunctionIn();\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[PortIndex];\r
- Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);\r
- tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);\r
- if (tempData == NULL) {\r
- *data = NULL;\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- }\r
- *data = (OMX_PTR)tempData;\r
-\r
- ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- FunctionIn();\r
-\r
- pExynosPort= &pExynosComponent->pExynosPort[PortIndex];\r
-\r
- ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);\r
- if (ret != 0) {\r
- ret = OMX_ErrorUndefined;\r
- goto EXIT;\r
- }\r
- while (1) {\r
- int cnt = 0;\r
- Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);\r
- if (cnt > 0)\r
- Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);\r
- else\r
- break;\r
- }\r
- ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_IN OMX_INDEXTYPE nParamIndex,\r
- OMX_INOUT OMX_PTR ComponentParameterStructure)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
- if (pExynosComponent->currentState == OMX_StateInvalid ) {\r
- ret = OMX_ErrorInvalidState;\r
- goto EXIT;\r
- }\r
-\r
- if (ComponentParameterStructure == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
-\r
- switch (nParamIndex) {\r
- case OMX_IndexParamVideoInit:\r
- {\r
- OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;\r
- ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- portParam->nPorts = pExynosComponent->portParam.nPorts;\r
- portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
- case OMX_IndexParamVideoPortFormat:\r
- {\r
- OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = portFormat->nPortIndex;\r
- OMX_U32 index = portFormat->nIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
- OMX_U32 supportFormatNum = 0;\r
-\r
- ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if ((portIndex >= pExynosComponent->portParam.nPorts)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
-\r
-\r
- if (portIndex == INPUT_PORT_INDEX) {\r
- pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- switch (index) {\r
- case supportFormat_0:\r
- portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
- portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- break;\r
- case supportFormat_1:\r
- portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
- portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- break;\r
- case supportFormat_2:\r
- portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
- portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- break;\r
- case supportFormat_3:\r
- portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
- portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV21Linear;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- break;\r
- case supportFormat_4:\r
- portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
- portFormat->eColorFormat = OMX_COLOR_FormatAndroidOpaque;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- break;\r
- default:\r
- if (index > supportFormat_0) {\r
- ret = OMX_ErrorNoMore;\r
- goto EXIT;\r
- }\r
- break;\r
- }\r
- } else if (portIndex == OUTPUT_PORT_INDEX) {\r
- supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;\r
- if (index > supportFormatNum) {\r
- ret = OMX_ErrorNoMore;\r
- goto EXIT;\r
- }\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;\r
- portFormat->eColorFormat = portDefinition->format.video.eColorFormat;\r
- portFormat->xFramerate = portDefinition->format.video.xFramerate;\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
- case OMX_IndexParamVideoBitrate:\r
- {\r
- OMX_VIDEO_PARAM_BITRATETYPE *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = videoRateControl->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- videoRateControl->eControlRate = pVideoEnc->eControlRate[portIndex];\r
- videoRateControl->nTargetBitrate = portDefinition->format.video.nBitrate;\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
- case OMX_IndexParamVideoQuantization:\r
- {\r
- OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = videoQuantizationControl->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- videoQuantizationControl->nQpI = pVideoEnc->quantization.nQpI;\r
- videoQuantizationControl->nQpP = pVideoEnc->quantization.nQpP;\r
- videoQuantizationControl->nQpB = pVideoEnc->quantization.nQpB;\r
- }\r
- ret = OMX_ErrorNone;\r
-\r
- }\r
- break;\r
- case OMX_IndexParamPortDefinition:\r
- {\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = portDefinition->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort;\r
-\r
- if (portIndex >= pExynosComponent->portParam.nPorts) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
- ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);\r
-\r
-#ifdef USE_STOREMETADATA\r
- if ((portIndex == 0) && (pExynosPort->bStoreMetaData == OMX_TRUE)) {\r
- portDefinition->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;\r
- }\r
-#endif\r
- }\r
- break;\r
- default:\r
- {\r
- ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);\r
- }\r
- break;\r
- }\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_IN OMX_INDEXTYPE nIndex,\r
- OMX_IN OMX_PTR ComponentParameterStructure)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
- if (pExynosComponent->currentState == OMX_StateInvalid ) {\r
- ret = OMX_ErrorInvalidState;\r
- goto EXIT;\r
- }\r
-\r
- if (ComponentParameterStructure == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
-\r
- switch (nIndex) {\r
- case OMX_IndexParamVideoPortFormat:\r
- {\r
- OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = portFormat->nPortIndex;\r
- OMX_U32 index = portFormat->nIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
- OMX_U32 supportFormatNum = 0;\r
-\r
- ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if ((portIndex >= pExynosComponent->portParam.nPorts)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- portDefinition->format.video.eColorFormat = portFormat->eColorFormat;\r
- portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;\r
- portDefinition->format.video.xFramerate = portFormat->xFramerate;\r
- }\r
- }\r
- break;\r
- case OMX_IndexParamVideoBitrate:\r
- {\r
- OMX_VIDEO_PARAM_BITRATETYPE *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = videoRateControl->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- pVideoEnc->eControlRate[portIndex] = videoRateControl->eControlRate;\r
- portDefinition->format.video.nBitrate = videoRateControl->nTargetBitrate;\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
- case OMX_IndexParamVideoQuantization:\r
- {\r
- OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = videoQuantizationControl->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
- OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- portDefinition = &pExynosPort->portDefinition;\r
-\r
- pVideoEnc->quantization.nQpI = videoQuantizationControl->nQpI;\r
- pVideoEnc->quantization.nQpP = videoQuantizationControl->nQpP;\r
- pVideoEnc->quantization.nQpB = videoQuantizationControl->nQpB;\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
- case OMX_IndexParamPortDefinition:\r
- {\r
- OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;\r
- OMX_U32 portIndex = pPortDefinition->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort;\r
- OMX_U32 width, height, size;\r
-\r
- if (portIndex >= pExynosComponent->portParam.nPorts) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- }\r
- ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-\r
- if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {\r
- if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {\r
- ret = OMX_ErrorIncorrectStateOperation;\r
- goto EXIT;\r
- }\r
- }\r
- if(pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
-\r
- Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);\r
- if (portIndex == INPUT_PORT_INDEX) {\r
- EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
- Exynos_UpdateFrameSize(pOMXComponent);\r
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",\r
- pExynosOutputPort->portDefinition.nBufferSize);\r
- }\r
- ret = OMX_ErrorNone;\r
- }\r
- break;\r
-#ifdef USE_STOREMETADATA\r
- case OMX_IndexParamStoreMetaDataBuffer:\r
- {\r
- ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);\r
- }\r
- break;\r
-#endif\r
- default:\r
- {\r
- ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);\r
- }\r
- break;\r
- }\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(\r
- OMX_HANDLETYPE hComponent,\r
- OMX_INDEXTYPE nIndex,\r
- OMX_PTR pComponentConfigStructure)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL || pComponentConfigStructure == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
-\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- if (pExynosComponent->currentState == OMX_StateInvalid) {\r
- ret = OMX_ErrorInvalidState;\r
- goto EXIT;\r
- }\r
-\r
- switch (nIndex) {\r
- case OMX_IndexConfigVideoBitrate:\r
- {\r
- OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;\r
- OMX_U32 portIndex = pEncodeBitrate->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- pEncodeBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;\r
- }\r
- }\r
- break;\r
- case OMX_IndexConfigVideoFramerate:\r
- {\r
- OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;\r
- OMX_U32 portIndex = pFramerate->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- pFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;\r
- }\r
- }\r
- break;\r
- default:\r
- ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);\r
- break;\r
- }\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(\r
- OMX_HANDLETYPE hComponent,\r
- OMX_INDEXTYPE nIndex,\r
- OMX_PTR pComponentConfigStructure)\r
- {\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL || pComponentConfigStructure == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
-\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
- if (pExynosComponent->currentState == OMX_StateInvalid) {\r
- ret = OMX_ErrorInvalidState;\r
- goto EXIT;\r
- }\r
-\r
- switch (nIndex) {\r
- case OMX_IndexConfigVideoBitrate:\r
- {\r
- OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;\r
- OMX_U32 portIndex = pEncodeBitrate->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- pExynosPort->portDefinition.format.video.nBitrate = pEncodeBitrate->nEncodeBitrate;\r
- }\r
- }\r
- break;\r
- case OMX_IndexConfigVideoFramerate:\r
- {\r
- OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;\r
- OMX_U32 portIndex = pFramerate->nPortIndex;\r
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
- pExynosPort->portDefinition.format.video.xFramerate = pFramerate->xEncodeFramerate;\r
- }\r
- }\r
- break;\r
- case OMX_IndexConfigVideoIntraVOPRefresh:\r
- {\r
- OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;\r
- EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);\r
- OMX_U32 portIndex = pIntraRefreshVOP->nPortIndex;\r
-\r
- if ((portIndex != OUTPUT_PORT_INDEX)) {\r
- ret = OMX_ErrorBadPortIndex;\r
- goto EXIT;\r
- } else {\r
- pVEncBase->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;\r
- }\r
- }\r
- break;\r
- default:\r
- ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);\r
- break;\r
- }\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(\r
- OMX_IN OMX_HANDLETYPE hComponent,\r
- OMX_IN OMX_STRING cParameterName,\r
- OMX_OUT OMX_INDEXTYPE *pIndexType)\r
-{\r
- OMX_ERRORTYPE ret = OMX_ErrorNone;\r
- OMX_COMPONENTTYPE *pOMXComponent = NULL;\r
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
- FunctionIn();\r
-\r
- if (hComponent == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
- ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
- if (ret != OMX_ErrorNone) {\r
- goto EXIT;\r
- }\r
-\r
- if (pOMXComponent->pComponentPrivate == NULL) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
- if ((cParameterName == NULL) || (pIndexType == NULL)) {\r
- ret = OMX_ErrorBadParameter;\r
- goto EXIT;\r
- }\r
- if (pExynosComponent->currentState == OMX_StateInvalid) {\r
- ret = OMX_ErrorInvalidState;\r
- goto EXIT;\r
- }\r
-\r
-#ifdef USE_STOREMETADATA\r
- if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {\r
- *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;\r
- } else {\r
- ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);\r
- }\r
-#else\r
- ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);\r
-#endif\r
-\r
-EXIT:\r
- FunctionOut();\r
-\r
- return ret;\r
-}\r
+/*
+ *
+ * Copyright 2012 Samsung Electronics S.LSI Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * @file Exynos_OMX_VencControl.c
+ * @brief
+ * @author SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version 2.0.0
+ * @history
+ * 2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "Exynos_OMX_Macros.h"
+#include "Exynos_OSAL_Event.h"
+#include "Exynos_OMX_Venc.h"
+#include "Exynos_OMX_VencControl.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OSAL_Thread.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_SharedMemory.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+#undef EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG "EXYNOS_VIDEO_ENCCONTROL"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+OMX_ERRORTYPE Exynos_OMX_UseBuffer(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_PTR pAppPrivate,
+ OMX_IN OMX_U32 nSizeBytes,
+ OMX_IN OMX_U8 *pBuffer)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
+ OMX_U32 i = 0;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+ pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+ if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+ if (pExynosPort->portState != OMX_StateIdle) {
+ ret = OMX_ErrorIncorrectStateOperation;
+ goto EXIT;
+ }
+
+ if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+ temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+ if (temp_bufferHeader == NULL) {
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
+
+ for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+ if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
+ pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
+ pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
+ INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
+ temp_bufferHeader->pBuffer = pBuffer;
+ temp_bufferHeader->nAllocLen = nSizeBytes;
+ temp_bufferHeader->pAppPrivate = pAppPrivate;
+ if (nPortIndex == INPUT_PORT_INDEX)
+ temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
+ else
+ temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
+
+ pExynosPort->assignedBufferNum++;
+ if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
+ pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+ /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+ Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
+ /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+ }
+ *ppBufferHdr = temp_bufferHeader;
+ ret = OMX_ErrorNone;
+ goto EXIT;
+ }
+ }
+
+ Exynos_OSAL_Free(temp_bufferHeader);
+ ret = OMX_ErrorInsufficientResources;
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_PTR pAppPrivate,
+ OMX_IN OMX_U32 nSizeBytes)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
+ OMX_U8 *temp_buffer = NULL;
+ OMX_U32 i = 0;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+ pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+ if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+/*
+ if (pExynosPort->portState != OMX_StateIdle ) {
+ ret = OMX_ErrorIncorrectStateOperation;
+ goto EXIT;
+ }
+*/
+ if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, NORMAL_MEMORY);
+ if (temp_buffer == NULL) {
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ } else {
+ temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);
+ if (temp_buffer == NULL) {
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ }
+
+ temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+ if (temp_bufferHeader == NULL) {
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
+ } else {
+ Exynos_OSAL_Free(temp_buffer);
+ }
+
+ temp_buffer = NULL;
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
+
+ for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+ if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
+ pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
+ pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
+ INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
+ temp_bufferHeader->pBuffer = temp_buffer;
+ temp_bufferHeader->nAllocLen = nSizeBytes;
+ temp_bufferHeader->pAppPrivate = pAppPrivate;
+ if (nPortIndex == INPUT_PORT_INDEX)
+ temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
+ else
+ temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
+ pExynosPort->assignedBufferNum++;
+ if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
+ pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+ /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+ Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
+ /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+ }
+ *ppBuffer = temp_bufferHeader;
+ ret = OMX_ErrorNone;
+ goto EXIT;
+ }
+ }
+
+ Exynos_OSAL_Free(temp_bufferHeader);
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
+ } else {
+ Exynos_OSAL_Free(temp_buffer);
+ }
+
+ ret = OMX_ErrorInsufficientResources;
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
+ OMX_U8 *temp_buffer = NULL;
+ OMX_U32 i = 0;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+ if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+ if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
+ (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
+ pExynosComponent->callbackData,
+ (OMX_U32)OMX_EventError,
+ (OMX_U32)OMX_ErrorPortUnpopulated,
+ nPortIndex, NULL);
+ }
+
+ for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { // JH Chang for test
+// for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
+ if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
+ if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
+ if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+ } else {
+ Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+ }
+ pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
+ pBufferHdr->pBuffer = NULL;
+ } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
+ ; /* None*/
+ }
+ pExynosPort->assignedBufferNum--;
+ if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
+ Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+ pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
+ pBufferHdr = NULL;
+ }
+ pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
+ ret = OMX_ErrorNone;
+ goto EXIT;
+ }
+ }
+ }
+
+EXIT:
+ if (ret == OMX_ErrorNone) {
+ if (pExynosPort->assignedBufferNum == 0) {
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
+ /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+ Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
+ /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+ pExynosPort->portDefinition.bPopulated = OMX_FALSE;
+ }
+ }
+
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
+ OMX_U8 *temp_buffer = NULL;
+ OMX_U32 bufferSize = 0;
+ OMX_PARAM_PORTDEFINITIONTYPE portDefinition;
+
+ ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
+ OMX_U8 *temp_buffer = NULL;
+ OMX_U32 bufferSize = 0;
+
+ ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 nPort,
+ OMX_IN OMX_HANDLETYPE hTunneledComp,
+ OMX_IN OMX_U32 nTunneledPort,
+ OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+ ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+ FunctionIn();
+
+ *pDataBuffer = NULL;
+
+ if (pExynosPort->portWayType == WAY1_PORT) {
+ *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
+ } else if (pExynosPort->portWayType == WAY2_PORT) {
+ pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+ pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
+ }
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
+ EXYNOS_OMX_DATABUFFER *pDataPortBuffer[2] = {NULL, NULL};
+ EXYNOS_OMX_MESSAGE *message = NULL;
+ OMX_U32 flushNum = 0;
+ OMX_S32 semValue = 0;
+ int i = 0, maxBufferNum = 0;
+ FunctionIn();
+
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+ while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
+ Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
+ if (semValue == 0)
+ Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+
+ Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+ message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+ if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
+ bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
+ bufferHeader->nFilledLen = 0;
+
+ if (portIndex == OUTPUT_PORT_INDEX) {
+ Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+ } else if (portIndex == INPUT_PORT_INDEX) {
+ Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+ }
+ }
+ Exynos_OSAL_Free(message);
+ message = NULL;
+ }
+
+ Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);
+ if (portIndex == INPUT_PORT_INDEX) {
+ if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
+ Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
+ if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
+ Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
+ } else if (portIndex == OUTPUT_PORT_INDEX) {
+ if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
+ Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
+ if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
+ Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
+ }
+
+ if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ if (pExynosPort->processData.bufferHeader != NULL) {
+ if (portIndex == INPUT_PORT_INDEX) {
+ Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
+ } else if (portIndex == OUTPUT_PORT_INDEX) {
+ Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
+ }
+ }
+ Exynos_ResetCodecData(&pExynosPort->processData);
+
+ maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;
+ for (i = 0; i < maxBufferNum; i++) {
+ if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
+ if (portIndex == OUTPUT_PORT_INDEX) {
+ Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+ } else if (portIndex == INPUT_PORT_INDEX) {
+ Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+ }
+ }
+ }
+ }
+ } else {
+ Exynos_ResetCodecData(&pExynosPort->processData);
+ }
+
+ while(1) {
+ OMX_S32 cnt = 0;
+ Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
+ if (cnt <= 0)
+ break;
+ Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+ }
+ Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL};
+ OMX_U32 i = 0, cnt = 0;
+
+ FunctionIn();
+
+ if (pOMXComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
+
+ pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
+
+ if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+ Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+ } else {
+ Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
+ }
+
+ pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+ Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
+
+ if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+ Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
+ Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+
+ pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
+ Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
+ pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);
+ Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);
+ ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
+ if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+ pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
+ Exynos_ResetCodecData(&pExynosPort->processData);
+
+ if (ret == OMX_ErrorNone) {
+ if (nPortIndex == INPUT_PORT_INDEX) {
+ pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
+ pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+ Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+ Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+ pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+ pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+ pExynosComponent->reInputData = OMX_FALSE;
+ }
+
+ pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", pOMXComponent, nPortIndex);
+ if (bEvent == OMX_TRUE)
+ pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventCmdComplete,
+ OMX_CommandFlush, nPortIndex, NULL);
+ }
+ Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);
+ Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);
+
+EXIT:
+ if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
+ pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventError,
+ ret, 0, NULL);
+ }
+
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+ EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
+ OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
+
+ FunctionIn();
+
+ if ((exynosOMXInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+ dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.inputDataBuffer);
+ } else if (exynosOMXInputPort->bufferProcessType == BUFFER_SHARE) {
+ dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.outputDataBuffer);
+ }
+
+ bufferHeader = dataBuffer->bufferHeader;
+
+ if (bufferHeader != NULL) {
+ if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
+ bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent;
+ bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData;
+ exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
+ exynosOMXInputPort->markType.pMarkData = NULL;
+ }
+
+ if (bufferHeader->hMarkTargetComponent != NULL) {
+ if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
+ pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventMark,
+ 0, 0, bufferHeader->pMarkData);
+ } else {
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
+ pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
+ }
+ }
+
+ bufferHeader->nFilledLen = 0;
+ bufferHeader->nOffset = 0;
+ Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+ }
+
+ /* reset dataBuffer */
+ Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+ OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
+
+ FunctionIn();
+
+ bufferHeader = dataBuffer->bufferHeader;
+
+ if (bufferHeader != NULL) {
+ if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
+ bufferHeader->hMarkTargetComponent = exynosOMXInputPort->markType.hMarkTargetComponent;
+ bufferHeader->pMarkData = exynosOMXInputPort->markType.pMarkData;
+ exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
+ exynosOMXInputPort->markType.pMarkData = NULL;
+ }
+
+ if (bufferHeader->hMarkTargetComponent != NULL) {
+ if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
+ pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventMark,
+ 0, 0, bufferHeader->pMarkData);
+ } else {
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
+ pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
+ }
+ }
+
+ bufferHeader->nFilledLen = 0;
+ bufferHeader->nOffset = 0;
+ Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+ }
+
+ /* reset dataBuffer */
+ Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+ EXYNOS_OMX_MESSAGE *message = NULL;
+ EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
+
+ FunctionIn();
+
+ inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+
+ if (pExynosComponent->currentState != OMX_StateExecuting) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+ (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
+ Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+ if (inputUseBuffer->dataValid != OMX_TRUE) {
+ message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+ if (message == NULL) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ }
+
+ if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+ ret = OMX_ErrorCodecFlush;
+ goto EXIT;
+ }
+
+ inputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+ inputUseBuffer->allocSize = inputUseBuffer->bufferHeader->nAllocLen;
+ inputUseBuffer->dataLen = inputUseBuffer->bufferHeader->nFilledLen;
+ inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;
+ inputUseBuffer->usedDataLen = 0;
+ inputUseBuffer->dataValid = OMX_TRUE;
+ inputUseBuffer->nFlags = inputUseBuffer->bufferHeader->nFlags;
+ inputUseBuffer->timeStamp = inputUseBuffer->bufferHeader->nTimeStamp;
+
+ Exynos_OSAL_Free(message);
+
+ if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)
+ Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);
+ }
+ ret = OMX_ErrorNone;
+ }
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
+ OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
+
+ FunctionIn();
+
+ dataBuffer = &(exynosOMXOutputPort->way.port2WayDataBuffer.outputDataBuffer);
+ bufferHeader = dataBuffer->bufferHeader;
+
+ if (bufferHeader != NULL) {
+ bufferHeader->nFilledLen = dataBuffer->remainDataLen;
+ bufferHeader->nOffset = 0;
+ bufferHeader->nFlags = dataBuffer->nFlags;
+ bufferHeader->nTimeStamp = dataBuffer->timeStamp;
+
+ if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
+ bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
+ bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
+ pExynosComponent->propagateMarkType.pMarkData = NULL;
+ }
+
+ if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+ bufferHeader->nFilledLen = 0;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
+ pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventBufferFlag,
+ OUTPUT_PORT_INDEX,
+ bufferHeader->nFlags, NULL);
+ }
+
+ Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+ }
+
+ /* reset dataBuffer */
+ Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ OMX_BUFFERHEADERTYPE *bufferHeader = NULL;
+
+ FunctionIn();
+
+ bufferHeader = dataBuffer->bufferHeader;
+
+ if (bufferHeader != NULL) {
+ bufferHeader->nFilledLen = dataBuffer->remainDataLen;
+ bufferHeader->nOffset = 0;
+ bufferHeader->nFlags = dataBuffer->nFlags;
+ bufferHeader->nTimeStamp = dataBuffer->timeStamp;
+
+ if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
+ bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
+ bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
+ pExynosComponent->propagateMarkType.pMarkData = NULL;
+ }
+
+ if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+ bufferHeader->nFilledLen = 0;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
+ pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+ pExynosComponent->callbackData,
+ OMX_EventBufferFlag,
+ OUTPUT_PORT_INDEX,
+ bufferHeader->nFlags, NULL);
+ }
+
+ Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+ }
+
+ /* reset dataBuffer */
+ Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ EXYNOS_OMX_MESSAGE *message = NULL;
+ EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
+
+ FunctionIn();
+
+ if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+ outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
+ } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+ outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+ }
+
+ if (pExynosComponent->currentState != OMX_StateExecuting) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+ (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+ Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+ if (outputUseBuffer->dataValid != OMX_TRUE) {
+ message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+ if (message == NULL) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ }
+ if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+ ret = OMX_ErrorCodecFlush;
+ goto EXIT;
+ }
+
+ outputUseBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+ outputUseBuffer->allocSize = outputUseBuffer->bufferHeader->nAllocLen;
+ outputUseBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;
+ outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;
+ outputUseBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;
+ outputUseBuffer->dataValid = OMX_TRUE;
+ /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
+ /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
+/*
+ if (pExynosPort->bufferProcessType == BUFFER_SHARE)
+ outputUseBuffer->pPrivate = outputUseBuffer->bufferHeader->pOutputPortPrivate;
+ else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+ pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
+ pExynosPort->processData.allocSize = outputUseBuffer->bufferHeader->nAllocLen;
+ }
+*/
+
+ Exynos_OSAL_Free(message);
+ }
+ ret = OMX_ErrorNone;
+ }
+EXIT:
+ FunctionOut();
+
+ return ret;
+
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ FunctionIn();
+
+ pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
+
+ if (data == NULL) {
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+
+ ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
+ if (ret != 0) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ }
+ Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
+
+ ret = OMX_ErrorNone;
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_U32 tempData;
+
+ FunctionIn();
+
+ pExynosPort = &pExynosComponent->pExynosPort[PortIndex];
+ Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
+ tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
+ if (tempData == NULL) {
+ *data = NULL;
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ }
+ *data = (OMX_PTR)tempData;
+
+ ret = OMX_ErrorNone;
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ FunctionIn();
+
+ pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
+
+ ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
+ if (ret != 0) {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
+ }
+ while (1) {
+ int cnt = 0;
+ Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
+ if (cnt > 0)
+ Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
+ else
+ break;
+ }
+ ret = OMX_ErrorNone;
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nParamIndex,
+ OMX_INOUT OMX_PTR ComponentParameterStructure)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+ if (pExynosComponent->currentState == OMX_StateInvalid ) {
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
+ }
+
+ if (ComponentParameterStructure == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+
+ switch (nParamIndex) {
+ case OMX_IndexParamVideoInit:
+ {
+ OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
+ ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ portParam->nPorts = pExynosComponent->portParam.nPorts;
+ portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
+ ret = OMX_ErrorNone;
+ }
+ break;
+ case OMX_IndexParamVideoPortFormat:
+ {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = portFormat->nPortIndex;
+ OMX_U32 index = portFormat->nIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+ OMX_U32 supportFormatNum = 0;
+
+ ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+
+ if (portIndex == INPUT_PORT_INDEX) {
+ pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+ portDefinition = &pExynosPort->portDefinition;
+
+ switch (index) {
+ case supportFormat_0:
+ portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ break;
+ case supportFormat_1:
+ portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ break;
+ case supportFormat_2:
+ portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ break;
+ case supportFormat_3:
+ portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV21Linear;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ break;
+ case supportFormat_4:
+ portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portFormat->eColorFormat = OMX_COLOR_FormatAndroidOpaque;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ break;
+ default:
+ if (index > supportFormat_0) {
+ ret = OMX_ErrorNoMore;
+ goto EXIT;
+ }
+ break;
+ }
+ } else if (portIndex == OUTPUT_PORT_INDEX) {
+ supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
+ if (index > supportFormatNum) {
+ ret = OMX_ErrorNoMore;
+ goto EXIT;
+ }
+
+ pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ portDefinition = &pExynosPort->portDefinition;
+
+ portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
+ portFormat->eColorFormat = portDefinition->format.video.eColorFormat;
+ portFormat->xFramerate = portDefinition->format.video.xFramerate;
+ }
+ ret = OMX_ErrorNone;
+ }
+ break;
+ case OMX_IndexParamVideoBitrate:
+ {
+ OMX_VIDEO_PARAM_BITRATETYPE *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = videoRateControl->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ portDefinition = &pExynosPort->portDefinition;
+
+ videoRateControl->eControlRate = pVideoEnc->eControlRate[portIndex];
+ videoRateControl->nTargetBitrate = portDefinition->format.video.nBitrate;
+ }
+ ret = OMX_ErrorNone;
+ }
+ break;
+ case OMX_IndexParamVideoQuantization:
+ {
+ OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = videoQuantizationControl->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ portDefinition = &pExynosPort->portDefinition;
+
+ videoQuantizationControl->nQpI = pVideoEnc->quantization.nQpI;
+ videoQuantizationControl->nQpP = pVideoEnc->quantization.nQpP;
+ videoQuantizationControl->nQpB = pVideoEnc->quantization.nQpB;
+ }
+ ret = OMX_ErrorNone;
+
+ }
+ break;
+ case OMX_IndexParamPortDefinition:
+ {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = portDefinition->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort;
+
+ if (portIndex >= pExynosComponent->portParam.nPorts) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+ ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);
+
+#ifdef USE_STOREMETADATA
+ if ((portIndex == 0) && (pExynosPort->bStoreMetaData == OMX_TRUE)) {
+ portDefinition->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;
+ }
+#endif
+ }
+ break;
+ default:
+ {
+ ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
+ }
+ break;
+ }
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nIndex,
+ OMX_IN OMX_PTR ComponentParameterStructure)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+ if (pExynosComponent->currentState == OMX_StateInvalid ) {
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
+ }
+
+ if (ComponentParameterStructure == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+
+ switch (nIndex) {
+ case OMX_IndexParamVideoPortFormat:
+ {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = portFormat->nPortIndex;
+ OMX_U32 index = portFormat->nIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+ OMX_U32 supportFormatNum = 0;
+
+ ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ portDefinition = &pExynosPort->portDefinition;
+
+ portDefinition->format.video.eColorFormat = portFormat->eColorFormat;
+ portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;
+ portDefinition->format.video.xFramerate = portFormat->xFramerate;
+ }
+ }
+ break;
+ case OMX_IndexParamVideoBitrate:
+ {
+ OMX_VIDEO_PARAM_BITRATETYPE *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = videoRateControl->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ portDefinition = &pExynosPort->portDefinition;
+
+ pVideoEnc->eControlRate[portIndex] = videoRateControl->eControlRate;
+ portDefinition->format.video.nBitrate = videoRateControl->nTargetBitrate;
+ }
+ ret = OMX_ErrorNone;
+ }
+ break;
+ case OMX_IndexParamVideoQuantization:
+ {
+ OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = videoQuantizationControl->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ portDefinition = &pExynosPort->portDefinition;
+
+ pVideoEnc->quantization.nQpI = videoQuantizationControl->nQpI;
+ pVideoEnc->quantization.nQpP = videoQuantizationControl->nQpP;
+ pVideoEnc->quantization.nQpB = videoQuantizationControl->nQpB;
+ }
+ ret = OMX_ErrorNone;
+ }
+ break;
+ case OMX_IndexParamPortDefinition:
+ {
+ OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+ OMX_U32 portIndex = pPortDefinition->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort;
+ OMX_U32 width, height, size;
+
+ if (portIndex >= pExynosComponent->portParam.nPorts) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+ ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+ if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+ if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
+ ret = OMX_ErrorIncorrectStateOperation;
+ goto EXIT;
+ }
+ }
+ if(pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+
+ Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
+ if (portIndex == INPUT_PORT_INDEX) {
+ EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ Exynos_UpdateFrameSize(pOMXComponent);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",
+ pExynosOutputPort->portDefinition.nBufferSize);
+ }
+ ret = OMX_ErrorNone;
+ }
+ break;
+#ifdef USE_STOREMETADATA
+ case OMX_IndexParamStoreMetaDataBuffer:
+ {
+ ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);
+ }
+ break;
+#endif
+ default:
+ {
+ ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
+ }
+ break;
+ }
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(
+ OMX_HANDLETYPE hComponent,
+ OMX_INDEXTYPE nIndex,
+ OMX_PTR pComponentConfigStructure)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+ FunctionIn();
+
+ if (hComponent == NULL || pComponentConfigStructure == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ if (pExynosComponent->currentState == OMX_StateInvalid) {
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
+ }
+
+ switch (nIndex) {
+ case OMX_IndexConfigVideoBitrate:
+ {
+ OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
+ OMX_U32 portIndex = pEncodeBitrate->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ pEncodeBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;
+ }
+ }
+ break;
+ case OMX_IndexConfigVideoFramerate:
+ {
+ OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
+ OMX_U32 portIndex = pFramerate->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ pFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;
+ }
+ }
+ break;
+ default:
+ ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
+ break;
+ }
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(
+ OMX_HANDLETYPE hComponent,
+ OMX_INDEXTYPE nIndex,
+ OMX_PTR pComponentConfigStructure)
+ {
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+ FunctionIn();
+
+ if (hComponent == NULL || pComponentConfigStructure == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ if (pExynosComponent->currentState == OMX_StateInvalid) {
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
+ }
+
+ switch (nIndex) {
+ case OMX_IndexConfigVideoBitrate:
+ {
+ OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
+ OMX_U32 portIndex = pEncodeBitrate->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ pExynosPort->portDefinition.format.video.nBitrate = pEncodeBitrate->nEncodeBitrate;
+ }
+ }
+ break;
+ case OMX_IndexConfigVideoFramerate:
+ {
+ OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
+ OMX_U32 portIndex = pFramerate->nPortIndex;
+ EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+ pExynosPort->portDefinition.format.video.xFramerate = pFramerate->xEncodeFramerate;
+ }
+ }
+ break;
+ case OMX_IndexConfigVideoIntraVOPRefresh:
+ {
+ OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
+ OMX_U32 portIndex = pIntraRefreshVOP->nPortIndex;
+
+ if ((portIndex != OUTPUT_PORT_INDEX)) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ } else {
+ pVEncBase->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;
+ }
+ }
+ break;
+ default:
+ ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
+ break;
+ }
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_STRING cParameterName,
+ OMX_OUT OMX_INDEXTYPE *pIndexType)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_COMPONENTTYPE *pOMXComponent = NULL;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+ FunctionIn();
+
+ if (hComponent == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+ ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+ if (ret != OMX_ErrorNone) {
+ goto EXIT;
+ }
+
+ if (pOMXComponent->pComponentPrivate == NULL) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+ if ((cParameterName == NULL) || (pIndexType == NULL)) {
+ ret = OMX_ErrorBadParameter;
+ goto EXIT;
+ }
+ if (pExynosComponent->currentState == OMX_StateInvalid) {
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
+ }
+
+#ifdef USE_STOREMETADATA
+ if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
+ *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;
+ } else {
+ ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+ }
+#else
+ ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+#endif
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}