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