OMX_ERRORTYPE ResourceExhaustionTest_EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
            OMX_IN OMX_PTR pAppData,
            OMX_IN OMX_EVENTTYPE eEvent,
            OMX_IN OMX_U32 nData1,
            OMX_IN OMX_U32 nData2,
            OMX_IN OMX_PTR pEventData)
    {
        ResourceExhaustionTestContext *pCtxt;

        UNUSED_PARAMETER(hComponent);
        UNUSED_PARAMETER(pEventData);

        if (pAppData == NULL)
            return OMX_ErrorNone;
        pCtxt = (ResourceExhaustionTestContext *)pAppData;

        if (eEvent == OMX_EventCmdComplete)
        {
            switch ((OMX_COMMANDTYPE)(nData1))
            {
                case OMX_CommandStateSet:
                    OMX_CONF_StateToString((OMX_STATETYPE)(nData2), szDesc);
                    OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Instance %d transitioned to %s\n",
                                   pCtxt->nInst, szDesc);
                    OMX_OSAL_EventSet(pCtxt->hStateSetEvent);
                    break;
                default:
                    break;
            }
        }
        else if (eEvent == OMX_EventError)
        {
            pCtxt->eLastError = (OMX_ERRORTYPE)(nData1);
            OMX_CONF_ErrorToString(pCtxt->eLastError, szDesc);
            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Instance %d sent error %0#x %s\n",
                           pCtxt->nInst, nData1, szDesc);
            OMX_OSAL_EventSet(pCtxt->hStateSetEvent);
        }
        return OMX_ErrorNone;
    }
    OMX_ERRORTYPE OMX_CONF_ComponentNameTest(OMX_IN OMX_STRING cComponentName)
    {
        OMX_ERRORTYPE  eError = OMX_ErrorNone;
        OMX_HANDLETYPE hComp  = 0;
        OMX_U32 i = 0;
        OMX_BOOL bNameValid = OMX_FALSE;
        OMX_BOOL bFound = OMX_FALSE;
        OMX_S8 cCompEnumName[TEST_COMPONENT_NAME_SIZE];
        OMX_CALLBACKTYPE sCallbacks;

        sCallbacks.EventHandler    = ComponentNameTest_EventHandler;
        sCallbacks.EmptyBufferDone = ComponentNameTest_EmptyBufferDone;
        sCallbacks.FillBufferDone  = ComponentNameTest_FillBufferDone;

        /* Initialize OpenMax */
        eError = OMX_Init();
        if (eError != OMX_ErrorNone)
        {
            goto OMX_CONF_TEST_BAIL;
        }

        while (OMX_ErrorNone == eError)
        {
            /* loop through all enumerated components to determine if the component name
               specificed for the test is enumerated by the OMX core */
            eError = OMX_ComponentNameEnum((OMX_STRING) cCompEnumName, TEST_COMPONENT_NAME_SIZE, i);
            if (OMX_ErrorNone == eError)
            {
                OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "OMX_ComponenNameEnum enumerated %s at index %i\n",
                               cCompEnumName, i);

                if (!strcmp((OMX_STRING) cCompEnumName, cComponentName))
                {
                    /* component name enumerated by OMX_CORE */
                    bFound = OMX_TRUE;

                    eError = OMX_GetHandle(&hComp, (OMX_STRING) cCompEnumName, 0x0, &sCallbacks);
                    if (eError == OMX_ErrorNone)
                    {
                        /* validate the first 4 characters of the name match
                           the OMX standard */
                        if (!strncmp("OMX.", cComponentName, 4))
                        {
                            bNameValid = OMX_TRUE;
                        }

                        eError = OMX_FreeHandle(hComp);

                    }
                    else
                    {
                        OMX_CONF_ErrorToString(eError, szDesc);
                        OMX_OSAL_Trace(OMX_OSAL_TRACE_ERROR, "%s error=0x%X (%s) from OMX_GetHandle\n",
                                       cCompEnumName, eError, szDesc);

                    }

                }

            }
            else if (OMX_ErrorNoMore != eError)
            {
                /* OMX_CORE reported unexpected error other than no more components */
                OMX_CONF_ErrorToString(eError, szDesc);
                OMX_OSAL_Trace(OMX_OSAL_TRACE_ERROR, "unexepected error=0x%X (%s) from OMX_ComponenNameEnum\n",
                               eError, szDesc);
            }
            i++;

        }

        if (OMX_ErrorNoMore == eError)
        {
            /* not an error, so clear the error code */
            eError = OMX_ErrorNone;
        }


