OMX_ERRORTYPE SEC_OMX_BaseComponent_Destructor(
    OMX_IN OMX_HANDLETYPE hComponent)
{
    OMX_ERRORTYPE          ret = OMX_ErrorNone;
    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
    SEC_OMX_BASECOMPONENT *pSECComponent = NULL;
    OMX_U32                semaValue = 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;

    SEC_OMX_CommandQueue(pSECComponent, SEC_OMX_CommandComponentDeInit, 0, NULL);
    SEC_OSAL_SleepMillisec(0);
    SEC_OSAL_Get_SemaphoreCount(pSECComponent->msgSemaphoreHandle, &semaValue);
    if (semaValue == 0)
        SEC_OSAL_SemaphorePost(pSECComponent->msgSemaphoreHandle);
    SEC_OSAL_SemaphorePost(pSECComponent->msgSemaphoreHandle);

    SEC_OSAL_ThreadTerminate(pSECComponent->hMessageHandler);
    pSECComponent->hMessageHandler = NULL;

    SEC_OSAL_MutexTerminate(pSECComponent->compMutex);
    pSECComponent->compMutex = NULL;
    SEC_OSAL_SemaphoreTerminate(pSECComponent->msgSemaphoreHandle);
    pSECComponent->msgSemaphoreHandle = NULL;
    SEC_OSAL_QueueTerminate(&pSECComponent->messageQ);

    SEC_OSAL_Free(pSECComponent);
    pSECComponent = NULL;

    ret = OMX_ErrorNone;
EXIT:
    FunctionOut();

    return ret;
}
OMX_ERRORTYPE SEC_OMX_Port_Destructor(OMX_HANDLETYPE hComponent)
{
    OMX_ERRORTYPE          ret = OMX_ErrorNone;
    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
    SEC_OMX_BASECOMPONENT *pSECComponent = NULL;
    SEC_OMX_BASEPORT      *pSECPort = NULL;

    FunctionIn();

    int i = 0;

    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;
    for (i = 0; i < ALL_PORT_NUM; i++) {
        pSECPort = &pSECComponent->pSECPort[i];

        SEC_OSAL_SemaphoreTerminate(pSECPort->loadedResource);
        pSECPort->loadedResource = NULL;
        SEC_OSAL_SemaphoreTerminate(pSECPort->unloadedResource);
        pSECPort->unloadedResource = NULL;
        SEC_OSAL_Free(pSECPort->bufferStateAllocate);
        pSECPort->bufferStateAllocate = NULL;
        SEC_OSAL_Free(pSECPort->bufferHeader);
        pSECPort->bufferHeader = NULL;

        SEC_OSAL_QueueTerminate(&pSECPort->bufferQ);
    }
    SEC_OSAL_Free(pSECComponent->pSECPort);
    pSECComponent->pSECPort = NULL;
    ret = OMX_ErrorNone;
EXIT:
    FunctionOut();

    return ret;
}