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_G726Dec_CompThread.c
     30  *
     31  * This file implements the component thread functionality that receives
     32  * commands and buffers from application and LCML.
     33  *
     34  * @path  $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g726_dec\src
     35  *
     36  * @rev  1.0
     37  */
     38 /* ----------------------------------------------------------------------------
     39  *!
     40  *! Revision History
     41  *! ===================================
     42  *! This is newest file
     43  * =========================================================================== */
     44 /* ------compilation control switches -------------------------*/
     45 /****************************************************************
     46  *  INCLUDE FILES
     47  ****************************************************************/
     48 /* ----- system and platform files ----------------------------*/
     49 
     50 #ifdef UNDER_CE
     51 #include <windows.h>
     52 #include <oaf_osal.h>
     53 #include <omx_core.h>
     54 #include <stdlib.h>
     55 #else
     56 #include <unistd.h>
     57 #include <sys/types.h>
     58 #include <sys/types.h>
     59 #include <sys/stat.h>
     60 #include <dlfcn.h>
     61 #include <sys/select.h>
     62 #include <malloc.h>
     63 #include <memory.h>
     64 #include <fcntl.h>
     65 #include <signal.h>
     66 #include <sys/select.h>
     67 #endif
     68 
     69 #include <dbapi.h>
     70 #include <string.h>
     71 #include <stdio.h>
     72 
     73 #include "OMX_G726Dec_Utils.h"
     74 
     75 /* ================================================================================= * */
     76 /**
     77  * @fn G726DEC_ComponentThread() This is component thread that keeps listening for
     78  * commands or event/messages/buffers from application or from LCML.
     79  *
     80  * @param pThreadData This is thread argument.
     81  *
     82  * @pre          None
     83  *
     84  * @post         None
     85  *
     86  *  @return      OMX_ErrorNone = Always
     87  *
     88  *  @see         None
     89  */
     90 /* ================================================================================ * */
     91 void* G726DEC_ComponentThread (void* pThreadData)
     92 {
     93     int status = 0;
     94     struct timespec tv;
     95     int fdmax = 0;
     96     fd_set rfds;
     97     OMX_U32 nRet = 0;
     98     OMX_ERRORTYPE eError = OMX_ErrorNone;
     99     G726DEC_COMPONENT_PRIVATE* pComponentPrivate = (G726DEC_COMPONENT_PRIVATE*)pThreadData;
    100     OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
    101 
    102     G726DEC_DPRINT (":: Entering ComponentThread \n");
    103 
    104     fdmax = pComponentPrivate->cmdPipe[0];
    105 
    106     if (pComponentPrivate->dataPipe[0] > fdmax) {
    107         fdmax = pComponentPrivate->dataPipe[0];
    108     }
    109 
    110 
    111     while (1) {
    112         FD_ZERO (&rfds);
    113         FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
    114         FD_SET (pComponentPrivate->dataPipe[0], &rfds);
    115         tv.tv_sec = 1;
    116         tv.tv_nsec = 0;
    117 
    118 #ifndef UNDER_CE
    119         sigset_t set;
    120         sigemptyset (&set);
    121         sigaddset (&set, SIGALRM);
    122         status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
    123 #else
    124         status = select (fdmax+1, &rfds, NULL, NULL, &tv);
    125 #endif
    126 
    127         if (pComponentPrivate->bExitCompThrd == 1) {
    128             G726DEC_DPRINT(":: Comp Thrd Exiting here...\n");
    129             goto EXIT;
    130         }
    131 
    132         if (0 == status) {
    133             G726DEC_DPRINT("\n\n\n!!!!!  Component Time Out !!!!!!!!!!!! \n");
    134             if (pComponentPrivate->bExitCompThrd == 1) {
    135                 G726DEC_EPRINT(":: Comp Thrd Exiting here...\n");
    136                 goto EXIT;
    137             }
    138 
    139         } else if (-1 == status) {
    140             G726DEC_DPRINT (":: Error in Select\n");
    141             pComponentPrivate->cbInfo.EventHandler (
    142                                                     pHandle,pHandle->pApplicationPrivate,
    143                                                     OMX_EventError,OMX_ErrorInsufficientResources, 0,
    144                                                     "Error from COmponent Thread in select");
    145             eError = OMX_ErrorInsufficientResources;
    146 
    147         } else if ((FD_ISSET (pComponentPrivate->dataPipe[0], &rfds))) {
    148 
    149             int ret;
    150             OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
    151 
    152             G726DEC_DPRINT (":: DATA pipe is set in Component Thread\n");
    153             ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
    154             if (ret == -1) {
    155                 G726DEC_DPRINT (":: Error while reading from the pipe\n");
    156             }
    157 
    158             eError = G726DEC_HandleDataBuf_FromApp (pBufHeader,pComponentPrivate);
    159             if (eError != OMX_ErrorNone) {
    160                 G726DEC_DPRINT (":: Error From HandleDataBuf_FromApp\n");
    161                 break;
    162             }
    163         } else if (FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
    164             G726DEC_DPRINT (":: CMD pipe is set in Component Thread\n");
    165 
    166             nRet = G726DEC_HandleCommand (pComponentPrivate);
    167             if (nRet == EXIT_COMPONENT_THRD) {
    168                 G726DEC_DPRINT ("Exiting from Component thread\n");
    169                 G726DEC_CleanupInitParams(pHandle);
    170                 G726DEC_STATEPRINT("****************** Component State Set to Loaded\n\n");
    171 
    172                 pComponentPrivate->curState = OMX_StateLoaded;
    173 
    174                 if (pComponentPrivate->bPreempted == 0) {
    175                     pComponentPrivate->cbInfo.EventHandler(
    176                                                            pHandle, pHandle->pApplicationPrivate,
    177                                                            OMX_EventCmdComplete,
    178                                                            OMX_ErrorNone,pComponentPrivate->curState, NULL);
    179                 }
    180                 else {
    181                     pComponentPrivate->cbInfo.EventHandler(
    182                                                            pHandle, pHandle->pApplicationPrivate,
    183                                                            OMX_EventError,
    184                                                            OMX_ErrorResourcesLost,pComponentPrivate->curState, NULL);
    185                     pComponentPrivate->bPreempted = 0;
    186                 }
    187 
    188             }
    189 
    190         }
    191     }
    192  EXIT:
    193 
    194     pComponentPrivate->bCompThreadStarted = 0;
    195 
    196     G726DEC_DPRINT (":: Exiting ComponentThread \n");
    197     return (void*)eError;
    198 }
    199