OMX_CONF_TEST_BAIL:

        if (OMX_ErrorNone == eError)
        {
            eError = OMX_Deinit();

        }
        else
        {
            OMX_Deinit();
        }

        return eError;
    }
    OMX_ERRORTYPE BufferTest_EventHandler(
        OMX_IN OMX_HANDLETYPE hComponent,
        OMX_IN OMX_PTR pAppData,
        OMX_IN OMX_EVENTTYPE eEvent,
        OMX_IN OMX_U32 nData1,
        OMX_IN OMX_U32 nData2,
        OMX_IN OMX_PTR pEventData)
    {
        TEST_CTXTYPE *pCtx;

        UNUSED_PARAMETER(hComponent);
        UNUSED_PARAMETER(pEventData);

        if (0x0 == pAppData) return(OMX_ErrorNone);
        pCtx = (TEST_CTXTYPE*)pAppData;

        if (OMX_EventCmdComplete == eEvent)
        {
            switch ((OMX_COMMANDTYPE)(nData1))
            {
                case OMX_CommandStateSet:
                    OMX_CONF_StateToString((OMX_STATETYPE)(nData2), szDesc);
                    OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Component transitioned to %s\n", szDesc);
                    pCtx->eState = (OMX_STATETYPE)(nData2);
                    OMX_OSAL_EventSet(pCtx->hStateChangeEvent);
                    break;
                case OMX_CommandPortDisable:
                    OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Port %i completed disable\n", nData2);
                    if (OMX_TRUE == pCtx->bStopAllPorts)
                    {
                        pCtx->nNumPortsStopped++;
                        if (pCtx->nNumPortsStopped == pCtx->nNumPorts)
                        {
                            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "All ports completed disable\n");
                            OMX_OSAL_EventSet(pCtx->hPortDisableEvent);
                        }

                    }
                    else if (pCtx->nStopPort == nData2)
                    {
                        OMX_OSAL_EventSet(pCtx->hPortDisableEvent);
                    }
                    break;
                case OMX_CommandPortEnable:
                    OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Port %i completed enable\n", nData2);
                    if (OMX_TRUE == pCtx->bRestartAllPorts)
                    {
                        pCtx->nNumPortsRestarted++;
                        if (pCtx->nNumPortsRestarted == pCtx->nNumPorts)
                        {
                            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "All ports completed enable\n");
                            OMX_OSAL_EventSet(pCtx->hPortEnableEvent);
                        }
                    }
                    else if (pCtx->nRestartPort == nData2)
                    {
                        OMX_OSAL_EventSet(pCtx->hPortEnableEvent);
                    }
                    break;
                case OMX_EventBufferFlag:
                    break;
                default:
                    break;
            }

        }
        else if (OMX_EventError == eEvent)
        {
            OMX_CONF_ErrorToString((OMX_ERRORTYPE)nData1, szDesc);
            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Component reported error %s (0x%x)\n",
                           szDesc, nData2);
            if (OMX_ErrorPortUnpopulated == nData1)
            {
                OMX_OSAL_EventSet(pCtx->hPortErrorEvent);
            }
        }

        return OMX_ErrorNone;
    }
