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_AmrEnc_ComponentThread.c
     30 *
     31 * This file implements NBAMR 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\nbamr_enc\src
     35 *
     36 * @rev  1.0
     37 */
     38 /* ----------------------------------------------------------------------------
     39 *!
     40 *! Revision History
     41 *! ===================================
     42 *! 21-sept-2006 bk: updated review findings for alpha release
     43 *! 24-Aug-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests some more
     44 *! 18-July-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests validated for few cases
     45 *! 21-Jun-2006 bk: Khronos OpenMAX (TM) 1.0 migration done
     46 *! 22-May-2006 bk: DASF recording quality improved
     47 *! 19-Apr-2006 bk: DASF recording speed issue resloved
     48 *! 23-Feb-2006 bk: DASF functionality added
     49 *! 18-Jan-2006 bk: Repated recording issue fixed and LCML changes taken care
     50 *! 14-Dec-2005 bk: Initial Version
     51 *! 16-Nov-2005 bk: Initial Version
     52 *! 23-Sept-2005 bk: Initial Version
     53 *! 10-Sept-2005 bk: Initial Version
     54 *! 10-Sept-2005 bk:
     55 *! This is newest file
     56 * =========================================================================== */
     57 
     58 /* ------compilation control switches -------------------------*/
     59 /****************************************************************
     60 *  INCLUDE FILES
     61 ****************************************************************/
     62 /* ----- system and platform files ----------------------------*/
     63 
     64 #ifdef UNDER_CE
     65 #include <windows.h>
     66 #include <oaf_osal.h>
     67 #include <omx_core.h>
     68 #else
     69 #include <wchar.h>
     70 #include <dbapi.h>
     71 #include <unistd.h>
     72 #include <sys/time.h>
     73 #include <sys/types.h>
     74 #include <sys/ioctl.h>
     75 #include <sys/select.h>
     76 #include <string.h>
     77 #include <fcntl.h>
     78 #include <errno.h>
     79 #include <stdlib.h>
     80 #include <stdio.h>
     81 #include <signal.h>
     82 #endif
     83 /*-------program files ----------------------------------------*/
     84 #include "OMX_AmrEnc_Utils.h"
     85 #include "OMX_AmrEnc_ComponentThread.h"
     86 
     87 /* ================================================================================= */
     88 /**
     89 * @fn NBAMRENC_CompThread() Component thread
     90 *
     91 *  @see         OMX_AmrEnc_ComponentThread.h
     92 */
     93 /* ================================================================================ */
     94 
     95 void* NBAMRENC_CompThread(void* pThreadData)
     96 {
     97     OMX_ERRORTYPE eError = OMX_ErrorNone;
     98     int status;
     99     struct timespec tv;
    100     int fdmax;
    101     int ret = 0;
    102     fd_set rfds;
    103     OMX_U32 nRet;
    104     OMX_BUFFERHEADERTYPE *pBufHeader = NULL;
    105     AMRENC_COMPONENT_PRIVATE* pComponentPrivate = (AMRENC_COMPONENT_PRIVATE*)pThreadData;
    106     OMX_COMPONENTTYPE *pHandle = pComponentPrivate->pHandle;
    107     OMX_PRINT1(pComponentPrivate->dbg, "%d :: Entering NBAMRENC_CompThread\n", __LINE__);
    108 
    109 #ifdef __PERF_INSTRUMENTATION__
    110     pComponentPrivate->pPERFcomp = PERF_Create(PERF_FOURCC('N', 'B', '_', 'E'),
    111                                                PERF_ModuleComponent |
    112                                                PERF_ModuleAudioDecode);
    113 #endif
    114 
    115     fdmax = pComponentPrivate->cmdPipe[0];
    116 
    117     if (pComponentPrivate->dataPipe[0] > fdmax) {
    118         fdmax = pComponentPrivate->dataPipe[0];
    119     }
    120 
    121     while (1) {
    122         FD_ZERO (&rfds);
    123         FD_SET (pComponentPrivate->cmdPipe[0], &rfds);
    124         FD_SET (pComponentPrivate->dataPipe[0], &rfds);
    125         tv.tv_sec = 1;
    126         tv.tv_nsec = 0;
    127 
    128 #ifndef UNDER_CE
    129         sigset_t set;
    130         sigemptyset (&set);
    131         sigaddset (&set, SIGALRM);
    132         status = pselect (fdmax+1, &rfds, NULL, NULL, &tv, &set);
    133 #else
    134         status = select (fdmax+1, &rfds, NULL, NULL, &tv);
    135 #endif
    136 
    137         if (pComponentPrivate->bIsThreadstop == 1) {
    138             OMX_ERROR2(pComponentPrivate->dbg, ":: Comp Thrd Exiting here...\n");
    139             goto EXIT;
    140         }
    141 
    142         if (0 == status) {
    143             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: bIsThreadstop = %ld\n",__LINE__,pComponentPrivate->bIsThreadstop);
    144             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: lcml_nOpBuf = %ld\n",__LINE__,pComponentPrivate->lcml_nOpBuf);
    145             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: lcml_nIpBuf = %ld\n",__LINE__,pComponentPrivate->lcml_nIpBuf);
    146             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: app_nBuf = %ld\n",__LINE__,pComponentPrivate->app_nBuf);
    147             if (pComponentPrivate->bIsThreadstop == 1)  {
    148                 pComponentPrivate->bIsStopping = 0;
    149                 pComponentPrivate->bIsThreadstop = 0;
    150                 pComponentPrivate->lcml_nOpBuf = 0;
    151                 pComponentPrivate->lcml_nIpBuf = 0;
    152                 pComponentPrivate->app_nBuf = 0;
    153                 pComponentPrivate->num_Op_Issued = 0;
    154                 if (pComponentPrivate->curState != OMX_StateIdle) {
    155                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: pComponentPrivate->curState is not OMX_StateIdle\n",__LINE__);
    156                     goto EXIT;
    157                 }
    158              }
    159              OMX_PRINT1(pComponentPrivate->dbg, "%d :: Component Time Out !!!!! \n",__LINE__);
    160         } else if(-1 == status) {
    161             OMX_ERROR4(pComponentPrivate->dbg, "%d :: Error in Select\n", __LINE__);
    162             pComponentPrivate->cbInfo.EventHandler ( pHandle,
    163                                                      pHandle->pApplicationPrivate,
    164                                                      OMX_EventError,
    165                                                      OMX_ErrorInsufficientResources,
    166                                                      OMX_TI_ErrorSevere,
    167                                                      "Error from Component Thread in select");
    168             eError = OMX_ErrorInsufficientResources;
    169 
    170         } else if ((FD_ISSET (pComponentPrivate->dataPipe[0], &rfds))
    171                    && (pComponentPrivate->curState != OMX_StatePause)) {
    172             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: DATA pipe is set in Component Thread\n",__LINE__);
    173             ret = read(pComponentPrivate->dataPipe[0], &pBufHeader, sizeof(pBufHeader));
    174             if (ret == -1) {
    175                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: Error while reading from the pipe\n",__LINE__);
    176                 goto EXIT;
    177             }
    178             eError = NBAMRENC_HandleDataBufFromApp(pBufHeader,pComponentPrivate);
    179             if (eError != OMX_ErrorNone) {
    180                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: NBAMRENC_HandleDataBufFromApp returned error\n",__LINE__);
    181                 break;
    182             }
    183         }
    184 
    185         else if(FD_ISSET (pComponentPrivate->cmdPipe[0], &rfds)) {
    186             /* Do not accept any command when the component is stopping */
    187             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: CMD pipe is set in Component Thread\n",__LINE__);
    188             nRet = NBAMRENC_HandleCommand(pComponentPrivate);
    189             if (nRet == NBAMRENC_EXIT_COMPONENT_THRD) {
    190 
    191                 if(eError != OMX_ErrorNone) {
    192                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: NBAMRENC_CleanupInitParams returned error\n",__LINE__);
    193                     goto EXIT;
    194                 }
    195                 pComponentPrivate->curState = OMX_StateLoaded;
    196 #ifdef __PERF_INSTRUMENTATION__
    197                 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundaryCleanup);
    198 #endif
    199 
    200                 if(pComponentPrivate->bPreempted==0){
    201 
    202                     if(RemoveStateTransition(pComponentPrivate, OMX_TRUE) != OMX_ErrorNone) {
    203                         return OMX_ErrorUndefined;
    204                     }
    205 
    206                     pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
    207                                                            pComponentPrivate->pHandle->pApplicationPrivate,
    208                                                            OMX_EventCmdComplete,
    209                                                            OMX_CommandStateSet,
    210                                                            pComponentPrivate->curState,
    211                                                            NULL);
    212 
    213                 }
    214                 else{
    215                     pComponentPrivate->cbInfo.EventHandler( pHandle,
    216                                                             pHandle->pApplicationPrivate,
    217                                                             OMX_EventError,
    218                                                             OMX_ErrorResourcesLost,
    219                                                             OMX_TI_ErrorMajor,
    220                                                             NULL);
    221                     pComponentPrivate->bPreempted = 0;
    222                 }
    223                 goto EXIT;
    224             }
    225         }
    226 
    227     }
    228 EXIT:
    229     OMX_PRINT1(pComponentPrivate->dbg, "%d :: Exiting NBAMRENC_CompThread\n", __LINE__);
    230     OMX_PRINT1(pComponentPrivate->dbg, "%d :: Returning = 0x%x\n",__LINE__,eError);
    231 #ifdef __PERF_INSTRUMENTATION__
    232     PERF_Done(pComponentPrivate->pPERFcomp);
    233 #endif
    234     return (void*)eError;
    235 }
    236