OMX_ERRORTYPE Exynos_OMX_FillThisBuffer( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_COMPONENTTYPE *pOMXComponent = NULL; EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; EXYNOS_OMX_BASEPORT *pExynosPort = NULL; OMX_BOOL findBuffer = OMX_FALSE; EXYNOS_OMX_MESSAGE *message; 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; if (pExynosComponent->currentState == OMX_StateInvalid) { ret = OMX_ErrorInvalidState; goto EXIT; } if (pBuffer == NULL) { ret = OMX_ErrorBadParameter; goto EXIT; } if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) { ret = OMX_ErrorBadPortIndex; goto EXIT; } ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); if (ret != OMX_ErrorNone) { goto EXIT; } if ((pExynosComponent->currentState != OMX_StateIdle) && (pExynosComponent->currentState != OMX_StateExecuting) && (pExynosComponent->currentState != OMX_StatePause)) { ret = OMX_ErrorIncorrectStateOperation; goto EXIT; } pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; if ((!CHECK_PORT_ENABLED(pExynosPort)) || ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) && (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) || ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) && (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) { ret = OMX_ErrorIncorrectStateOperation; goto EXIT; } Exynos_OSAL_MutexLock(pExynosPort->hPortMutex); for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) { pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE; findBuffer = OMX_TRUE; break; } } if (findBuffer == OMX_FALSE) { ret = OMX_ErrorBadParameter; Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); goto EXIT; } message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE)); if (message == NULL) { ret = OMX_ErrorInsufficientResources; Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); goto EXIT; } message->messageType = EXYNOS_OMX_CommandFillBuffer; message->messageParam = (OMX_U32) i; message->pCmdData = (OMX_PTR)pBuffer; ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message); if (ret != 0) { ret = OMX_ErrorUndefined; Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); goto EXIT; } ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID); Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex); EXIT: FunctionOut(); return ret; }
OMX_ERRORTYPE SEC_OMX_EmptyThisBuffer( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_COMPONENTTYPE *pOMXComponent = NULL; SEC_OMX_BASECOMPONENT *pSECComponent = NULL; SEC_OMX_BASEPORT *pSECPort = NULL; OMX_BOOL findBuffer = OMX_FALSE; SEC_OMX_MESSAGE *message; OMX_U32 i = 0; FunctionIn(); if (hComponent == NULL) { ret = OMX_ErrorBadParameter; goto EXIT; } pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; ret = SEC_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); if (ret != OMX_ErrorNone) { goto EXIT; } if (pOMXComponent->pComponentPrivate == NULL) { ret = OMX_ErrorBadParameter; goto EXIT; } pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; if (pSECComponent->currentState == OMX_StateInvalid) { ret = OMX_ErrorInvalidState; goto EXIT; } if (pBuffer == NULL) { ret = OMX_ErrorBadParameter; goto EXIT; } if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) { ret = OMX_ErrorBadPortIndex; goto EXIT; } ret = SEC_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); if (ret != OMX_ErrorNone) { goto EXIT; } if ((pSECComponent->currentState != OMX_StateIdle) && (pSECComponent->currentState != OMX_StateExecuting) && (pSECComponent->currentState != OMX_StatePause)) { ret = OMX_ErrorIncorrectStateOperation; goto EXIT; } pSECPort = &pSECComponent->pSECPort[INPUT_PORT_INDEX]; if ((!CHECK_PORT_ENABLED(pSECPort)) || ((CHECK_PORT_BEING_FLUSHED(pSECPort) || CHECK_PORT_BEING_DISABLED(pSECPort)) && (!CHECK_PORT_TUNNELED(pSECPort) || !CHECK_PORT_BUFFER_SUPPLIER(pSECPort))) || ((pSECComponent->transientState == SEC_OMX_TransStateExecutingToIdle) && (CHECK_PORT_TUNNELED(pSECPort) && !CHECK_PORT_BUFFER_SUPPLIER(pSECPort)))) { ret = OMX_ErrorIncorrectStateOperation; goto EXIT; } for (i = 0; i < pSECPort->portDefinition.nBufferCountActual; i++) { if (pBuffer == pSECPort->bufferHeader[i]) { findBuffer = OMX_TRUE; break; } } if (findBuffer == OMX_FALSE) { ret = OMX_ErrorBadParameter; goto EXIT; } else { ret = OMX_ErrorNone; } message = SEC_OSAL_Malloc(sizeof(SEC_OMX_MESSAGE)); if (message == NULL) { ret = OMX_ErrorInsufficientResources; goto EXIT; } message->messageType = SEC_OMX_CommandEmptyBuffer; message->messageParam = (OMX_U32) i; message->pCmdData = (OMX_PTR)pBuffer; SEC_OSAL_Queue(&pSECPort->bufferQ, (void *)message); SEC_OSAL_SemaphorePost(pSECPort->bufferSemID); EXIT: FunctionOut(); return ret; }