OMX_ERRORTYPE OMX_CONF_TestComponent( OMX_IN OMX_STRING sComponentName, OMX_BOOL *bPassed)
{
    OMX_U32 i;
    OMX_ERRORTYPE eError;
    char szDesc[256]; 
    OMX_U32 nPassedTests, nFailedTests;
    OMX_U32 testId;

    if (!OMX_CONF_ComponentExists(sComponentName)){
        OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, "Cannot find component %s, all tests FAILED\n", sComponentName);
        return OMX_ErrorUndefined;
    }

    /* initialize passed and failed test counters */
    nPassedTests = 0;
    nFailedTests = 0;

    OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "\nOMX_CONF_TestComponent %s\n\n", sComponentName);

    /* Run each test in current list on component */
    for (i=0;i<g_OMX_CONF_nTests;i++)
    {
        /* get test id */
        testId = g_OMX_CONF_TestIndexList[i];

        /* emit test header */
        OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "\n");
        OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "##\n");
        OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "## %s \n", g_OMX_CONF_TestLookupTable[testId].pName );
        OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "##\n");

        /* perform test */
        eError = g_OMX_CONF_TestLookupTable[testId].pFunc(sComponentName);

        /* emit test result */
        if( OMX_ErrorNone != eError ) {
            OMX_CONF_ErrorToString( eError, szDesc );
            OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " %s %s FAILED, %x %s\n",
                g_OMX_CONF_TestLookupTable[testId].pName, sComponentName, eError, szDesc);
            bPassed[i] = OMX_FALSE;
            nFailedTests++;
        } else {
            OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " %s %s PASSED\n",
                g_OMX_CONF_TestLookupTable[testId].pName, sComponentName);
            bPassed[i] = OMX_TRUE;
            nPassedTests++;
        }
    }


    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, "\n");
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \n");
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " Summary for %s\n", sComponentName);
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \n");

    /* Report passed tests */
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " %i tests passed:\n", nPassedTests);
    for (i=0;i<g_OMX_CONF_nTests;i++)
    {
        /* if passed emit test name */
        if (bPassed[i]){
            testId = g_OMX_CONF_TestIndexList[i];
            OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \t%s\n", g_OMX_CONF_TestLookupTable[testId].pName);
        }
    }

    /* Report failed tests */
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \n");
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " %i tests failed: \n", nFailedTests);
    for (i=0;i<g_OMX_CONF_nTests;i++)
    {
        /* if failed emit test name */
        if (!bPassed[i]){
            testId = g_OMX_CONF_TestIndexList[i];
            OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \t%s\n", g_OMX_CONF_TestLookupTable[testId].pName);
        }
    }
    OMX_OSAL_Trace(OMX_OSAL_TRACE_PASSFAIL, " \n");

    return OMX_ErrorNone;
}
    OMX_ERRORTYPE PortCommTest_OperateOnPorts(PortCommTestCtxt* pContext, PortOpType eOp)
    {
        OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
        OMX_ERRORTYPE eError = OMX_ErrorNone;
        OMX_U32 i, j;
        OMX_BUFFERHEADERTYPE sBufHdr;

        for (j = 0; j < NUM_DOMAINS; j++)
        {
            for (i = pContext->sPortParam[j].nStartPortNumber;
                    i < pContext->sPortParam[j].nStartPortNumber + pContext->sPortParam[j].nPorts; i++)
            {

                OMX_CONF_INIT_STRUCT(sPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
                sPortDef.nPortIndex = i;
                OMX_CONF_BAIL_IF_ERROR(OMX_GetParameter(pContext->hWComp, OMX_IndexParamPortDefinition ,
                                                        (OMX_PTR)&sPortDef));
                switch (eOp)
                {
                    case AllocBuf:
                        if (0x0 == sPortDef.nBufferCountMin || sPortDef.nBufferCountMin > sPortDef.nBufferCountActual)
                        {
                            OMX_CONF_SET_ERROR_BAIL("PortDefinition nBufferCount incorrect\n", OMX_ErrorUndefined);
                        }
                        OMX_CONF_BAIL_IF_ERROR(PortCommTest_AllocateBuffers(pContext, &sPortDef));
                        break;

                    case NonTunnelTest:
                        if (sPortDef.eDir == OMX_DirInput)
                        {
                            eError = OMX_SetupTunnel(NULL, 0, pContext->hWComp, sPortDef.nPortIndex);
                            OMX_CONF_ErrorToString(eError, szDesc);
                            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Setup tunnel reported error code %s\n", szDesc);
                        }
                        else
                        {
                            eError = OMX_SetupTunnel(pContext->hWComp, sPortDef.nPortIndex, NULL, 0);
                            OMX_CONF_ErrorToString(eError, szDesc);
                            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Setup tunnel reported error code %s\n", szDesc);
                        }
                        eError = OMX_ErrorNone;
                        break;

                    case OpenFile:
                        /* set buffercount actual */
                        if (0x0 == sPortDef.nBufferCountMin || sPortDef.nBufferCountMin > sPortDef.nBufferCountActual)
                        {
                            OMX_CONF_SET_ERROR_BAIL("PortDefinition nBufferCount incorrect\n", OMX_ErrorUndefined);
                        }
                        sPortDef.nBufferCountActual = sPortDef.nBufferCountMin + 1;
                        OMX_CONF_BAIL_IF_ERROR(OMX_SetParameter(pContext->hWComp, OMX_IndexParamPortDefinition,
                                                                (OMX_PTR)&sPortDef));
                        /* open files for input ports */
                        if (sPortDef.eDir == OMX_DirInput)
                        {
                            OMX_OSAL_Trace(OMX_OSAL_TRACE_INFO, "Opened input file for port %d\n", i);
                            OMX_CONF_BAIL_IF_ERROR(OMX_OSAL_OpenInputFile(i));
                        }
                        break;

                    case CloseFile:
                        if (sPortDef.eDir == OMX_DirInput)
                        {
                            OMX_CONF_BAIL_IF_ERROR(OMX_OSAL_CloseInputFile(i));
                        }
                        break;

                    case EmptyFill:
                        OMX_CONF_INIT_STRUCT(sBufHdr, OMX_BUFFERHEADERTYPE);
                        if (sPortDef.eDir == OMX_DirInput)
                        {
                            sBufHdr.nInputPortIndex = i;
                            eError = OMX_EmptyThisBuffer(pContext->hWComp, &sBufHdr);
                        }
                        else
                        {
                            sBufHdr.nOutputPortIndex = i;
                            eError = OMX_FillThisBuffer(pContext->hWComp, &sBufHdr);
                        }
                        if (eError != OMX_ErrorIncorrectStateOperation)
                            OMX_CONF_SET_ERROR_BAIL("Buffer handling while stopped\n", OMX_ErrorUndefined);
                        eError = OMX_ErrorNone;
                        break;

                    default:
                        eError = OMX_ErrorBadParameter;
                }
            }
        }
OMX_CONF_TEST_BAIL:
        return eError;
    }