Home | History | Annotate | Download | only in src
      1 
      2 /*
      3  * Copyright (C) Texas Instruments - http://www.ti.com/
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     20  */
     21 /* ====================================================================
     22 *             Texas Instruments OMAP(TM) Platform Software
     23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
     24 *
     25 * Use of this software is controlled by the terms and conditions found
     26 * in the license agreement under which this software has been supplied.
     27 * ==================================================================== */
     28 /**
     29 * @file OMX_JpegEnc_Thread.c
     30 *
     31 * This file implements OMX Component for JPEG encoder that
     32 * is fully compliant with the OMX specification 1.5.
     33 *
     34 * @path  $(CSLPATH)\src
     35 *
     36 * @rev  0.1
     37 */
     38 /* -------------------------------------------------------------------------------- */
     39 /* ================================================================================
     40 *!
     41 *! Revision History
     42 *! ===================================
     43 *!
     44 *! 22-May-2006 mf: Revisions appear in reverse chronological order;
     45 *! that is, newest first.  The date format is dd-Mon-yyyy.
     46 * ================================================================================= */
     47 
     48 /****************************************************************
     49 *  INCLUDE FILES
     50 ****************************************************************/
     51 
     52 /* ----- System and Platform Files ----------------------------*/
     53 #ifdef UNDER_CE
     54 #include <windows.h>
     55 #include <oaf_osal.h>
     56 #include <omx_core.h>
     57 #else
     58 #include <unistd.h>
     59 #include <sys/time.h>
     60 #include <sys/types.h>
     61 #include <sys/ioctl.h>
     62 #include <sys/select.h>
     63 #include <fcntl.h>
     64 #include <errno.h>
     65 #endif
     66 
     67 #include <dbapi.h>
     68 #include <string.h>
     69 #include <stdlib.h>
     70 #include <stdio.h>
     71 #include <signal.h>
     72 
     73 /*------- Program Header Files ----------------------------------------*/
     74 
     75 #include "OMX_JpegEnc_Utils.h"
     76 
     77 
     78 #define OMX_MAX_TIMEOUTS 200
     79 
     80 /*-------- Function Implementations ---------------------------------*/
     81 /*-------------------------------------------------------------------*/
     82 /**
     83   * OMX_JpegEnc_Thread()
     84   *
     85   * Called by Start_ComponentThread function.
     86   *
     87   * @param pThreadData
     88   *
     89   * @retval OMX_ErrorNone                  success, ready to roll
     90   *         OMX_ErrorInsufficientResources if the malloc fails
     91   **/
     92 /*-------------------------------------------------------------------*/
     93 void* OMX_JpegEnc_Thread (void* pThreadData)
     94 {
     95     int status;
     96     struct timeval tv;
     97     int fdmax;
     98     fd_set rfds;
     99     OMX_ERRORTYPE eError = OMX_ErrorNone;
    100     OMX_COMMANDTYPE eCmd;
    101     OMX_U32 nParam1;
    102     sigset_t set;
    103 
    104 
    105     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pThreadData;
    106     JPEGENC_COMPONENT_PRIVATE *pComponentPrivate = (JPEGENC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    107 
    108 #ifdef __PERF_INSTRUMENTATION__
    109     pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURS("JPET"),
    110                                                PERF_ModuleComponent |PERF_ModuleImageEncode);
    111 #endif
    112 
    113     /**Looking for highest number of file descriptor for pipes
    114        inorder to put in select loop */
    115     fdmax = pComponentPrivate->nCmdPipe[0];
    116 
    117     if ( pComponentPrivate->free_outBuf_Q[0] > fdmax ) {
    118         fdmax = pComponentPrivate->free_outBuf_Q[0];
    119     }
    120 
    121 
    122     if ( pComponentPrivate->filled_inpBuf_Q[0] > fdmax ) {
    123         fdmax = pComponentPrivate->filled_inpBuf_Q[0];
    124     }
    125 
    126     OMX_TRACE2(pComponentPrivate->dbg, "fd max is %d\n",fdmax);
    127 
    128     while ( 1 ) {
    129         FD_ZERO (&rfds);
    130         FD_SET (pComponentPrivate->nCmdPipe[0], &rfds);
    131         if (pComponentPrivate->nCurState != OMX_StatePause) {
    132             FD_SET (pComponentPrivate->free_outBuf_Q[0], &rfds);
    133             FD_SET (pComponentPrivate->filled_inpBuf_Q[0], &rfds);
    134         }
    135 
    136 
    137         tv.tv_sec = 1;
    138         tv.tv_usec = 0;
    139 
    140 	 sigemptyset(&set)	;
    141 	 sigaddset(&set,SIGALRM);
    142         status = pselect (fdmax+1, &rfds, NULL, NULL, NULL,&set);
    143 
    144         if ( 0 == status ) {
    145             OMX_TRACE2(pComponentPrivate->dbg, "Component Thread Time Out!!!\n");
    146         } else if ( -1 == status ) {
    147             OMX_TRACE4(pComponentPrivate->dbg, "Error in Select\n");
    148 
    149             pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
    150                                                     OMX_EventError, OMX_ErrorInsufficientResources, OMX_TI_ErrorSevere,
    151                                                     "Error from COmponent Thread in select");
    152 	     eError = OMX_ErrorInsufficientResources;
    153             break;
    154         } else {
    155             if ( (FD_ISSET (pComponentPrivate->filled_inpBuf_Q[0], &rfds))
    156                  && (pComponentPrivate->nCurState != OMX_StatePause) ) {
    157                 OMX_PRBUFFER2(pComponentPrivate->dbg, "filled_inpBuf_Q pipe is set\n");
    158 
    159                 eError = HandleJpegEncDataBuf_FromApp (pComponentPrivate);
    160 
    161                 if ( eError != OMX_ErrorNone ) {
    162                     OMX_PRBUFFER4(pComponentPrivate->dbg, "Error while processing free queue buffers\n");
    163                     pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
    164                                                             OMX_EventError, OMX_ErrorUndefined, OMX_TI_ErrorSevere,
    165                                                             "1-Error from Component Thread while processing free Q\n");
    166                 }
    167             }
    168 
    169             if ( FD_ISSET (pComponentPrivate->free_outBuf_Q[0], &rfds) ) {
    170                 OMX_PRBUFFER2(pComponentPrivate->dbg, "free_outBuf_Q has some buffers in Component Thread\n");
    171                 eError = HandleJpegEncFreeOutputBufferFromApp(pComponentPrivate);
    172                 if ( eError != OMX_ErrorNone ) {
    173                     OMX_PRBUFFER4(pComponentPrivate->dbg, "Error while processing free Q Buffers\n");
    174                     pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
    175                                                             OMX_EventError, OMX_ErrorUndefined, OMX_TI_ErrorSevere,
    176                                                             "3-Error from Component Thread while processing free Q\n");
    177                 }
    178             }
    179             if ( FD_ISSET (pComponentPrivate->nCmdPipe[0], &rfds) ) {
    180                 /* Do not accept any command when the component is stopping */
    181 		OMX_PRCOMM2(pComponentPrivate->dbg, "CMD pipe is set in Component Thread\n");
    182 
    183                 read (pComponentPrivate->nCmdPipe[0], &eCmd, sizeof (eCmd));
    184                 read (pComponentPrivate->nCmdDataPipe[0], &nParam1, sizeof (nParam1));
    185 
    186 #ifdef __PERF_INSTRUMENTATION__
    187                                 PERF_ReceivedCommand(pComponentPrivate->pPERFcomp,
    188                                                      eCmd, nParam1,
    189                                                      PERF_ModuleLLMM);
    190 #endif
    191 
    192                 OMX_PRINT2(pComponentPrivate->dbg, "eCmd %d, nParam1 %d\n", (int)eCmd, (int)nParam1);
    193                 if ( eCmd == OMX_CommandStateSet ) {
    194                     OMX_PRINT2(pComponentPrivate->dbg, "processing OMX_CommandStateSet\n");
    195                     if ( (int)nParam1 != -1 ){
    196                         if(nParam1 == OMX_StateInvalid){
    197                             pComponentPrivate->nToState = OMX_StateInvalid;
    198                         }
    199                         eError = HandleJpegEncCommand (pComponentPrivate, nParam1);
    200                         if ( eError != OMX_ErrorNone ) {
    201                             OMX_PRINT4(pComponentPrivate->dbg, "Error returned by HandleJpegEncCommand\n");
    202                             pComponentPrivate->cbInfo.EventHandler (pComponentPrivate->pHandle, pComponentPrivate->pHandle->pApplicationPrivate,
    203                                                                     OMX_EventError, OMX_ErrorHardware, OMX_TI_ErrorSevere,
    204                                                                     "Error returned by HandleJpegEncCommand\n");
    205                         }
    206 
    207                     }
    208                     else{
    209                         break;
    210                     }
    211                 }
    212                 else if ( eCmd == OMX_CommandPortDisable ) {
    213                     OMX_PRBUFFER2(pComponentPrivate->dbg, "Before Disable Port function Port %d\n",(int)nParam1);
    214                     eError = JpegEncDisablePort(pComponentPrivate, nParam1);
    215                     OMX_PRBUFFER2(pComponentPrivate->dbg, "After JPEG Encoder Sisable Port error = %d\n", eError);
    216                     if (eError != OMX_ErrorNone ) {
    217                         break;
    218                         }
    219                     }
    220                 else if ( eCmd == OMX_CommandPortEnable ) {   /*TODO: Check errors*/
    221                     eError = JpegEncEnablePort(pComponentPrivate, nParam1);
    222                     if (eError != OMX_ErrorNone ) {
    223                         break;
    224                         }
    225                     }
    226 
    227                 else if ( eCmd == OMX_CustomCommandStopThread ) {
    228                     /*eError = 10;*/
    229                     goto EXIT;
    230                     }
    231                 else if ( eCmd == OMX_CommandFlush ) {
    232                       OMX_PRBUFFER2(pComponentPrivate->dbg, "eCmd =  OMX_CommandFlush\n");
    233                       eError = HandleJpegEncCommandFlush (pComponentPrivate, nParam1);
    234                       if (eError != OMX_ErrorNone) {
    235                           break;
    236                           }
    237                     }
    238                     if (pComponentPrivate->nCurState == OMX_StatePause)
    239                         continue;
    240             }
    241 
    242 
    243         }
    244     }
    245     OMX_PRINT1(pComponentPrivate->dbg, "Component Thread Exit while loop\n");
    246 
    247 EXIT:
    248 
    249 #ifdef __PERF_INSTRUMENTATION__
    250     PERF_Done(pComponentPrivate->pPERFcomp);
    251 #endif
    252 
    253     OMX_PRINT1(pComponentPrivate->dbg, "Component Thread Exit while loop from EXIT label\n");
    254     return(void*)eError; /*OMX_ErrorNone;*/
    255 
    256 }
    257