/*-------------------------------------------------------------------*/
void* OMX_JpegEnc_Thread (void* pThreadData)
{
    int status;
    struct timeval tv;
    int fdmax;
    fd_set rfds;
    OMX_ERRORTYPE eError = OMX_ErrorNone;
    OMX_COMMANDTYPE eCmd;
    OMX_U32 nParam1;
    sigset_t set;

    prctl(PR_SET_NAME, (unsigned long) "OMX-JPGENC", 0, 0, 0);

    OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pThreadData;
    JPEGENC_COMPONENT_PRIVATE *pComponentPrivate = (JPEGENC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;

#ifdef __PERF_INSTRUMENTATION__
    pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURS("JPET"),
                                               PERF_ModuleComponent |PERF_ModuleImageEncode);
#endif

    /**Looking for highest number of file descriptor for pipes
       inorder to put in select loop */
    fdmax = pComponentPrivate->nCmdPipe[0];
    
    if ( pComponentPrivate->free_outBuf_Q[0] > fdmax ) {
        fdmax = pComponentPrivate->free_outBuf_Q[0];
    }
    

    if ( pComponentPrivate->filled_inpBuf_Q[0] > fdmax ) {
        fdmax = pComponentPrivate->filled_inpBuf_Q[0];
    }

    OMX_TRACE2(pComponentPrivate->dbg, "fd max is %d\n",fdmax);

    while ( 1 ) {
        FD_ZERO (&rfds);
        FD_SET (pComponentPrivate->nCmdPipe[0], &rfds);
        if (pComponentPrivate->nCurState != OMX_StatePause) {
            FD_SET (pComponentPrivate->free_outBuf_Q[0], &rfds); 
            FD_SET (pComponentPrivate->filled_inpBuf_Q[0], &rfds);
        }


        tv.tv_sec = 1;
        tv.tv_usec = 0;
		
	 sigemptyset(&set)	;
	 sigaddset(&set,SIGALRM);
        status = pselect (fdmax+1, &rfds, NULL, NULL, NULL,&set);

        if ( 0 == status ) {
            OMX_TRACE2(pComponentPrivate->dbg, "Component Thread Time Out!!!\n");
        } else if ( -1 == status ) {
            OMX_TRACE4(pComponentPrivate->dbg, "Error in Select\n");

            pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
                                                    OMX_EventError, OMX_ErrorInsufficientResources, OMX_TI_ErrorSevere,
                                                    "Error from COmponent Thread in select");
	     eError = OMX_ErrorInsufficientResources;
        } else {
            if ( (FD_ISSET (pComponentPrivate->filled_inpBuf_Q[0], &rfds))
                 && (pComponentPrivate->nCurState != OMX_StatePause) ) {
                OMX_PRBUFFER2(pComponentPrivate->dbg, "filled_inpBuf_Q pipe is set\n");

                eError = HandleJpegEncDataBuf_FromApp (pComponentPrivate);

                if ( eError != OMX_ErrorNone ) {
                    OMX_PRBUFFER4(pComponentPrivate->dbg, "Error while processing free queue buffers\n");
                    pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
                                                            OMX_EventError, OMX_ErrorUndefined, OMX_TI_ErrorSevere,
                                                            "1-Error from Component Thread while processing free Q\n");
                }
            }

            if ( FD_ISSET (pComponentPrivate->free_outBuf_Q[0], &rfds) ) {
                OMX_PRBUFFER2(pComponentPrivate->dbg, "free_outBuf_Q has some buffers in Component Thread\n");
                eError = HandleJpegEncFreeOutputBufferFromApp(pComponentPrivate);
                if ( eError != OMX_ErrorNone ) {
                    OMX_PRBUFFER4(pComponentPrivate->dbg, "Error while processing free Q Buffers\n");
                    pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
                                                            OMX_EventError, OMX_ErrorUndefined, OMX_TI_ErrorSevere,
                                                            "3-Error from Component Thread while processing free Q\n");
                }
            }
            if ( FD_ISSET (pComponentPrivate->nCmdPipe[0], &rfds) ) {
                /* Do not accept any command when the component is stopping */
		OMX_PRCOMM2(pComponentPrivate->dbg, "CMD pipe is set in Component Thread\n");
                
                read (pComponentPrivate->nCmdPipe[0], &eCmd, sizeof (eCmd));
                read (pComponentPrivate->nCmdDataPipe[0], &nParam1, sizeof (nParam1));

#ifdef __PERF_INSTRUMENTATION__
                                PERF_ReceivedCommand(pComponentPrivate->pPERFcomp,
                                                     eCmd, nParam1,
                                                     PERF_ModuleLLMM);
#endif

                OMX_PRINT2(pComponentPrivate->dbg, "eCmd %d, nParam1 %d\n", (int)eCmd, (int)nParam1);
                if ( eCmd == OMX_CommandStateSet ) {
                    OMX_PRINT2(pComponentPrivate->dbg, "processing OMX_CommandStateSet\n");
                    if ( (int)nParam1 != -1 ){
                        if(nParam1 == OMX_StateInvalid){
                            pComponentPrivate->nToState = OMX_StateInvalid;
                        }
                        eError = HandleJpegEncCommand (pComponentPrivate, nParam1);
                        if ( eError != OMX_ErrorNone ) {
                            OMX_PRINT4(pComponentPrivate->dbg, "Error returned by HandleJpegEncCommand\n");
                            pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
                                                                    OMX_EventError, OMX_ErrorHardware, OMX_TI_ErrorSevere,
                                                                    "Error returned by HandleJpegEncCommand\n");
                        }
                        
                    }
                    else{
                        break;
                    }
                } 
                else if ( eCmd == OMX_CommandPortDisable ) {
                    OMX_PRBUFFER2(pComponentPrivate->dbg, "Before Disable Port function Port %d\n",(int)nParam1);
                    eError = JpegEncDisablePort(pComponentPrivate, nParam1);
                    OMX_PRBUFFER2(pComponentPrivate->dbg, "After JPEG Encoder Sisable Port error = %d\n", eError);
                    if (eError != OMX_ErrorNone ) {
                        break;
                        }
                    } 
                else if ( eCmd == OMX_CommandPortEnable ) {   /*TODO: Check errors*/
                    eError = JpegEncEnablePort(pComponentPrivate, nParam1);
                    if (eError != OMX_ErrorNone ) {
                        break;
                        }
                    } 
                    
                else if ( eCmd == OMX_CustomCommandFatalError ) {
                        Jpeg_Enc_FatalErrorRecover(pComponentPrivate);
                    }
                else if ( eCmd == OMX_CustomCommandStopThread ) {
                    /*eError = 10;*/
                    goto EXIT;
                    }
                else if ( eCmd == OMX_CommandFlush ) {
                      OMX_PRBUFFER2(pComponentPrivate->dbg, "eCmd =  OMX_CommandFlush\n");
                      eError = HandleJpegEncCommandFlush (pComponentPrivate, nParam1);
                      if (eError != OMX_ErrorNone) {
                          break;
                          }
                    }
                    if (pComponentPrivate->nCurState == OMX_StatePause)
                        continue;
            }


        }
    }
    OMX_PRINT1(pComponentPrivate->dbg, "Component Thread Exit while loop\n");

