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_G711Enc_ComponentThread.c
     30  *
     31  * This file implements G711 Encoder Component Thread and its functionality
     32  * that is fully compliant with the Khronos OpenMAX (TM) 1.0 Specification
     33  *
     34  * @path  $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g711_enc\src
     35  *
     36  * @rev  1.0
     37  */
     38 /* ----------------------------------------------------------------------------
     39  *!
     40  *! Revision History
     41  *! ===================================
     42  *! 12-Dec-2006: Initial Version
     43  *! This is newest file
     44  * =========================================================================== */
     45 
     46 /* ------compilation control switches -------------------------*/
     47 /****************************************************************
     48  *  INCLUDE FILES
     49  ****************************************************************/
     50 /* ----- system and platform files ----------------------------*/
     51 
     52 #ifdef UNDER_CE
     53 #include <windows.h>
     54 #include <oaf_osal.h>
     55 #include <omx_core.h>
     56 #else
     57 #include <dbapi.h>
     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 <string.h>
     64 #include <fcntl.h>
     65 #include <errno.h>
     66 #include <stdlib.h>
     67 #include <stdio.h>
     68 #include <signal.h>
     69 #endif
     70 /*-------program files ----------------------------------------*/
     71 #include <OMX_Component.h>
     72 
     73 #include "OMX_G711Enc_Utils.h"
     74 //#include <encode_common_ti.h>
     75 //#include "g711enc_sn_uuid.h"
     76 
     77 /* ================================================================================= */
     78 /**
     79  * @fn G711ENC_CompThread() Component thread
     80  *
     81  *  @see         OMX_G711Enc_ComponentThread.h
     82  */
     83 /* ================================================================================ */
     84 
     85 void* G711ENC_CompThread(void* pThreadData)
     86 {
     87     OMX_ERRORTYPE eError = OMX_ErrorNone;
     88     int status = 0;
     89     struct timespec tv;
     90     int fdmax = 0;
     91     int ret = 0;
     92     fd_set rfds;
     93     OMX_U32 nRet = 0;
     94     OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
     95     G711ENC_COMPONENT_PRIVATE* pComponentPrivate = (G711ENC_COMPONENT_PRIVATE*)pThreadData;
     96     OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
     97     G711ENC_DPRINT("%d :: Entering G711ENC_CompThread\n", __LINE__);
     98 
     99     fdmax = pComponentPrivate->cmdPipe[0];
    100     if (pComponentPrivate->dataPipe[0] > fdmax) {
    101         fdmax = pComponentPrivate->dataPipe[0];
    102     }
    103 
    104     while (1) {
    105         FD_ZERO (&rfds);
    106         FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
    107         FD_SET (pComponentPrivate->dataPipe[0], &rfds);
    108         tv.tv_sec = 1;
    109         tv.tv_nsec = 0;
    110 
    111 #ifndef UNDER_CE
    112         sigset_t set;
    113         sigemptyset (&set);
    114         sigaddset (&set, SIGALRM);
    115         status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
    116 #else
    117         status = select (fdmax+1, &rfds, NULL, NULL, &tv);
    118 #endif
    119 
    120 
    121         if (0 == status) {
    122             if (pComponentPrivate->bIsThreadstop == 1)   {
    123                 pComponentPrivate->bIsThreadstop = 0;
    124                 pComponentPrivate->lcml_nOpBuf = 0;
    125                 pComponentPrivate->lcml_nIpBuf = 0;
    126                 pComponentPrivate->app_nBuf = 0;
    127                 pComponentPrivate->num_Op_Issued = 0;
    128                 pComponentPrivate->num_Sent_Ip_Buff = 0;
    129                 pComponentPrivate->num_Reclaimed_Op_Buff = 0;
    130                 pComponentPrivate->bIsEOFSent = 0;
    131                 if (pComponentPrivate->curState != OMX_StateIdle) {
    132                     G711ENC_DPRINT("%d :: pComponentPrivate->curState is not OMX_StateIdle\n",__LINE__);
    133                     goto EXIT;
    134                 }
    135             }
    136             G711ENC_DPRINT("%d :: Component Time Out !!!!! \n",__LINE__);
    137         } else if(-1 == status) {
    138             G711ENC_DPRINT("%d :: Error in Select\n", __LINE__);
    139             pComponentPrivate->cbInfo.EventHandler ( pHandle,
    140                                                      pHandle->pApplicationPrivate,
    141                                                      OMX_EventError,
    142                                                      OMX_ErrorInsufficientResources,
    143                                                      0,
    144                                                      "Error from CompThread in select");
    145             eError = OMX_ErrorInsufficientResources;
    146 
    147         }
    148 
    149         else if (FD_ISSET (pComponentPrivate->dataPipe[0], &rfds)){
    150             G711ENC_DPRINT("%d :: DATA pipe is set in Component Thread\n",__LINE__);
    151             ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
    152             if (ret == -1) {
    153                 G711ENC_DPRINT("%d :: Error while reading from the pipe\n",__LINE__);
    154                 goto EXIT;
    155             }
    156             eError = G711ENC_HandleDataBufFromApp(pBufHeader,pComponentPrivate);
    157             if (eError != OMX_ErrorNone) {
    158                 G711ENC_DPRINT("%d :: G711ENC_HandleDataBufFromApp returned error\n",__LINE__);
    159                 break;
    160             }
    161         }
    162         else if(FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
    163             G711ENC_DPRINT("%d :: CMD pipe is set in Component Thread\n",__LINE__);
    164             nRet = G711ENC_HandleCommand(pComponentPrivate);
    165             if (nRet == G711ENC_EXIT_COMPONENT_THRD) {
    166 
    167                 pComponentPrivate->curState = OMX_StateLoaded;
    168                 if (pComponentPrivate->bPreempted == 0) {
    169                     pComponentPrivate->cbInfo.EventHandler( pHandle,
    170                                                             pHandle->pApplicationPrivate,
    171                                                             OMX_EventCmdComplete,
    172                                                             OMX_ErrorNone,
    173                                                             pComponentPrivate->curState,
    174                                                             NULL);
    175                 }
    176                 else {
    177                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    178                                                            pHandle->pApplicationPrivate,
    179                                                            OMX_EventError,
    180                                                            OMX_ErrorResourcesLost,
    181                                                            pComponentPrivate->curState,
    182                                                            NULL);
    183                     pComponentPrivate->bPreempted = 0;
    184                 }
    185             }
    186         }
    187     }
    188  EXIT:
    189     G711ENC_DPRINT("%d :: Exiting G711ENC_CompThread\n", __LINE__);
    190     G711ENC_DPRINT("%d :: Returning = 0x%x\n",__LINE__,eError);
    191     return (void*)eError;
    192 }
    193