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_AmrDec_Utils.c
     30 *
     31 * This file implements OMX Component for PCM decoder that
     32 * is fully compliant with the OMX Audio specification.
     33 *
     34 * @path  $(CSLPATH)\
     35 *
     36 * @rev  0.1
     37 */
     38 /* ----------------------------------------------------------------------------*/
     39 
     40 /* ------compilation control switches -------------------------*/
     41 /****************************************************************
     42 *  INCLUDE FILES
     43 ****************************************************************/
     44 /* ----- system and platform files ----------------------------*/
     45 #ifdef UNDER_CE
     46 #include <windows.h>
     47 #include <oaf_osal.h>
     48 #include <omx_core.h>
     49 #include <stdlib.h>
     50 #else
     51 #include <wchar.h>
     52 #include <unistd.h>
     53 #include <sys/types.h>
     54 #include <sys/wait.h>
     55 #include <sys/types.h>
     56 #include <sys/stat.h>
     57 #include <dlfcn.h>
     58 #include <malloc.h>
     59 #include <memory.h>
     60 #include <fcntl.h>
     61 #include <errno.h>
     62 #include <dlfcn.h>
     63 #endif
     64 #include <dbapi.h>
     65 #include <string.h>
     66 #include <stdio.h>
     67 #include "OMX_AmrDecoder.h"
     68 #include "OMX_AmrDec_Utils.h"
     69 #include "amrdecsocket_ti.h"
     70 #include <decode_common_ti.h>
     71 #include "OMX_AmrDec_ComponentThread.h"
     72 #include "usn.h"
     73 #include "LCML_DspCodec.h"
     74 
     75 #ifdef RESOURCE_MANAGER_ENABLED
     76 #include <ResourceManagerProxyAPI.h>
     77 #endif
     78 
     79 /* Log for Android system*/
     80 #include <utils/Log.h>
     81 
     82 /* ======================================================================= */
     83 /**
     84  * @def    DASF    Defines the value for identify DASF ON
     85  */
     86 /* ======================================================================= */
     87 #define DASF 1
     88 
     89 #ifdef UNDER_CE
     90 void sleep(DWORD Duration)
     91 {
     92     Sleep(Duration);
     93 
     94 }
     95 #endif
     96 
     97 /* ========================================================================== */
     98 /**
     99 * @NBAMRDECFill_LCMLInitParams () This function is used by the component thread to
    100 * fill the all of its initialization parameters, buffer deatils  etc
    101 * to LCML structure,
    102 *
    103 * @param pComponent  handle for this instance of the component
    104 * @param plcml_Init  pointer to LCML structure to be filled
    105 *
    106 * @pre
    107 *
    108 * @post
    109 *
    110 * @return none
    111 */
    112 /* ========================================================================== */
    113 OMX_ERRORTYPE NBAMRDECFill_LCMLInitParams(OMX_HANDLETYPE pComponent,
    114                                   LCML_DSP *plcml_Init, OMX_U16 arr[])
    115 {
    116 
    117     OMX_ERRORTYPE eError = OMX_ErrorNone;
    118     OMX_U32 nIpBuf,nIpBufSize,nOpBuf,nOpBufSize;
    119     OMX_U16 i;
    120     OMX_BUFFERHEADERTYPE *pTemp;
    121     OMX_U32 size_lcml;
    122     LCML_STRMATTR *strmAttr = NULL;
    123     LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent;
    124     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate;
    125     LCML_NBAMRDEC_BUFHEADERTYPE *pTemp_lcml;
    126     char *ptr;
    127 
    128     pComponentPrivate = pHandle->pComponentPrivate;
    129     OMX_PRINT1 (pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECFill_LCMLInitParams\n ",__LINE__);
    130 
    131     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
    132     pComponentPrivate->nRuntimeInputBuffers = nIpBuf;
    133 
    134     if(pComponentPrivate->mimemode == 1)
    135     {
    136         nIpBufSize = INPUT_NBAMRDEC_BUFFER_SIZE_MIME;
    137     }
    138     else if (pComponentPrivate->mimemode == 2)
    139          {
    140                nIpBufSize = INPUT_NBAMRDEC_BUFFER_SIZE_IF2;
    141          }
    142     else
    143     {
    144          if (OMX_AUDIO_AMRDTXasEFR == pComponentPrivate->iAmrMode)
    145          {
    146                 nIpBufSize = INPUT_BUFF_SIZE_EFR;
    147          }
    148          else{
    149                  nIpBufSize = STD_NBAMRDEC_BUF_SIZE;
    150          }
    151     }
    152 
    153     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
    154     pComponentPrivate->nRuntimeOutputBuffers = nOpBuf;
    155 
    156     nOpBufSize = OUTPUT_NBAMRDEC_BUFFER_SIZE;
    157 
    158 
    159     /* Fill Input Buffers Info for LCML */
    160     plcml_Init->In_BufInfo.nBuffers = nIpBuf;
    161     plcml_Init->In_BufInfo.nSize = nIpBufSize;
    162     plcml_Init->In_BufInfo.DataTrMethod = DMM_METHOD;
    163 
    164 
    165     /* Fill Output Buffers Info for LCML */
    166     plcml_Init->Out_BufInfo.nBuffers = nOpBuf;
    167     plcml_Init->Out_BufInfo.nSize = nOpBufSize;
    168     plcml_Init->Out_BufInfo.DataTrMethod = DMM_METHOD;
    169 
    170     /*Copy the node information */
    171     plcml_Init->NodeInfo.nNumOfDLLs = 3;
    172 
    173     plcml_Init->NodeInfo.AllUUIDs[0].uuid = &AMRDECSOCKET_TI_UUID;
    174 
    175     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[0].DllName,NBAMRDEC_DLL_NAME);
    176 
    177     plcml_Init->NodeInfo.AllUUIDs[0].eDllType = DLL_NODEOBJECT;
    178 
    179     plcml_Init->NodeInfo.AllUUIDs[1].uuid = &AMRDECSOCKET_TI_UUID;
    180     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[1].DllName,NBAMRDEC_DLL_NAME);
    181     plcml_Init->NodeInfo.AllUUIDs[1].eDllType = DLL_DEPENDENT;
    182 
    183     plcml_Init->NodeInfo.AllUUIDs[2].uuid = &USN_TI_UUID;
    184     strcpy ((char*)plcml_Init->NodeInfo.AllUUIDs[2].DllName,NBAMRDEC_USN_DLL_NAME);
    185     plcml_Init->NodeInfo.AllUUIDs[2].eDllType = DLL_DEPENDENT;
    186 
    187 
    188     if(pComponentPrivate->dasfmode == 1) {
    189         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate->dasfmode = %d\n",__LINE__,pComponentPrivate->dasfmode);
    190         OMX_MALLOC_GENERIC(strmAttr, LCML_STRMATTR);
    191 
    192         pComponentPrivate->strmAttr = strmAttr;
    193         strmAttr->uSegid = 0;
    194         strmAttr->uAlignment = 0;
    195         strmAttr->uTimeout = NBAMRD_TIMEOUT;
    196         strmAttr->uBufsize = OUTPUT_NBAMRDEC_BUFFER_SIZE;
    197         strmAttr->uNumBufs = 2;
    198         strmAttr->lMode = STRMMODE_PROCCOPY;
    199         plcml_Init->DeviceInfo.TypeofDevice =1;
    200         plcml_Init->DeviceInfo.TypeofRender =0;
    201         if(pComponentPrivate->acdnmode == 1)
    202         {
    203               /* ACDN mode */
    204               plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &ACDN_TI_UUID;
    205         }
    206         else
    207         {
    208                  /* DASF/TeeDN mode */
    209               plcml_Init->DeviceInfo.AllUUIDs[0].uuid = &MMMDN_TI_UUID;
    210         }
    211         plcml_Init->DeviceInfo.DspStream = strmAttr;
    212     }
    213     else {
    214         pComponentPrivate->strmAttr = NULL;
    215     }
    216 
    217 
    218     /*copy the other information */
    219     plcml_Init->SegID = OMX_AMRDEC_DEFAULT_SEGMENT;
    220     plcml_Init->Timeout = OMX_AMRDEC_SN_TIMEOUT;
    221     plcml_Init->Alignment = 0;
    222     plcml_Init->Priority = OMX_AMRDEC_SN_PRIORITY;
    223     plcml_Init->ProfileID = -1;
    224 
    225     /* TODO: Set this using SetParameter() */
    226     pComponentPrivate->iAmrSamplingFrequeny = NBAMRDEC_SAMPLING_FREQUENCY;
    227 
    228     pComponentPrivate->iAmrChannels = pComponentPrivate->amrParams[NBAMRDEC_OUTPUT_PORT]->nChannels;
    229 
    230     pComponentPrivate->iAmrMode =
    231         pComponentPrivate->amrParams[NBAMRDEC_INPUT_PORT]->eAMRDTXMode;
    232 
    233     /*if(pComponentPrivate->mimemode == 1)
    234     {
    235        pComponentPrivate->iAmrMimeFlag = MODE_MIME;
    236     } else {
    237         pComponentPrivate->iAmrMimeFlag = MODE_NONMIME;
    238     }*/
    239 
    240     arr[0] = STREAM_COUNT;
    241     arr[1] = NBAMRDEC_INPUT_PORT;
    242     arr[2] = NBAMRDEC_DMM;
    243     OMX_PRINT2(pComponentPrivate->dbg, "%s: IN %d", __FUNCTION__, pComponentPrivate->pOutputBufferList->numBuffers);
    244     if (pComponentPrivate->pInputBufferList->numBuffers) {
    245         arr[3] = pComponentPrivate->pInputBufferList->numBuffers;
    246     }
    247     else {
    248         arr[3] = 1;
    249     }
    250 
    251     arr[4] = NBAMRDEC_OUTPUT_PORT;
    252 
    253     if(pComponentPrivate->dasfmode == 1) {
    254         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Setting up create phase params for DASF mode\n",__LINE__);
    255         arr[5] = NBAMRDEC_OUTSTRM;
    256         arr[6] = NUM_NBAMRDEC_OUTPUT_BUFFERS_DASF;
    257     }
    258     else {
    259         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Setting up create phase params for FILE mode\n",__LINE__);
    260         arr[5] = NBAMRDEC_DMM;
    261     OMX_PRINT2(pComponentPrivate->dbg, "%s: OUT : %d", __FUNCTION__, pComponentPrivate->pOutputBufferList->numBuffers);
    262 
    263         if (pComponentPrivate->pOutputBufferList->numBuffers) {
    264             arr[6] = pComponentPrivate->pOutputBufferList->numBuffers;
    265         }
    266         else {
    267             arr[6] = 2;
    268         }
    269 
    270     }
    271 
    272     if(pComponentPrivate->iAmrMode == OMX_AUDIO_AMRDTXasEFR) {
    273         arr[7] = NBAMRDEC_EFR;
    274     }
    275     else {
    276         arr[7] = NBAMR;
    277     }
    278 
    279     /*if(1 == pComponentPrivate->mimemode) {
    280         arr[8] = NBAMRDEC_MIMEMODE;
    281     }
    282     else {
    283         arr[8] = NBAMRDEC_NONMIMEMODE;
    284     }
    285     */
    286     arr[8] = pComponentPrivate->mimemode; /*MIME, IF2 or FORMATCONFORMANCE*/
    287     arr[9] = END_OF_CR_PHASE_ARGS;
    288 
    289     plcml_Init->pCrPhArgs = arr;
    290 
    291     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
    292     size_lcml = nIpBuf * sizeof(LCML_NBAMRDEC_BUFHEADERTYPE);
    293     OMX_MALLOC_SIZE(ptr, size_lcml,char);
    294     pTemp_lcml = (LCML_NBAMRDEC_BUFHEADERTYPE *)ptr;
    295     pComponentPrivate->pLcmlBufHeader[NBAMRDEC_INPUT_PORT] = pTemp_lcml;
    296 
    297     for (i=0; i<nIpBuf; i++) {
    298         pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
    299         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
    300 /*        pTemp->nAllocLen = nIpBufSize;*/
    301         pTemp->nFilledLen = nIpBufSize;
    302         pTemp->nVersion.s.nVersionMajor = AMRDEC_MAJOR_VER;
    303         pTemp->nVersion.s.nVersionMinor = AMRDEC_MINOR_VER;
    304         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    305         pTemp->nTickCount = NOT_USED;
    306         pTemp_lcml->buffer = pTemp;
    307         pTemp_lcml->eDir = OMX_DirInput;
    308 
    309         OMX_MALLOC_SIZE_DSPALIGN(pTemp_lcml->pBufferParam,
    310                                 sizeof(NBAMRDEC_ParamStruct),
    311                                 NBAMRDEC_ParamStruct);
    312 
    313         pTemp_lcml->pBufferParam->usNbFrames =0;
    314         pTemp_lcml->pBufferParam->pParamElem = NULL;
    315         pTemp_lcml->pFrameParam = NULL;
    316         OMX_MALLOC_GENERIC(pTemp_lcml->pDmmBuf, DMM_BUFFER_OBJ);
    317 
    318         /* This means, it is not a last buffer. This flag is to be modified by
    319          * the application to indicate the last buffer */
    320         pTemp->nFlags = NORMAL_BUFFER;
    321 
    322         pTemp_lcml++;
    323     }
    324 
    325     /* Allocate memory for all output buffer headers..
    326        * This memory pointer will be sent to LCML */
    327     size_lcml = nOpBuf * sizeof(LCML_NBAMRDEC_BUFHEADERTYPE);
    328     OMX_MALLOC_SIZE(pTemp_lcml, size_lcml,LCML_NBAMRDEC_BUFHEADERTYPE);
    329     pComponentPrivate->pLcmlBufHeader[NBAMRDEC_OUTPUT_PORT] = pTemp_lcml;
    330 
    331     for (i=0; i<nOpBuf; i++) {
    332         pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
    333         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
    334 /*        pTemp->nAllocLen = nOpBufSize;*/
    335         pTemp->nFilledLen = nOpBufSize;
    336         pTemp->nVersion.s.nVersionMajor = AMRDEC_MAJOR_VER;
    337         pTemp->nVersion.s.nVersionMinor = AMRDEC_MINOR_VER;
    338         pComponentPrivate->nVersion = pTemp->nVersion.nVersion;
    339         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
    340         pTemp->nTickCount = NOT_USED;
    341         /* This means, it is not a last buffer. This flag is to be modified by
    342          * the application to indicate the last buffer */
    343 
    344         pTemp_lcml->buffer = pTemp;
    345         pTemp_lcml->eDir = OMX_DirOutput;
    346         pTemp_lcml->pFrameParam = NULL;
    347 
    348         OMX_MALLOC_SIZE_DSPALIGN(pTemp_lcml->pBufferParam,
    349                                 sizeof(NBAMRDEC_ParamStruct),
    350                                 NBAMRDEC_ParamStruct);
    351 
    352         pTemp_lcml->pBufferParam->usNbFrames =0;
    353         pTemp_lcml->pBufferParam->pParamElem = NULL;
    354         OMX_MALLOC_GENERIC(pTemp_lcml->pDmmBuf, DMM_BUFFER_OBJ);
    355 
    356         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::pTemp_lcml = %p\n",__LINE__,pTemp_lcml);
    357         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::pTemp_lcml->buffer = %p\n",__LINE__,pTemp_lcml->buffer);
    358 
    359         pTemp->nFlags = NORMAL_BUFFER;
    360 
    361         pTemp++;
    362         pTemp_lcml++;
    363     }
    364     pComponentPrivate->bPortDefsAllocated = 1;
    365 #ifdef __PERF_INSTRUMENTATION__
    366     pComponentPrivate->nLcml_nCntIp = 0;
    367     pComponentPrivate->nLcml_nCntOpReceived = 0;
    368 #endif
    369 
    370     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting NBAMRDECFill_LCMLInitParams\n",__LINE__);
    371 
    372     pComponentPrivate->bInitParamsInitialized = 1;
    373 EXIT:
    374 
    375     return eError;
    376 }
    377 
    378 
    379 /* ========================================================================== */
    380 /**
    381 * @NBAMRDEC_StartComponentThread() This function is called by the component to create
    382 * the component thread, command pipe, data pipe and LCML Pipe.
    383 *
    384 * @param pComponent  handle for this instance of the component
    385 *
    386 * @pre
    387 *
    388 * @post
    389 *
    390 * @return none
    391 */
    392 /* ========================================================================== */
    393 OMX_ERRORTYPE NBAMRDEC_StartComponentThread(OMX_HANDLETYPE pComponent)
    394 {
    395     OMX_ERRORTYPE eError = OMX_ErrorNone;
    396     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    397     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate =
    398                         (AMRDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
    399 #ifdef UNDER_CE
    400     pthread_attr_t attr;
    401     memset(&attr, 0, sizeof(attr));
    402     attr.__inheritsched = PTHREAD_EXPLICIT_SCHED;
    403     attr.__schedparam.__sched_priority = OMX_AUDIO_DECODER_THREAD_PRIORITY;
    404 #endif
    405 
    406     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside  NBAMRDEC_StartComponentThread\n", __LINE__);
    407 
    408     /* Initialize all the variables*/
    409     pComponentPrivate->bIsStopping = 0;
    410     pComponentPrivate->lcml_nOpBuf = 0;
    411     pComponentPrivate->lcml_nIpBuf = 0;
    412     pComponentPrivate->app_nBuf = 0;
    413     pComponentPrivate->num_Reclaimed_Op_Buff = 0;
    414     pComponentPrivate->first_output_buf_rcv = 0;
    415 
    416     /* create the pipe used to send buffers to the thread */
    417     eError = pipe (pComponentPrivate->cmdDataPipe);
    418     if (eError) {
    419        eError = OMX_ErrorInsufficientResources;
    420        goto EXIT;
    421     }
    422 
    423     /* create the pipe used to send buffers to the thread */
    424     eError = pipe (pComponentPrivate->dataPipe);
    425     if (eError) {
    426        eError = OMX_ErrorInsufficientResources;
    427        goto EXIT;
    428     }
    429 
    430     /* create the pipe used to send commands to the thread */
    431     eError = pipe (pComponentPrivate->cmdPipe);
    432     if (eError) {
    433        eError = OMX_ErrorInsufficientResources;
    434        goto EXIT;
    435     }
    436 
    437     /* create the pipe used to send commands to the thread */
    438 /*    eError = pipe (pComponentPrivate->lcml_Pipe);
    439     if (eError) {
    440        eError = OMX_ErrorInsufficientResources;
    441        goto EXIT;
    442     }
    443 */
    444     /* Create the Component Thread */
    445 #ifdef UNDER_CE
    446     eError = pthread_create (&(pComponentPrivate->ComponentThread), &attr, NBAMRDEC_ComponentThread, pComponentPrivate);
    447 #else
    448     eError = pthread_create (&(pComponentPrivate->ComponentThread), NULL, NBAMRDEC_ComponentThread, pComponentPrivate);
    449 #endif
    450     if (eError || !pComponentPrivate->ComponentThread) {
    451        eError = OMX_ErrorInsufficientResources;
    452        goto EXIT;
    453     }
    454     pComponentPrivate->bCompThreadStarted = 1;
    455 EXIT:
    456     return eError;
    457 }
    458 
    459 /* ========================================================================== */
    460 /**
    461 * @Mp3Dec_FreeCompResources() This function is called by the component during
    462 * de-init to close component thread, Command pipe, data pipe & LCML pipe.
    463 *
    464 * @param pComponent  handle for this instance of the component
    465 *
    466 * @pre
    467 *
    468 * @post
    469 *
    470 * @return none
    471 */
    472 /* ========================================================================== */
    473 
    474 OMX_ERRORTYPE NBAMRDEC_FreeCompResources(OMX_HANDLETYPE pComponent)
    475 {
    476     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    477     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate = (AMRDEC_COMPONENT_PRIVATE *)
    478                                                      pHandle->pComponentPrivate;
    479 
    480     OMX_ERRORTYPE eError = OMX_ErrorNone;
    481     OMX_ERRORTYPE err = OMX_ErrorNone;
    482     OMX_U32 nIpBuf = 0;
    483     OMX_U32 nOpBuf = 0;
    484 
    485     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDEC_FreeCompResources\n", __LINE__);
    486 
    487     if (pComponentPrivate->bPortDefsAllocated) {
    488         nIpBuf = pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->nBufferCountActual;
    489         nOpBuf = pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->nBufferCountActual;
    490     }
    491 
    492     if (pComponentPrivate->bCompThreadStarted) {
    493         err = close (pComponentPrivate->dataPipe[0]);
    494 
    495         if (0 != err && OMX_ErrorNone == eError) {
    496             eError = OMX_ErrorHardware;
    497         }
    498 
    499         err = close (pComponentPrivate->dataPipe[1]);
    500         if (0 != err && OMX_ErrorNone == eError) {
    501             eError = OMX_ErrorHardware;
    502         }
    503 
    504         err = close (pComponentPrivate->cmdPipe[0]);
    505         if (0 != err && OMX_ErrorNone == eError) {
    506             eError = OMX_ErrorHardware;
    507         }
    508 
    509         err = close (pComponentPrivate->cmdPipe[1]);
    510         if (0 != err && OMX_ErrorNone == eError) {
    511             eError = OMX_ErrorHardware;
    512         }
    513 
    514         err = close (pComponentPrivate->cmdDataPipe[0]);
    515         if (0 != err && OMX_ErrorNone == eError) {
    516             eError = OMX_ErrorHardware;
    517         }
    518 
    519         err = close (pComponentPrivate->cmdDataPipe[1]);
    520         if (0 != err && OMX_ErrorNone == eError) {
    521             eError = OMX_ErrorHardware;
    522         }
    523 
    524 /*        err = close (pComponentPrivate->lcml_Pipe[0]);
    525         if (0 != err && OMX_ErrorNone == eError) {
    526             eError = OMX_ErrorHardware;
    527         }
    528 
    529         err = close (pComponentPrivate->lcml_Pipe[1]);
    530         if (0 != err && OMX_ErrorNone == eError) {
    531             eError = OMX_ErrorHardware;
    532         } */
    533 
    534     }
    535     OMX_MEMFREE_STRUCT(pComponentPrivate->pPriorityMgmt);
    536     OMX_MEMFREE_STRUCT(pComponentPrivate->pHoldBuffer);
    537     OMX_MEMFREE_STRUCT(pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]);
    538     OMX_MEMFREE_STRUCT(pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]);
    539     OMX_MEMFREE_STRUCT(pComponentPrivate->amrParams[NBAMRDEC_INPUT_PORT]);
    540     OMX_MEMFREE_STRUCT(pComponentPrivate->amrParams[NBAMRDEC_OUTPUT_PORT]);
    541 
    542     pComponentPrivate->bPortDefsAllocated = 0;
    543     /* Removing sleep() calls. */
    544 #ifndef UNDER_CE
    545     OMX_PRDSP2(pComponentPrivate->dbg, "\n\n FreeCompResources: Destroying mutexes.\n\n");
    546     pthread_mutex_destroy(&pComponentPrivate->InLoaded_mutex);
    547     pthread_cond_destroy(&pComponentPrivate->InLoaded_threshold);
    548 
    549     pthread_mutex_destroy(&pComponentPrivate->InIdle_mutex);
    550     pthread_cond_destroy(&pComponentPrivate->InIdle_threshold);
    551 
    552     pthread_mutex_destroy(&pComponentPrivate->AlloBuf_mutex);
    553     pthread_cond_destroy(&pComponentPrivate->AlloBuf_threshold);
    554 #else
    555     pComponentPrivate->bPortDefsAllocated = 0;
    556     OMX_DestroyEvent(&(pComponentPrivate->InLoaded_event));
    557     OMX_DestroyEvent(&(pComponentPrivate->InIdle_event));
    558     OMX_DestroyEvent(&(pComponentPrivate->AlloBuf_event));
    559 #endif
    560     /* Removing sleep() calls. */
    561     return eError;
    562 }
    563 
    564 
    565 
    566 OMX_ERRORTYPE NBAMRDEC_CleanupInitParams(OMX_HANDLETYPE pComponent)
    567 {
    568     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    569     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate = (AMRDEC_COMPONENT_PRIVATE *)
    570                                                      pHandle->pComponentPrivate;
    571 
    572     LCML_NBAMRDEC_BUFHEADERTYPE *pTemp_lcml;
    573 
    574     OMX_ERRORTYPE eError = OMX_ErrorNone;
    575     OMX_U32 nIpBuf = 0;
    576     OMX_U16 i=0;
    577     LCML_DSP_INTERFACE *pLcmlHandle;
    578     LCML_DSP_INTERFACE *pLcmlHandleAux;
    579 
    580     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDEC_CleanupInitParams()\n", __LINE__);
    581 
    582     OMX_MEMFREE_STRUCT(pComponentPrivate->strmAttr);
    583 
    584     OMX_MEMFREE_STRUCT_DSPALIGN(pComponentPrivate->pParams,AMRDEC_AudioCodecParams);
    585 
    586     nIpBuf = pComponentPrivate->nRuntimeInputBuffers;
    587     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[NBAMRDEC_INPUT_PORT];
    588     for(i=0; i<nIpBuf; i++) {
    589         if(pTemp_lcml->pFrameParam!=NULL){
    590             OMX_MEMFREE_STRUCT_DSPALIGN(pTemp_lcml->pFrameParam, NBAMRDEC_FrameStruct);
    591             pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
    592             pLcmlHandleAux = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)pLcmlHandle->pCodecinterfacehandle)->pCodec);
    593             OMX_DmmUnMap(pLcmlHandleAux->dspCodec->hProc,
    594                                (void*)pTemp_lcml->pBufferParam->pParamElem,
    595                                pTemp_lcml->pDmmBuf->pReserved, pComponentPrivate->dbg);
    596         }
    597         OMX_MEMFREE_STRUCT_DSPALIGN(pTemp_lcml->pBufferParam, NBAMRDEC_ParamStruct);
    598         OMX_MEMFREE_STRUCT(pTemp_lcml->pDmmBuf);
    599         pTemp_lcml++;
    600     }
    601 
    602     pTemp_lcml = pComponentPrivate->pLcmlBufHeader[NBAMRDEC_OUTPUT_PORT];
    603     for(i=0; i<pComponentPrivate->nRuntimeOutputBuffers; i++){
    604         if(pTemp_lcml->pFrameParam!=NULL){
    605                OMX_MEMFREE_STRUCT_DSPALIGN(pTemp_lcml->pFrameParam, NBAMRDEC_FrameStruct);
    606                pLcmlHandle = (LCML_DSP_INTERFACE *)pComponentPrivate->pLcmlHandle;
    607                pLcmlHandleAux = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)pLcmlHandle->pCodecinterfacehandle)->pCodec);
    608                OMX_DmmUnMap(pLcmlHandleAux->dspCodec->hProc,
    609                               (void*)pTemp_lcml->pBufferParam->pParamElem,
    610                                pTemp_lcml->pDmmBuf->pReserved, pComponentPrivate->dbg);
    611         }
    612         OMX_MEMFREE_STRUCT_DSPALIGN(pTemp_lcml->pBufferParam, NBAMRDEC_ParamStruct);
    613         OMX_MEMFREE_STRUCT(pTemp_lcml->pDmmBuf);
    614         pTemp_lcml++;
    615     }
    616     OMX_MEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[NBAMRDEC_INPUT_PORT]);
    617     OMX_MEMFREE_STRUCT(pComponentPrivate->pLcmlBufHeader[NBAMRDEC_OUTPUT_PORT]);
    618     return eError;
    619 }
    620 
    621 /* ========================================================================== */
    622 /**
    623 * @NBAMRDEC_StopComponentThread() This function is called by the component during
    624 * de-init to close component thread, Command pipe, data pipe & LCML pipe.
    625 *
    626 * @param pComponent  handle for this instance of the component
    627 *
    628 * @pre
    629 *
    630 * @post
    631 *
    632 * @return none
    633 */
    634 /* ========================================================================== */
    635 
    636 OMX_ERRORTYPE NBAMRDEC_StopComponentThread(OMX_HANDLETYPE pComponent)
    637 {
    638     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)pComponent;
    639     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate = (AMRDEC_COMPONENT_PRIVATE *)
    640                                                      pHandle->pComponentPrivate;
    641 
    642     OMX_ERRORTYPE eError = OMX_ErrorNone;
    643     OMX_ERRORTYPE threadError = OMX_ErrorNone;
    644     OMX_S16 pthreadError = 0;
    645 
    646     /*Join the component thread */
    647     pComponentPrivate->bIsStopping = 1;
    648     write (pComponentPrivate->cmdPipe[1], &pComponentPrivate->bIsStopping, sizeof(OMX_U16));
    649     pthreadError = pthread_join (pComponentPrivate->ComponentThread,
    650                                  (void*)&threadError);
    651     if (0 != pthreadError) {
    652         eError = OMX_ErrorHardware;
    653     }
    654 
    655     /*Check for the errors */
    656     if (OMX_ErrorNone != threadError && OMX_ErrorNone != eError) {
    657         eError = OMX_ErrorInsufficientResources;
    658         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error while closing Component Thread\n",__LINE__);
    659     }
    660    return eError;
    661 }
    662 
    663 
    664 /* ========================================================================== */
    665 /**
    666 * @NBAMRDECHandleCommand() This function is called by the component when ever it
    667 * receives the command from the application
    668 *
    669 * @param pComponentPrivate  Component private data
    670 *
    671 * @pre
    672 *
    673 * @post
    674 *
    675 * @return none
    676 */
    677 /* ========================================================================== */
    678 
    679 OMX_U32 NBAMRDECHandleCommand (AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
    680 {
    681 
    682     OMX_COMPONENTTYPE *pHandle;
    683     OMX_COMMANDTYPE command;
    684     OMX_STATETYPE commandedState;
    685     OMX_U32 commandData;
    686     OMX_HANDLETYPE pLcmlHandle = pComponentPrivate->pLcmlHandle;
    687 
    688     OMX_U16 i;
    689     OMX_ERRORTYPE eError = OMX_ErrorNone;
    690 
    691     OMX_U32 nBuf;
    692     OMX_U16 arr[100];
    693     OMX_STRING p = "hello";
    694     LCML_CALLBACKTYPE cb;
    695     LCML_DSP *pLcmlDsp;
    696     AMRDEC_AudioCodecParams *pParams;
    697     ssize_t ret;
    698     LCML_NBAMRDEC_BUFHEADERTYPE *pLcmlHdr = NULL;
    699     int inputPortFlag=0,outputPortFlag=0;
    700 #ifdef RESOURCE_MANAGER_ENABLED
    701     OMX_ERRORTYPE rm_error;
    702 #endif
    703 
    704     pHandle = (OMX_COMPONENTTYPE *) pComponentPrivate->pHandle;
    705 
    706     ret = read (pComponentPrivate->cmdPipe[0], &command, sizeof (command));
    707     if (ret == -1) {
    708         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error While reading from the Pipe\n",__LINE__);
    709         eError = OMX_ErrorHardware;
    710         goto EXIT;
    711     }
    712 
    713     ret = read (pComponentPrivate->cmdDataPipe[0], &commandData, sizeof (commandData));
    714     if (ret == -1) {
    715         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error While reading from the Pipe\n",__LINE__);
    716         eError = OMX_ErrorHardware;
    717         goto EXIT;
    718     }
    719 
    720 #ifdef __PERF_INSTRUMENTATION__
    721     PERF_ReceivedCommand(pComponentPrivate->pPERFcomp,
    722                         command,
    723                         commandData,
    724                         PERF_ModuleLLMM);
    725 #endif
    726 
    727     if (command == OMX_CommandStateSet) {
    728         commandedState = (OMX_STATETYPE)commandData;
    729         switch(commandedState) {
    730             case OMX_StateIdle:
    731                 if (pComponentPrivate->curState == commandedState){
    732                     pComponentPrivate->cbInfo.EventHandler (pHandle,
    733                                                             pHandle->pApplicationPrivate,
    734                                                             OMX_EventError,
    735                                                             OMX_ErrorSameState,
    736                                                             OMX_TI_ErrorMinor,
    737                                                             NULL);
    738                 }
    739                 else if (pComponentPrivate->curState == OMX_StateLoaded || pComponentPrivate->curState == OMX_StateWaitForResources) {
    740         while (1) {
    741             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In while loop OMX_StateLoaded [NBAMRDEC_INPUT_PORT]->bPopulated  %d \n",__LINE__,pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated);
    742             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In while loop OMX_StateLoaded [NBAMRDEC_INPUT_PORT]->bEnabled    %d \n",__LINE__,pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled);
    743             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In while loop OMX_StateLoaded [NBAMRDEC_OUTPUT_PORT]->bPopulated %d \n",__LINE__,pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated);
    744             OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In while loop OMX_StateLoaded [NBAMRDEC_OUTPUT_PORT]->bEnabled   %d \n",__LINE__,pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled);
    745 #ifdef __PERF_INSTRUMENTATION__
    746             PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryStart | PERF_BoundarySetup);
    747 #endif
    748 
    749             if (pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated &&  pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled)  {
    750                 inputPortFlag = 1;
    751             }
    752 
    753             if (!pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated && !pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled) {
    754                 inputPortFlag = 1;
    755             }
    756 
    757             if (pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated && pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled) {
    758                 outputPortFlag = 1;
    759             }
    760 
    761             if (!pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated && !pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled) {
    762                 outputPortFlag = 1;
    763             }
    764 
    765             if (inputPortFlag && outputPortFlag) {
    766                 break;
    767             }
    768             pComponentPrivate->InLoaded_readytoidle = 1;
    769 #ifndef UNDER_CE
    770             pthread_mutex_lock(&pComponentPrivate->InLoaded_mutex);
    771             pthread_cond_wait(&pComponentPrivate->InLoaded_threshold, &pComponentPrivate->InLoaded_mutex);
    772             pthread_mutex_unlock(&pComponentPrivate->InLoaded_mutex);
    773             break;
    774 #else
    775             OMX_WaitForEvent(&(pComponentPrivate->InLoaded_event));
    776 #endif
    777             break;
    778         }
    779 
    780                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECHandleCommand\n",__LINE__);
    781                 cb.LCML_Callback = (void *) NBAMRDECLCML_Callback;
    782                 pLcmlHandle = (OMX_HANDLETYPE) NBAMRDECGetLCMLHandle(pComponentPrivate);
    783                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECHandleCommand\n",__LINE__);
    784 
    785                 if (pLcmlHandle == NULL) {
    786                     OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: LCML Handle is NULL........exiting..\n",__LINE__);
    787                     pComponentPrivate->curState = OMX_StateInvalid;
    788                     eError = OMX_ErrorHardware;
    789                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    790                                                             pHandle->pApplicationPrivate,
    791                                                             OMX_EventError,
    792                                                             OMX_ErrorHardware,
    793                                                             OMX_TI_ErrorSevere,
    794                                                             "Lcml Handle NULL");
    795                     goto EXIT;
    796                 }
    797                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand\n",__LINE__);
    798                 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pLcmlHandle = %p\n",__LINE__,pLcmlHandle);
    799 
    800                 /* Got handle of dsp via phandle filling information about DSP
    801                  specific things */
    802                 pLcmlDsp = (((LCML_DSP_INTERFACE*)pLcmlHandle)->dspCodec);
    803                 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pLcmlDsp = %p\n",__LINE__,pLcmlDsp);
    804 
    805                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand\n",__LINE__);
    806                 eError = NBAMRDECFill_LCMLInitParams(pHandle, pLcmlDsp, arr);
    807                 if(eError != OMX_ErrorNone) {
    808                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error returned from\
    809                                     NBAMRDECFill_LCMLInitParams()\n",__LINE__);
    810                     pComponentPrivate->curState = OMX_StateInvalid;
    811                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    812                                                             pHandle->pApplicationPrivate,
    813                                                             OMX_EventError,
    814                                                             eError,
    815                                                             OMX_TI_ErrorSevere,
    816                                                             NULL);
    817                     goto EXIT;
    818                 }
    819                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
    820                 pComponentPrivate->pLcmlHandle = (LCML_DSP_INTERFACE *)pLcmlHandle;
    821                 /*filling create phase params */
    822                 cb.LCML_Callback = (void *) NBAMRDECLCML_Callback;
    823                 OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling LCML_InitMMCodec...\n",__LINE__);
    824 
    825 #ifndef UNDER_CE
    826                     /* TeeDN will be default for decoder component */
    827                     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMR decoder support TeeDN\n",__LINE__);
    828 
    829                     eError = LCML_InitMMCodecEx(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    830                                           p,&pLcmlHandle,(void *)p,&cb, (OMX_STRING)pComponentPrivate->sDeviceString);
    831 #else
    832 
    833                     eError = LCML_InitMMCodec(((LCML_DSP_INTERFACE *)pLcmlHandle)->pCodecinterfacehandle,
    834                                           p,&pLcmlHandle,(void *)p,&cb);
    835 
    836 #endif
    837 
    838                 if(eError != OMX_ErrorNone) {
    839                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error returned from\
    840                         LCML_Init()\n",__LINE__);
    841                     /* send an event to client */
    842                     /* client should unload the component if the codec is not able to load */
    843                     pComponentPrivate->cbInfo.EventHandler (pHandle,
    844                                                 pHandle->pApplicationPrivate,
    845                                                 OMX_EventError,
    846                                                 eError,
    847                                                 OMX_TI_ErrorSevere,
    848                                                 NULL);
    849                     goto EXIT;
    850                 }
    851 
    852                 OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Setting to OMX_StateIdle\n",__LINE__);
    853 
    854 
    855 #ifdef RESOURCE_MANAGER_ENABLED
    856         /* need check the resource with RM */
    857                 pComponentPrivate->rmproxyCallback.RMPROXY_Callback = (void *) NBAMR_ResourceManagerCallback;
    858                 if (pComponentPrivate->curState != OMX_StateWaitForResources) {
    859                     rm_error = RMProxy_NewSendCommand(pHandle,
    860                                                     RMProxy_RequestResource,
    861                                                     OMX_NBAMR_Decoder_COMPONENT,
    862                                                     NBAMRDEC_CPU_LOAD,
    863                                                     3456,
    864                                                     &(pComponentPrivate->rmproxyCallback));
    865                     if(rm_error == OMX_ErrorNone) {
    866                         /* resource is available */
    867                         pComponentPrivate->curState = OMX_StateIdle;
    868                         pComponentPrivate->cbInfo.EventHandler(pHandle,
    869                                                         pHandle->pApplicationPrivate,
    870                                                         OMX_EventCmdComplete,
    871                                                         OMX_CommandStateSet,
    872                                                         pComponentPrivate->curState,
    873                                                         NULL);
    874                         rm_error = RMProxy_NewSendCommand(pHandle,
    875                                                         RMProxy_StateSet,
    876                                                         OMX_NBAMR_Decoder_COMPONENT,
    877                                                         OMX_StateIdle,
    878                                                         3456,
    879                                                         NULL);
    880 
    881                     }
    882                     else if(rm_error == OMX_ErrorInsufficientResources) {
    883                         /* resource is not available, need set state to OMX_StateWaitForResources */
    884                         pComponentPrivate->curState = OMX_StateWaitForResources;
    885                         pComponentPrivate->cbInfo.EventHandler(pHandle,
    886                                                                 pHandle->pApplicationPrivate,
    887                                                                 OMX_EventCmdComplete,
    888                                                                 OMX_CommandStateSet,
    889                                                                 pComponentPrivate->curState,
    890                                                                 NULL);
    891                         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: AMRDEC: Error - insufficient resources\n", __LINE__);
    892                     }
    893                 }
    894                 else {
    895                     pComponentPrivate->curState = OMX_StateIdle;
    896                     pComponentPrivate->cbInfo.EventHandler(pHandle,
    897                                                             pHandle->pApplicationPrivate,
    898                                                             OMX_EventCmdComplete,
    899                                                             OMX_CommandStateSet,
    900                                                             pComponentPrivate->curState,
    901                                                             NULL);
    902                     rm_error = RMProxy_NewSendCommand(pHandle,
    903                                                         RMProxy_StateSet,
    904                                                         OMX_NBAMR_Decoder_COMPONENT,
    905                                                         OMX_StateIdle,
    906                                                         3456,
    907                                                         NULL);
    908                 }
    909 #else
    910                 pComponentPrivate->curState = OMX_StateIdle;
    911                 pComponentPrivate->cbInfo.EventHandler(pHandle,
    912                                                         pHandle->pApplicationPrivate,
    913                                                         OMX_EventCmdComplete,
    914                                                         OMX_CommandStateSet,
    915                                                         pComponentPrivate->curState,
    916                                                         NULL);
    917 #endif
    918 #ifdef __PERF_INSTRUMENTATION__
    919                 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundarySetup);
    920 #endif
    921                 OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: AMRDEC: State has been Set to Idle\n",
    922                                                                      __LINE__);
    923                 if(pComponentPrivate->dasfmode == 1) {
    924                     OMX_U32 pValues[4];
    925                     OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ---- Comp: DASF Functionality is ON ---\n",__LINE__);
    926 
    927                     if(pComponentPrivate->streamID == 0)
    928                     {
    929                         OMX_ERROR4(pComponentPrivate->dbg, "**************************************\n");
    930                         OMX_ERROR4(pComponentPrivate->dbg, ":: Error = OMX_ErrorInsufficientResources\n");
    931                         OMX_ERROR4(pComponentPrivate->dbg, "**************************************\n");
    932                         eError = OMX_ErrorInsufficientResources;
    933                         pComponentPrivate->curState = OMX_StateInvalid;
    934                         pComponentPrivate->cbInfo.EventHandler( pHandle,
    935                                                                 pHandle->pApplicationPrivate,
    936                                                                 OMX_EventError,
    937                                                                 OMX_ErrorInvalidState,
    938                                                                 OMX_TI_ErrorMajor,
    939                                                         "AM: No Stream ID Available");
    940                         goto EXIT;
    941                     }
    942 
    943                     OMX_MALLOC_SIZE_DSPALIGN(pComponentPrivate->pParams, sizeof(AMRDEC_AudioCodecParams), AMRDEC_AudioCodecParams);
    944 
    945                     pParams = pComponentPrivate->pParams;
    946                     pParams->iAudioFormat = 1;
    947                     pParams->iSamplingRate = 8000;
    948                     pParams->iStrmId = pComponentPrivate->streamID;
    949 
    950                     pValues[0] = USN_STRMCMD_SETCODECPARAMS;
    951                     pValues[1] = (OMX_U32)pParams;
    952                     pValues[2] = sizeof(AMRDEC_AudioCodecParams);
    953                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    954                                                           EMMCodecControlStrmCtrl,(void *)pValues);
    955 
    956                     if(eError != OMX_ErrorNone) {
    957                         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error Occurred in Codec StreamControl..\n",__LINE__);
    958                         pComponentPrivate->curState = OMX_StateInvalid;
    959                         pComponentPrivate->cbInfo.EventHandler(pHandle,
    960                                                                pHandle->pApplicationPrivate,
    961                                                                OMX_EventError,
    962                                                                eError,
    963                                                                OMX_TI_ErrorSevere,
    964                                                                NULL);
    965                         goto EXIT;
    966                     }
    967                 }
    968         }
    969         else if (pComponentPrivate->curState == OMX_StateExecuting)
    970         {
    971                 OMX_U8 *pArgs = (void*)"damedesuStr";
    972 #ifdef __PERF_INSTRUMENTATION__
    973                 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundarySteadyState);
    974 #endif
    975                 /*Set the bIsStopping bit */
    976                    OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: AMRDEC: About to set bIsStopping bit\n", __LINE__);
    977 
    978                 OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: About to call LCML_ControlCodec(STOP)\n",__LINE__);
    979                 if (pComponentPrivate->codecStop_waitingsignal == 0){
    980                     pthread_mutex_lock(&pComponentPrivate->codecStop_mutex);
    981                 }
    982                 eError = LCML_ControlCodec(
    983                     ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
    984                        MMCodecControlStop,(void *)pArgs);
    985                 if (pComponentPrivate->codecStop_waitingsignal == 0){
    986                     pthread_cond_wait(&pComponentPrivate->codecStop_threshold, &pComponentPrivate->codecStop_mutex);
    987                     pComponentPrivate->codecStop_waitingsignal = 0;
    988                     pthread_mutex_unlock(&pComponentPrivate->codecStop_mutex);
    989                 }
    990                 pComponentPrivate->bStopSent=1;
    991                 if (pComponentPrivate->pHoldBuffer) {
    992                     OMX_MEMFREE_STRUCT(pComponentPrivate->pHoldBuffer);
    993                 }
    994                 pComponentPrivate->nHoldLength = 0;
    995 
    996                 if(eError != OMX_ErrorNone) {
    997                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error Occurred in Codec Stop..\n",
    998                                                                       __LINE__);
    999                     pComponentPrivate->curState = OMX_StateInvalid;
   1000                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1001                                                             pHandle->pApplicationPrivate,
   1002                                                             OMX_EventError,
   1003                                                             eError,
   1004                                                             OMX_TI_ErrorSevere,
   1005                                                             NULL);
   1006                     goto EXIT;
   1007                 }
   1008                /* pComponentPrivate->bStopSent=1;
   1009                 OMX_MEMFREE_STRUCT(pComponentPrivate->pHoldBuffer);
   1010                 pComponentPrivate->nHoldLength = 0;*/
   1011             }
   1012             else if(pComponentPrivate->curState == OMX_StatePause) {
   1013                 OMX_U8 *pArgs = (void*)"damedesuStr";
   1014                 if (pComponentPrivate->codecStop_waitingsignal == 0){
   1015                     pthread_mutex_lock(&pComponentPrivate->codecStop_mutex);
   1016                 }
   1017                 eError = LCML_ControlCodec(
   1018                                            ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1019                                            MMCodecControlStop,(void *)pArgs);
   1020                 if (pComponentPrivate->codecStop_waitingsignal == 0){
   1021                     pthread_cond_wait(&pComponentPrivate->codecStop_threshold, &pComponentPrivate->codecStop_mutex);
   1022                     pComponentPrivate->codecStop_waitingsignal = 0;
   1023                     pthread_mutex_unlock(&pComponentPrivate->codecStop_mutex);
   1024                 }
   1025 
   1026 #ifdef __PERF_INSTRUMENTATION__
   1027                 PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundarySteadyState);
   1028 #endif
   1029                 pComponentPrivate->curState = OMX_StateIdle;
   1030 #ifdef RESOURCE_MANAGER_ENABLED
   1031                 rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_NBAMR_Decoder_COMPONENT, OMX_StateIdle, 3456,NULL);
   1032 #endif
   1033 
   1034                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: The component is stopped\n",__LINE__);
   1035                 pComponentPrivate->cbInfo.EventHandler (
   1036                                  pHandle,pHandle->pApplicationPrivate,
   1037                                  OMX_EventCmdComplete,OMX_CommandStateSet,pComponentPrivate->curState,
   1038                                  NULL);
   1039             }
   1040             else {
   1041                 /* This means, it is invalid state from application */
   1042                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1043                 pComponentPrivate->cbInfo.EventHandler(
   1044                             pHandle,
   1045                             pHandle->pApplicationPrivate,
   1046                             OMX_EventError,
   1047                             OMX_ErrorIncorrectStateTransition,
   1048                             OMX_TI_ErrorMinor,
   1049                             "Invalid State");
   1050             }
   1051             break;
   1052 
   1053         case OMX_StateExecuting:
   1054             OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd Executing \n",__LINE__);
   1055             if (pComponentPrivate->curState == commandedState){
   1056                 pComponentPrivate->cbInfo.EventHandler (pHandle,
   1057                                                         pHandle->pApplicationPrivate,
   1058                                                         OMX_EventError,
   1059                                                         OMX_ErrorSameState,
   1060                                                         OMX_TI_ErrorMinor,
   1061                                                         "Invalid State");
   1062                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Same State Given by \
   1063                            Application\n",__LINE__);
   1064                     goto EXIT;
   1065             }
   1066             else if (pComponentPrivate->curState == OMX_StateIdle) {
   1067                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1068                 /* Sending commands to DSP via LCML_ControlCodec third argument
   1069                 is not used for time being */
   1070                 pComponentPrivate->nFillBufferDoneCount = 0;
   1071                 pComponentPrivate->bStopSent=0;
   1072 
   1073                 pComponentPrivate->nEmptyBufferDoneCount = 0;
   1074                 pComponentPrivate->nEmptyThisBufferCount = 0;
   1075                 pComponentPrivate->nFillBufferDoneCount =0;
   1076 
   1077                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1078                                                 EMMCodecControlStart, (void *)p);
   1079 
   1080                 if(eError != OMX_ErrorNone) {
   1081                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error Occurred in Codec Start..\n",__LINE__);
   1082                     pComponentPrivate->curState = OMX_StateInvalid;
   1083                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1084                                                             pHandle->pApplicationPrivate,
   1085                                                             OMX_EventError,
   1086                                                             eError,
   1087                                                             OMX_TI_ErrorSevere,
   1088                                                             NULL);
   1089                     goto EXIT;
   1090                 }
   1091                 /* Send input buffers to application */
   1092                 nBuf = pComponentPrivate->pInputBufferList->numBuffers;
   1093 
   1094 
   1095                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: nBuf =  %ld\n",__LINE__,nBuf);
   1096                 /* Send output buffers to codec */
   1097             }
   1098             else if (pComponentPrivate->curState == OMX_StatePause) {
   1099                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1100                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1101                                                 EMMCodecControlStart, (void *)p);
   1102                 if (eError != OMX_ErrorNone) {
   1103                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error While Resuming the codec\n",__LINE__);
   1104                     pComponentPrivate->curState = OMX_StateInvalid;
   1105                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1106                                                             pHandle->pApplicationPrivate,
   1107                                                             OMX_EventError,
   1108                                                             eError,
   1109                                                             OMX_TI_ErrorSevere,
   1110                                                             NULL);
   1111                     goto EXIT;
   1112                 }
   1113                 for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) {
   1114                     if (pComponentPrivate->pInputBufHdrPending[i]) {
   1115                         NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate,pComponentPrivate->pInputBufHdrPending[i]->pBuffer, OMX_DirInput, &pLcmlHdr);
   1116                         NBAMRDEC_SetPending(pComponentPrivate,pComponentPrivate->pInputBufHdrPending[i],OMX_DirInput);
   1117 
   1118                         eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1119                                        EMMCodecInputBuffer,
   1120                                         pComponentPrivate->pInputBufHdrPending[i]->pBuffer,
   1121                                         pComponentPrivate->pInputBufHdrPending[i]->nAllocLen,
   1122                                         pComponentPrivate->pInputBufHdrPending[i]->nFilledLen,
   1123                                        (OMX_U8 *) pLcmlHdr->pBufferParam,
   1124                                        sizeof(NBAMRDEC_ParamStruct),
   1125                                        NULL);
   1126                     }
   1127                 }
   1128                 pComponentPrivate->nNumInputBufPending = 0;
   1129 
   1130 /*                if (pComponentPrivate->nNumOutputBufPending < pComponentPrivate->pOutputBufferList->numBuffers) {
   1131                     pComponentPrivate->nNumOutputBufPending = pComponentPrivate->pOutputBufferList->numBuffers;
   1132                 }
   1133 */
   1134                 for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) {
   1135                     if (pComponentPrivate->pOutputBufHdrPending[i]) {
   1136                         NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate,pComponentPrivate->pOutputBufHdrPending[i]->pBuffer, OMX_DirOutput, &pLcmlHdr);
   1137                         NBAMRDEC_SetPending(pComponentPrivate,pComponentPrivate->pOutputBufHdrPending[i],OMX_DirOutput);
   1138 
   1139                         eError = LCML_QueueBuffer(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1140                                        EMMCodecOuputBuffer,
   1141                                         pComponentPrivate->pOutputBufHdrPending[i]->pBuffer,
   1142                                         pComponentPrivate->pOutputBufHdrPending[i]->nAllocLen,
   1143                                         pComponentPrivate->pOutputBufHdrPending[i]->nFilledLen,
   1144                                        (OMX_U8 *) pLcmlHdr->pBufferParam,
   1145                                        sizeof(NBAMRDEC_ParamStruct),
   1146                                        NULL);
   1147                     }
   1148 
   1149                 }
   1150                 pComponentPrivate->nNumOutputBufPending = 0;
   1151             }
   1152             else {
   1153                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1154                 pComponentPrivate->cbInfo.EventHandler (pHandle,
   1155                                                         pHandle->pApplicationPrivate,
   1156                                                         OMX_EventError,
   1157                                                         OMX_ErrorIncorrectStateTransition,
   1158                                                         OMX_TI_ErrorMinor,
   1159                                                         "Incorrect State Transition");
   1160                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid State Given by \
   1161                        Application\n",__LINE__);
   1162                 goto EXIT;
   1163 
   1164             }
   1165 #ifdef RESOURCE_MANAGER_ENABLED
   1166              rm_error = RMProxy_NewSendCommand(pHandle, RMProxy_StateSet, OMX_NBAMR_Decoder_COMPONENT, OMX_StateExecuting, 3456,NULL);
   1167 #endif
   1168             pComponentPrivate->curState = OMX_StateExecuting;
   1169 #ifdef __PERF_INSTRUMENTATION__
   1170             PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryStart | PERF_BoundarySteadyState);
   1171 #endif
   1172             /*Send state change notificaiton to Application */
   1173                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   1174                                                            pHandle->pApplicationPrivate,
   1175                                                            OMX_EventCmdComplete,
   1176                                                            OMX_CommandStateSet,
   1177                                                            pComponentPrivate->curState,
   1178                                                            NULL);
   1179             break;
   1180 
   1181         case OMX_StateLoaded:
   1182            OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd Loaded - curState = %d\n",__LINE__,pComponentPrivate->curState);
   1183                 if (pComponentPrivate->curState == commandedState){
   1184                     pComponentPrivate->cbInfo.EventHandler (pHandle,
   1185                                                             pHandle->pApplicationPrivate,
   1186                                                             OMX_EventError,
   1187                                                             OMX_ErrorSameState,
   1188                                                             OMX_TI_ErrorMinor,
   1189                                                             "Same State");
   1190                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Same State Given by \
   1191                            Application\n",__LINE__);
   1192                    break;
   1193                    }
   1194                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate->pInputBufferList->numBuffers = %d\n",__LINE__,pComponentPrivate->pInputBufferList->numBuffers);
   1195                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate->pOutputBufferList->numBuffers = %d\n",__LINE__,pComponentPrivate->pOutputBufferList->numBuffers);
   1196 
   1197                if (pComponentPrivate->curState == OMX_StateWaitForResources){
   1198            OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd Loaded\n",__LINE__);
   1199 #ifdef __PERF_INSTRUMENTATION__
   1200            PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryStart | PERF_BoundaryCleanup);
   1201 #endif
   1202            pComponentPrivate->curState = OMX_StateLoaded;
   1203 #ifdef __PERF_INSTRUMENTATION__
   1204            PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundaryCleanup);
   1205 #endif
   1206                 pComponentPrivate->cbInfo.EventHandler (
   1207                         pHandle, pHandle->pApplicationPrivate,
   1208                         OMX_EventCmdComplete, OMX_CommandStateSet,pComponentPrivate->curState,
   1209                         NULL);
   1210                     break;
   1211 
   1212             }
   1213             OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In side OMX_StateLoaded State: \n",__LINE__);
   1214            if (pComponentPrivate->curState != OMX_StateIdle &&
   1215            pComponentPrivate->curState != OMX_StateWaitForResources) {
   1216                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1217                 pComponentPrivate->cbInfo.EventHandler (pHandle,
   1218                                                         pHandle->pApplicationPrivate,
   1219                                                         OMX_EventError,
   1220                                                         OMX_ErrorIncorrectStateTransition,
   1221                                                         OMX_TI_ErrorMinor,
   1222                                                         "Incorrect State Transition");
   1223                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid State Given by \
   1224                        Application\n",__LINE__);
   1225                 goto EXIT;
   1226            }
   1227 #ifdef __PERF_INSTRUMENTATION__
   1228             PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryStart | PERF_BoundaryCleanup);
   1229 #endif
   1230             while (1) {
   1231 
   1232 
   1233                 if (!pComponentPrivate->pInputBufferList->numBuffers &&
   1234                     !pComponentPrivate->pOutputBufferList->numBuffers) {
   1235 
   1236                         break;
   1237                     }
   1238                     pComponentPrivate->InIdle_goingtoloaded = 1;
   1239 #ifndef UNDER_CE
   1240                     pthread_mutex_lock(&pComponentPrivate->InIdle_mutex);
   1241                     pthread_cond_wait(&pComponentPrivate->InIdle_threshold, &pComponentPrivate->InIdle_mutex);
   1242                     pthread_mutex_unlock(&pComponentPrivate->InIdle_mutex);
   1243 #else
   1244                     OMX_WaitForEvent(&(pComponentPrivate->InIdle_event));
   1245 #endif
   1246                     break;
   1247             }
   1248 
   1249            /* Now Deinitialize the component No error should be returned from
   1250             * this function. It should clean the system as much as possible */
   1251             OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In side OMX_StateLoaded State: \n",__LINE__);
   1252             NBAMRDEC_CleanupInitParams(pComponentPrivate->pHandle);
   1253 
   1254             eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1255                                         EMMCodecControlDestroy, (void *)p);
   1256 
   1257     /*Closing LCML Lib*/
   1258     if (pComponentPrivate->ptrLibLCML != NULL)
   1259     {
   1260         OMX_PRDSP1(pComponentPrivate->dbg, "%d OMX_AmrDecoder.c Closing LCML library\n",__LINE__);
   1261         dlclose( pComponentPrivate->ptrLibLCML  );
   1262         pComponentPrivate->ptrLibLCML = NULL;
   1263     }
   1264 
   1265 #ifdef __PERF_INSTRUMENTATION__
   1266             PERF_SendingCommand(pComponentPrivate->pPERF, -1, 0, PERF_ModuleComponent);
   1267 #endif
   1268             OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: In side OMX_StateLoaded State: \n",__LINE__);
   1269             if (eError != OMX_ErrorNone) {
   1270                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: in Destroying the codec: no.  %x\n",__LINE__, eError);
   1271                 goto EXIT;
   1272             }
   1273            OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd Loaded\n",__LINE__);
   1274            eError = EXIT_COMPONENT_THRD;
   1275            pComponentPrivate->bInitParamsInitialized = 0;
   1276            pComponentPrivate->bLoadedCommandPending = OMX_FALSE;
   1277            /* Send StateChangeNotification to application */
   1278            break;
   1279 
   1280         case OMX_StatePause:
   1281            OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd Pause\n",__LINE__);
   1282                 if (pComponentPrivate->curState == commandedState){
   1283                     pComponentPrivate->cbInfo.EventHandler (pHandle,
   1284                                                             pHandle->pApplicationPrivate,
   1285                                                             OMX_EventError,
   1286                                                             OMX_ErrorSameState,
   1287                                                             OMX_TI_ErrorMinor,
   1288                                                             "Same State");
   1289                    break;
   1290                    }
   1291            if (pComponentPrivate->curState != OMX_StateExecuting &&
   1292            pComponentPrivate->curState != OMX_StateIdle) {
   1293                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1294                 pComponentPrivate->cbInfo.EventHandler (pHandle,
   1295                                                         pHandle->pApplicationPrivate,
   1296                                                         OMX_EventError,
   1297                                                         OMX_ErrorIncorrectStateTransition,
   1298                                                         OMX_TI_ErrorMinor,
   1299                                                         "Incorrect State Transition");
   1300                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid State Given by \
   1301                        Application\n",__LINE__);
   1302                 goto EXIT;
   1303            }
   1304 #ifdef __PERF_INSTRUMENTATION__
   1305            PERF_Boundary(pComponentPrivate->pPERFcomp,PERF_BoundaryComplete | PERF_BoundarySteadyState);
   1306 #endif
   1307            eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1308                                         EMMCodecControlPause, (void *)p);
   1309 
   1310            if (eError != OMX_ErrorNone) {
   1311                OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: in Pausing the codec\n",__LINE__);
   1312                 pComponentPrivate->curState = OMX_StateInvalid;
   1313                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1314                                                         pHandle->pApplicationPrivate,
   1315                                                         OMX_EventError,
   1316                                                         eError,
   1317                                                         OMX_TI_ErrorSevere,
   1318                                                         NULL);
   1319                goto EXIT;
   1320            }
   1321 #ifdef RESOURCE_MANAGER_ENABLED
   1322 /* notify RM of pause so resources can be redistributed if needed */
   1323            rm_error = RMProxy_NewSendCommand(pHandle,
   1324                                              RMProxy_StateSet,
   1325                                              OMX_NBAMR_Decoder_COMPONENT,
   1326                                              OMX_StatePause,
   1327                                              3456,
   1328                                              NULL);
   1329 #endif
   1330                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1331            break;
   1332 
   1333          case OMX_StateWaitForResources:
   1334 
   1335                 if (pComponentPrivate->curState == commandedState){
   1336                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1337                     pComponentPrivate->cbInfo.EventHandler (pHandle,
   1338                                                             pHandle->pApplicationPrivate,
   1339                                                             OMX_EventError,
   1340                                                             OMX_ErrorSameState,
   1341                                                             OMX_TI_ErrorMinor,
   1342                                                         "Same State");
   1343                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Same State Given by \
   1344                            Application\n",__LINE__);
   1345                    }
   1346           else if (pComponentPrivate->curState == OMX_StateLoaded) {
   1347 #ifdef RESOURCE_MANAGER_ENABLED
   1348             rm_error = RMProxy_NewSendCommand(pHandle,
   1349                                             RMProxy_StateSet,
   1350                                             OMX_NBAMR_Decoder_COMPONENT,
   1351                                             OMX_StateWaitForResources,
   1352                                             3456,
   1353                                             NULL);
   1354 #endif
   1355                 pComponentPrivate->curState = OMX_StateWaitForResources;
   1356                 pComponentPrivate->cbInfo.EventHandler(
   1357                      pHandle, pHandle->pApplicationPrivate,
   1358                      OMX_EventCmdComplete, OMX_CommandStateSet,pComponentPrivate->curState,NULL);
   1359                 }
   1360                 else{
   1361                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1362                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1363                                                         pHandle->pApplicationPrivate,
   1364                                                         OMX_EventError,
   1365                                                         OMX_ErrorIncorrectStateTransition,
   1366                                                         OMX_TI_ErrorMinor,
   1367                                                         "Incorrect State Transition");
   1368                  }
   1369                 break;
   1370 
   1371 
   1372         case OMX_StateInvalid:
   1373            OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd OMX_StateInvalid:\n",__LINE__);
   1374                 if (pComponentPrivate->curState == commandedState){
   1375                     pComponentPrivate->cbInfo.EventHandler (pHandle,
   1376                                                             pHandle->pApplicationPrivate,
   1377                                                             OMX_EventError,
   1378                                                             OMX_ErrorSameState,
   1379                                                             OMX_TI_ErrorSevere,
   1380                                                             "Same State");
   1381                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Same State Given by \
   1382                            Application\n",__LINE__);
   1383                    }
   1384                 else{
   1385                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Comp: OMX_AmrDecUtils.c\n",__LINE__);
   1386                 if (pComponentPrivate->curState != OMX_StateWaitForResources &&
   1387                     pComponentPrivate->curState != OMX_StateLoaded) {
   1388 
   1389                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1390                                                         EMMCodecControlDestroy, (void *)p);
   1391 
   1392                 NBAMRDEC_CleanupInitParams(pHandle);
   1393                 }
   1394                 pComponentPrivate->curState = OMX_StateInvalid;
   1395 
   1396                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1397                                                         pHandle->pApplicationPrivate,
   1398                                                         OMX_EventError,
   1399                                                         OMX_ErrorInvalidState,
   1400                                                         OMX_TI_ErrorSevere,
   1401                                                         "Incorrect State Transition");
   1402             }
   1403 
   1404            break;
   1405 
   1406         case OMX_StateMax:
   1407            OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleCommand: Cmd OMX_StateMax::\n",__LINE__);
   1408            break;
   1409         default:
   1410             break;
   1411     } /* End of Switch */
   1412     }
   1413     else if (command == OMX_CommandMarkBuffer) {
   1414             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: command OMX_CommandMarkBuffer received\n",__LINE__);
   1415             if(!pComponentPrivate->pMarkBuf){
   1416             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: command OMX_CommandMarkBuffer received\n",__LINE__);
   1417             /* TODO Need to handle multiple marks */
   1418             pComponentPrivate->pMarkBuf = (OMX_MARKTYPE *)(commandData);
   1419         }
   1420     }
   1421     else if (command == OMX_CommandPortDisable) {
   1422         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   1423 
   1424         if (!pComponentPrivate->bDisableCommandPending) {
   1425         if(commandData == 0x0 || commandData == -1){   /*Input*/
   1426             /* disable port */
   1427             pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled = OMX_FALSE;
   1428             for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   1429                 if (NBAMRDEC_IsPending(pComponentPrivate,pComponentPrivate->pInputBufferList->pBufHdr[i],OMX_DirInput)) {
   1430                     /* Real solution is flush buffers from DSP.  Until we have the ability to do that
   1431                        we just call EmptyBufferDone() on any pending buffers */
   1432 #ifdef __PERF_INSTRUMENTATION__
   1433                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1434                                       PREF(pComponentPrivate->pInputBufferList->pBufHdr[i], pBuffer),
   1435                                       0,
   1436                                       PERF_ModuleHLMM);
   1437 #endif
   1438                      NBAMRDEC_ClearPending(pComponentPrivate,pComponentPrivate->pInputBufferList->pBufHdr[i],OMX_DirInput);
   1439                     pComponentPrivate->nEmptyBufferDoneCount++;
   1440                     pComponentPrivate->cbInfo.EmptyBufferDone (
   1441                                        pComponentPrivate->pHandle,
   1442                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1443                                        pComponentPrivate->pInputBufferList->pBufHdr[i]
   1444                                        );
   1445                     SignalIfAllBuffersAreReturned(pComponentPrivate);
   1446                 }
   1447             }
   1448         }
   1449         if(commandData == 0x1 || commandData == -1){      /*Output*/
   1450             char *pArgs = "damedesuStr";
   1451             pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled = OMX_FALSE;
   1452             if (pComponentPrivate->curState == OMX_StateExecuting) {
   1453                 pComponentPrivate->bNoIdleOnStop = OMX_TRUE;
   1454                 OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling LCML_ControlCodec()\n",__LINE__);
   1455                 if (pComponentPrivate->codecStop_waitingsignal == 0){
   1456                     pthread_mutex_lock(&pComponentPrivate->codecStop_mutex);
   1457                 }
   1458                 eError = LCML_ControlCodec(
   1459                                   ((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1460                                   MMCodecControlStop,(void *)pArgs);
   1461                 if (pComponentPrivate->codecStop_waitingsignal == 0){
   1462                     pthread_cond_wait(&pComponentPrivate->codecStop_threshold, &pComponentPrivate->codecStop_mutex);
   1463                     pComponentPrivate->codecStop_waitingsignal = 0;
   1464                     pthread_mutex_unlock(&pComponentPrivate->codecStop_mutex);
   1465                 }
   1466 
   1467             }
   1468         }
   1469     }
   1470 
   1471     if(commandData == 0x0) {
   1472         if(!pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated){
   1473             /* return cmdcomplete event if input unpopulated */
   1474             pComponentPrivate->cbInfo.EventHandler(
   1475                 pHandle, pHandle->pApplicationPrivate,
   1476                 OMX_EventCmdComplete, OMX_CommandPortDisable,NBAMRDEC_INPUT_PORT, NULL);
   1477                 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Clearing bDisableCommandPending\n",__LINE__);
   1478                 pComponentPrivate->bDisableCommandPending = 0;
   1479         }
   1480         else{
   1481                     pComponentPrivate->bDisableCommandPending = 1;
   1482                     pComponentPrivate->bDisableCommandParam = commandData;
   1483         }
   1484     }
   1485 
   1486     if(commandData == 0x1) {
   1487                 if (!pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated){
   1488                 /* return cmdcomplete event if output unpopulated */
   1489                 pComponentPrivate->cbInfo.EventHandler(
   1490                      pHandle, pHandle->pApplicationPrivate,
   1491                      OMX_EventCmdComplete, OMX_CommandPortDisable,NBAMRDEC_OUTPUT_PORT, NULL);
   1492                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Clearing bDisableCommandPending\n",__LINE__);
   1493                 pComponentPrivate->bDisableCommandPending = 0;
   1494                 }
   1495                 else {
   1496                     pComponentPrivate->bDisableCommandPending = 1;
   1497                     pComponentPrivate->bDisableCommandParam = commandData;
   1498                 }
   1499             }
   1500 
   1501      if(commandData == -1) {
   1502                 if (!pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated &&
   1503                 !pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated){
   1504 
   1505                 /* return cmdcomplete event if inout & output unpopulated */
   1506                 pComponentPrivate->cbInfo.EventHandler(
   1507                      pHandle, pHandle->pApplicationPrivate,
   1508                      OMX_EventCmdComplete, OMX_CommandPortDisable,NBAMRDEC_INPUT_PORT, NULL);
   1509 
   1510                 pComponentPrivate->cbInfo.EventHandler(
   1511                      pHandle, pHandle->pApplicationPrivate,
   1512                      OMX_EventCmdComplete, OMX_CommandPortDisable,NBAMRDEC_OUTPUT_PORT, NULL);
   1513                 OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Clearing bDisableCommandPending\n",__LINE__);
   1514                 pComponentPrivate->bDisableCommandPending = 0;
   1515                 }
   1516                 else {
   1517                     pComponentPrivate->bDisableCommandPending = 1;
   1518                     pComponentPrivate->bDisableCommandParam = commandData;
   1519                 }
   1520         }
   1521     }
   1522     else if (command == OMX_CommandPortEnable) {
   1523         if(!pComponentPrivate->bEnableCommandPending) {
   1524             if(commandData == 0x0 || commandData == -1){
   1525                 /* enable in port */
   1526                 OMX_PRCOMM1(pComponentPrivate->dbg, "setting input port to enabled\n");
   1527                 pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled = OMX_TRUE;
   1528                 OMX_PRCOMM2(pComponentPrivate->dbg, "pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled = %d\n",
   1529                               pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled);
   1530 
   1531                 if(pComponentPrivate->AlloBuf_waitingsignal){
   1532                     pComponentPrivate->AlloBuf_waitingsignal = 0;
   1533                 }
   1534             }
   1535             if(commandData == 0x1 || commandData == -1){
   1536                 char *pArgs = "damedesuStr";
   1537                 /* enable out port */
   1538                 if(pComponentPrivate->AlloBuf_waitingsignal){
   1539                     pComponentPrivate->AlloBuf_waitingsignal = 0;
   1540 #ifndef UNDER_CE
   1541                     pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1542                     pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1543                     pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1544 #else
   1545                     OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1546 #endif
   1547                 }
   1548                 if(pComponentPrivate->curState == OMX_StateExecuting) {
   1549                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1550                                                EMMCodecControlStart,(void *)pArgs);
   1551                 }
   1552                 OMX_PRCOMM1(pComponentPrivate->dbg, "setting output port to enabled\n");
   1553                 pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled = OMX_TRUE;
   1554                 OMX_PRCOMM2(pComponentPrivate->dbg, "pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled = %d\n",
   1555                               pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bEnabled);
   1556             }
   1557         }
   1558 
   1559         if(commandData == 0x0){
   1560             if (pComponentPrivate->curState == OMX_StateLoaded ||
   1561                 pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated) {
   1562                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1563                                                        pHandle->pApplicationPrivate,
   1564                                                        OMX_EventCmdComplete,
   1565                                                        OMX_CommandPortEnable,
   1566                                                        NBAMRDEC_INPUT_PORT,
   1567                                                        NULL);
   1568                 pComponentPrivate->bEnableCommandPending = 0;
   1569             }
   1570             else {
   1571                 pComponentPrivate->bEnableCommandPending = 1;
   1572                 pComponentPrivate->bEnableCommandParam = commandData;
   1573             }
   1574         }
   1575         else if(commandData == 0x1) {
   1576             if (pComponentPrivate->curState == OMX_StateLoaded ||
   1577                 pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated){
   1578                 pComponentPrivate->cbInfo.EventHandler( pHandle,
   1579                                                         pHandle->pApplicationPrivate,
   1580                                                         OMX_EventCmdComplete,
   1581                                                         OMX_CommandPortEnable,
   1582                                                         NBAMRDEC_OUTPUT_PORT,
   1583                                                         NULL);
   1584                 pComponentPrivate->bEnableCommandPending = 0;
   1585             }
   1586             else {
   1587                 pComponentPrivate->bEnableCommandPending = 1;
   1588                 pComponentPrivate->bEnableCommandParam = commandData;
   1589             }
   1590         }
   1591         else if(commandData == -1) {
   1592             if (pComponentPrivate->curState == OMX_StateLoaded ||
   1593                 (pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bPopulated
   1594                 && pComponentPrivate->pPortDef[NBAMRDEC_OUTPUT_PORT]->bPopulated)){
   1595                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1596                                                        pHandle->pApplicationPrivate,
   1597                                                        OMX_EventCmdComplete,
   1598                                                        OMX_CommandPortEnable,
   1599                                                        NBAMRDEC_INPUT_PORT,
   1600                                                        NULL);
   1601                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   1602                                                        pHandle->pApplicationPrivate,
   1603                                                        OMX_EventCmdComplete,
   1604                                                        OMX_CommandPortEnable,
   1605                                                        NBAMRDEC_OUTPUT_PORT,
   1606                                                        NULL);
   1607                 pComponentPrivate->bEnableCommandPending = 0;
   1608                 NBAMRDECFill_LCMLInitParamsEx(pComponentPrivate->pHandle);
   1609             }
   1610             else {
   1611                 pComponentPrivate->bEnableCommandPending = 1;
   1612                 pComponentPrivate->bEnableCommandParam = commandData;
   1613             }
   1614         }
   1615 #ifndef UNDER_CE
   1616         pthread_mutex_lock(&pComponentPrivate->AlloBuf_mutex);
   1617         pthread_cond_signal(&pComponentPrivate->AlloBuf_threshold);
   1618         pthread_mutex_unlock(&pComponentPrivate->AlloBuf_mutex);
   1619 #else
   1620         OMX_SignalEvent(&(pComponentPrivate->AlloBuf_event));
   1621 #endif
   1622 
   1623 
   1624     }
   1625     else if (command == OMX_CommandFlush) {
   1626        OMX_U32 aParam[3] = {0};
   1627         OMX_PRCOMM1(pComponentPrivate->dbg, "Flushing input port %d\n",pComponentPrivate->nUnhandledEmptyThisBuffers);
   1628         if(commandData == 0x0 || commandData == -1) {
   1629             if(pComponentPrivate->nUnhandledEmptyThisBuffers == 0) {
   1630                 pComponentPrivate->bFlushInputPortCommandPending = OMX_FALSE;
   1631                 pComponentPrivate->first_buff = 0;
   1632 
   1633                 aParam[0] = USN_STRMCMD_FLUSH;
   1634                 aParam[1] = 0x0;
   1635                 aParam[2] = 0x0;
   1636 
   1637                 OMX_PRCOMM2(pComponentPrivate->dbg, "Sending USN_STRMCMD_FLUSH Command for IN port\n");
   1638                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1639                                            EMMCodecControlStrmCtrl,
   1640                                            (void*)aParam);
   1641                 if (eError != OMX_ErrorNone) {
   1642                     goto EXIT;
   1643                 }
   1644             } else{
   1645                 pComponentPrivate->bFlushInputPortCommandPending = OMX_TRUE;
   1646             }
   1647         }
   1648         if(commandData == 0x1 || commandData == -1){
   1649             OMX_PRCOMM1(pComponentPrivate->dbg, "Flushing out port %d\n",pComponentPrivate->nUnhandledFillThisBuffers);
   1650             if (pComponentPrivate->nUnhandledFillThisBuffers == 0)  {
   1651                 pComponentPrivate->bFlushOutputPortCommandPending = OMX_FALSE;
   1652                 if (pComponentPrivate->first_output_buf_rcv != 0) {
   1653                     pComponentPrivate->first_buff = 0;
   1654                     pComponentPrivate->first_output_buf_rcv = 0;
   1655                 }
   1656 
   1657                 aParam[0] = USN_STRMCMD_FLUSH;
   1658                 aParam[1] = 0x1;
   1659                 aParam[2] = 0x0;
   1660 
   1661                 OMX_PRCOMM1(pComponentPrivate->dbg, "Sending USN_STRMCMD_FLUSH Command for OUT port\n");
   1662                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   1663                                            EMMCodecControlStrmCtrl,
   1664                                            (void*)aParam);
   1665                 if (eError != OMX_ErrorNone) {
   1666                     goto EXIT;
   1667                 }
   1668             }else{
   1669                 pComponentPrivate->bFlushOutputPortCommandPending = OMX_TRUE;
   1670             }
   1671         }
   1672     }
   1673 EXIT:
   1674     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting NBAMRDECHandleCommand Function\n",__LINE__);
   1675     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Returning %d\n",__LINE__,eError);
   1676     if (eError != OMX_ErrorNone && eError != EXIT_COMPONENT_THRD) {
   1677         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   1678                                                pComponentPrivate->pHandle->pApplicationPrivate,
   1679                                                OMX_EventError,
   1680                                                eError,
   1681                                                OMX_TI_ErrorSevere,
   1682                                                NULL);
   1683     }
   1684     return eError;
   1685 }
   1686 
   1687 
   1688 /* ========================================================================== */
   1689 /**
   1690 * @NBAMRDECHandleDataBuf_FromApp() This function is called by the component when ever it
   1691 * receives the buffer from the application
   1692 *
   1693 * @param pComponentPrivate  Component private data
   1694 * @param pBufHeader Buffer from the application
   1695 *
   1696 * @pre
   1697 *
   1698 * @post
   1699 *
   1700 * @return none
   1701 */
   1702 /* ========================================================================== */
   1703 OMX_ERRORTYPE NBAMRDECHandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE* pBufHeader,
   1704                                     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   1705 {
   1706     OMX_ERRORTYPE eError = OMX_ErrorNone;
   1707     OMX_DIRTYPE eDir;
   1708     LCML_NBAMRDEC_BUFHEADERTYPE *pLcmlHdr;
   1709     LCML_DSP_INTERFACE *pLcmlHandle = (LCML_DSP_INTERFACE *)
   1710                                               pComponentPrivate->pLcmlHandle;
   1711     OMX_U32 index;
   1712     OMX_U32 frameType;
   1713     OMX_U32 frameLength;
   1714     OMX_U8* pExtraData;
   1715     OMX_U16 i;
   1716     OMX_PARAM_PORTDEFINITIONTYPE* pPortDefIn = NULL;
   1717 
   1718     OMX_U32 holdBufferSize;
   1719     OMX_U8 nFrames =0;
   1720     LCML_DSP_INTERFACE * phandle;
   1721     OMX_U8 bufSize=0;
   1722     AMRDEC_AudioCodecParams *pParams;
   1723    OMX_STRING p = "";
   1724 
   1725     OMX_U32 nFilledLenLocal;
   1726     OMX_U8 TOCentry, hh=0, *TOCframetype=0;
   1727     OMX_U16 offset = 0;
   1728 
   1729     DSP_STATUS status;
   1730     OMX_BOOL isFrameParamChanged=OMX_FALSE;
   1731 
   1732     if (OMX_AUDIO_AMRDTXasEFR == pComponentPrivate->iAmrMode){
   1733         bufSize = INPUT_BUFF_SIZE_EFR;
   1734     }
   1735     else{
   1736         bufSize = STD_NBAMRDEC_BUF_SIZE;
   1737     }
   1738 
   1739     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Entering NBAMRDECHandleDataBuf_FromApp Function\n",__LINE__);
   1740 
   1741     holdBufferSize = bufSize * (pComponentPrivate->pInputBufferList->numBuffers + 1);
   1742     /*Find the direction of the received buffer from buffer list */
   1743     eError = NBAMRDECGetBufferDirection(pBufHeader, &eDir);
   1744     if (eError != OMX_ErrorNone) {
   1745         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: The PBufHeader is not found in the list\n",
   1746                                                                      __LINE__);
   1747         goto EXIT;
   1748     }
   1749     if (pBufHeader->pBuffer == NULL) {
   1750         eError = OMX_ErrorBadParameter;
   1751 	goto EXIT;
   1752     }
   1753 
   1754     if (eDir == OMX_DirInput) {
   1755         pComponentPrivate->nUnhandledEmptyThisBuffers--;
   1756         if (pComponentPrivate->curState == OMX_StateIdle){
   1757             pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1758                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1759                                                        pBufHeader);
   1760             pComponentPrivate->nEmptyBufferDoneCount++;
   1761             SignalIfAllBuffersAreReturned(pComponentPrivate);
   1762             OMX_PRBUFFER2(pComponentPrivate->dbg, ":: %d %s In idle state return input buffers\n", __LINE__, __FUNCTION__);
   1763             goto EXIT;
   1764         }
   1765         pPortDefIn = pComponentPrivate->pPortDef[OMX_DirInput];
   1766         if ( pBufHeader->nFilledLen > 0) {
   1767             pComponentPrivate->bBypassDSP = 0;
   1768             if ( pComponentPrivate->nHoldLength == 0 )
   1769             {
   1770                 if (pComponentPrivate->mimemode == NBAMRDEC_MIMEMODE)
   1771                 {
   1772                     OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleDa\
   1773 taBuf_FromApp - reading NBAMRDEC_MIMEMODE\n",__LINE__);
   1774                     frameLength=INPUT_NBAMRDEC_BUFFER_SIZE_MIME;
   1775                     if(pComponentPrivate->using_rtsp==1){ /* formating data */
   1776                         nFilledLenLocal=pBufHeader->nFilledLen;
   1777                         while(TRUE)
   1778                         {
   1779                             TOCframetype = (OMX_U8*)realloc(TOCframetype, ((hh + 1) * sizeof(OMX_U8)));
   1780                             if (TOCframetype == NULL)
   1781                             {
   1782                               OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Couldn't realloc memory!",__LINE__);
   1783                               goto EXIT;
   1784                             }
   1785                             TOCentry = pBufHeader->pBuffer[0];
   1786                             TOCframetype[hh]= TOCentry & 0x7C;
   1787                             hh++;
   1788                             if (!(TOCentry & 0x80))
   1789                                 break;
   1790                             memmove(pBufHeader->pBuffer,
   1791                                     pBufHeader->pBuffer + 1,
   1792                                     nFilledLenLocal);
   1793                         }
   1794                         while(nFilledLenLocal> 0 ){
   1795                             index = (TOCframetype[nFrames] >> 3) & 0x0F;
   1796                             /* adding TOC to each frame */
   1797                             if (offset > pBufHeader->nAllocLen){
   1798                                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   1799                               goto EXIT;
   1800                             }
   1801                             else
   1802                                 memcpy(pBufHeader->pBuffer + offset,
   1803                                                 &TOCframetype[nFrames],
   1804                                                 sizeof(OMX_U8));
   1805                             offset+=pComponentPrivate->amrMimeBytes[index];
   1806                             if ( offset + 1 + nFilledLenLocal > pBufHeader->nAllocLen){
   1807                                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   1808                               goto EXIT;
   1809                             }
   1810                             else
   1811                             memmove(pBufHeader->pBuffer + offset + 1,
   1812                                                 pBufHeader->pBuffer + offset,
   1813                                                 nFilledLenLocal);
   1814                             if (pComponentPrivate->amrMimeBytes[index] > nFilledLenLocal){
   1815                                         nFilledLenLocal = 0;
   1816                             }else{
   1817                                         nFilledLenLocal -= pComponentPrivate->amrMimeBytes[index];
   1818                             }
   1819                             nFrames++;
   1820                         }
   1821                         free(TOCframetype);
   1822 			 TOCframetype = NULL;
   1823                     }
   1824                     frameType = 0;
   1825                     nFrames = 0;
   1826                     i=0;
   1827                     while(pBufHeader->nFilledLen > 0 )
   1828                     {   /*Reorder the Mime buffer in case that has*/
   1829                         frameType = pBufHeader->pBuffer[i]; /*more than 1 frame                 */
   1830                         index = (frameType >> 3) & 0x0F;
   1831                         if(nFrames)
   1832                         {
   1833                             if (((nFrames*INPUT_NBAMRDEC_BUFFER_SIZE_MIME) + pBufHeader->nFilledLen)
   1834 			       > pBufHeader->nAllocLen) {
   1835                                OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   1836                                goto EXIT;
   1837                            }
   1838                             memmove(pBufHeader->pBuffer + (nFrames*INPUT_NBAMRDEC_BUFFER_SIZE_MIME),
   1839                                     pBufHeader->pBuffer + i,
   1840                                     pBufHeader->nFilledLen);
   1841                         }
   1842 			if ((index >= NUM_MIME_BYTES_ARRAY) ||
   1843 			   ((index < NUM_MIME_BYTES_ARRAY) &&
   1844 			   (pComponentPrivate->amrMimeBytes[index] == 0))) {
   1845                            OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: no more frames index=%d", __LINE__, (int)index);
   1846                            if (index < NUM_MIME_BYTES_ARRAY)
   1847                                OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: no more frames mimebytes=%d", __LINE__, (int)pComponentPrivate->amrMimeBytes[index]);
   1848                                break;
   1849                         }
   1850                         if (pComponentPrivate->amrMimeBytes[index] > pBufHeader->nFilledLen){
   1851                             pBufHeader->nFilledLen = 0;
   1852                         }else{
   1853                             pBufHeader->nFilledLen -= pComponentPrivate->amrMimeBytes[index];
   1854                         }
   1855                         i = (nFrames*INPUT_NBAMRDEC_BUFFER_SIZE_MIME) + (OMX_U16)pComponentPrivate->amrMimeBytes[index];
   1856                         nFrames++;
   1857                     }
   1858                     pBufHeader->nFilledLen=nFrames*INPUT_NBAMRDEC_BUFFER_SIZE_MIME;
   1859                 }
   1860                 else if (pComponentPrivate->mimemode == NBAMRDEC_PADMIMEMODE)
   1861                                 {
   1862                                     OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleDa\
   1863                                             taBuf_FromApp - reading NBAMRDEC_PADMIMEMODE\
   1864                                             nFilledLen %ld nAllocLen %ld\n",__LINE__, pBufHeader->nFilledLen, pBufHeader->nAllocLen);
   1865                                     frameLength=INPUT_NBAMRDEC_BUFFER_SIZE_MIME;
   1866                                     nFrames=pBufHeader->nAllocLen / frameLength; /*to get the corresponding header in the LCML */
   1867                                 }
   1868                 else if (pComponentPrivate->mimemode == NBAMRDEC_IF2)
   1869                 {
   1870                     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleDataBuf_FromApp - reading NBAMRDEC_IF2MODE\n", __LINE__);
   1871                     frameLength=INPUT_NBAMRDEC_BUFFER_SIZE_IF2;
   1872                     nFrames = 0;
   1873                     i = 0;
   1874                     while (pBufHeader->nFilledLen > 0)
   1875                     {
   1876                         /*Reorder the IF2 buffer in case that has more than 1 frame */
   1877                         frameType = pBufHeader->pBuffer[i];
   1878                         index = frameType&0x0F;
   1879                         if (nFrames)
   1880                         {
   1881                             if (((nFrames*INPUT_NBAMRDEC_BUFFER_SIZE_IF2) + pBufHeader->nFilledLen)
   1882 			       > pBufHeader->nAllocLen) {
   1883                                OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   1884                                goto EXIT;
   1885                             }
   1886                             memmove(pBufHeader->pBuffer + (nFrames *INPUT_NBAMRDEC_BUFFER_SIZE_IF2),
   1887                                     pBufHeader->pBuffer + i,
   1888                                     pBufHeader->nFilledLen);
   1889                         }
   1890                         if ((index >= NUM_IF2_BYTES_ARRAY) ||
   1891 			   ((index < NUM_IF2_BYTES_ARRAY) &&
   1892 			   (pComponentPrivate->amrIF2Bytes[index] == 0))) {
   1893                            OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: no more frames index=%d", __LINE__, (int)index);
   1894                            if (index < NUM_IF2_BYTES_ARRAY)
   1895                                OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: no more frames mimebytes=%d", __LINE__, (int)pComponentPrivate->amrIF2Bytes[index]);
   1896                                break;
   1897                         }
   1898                         if(pComponentPrivate->amrIF2Bytes[index] > pBufHeader->nFilledLen){
   1899                             pBufHeader->nFilledLen=0;
   1900                         }else{
   1901                             pBufHeader->nFilledLen -= pComponentPrivate->amrIF2Bytes[index];
   1902                         }
   1903                         i = (nFrames *INPUT_NBAMRDEC_BUFFER_SIZE_IF2) + (OMX_U16)pComponentPrivate->amrIF2Bytes[index];
   1904                         nFrames++;
   1905                     }
   1906                     pBufHeader->nFilledLen = nFrames * INPUT_NBAMRDEC_BUFFER_SIZE_IF2;
   1907                 }
   1908 
   1909                 else
   1910                 {
   1911                     OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECHandleDataBuf_FromApp - reading NBAMRDEC_NONMIMEMODE\n",__LINE__);
   1912                     frameLength = STD_NBAMRDEC_BUF_SIZE;  /*/ non Mime mode*/
   1913                     nFrames = (OMX_U8)(pBufHeader->nFilledLen / frameLength);
   1914                 }
   1915 
   1916                 if (nFrames >= 1 && (NBAMRDEC_FORMATCONFORMANCE == pComponentPrivate->mimemode))
   1917                 {
   1918                     /* At least there is 1 frame in the buffer */
   1919                     pComponentPrivate->nHoldLength = pBufHeader->nFilledLen - frameLength*nFrames;
   1920                     if ( pComponentPrivate->nHoldLength > 0 ) {/* something need to be hold in iHoldBuffer */
   1921                         if (pComponentPrivate->pHoldBuffer == NULL) {
   1922                             OMX_MALLOC_SIZE(pComponentPrivate->pHoldBuffer, (bufSize * (pComponentPrivate->pInputBufferList->numBuffers + 3)),void);
   1923                         }
   1924                         /* Copy the extra data into pHoldBuffer. Size will be nHoldLength. */
   1925                         pExtraData = pBufHeader->pBuffer + bufSize*nFrames;
   1926 			if (pComponentPrivate->nHoldLength >
   1927 			   (bufSize * (pComponentPrivate->pInputBufferList->numBuffers + 3)))
   1928 			   {
   1929                                OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   1930                                goto EXIT;
   1931 			   }
   1932                         memcpy (pComponentPrivate->pHoldBuffer, pExtraData, pComponentPrivate->nHoldLength);
   1933                     }
   1934                 }
   1935                 else {
   1936                     if (pComponentPrivate->mimemode == NBAMRDEC_FORMATCONFORMANCE)
   1937                     {
   1938                         /* received buffer with less than 1 AMR frame. Save the data in iHoldBuffer.*/
   1939                         pComponentPrivate->nHoldLength = pBufHeader->nFilledLen;
   1940                         /* save the data into iHoldBuffer.*/
   1941                         if (pComponentPrivate->pHoldBuffer == NULL) {
   1942                             OMX_MALLOC_SIZE(pComponentPrivate->pHoldBuffer, (bufSize * (pComponentPrivate->pInputBufferList->numBuffers + 3)),void);
   1943                         }
   1944                         /* Not enough data to be sent. Copy all received data into iHoldBuffer.*/
   1945                         /* Size to be copied will be iHoldLen == mmData->BufferSize() */
   1946                         memset (pComponentPrivate->pHoldBuffer,0,bufSize * (pComponentPrivate->pInputBufferList->numBuffers + 1));
   1947                         memcpy (pComponentPrivate->pHoldBuffer, pBufHeader->pBuffer, pComponentPrivate->nHoldLength);
   1948 
   1949                         /* since not enough data, we shouldn't send anything to SN, but instead request to EmptyBufferDone again.*/
   1950                         OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling EmptyBufferDone\n",__LINE__);
   1951                         if (pComponentPrivate->curState != OMX_StatePause) {
   1952                             pComponentPrivate->nEmptyBufferDoneCount++;
   1953 #ifdef __PERF_INSTRUMENTATION__
   1954                             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   1955                                               PREF(pBufHeader,pBuffer),
   1956                                               0,
   1957                                               PERF_ModuleHLMM);
   1958 #endif
   1959                             pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   1960                                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   1961                                                                        pBufHeader);
   1962                             SignalIfAllBuffersAreReturned(pComponentPrivate);
   1963                         }
   1964                         else {
   1965                             pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader;
   1966                         }
   1967                         goto EXIT;
   1968                     }
   1969                 }
   1970             }
   1971             else {
   1972                 /* iHoldBuffer has data. There is no possibility that data in iHoldBuffer is less for 1 frame without*/
   1973                 /* lastBufferFlag being set. Unless it's a corrupt file.*/
   1974                 /* Copy the data in dataPtr to iHoldBuffer. Update the iHoldBuffer size (iHoldLen).*/
   1975 
   1976                 pExtraData = pComponentPrivate->pHoldBuffer + pComponentPrivate->nHoldLength;
   1977                 memcpy(pExtraData,pBufHeader->pBuffer,pBufHeader->nFilledLen);
   1978 
   1979                 pComponentPrivate->nHoldLength += pBufHeader->nFilledLen;
   1980 
   1981                 /* Check if it is mime mode or non-mime mode to decide the frame length to be sent down*/
   1982                 /* to DSP/ALG.*/
   1983                 if ( pComponentPrivate->mimemode == NBAMRDEC_MIMEMODE)
   1984                 {
   1985                     frameType = pComponentPrivate->pHoldBuffer[0];
   1986                     index = ( frameType >> 3 ) & 0x0F;
   1987                     frameLength = pComponentPrivate->amrMimeBytes[index];
   1988                 }
   1989                 else if(pComponentPrivate->mimemode == NBAMRDEC_IF2)
   1990                 {
   1991                     frameType = pComponentPrivate->pHoldBuffer[0];
   1992                     index = frameType&0x0F;
   1993                     frameLength = pComponentPrivate->amrIF2Bytes[index];
   1994                 }
   1995                 else
   1996                 {
   1997                     frameLength = STD_NBAMRDEC_BUF_SIZE;
   1998                 }
   1999 
   2000                 nFrames = (OMX_U8)(pComponentPrivate->nHoldLength / frameLength);
   2001                 if ( nFrames >= 1 )  {
   2002                     /* Copy the data from pComponentPrivate->pHoldBuffer to pBufHeader->pBuffer*/
   2003 		    /* check the pBufHeader boundery before copying */
   2004 		    if ((nFrames*frameLength) > pBufHeader->nAllocLen)
   2005 		    {
   2006                         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ERROR: Trying to write beyond buffer boundaries!",__LINE__);
   2007 			goto EXIT;
   2008 		    }
   2009                     memcpy(pBufHeader->pBuffer,pComponentPrivate->pHoldBuffer,nFrames*frameLength);
   2010                     pBufHeader->nFilledLen = nFrames*frameLength;
   2011 
   2012                     /* Now the pHoldBuffer has pBufHeader->nFilledLen fewer bytes, update nHoldLength*/
   2013                     pComponentPrivate->nHoldLength = pComponentPrivate->nHoldLength - pBufHeader->nFilledLen;
   2014 
   2015                     /* Shift the remaining bytes to the beginning of the pHoldBuffer */
   2016                     pExtraData = pComponentPrivate->pHoldBuffer + pBufHeader->nFilledLen;
   2017 
   2018                     memcpy(pComponentPrivate->pHoldBuffer,pExtraData,pComponentPrivate->nHoldLength);
   2019 
   2020                     /* Clear the rest of the data from the pHoldBuffer */
   2021                     /*pExtraData = pComponentPrivate->pHoldBuffer + pComponentPrivate->nHoldLength;*/
   2022                     /*memset(pExtraData,0,holdBufferSize - pComponentPrivate->nHoldLength);*/
   2023                 }
   2024                 else {
   2025                     if (pComponentPrivate->curState != OMX_StatePause) {
   2026                         OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling EmptyBufferDone\n",__LINE__);
   2027                         pComponentPrivate->nEmptyBufferDoneCount++;
   2028 #ifdef __PERF_INSTRUMENTATION__
   2029                         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2030                                           PREF(pBufHeader,pBuffer),
   2031                                           0,
   2032                                           PERF_ModuleHLMM);
   2033 #endif
   2034                         pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   2035                                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   2036                                                                    pBufHeader);
   2037                         SignalIfAllBuffersAreReturned(pComponentPrivate);
   2038                         goto EXIT;
   2039                     }
   2040                     else {
   2041                         pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader;
   2042                     }
   2043                 }
   2044             }
   2045         }else{
   2046             if((((pBufHeader->nFlags)&(OMX_BUFFERFLAG_EOS)) != OMX_BUFFERFLAG_EOS) && !pBufHeader->pMarkData){
   2047                 pComponentPrivate->nEmptyBufferDoneCount++;
   2048 #ifdef __PERF_INSTRUMENTATION__
   2049                 PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2050                                   pComponentPrivate->pInputBufferList->pBufHdr[0]->pBuffer,0,PERF_ModuleHLMM);
   2051 #endif
   2052                 pComponentPrivate->cbInfo.EmptyBufferDone( pComponentPrivate->pHandle,
   2053                                                            pComponentPrivate->pHandle->pApplicationPrivate,
   2054                                                            pComponentPrivate->pInputBufferList->pBufHdr[0]);
   2055                 SignalIfAllBuffersAreReturned(pComponentPrivate);
   2056                 goto EXIT;
   2057             }
   2058             else{
   2059                 nFrames=1;
   2060             }
   2061         }
   2062 
   2063         if(nFrames >= 1){
   2064             eError = NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate,pBufHeader->pBuffer, OMX_DirInput, &pLcmlHdr);
   2065             if (eError != OMX_ErrorNone) {
   2066                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid Buffer Came ...\n",__LINE__);
   2067                 goto EXIT;
   2068             }
   2069 
   2070 #ifdef __PERF_INSTRUMENTATION__
   2071             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2072                               PREF(pBufHeader,pBuffer),
   2073                               pPortDefIn->nBufferSize,
   2074                               PERF_ModuleCommonLayer);
   2075 #endif
   2076             /*---------------------------------------------------------------*/
   2077 
   2078             phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)pLcmlHandle->pCodecinterfacehandle)->pCodec);
   2079 
   2080             if( (pLcmlHdr->pBufferParam->usNbFrames < nFrames) && (pLcmlHdr->pFrameParam!=NULL) ){
   2081 
   2082                 OMX_DmmUnMap(phandle->dspCodec->hProc, /*Unmap DSP memory used*/
   2083                              (void*)pLcmlHdr->pBufferParam->pParamElem,
   2084                              pLcmlHdr->pDmmBuf->pReserved, pComponentPrivate->dbg);
   2085                 pLcmlHdr->pBufferParam->pParamElem = NULL;
   2086 
   2087                 OMX_MEMFREE_STRUCT_DSPALIGN(pLcmlHdr->pFrameParam,NBAMRDEC_FrameStruct);
   2088             }
   2089 
   2090             if(pLcmlHdr->pFrameParam==NULL ){
   2091                 OMX_MALLOC_SIZE_DSPALIGN(pLcmlHdr->pFrameParam,(sizeof(NBAMRDEC_FrameStruct)*nFrames),NBAMRDEC_FrameStruct);
   2092 
   2093                 eError = OMX_DmmMap(phandle->dspCodec->hProc,
   2094                                     nFrames*sizeof(NBAMRDEC_FrameStruct),
   2095                                     (void*)pLcmlHdr->pFrameParam,
   2096                                     (pLcmlHdr->pDmmBuf), pComponentPrivate->dbg);
   2097 
   2098                 if (eError != OMX_ErrorNone)
   2099                 {
   2100                     OMX_ERROR4(pComponentPrivate->dbg, "OMX_DmmMap ERRROR!!!!\n\n");
   2101                     goto EXIT;
   2102                 }
   2103                 pLcmlHdr->pBufferParam->pParamElem = (NBAMRDEC_FrameStruct *)pLcmlHdr->pDmmBuf->pMapped; /*DSP Address*/
   2104             }
   2105 
   2106             for(i=0;i<nFrames;i++){
   2107                 (pLcmlHdr->pFrameParam+i)->usLastFrame = 0;
   2108                 (pLcmlHdr->pFrameParam+i)->usFrameLost = 0;
   2109             }
   2110 
   2111             /* We only support frame lost error concealment if there is one frame per buffer */
   2112             if (nFrames == 1)
   2113             {
   2114                 /* if the bFrameLost flag is set it means that the client has
   2115                 indicated that the next frame is corrupt so set the frame
   2116                 lost frame parameter */
   2117                 if (pComponentPrivate->bFrameLost == 1)
   2118                 {
   2119                     pLcmlHdr->pFrameParam->usFrameLost = 1;
   2120                     /* clear the internal frame lost flag */
   2121                     pComponentPrivate->bFrameLost = OMX_FALSE;
   2122                 }
   2123             }
   2124             isFrameParamChanged = OMX_TRUE;
   2125             /** ring tone**/
   2126             if(pComponentPrivate->SendAfterEOS == 1){
   2127                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: reconfiguring SN\n",__LINE__);
   2128                 if(pComponentPrivate->dasfmode == 1) {
   2129                     OMX_U32 pValues[4];
   2130                     OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ---- Comp: DASF Functionality is ON ---\n",__LINE__);
   2131 
   2132                     if(pComponentPrivate->streamID == 0)
   2133                     {
   2134                         OMX_ERROR4(pComponentPrivate->dbg, "**************************************\n");
   2135                         OMX_ERROR4(pComponentPrivate->dbg, ":: Error = OMX_ErrorInsufficientResources\n");
   2136                         OMX_ERROR4(pComponentPrivate->dbg, "**************************************\n");
   2137                         eError = OMX_ErrorInsufficientResources;
   2138                         pComponentPrivate->curState = OMX_StateInvalid;
   2139                         pComponentPrivate->cbInfo.EventHandler( pComponentPrivate->pHandle,
   2140                                                                 pComponentPrivate->pHandle->pApplicationPrivate,
   2141                                                                 OMX_EventError,
   2142                                                                 OMX_ErrorInvalidState,
   2143                                                                 OMX_TI_ErrorMajor,
   2144                                                         "AM: No Stream ID Available");
   2145                         goto EXIT;
   2146                     }
   2147 
   2148                     OMX_MALLOC_SIZE_DSPALIGN(pComponentPrivate->pParams,sizeof(AMRDEC_AudioCodecParams),AMRDEC_AudioCodecParams);
   2149                     pParams = pComponentPrivate->pParams;
   2150                     pParams->iAudioFormat = 1;
   2151                     pParams->iSamplingRate = 8000;
   2152                     pParams->iStrmId = pComponentPrivate->streamID;
   2153 
   2154                     pValues[0] = USN_STRMCMD_SETCODECPARAMS;
   2155                     pValues[1] = (OMX_U32)pParams;
   2156                     pValues[2] = sizeof(AMRDEC_AudioCodecParams);
   2157                     eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   2158                                                           EMMCodecControlStrmCtrl,(void *)pValues);
   2159 
   2160                     if(eError != OMX_ErrorNone) {
   2161                         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error Occurred in Codec StreamControl..\n",__LINE__);
   2162                         pComponentPrivate->curState = OMX_StateInvalid;
   2163                         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2164                                                                pComponentPrivate->pHandle->pApplicationPrivate,
   2165                                                                OMX_EventError,
   2166                                                                eError,
   2167                                                                OMX_TI_ErrorSevere,
   2168                                                                NULL);
   2169                         goto EXIT;
   2170                     }
   2171                 }
   2172 
   2173                 eError = LCML_ControlCodec(((LCML_DSP_INTERFACE*)pLcmlHandle)->pCodecinterfacehandle,
   2174                                                 EMMCodecControlStart, (void *)p);
   2175                 if(eError != OMX_ErrorNone) {
   2176                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error Occurred in Codec Start..\n",__LINE__);
   2177                     pComponentPrivate->curState = OMX_StateInvalid;
   2178                     pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2179                                                             pComponentPrivate->pHandle->pApplicationPrivate,
   2180                                                             OMX_EventError,
   2181                                                             eError,
   2182                                                             OMX_TI_ErrorSevere,
   2183                                                             NULL);
   2184                     goto EXIT;
   2185                 }
   2186                 pComponentPrivate->SendAfterEOS = 0;
   2187             }
   2188             /** **/
   2189 
   2190 
   2191 
   2192             if(pBufHeader->nFlags & OMX_BUFFERFLAG_EOS)
   2193             {
   2194                 (pLcmlHdr->pFrameParam+(nFrames-1))->usLastFrame = OMX_BUFFERFLAG_EOS;
   2195                 isFrameParamChanged = OMX_TRUE;
   2196                 pBufHeader->nFlags = 0;
   2197                 if(!pComponentPrivate->dasfmode)
   2198                 {
   2199                     if(!pBufHeader->nFilledLen)
   2200                     {
   2201                         pComponentPrivate->pOutputBufferList->pBufHdr[0]->nFlags |= OMX_BUFFERFLAG_EOS;
   2202                     }
   2203                     pComponentPrivate->cbInfo.EventHandler( pComponentPrivate->pHandle,
   2204                                                             pComponentPrivate->pHandle->pApplicationPrivate,
   2205                                                             OMX_EventBufferFlag,
   2206                                                             pComponentPrivate->pOutputBufferList->pBufHdr[0]->nOutputPortIndex,
   2207                                                             pComponentPrivate->pOutputBufferList->pBufHdr[0]->nFlags, NULL);
   2208                 }
   2209 
   2210                 pComponentPrivate->SendAfterEOS = 1;
   2211                 OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c : pComponentPrivate->SendAfterEOS %d\n",__LINE__,pComponentPrivate->SendAfterEOS);
   2212             }
   2213             if (isFrameParamChanged == OMX_TRUE) {
   2214                isFrameParamChanged = OMX_FALSE;
   2215                //Issue an initial memory flush to ensure cache coherency */
   2216                OMX_PRINT1(pComponentPrivate->dbg, "OMX_AmrDec_Utils.c : flushing pFrameParam\n");
   2217                status = DSPProcessor_FlushMemory(phandle->dspCodec->hProc, pLcmlHdr->pFrameParam,  nFrames*sizeof(NBAMRDEC_FrameStruct), 0);
   2218                if(DSP_FAILED(status))
   2219                {
   2220                  OMXDBG_PRINT(stderr, ERROR, 4, 0, "Unable to flush mapped buffer: error 0x%x",(int)status);
   2221                  goto EXIT;
   2222                }
   2223             }
   2224             pLcmlHdr->pBufferParam->usNbFrames = nFrames;
   2225             /*---------------------------------------------------------------*/
   2226 
   2227             /* Store time stamp information */
   2228             pComponentPrivate->arrBufIndex[pComponentPrivate->IpBufindex] = pBufHeader->nTimeStamp;
   2229             /* Store nTickCount information */
   2230             pComponentPrivate->arrTickCount[pComponentPrivate->IpBufindex] = pBufHeader->nTickCount;
   2231             pComponentPrivate->IpBufindex++;
   2232             pComponentPrivate->IpBufindex %= pPortDefIn->nBufferCountActual;
   2233 
   2234             if(pComponentPrivate->first_buff == 0){
   2235                 pComponentPrivate->first_TS = pBufHeader->nTimeStamp;
   2236                 OMX_PRBUFFER2(pComponentPrivate->dbg, "in ts-%ld\n",pBufHeader->nTimeStamp);
   2237                 pComponentPrivate->first_buff = 1;
   2238             }
   2239 
   2240             for (i=0; i < INPUT_NBAMRDEC_BUFFER_SIZE_MIME; i++) {
   2241                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Queueing pBufHeader->pBuffer[%d] = %x\n",__LINE__,i,pBufHeader->pBuffer[i]);
   2242             }
   2243 
   2244             if (pComponentPrivate->curState == OMX_StateExecuting)
   2245             {
   2246                 if (!NBAMRDEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirInput))
   2247                 {
   2248                     NBAMRDEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirInput);
   2249                     if (pComponentPrivate->mimemode == NBAMRDEC_MIMEMODE)
   2250                         eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   2251                                                 EMMCodecInputBuffer,
   2252                                                 (OMX_U8*)pBufHeader->pBuffer,
   2253                                                 pBufHeader->nAllocLen,
   2254                                                 pBufHeader->nFilledLen,
   2255                                                 (OMX_U8*)pLcmlHdr->pBufferParam,
   2256                                                 sizeof(NBAMRDEC_ParamStruct),
   2257                                                 NULL);
   2258                     else if (pComponentPrivate->mimemode == NBAMRDEC_IF2)
   2259                         eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   2260                                                     EMMCodecInputBuffer,
   2261                                                     (OMX_U8*)pBufHeader->pBuffer,
   2262                                                     INPUT_NBAMRDEC_BUFFER_SIZE_IF2*nFrames,
   2263                                                     INPUT_NBAMRDEC_BUFFER_SIZE_IF2*nFrames,
   2264                                                     (OMX_U8*)pLcmlHdr->pBufferParam,
   2265                                                     sizeof(NBAMRDEC_ParamStruct),
   2266                                                     NULL);
   2267                     else /*Frame Conformace, 120 for EFR, 118 for Standart*/
   2268                         eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   2269                                                     EMMCodecInputBuffer,
   2270                                                     (OMX_U8*)pBufHeader->pBuffer,
   2271                                                     bufSize*nFrames,
   2272                                                     bufSize*nFrames,
   2273                                                     (OMX_U8*)pLcmlHdr->pBufferParam,
   2274                                                     sizeof(NBAMRDEC_ParamStruct),
   2275                                                     NULL);
   2276                     if (eError != OMX_ErrorNone) {
   2277                        eError = OMX_ErrorHardware;
   2278                        goto EXIT;
   2279                     }
   2280                     pComponentPrivate->lcml_nCntIp++;
   2281                     pComponentPrivate->lcml_nIpBuf++;
   2282                 }
   2283             }else if(pComponentPrivate->curState == OMX_StatePause){
   2284                 pComponentPrivate->pInputBufHdrPending[pComponentPrivate->nNumInputBufPending++] = pBufHeader;
   2285             }
   2286 
   2287             if(pBufHeader->pMarkData)
   2288             {
   2289                 /* copy mark to output buffer header */
   2290                 if(pComponentPrivate->pOutputBufferList->pBufHdr[0]!=NULL){
   2291                     pComponentPrivate->pOutputBufferList->pBufHdr[0]->pMarkData = pBufHeader->pMarkData;
   2292                     pComponentPrivate->pOutputBufferList->pBufHdr[0]->hMarkTargetComponent = pBufHeader->hMarkTargetComponent;
   2293                 }
   2294 
   2295                 /* trigger event handler if we are supposed to */
   2296                 if(pBufHeader->hMarkTargetComponent == pComponentPrivate->pHandle && pBufHeader->pMarkData){
   2297                     pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2298                                                            pComponentPrivate->pHandle->pApplicationPrivate,
   2299                                                            OMX_EventMark,
   2300                                                            0,
   2301                                                            0,
   2302                                                            pBufHeader->pMarkData);
   2303                 }
   2304                 if (pComponentPrivate->curState != OMX_StatePause ) {
   2305                     OMX_PRBUFFER2(pComponentPrivate->dbg, "line %d:: Calling EmptyBufferDone\n",__LINE__);
   2306                     pComponentPrivate->nEmptyBufferDoneCount++;
   2307 #ifdef __PERF_INSTRUMENTATION__
   2308                     PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2309                                       pBufHeader->pBuffer,
   2310                                       0,
   2311                                       PERF_ModuleHLMM);
   2312 #endif
   2313                     pComponentPrivate->cbInfo.EmptyBufferDone( pComponentPrivate->pHandle,
   2314                                                                pComponentPrivate->pHandle->pApplicationPrivate,
   2315                                                                pBufHeader);
   2316                     SignalIfAllBuffersAreReturned(pComponentPrivate);
   2317                 }
   2318             }
   2319         }
   2320         else
   2321         {
   2322             OMX_PRBUFFER2(pComponentPrivate->dbg, "line %d:: No Frames in Buffer, calling EmptyBufferDone\n",__LINE__);
   2323             pComponentPrivate->nEmptyBufferDoneCount++;
   2324 #ifdef __PERF_INSTRUMENTATION__
   2325             PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2326                                       pBufHeader->pBuffer,
   2327                                       0,
   2328                                       PERF_ModuleHLMM);
   2329 #endif
   2330             pComponentPrivate->cbInfo.EmptyBufferDone( pComponentPrivate->pHandle,
   2331                                                        pComponentPrivate->pHandle->pApplicationPrivate,
   2332                                                        pBufHeader);
   2333             SignalIfAllBuffersAreReturned(pComponentPrivate);
   2334         }
   2335         if (pComponentPrivate->bFlushInputPortCommandPending) {
   2336             OMX_SendCommand(pComponentPrivate->pHandle,OMX_CommandFlush,0,NULL);
   2337         }
   2338     }
   2339     else if (eDir == OMX_DirOutput) {
   2340         /* Make sure that output buffer is issued to output stream only when
   2341          * there is an outstanding input buffer already issued on input stream
   2342          */
   2343         pComponentPrivate->nUnhandledFillThisBuffers--;
   2344         if (pComponentPrivate->curState == OMX_StateIdle){
   2345             pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   2346                                                       pComponentPrivate->pHandle->pApplicationPrivate,
   2347                                                       pBufHeader);
   2348             pComponentPrivate->nFillBufferDoneCount++;
   2349             SignalIfAllBuffersAreReturned(pComponentPrivate);
   2350             OMX_PRBUFFER2(pComponentPrivate->dbg, ":: %d %s In idle state return output buffers\n", __LINE__, __FUNCTION__);
   2351             goto EXIT;
   2352         }
   2353         eError = NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate, pBufHeader->pBuffer, OMX_DirOutput, &pLcmlHdr);
   2354         phandle = (LCML_DSP_INTERFACE *)(((LCML_CODEC_INTERFACE *)pLcmlHandle->pCodecinterfacehandle)->pCodec);
   2355 
   2356 #ifdef __PERF_INSTRUMENTATION__
   2357         PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2358                           PREF(pBufHeader,pBuffer),
   2359                           0,
   2360                           PERF_ModuleCommonLayer);
   2361 #endif
   2362 
   2363         nFrames = (OMX_U8)(pBufHeader->nAllocLen/OUTPUT_NBAMRDEC_BUFFER_SIZE);
   2364 
   2365         if( (pLcmlHdr->pBufferParam->usNbFrames < nFrames) && (pLcmlHdr->pFrameParam!=NULL) ){
   2366 
   2367             OMX_DmmUnMap(phandle->dspCodec->hProc, /*Unmap DSP memory used*/
   2368                          (void*)pLcmlHdr->pBufferParam->pParamElem,
   2369                          pLcmlHdr->pDmmBuf->pReserved, pComponentPrivate->dbg);
   2370             pLcmlHdr->pBufferParam->pParamElem = NULL;
   2371 
   2372             OMX_MEMFREE_STRUCT_DSPALIGN(pLcmlHdr->pFrameParam,NBAMRDEC_FrameStruct);
   2373         }
   2374 
   2375         if(pLcmlHdr->pFrameParam==NULL ){
   2376             OMX_MALLOC_SIZE_DSPALIGN(pLcmlHdr->pFrameParam,(sizeof(NBAMRDEC_FrameStruct)*nFrames),NBAMRDEC_FrameStruct);
   2377 
   2378             eError = OMX_DmmMap(phandle->dspCodec->hProc,
   2379                                 nFrames*sizeof(NBAMRDEC_FrameStruct),
   2380                                 (void*)pLcmlHdr->pFrameParam,
   2381                                 (pLcmlHdr->pDmmBuf), pComponentPrivate->dbg);
   2382 
   2383             if (eError != OMX_ErrorNone)
   2384             {
   2385                 OMX_ERROR4(pComponentPrivate->dbg, "OMX_DmmMap ERRROR!!!!\n");
   2386                 goto EXIT;
   2387             }
   2388 
   2389             pLcmlHdr->pBufferParam->pParamElem = (NBAMRDEC_FrameStruct *)pLcmlHdr->pDmmBuf->pMapped;/*DSP Address*/
   2390         }
   2391 
   2392         pLcmlHdr->pBufferParam->usNbFrames = nFrames;
   2393 
   2394         for(i=0;i<pLcmlHdr->pBufferParam->usNbFrames;i++){
   2395             (pLcmlHdr->pFrameParam+i)->usLastFrame = 0;
   2396             (pLcmlHdr->pFrameParam+i)->usFrameLost = 0;
   2397         }
   2398 
   2399         //Issue an initial memory flush to ensure cache coherency */
   2400         OMX_PRINT1(pComponentPrivate->dbg, "OMX_AmrDec_Utils.c : flushing pFrameParam\n");
   2401         status = DSPProcessor_FlushMemory(phandle->dspCodec->hProc, pLcmlHdr->pFrameParam,  nFrames*sizeof(NBAMRDEC_FrameStruct), 0);
   2402         if(DSP_FAILED(status))
   2403         {
   2404            OMXDBG_PRINT(stderr, ERROR, 4, 0, "Unable to flush mapped buffer: error 0x%x",(int)status);
   2405            goto EXIT;
   2406         }
   2407 
   2408         if (pComponentPrivate->curState == OMX_StateExecuting) {
   2409             if (!NBAMRDEC_IsPending(pComponentPrivate,pBufHeader,OMX_DirOutput)) {
   2410                 NBAMRDEC_SetPending(pComponentPrivate,pBufHeader,OMX_DirOutput);
   2411                 eError = LCML_QueueBuffer(pLcmlHandle->pCodecinterfacehandle,
   2412                                           EMMCodecOuputBuffer,
   2413                                           (OMX_U8 *)pBufHeader->pBuffer,
   2414                                           OUTPUT_NBAMRDEC_BUFFER_SIZE*nFrames,
   2415                                           OUTPUT_NBAMRDEC_BUFFER_SIZE*nFrames,
   2416                                           (OMX_U8 *) pLcmlHdr->pBufferParam,
   2417                                           sizeof(NBAMRDEC_ParamStruct),
   2418                                           NULL);
   2419                 if (eError != OMX_ErrorNone ) {
   2420                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: IssuingDSP OP: Error Occurred\n",__LINE__);
   2421                     eError = OMX_ErrorHardware;
   2422                     goto EXIT;
   2423                 }
   2424                 pComponentPrivate->lcml_nOpBuf++;
   2425             }
   2426         }
   2427         else if (pComponentPrivate->curState == OMX_StatePause){
   2428             pComponentPrivate->pOutputBufHdrPending[pComponentPrivate->nNumOutputBufPending++] = pBufHeader;
   2429         }
   2430 
   2431         if (pComponentPrivate->bFlushOutputPortCommandPending) {
   2432             OMX_SendCommand(pComponentPrivate->pHandle,
   2433                             OMX_CommandFlush,
   2434                             1,
   2435                             NULL);
   2436         }
   2437     }
   2438     else {
   2439         eError = OMX_ErrorBadParameter;
   2440     }
   2441 
   2442 EXIT:
   2443     if (TOCframetype != NULL) {
   2444 	 free(TOCframetype);
   2445     }
   2446     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting from  NBAMRDECHandleDataBuf_FromApp \n",__LINE__);
   2447     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Returning error %d\n",__LINE__,eError);
   2448     if (eError != OMX_ErrorNone ) {
   2449         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2450                                                pComponentPrivate->pHandle->pApplicationPrivate,
   2451                                                OMX_EventError,
   2452                                                eError,
   2453                                                OMX_TI_ErrorSevere,
   2454                                                NULL);
   2455     }
   2456     return eError;
   2457 }
   2458 
   2459 /*-------------------------------------------------------------------*/
   2460 /**
   2461 * NBAMRDECGetBufferDirection () This function is used by the component thread to
   2462 * request a buffer from the application.  Since it was called from 2 places,
   2463 * it made sense to turn this into a small function.
   2464 *
   2465 * @param pData pointer to AMR Decoder Context Structure
   2466 * @param pCur pointer to the buffer to be requested to be filled
   2467 *
   2468 * @retval none
   2469 **/
   2470 /*-------------------------------------------------------------------*/
   2471 
   2472 OMX_ERRORTYPE NBAMRDECGetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader,
   2473                                                          OMX_DIRTYPE *eDir)
   2474 {
   2475     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2476     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate = pBufHeader->pPlatformPrivate;
   2477     OMX_U32 nBuf;
   2478     OMX_BUFFERHEADERTYPE *pBuf = NULL;
   2479     OMX_U16 flag = 1,i;
   2480 
   2481     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Entering NBAMRDECGetBufferDirection Function\n",__LINE__);
   2482 
   2483     /*Search this buffer in input buffers list */
   2484     nBuf = pComponentPrivate->pInputBufferList->numBuffers;
   2485     for(i=0; i<nBuf; i++) {
   2486         pBuf = pComponentPrivate->pInputBufferList->pBufHdr[i];
   2487         if(pBufHeader == pBuf) {
   2488             *eDir = OMX_DirInput;
   2489             OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Buffer %p is INPUT BUFFER\n",__LINE__, pBufHeader);
   2490             flag = 0;
   2491             goto EXIT;
   2492         }
   2493     }
   2494 
   2495     /*Search this buffer in input buffers list */
   2496     nBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   2497 
   2498     for(i=0; i<nBuf; i++) {
   2499         pBuf = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   2500         if(pBufHeader == pBuf) {
   2501             *eDir = OMX_DirOutput;
   2502             OMX_ERROR2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Buffer %p is OUTPUT BUFFER\n",__LINE__, pBufHeader);
   2503             flag = 0;
   2504             goto EXIT;
   2505         }
   2506     }
   2507 
   2508     if (flag == 1) {
   2509         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Buffer %p is Not Found in the List\n",__LINE__,pBufHeader);
   2510         eError = OMX_ErrorUndefined;
   2511         goto EXIT;
   2512     }
   2513 EXIT:
   2514     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting NBAMRDECGetBufferDirection Function\n",__LINE__);
   2515     return eError;
   2516 }
   2517 /* -------------------------------------------------------------------*/
   2518 /**
   2519   *  Callback() function will be called LCML component to write the msg
   2520   *
   2521   * @param msgBuffer                 This buffer will be returned by the LCML
   2522   *
   2523   * @retval OMX_NoError              Success, ready to roll
   2524   *         OMX_Error_BadParameter   The input parameter pointer is null
   2525   **/
   2526 /*-------------------------------------------------------------------*/
   2527 OMX_ERRORTYPE NBAMRDECLCML_Callback (TUsnCodecEvent event,void * args [10])
   2528 {
   2529     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2530     OMX_U8 *pBuffer = args[1];
   2531     LCML_NBAMRDEC_BUFHEADERTYPE *pLcmlHdr;
   2532 #ifdef RESOURCE_MANAGER_ENABLED
   2533     OMX_ERRORTYPE rm_error = OMX_ErrorNone;
   2534 #endif
   2535     /*    ssize_t ret; */
   2536     OMX_COMPONENTTYPE *pHandle = NULL;
   2537     LCML_DSP_INTERFACE *pLcmlHandle;
   2538     OMX_U8 i;
   2539     NBAMRDEC_BUFDATA *OutputFrames;
   2540     DSP_STATUS status;
   2541     LCML_DSP_INTERFACE *dspphandle = (LCML_DSP_INTERFACE *)args[6];
   2542 
   2543     AMRDEC_COMPONENT_PRIVATE* pComponentPrivate = NULL;
   2544     pComponentPrivate = (AMRDEC_COMPONENT_PRIVATE*)((LCML_DSP_INTERFACE*)args[6])->pComponentPrivate;
   2545     static double time_stmp = 0;
   2546     pHandle = pComponentPrivate->pHandle;
   2547 
   2548     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Entering the NBAMRDECLCML_Callback Function\n",__LINE__);
   2549     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: args = %p\n",__LINE__,args[0]);
   2550     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: event = %d\n",__LINE__,event);
   2551 
   2552     switch(event) {
   2553 
   2554     case EMMCodecDspError:
   2555         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecDspError\n",__LINE__);
   2556         break;
   2557 
   2558     case EMMCodecInternalError:
   2559         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecInternalError\n",__LINE__);
   2560         break;
   2561 
   2562     case EMMCodecInitError:
   2563         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecInitError\n",__LINE__);
   2564         break;
   2565 
   2566     case EMMCodecDspMessageRecieved:
   2567         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecDspMessageRecieved\n",__LINE__);
   2568         break;
   2569 
   2570     case EMMCodecBufferProcessed:
   2571         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecBufferProcessed\n",__LINE__);
   2572         break;
   2573 
   2574     case EMMCodecProcessingStarted:
   2575         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecProcessingStarted\n",__LINE__);
   2576         break;
   2577 
   2578     case EMMCodecProcessingPaused:
   2579         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecProcessingPaused\n",__LINE__);
   2580         break;
   2581 
   2582     case EMMCodecProcessingStoped:
   2583         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecProcessingStoped\n",__LINE__);
   2584         break;
   2585 
   2586     case EMMCodecProcessingEof:
   2587         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecProcessingEof\n",__LINE__);
   2588         break;
   2589 
   2590     case EMMCodecBufferNotProcessed:
   2591         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecBufferNotProcessed\n",__LINE__);
   2592         break;
   2593 
   2594     case EMMCodecAlgCtrlAck:
   2595         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecAlgCtrlAck\n",__LINE__);
   2596         break;
   2597 
   2598     case EMMCodecStrmCtrlAck:
   2599         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: [LCML CALLBACK EVENT]  EMMCodecStrmCtrlAck\n",__LINE__);
   2600         break;
   2601     }
   2602 
   2603 
   2604 
   2605     if(event == EMMCodecBufferProcessed)
   2606     {
   2607         if( (OMX_U32)args [0] == EMMCodecInputBuffer) {
   2608             OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Input: pBufferr = %p\n",__LINE__, pBuffer);
   2609             if( pComponentPrivate->pPortDef[NBAMRDEC_INPUT_PORT]->bEnabled != OMX_FALSE){
   2610                 eError = NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirInput, &pLcmlHdr);
   2611 #ifdef __PERF_INSTRUMENTATION__
   2612                 PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2613                                    PREF(pLcmlHdr->buffer,pBuffer),
   2614                                    0,
   2615                                    PERF_ModuleCommonLayer);
   2616 #endif
   2617                 if (eError != OMX_ErrorNone) {
   2618                     OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid Buffer Came ...\n",__LINE__);
   2619                     goto EXIT;
   2620                 }
   2621                 NBAMRDEC_ClearPending(pComponentPrivate,pLcmlHdr->buffer,OMX_DirInput);
   2622                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling EmptyBufferDone\n",__LINE__);
   2623                 OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate->n\
   2624 HoldLength = %ld\n",__LINE__,pComponentPrivate->nHoldLength);
   2625                 pComponentPrivate->nEmptyBufferDoneCount++;
   2626 
   2627 #ifdef __PERF_INSTRUMENTATION__
   2628                 PERF_SendingFrame(pComponentPrivate->pPERFcomp,
   2629                                   PREF(pLcmlHdr->buffer,pBuffer),
   2630                                   0,
   2631                                   PERF_ModuleHLMM);
   2632 #endif
   2633                 pComponentPrivate->cbInfo.EmptyBufferDone (pHandle,
   2634                                                            pHandle->pApplicationPrivate,
   2635                                                            pLcmlHdr->buffer);
   2636                 SignalIfAllBuffersAreReturned(pComponentPrivate);
   2637                 pComponentPrivate->lcml_nIpBuf--;
   2638                 pComponentPrivate->app_nBuf++;
   2639             }
   2640         } else if ((OMX_U32)args [0] == EMMCodecOuputBuffer) {
   2641             OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Output: pBufferr = %p\n",__LINE__, pBuffer);
   2642 
   2643             eError = NBAMRDECGetCorresponding_LCMLHeader(pComponentPrivate, pBuffer, OMX_DirOutput, &pLcmlHdr);
   2644             if (eError != OMX_ErrorNone) {
   2645                 OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Error: Invalid Buffer Came ...\n",__LINE__);
   2646                 goto EXIT;
   2647             }
   2648 
   2649             if (!pComponentPrivate->bStopSent){
   2650                 pLcmlHdr->buffer->nFilledLen = (OMX_U32)args[8];
   2651             }
   2652             else
   2653                 pLcmlHdr->buffer->nFilledLen = 0;
   2654 
   2655             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECLCML_Callback:::\
   2656 pLcmlHdr->buffer->nFilledLen = %ld\n",__LINE__,pLcmlHdr->buffer->nFilledLen);
   2657 
   2658             OutputFrames = (pLcmlHdr->buffer)->pOutputPortPrivate;
   2659             OutputFrames->nFrames = (OMX_U8) ((OMX_U32)args[8] / OUTPUT_NBAMRDEC_BUFFER_SIZE);
   2660 
   2661 #ifdef __PERF_INSTRUMENTATION__
   2662             PERF_ReceivedFrame(pComponentPrivate->pPERFcomp,
   2663                                PREF(pLcmlHdr->buffer,pBuffer),
   2664                                PREF(pLcmlHdr->buffer,nFilledLen),
   2665                                PERF_ModuleCommonLayer);
   2666             pComponentPrivate->nLcml_nCntOpReceived++;
   2667             if ((pComponentPrivate->nLcml_nCntIp >= 1) &&
   2668                 (pComponentPrivate->nLcml_nCntOpReceived == 1)) {
   2669                 PERF_Boundary(pComponentPrivate->pPERFcomp,
   2670                               PERF_BoundaryStart | PERF_BoundarySteadyState);
   2671             }
   2672 #endif
   2673 
   2674             NBAMRDEC_ClearPending(pComponentPrivate,pLcmlHdr->buffer,OMX_DirOutput);
   2675             pComponentPrivate->nOutStandingFillDones++;
   2676             pComponentPrivate->first_output_buf_rcv = 1;
   2677 
   2678             for(i=0;i<pLcmlHdr->pBufferParam->usNbFrames;i++){
   2679                  if ( (pLcmlHdr->pFrameParam+i)->usLastFrame & OMX_BUFFERFLAG_EOS){
   2680                     (pLcmlHdr->pFrameParam+i)->usLastFrame = 0;
   2681                     (pLcmlHdr->pFrameParam+i)->usLastFrame = 0;
   2682                     pLcmlHdr->buffer->nFlags |= OMX_BUFFERFLAG_EOS;
   2683                     OMX_PRCOMM1(pComponentPrivate->dbg, "%d :: On Component receiving OMX_BUFFERFLAG_EOS on output\n", __LINE__);
   2684                     OMX_PRINT1(pComponentPrivate->dbg, "OMX_AmrDec_Utils.c : flushing pFrameParam2\n");
   2685                     status = DSPProcessor_FlushMemory(dspphandle->dspCodec->hProc, pLcmlHdr->pFrameParam, pLcmlHdr->pBufferParam->usNbFrames*sizeof(NBAMRDEC_FrameStruct), 0);
   2686                     if(DSP_FAILED(status))
   2687                     {
   2688                       OMXDBG_PRINT(stderr, ERROR, 4, 0, "Unable to flush mapped buffer: error 0x%x",(int)status);
   2689                       goto EXIT;
   2690                     }
   2691                     break;
   2692                 }
   2693             }
   2694             /* Copying time stamp information to output buffer */
   2695             if(pComponentPrivate->first_buff == 1){
   2696                 pComponentPrivate->first_buff = 2;
   2697                 pLcmlHdr->buffer->nTimeStamp = pComponentPrivate->first_TS;
   2698                 pComponentPrivate->temp_TS = pLcmlHdr->buffer->nTimeStamp;
   2699             }else{
   2700                 time_stmp = pLcmlHdr->buffer->nFilledLen / (1 * (((OMX_AUDIO_PARAM_PCMMODETYPE*)pComponentPrivate->amrParams[NBAMRDEC_OUTPUT_PORT])->nBitPerSample / 8));
   2701                 time_stmp = (time_stmp / ((OMX_AUDIO_PARAM_PCMMODETYPE*)pComponentPrivate->amrParams[NBAMRDEC_OUTPUT_PORT])->nSamplingRate) * 1000;
   2702                 pComponentPrivate->temp_TS += (OMX_U32)(time_stmp*1000);
   2703                 pLcmlHdr->buffer->nTimeStamp = pComponentPrivate->temp_TS;
   2704             }
   2705             /* Copying nTickCount information to output buffer */
   2706             pLcmlHdr->buffer->nTickCount = pComponentPrivate->arrTickCount[pComponentPrivate->OpBufindex];
   2707             pComponentPrivate->OpBufindex++;
   2708             pComponentPrivate->OpBufindex %= pComponentPrivate->pPortDef[OMX_DirInput]->nBufferCountActual;
   2709 
   2710             pComponentPrivate->LastOutbuf = pLcmlHdr->buffer;
   2711             pComponentPrivate->num_Reclaimed_Op_Buff++;
   2712 
   2713             OMX_PRBUFFER1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Calling FillBufferDone\n",__LINE__);
   2714 
   2715             pComponentPrivate->nFillBufferDoneCount++;
   2716 #ifdef __PERF_INSTRUMENTATION__
   2717             PERF_SendingBuffer(pComponentPrivate->pPERFcomp,
   2718                                PREF(pLcmlHdr->buffer,pBuffer),
   2719                                PREF(pLcmlHdr->buffer,nFilledLen),
   2720                                PERF_ModuleHLMM);
   2721 #endif
   2722             pComponentPrivate->cbInfo.FillBufferDone (pHandle,
   2723                                                       pHandle->pApplicationPrivate,
   2724                                                       pLcmlHdr->buffer);
   2725             SignalIfAllBuffersAreReturned(pComponentPrivate);
   2726             pComponentPrivate->lcml_nOpBuf--;
   2727             pComponentPrivate->app_nBuf++;
   2728             pComponentPrivate->nOutStandingFillDones--;
   2729 
   2730             OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Incrementing app_nBuf = %ld\n",__LINE__,pComponentPrivate->app_nBuf);
   2731         }
   2732     } else if (event == EMMCodecStrmCtrlAck) {
   2733         OMX_PRCOMM2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: GOT MESSAGE USN_DSPACK_STRMCTRL ----\n",__LINE__);
   2734         if (args[1] == (void *)USN_STRMCMD_FLUSH) {
   2735             pHandle = pComponentPrivate->pHandle;
   2736             if ( args[2] == (void *)EMMCodecInputBuffer) {
   2737                 if (args[0] == (void *)USN_ERR_NONE ) {
   2738                     OMX_PRCOMM1(pComponentPrivate->dbg, "Flushing input port %d\n",__LINE__);
   2739                     for (i=0; i < pComponentPrivate->nNumInputBufPending; i++) {
   2740                         pComponentPrivate->cbInfo.EmptyBufferDone (pHandle,
   2741                                                                    pHandle->pApplicationPrivate,
   2742                                                                    pComponentPrivate->pInputBufHdrPending[i]);
   2743                         pComponentPrivate->nEmptyBufferDoneCount++;
   2744                         SignalIfAllBuffersAreReturned(pComponentPrivate);
   2745                         pComponentPrivate->pInputBufHdrPending[i] = NULL;
   2746                     }
   2747                     pComponentPrivate->nNumInputBufPending=0;
   2748                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   2749                                                            pHandle->pApplicationPrivate,
   2750                                                            OMX_EventCmdComplete,
   2751                                                            OMX_CommandFlush,
   2752                                                            NBAMRDEC_INPUT_PORT,
   2753                                                            NULL);
   2754                 } else {
   2755                     OMX_ERROR4(pComponentPrivate->dbg, "LCML reported error while flushing input port\n");
   2756                     goto EXIT;
   2757                 }
   2758             }
   2759             else if ( args[2] == (void *)EMMCodecOuputBuffer) {
   2760                 if (args[0] == (void *)USN_ERR_NONE ) {
   2761                     OMX_PRCOMM1(pComponentPrivate->dbg, "Flushing output port %d\n",__LINE__);
   2762                     for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) {
   2763                         pComponentPrivate->cbInfo.FillBufferDone (pHandle,
   2764                                                                   pHandle->pApplicationPrivate,
   2765                                                                   pComponentPrivate->pOutputBufHdrPending[i]);
   2766                         pComponentPrivate->nFillBufferDoneCount++;
   2767                         SignalIfAllBuffersAreReturned(pComponentPrivate);
   2768                         pComponentPrivate->pOutputBufHdrPending[i] = NULL;
   2769                     }
   2770                     pComponentPrivate->nNumOutputBufPending=0;
   2771                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   2772                                                            pHandle->pApplicationPrivate,
   2773                                                            OMX_EventCmdComplete,
   2774                                                            OMX_CommandFlush,
   2775                                                            NBAMRDEC_OUTPUT_PORT,
   2776                                                            NULL);
   2777                 } else {
   2778                     OMX_ERROR4(pComponentPrivate->dbg, "LCML reported error while flushing output port\n");
   2779                     goto EXIT;
   2780                 }
   2781             }
   2782         }
   2783     }
   2784     else if(event == EMMCodecProcessingStoped) {
   2785         for (i = 0; i < pComponentPrivate->nNumInputBufPending; i++) {
   2786 		pComponentPrivate->cbInfo.EmptyBufferDone (pComponentPrivate->pHandle,
   2787 				pComponentPrivate->pHandle->pApplicationPrivate,
   2788 				pComponentPrivate->pInputBufHdrPending[i]);
   2789         pComponentPrivate->nEmptyBufferDoneCount++;
   2790 		pComponentPrivate->pInputBufHdrPending[i] = NULL;
   2791         SignalIfAllBuffersAreReturned(pComponentPrivate);
   2792 	}
   2793 	pComponentPrivate->nNumInputBufPending = 0;
   2794 	for (i=0; i < pComponentPrivate->nNumOutputBufPending; i++) {
   2795 		pComponentPrivate->cbInfo.FillBufferDone (pComponentPrivate->pHandle,
   2796 			pComponentPrivate->pHandle->pApplicationPrivate,
   2797 			pComponentPrivate->pOutputBufHdrPending[i]);
   2798             pComponentPrivate->nFillBufferDoneCount++;
   2799             SignalIfAllBuffersAreReturned(pComponentPrivate);
   2800 		pComponentPrivate->nOutStandingFillDones--;
   2801 		pComponentPrivate->pOutputBufHdrPending[i] = NULL;
   2802 	}
   2803 	pComponentPrivate->nNumOutputBufPending=0;
   2804         pthread_mutex_lock(&pComponentPrivate->codecStop_mutex);
   2805         if(pComponentPrivate->codecStop_waitingsignal == 0){
   2806             pComponentPrivate->codecStop_waitingsignal = 1;
   2807             pthread_cond_signal(&pComponentPrivate->codecStop_threshold);
   2808             OMX_ERROR2(pComponentPrivate->dbg, "stop ack. received. stop waiting for sending disable command completed\n");
   2809         }
   2810         pthread_mutex_unlock(&pComponentPrivate->codecStop_mutex);
   2811 
   2812         if (!pComponentPrivate->bNoIdleOnStop) {
   2813             pComponentPrivate->nNumOutputBufPending=0;
   2814 
   2815             /*            pComponentPrivate->ProcessingInputBuf=0;
   2816                           pComponentPrivate->ProcessingOutputBuf=0;
   2817             */
   2818             pComponentPrivate->nHoldLength = 0;
   2819             /*            pComponentPrivate->InBuf_Eos_alreadysent  =0; */
   2820 
   2821             /*            OMX_NBMEMFREE_STRUCT(pComponentPrivate->pHoldBuffer); */
   2822             /*            OMX_NBMEMFREE_STRUCT(pComponentPrivate->iMMFDataLastBuffer); */
   2823 
   2824             pComponentPrivate->curState = OMX_StateIdle;
   2825 #ifdef RESOURCE_MANAGER_ENABLED
   2826             eError = RMProxy_NewSendCommand(pHandle,
   2827                                             RMProxy_StateSet,
   2828                                             OMX_NBAMR_Decoder_COMPONENT,
   2829                                             OMX_StateIdle,
   2830                                             3456,
   2831                                             NULL);
   2832 #endif
   2833             /*
   2834             if((pComponentPrivate->nEmptyThisBufferCount != pComponentPrivate->nEmptyBufferDoneCount) || (pComponentPrivate->nFillThisBufferCount != pComponentPrivate->nFillBufferDoneCount)) {
   2835                 if(pthread_mutex_lock(&bufferReturned_mutex) != 0)
   2836                 {
   2837                     OMXDBG_PRINT(stderr, PRINT, 1, 0, "bufferReturned_mutex mutex lock error");
   2838                 }
   2839                 OMXDBG_PRINT(stderr, PRINT, 1, 0, "pthread_cond_waiting for OMX to return all input and outbut buffers");
   2840                 pthread_cond_wait(&bufferReturned_condition, &bufferReturned_mutex);
   2841                 OMXDBG_PRINT(stderr, PRINT, 1, 0, "OMX has returned all input and output buffers");
   2842                 if(pthread_mutex_unlock(&bufferReturned_mutex) != 0)
   2843                 {
   2844                     OMXDBG_PRINT(stderr, PRINT, 1, 0, "bufferReturned_mutex mutex unlock error");
   2845                 }
   2846             }
   2847             else
   2848             {
   2849                 OMXDBG_PRINT(stderr, PRINT, 1, 0, "OMX has returned all input and output buffers");
   2850             }
   2851             */
   2852             if(pComponentPrivate->bPreempted == 0){
   2853                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   2854                                                    pHandle->pApplicationPrivate,
   2855                                                    OMX_EventCmdComplete,
   2856                                                    OMX_CommandStateSet,
   2857                                                    pComponentPrivate->curState,
   2858                                                    NULL);
   2859             }else{
   2860                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   2861                                                     pHandle->pApplicationPrivate,
   2862                                                     OMX_EventError,
   2863                                                     OMX_ErrorResourcesPreempted,
   2864                                                     OMX_TI_ErrorSevere,
   2865                                                     0);
   2866             }
   2867         }else{
   2868             pComponentPrivate->bNoIdleOnStop = OMX_FALSE;
   2869         }
   2870     }
   2871     else if (event == EMMCodecProcessingPaused) {
   2872         pComponentPrivate->curState = OMX_StatePause;
   2873         /* Send StateChangeNotification to application */
   2874         pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   2875                                                pComponentPrivate->pHandle->pApplicationPrivate,
   2876                                                OMX_EventCmdComplete,
   2877                                                OMX_CommandStateSet,
   2878                                                pComponentPrivate->curState,
   2879                                                NULL);
   2880 
   2881     }
   2882     else if (event == EMMCodecDspError) {
   2883         switch ( (OMX_U32) args [4])
   2884         {
   2885         /* USN_ERR_NONE,: Indicates that no error encountered during execution of the command and the command execution completed succesfully.
   2886              * USN_ERR_WARNING,: Indicates that process function returned a warning. The exact warning is returned in Arg2 of this message.
   2887              * USN_ERR_PROCESS,: Indicates that process function returned a error type. The exact error type is returnd in Arg2 of this message.
   2888              * USN_ERR_PAUSE,: Indicates that execution of pause resulted in error.
   2889              * USN_ERR_STOP,: Indicates that execution of stop resulted in error.
   2890              * USN_ERR_ALGCTRL,: Indicates that execution of alg control resulted in error.
   2891              * USN_ERR_STRMCTRL,: Indiactes the execution of STRM control command, resulted in error.
   2892              * USN_ERR_UNKNOWN_MSG,: Indicates that USN received an unknown command. */
   2893 
   2894 #ifdef _ERROR_PROPAGATION__
   2895             case USN_ERR_PAUSE:
   2896             case USN_ERR_STOP:
   2897             case USN_ERR_ALGCTRL:
   2898             case USN_ERR_STRMCTRL:
   2899             case USN_ERR_UNKNOWN_MSG:
   2900 
   2901                 {
   2902                     pComponentPrivate->bIsInvalidState=OMX_TRUE;
   2903                     pComponentPrivate->curState = OMX_StateInvalid;
   2904                     pHandle = pComponentPrivate->pHandle;
   2905                     pComponentPrivate->cbInfo.EventHandler(pHandle,
   2906                             pHandle->pApplicationPrivate,
   2907                             OMX_EventError,
   2908                             OMX_ErrorInvalidState,
   2909                             OMX_TI_ErrorSevere,
   2910                             NULL);
   2911                 }
   2912                 break;
   2913 #endif
   2914 
   2915             case USN_ERR_WARNING:
   2916             case USN_ERR_PROCESS:
   2917                 NBAMRDEC_HandleUSNError (pComponentPrivate, (OMX_U32)args[5]);
   2918                 break;
   2919             default:
   2920                 break;
   2921         }
   2922     }
   2923 
   2924     if(event == EMMCodecDspMessageRecieved) {
   2925         OMX_PRSTATE2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: commandedState  = %p\n",__LINE__,args[0]);
   2926         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: arg1 = %p\n",__LINE__,args[1]);
   2927         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: arg2 = %p\n",__LINE__,args[2]);
   2928     }
   2929 
   2930 #ifdef _ERROR_PROPAGATION__
   2931 
   2932     else if (event ==EMMCodecInitError){
   2933         /* Cheking for MMU_fault */
   2934         if(((int) args[4] == USN_ERR_UNKNOWN_MSG) && (args[5] == (void*) NULL)) {
   2935             pComponentPrivate->bIsInvalidState=OMX_TRUE;
   2936             pComponentPrivate->curState = OMX_StateInvalid;
   2937             pHandle = pComponentPrivate->pHandle;
   2938             pComponentPrivate->cbInfo.EventHandler(pHandle,
   2939                                                    pHandle->pApplicationPrivate,
   2940                                                    OMX_EventError,
   2941                                                    OMX_ErrorInvalidState,
   2942                                                    OMX_TI_ErrorSevere,
   2943                                                    NULL);
   2944         }
   2945     }
   2946     else if (event ==EMMCodecInternalError){
   2947         /* Cheking for MMU_fault */
   2948         if(((int)args[4] == USN_ERR_UNKNOWN_MSG) && (args[5] == (void*) NULL)) {
   2949             pComponentPrivate->bIsInvalidState=OMX_TRUE;
   2950             pComponentPrivate->curState = OMX_StateInvalid;
   2951             pHandle = pComponentPrivate->pHandle;
   2952             pComponentPrivate->cbInfo.EventHandler(pHandle,
   2953                                                    pHandle->pApplicationPrivate,
   2954                                                    OMX_EventError,
   2955                                                    OMX_ErrorInvalidState,
   2956                                                    OMX_TI_ErrorSevere,
   2957                                                    NULL);
   2958         }
   2959 
   2960     }
   2961 #endif
   2962  EXIT:
   2963     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting the NBAMRDECLCML_Callback Function\n",__LINE__);
   2964     return eError;
   2965 }
   2966 
   2967 
   2968 OMX_ERRORTYPE NBAMRDECGetCorresponding_LCMLHeader(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate,
   2969                                           OMX_U8 *pBuffer,
   2970                                           OMX_DIRTYPE eDir,
   2971                                           LCML_NBAMRDEC_BUFHEADERTYPE **ppLcmlHdr)
   2972 {
   2973     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2974     LCML_NBAMRDEC_BUFHEADERTYPE *pLcmlBufHeader;
   2975 
   2976     OMX_S16 nIpBuf;
   2977     OMX_S16 nOpBuf;
   2978     OMX_S16 i;
   2979 
   2980     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
   2981     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   2982 
   2983     while (!pComponentPrivate->bInitParamsInitialized)
   2984     {
   2985         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Waiting for init to complete\n",__LINE__);
   2986 #ifndef UNDER_CE
   2987         sched_yield();
   2988 #else
   2989         Sleep(0);
   2990 #endif
   2991     }
   2992     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   2993     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate = %p\n",__LINE__,pComponentPrivate);
   2994 
   2995     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: eDir = %d\n",__LINE__,eDir);
   2996     if(eDir == OMX_DirInput) {
   2997         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   2998     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   2999     OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pComponentPrivate = %p\n",__LINE__,pComponentPrivate);
   3000         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[NBAMRDEC_INPUT_PORT];
   3001     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   3002         for(i=0; i<nIpBuf; i++) {
   3003     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   3004             OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pBuffer = %p\n",__LINE__,pBuffer);
   3005     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   3006             OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pLcmlBufHeader->buffer->pBuffer = %p\n",__LINE__,pLcmlBufHeader->buffer->pBuffer);
   3007     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   3008             if(pBuffer == pLcmlBufHeader->buffer->pBuffer) {
   3009     OMX_PRDSP1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Inside NBAMRDECGetCorresponding_LCMLHeader..\n",__LINE__);
   3010                 *ppLcmlHdr = pLcmlBufHeader;
   3011                 OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Corresponding LCML Header Found\n",__LINE__);
   3012                  goto EXIT;
   3013             }
   3014             pLcmlBufHeader++;
   3015         }
   3016     } else if (eDir == OMX_DirOutput) {
   3017         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3018         pLcmlBufHeader = pComponentPrivate->pLcmlBufHeader[NBAMRDEC_OUTPUT_PORT];
   3019         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3020 
   3021         for(i=0; i<nOpBuf; i++) {
   3022         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3023 
   3024             if(pBuffer == pLcmlBufHeader->buffer->pBuffer) {
   3025 
   3026                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pBuffer = %p\n",__LINE__,pBuffer);
   3027                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pLcmlBufHeader->buffer->pBuffer = %p\n",__LINE__,pLcmlBufHeader->buffer->pBuffer);
   3028 
   3029                 *ppLcmlHdr = pLcmlBufHeader;
   3030         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3031 
   3032                  OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Corresponding LCML Header Found\n",__LINE__);
   3033         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3034 
   3035                  goto EXIT;
   3036             }
   3037             pLcmlBufHeader++;
   3038         }
   3039     } else {
   3040         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3041       OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Invalid Buffer Type :: exiting...\n",__LINE__);
   3042     }
   3043         OMX_PRINT2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c ::\n",__LINE__);
   3044 
   3045 EXIT:
   3046     return eError;
   3047 }
   3048 
   3049 
   3050 #ifndef UNDER_CE
   3051 
   3052 OMX_HANDLETYPE NBAMRDECGetLCMLHandle(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   3053 {
   3054     void *handle;
   3055     OMX_ERRORTYPE (*fpGetHandle)(OMX_HANDLETYPE);
   3056     OMX_HANDLETYPE pHandle = NULL;
   3057     OMX_S8 *error;
   3058     OMX_ERRORTYPE eError;
   3059 
   3060     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECGetLCMLHandle\n",__LINE__);
   3061     handle = dlopen("libLCML.so", RTLD_LAZY);
   3062     if (!handle) {
   3063         fputs(dlerror(), stderr);
   3064         goto EXIT;
   3065     }
   3066 
   3067     fpGetHandle = dlsym (handle, "GetHandle");
   3068     if ((error = (void*)dlerror()) != NULL)
   3069     {
   3070         fputs((void*)error, stderr);
   3071 	dlclose(handle);
   3072         goto EXIT;
   3073     }
   3074     eError = (*fpGetHandle)(&pHandle);
   3075     if(eError != OMX_ErrorNone) {
   3076         eError = OMX_ErrorUndefined;
   3077         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: eError != OMX_ErrorNone...\n",__LINE__);
   3078         pHandle = NULL;
   3079         dlclose(handle);
   3080         goto EXIT;
   3081     }
   3082     pComponentPrivate->bLcmlHandleOpened = 1;
   3083 
   3084     ((LCML_DSP_INTERFACE*)pHandle)->pComponentPrivate = pComponentPrivate;
   3085 
   3086     pComponentPrivate->ptrLibLCML=handle;            /* saving LCML lib pointer  */
   3087 
   3088 EXIT:
   3089     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECGetLCMLHandle returning %p\n",__LINE__,pHandle);
   3090 
   3091     return pHandle;
   3092 }
   3093 
   3094 
   3095 #else
   3096 //WINDOWS Explicit dll load procedure
   3097 OMX_HANDLETYPE NBAMRDECGetLCMLHandle(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   3098 {
   3099     typedef OMX_ERRORTYPE (*LPFNDLLFUNC1)(OMX_HANDLETYPE);
   3100     OMX_HANDLETYPE pHandle = NULL;
   3101     OMX_ERRORTYPE eError;
   3102     HINSTANCE hDLL;               // Handle to DLL
   3103     LPFNDLLFUNC1 fpGetHandle1;
   3104 
   3105     hDLL = LoadLibraryEx(TEXT("OAF_BML.dll"), NULL,0);
   3106     if (hDLL == NULL)
   3107     {
   3108         //fputs(dlerror(), stderr);
   3109         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: BML Load Failed!!!\n",__LINE__);
   3110         return pHandle;
   3111     }
   3112 
   3113     fpGetHandle1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,TEXT("GetHandle"));
   3114     if (!fpGetHandle1)
   3115     {
   3116       // handle the error
   3117       FreeLibrary(hDLL);
   3118 
   3119       return pHandle;
   3120     }
   3121 
   3122     // call the function
   3123     eError = fpGetHandle1(&pHandle);
   3124     if(eError != OMX_ErrorNone) {
   3125         eError = OMX_ErrorUndefined;
   3126         OMX_ERROR4(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: eError != OMX_ErrorNone...\n",__LINE__);
   3127 
   3128         pHandle = NULL;
   3129         return pHandle;
   3130     }
   3131 
   3132     ((LCML_DSP_INTERFACE*)pHandle)->pComponentPrivate = pComponentPrivate;
   3133     return pHandle;
   3134 }
   3135 #endif
   3136 
   3137 
   3138 #ifndef UNDER_CE
   3139 
   3140 OMX_ERRORTYPE NBAMRDECFreeLCMLHandle(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   3141 {
   3142     OMX_S16 retValue;
   3143     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3144 
   3145     if (pComponentPrivate->bLcmlHandleOpened) {
   3146         retValue = dlclose(pComponentPrivate->pLcmlHandle);
   3147 
   3148         if (retValue != 0) {
   3149             eError = OMX_ErrorUndefined;
   3150         }
   3151         pComponentPrivate->bLcmlHandleOpened = 0;
   3152     }
   3153 
   3154     return eError;
   3155 }
   3156 #else
   3157 
   3158 
   3159 OMX_ERRORTYPE NBAMRDECFreeLCMLHandle(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   3160 {
   3161 
   3162     OMX_S16 retValue;
   3163     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3164 
   3165     if (pComponentPrivate->bLcmlHandleOpened) {
   3166 
   3167         retValue = FreeLibrary(pComponentPrivate->pLcmlHandle);
   3168         if (retValue == 0) {          /* Zero Indicates failure */
   3169             eError = OMX_ErrorUndefined;
   3170         }
   3171         pComponentPrivate->bLcmlHandleOpened = 0;
   3172     }
   3173 
   3174     return eError;
   3175 }
   3176 
   3177 
   3178 
   3179 #endif
   3180 void NBAMRDEC_SetPending(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   3181 {
   3182     OMX_S16 i;
   3183 
   3184     if (eDir == OMX_DirInput) {
   3185         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   3186             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   3187                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 1;
   3188                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: *****INPUT BUFFER %d IS PENDING****\n",__LINE__,i);
   3189             }
   3190         }
   3191     }
   3192     else {
   3193         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   3194             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   3195                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 1;
   3196                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: *****OUTPUT BUFFER %d IS PENDING****\n",__LINE__,i);
   3197             }
   3198         }
   3199     }
   3200 }
   3201 
   3202 void NBAMRDEC_ClearPending(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   3203 {
   3204     OMX_S16 i;
   3205 
   3206     if (eDir == OMX_DirInput) {
   3207         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   3208             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   3209                 pComponentPrivate->pInputBufferList->bBufferPending[i] = 0;
   3210                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ****INPUT BUFFER %d IS RECLAIMED****\n",__LINE__,i);
   3211             }
   3212         }
   3213     }
   3214     else {
   3215         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   3216             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   3217                 pComponentPrivate->pOutputBufferList->bBufferPending[i] = 0;
   3218                 OMX_PRBUFFER2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: ****OUTPUT BUFFER %d IS RECLAIMED****\n",__LINE__,i);
   3219             }
   3220         }
   3221     }
   3222 }
   3223 
   3224 OMX_U32 NBAMRDEC_IsPending(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir)
   3225 {
   3226     OMX_S16 i;
   3227 
   3228     if (eDir == OMX_DirInput) {
   3229         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   3230             if (pBufHdr == pComponentPrivate->pInputBufferList->pBufHdr[i]) {
   3231                 return pComponentPrivate->pInputBufferList->bBufferPending[i];
   3232             }
   3233         }
   3234     }
   3235     else {
   3236         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   3237             if (pBufHdr == pComponentPrivate->pOutputBufferList->pBufHdr[i]) {
   3238                 return pComponentPrivate->pOutputBufferList->bBufferPending[i];
   3239             }
   3240         }
   3241     }
   3242     return -1;
   3243 }
   3244 
   3245 
   3246 OMX_U32 NBAMRDEC_IsValid(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir)
   3247 {
   3248     OMX_S16 i;
   3249     OMX_S16 found=0;
   3250 
   3251     if (eDir == OMX_DirInput) {
   3252         for (i=0; i < pComponentPrivate->pInputBufferList->numBuffers; i++) {
   3253             if (pBuffer == pComponentPrivate->pInputBufferList->pBufHdr[i]->pBuffer) {
   3254                 found = 1;
   3255             }
   3256         }
   3257     }
   3258     else {
   3259         for (i=0; i < pComponentPrivate->pOutputBufferList->numBuffers; i++) {
   3260             if (pBuffer == pComponentPrivate->pOutputBufferList->pBufHdr[i]->pBuffer) {
   3261                 found = 1;
   3262             }
   3263         }
   3264     }
   3265     return found;
   3266 }
   3267 
   3268 
   3269 OMX_ERRORTYPE  NBAMRDECFill_LCMLInitParamsEx (OMX_HANDLETYPE  pComponent )
   3270 {
   3271     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3272     OMX_U32 nIpBuf,nIpBufSize,nOpBuf,nOpBufSize;
   3273     OMX_U16 i;
   3274     OMX_BUFFERHEADERTYPE *pTemp;
   3275     OMX_S16 size_lcml;
   3276     char *ptr;
   3277 
   3278     LCML_DSP_INTERFACE *pHandle = (LCML_DSP_INTERFACE *)pComponent;
   3279     AMRDEC_COMPONENT_PRIVATE *pComponentPrivate;
   3280     LCML_NBAMRDEC_BUFHEADERTYPE *pTemp_lcml;
   3281 
   3282     OMXDBG_PRINT(stderr, PRINT, 1, 0, "%d :: OMX_AmrDec_Utils.c :: NBAMRDECFill_LCMLInitParams\n ",__LINE__);
   3283     OMXDBG_PRINT(stderr, PRINT, 2, 0, "%d :: OMX_AmrDec_Utils.c :: pHandle = %p\n",__LINE__,pHandle);
   3284     OMXDBG_PRINT(stderr, PRINT, 2, 0, "%d :: OMX_AmrDec_Utils.c :: pHandle->pComponentPrivate = %p\n",__LINE__,pHandle->pComponentPrivate);
   3285     pComponentPrivate = pHandle->pComponentPrivate;
   3286 
   3287     nIpBuf = pComponentPrivate->pInputBufferList->numBuffers;
   3288 
   3289     if(pComponentPrivate->mimemode == 1) {
   3290         nIpBufSize = INPUT_NBAMRDEC_BUFFER_SIZE_MIME;
   3291     }
   3292     else {
   3293         if (OMX_AUDIO_AMRDTXasEFR == pComponentPrivate->iAmrMode){
   3294             nIpBufSize = INPUT_BUFF_SIZE_EFR;
   3295         }
   3296         else{
   3297             nIpBufSize = STD_NBAMRDEC_BUF_SIZE;
   3298         }
   3299     }
   3300 
   3301     nOpBuf = pComponentPrivate->pOutputBufferList->numBuffers;
   3302     nOpBufSize = OUTPUT_NBAMRDEC_BUFFER_SIZE;
   3303 
   3304 
   3305     size_lcml = (OMX_S16)nIpBuf * sizeof(LCML_NBAMRDEC_BUFHEADERTYPE);
   3306     OMX_MALLOC_SIZE(ptr, size_lcml,char);
   3307     pTemp_lcml = (LCML_NBAMRDEC_BUFHEADERTYPE *)ptr;
   3308 
   3309     pComponentPrivate->pLcmlBufHeader[NBAMRDEC_INPUT_PORT] = pTemp_lcml;
   3310 
   3311     for (i=0; i<nIpBuf; i++) {
   3312         pTemp = pComponentPrivate->pInputBufferList->pBufHdr[i];
   3313         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   3314 /*        pTemp->nAllocLen = nIpBufSize;*/
   3315         pTemp->nFilledLen = nIpBufSize;
   3316         pTemp->nVersion.s.nVersionMajor = AMRDEC_MAJOR_VER;
   3317         pTemp->nVersion.s.nVersionMinor = AMRDEC_MINOR_VER;
   3318         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   3319         pTemp->nTickCount = NOT_USED;
   3320         pTemp_lcml->buffer = pTemp;
   3321         pTemp_lcml->eDir = OMX_DirInput;
   3322 
   3323         OMX_MALLOC_SIZE_DSPALIGN(pTemp_lcml->pBufferParam,
   3324                                 sizeof(NBAMRDEC_ParamStruct),
   3325                                 NBAMRDEC_ParamStruct);
   3326 
   3327 
   3328         OMX_MALLOC_GENERIC(pTemp_lcml->pDmmBuf, DMM_BUFFER_OBJ);
   3329         pTemp_lcml->pFrameParam = NULL;
   3330         pTemp_lcml->pBufferParam->usNbFrames =0;
   3331         pTemp_lcml->pBufferParam->pParamElem = NULL;
   3332 
   3333         /* This means, it is not a last buffer. This flag is to be modified by
   3334          * the application to indicate the last buffer */
   3335         pTemp->nFlags = NORMAL_BUFFER;
   3336 
   3337         pTemp_lcml++;
   3338     }
   3339 
   3340     /* Allocate memory for all output buffer headers..
   3341        * This memory pointer will be sent to LCML */
   3342     size_lcml = (OMX_S16)nOpBuf * sizeof(LCML_NBAMRDEC_BUFHEADERTYPE);
   3343 
   3344     OMX_MALLOC_SIZE(pTemp_lcml, size_lcml,LCML_NBAMRDEC_BUFHEADERTYPE);
   3345 
   3346     pComponentPrivate->pLcmlBufHeader[NBAMRDEC_OUTPUT_PORT] = pTemp_lcml;
   3347 
   3348     for (i=0; i<nOpBuf; i++) {
   3349         pTemp = pComponentPrivate->pOutputBufferList->pBufHdr[i];
   3350         pTemp->nSize = sizeof(OMX_BUFFERHEADERTYPE);
   3351 /*        pTemp->nAllocLen = nOpBufSize;*/
   3352         pTemp->nFilledLen = nOpBufSize;
   3353         pTemp->nVersion.s.nVersionMajor = AMRDEC_MAJOR_VER;
   3354         pTemp->nVersion.s.nVersionMinor = AMRDEC_MINOR_VER;
   3355         pComponentPrivate->nVersion = pTemp->nVersion.nVersion;
   3356         pTemp->pPlatformPrivate = pHandle->pComponentPrivate;
   3357         pTemp->nTickCount = NOT_USED;
   3358         pTemp_lcml->pFrameParam = NULL;
   3359 
   3360         OMX_MALLOC_SIZE_DSPALIGN(pTemp_lcml->pBufferParam,
   3361                                 sizeof(NBAMRDEC_ParamStruct),
   3362                                 NBAMRDEC_ParamStruct);
   3363 
   3364         pTemp_lcml->pBufferParam->usNbFrames =0;
   3365         pTemp_lcml->pBufferParam->pParamElem = NULL;
   3366         OMX_MALLOC_GENERIC(pTemp_lcml->pDmmBuf, DMM_BUFFER_OBJ);
   3367 
   3368         pTemp_lcml->buffer = pTemp;
   3369         pTemp_lcml->eDir = OMX_DirOutput;
   3370         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pTemp_lcml = %p\n",__LINE__,pTemp_lcml);
   3371         OMX_PRDSP2(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: pTemp_lcml->buffer = %p\n",__LINE__,pTemp_lcml->buffer);
   3372 
   3373         pTemp->nFlags = NORMAL_BUFFER;
   3374 
   3375         pTemp++;
   3376         pTemp_lcml++;
   3377     }
   3378     pComponentPrivate->bPortDefsAllocated = 1;
   3379 
   3380     OMX_PRINT1(pComponentPrivate->dbg, "%d :: OMX_AmrDec_Utils.c :: Exiting NBAMRDECFill_LCMLInitParams",__LINE__);
   3381 
   3382     pComponentPrivate->bInitParamsInitialized = 1;
   3383 EXIT:
   3384     return eError;
   3385 }
   3386 /** ========================================================================
   3387 *  OMX_DmmMap () method is used to allocate the memory using DMM.
   3388 *
   3389 *  @param ProcHandle -  Component identification number
   3390 *  @param size  - Buffer header address, that needs to be sent to codec
   3391 *  @param pArmPtr - Message used to send the buffer to codec
   3392 *  @param pDmmBuf - buffer id
   3393 *
   3394 *  @retval OMX_ErrorNone  - Success
   3395 *          OMX_ErrorHardware  -  Hardware Error
   3396 ** ==========================================================================*/
   3397 OMX_ERRORTYPE OMX_DmmMap(DSP_HPROCESSOR ProcHandle,
   3398                      int size,
   3399                      void* pArmPtr,
   3400                      DMM_BUFFER_OBJ* pDmmBuf, struct OMX_TI_Debug dbg)
   3401 {
   3402     OMX_ERRORTYPE eError = OMX_ErrorUndefined;
   3403     DSP_STATUS status;
   3404     int nSizeReserved = 0;
   3405 
   3406     if(pDmmBuf == NULL)
   3407     {
   3408         OMX_ERROR4 (dbg, "pBuf is NULL\n");
   3409         eError = OMX_ErrorBadParameter;
   3410         goto EXIT;
   3411     }
   3412 
   3413     if(pArmPtr == NULL)
   3414     {
   3415         OMX_ERROR4 (dbg, "pBuf is NULL\n");
   3416         eError = OMX_ErrorBadParameter;
   3417         goto EXIT;
   3418     }
   3419 
   3420     /* Allocate */
   3421     pDmmBuf->pAllocated = pArmPtr;
   3422 
   3423     /* Reserve */
   3424     nSizeReserved = ROUND_TO_PAGESIZE(size) + 2*DMM_PAGE_SIZE ;
   3425     status = DSPProcessor_ReserveMemory(ProcHandle, nSizeReserved, &(pDmmBuf->pReserved));
   3426     OMX_PRDSP2 (dbg, "\nOMX Reserve DSP: %p\n",pDmmBuf->pReserved);
   3427 
   3428     if(DSP_FAILED(status))
   3429     {
   3430         OMX_ERROR4 (dbg, "DSPProcessor_ReserveMemory() failed - error 0x%x", (int)status);
   3431         eError = OMX_ErrorHardware;
   3432         goto EXIT;
   3433     }
   3434     pDmmBuf->nSize = size;
   3435     OMX_PRBUFFER2 (dbg, " DMM MAP Reserved: %p, size 0x%x (%d)\n", pDmmBuf->pReserved,nSizeReserved,nSizeReserved);
   3436 
   3437     /* Map */
   3438     status = DSPProcessor_Map(ProcHandle,
   3439                               pDmmBuf->pAllocated,/* Arm addres of data to Map on DSP*/
   3440                               size , /* size to Map on DSP*/
   3441                               pDmmBuf->pReserved, /* reserved space */
   3442                               &(pDmmBuf->pMapped), /* returned map pointer */
   3443                               0); /* final param is reserved.  set to zero. */
   3444     if(DSP_FAILED(status))
   3445     {
   3446         OMX_ERROR4 (dbg, "DSPProcessor_Map() failed - error 0x%x", (int)status);
   3447         eError = OMX_ErrorHardware;
   3448         goto EXIT;
   3449     }
   3450     OMX_PRBUFFER2 (dbg, "DMM Mapped: %p, size 0x%x (%d)\n",pDmmBuf->pMapped, size,size);
   3451 
   3452     /* Issue an initial memory flush to ensure cache coherency */
   3453     status = DSPProcessor_FlushMemory(ProcHandle, pDmmBuf->pAllocated, size, 0);
   3454     if(DSP_FAILED(status))
   3455     {
   3456         OMX_ERROR4 (dbg, "Unable to flush mapped buffer: error 0x%x",(int)status);
   3457         goto EXIT;
   3458     }
   3459     eError = OMX_ErrorNone;
   3460 
   3461 EXIT:
   3462    return eError;
   3463 }
   3464 
   3465 /** ========================================================================
   3466 *  OMX_DmmUnMap () method is used to de-allocate the memory using DMM.
   3467 *
   3468 *  @param ProcHandle -  Component identification number
   3469 *  @param pMapPtr  - Map address
   3470 *  @param pResPtr - reserve adress
   3471 *
   3472 *  @retval OMX_ErrorNone  - Success
   3473 *          OMX_ErrorHardware  -  Hardware Error
   3474 ** ==========================================================================*/
   3475 OMX_ERRORTYPE OMX_DmmUnMap(DSP_HPROCESSOR ProcHandle, void* pMapPtr, void* pResPtr, struct OMX_TI_Debug dbg)
   3476 {
   3477     DSP_STATUS status = DSP_SOK;
   3478     OMX_ERRORTYPE eError = OMX_ErrorNone;
   3479     OMX_PRDSP2 (dbg, "\nOMX UnReserve DSP: %p\n",pResPtr);
   3480 
   3481     if(pMapPtr == NULL)
   3482     {
   3483         OMX_ERROR4 (dbg, "pMapPtr is NULL\n");
   3484         eError = OMX_ErrorBadParameter;
   3485         goto EXIT;
   3486     }
   3487     if(pResPtr == NULL)
   3488     {
   3489         OMX_ERROR4 (dbg, "pResPtr is NULL\n");
   3490         eError = OMX_ErrorBadParameter;
   3491         goto EXIT;
   3492     }
   3493     status = DSPProcessor_UnMap(ProcHandle,pMapPtr);
   3494     if(DSP_FAILED(status))
   3495     {
   3496         OMX_ERROR4 (dbg, "DSPProcessor_UnMap() failed - error 0x%x",(int)status);
   3497    }
   3498 
   3499     OMX_PRINT2 (dbg, "unreserving  structure =0x%p\n",pResPtr);
   3500     status = DSPProcessor_UnReserveMemory(ProcHandle,pResPtr);
   3501     if(DSP_FAILED(status))
   3502     {
   3503         OMX_ERROR4 (dbg, "DSPProcessor_UnReserveMemory() failed - error 0x%x", (int)status);
   3504     }
   3505 
   3506 EXIT:
   3507     return eError;
   3508 }
   3509 
   3510 #ifdef UNDER_CE
   3511 /* ================================================================================= */
   3512 /**
   3513 * @fns Sleep replace for WIN CE
   3514 */
   3515 /* ================================================================================ */
   3516 int OMX_CreateEvent(OMX_Event *event){
   3517     int ret = OMX_ErrorNone;
   3518     HANDLE createdEvent = NULL;
   3519     if(event == NULL){
   3520         ret = OMX_ErrorBadParameter;
   3521         goto EXIT;
   3522     }
   3523     event->event  = CreateEvent(NULL, TRUE, FALSE, NULL);
   3524     if(event->event == NULL)
   3525         ret = (int)GetLastError();
   3526 EXIT:
   3527     return ret;
   3528 }
   3529 
   3530 int OMX_SignalEvent(OMX_Event *event){
   3531      int ret = OMX_ErrorNone;
   3532      if(event == NULL){
   3533         ret = OMX_ErrorBadParameter;
   3534         goto EXIT;
   3535      }
   3536      SetEvent(event->event);
   3537      ret = (int)GetLastError();
   3538 EXIT:
   3539     return ret;
   3540 }
   3541 
   3542 int OMX_WaitForEvent(OMX_Event *event) {
   3543      int ret = OMX_ErrorNone;
   3544      if(event == NULL){
   3545         ret = OMX_ErrorBadParameter;
   3546         goto EXIT;
   3547      }
   3548      WaitForSingleObject(event->event, INFINITE);
   3549      ret = (int)GetLastError();
   3550 EXIT:
   3551      return ret;
   3552 }
   3553 
   3554 int OMX_DestroyEvent(OMX_Event *event) {
   3555      int ret = OMX_ErrorNone;
   3556      if(event == NULL){
   3557         ret = OMX_ErrorBadParameter;
   3558         goto EXIT;
   3559      }
   3560      CloseHandle(event->event);
   3561 EXIT:
   3562      return ret;
   3563 }
   3564 #endif
   3565 
   3566 void SignalIfAllBuffersAreReturned(AMRDEC_COMPONENT_PRIVATE *pComponentPrivate)
   3567 {
   3568     if((pComponentPrivate->nEmptyThisBufferCount == pComponentPrivate->nEmptyBufferDoneCount) && (pComponentPrivate->nFillThisBufferCount == pComponentPrivate->nFillBufferDoneCount))
   3569     {
   3570         if(pthread_mutex_lock(&bufferReturned_mutex) != 0)
   3571         {
   3572             OMX_ERROR4(pComponentPrivate->dbg, "%d :: UTIL: bufferReturned_mutex mutex lock error\n",__LINE__);
   3573         }
   3574         pthread_cond_broadcast(&bufferReturned_condition);
   3575         OMX_PRINT2(pComponentPrivate->dbg, ":: Sending pthread signal that OMX has returned all buffers to app\n");
   3576         if(pthread_mutex_unlock(&bufferReturned_mutex) != 0)
   3577         {
   3578             OMX_ERROR4(pComponentPrivate->dbg, "%d :: bufferReturned_mutex mutex unlock error\n",__LINE__);
   3579         }
   3580         return;
   3581     }
   3582 }
   3583 #ifdef RESOURCE_MANAGER_ENABLED
   3584 void NBAMR_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData)
   3585 {
   3586     OMX_COMMANDTYPE Cmd = OMX_CommandStateSet;
   3587     OMX_STATETYPE state = OMX_StateIdle;
   3588     OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)cbData.hComponent;
   3589     AMRDEC_COMPONENT_PRIVATE *pCompPrivate = NULL;
   3590 
   3591     pCompPrivate = (AMRDEC_COMPONENT_PRIVATE *)pHandle->pComponentPrivate;
   3592 
   3593     if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesPreempted) {
   3594         if (pCompPrivate->curState == OMX_StateExecuting ||
   3595             pCompPrivate->curState == OMX_StatePause) {
   3596             write (pCompPrivate->cmdPipe[1], &Cmd, sizeof(Cmd));
   3597             write (pCompPrivate->cmdDataPipe[1], &state ,sizeof(OMX_U32));
   3598 
   3599             pCompPrivate->bPreempted = 1;
   3600         }
   3601     }
   3602     else if (*(cbData.RM_Error) == OMX_RmProxyCallback_ResourcesAcquired){
   3603         pCompPrivate->cbInfo.EventHandler (
   3604                             pHandle, pHandle->pApplicationPrivate,
   3605                             OMX_EventResourcesAcquired, 0,0,
   3606                             NULL);
   3607     }
   3608 }
   3609 #endif
   3610 
   3611 void NBAMRDEC_HandleUSNError (AMRDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 arg)
   3612 {
   3613     OMX_COMPONENTTYPE *pHandle = NULL;
   3614     OMX_U8 pending_buffers = OMX_FALSE;
   3615     OMX_U32 i;
   3616     switch (arg)
   3617     {
   3618         case IUALG_WARN_CONCEALED:
   3619         case IUALG_WARN_UNDERFLOW:
   3620         case IUALG_WARN_OVERFLOW:
   3621         case IUALG_WARN_ENDOFDATA:
   3622             /* all of these are informative messages, Algo can recover, no need to notify the
   3623              * IL Client at this stage of the implementation */
   3624             break;
   3625 
   3626         case IUALG_WARN_PLAYCOMPLETED:
   3627         {
   3628             pHandle = pComponentPrivate->pHandle;
   3629             OMX_PRDSP1(pComponentPrivate->dbg, "%d :: GOT MESSAGE IUALG_WARN_PLAYCOMPLETED\n",__LINE__);
   3630             if(pComponentPrivate->LastOutbuf!=NULL && !pComponentPrivate->dasfmode){
   3631                 pComponentPrivate->LastOutbuf->nFlags |= OMX_BUFFERFLAG_EOS;
   3632             }
   3633 
   3634             /* add callback to application to indicate SN/USN has completed playing of current set of date */
   3635             pComponentPrivate->cbInfo.EventHandler(pComponentPrivate->pHandle,
   3636                                                    pComponentPrivate->pHandle->pApplicationPrivate,
   3637                                                    OMX_EventBufferFlag,
   3638                                                    (OMX_U32)NULL,
   3639                                                    OMX_BUFFERFLAG_EOS,
   3640                                                    NULL);
   3641         }
   3642             break;
   3643 
   3644 #ifdef _ERROR_PROPAGATION__
   3645         case IUALG_ERR_BAD_HANDLE:
   3646         case IUALG_ERR_DATA_CORRUPT:
   3647         case IUALG_ERR_NOT_SUPPORTED:
   3648         case IUALG_ERR_ARGUMENT:
   3649         case IUALG_ERR_NOT_READY:
   3650         case IUALG_ERR_GENERAL:
   3651         {
   3652         /* all of these are fatal messages, Algo can not recover
   3653                  * hence return an error */
   3654                 pComponentPrivate->bIsInvalidState=OMX_TRUE;
   3655                 pComponentPrivate->curState = OMX_StateInvalid;
   3656                 pHandle = pComponentPrivate->pHandle;
   3657                 pComponentPrivate->cbInfo.EventHandler(pHandle,
   3658                         pHandle->pApplicationPrivate,
   3659                         OMX_EventError,
   3660                         OMX_ErrorInvalidState,
   3661                         OMX_TI_ErrorSevere,
   3662                         NULL);
   3663             }
   3664             break;
   3665 #endif
   3666         default:
   3667             break;
   3668     }
   3669 }
   3670