EXIT:

#ifdef __PERF_INSTRUMENTATION__
    PERF_Done(pComponentPrivate->pPERFcomp);
#endif

    OMX_PRINT1(pComponentPrivate->dbg, "Component Thread Exit while loop from EXIT label\n");
    return(void*)eError; /*OMX_ErrorNone;*/

}
Esempio n. 2
0
PERF_RT_Private *
PERF_RT_create(PERF_Private *perf, PERF_Config *config,
               PERF_MODULETYPE eModule)
{
    char *fOutFile = NULL;
    FILE *fOut = NULL;

    /* check if we support this component */
    if (perf->ulID != PERF_FOURS("CAM_") && perf->ulID != PERF_FOURS("CAMT") &&
            perf->ulID != PERF_FOURS("VP__") && perf->ulID != PERF_FOURS("VP_T") &&
            perf->ulID != PERF_FOURS("VD__") && perf->ulID != PERF_FOURS("VD_T") &&
            perf->ulID != PERF_FOURS("VE__") && perf->ulID != PERF_FOURS("VE_T"))
    {
        /* if we don't support this component, we don't create the real-time
           interface */
        return (NULL);
    }

    PERF_RT_Private *me =
        perf->cip.pRT = malloc(sizeof(PERF_RT_Private));

    if (me)
    {
        int succeed = 1;

        /* we track steady state on the component thread only */
        me->needSteadyState = (perf->ulID & 0xff) == 'T';
        me->steadyState = 0;

        /* allocate rate tracking structures */
        me->maxDRate = MAX_RATES_TRACKED;
        me->dRate = malloc(sizeof(PERF_RTdata_rate) * me->maxDRate);
        succeed = succeed && me->dRate;

        me->decoder = (perf->ulID == PERF_FOURS("VD__") || perf->ulID == PERF_FOURS("VD_T"));
        me->encoder = (perf->ulID == PERF_FOURS("VE__") || perf->ulID == PERF_FOURS("VE_T"));
        me->nDRate = 0;

        /* allocate shot-to-shot tracking structures */
        if (succeed && perf->ulID == PERF_FOURS("CAMT"))
        {
            me->dSTS = malloc(sizeof(PERF_RTdata_sts));
            succeed = succeed && me->dSTS;
            if (me->dSTS)
            {
                init_delay(&me->dSTS->dBurst, -1);   /* no first timestamp yet */
                init_delay(&me->dSTS->dABurst, 0);
                init_delay(&me->dSTS->dBurst2, 0);
                init_delay(&me->dSTS->dABurst2, 0);
                init_delay(&me->dSTS->dSingle, -1);  /* no first timestamp yet */
                me->dSTS->size_max = me->dSTS->size_min = me->dSTS->capturing = 0;
            }
        }
        else
        {
            me->dSTS = NULL;
        }

        /* allocate uptime tracking structures */

        /* :NOTE: for now we restrict creations of uptime to steady state
            only */
        if (succeed && !uptime_started && me->needSteadyState &&
                !(perf->uMode & PERF_Mode_Replay))
        {
            me->dUptime = malloc(sizeof(PERF_RTdata_uptime));
            succeed = succeed && me->dUptime;

            if (succeed)
            {
                uptime_started = 1;
                me->dUptime->measuring = 0;
                me->dUptime->last_idletime = me->dUptime->last_uptime = 0;
                me->dUptime->start_idletime = me->dUptime->start_uptime = 0;
                me->dUptime->success = 1;
                me->dUptime->xx = me->dUptime->x = me->dUptime->n = 0;
                TIME_GET(me->dUptime->last_reporting);
            }
        }
        else
        {
            me->dUptime = NULL;
        }

        /* configuration */
        me->summary     = config->rt_summary != 0;
        me->debug       = config->rt_debug & 0x1FF;
        me->detailed    = (config->rt_detailed > 2) ? 2 : (int) config->rt_detailed;

        me->granularity = (config->rt_granularity < 1) ? 1 :
                          (config->rt_granularity > MAX_GRANULARITY) ?
                          MAX_GRANULARITY : (long) config->rt_granularity;
        me->granularity *= 1000000;  /* convert to microsecs */
        TIME_COPY(me->first_time, perf->time);

        /* if we do not care about detailed statistics, only report significant
           statistics for each component */
        if (succeed && !me->detailed)
        {
            /* VP_T - display rate */
            if (perf->ulID == PERF_FOURS("VP_T"))
            {
                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleHardware;
            }
            /* VD_T - decode rate */
            else if (perf->ulID == PERF_FOURS("VD_T"))
            {
                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleLLMM;
            }
            /* VE_T - encode rate */
            else if (perf->ulID == PERF_FOURS("VE_T"))
            {
                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleLLMM;
            }
            /* CAMT - capture rate */
            else if (perf->ulID == PERF_FOURS("CAMT"))
            {
                me->only_moduleandflags = PERF_FlagReceived | PERF_FlagFrame | PERF_ModuleHardware;
            }
            /* otherwise, we don't care about rates */
            else
            {
                free(me->dRate);
                me->dRate = NULL;
                me->maxDRate = 0;
            }
        }

        /* set up fRt file pointers */
        if (config->rt_file && succeed)
        {
            /* open log file unless STDOUT or STDERR is specified */
            if (!strcasecmp(config->rt_file, "STDOUT")) fOut = stdout;
            else if (!strcasecmp(config->rt_file, "STDERR")) fOut = stderr;
            else
            {
                /* expand file name with PID and name */
                fOutFile = (char *) malloc (strlen(config->rt_file) + 32);
                if (fOutFile)
                {
                    sprintf(fOutFile, "%s-%05lu-%08lx-%c%c%c%c.log",
                            config->rt_file, perf->ulPID, (unsigned long) perf,
                            PERF_FOUR_CHARS(perf->ulID));
                    fOut = fopen(fOutFile, "at");

                    /* free new file name */
                    free(fOutFile);
                    fOutFile = NULL;
                }

                /* if could not open output, set it to STDOUT */
                if (!fOut) fOut = stderr;
            }
            me->fRt = fOut;
        }

        /* if we had allocation failures, free resources and return NULL */
        if (succeed)
        {
            perf->uMode |= PERF_Mode_RealTime;
        }
        else
        {
            PERF_RT_done(perf);
            me = NULL;
        }
    }

    return(me);
}